commit f3f1778f777d0aeb15c65033996bd0144d2aa8c6 Author: Yi Zhang Date: Wed Dec 17 10:53:43 2025 +0800 initial upload diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8256d0f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Stroe \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..3fb2ed3 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,292 @@ +cmake_minimum_required(VERSION 3.10) + +# set the project name +set(CMAKE_PROJECT_NAME "TOMOATT") +project(${CMAKE_PROJECT_NAME} VERSION 1.1.2 LANGUAGES C CXX ) + +# set install directory +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +# check debug or release +if (CMAKE_BUILD_TYPE STREQUAL "Debug") + message(STATUS "Build type: Debug") +else() + message(STATUS "Build type: Release") +endif() + +# check compiler type +message(STATUS "Compiler type: ${CMAKE_CXX_COMPILER_ID}") +if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CXX_ADDITIONAL_FLAGS "-Wall -pedantic -g -O0") + else() + set(CXX_ADDITIONAL_FLAGS "-Wall -pedantic -O3 -funroll-loops -ffast-math -ftree-vectorize") + endif() +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CXX_ADDITIONAL_FLAGS "-Wall -pedantic -g -O0 -lm -lstdc++fs") + else() + set(CXX_ADDITIONAL_FLAGS "-Wall -pedantic -lm -O3 -funroll-loops -ffast-math -ftree-vectorize -lstdc++fs") + endif() +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CXX_ADDITIONAL_FLAGS "-diag-disable=10441,2012,2015,2017,2047,2304,2305,3868,10193,10315,11074,11076 -Wall -pedantic -g -O0 -lm -lstdc++fs") + else() + set(CXX_ADDITIONAL_FLAGS "-diag-disable=10441,2012,2015,2017,2047,2304,2305,3868,10193,10315,11074,11076 -Wall -pedantic -O3 -funroll-loops -ffast-math -lm -ftree-vectorize -lstdc++fs") + endif() +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Fujitsu") + MESSAGE(FATAL_ERROR "Fujitsu trad compiler is not supported. Please use clang mode.") +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "FujitsuClang") + MESSAGE("Compiler type: FujitsuClang") + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CXX_ADDITIONAL_FLAGS "-Nclang -g -O0 -std=c++17 -mcpu=a64fx+sve -march=armv8-a+sve") + else() + set(CXX_ADDITIONAL_FLAGS "-Nclang -Ofast -std=c++17 -mcpu=a64fx+sve -march=armv8-a+sve") + endif() +else() + MESSAGE(FATAL_ERROR "Compiler type: Unknown") +endif() +# Default to C++17 +if(NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 17) +endif() + +set(BUILD_TESTING OFF) +option(FORCE_DOWNLOAD_EXTERNAL_LIBS "Force download and use external libraries" OFF) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_ADDITIONAL_FLAGS}") + +# find installed MPI +message(STATUS "Running CMAKE FindMPI.cmake...") +find_package(MPI) + +message(STATUS "MPI_FOUND: ${MPI_FOUND}") +message(STATUS "MPI_VERSION: ${MPI_VERSION}") + +# find openmp ## WE DO NOT USE OPENMP BUT KEEP THIS FOR FUTURE USE +###find_package(OpenMP) +###if(OPENMP_FOUND) +### message(STATUS "OpenMP found") +### set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") +### set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") +### set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") +### add_definitions(-DUSE_OMP) +###endif() + +# find HDF5 parallel TODO: check parallel io is enable or not +message(STATUS "Running CMAKE FindHDF5.cmake...") +# set parallel HDF5 default +set(HDF5_PREFER_PARALLEL TRUE) +find_package(HDF5) +if(HDF5_FOUND) + message(STATUS "HDF5_FOUND: ${HDF5_FOUND}") + add_definitions(-DUSE_HDF5) + # check if HD5 PARALLEL is available + if(HDF5_IS_PARALLEL) + message(STATUS "HDF5 parallel is available.") + else() + message(FATAL "TomoATT requires HDF5 compiled with parallel IO option.") + endif() +endif() + +# use collective io for HDF5: should be faster than independent io, +#but there will be a memory overhead and may not work on some systems. +#If you have a problem, please comment out this line. +add_definitions(-DUSE_HDF5_IO_COLLECTIVE) + +# precision setting (uncomment for single precision. default is double precision.) +#add_definitions(-DSINGLE_PRECISION) + +# use SIMD (SSE/AVX/AVX2/AVX512) for vectorization, which is faster than the default but use a little more memory. +if (USE_SIMD) + message(STATUS "TomoATT is compiled with SIMD.") + add_definitions(-DUSE_SIMD) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -mfma") +endif() + +# find cuda package if USE_CUDA is defined +if(USE_CUDA) + message(STATUS "Running CMAKE FindCUDA.cmake...") + enable_language(CUDA) + find_package(CUDA) +else() + message(STATUS "TomoATT is compiled without cuda, because -DUSE_CUDA=True is not defined") +endif() + +if(CUDA_FOUND) # TODO : add HIP here in the future + message(STATUS "CUDA_FOUND: ${CUDA_FOUND}") + add_definitions(-DUSE_CUDA) + set(CUDA_LIBRARY_NAME "TOMOATT_CUDA") + + # list of source and header files for cuda + file(GLOB SOURCES_CUDA "cuda/*.cu") + file(GLOB HEADERS_CUDA "cuda/*.cuh") + + # cuda flag + # + # for production + set(CMAKE_CUDA_FLAGS "-fPIC -O3 -use_fast_math -extra-device-vectorization -gencode arch=compute_61,code=sm_61") + # + # for debugging + #set(CMAKE_CUDA_FLAGS "-fPIC -lineinfo -g -G -O0 -gencode arch=compute_61,code=sm_61") + set(CMAKE_CUDA_STANDARD "11") + message(STATUS, "TomoATT will be compiled with cuda.") +else() + message(STATUS "TomoATT will be compiled without cuda, because cuda is not found or -DUSE_CUDA=True was not specified.") +endif() + +# synchronize the adjuscent ghost layers for each direction oft the sweep +# which is more frequent than the referred paper but necessary +add_definitions(-DFREQ_SYNC_GHOST) + +# find BLAS # WE DO NOT USE BLAS BUT KEEP THIS FOR FUTURE USE +#find_package(BLAS) +#if(BLAS_FOUND) +# message(STATUS "BLAS_FOUND: ${BLAS_FOUND} at ${BLAS_LIBRARIES}, ${BLAS_INCLUDE_DIRS}") +# add_definitions(-DUSE_BLAS) +# find_path(BLAS_INCLUDE_DIRS cblas.h +# /usr/include +# /usr/local/include +# /usr/local/include/openblas) +#endif() + +# submodules +# yaml parser +find_package(yaml-cpp 0.8 QUIET) +if (yaml-cpp_FOUND AND NOT ${FORCE_DOWNLOAD_EXTERNAL_LIBS}) + message(STATUS "yaml-cpp found") + message(STATUS "YAML_CPP_INCLUDE_DIR: ${YAML_CPP_INCLUDE_DIR}") + message(STATUS "YAML_CPP_LIBRARIES: ${YAML_CPP_LIBRARIES}") +else() + message(STATUS "yaml-cpp not found. Using external_libs/yaml-cpp ...") + add_subdirectory(external_libs) + set(YAML_CPP_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/external_libs/yaml-cpp/include) + set(YAML_CPP_LIBRARIES yaml-cpp) +endif() + +# add include directory +include_directories(include cuda) + +execute_process( + COMMAND git rev-parse --short HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_COMMIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +configure_file( + ${PROJECT_SOURCE_DIR}/include/version.h.in + ${PROJECT_SOURCE_DIR}/include/version.h +) + +# list of source files +file(GLOB SOURCES "src/*.cpp") +if(CUDA_FOUND) + file(GLOB HEADERS "include/*.h" "cuda/*.cuh") +else() + file(GLOB HEADERS "include/*.h") +endif() +file(GLOB SOURCES_EXT_XML "external_libs/tinyxml2/*.cpp") + +# compile cuda code +if (CUDA_FOUND) + include_directories(${CUDA_INCLUDE_DIRS}) + add_library(${CUDA_LIBRARY_NAME} STATIC ${SOURCES_CUDA} ${HEADERS_CUDA} ) + target_include_directories(${CUDA_LIBRARY_NAME} PUBLIC ${YAML_CPP_INCLUDE_DIR}) + target_include_directories(${CUDA_LIBRARY_NAME} PUBLIC ${HDF5_INCLUDE_DIRS}) + target_include_directories(${CUDA_LIBRARY_NAME} PUBLIC ${PROJECT_SOURCE_DIR}/external_libs/tinyxml2) +endif() + + +# +# compile the executables +# all the files with the name *.cxx is compiled as an executable +# +#file( GLOB APP_SOURCES src/*.cxx ) + +# add one by one +set(APP_SOURCES + src/TOMOATT.cxx + #src/TOMOATT_solver_only.cxx + #src/TOMOATT_2d_precalc.cxx + #src/SrcRecWeight.cxx + ) + +# if BUILD_TESTING is defined, make APP_TEST and append to APP_SOURCES list +if(BUILD_TESTING) + # use all the cxx files in tests/ directory + file( GLOB APP_TEST tests/*.cxx) + # or you can specify the test files one by one + #set(APP_TEST + # tests/read_write_srcrec.cxx + #) + list(APPEND APP_SOURCES ${APP_TEST}) +endif() + +foreach( execsourcefile ${APP_SOURCES} ) + # get app name from file name + get_filename_component(EXEC_NAME ${execsourcefile} NAME_WE) + + # add the executable + add_executable(${EXEC_NAME} ${execsourcefile} ${SOURCES} ${HEADERS} ${SOURCES_EXT_XML}) + + # set include path + target_include_directories(${EXEC_NAME} PRIVATE + ${PROJECT_SOURCE_DIR}/include + ${PROJECT_SOURCE_DIR}/cuda + ${PROJECT_SOURCE_DIR}/external_libs/tinyxml2) + + # link mpi + target_link_libraries(${EXEC_NAME} PUBLIC MPI::MPI_CXX) + + # link yaml-app: + target_link_libraries(${EXEC_NAME} PUBLIC ${YAML_CPP_LIBRARIES}) + target_include_directories(${EXEC_NAME} PUBLIC ${YAML_CPP_INCLUDE_DIR}) + + # link HDF5 + if(HDF5_FOUND) + target_link_libraries(${EXEC_NAME} PUBLIC ${HDF5_LIBRARIES}) + target_include_directories(${EXEC_NAME} PUBLIC ${HDF5_INCLUDE_DIRS}) + endif() + + # link blas + if(BLAS_FOUND) + target_link_libraries(${EXEC_NAME} PUBLIC ${BLAS_LIBRARIES}) + target_include_directories(${EXEC_NAME} PUBLIC ${BLAS_INCLUDE_DIRS}) + endif() + + # link cuda + if (CUDA_FOUND) + + #set_target_properties(${CUDA_LIBRARY_NAME} PROPERTIES CUDA_ARCHITECTURES "35;50;72") + set_target_properties(${CUDA_LIBRARY_NAME} PROPERTIES CUDA_ARCHITECTURES "61") + set_property(TARGET ${CUDA_LIBRARY_NAME} PROPERTY CUDA_ARCHITECTURES 61) + + target_link_libraries(${EXEC_NAME} PRIVATE ${CUDA_LIBRARY_NAME}) + target_link_libraries(${CUDA_LIBRARY_NAME} PUBLIC MPI::MPI_CXX) + target_link_libraries(${CUDA_LIBRARY_NAME} PUBLIC yaml-cpp) + target_link_libraries(${CUDA_LIBRARY_NAME} PUBLIC ${HDF5_LIBRARIES}) + + endif() + + +endforeach( execsourcefile ${APP_SOURCES} ) + +# install +install(TARGETS TOMOATT DESTINATION bin) + +# test + +# We check if this is the main file +# you don't usually want users of your library to +# execute tests as part of their build +if (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR} AND BUILD_TESTING) + include(CTest) + + # loop over APP_TEST + foreach( execsourcefile ${APP_TEST} ) + add_test(NAME ${execsourcefile} COMMAND ${EXEC_NAME} ${execsourcefile}) + endforeach( execsourcefile ${APP_TEST} ) +endif () + +enable_testing() diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..073a122 --- /dev/null +++ b/README.md @@ -0,0 +1,102 @@ +# TomoATT + +[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](LICENSE) +[![CI](https://github.com/mnagaso/TomoATT/actions/workflows/CI.yml/badge.svg?branch=main)](https://github.com/mnagaso/TomoATT/actions/workflows/CI.yml) +[![Anaconda-Server Badge](https://anaconda.org/conda-forge/tomoatt/badges/version.svg)](https://anaconda.org/conda-forge/tomoatt) +[![Anaconda-Server Badge](https://anaconda.org/conda-forge/tomoatt/badges/platforms.svg)](https://anaconda.org/conda-forge/tomoatt) +[![Anaconda-Server Badge](https://anaconda.org/conda-forge/tomoatt/badges/latest_release_date.svg)](https://anaconda.org/conda-forge/tomoatt) + +![logo](docs/logo/TomoATT_logo_2.png) + +TomoATT is a library which implements an eikonal equation solver based Adjoint-state Traveltime Tomography for a very large-scale computation, which implements the methods described in the publications: + +- **The TomoATT software package** + - Chen, J., Nagaso, M., Xu, M., & Tong, P. (2025). TomoATT: An open-source package for Eikonal equation-based adjoint-state traveltime tomography for seismic velocity and azimuthal anisotropy. Computers & Geosciences, 105995. [DOI](https://doi.org/10.1016/j.cageo.2025.105995). + +- **Regional tomography in Cartesian coordinates** + + - Tong, P. (2021). Adjoint‐state traveltime tomography: Eikonal equation‐based methods and application to the Anza area in southern California. Journal of Geophysical Research: Solid Earth, 126(5), e2021JB021818. [DOI](https://doi.org/10.1029/2021JB021818). + + - Tong, P. (2021). Adjoint‐state traveltime tomography for azimuthally anisotropic media and insight into the crustal structure of central California near Parkfield. Journal of Geophysical Research: Solid Earth, 126(10), e2021JB022365. [DOI](https://doi.org/10.1029/2021JB022365). + +- **Regional tomography in Spherical coordinates** + + - Chen, J., Chen, G., Nagaso, M., & Tong, P. (2023). Adjoint-state traveltime tomography for azimuthally anisotropic media in spherical coordinates. Geophysical Journal International, 234(1), 712-736. [DOI](https://doi.org/10.1093/gji/ggad093). + +- **Teleseismic tomography in Spherical coordinates** + + - Chen, J., Wu, S., Xu, M., Nagaso, M., Yao, J., Wang, K., ... & Tong, P. (2023). Adjoint‐state teleseismic traveltime tomography: Method and application to Thailand in Indochina Peninsula. Journal of Geophysical Research: Solid Earth, 128(12), e2023JB027348. [DOI](https://doi.org/10.1029/2023JB027348). + + +Thanks to the efficiency of an eikonal equation solver, the computation of the travel-time is very fast and requires less amount of computational resources. +As an input data for TomoATT is travel times at seismic stations, we can easily prepare a great amount of input data for the computation. + +This library is developped to be used for modeling a very-large domain. For this purpose, 3-layer parallelization is applied, which are: +- layer 1: simulutaneous run parallelization (travel times for multiple seismic sources may be calculated simultaneously) +- layer 2: subdomain decomposition (If the number of computational nodes requires too large memory, we can separate the domain into subdomains and run each subdomain in a separate compute node) +- layer 3: sweeping parallelization (in each subdomain, sweeping layers are also parallelized) + +The details of the parallelization method applied in this library are described in the paper [Miles Detrixhe and Frédéric Gibou (2016)](https://doi.org/10.1016/j.jcp.2016.06.023). + +Regional events (sources within the global domain) and teleseismic events (sources outside the global domain) may be used for inversion. + +## Quick installation +This library is available in the [conda-forge channel](https://anaconda.org/conda-forge/tomoatt). You can install it on personal computer by the following command: +``` bash +conda install -c conda-forge tomoatt pytomoatt +``` + +TomoATT is also capable of running on high-performance computing (HPC) systems and. Detailed installation instructions are described in the [installation manual](https://tomoatt.com/docs/GetStarted/Installation/Dependencies). + + + +## to run an example +``` bash +mpirun -n 4 ./TOMOATT -i ./input_params.yml +``` +Please check the [user manual](https://tomoatt.com/docs) and `examples` directory for the details. + + + diff --git a/README_install_HDF5.md b/README_install_HDF5.md new file mode 100644 index 0000000..ff58196 --- /dev/null +++ b/README_install_HDF5.md @@ -0,0 +1,12 @@ +# Compile HDF5 library with parallel option from the source + +1. run the install script `./install_mpi_and_hdf5_local.sh`, which compiles and creates openmpi and hdf5 executables in `./external_libs/local_mpi_hdf5/bin` + +2. compile TOMOATT by +``` bash +mkdir build && cd build +cmake .. -DCMAKE_PREFIX_PATH=$(pwd)/../external_libs/local_mpi_hdf5 +make -j16 +``` + +This creates TOMOATT executable at ./build/TOMOATT \ No newline at end of file diff --git a/cuda/cuda_constants.cuh b/cuda/cuda_constants.cuh new file mode 100644 index 0000000..0cedb2f --- /dev/null +++ b/cuda/cuda_constants.cuh @@ -0,0 +1,35 @@ +#ifndef CUDA_CONSTANTS_H +#define CUDA_CONSTANTS_H + +#include +#include + +#define CUSTOMREAL double // need here for cuda kernels +#define MPI_CR MPI_DOUBLE +//#define CUSTOMREAL float // need here for cuda kernels +//#define MPI_CR MPI_FLOAT + +#define MPI_DUMMY_TAG_CUDA 9999 + +// maximum grid dimension in one direction of GPU +//#define MAXIMUM_GRID_DIM 65535 + +#define CUDA_MAX_BLOCK_SIZE 1024 +#define CUDA_MAX_GRID_SIZE 65535 +#define CUDA_MAX_THREADS_PER_BLOCK 1024 + +//#define CUDA_SWEEPING_BLOCK_SIZE 16 // s +//#define CUDA_SWEEPING_BLOCK_SIZE 32 // 15.254 s +//#define CUDA_SWEEPING_BLOCK_SIZE 64 // 15.281 s +//#define CUDA_SWEEPING_BLOCK_SIZE 128 // 15.378 s +//#define CUDA_SWEEPING_BLOCK_SIZE 256 // s +#define CUDA_SWEEPING_BLOCK_SIZE 512 // +//#define CUDA_SWEEPING_BLOCK_SIZE 1024 // + + +#define CUDA_L1_BLOCK_SIZE 128 +//#define CUDA_L1_BLOCK_SIZE 256 + +#define CUDA_MAX_NUM_STREAMS 32 + +#endif // CUDA_CONSTANTS_H \ No newline at end of file diff --git a/cuda/cuda_initialize.cuh b/cuda/cuda_initialize.cuh new file mode 100644 index 0000000..66100b4 --- /dev/null +++ b/cuda/cuda_initialize.cuh @@ -0,0 +1,145 @@ +#ifndef CUDA_INITIALIZE_H +#define CUDA_INITIALIZE_H + + +#include +#include +#include + +//#include "config.h" +#include "cuda_constants.cuh" + +void get_free_memory(double* free_db, double* used_db, double* total_db) { + + // gets memory usage in byte + size_t free_byte ; + size_t total_byte ; + cudaError_t cuda_status = cudaMemGetInfo( &free_byte, &total_byte ) ; + if ( cudaSuccess != cuda_status ){ + printf("Error: cudaMemGetInfo fails, %s \n", cudaGetErrorString(cuda_status) ); + exit(EXIT_FAILURE); + } + + *free_db = (double)free_byte ; + *total_db = (double)total_byte ; + *used_db = *total_db - *free_db ; + return; +} + + +// setup cuda constants and variables by reading device properties +void initialize_cuda(){ + + std::cout << "Initializing CUDA..." << std::endl; + + int ncuda_device; + int device; + + // count number of devices + cudaGetDeviceCount(&ncuda_device); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) { + printf("cudaGetDeviceCount returned error code %d after %d devices\n", err, ncuda_device); + exit(1); + } + + if (ncuda_device == 0) + { + printf("There is no device supporting CUDA\n"); + exit(1); + } + + // set the active device + if (ncuda_device >= 1){ + cudaDeviceReset(); + + device = world_rank % ncuda_device; + cudaSetDevice(device); + + cudaFree(0); + + // check device is set + cudaGetDevice(&device); + if (device != world_rank % ncuda_device){ + printf("Error: Could not set device to %d\n", world_rank % ncuda_device); + exit(1); + } + } // end if ncuda_device >= 1 + + cudaGetDevice(&device); + + // get device properties + cudaDeviceProp deviceProp; // in cuda_constants + cudaGetDeviceProperties(&deviceProp, device); + + // exit if machine has no cuda enable device + if (deviceProp.major == 9999 && deviceProp.minor == 9999){ + printf("Error: No CUDA device found\n"); + exit(1); + } + + // print device properties + char filename[256]; + + if (world_rank == 0){ + sprintf(filename, "cuda_device_info.txt"); + FILE *fp = fopen(filename, "w"); + + if(fp == NULL){ + printf("Error: Could not open file %s\n", filename); + exit(1); + } + + // display device properties + fprintf(fp,"Device Name = %s\n",deviceProp.name); + fprintf(fp,"memory:\n"); + fprintf(fp," totalGlobalMem (in MB): %f\n",(unsigned long) deviceProp.totalGlobalMem / (1024.f * 1024.f)); + fprintf(fp," totalGlobalMem (in GB): %f\n",(unsigned long) deviceProp.totalGlobalMem / (1024.f * 1024.f * 1024.f)); + fprintf(fp," totalConstMem (in bytes): %lu\n",(unsigned long) deviceProp.totalConstMem); + fprintf(fp," Maximum 1D texture size (in bytes): %lu\n",(unsigned long) deviceProp.maxTexture1D); + fprintf(fp," sharedMemPerBlock (in bytes): %lu\n",(unsigned long) deviceProp.sharedMemPerBlock); + fprintf(fp," regsPerBlock (in bytes): %lu\n",(unsigned long) deviceProp.regsPerBlock); + fprintf(fp,"blocks:\n"); + fprintf(fp," Maximum number of threads per block: %d\n",deviceProp.maxThreadsPerBlock); + fprintf(fp," Maximum size of each dimension of a block: %d x %d x %d\n", + deviceProp.maxThreadsDim[0],deviceProp.maxThreadsDim[1],deviceProp.maxThreadsDim[2]); + fprintf(fp," Maximum sizes of each dimension of a grid: %d x %d x %d\n", + deviceProp.maxGridSize[0],deviceProp.maxGridSize[1],deviceProp.maxGridSize[2]); + fprintf(fp,"features:\n"); + fprintf(fp," Compute capability of the device = %d.%d\n", deviceProp.major, deviceProp.minor); + fprintf(fp," multiProcessorCount: %d\n",deviceProp.multiProcessorCount); + if (deviceProp.canMapHostMemory){ + fprintf(fp," canMapHostMemory: TRUE\n"); + }else{ + fprintf(fp," canMapHostMemory: FALSE\n"); + } + if (deviceProp.deviceOverlap){ + fprintf(fp," deviceOverlap: TRUE\n"); + }else{ + fprintf(fp," deviceOverlap: FALSE\n"); + } + if (deviceProp.concurrentKernels){ + fprintf(fp," concurrentKernels: TRUE\n"); + }else{ + fprintf(fp," concurrentKernels: FALSE\n"); + } + // outputs initial memory infos via cudaMemGetInfo() + double free_db,used_db,total_db; + get_free_memory(&free_db,&used_db,&total_db); + fprintf(fp,"memory usage:\n"); + fprintf(fp," rank %d: GPU memory usage: used = %f MB, free = %f MB, total = %f MB\n",myrank, + used_db/1024.0/1024.0, free_db/1024.0/1024.0, total_db/1024.0/1024.0); + + // closes output file + fclose(fp); + } + +} + + +void finalize_cuda(){ + cudaDeviceReset(); +} + +#endif // CUDA_INITIALIZE_H \ No newline at end of file diff --git a/cuda/cuda_utils.cu b/cuda/cuda_utils.cu new file mode 100644 index 0000000..8741176 --- /dev/null +++ b/cuda/cuda_utils.cu @@ -0,0 +1,186 @@ +#include "cuda_utils.cuh" + + + +// allocate memory on device +cudaError_t allocate_memory_on_device_i(void** d_ptr, size_t size) +{ + return cudaMalloc((void**) d_ptr, size * sizeof(int)); +} + +cudaError_t allocate_memory_on_device_cv(void** d_ptr, size_t size) +{ + return cudaMalloc((void**) d_ptr, size * sizeof(CUSTOMREAL)); +} + +cudaError_t allocate_memory_on_device_bl(void** d_ptr, size_t size) +{ + return cudaMalloc((void**) d_ptr, size * sizeof(bool)); +} + + +// device-host shared memory (pinned memory) (maybe unnecessary for CUDA-aware MPI) +cudaError_t allocate_memory_on_device_cv_pinned(void** d_ptr, size_t size) +{ + return cudaMallocHost((void**) d_ptr, size * sizeof(CUSTOMREAL)); +} + + +// deallocate memory on device +cudaError_t deallocate_memory_on_device_i(int*& d_ptr) +{ + return cudaFree(d_ptr); +} + +cudaError_t deallocate_memory_on_device_cv(CUSTOMREAL*& d_ptr) +{ + return cudaFree(d_ptr); +} + +cudaError_t deallocate_memory_on_device_bl(bool*& d_ptr) +{ + return cudaFree(d_ptr); +} + + +// copy memory between host and device +cudaError_t copy_host_to_device_i(int* d_ptr, int* h_ptr, const size_t size) +{ + return cudaMemcpy(d_ptr, h_ptr, size * sizeof(int), cudaMemcpyHostToDevice); +} + +cudaError_t copy_host_to_device_cv(CUSTOMREAL* d_ptr, CUSTOMREAL* h_ptr, const size_t size) +{ + return cudaMemcpy(d_ptr, h_ptr, size * sizeof(CUSTOMREAL), cudaMemcpyHostToDevice); +} + +cudaError_t copy_host_to_device_bl(bool* d_ptr, bool* h_ptr, const size_t size) +{ + return cudaMemcpy(d_ptr, h_ptr, size * sizeof(bool), cudaMemcpyHostToDevice); +} + +// copy memory from device to host +cudaError_t copy_device_to_host_i(int* h_ptr, int* d_ptr, size_t size) +{ + return cudaMemcpy(h_ptr, d_ptr, size * sizeof(int), cudaMemcpyDeviceToHost); +} +cudaError_t copy_device_to_host_cv(CUSTOMREAL* h_ptr, CUSTOMREAL* d_ptr, size_t size) +{ + return cudaMemcpy(h_ptr, d_ptr, size * sizeof(CUSTOMREAL), cudaMemcpyDeviceToHost); +} + + +// allocate and copy to device +void* allocate_and_copy_host_to_device_i(int* h_ptr, size_t size, int num) +{ + void* d_ptr; + + print_CUDA_error_if_any(allocate_memory_on_device_i(&d_ptr, size), num); + print_CUDA_error_if_any(copy_host_to_device_i((int*)d_ptr, h_ptr, size),num); + + return d_ptr; +} + +void* allocate_and_copy_host_to_device_cv(CUSTOMREAL* h_ptr, size_t size, int num) +{ + void* d_ptr; + print_CUDA_error_if_any(allocate_memory_on_device_cv(&d_ptr, size),num); + print_CUDA_error_if_any(copy_host_to_device_cv((CUSTOMREAL*)d_ptr, h_ptr, size), num); + + return d_ptr; +} + +void* allocate_and_copy_host_to_device_bl(bool* h_ptr, size_t size, int num) +{ + void* d_ptr; + print_CUDA_error_if_any(allocate_memory_on_device_bl(&d_ptr, size),num); + print_CUDA_error_if_any(copy_host_to_device_bl((bool*)d_ptr, h_ptr, size), num); + + return d_ptr; +} + +// allocate, flatten and copy from host to device +void flatten_arr_i(int* h_ptr_flattened, std::vector&h_v, int size_total, int* size_each) +{ + // flatten + int counter = 0; + int n_v = h_v.size(); + + for (int i = 0; i < n_v; i++) { // levels + for (int j = 0; j < size_each[i]; j++) { + h_ptr_flattened[counter] = h_v.at(i)[j]; + counter++; + } + } +} + +void flatten_arr_cv(CUSTOMREAL* h_ptr_flattened, std::vector &h_v, int size_total, int* size_each) +{ + // flatten + int counter = 0; + int n_v = h_v.size(); + + for (int i = 0; i < n_v; i++) { // levels + for (int j = 0; j < size_each[i]; j++) { + h_ptr_flattened[counter] = h_v.at(i)[j]; + counter++; + } + } +} + +void flatten_arr_bl(bool* h_ptr_flattened, std::vector &h_v, int size_total, int* size_each) +{ + // flatten + int counter = 0; + int n_v = h_v.size(); + + for (int i = 0; i < n_v; i++) { // levels + for (int j = 0; j < size_each[i]; j++) { + h_ptr_flattened[counter] = h_v.at(i)[j]; + counter++; + } + } +} + +void* allocate_and_copy_host_to_device_flattened_i(std::vector& vh, int size_total, int* size_each, int num){ + // flatten + int* h_ptr_flattened = new int[size_total]; + flatten_arr_i(h_ptr_flattened, vh, size_total, size_each); + + // allocate and copy + void* d_ptr = allocate_and_copy_host_to_device_i(h_ptr_flattened, size_total, num); + + // free + delete[] h_ptr_flattened; + + return d_ptr; +} + +void* allocate_and_copy_host_to_device_flattened_cv(std::vector& vh, int size_total, int* size_each, int num){ + // flatten + CUSTOMREAL* h_ptr_flattened = new CUSTOMREAL[size_total]; + flatten_arr_cv(h_ptr_flattened, vh, size_total, size_each); + + // allocate and copy + void* d_ptr = allocate_and_copy_host_to_device_cv(h_ptr_flattened, size_total, num); + + // free + delete[] h_ptr_flattened; + + return d_ptr; +} + +void* allocate_and_copy_host_to_device_flattened_bl(std::vector& vh, int size_total, int* size_each, int num){ + // flatten + bool* h_ptr_flattened = new bool[size_total]; + flatten_arr_bl(h_ptr_flattened, vh, size_total, size_each); + + // allocate and copy + void* d_ptr = allocate_and_copy_host_to_device_bl(h_ptr_flattened, size_total, num); + + // free + delete[] h_ptr_flattened; + + return d_ptr; +} + diff --git a/cuda/cuda_utils.cuh b/cuda/cuda_utils.cuh new file mode 100644 index 0000000..2bf5321 --- /dev/null +++ b/cuda/cuda_utils.cuh @@ -0,0 +1,211 @@ +#ifndef CUDA_UTILS_H +#define CUDA_UTILS_H + +#include +#include +#include +#include +#include +#include + +#include "cuda_constants.cuh" + +// function to convert kernel,grid to ijk +#define I2V_cuda(i,j,k,II,JJ) ((k)*(JJ)*(II)+(j)*(II)+(i)) + + +// allocate memory on device +cudaError_t allocate_memory_on_device_i(void** d_ptr, size_t size); +cudaError_t allocate_memory_on_device_cv(void** d_ptr, size_t size); +cudaError_t allocate_memory_on_device_bl(void** d_ptr, size_t size); +cudaError_t allocate_memory_on_device_cv_pinned(void** d_ptr, size_t size); + +// deallocate memory on device +cudaError_t deallocate_memory_on_device_i(int *&d_ptr); +cudaError_t deallocate_memory_on_device_cv(CUSTOMREAL *&d_ptr); +cudaError_t deallocate_memory_on_device_bl(bool *&d_ptr); + +// copy memory from host to device +cudaError_t copy_host_to_device_i(int *d_ptr, int *h_ptr, const size_t size); +cudaError_t copy_host_to_device_cv(CUSTOMREAL *d_ptr, CUSTOMREAL *h_ptr, const size_t size); +cudaError_t copy_host_to_device_bl(bool *d_ptr, bool *h_ptr, const size_t size); + +// copy memory from device to host +cudaError_t copy_device_to_host_i(int *h_ptr, int *d_ptr, size_t size); +cudaError_t copy_device_to_host_cv(CUSTOMREAL *h_ptr, CUSTOMREAL *d_ptr, size_t size); + +// allocate and copy to device +void* allocate_and_copy_host_to_device_i(int* h_ptr, size_t size, int num); +void* allocate_and_copy_host_to_device_cv(CUSTOMREAL* h_ptr, size_t size, int num); +void* allocate_and_copy_host_to_device_bl(bool* h_ptr, size_t size, int num); + + +// allocate, flatten and copy to device +void flatten_arr_i(int* h_ptr_flattened, std::vector &h_v, int size_total, int* size_each); +void flatten_arr_cv(CUSTOMREAL* h_ptr_flattened, std::vector &h_v, int size_total, int* size_each); +void flatten_arr_bl(bool* h_ptr_flattened, std::vector &h_v, int size_total, int* size_each); + + +void* allocate_and_copy_host_to_device_flattened_i(std::vector&vh, int size_total, int* size_each, int num); +void* allocate_and_copy_host_to_device_flattened_cv(std::vector& vh, int size_total, int* size_each, int num); +void* allocate_and_copy_host_to_device_flattened_bl(std::vector& vh, int size_total, int* size_each, int num); + + +// mpi send recv +static inline void cuda_send_cr(CUSTOMREAL* buf, int count, int dest, MPI_Comm inter_sub_comm){ + MPI_Send(buf, count, MPI_CR, dest, MPI_DUMMY_TAG_CUDA, inter_sub_comm); +} + +static inline void cuda_recv_cr(CUSTOMREAL* buf, int count, int source, MPI_Comm inter_sub_comm){ + MPI_Status stat; + MPI_Recv(buf, count, MPI_CR, source, MPI_DUMMY_TAG_CUDA, inter_sub_comm, &stat); +} + +static inline void cuda_synchronize_all_sub(MPI_Comm& sub_comm){ + MPI_Barrier(sub_comm); +} + +inline void cuda_wait_req(MPI_Request& req){ + MPI_Status status; + MPI_Wait(&req, &status); +} + + + +static inline void get_block_xy(int num_blocks, int* num_blocks_x, int* num_blocks_y) { + // at first, the num_blocks_x is set with equal value of num_blocks, and num_blocks_y is set with value 1 + // when the num_blocks_x exceeds the block size limit of 65535, the num_blocks_x is divided by 2 and num_blocks_y is increased by 1 + *num_blocks_x = num_blocks; + *num_blocks_y = 1; + + while (*num_blocks_x > CUDA_MAX_GRID_SIZE) { + *num_blocks_x = (int) ceil(*num_blocks_x * 0.5f); + *num_blocks_y = *num_blocks_y * 2;; + } + +} + + +static inline void get_thread_block_for_3d_loop(int nx, int ny, int nz, dim3* threads, dim3* blocks) { + threads->x = 8; threads->y = 8; threads->z = 8; // use 512 threads in total + blocks->x = (nx + threads->x - 1)/threads->x; + blocks->y = (ny + threads->y - 1)/threads->y; + blocks->z = (nz + threads->z - 1)/threads->z; +} + + +static inline void get_thread_block_for_ibound(int nx, int ny, int nz, dim3* threads, dim3* blocks) { + threads->x = nx; threads->y = 8; threads->z = 8; + blocks->x = (nx + threads->x - 1)/threads->x; + blocks->y = (ny + threads->y - 1)/threads->y; + blocks->z = (nz + threads->z - 1)/threads->z; +} + + +static inline void get_thread_block_for_jbound(int nx, int ny, int nz, dim3* threads, dim3* blocks) { + threads->x = 8; threads->y = ny; threads->z = 8; + blocks->x = (nx + threads->x - 1)/threads->x; + blocks->y = (ny + threads->y - 1)/threads->y; + blocks->z = (nz + threads->z - 1)/threads->z; +} + + +static inline void get_thread_block_for_kbound(int nx, int ny, int nz, dim3* threads, dim3* blocks) { + threads->x = 8; threads->y = 8; threads->z = nz; + blocks->x = (nx + threads->x - 1)/threads->x; + blocks->y = (ny + threads->y - 1)/threads->y; + blocks->z = (nz + threads->z - 1)/threads->z; +} + + +inline void cuda_isend_cr(CUSTOMREAL* buf, int count, int dest, MPI_Comm& comm, MPI_Request& request){ + //MPI_Request request = MPI_REQUEST_NULL; + //std::cout << "sending from : " << inter_sub_rank << ", to : " << dest <<", size : " << count << std::endl; + int DUMMY_TAG = 9999; + MPI_Isend(buf, count, MPI_CR, dest, DUMMY_TAG, comm, &request); +} + +inline void cuda_irecv_cr(CUSTOMREAL* buf, int count, int source, MPI_Comm& comm, MPI_Request& request){ + //MPI_Request request = MPI_REQUEST_NULL; + //std::cout << "receiving by : " << inter_sub_rank << ", from : " << source << ", size : " << count << std::endl; + int DUMMY_TAG = 9999; + MPI_Irecv(buf, count, MPI_CR, source, DUMMY_TAG, comm, &request); +} + + +#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); } +inline void gpuAssert(cudaError_t code, const char *file, int line, bool abort=true) +{ + if (code != cudaSuccess) + { + fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line); + if (abort) exit(code); + } +} + +inline void print_memory_usage(){ + size_t free_byte ; + size_t total_byte ; + cudaError_t cuda_status = cudaMemGetInfo( &free_byte, &total_byte ) ; + if ( cudaSuccess != cuda_status ){ + printf("Error: cudaMemGetInfo fails, %s \n", cudaGetErrorString(cuda_status) ); + exit(1); + } + + double free_db = (double)free_byte ; + double total_db = (double)total_byte ; + double used_db = total_db - free_db ; + + printf("GPU memory usage: used = %f, free = %f MB, total = %f MB\n", + used_db/1024.0/1024.0, free_db/1024.0/1024.0, total_db/1024.0/1024.0); +} + +inline void print_CUDA_error_if_any(cudaError_t err, int num) { + if (cudaSuccess != err) + { + printf("\nCUDA error !!!!! <%s> !!!!! \nat CUDA call error code: # %d\n",cudaGetErrorString(err),num); + fflush(stdout); + + // outputs error file + FILE* fp; + int myrank; + char filename[BUFSIZ]; + MPI_Comm_rank(MPI_COMM_WORLD, &myrank); + sprintf(filename,"error_message_%06d.txt",myrank); + fp = fopen(filename,"a+"); + if (fp != NULL) { + fprintf(fp,"\nCUDA error !!!!! <%s> !!!!! \nat CUDA call error code: # %d\n",cudaGetErrorString(err),num); + fclose(fp); + } + + // check memory usage + size_t free_byte ; + size_t total_byte ; + cudaError_t cuda_status = cudaMemGetInfo( &free_byte, &total_byte ) ; + + if ( cudaSuccess != cuda_status ){ + printf("Error: cudaMemGetInfo fails, %s \n", cudaGetErrorString(cuda_status) ); + fflush(stdout); + exit(1); + } + + // print usage + double free_db = (double)free_byte ; + double total_db = (double)total_byte ; + double used_db = total_db - free_db ; + printf("GPU memory usage: used = %f, free = %f MB, total = %f MB", used_db/1024.0/1024.0, free_db/1024.0/1024.0, total_db/1024.0/1024.0); + + + // stops program + //MPI_Abort(MPI_COMM_WORLD,1); + MPI_Finalize(); + exit(EXIT_FAILURE); + } +} + + + + + + +#endif // CUDA_UTILS_H \ No newline at end of file diff --git a/cuda/grid_wrapper.cu b/cuda/grid_wrapper.cu new file mode 100644 index 0000000..728c250 --- /dev/null +++ b/cuda/grid_wrapper.cu @@ -0,0 +1,681 @@ +#include "grid_wrapper.cuh" + +void cuda_initialize_grid_1st(std::vector< std::vector >& ijk, Grid_on_device* grid_dv, int const& loc_I, int const& loc_J, int const& loc_K, + CUSTOMREAL const& dp, CUSTOMREAL const& dt, CUSTOMREAL const& dr, \ + std::vector> & vv_i__j__k__, \ + std::vector> & vv_ip1j__k__, \ + std::vector> & vv_im1j__k__, \ + std::vector> & vv_i__jp1k__, \ + std::vector> & vv_i__jm1k__, \ + std::vector> & vv_i__j__kp1, \ + std::vector> & vv_i__j__km1, \ + std::vector> & vv_fac_a, \ + std::vector> & vv_fac_b, \ + std::vector> & vv_fac_c, \ + std::vector> & vv_fac_f, \ + std::vector> & vv_T0v, \ + std::vector> & vv_T0r, \ + std::vector> & vv_T0t, \ + std::vector> & vv_T0p, \ + std::vector> & vv_fun, \ + std::vector> & vv_change){ + + // store grid parameters + grid_dv->loc_I_host = loc_I; + grid_dv->loc_J_host = loc_J; + grid_dv->loc_K_host = loc_K; + grid_dv->dr_host = dr; + grid_dv->dt_host = dt; + grid_dv->dp_host = dp; + + // count node number + grid_dv->n_nodes_total_host = 0; + grid_dv->n_levels_host = ijk.size(); + // allocate grid_dv->n_nodes_on_levels_host + grid_dv->n_nodes_on_levels_host = new int[grid_dv->n_levels_host]; + + for (int i=0; in_levels_host; i++){ + grid_dv->n_nodes_on_levels_host[i] = ijk[i].size(); + grid_dv->n_nodes_total_host += grid_dv->n_nodes_on_levels_host[i]; + // find max + if (grid_dv->n_nodes_on_levels_host[i] > grid_dv->n_nodes_max_host){ + grid_dv->n_nodes_max_host = grid_dv->n_nodes_on_levels_host[i]; + } + } + + // allocate memory on device + grid_dv->n_nodes_on_levels = (int*) allocate_and_copy_host_to_device_i(grid_dv->n_nodes_on_levels_host, grid_dv->n_levels_host, 0); + + grid_dv->vv_i__j__k___0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__k__.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 2); + grid_dv->vv_ip1j__k___0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip1j__k__.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 2); + grid_dv->vv_im1j__k___0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im1j__k__.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 3); + grid_dv->vv_i__jp1k___0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp1k__.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 4); + grid_dv->vv_i__jm1k___0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm1k__.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 5); + grid_dv->vv_i__j__kp1_0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp1.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 6); + grid_dv->vv_i__j__km1_0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km1.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 7); + + grid_dv->vv_i__j__k___1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__k__.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 8); + grid_dv->vv_ip1j__k___1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip1j__k__.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 9); + grid_dv->vv_im1j__k___1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im1j__k__.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 10); + grid_dv->vv_i__jp1k___1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp1k__.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 11); + grid_dv->vv_i__jm1k___1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm1k__.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 12); + grid_dv->vv_i__j__kp1_1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp1.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 13); + grid_dv->vv_i__j__km1_1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km1.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 14); + + grid_dv->vv_i__j__k___2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__k__.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 15); + grid_dv->vv_ip1j__k___2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip1j__k__.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 16); + grid_dv->vv_im1j__k___2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im1j__k__.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 17); + grid_dv->vv_i__jp1k___2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp1k__.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 18); + grid_dv->vv_i__jm1k___2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm1k__.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 19); + grid_dv->vv_i__j__kp1_2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp1.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 20); + grid_dv->vv_i__j__km1_2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km1.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 21); + + grid_dv->vv_i__j__k___3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__k__.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 22); + grid_dv->vv_ip1j__k___3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip1j__k__.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 23); + grid_dv->vv_im1j__k___3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im1j__k__.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 24); + grid_dv->vv_i__jp1k___3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp1k__.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 25); + grid_dv->vv_i__jm1k___3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm1k__.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 26); + grid_dv->vv_i__j__kp1_3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp1.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 27); + grid_dv->vv_i__j__km1_3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km1.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 28); + + grid_dv->vv_i__j__k___4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__k__.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 29); + grid_dv->vv_ip1j__k___4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip1j__k__.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 30); + grid_dv->vv_im1j__k___4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im1j__k__.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 31); + grid_dv->vv_i__jp1k___4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp1k__.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 32); + grid_dv->vv_i__jm1k___4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm1k__.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 33); + grid_dv->vv_i__j__kp1_4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp1.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 34); + grid_dv->vv_i__j__km1_4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km1.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 35); + + grid_dv->vv_i__j__k___5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__k__.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 36); + grid_dv->vv_ip1j__k___5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip1j__k__.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 37); + grid_dv->vv_im1j__k___5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im1j__k__.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 38); + grid_dv->vv_i__jp1k___5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp1k__.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 39); + grid_dv->vv_i__jm1k___5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm1k__.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 40); + grid_dv->vv_i__j__kp1_5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp1.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 41); + grid_dv->vv_i__j__km1_5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km1.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 42); + + grid_dv->vv_i__j__k___6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__k__.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 43); + grid_dv->vv_ip1j__k___6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip1j__k__.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 44); + grid_dv->vv_im1j__k___6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im1j__k__.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 45); + grid_dv->vv_i__jp1k___6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp1k__.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 46); + grid_dv->vv_i__jm1k___6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm1k__.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 47); + grid_dv->vv_i__j__kp1_6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp1.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 48); + grid_dv->vv_i__j__km1_6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km1.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 49); + + grid_dv->vv_i__j__k___7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__k__.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 50); + grid_dv->vv_ip1j__k___7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip1j__k__.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 51); + grid_dv->vv_im1j__k___7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im1j__k__.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 52); + grid_dv->vv_i__jp1k___7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp1k__.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 53); + grid_dv->vv_i__jm1k___7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm1k__.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 54); + grid_dv->vv_i__j__kp1_7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp1.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 55); + grid_dv->vv_i__j__km1_7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km1.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 56); + + grid_dv->vv_fac_a_0 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_a.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 57); + grid_dv->vv_fac_b_0 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_b.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 58); + grid_dv->vv_fac_c_0 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_c.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 59); + grid_dv->vv_fac_f_0 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_f.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 60); + grid_dv->vv_T0v_0 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0v.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 61); + grid_dv->vv_T0r_0 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0r.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 62); + grid_dv->vv_T0t_0 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0t.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 63); + grid_dv->vv_T0p_0 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0p.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 64); + grid_dv->vv_fun_0 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fun.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 65); + grid_dv->vv_change_0 = (bool*) allocate_and_copy_host_to_device_flattened_bl( vv_change.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 66); + + grid_dv->vv_fac_a_1 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_a.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 67); + grid_dv->vv_fac_b_1 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_b.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 68); + grid_dv->vv_fac_c_1 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_c.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 69); + grid_dv->vv_fac_f_1 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_f.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 70); + grid_dv->vv_T0v_1 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0v.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 71); + grid_dv->vv_T0r_1 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0r.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 72); + grid_dv->vv_T0t_1 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0t.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 73); + grid_dv->vv_T0p_1 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0p.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 74); + grid_dv->vv_fun_1 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fun.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 75); + grid_dv->vv_change_1 = (bool*) allocate_and_copy_host_to_device_flattened_bl( vv_change.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 76); + + grid_dv->vv_fac_a_2 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_a.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 77); + grid_dv->vv_fac_b_2 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_b.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 78); + grid_dv->vv_fac_c_2 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_c.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 79); + grid_dv->vv_fac_f_2 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_f.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 80); + grid_dv->vv_T0v_2 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0v.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 81); + grid_dv->vv_T0r_2 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0r.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 82); + grid_dv->vv_T0t_2 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0t.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 83); + grid_dv->vv_T0p_2 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0p.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 84); + grid_dv->vv_fun_2 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fun.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 85); + grid_dv->vv_change_2 = (bool*) allocate_and_copy_host_to_device_flattened_bl( vv_change.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 86); + + grid_dv->vv_fac_a_3 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_a.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 77); + grid_dv->vv_fac_b_3 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_b.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 78); + grid_dv->vv_fac_c_3 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_c.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 79); + grid_dv->vv_fac_f_3 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_f.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 80); + grid_dv->vv_T0v_3 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0v.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 81); + grid_dv->vv_T0r_3 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0r.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 82); + grid_dv->vv_T0t_3 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0t.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 83); + grid_dv->vv_T0p_3 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0p.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 84); + grid_dv->vv_fun_3 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fun.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 85); + grid_dv->vv_change_3 = (bool*) allocate_and_copy_host_to_device_flattened_bl( vv_change.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 86); + + grid_dv->vv_fac_a_4 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_a.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 77); + grid_dv->vv_fac_b_4 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_b.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 78); + grid_dv->vv_fac_c_4 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_c.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 79); + grid_dv->vv_fac_f_4 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_f.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 80); + grid_dv->vv_T0v_4 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0v.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 81); + grid_dv->vv_T0r_4 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0r.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 82); + grid_dv->vv_T0t_4 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0t.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 83); + grid_dv->vv_T0p_4 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0p.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 84); + grid_dv->vv_fun_4 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fun.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 85); + grid_dv->vv_change_4 = (bool*) allocate_and_copy_host_to_device_flattened_bl( vv_change.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 86); + + grid_dv->vv_fac_a_5 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_a.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 77); + grid_dv->vv_fac_b_5 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_b.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 78); + grid_dv->vv_fac_c_5 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_c.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 79); + grid_dv->vv_fac_f_5 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_f.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 80); + grid_dv->vv_T0v_5 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0v.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 81); + grid_dv->vv_T0r_5 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0r.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 82); + grid_dv->vv_T0t_5 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0t.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 83); + grid_dv->vv_T0p_5 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0p.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 84); + grid_dv->vv_fun_5 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fun.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 85); + grid_dv->vv_change_5 = (bool*) allocate_and_copy_host_to_device_flattened_bl( vv_change.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 86); + + grid_dv->vv_fac_a_6 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_a.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 77); + grid_dv->vv_fac_b_6 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_b.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 78); + grid_dv->vv_fac_c_6 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_c.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 79); + grid_dv->vv_fac_f_6 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_f.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 80); + grid_dv->vv_T0v_6 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0v.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 81); + grid_dv->vv_T0r_6 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0r.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 82); + grid_dv->vv_T0t_6 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0t.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 83); + grid_dv->vv_T0p_6 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0p.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 84); + grid_dv->vv_fun_6 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fun.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 85); + grid_dv->vv_change_6 = (bool*) allocate_and_copy_host_to_device_flattened_bl( vv_change.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 86); + + grid_dv->vv_fac_a_7 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_a.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 77); + grid_dv->vv_fac_b_7 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_b.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 78); + grid_dv->vv_fac_c_7 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_c.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 79); + grid_dv->vv_fac_f_7 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_f.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 80); + grid_dv->vv_T0v_7 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0v.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 81); + grid_dv->vv_T0r_7 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0r.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 82); + grid_dv->vv_T0t_7 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0t.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 83); + grid_dv->vv_T0p_7 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0p.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 84); + grid_dv->vv_fun_7 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fun.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 85); + grid_dv->vv_change_7 = (bool*) allocate_and_copy_host_to_device_flattened_bl( vv_change.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 86); + + // allocate tau (need full grid including boundary nodes) + print_CUDA_error_if_any(allocate_memory_on_device_cv((void**)&(grid_dv->tau), loc_I*loc_J*loc_K), 87); + + +} + +void cuda_initialize_grid_3rd(std::vector< std::vector >& ijk, Grid_on_device* grid_dv, int const& loc_I, int const& loc_J, int const& loc_K, + CUSTOMREAL const& dp, CUSTOMREAL const& dt, CUSTOMREAL const& dr, \ + std::vector> & vv_i__j__k__, \ + std::vector> & vv_ip1j__k__, \ + std::vector> & vv_im1j__k__, \ + std::vector> & vv_i__jp1k__, \ + std::vector> & vv_i__jm1k__, \ + std::vector> & vv_i__j__kp1, \ + std::vector> & vv_i__j__km1, \ + std::vector> & vv_ip2j__k__, \ + std::vector> & vv_im2j__k__, \ + std::vector> & vv_i__jp2k__, \ + std::vector> & vv_i__jm2k__, \ + std::vector> & vv_i__j__kp2, \ + std::vector> & vv_i__j__km2, \ + std::vector> & vv_fac_a, \ + std::vector> & vv_fac_b, \ + std::vector> & vv_fac_c, \ + std::vector> & vv_fac_f, \ + std::vector> & vv_T0v, \ + std::vector> & vv_T0r, \ + std::vector> & vv_T0t, \ + std::vector> & vv_T0p, \ + std::vector> & vv_fun, \ + std::vector> & vv_change){ + + grid_dv->if_3rd_order = true; + + // store grid parameters + grid_dv->loc_I_host = loc_I; + grid_dv->loc_J_host = loc_J; + grid_dv->loc_K_host = loc_K; + grid_dv->dr_host = dr; + grid_dv->dt_host = dt; + grid_dv->dp_host = dp; + + // count node number + grid_dv->n_nodes_total_host = 0; + grid_dv->n_levels_host = ijk.size(); + grid_dv->n_nodes_on_levels_host = new int[grid_dv->n_levels_host]; + + for (int i = 0; i < grid_dv->n_levels_host; i++){ + grid_dv->n_nodes_on_levels_host[i] = ijk.at(i).size(); + grid_dv->n_nodes_total_host += grid_dv->n_nodes_on_levels_host[i]; + // find max + if (grid_dv->n_nodes_on_levels_host[i] > grid_dv->n_nodes_max_host){ + grid_dv->n_nodes_max_host = grid_dv->n_nodes_on_levels_host[i]; + } + } + + // allocate memory on device + grid_dv->n_nodes_on_levels = (int*) allocate_and_copy_host_to_device_i(grid_dv->n_nodes_on_levels_host, grid_dv->n_levels_host, 0); + + grid_dv->vv_i__j__k___0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__k__.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 1); + grid_dv->vv_ip1j__k___0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip1j__k__.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 2); + grid_dv->vv_im1j__k___0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im1j__k__.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 3); + grid_dv->vv_i__jp1k___0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp1k__.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 4); + grid_dv->vv_i__jm1k___0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm1k__.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 5); + grid_dv->vv_i__j__kp1_0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp1.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 6); + grid_dv->vv_i__j__km1_0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km1.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 7); + grid_dv->vv_ip2j__k___0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip2j__k__.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 8); + grid_dv->vv_im2j__k___0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im2j__k__.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 9); + grid_dv->vv_i__jp2k___0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp2k__.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 10); + grid_dv->vv_i__jm2k___0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm2k__.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 11); + grid_dv->vv_i__j__kp2_0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp2.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 12); + grid_dv->vv_i__j__km2_0 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km2.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 13); + + grid_dv->vv_i__j__k___1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__k__.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 8); + grid_dv->vv_ip1j__k___1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip1j__k__.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 9); + grid_dv->vv_im1j__k___1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im1j__k__.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 10); + grid_dv->vv_i__jp1k___1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp1k__.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 11); + grid_dv->vv_i__jm1k___1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm1k__.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 12); + grid_dv->vv_i__j__kp1_1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp1.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 13); + grid_dv->vv_i__j__km1_1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km1.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 14); + grid_dv->vv_ip2j__k___1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip2j__k__.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 8); + grid_dv->vv_im2j__k___1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im2j__k__.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 9); + grid_dv->vv_i__jp2k___1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp2k__.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 10); + grid_dv->vv_i__jm2k___1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm2k__.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 11); + grid_dv->vv_i__j__kp2_1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp2.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 12); + grid_dv->vv_i__j__km2_1 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km2.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 13); + + grid_dv->vv_i__j__k___2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__k__.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 15); + grid_dv->vv_ip1j__k___2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip1j__k__.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 16); + grid_dv->vv_im1j__k___2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im1j__k__.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 17); + grid_dv->vv_i__jp1k___2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp1k__.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 18); + grid_dv->vv_i__jm1k___2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm1k__.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 19); + grid_dv->vv_i__j__kp1_2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp1.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 20); + grid_dv->vv_i__j__km1_2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km1.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 21); + grid_dv->vv_ip2j__k___2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip2j__k__.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 8); + grid_dv->vv_im2j__k___2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im2j__k__.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 9); + grid_dv->vv_i__jp2k___2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp2k__.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 10); + grid_dv->vv_i__jm2k___2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm2k__.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 11); + grid_dv->vv_i__j__kp2_2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp2.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 12); + grid_dv->vv_i__j__km2_2 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km2.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 13); + + grid_dv->vv_i__j__k___3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__k__.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 22); + grid_dv->vv_ip1j__k___3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip1j__k__.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 23); + grid_dv->vv_im1j__k___3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im1j__k__.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 24); + grid_dv->vv_i__jp1k___3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp1k__.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 25); + grid_dv->vv_i__jm1k___3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm1k__.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 26); + grid_dv->vv_i__j__kp1_3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp1.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 27); + grid_dv->vv_i__j__km1_3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km1.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 28); + grid_dv->vv_ip2j__k___3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip2j__k__.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 8); + grid_dv->vv_im2j__k___3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im2j__k__.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 9); + grid_dv->vv_i__jp2k___3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp2k__.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 10); + grid_dv->vv_i__jm2k___3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm2k__.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 11); + grid_dv->vv_i__j__kp2_3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp2.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 12); + grid_dv->vv_i__j__km2_3 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km2.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 13); + + grid_dv->vv_i__j__k___4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__k__.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 29); + grid_dv->vv_ip1j__k___4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip1j__k__.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 30); + grid_dv->vv_im1j__k___4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im1j__k__.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 31); + grid_dv->vv_i__jp1k___4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp1k__.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 32); + grid_dv->vv_i__jm1k___4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm1k__.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 33); + grid_dv->vv_i__j__kp1_4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp1.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 34); + grid_dv->vv_i__j__km1_4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km1.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 35); + grid_dv->vv_ip2j__k___4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip2j__k__.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 8); + grid_dv->vv_im2j__k___4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im2j__k__.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 9); + grid_dv->vv_i__jp2k___4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp2k__.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 10); + grid_dv->vv_i__jm2k___4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm2k__.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 11); + grid_dv->vv_i__j__kp2_4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp2.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 12); + grid_dv->vv_i__j__km2_4 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km2.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 13); + + grid_dv->vv_i__j__k___5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__k__.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 36); + grid_dv->vv_ip1j__k___5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip1j__k__.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 37); + grid_dv->vv_im1j__k___5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im1j__k__.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 38); + grid_dv->vv_i__jp1k___5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp1k__.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 39); + grid_dv->vv_i__jm1k___5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm1k__.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 40); + grid_dv->vv_i__j__kp1_5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp1.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 41); + grid_dv->vv_i__j__km1_5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km1.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 42); + grid_dv->vv_ip2j__k___5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip2j__k__.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 8); + grid_dv->vv_im2j__k___5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im2j__k__.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 9); + grid_dv->vv_i__jp2k___5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp2k__.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 10); + grid_dv->vv_i__jm2k___5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm2k__.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 11); + grid_dv->vv_i__j__kp2_5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp2.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 12); + grid_dv->vv_i__j__km2_5 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km2.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 13); + + grid_dv->vv_i__j__k___6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__k__.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 43); + grid_dv->vv_ip1j__k___6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip1j__k__.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 44); + grid_dv->vv_im1j__k___6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im1j__k__.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 45); + grid_dv->vv_i__jp1k___6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp1k__.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 46); + grid_dv->vv_i__jm1k___6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm1k__.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 47); + grid_dv->vv_i__j__kp1_6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp1.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 48); + grid_dv->vv_i__j__km1_6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km1.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 49); + grid_dv->vv_ip2j__k___6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip2j__k__.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 8); + grid_dv->vv_im2j__k___6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im2j__k__.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 9); + grid_dv->vv_i__jp2k___6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp2k__.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 10); + grid_dv->vv_i__jm2k___6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm2k__.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 11); + grid_dv->vv_i__j__kp2_6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp2.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 12); + grid_dv->vv_i__j__km2_6 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km2.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 13); + + grid_dv->vv_i__j__k___7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__k__.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 50); + grid_dv->vv_ip1j__k___7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip1j__k__.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 51); + grid_dv->vv_im1j__k___7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im1j__k__.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 52); + grid_dv->vv_i__jp1k___7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp1k__.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 53); + grid_dv->vv_i__jm1k___7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm1k__.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 54); + grid_dv->vv_i__j__kp1_7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp1.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 55); + grid_dv->vv_i__j__km1_7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km1.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 56); + grid_dv->vv_ip2j__k___7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_ip2j__k__.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 8); + grid_dv->vv_im2j__k___7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_im2j__k__.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 9); + grid_dv->vv_i__jp2k___7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jp2k__.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 10); + grid_dv->vv_i__jm2k___7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__jm2k__.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 11); + grid_dv->vv_i__j__kp2_7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__kp2.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 12); + grid_dv->vv_i__j__km2_7 = (int*) allocate_and_copy_host_to_device_flattened_i(vv_i__j__km2.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 13); + + grid_dv->vv_fac_a_0 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_a.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 57); + grid_dv->vv_fac_b_0 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_b.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 58); + grid_dv->vv_fac_c_0 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_c.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 59); + grid_dv->vv_fac_f_0 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_f.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 60); + grid_dv->vv_T0v_0 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0v.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 61); + grid_dv->vv_T0r_0 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0r.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 62); + grid_dv->vv_T0t_0 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0t.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 63); + grid_dv->vv_T0p_0 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0p.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 64); + grid_dv->vv_fun_0 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fun.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 65); + grid_dv->vv_change_0 = (bool*) allocate_and_copy_host_to_device_flattened_bl( vv_change.at(0), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 66); + + grid_dv->vv_fac_a_1 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_a.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 67); + grid_dv->vv_fac_b_1 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_b.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 68); + grid_dv->vv_fac_c_1 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_c.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 69); + grid_dv->vv_fac_f_1 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_f.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 70); + grid_dv->vv_T0v_1 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0v.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 71); + grid_dv->vv_T0r_1 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0r.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 72); + grid_dv->vv_T0t_1 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0t.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 73); + grid_dv->vv_T0p_1 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0p.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 74); + grid_dv->vv_fun_1 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fun.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 75); + grid_dv->vv_change_1 = (bool*) allocate_and_copy_host_to_device_flattened_bl( vv_change.at(1), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 76); + + grid_dv->vv_fac_a_2 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_a.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 77); + grid_dv->vv_fac_b_2 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_b.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 78); + grid_dv->vv_fac_c_2 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_c.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 79); + grid_dv->vv_fac_f_2 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_f.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 80); + grid_dv->vv_T0v_2 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0v.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 81); + grid_dv->vv_T0r_2 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0r.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 82); + grid_dv->vv_T0t_2 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0t.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 83); + grid_dv->vv_T0p_2 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0p.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 84); + grid_dv->vv_fun_2 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fun.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 85); + grid_dv->vv_change_2 = (bool*) allocate_and_copy_host_to_device_flattened_bl( vv_change.at(2), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 86); + + grid_dv->vv_fac_a_3 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_a.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 77); + grid_dv->vv_fac_b_3 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_b.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 78); + grid_dv->vv_fac_c_3 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_c.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 79); + grid_dv->vv_fac_f_3 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_f.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 80); + grid_dv->vv_T0v_3 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0v.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 81); + grid_dv->vv_T0r_3 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0r.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 82); + grid_dv->vv_T0t_3 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0t.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 83); + grid_dv->vv_T0p_3 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0p.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 84); + grid_dv->vv_fun_3 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fun.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 85); + grid_dv->vv_change_3 = (bool*) allocate_and_copy_host_to_device_flattened_bl( vv_change.at(3), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 86); + + grid_dv->vv_fac_a_4 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_a.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 77); + grid_dv->vv_fac_b_4 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_b.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 78); + grid_dv->vv_fac_c_4 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_c.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 79); + grid_dv->vv_fac_f_4 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_f.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 80); + grid_dv->vv_T0v_4 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0v.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 81); + grid_dv->vv_T0r_4 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0r.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 82); + grid_dv->vv_T0t_4 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0t.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 83); + grid_dv->vv_T0p_4 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0p.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 84); + grid_dv->vv_fun_4 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fun.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 85); + grid_dv->vv_change_4 = (bool*) allocate_and_copy_host_to_device_flattened_bl( vv_change.at(4), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 86); + + grid_dv->vv_fac_a_5 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_a.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 77); + grid_dv->vv_fac_b_5 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_b.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 78); + grid_dv->vv_fac_c_5 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_c.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 79); + grid_dv->vv_fac_f_5 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_f.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 80); + grid_dv->vv_T0v_5 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0v.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 81); + grid_dv->vv_T0r_5 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0r.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 82); + grid_dv->vv_T0t_5 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0t.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 83); + grid_dv->vv_T0p_5 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0p.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 84); + grid_dv->vv_fun_5 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fun.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 85); + grid_dv->vv_change_5 = (bool*) allocate_and_copy_host_to_device_flattened_bl( vv_change.at(5), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 86); + + grid_dv->vv_fac_a_6 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_a.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 77); + grid_dv->vv_fac_b_6 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_b.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 78); + grid_dv->vv_fac_c_6 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_c.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 79); + grid_dv->vv_fac_f_6 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_f.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 80); + grid_dv->vv_T0v_6 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0v.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 81); + grid_dv->vv_T0r_6 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0r.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 82); + grid_dv->vv_T0t_6 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0t.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 83); + grid_dv->vv_T0p_6 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0p.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 84); + grid_dv->vv_fun_6 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fun.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 85); + grid_dv->vv_change_6 = (bool*) allocate_and_copy_host_to_device_flattened_bl( vv_change.at(6), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 86); + + grid_dv->vv_fac_a_7 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_a.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 77); + grid_dv->vv_fac_b_7 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_b.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 78); + grid_dv->vv_fac_c_7 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_c.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 79); + grid_dv->vv_fac_f_7 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fac_f.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 80); + grid_dv->vv_T0v_7 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0v.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 81); + grid_dv->vv_T0r_7 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0r.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 82); + grid_dv->vv_T0t_7 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0t.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 83); + grid_dv->vv_T0p_7 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_T0p.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 84); + grid_dv->vv_fun_7 = (CUSTOMREAL*) allocate_and_copy_host_to_device_flattened_cv( vv_fun.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 85); + grid_dv->vv_change_7 = (bool*) allocate_and_copy_host_to_device_flattened_bl( vv_change.at(7), grid_dv->n_nodes_total_host, grid_dv->n_nodes_on_levels_host, 86); + + // allocate tau + print_CUDA_error_if_any(allocate_memory_on_device_cv((void**)&(grid_dv->tau), loc_I*loc_J*loc_K), 87); + +} + + +void cuda_finalize_grid(Grid_on_device* grid_dv){ + // deallocate memory on device + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->n_nodes_on_levels), 10000); + delete [] grid_dv->n_nodes_on_levels_host; + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__k___0), 1); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_ip1j__k___0), 2); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_im1j__k___0), 3); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jp1k___0), 4); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jm1k___0), 5); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__kp1_0), 6); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__km1_0), 7); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__k___1), 8); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_ip1j__k___1), 9); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_im1j__k___1), 10); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jp1k___1), 11); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jm1k___1), 12); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__kp1_1), 13); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__km1_1), 14); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__k___2), 15); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_ip1j__k___2), 16); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_im1j__k___2), 17); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jp1k___2), 18); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jm1k___2), 19); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__kp1_2), 20); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__km1_2), 21); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__k___3), 22); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_ip1j__k___3), 23); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_im1j__k___3), 24); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jp1k___3), 25); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jm1k___3), 26); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__kp1_3), 27); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__km1_3), 28); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__k___4), 29); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_ip1j__k___4), 30); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_im1j__k___4), 31); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jp1k___4), 32); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jm1k___4), 33); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__kp1_4), 34); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__km1_4), 35); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__k___5), 36); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_ip1j__k___5), 37); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_im1j__k___5), 38); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jp1k___5), 39); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jm1k___5), 40); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__kp1_5), 41); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__km1_5), 42); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__k___6), 43); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_ip1j__k___6), 44); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_im1j__k___6), 45); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jp1k___6), 46); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jm1k___6), 47); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__kp1_6), 48); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__km1_6), 49); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__k___7), 50); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_ip1j__k___7), 51); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_im1j__k___7), 52); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jp1k___7), 53); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jm1k___7), 54); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__kp1_7), 55); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__km1_7), 56); + + if(grid_dv->if_3rd_order){ + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_ip2j__k___0), 10008); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_im2j__k___0), 10009); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jp2k___0), 10010); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jm2k___0), 10011); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__kp2_0), 10012); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__km2_0), 10013); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_ip2j__k___1), 10008); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_im2j__k___1), 10009); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jp2k___1), 10010); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jm2k___1), 10011); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__kp2_1), 10012); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__km2_1), 10013); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_ip2j__k___2), 10008); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_im2j__k___2), 10009); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jp2k___2), 10010); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jm2k___2), 10011); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__kp2_2), 10012); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__km2_2), 10013); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_ip2j__k___3), 10008); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_im2j__k___3), 10009); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jp2k___3), 10010); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jm2k___3), 10011); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__kp2_3), 10012); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__km2_3), 10013); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_ip2j__k___4), 10008); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_im2j__k___4), 10009); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jp2k___4), 10010); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jm2k___4), 10011); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__kp2_4), 10012); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__km2_4), 10013); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_ip2j__k___5), 10008); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_im2j__k___5), 10009); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jp2k___5), 10010); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jm2k___5), 10011); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__kp2_5), 10012); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__km2_5), 10013); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_ip2j__k___6), 10008); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_im2j__k___6), 10009); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jp2k___6), 10010); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jm2k___6), 10011); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__kp2_6), 10012); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__km2_6), 10013); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_ip2j__k___7), 10008); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_im2j__k___7), 10009); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jp2k___7), 10010); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__jm2k___7), 10011); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__kp2_7), 10012); + print_CUDA_error_if_any(deallocate_memory_on_device_i(grid_dv->vv_i__j__km2_7), 10013); + } + + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_a_0), 10057); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_b_0), 10058); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_c_0), 10059); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_f_0), 10060); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0v_0), 10061); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0r_0), 10062); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0t_0), 10063); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0p_0), 10064); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fun_0), 10065); + print_CUDA_error_if_any(deallocate_memory_on_device_bl(grid_dv->vv_change_0), 10066); + + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_a_1), 10067); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_b_1), 10068); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_c_1), 10069); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_f_1), 10070); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0v_1), 10071); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0r_1), 10072); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0t_1), 10073); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0p_1), 10074); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fun_1), 10075); + print_CUDA_error_if_any(deallocate_memory_on_device_bl(grid_dv->vv_change_1), 10076); + + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_a_2), 10077); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_b_2), 10078); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_c_2), 10079); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_f_2), 10080); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0v_2), 10081); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0r_2), 10082); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0t_2), 10083); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0p_2), 10084); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fun_2), 10085); + print_CUDA_error_if_any(deallocate_memory_on_device_bl(grid_dv->vv_change_2), 10086); + + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_a_3), 10077); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_b_3), 10078); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_c_3), 10079); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_f_3), 10080); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0v_3), 10081); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0r_3), 10082); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0t_3), 10083); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0p_3), 10084); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fun_3), 10085); + print_CUDA_error_if_any(deallocate_memory_on_device_bl(grid_dv->vv_change_3), 10086); + + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_a_4), 10077); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_b_4), 10078); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_c_4), 10079); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_f_4), 10080); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0v_4), 10081); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0r_4), 10082); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0t_4), 10083); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0p_4), 10084); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fun_4), 10085); + print_CUDA_error_if_any(deallocate_memory_on_device_bl(grid_dv->vv_change_4), 10086); + + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_a_5), 10077); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_b_5), 10078); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_c_5), 10079); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_f_5), 10080); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0v_5), 10081); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0r_5), 10082); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0t_5), 10083); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0p_5), 10084); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fun_5), 10085); + print_CUDA_error_if_any(deallocate_memory_on_device_bl(grid_dv->vv_change_5), 10086); + + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_a_6), 10077); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_b_6), 10078); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_c_6), 10079); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_f_6), 10080); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0v_6), 10081); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0r_6), 10082); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0t_6), 10083); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0p_6), 10084); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fun_6), 10085); + print_CUDA_error_if_any(deallocate_memory_on_device_bl(grid_dv->vv_change_6), 10086); + + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_a_7), 10077); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_b_7), 10078); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_c_7), 10079); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fac_f_7), 10080); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0v_7), 10081); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0r_7), 10082); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0t_7), 10083); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_T0p_7), 10084); + print_CUDA_error_if_any(deallocate_memory_on_device_cv( grid_dv->vv_fun_7), 10085); + print_CUDA_error_if_any(deallocate_memory_on_device_bl(grid_dv->vv_change_7), 10086); + + print_CUDA_error_if_any(deallocate_memory_on_device_cv(grid_dv->tau), 10087); + +} + + +// copy tau from host to device +void cuda_copy_tau_to_device(Grid_on_device* grid_dv, CUSTOMREAL* tau_h){ + print_CUDA_error_if_any(copy_host_to_device_cv(grid_dv->tau, tau_h, grid_dv->loc_I_host*grid_dv->loc_J_host*grid_dv->loc_K_host), 10087); +} + + +// copy tau from device to host +void cuda_copy_tau_to_host(Grid_on_device* grid_dv, CUSTOMREAL* tau_h){ + print_CUDA_error_if_any(copy_device_to_host_cv(tau_h, grid_dv->tau, grid_dv->loc_I_host*grid_dv->loc_J_host*grid_dv->loc_K_host), 10088); +} + diff --git a/cuda/grid_wrapper.cuh b/cuda/grid_wrapper.cuh new file mode 100644 index 0000000..1fdf5cd --- /dev/null +++ b/cuda/grid_wrapper.cuh @@ -0,0 +1,123 @@ +#ifndef GRID_WRAPPER_CUH +#define GRID_WRAPPER_CUH + +#include +#include +#include + +#include +#include + +//#include "config.h" +#include "cuda_constants.cuh" +#include "cuda_utils.cuh" + +// structure for storing grid information on device +typedef struct Grid_on_device { + + // parameters + int loc_I_host, loc_J_host, loc_K_host; + int n_nodes_total_host; + int n_nodes_max_host=0; + int n_levels_host; + CUSTOMREAL dr_host, dt_host, dp_host; + + // index storage + int* n_nodes_on_levels, *n_nodes_on_levels_host; + + int* vv_i__j__k___0, *vv_i__j__k___1, *vv_i__j__k___2, *vv_i__j__k___3, *vv_i__j__k___4, *vv_i__j__k___5, *vv_i__j__k___6, *vv_i__j__k___7; + int* vv_ip1j__k___0, *vv_ip1j__k___1, *vv_ip1j__k___2, *vv_ip1j__k___3, *vv_ip1j__k___4, *vv_ip1j__k___5, *vv_ip1j__k___6, *vv_ip1j__k___7; + int* vv_im1j__k___0, *vv_im1j__k___1, *vv_im1j__k___2, *vv_im1j__k___3, *vv_im1j__k___4, *vv_im1j__k___5, *vv_im1j__k___6, *vv_im1j__k___7; + int* vv_i__jp1k___0, *vv_i__jp1k___1, *vv_i__jp1k___2, *vv_i__jp1k___3, *vv_i__jp1k___4, *vv_i__jp1k___5, *vv_i__jp1k___6, *vv_i__jp1k___7; + int* vv_i__jm1k___0, *vv_i__jm1k___1, *vv_i__jm1k___2, *vv_i__jm1k___3, *vv_i__jm1k___4, *vv_i__jm1k___5, *vv_i__jm1k___6, *vv_i__jm1k___7; + int* vv_i__j__kp1_0, *vv_i__j__kp1_1, *vv_i__j__kp1_2, *vv_i__j__kp1_3, *vv_i__j__kp1_4, *vv_i__j__kp1_5, *vv_i__j__kp1_6, *vv_i__j__kp1_7; + int* vv_i__j__km1_0, *vv_i__j__km1_1, *vv_i__j__km1_2, *vv_i__j__km1_3, *vv_i__j__km1_4, *vv_i__j__km1_5, *vv_i__j__km1_6, *vv_i__j__km1_7; + int* vv_ip2j__k___0, *vv_ip2j__k___1, *vv_ip2j__k___2, *vv_ip2j__k___3, *vv_ip2j__k___4, *vv_ip2j__k___5, *vv_ip2j__k___6, *vv_ip2j__k___7; + int* vv_im2j__k___0, *vv_im2j__k___1, *vv_im2j__k___2, *vv_im2j__k___3, *vv_im2j__k___4, *vv_im2j__k___5, *vv_im2j__k___6, *vv_im2j__k___7; + int* vv_i__jp2k___0, *vv_i__jp2k___1, *vv_i__jp2k___2, *vv_i__jp2k___3, *vv_i__jp2k___4, *vv_i__jp2k___5, *vv_i__jp2k___6, *vv_i__jp2k___7; + int* vv_i__jm2k___0, *vv_i__jm2k___1, *vv_i__jm2k___2, *vv_i__jm2k___3, *vv_i__jm2k___4, *vv_i__jm2k___5, *vv_i__jm2k___6, *vv_i__jm2k___7; + int* vv_i__j__kp2_0, *vv_i__j__kp2_1, *vv_i__j__kp2_2, *vv_i__j__kp2_3, *vv_i__j__kp2_4, *vv_i__j__kp2_5, *vv_i__j__kp2_6, *vv_i__j__kp2_7; + int* vv_i__j__km2_0, *vv_i__j__km2_1, *vv_i__j__km2_2, *vv_i__j__km2_3, *vv_i__j__km2_4, *vv_i__j__km2_5, *vv_i__j__km2_6, *vv_i__j__km2_7; + + // constants + CUSTOMREAL* vv_fac_a_0, *vv_fac_a_1, *vv_fac_a_2, *vv_fac_a_3, *vv_fac_a_4, *vv_fac_a_5, *vv_fac_a_6, *vv_fac_a_7; + CUSTOMREAL* vv_fac_b_0, *vv_fac_b_1, *vv_fac_b_2, *vv_fac_b_3, *vv_fac_b_4, *vv_fac_b_5, *vv_fac_b_6, *vv_fac_b_7; + CUSTOMREAL* vv_fac_c_0, *vv_fac_c_1, *vv_fac_c_2, *vv_fac_c_3, *vv_fac_c_4, *vv_fac_c_5, *vv_fac_c_6, *vv_fac_c_7; + CUSTOMREAL* vv_fac_f_0, *vv_fac_f_1, *vv_fac_f_2, *vv_fac_f_3, *vv_fac_f_4, *vv_fac_f_5, *vv_fac_f_6, *vv_fac_f_7; + CUSTOMREAL* vv_T0v_0, *vv_T0v_1, *vv_T0v_2, *vv_T0v_3, *vv_T0v_4, *vv_T0v_5, *vv_T0v_6, *vv_T0v_7; + CUSTOMREAL* vv_T0r_0, *vv_T0r_1, *vv_T0r_2, *vv_T0r_3, *vv_T0r_4, *vv_T0r_5, *vv_T0r_6, *vv_T0r_7; + CUSTOMREAL* vv_T0t_0, *vv_T0t_1, *vv_T0t_2, *vv_T0t_3, *vv_T0t_4, *vv_T0t_5, *vv_T0t_6, *vv_T0t_7; + CUSTOMREAL* vv_T0p_0, *vv_T0p_1, *vv_T0p_2, *vv_T0p_3, *vv_T0p_4, *vv_T0p_5, *vv_T0p_6, *vv_T0p_7; + CUSTOMREAL* vv_fun_0, *vv_fun_1, *vv_fun_2, *vv_fun_3, *vv_fun_4, *vv_fun_5, *vv_fun_6, *vv_fun_7; + bool* vv_change_0, *vv_change_1, *vv_change_2, *vv_change_3, *vv_change_4, *vv_change_5, *vv_change_6, *vv_change_7; + + // temporary variables + CUSTOMREAL* tau; + + bool if_3rd_order = false; + + // thead and grid for sweeping + dim3 grid_sweep_host, threads_sweep_host; + // array of streams + cudaStream_t* level_streams; + + +} Grid_on_device; + + +void cuda_initialize_grid_1st(std::vector< std::vector >& ijk, Grid_on_device* grid_dv, int const& loc_I, int const& loc_J, int const& loc_K, + CUSTOMREAL const& dp, CUSTOMREAL const& dt, CUSTOMREAL const& dr, \ + std::vector> & vv_i__j__k__, \ + std::vector> & vv_ip1j__k__, \ + std::vector> & vv_im1j__k__, \ + std::vector> & vv_i__jp1k__, \ + std::vector> & vv_i__jm1k__, \ + std::vector> & vv_i__j__kp1, \ + std::vector> & vv_i__j__km1, \ + std::vector> & vv_fac_a, \ + std::vector> & vv_fac_b, \ + std::vector> & vv_fac_c, \ + std::vector> & vv_fac_f, \ + std::vector> & vv_T0v, \ + std::vector> & vv_T0r, \ + std::vector> & vv_T0t, \ + std::vector> & vv_T0p, \ + std::vector> & vv_fun, \ + std::vector> & vv_change); + +void cuda_initialize_grid_3rd(std::vector< std::vector >& ijk, Grid_on_device* grid_dv, int const& loc_I, int const& loc_J, int const& loc_K, + CUSTOMREAL const& dp, CUSTOMREAL const& dt, CUSTOMREAL const& dr, \ + std::vector> & vv_i__j__k__, \ + std::vector> & vv_ip1j__k__, \ + std::vector> & vv_im1j__k__, \ + std::vector> & vv_i__jp1k__, \ + std::vector> & vv_i__jm1k__, \ + std::vector> & vv_i__j__kp1, \ + std::vector> & vv_i__j__km1, \ + std::vector> & vv_ip2j__k__, \ + std::vector> & vv_im2j__k__, \ + std::vector> & vv_i__jp2k__, \ + std::vector> & vv_i__jm2k__, \ + std::vector> & vv_i__j__kp2, \ + std::vector> & vv_i__j__km2, \ + std::vector> & vv_fac_a, \ + std::vector> & vv_fac_b, \ + std::vector> & vv_fac_c, \ + std::vector> & vv_fac_f, \ + std::vector> & vv_T0v, \ + std::vector> & vv_T0r, \ + std::vector> & vv_T0t, \ + std::vector> & vv_T0p, \ + std::vector> & vv_fun, \ + std::vector> & vv_change); + + +// finalize +void cuda_finalize_grid(Grid_on_device* grid_dv); + +// copy tau from host to device +void cuda_copy_tau_to_device(Grid_on_device* grid_dv, CUSTOMREAL* tau_h); +// copy tau from device to host +void cuda_copy_tau_to_host(Grid_on_device* grid_dv, CUSTOMREAL* tau_h); + +#endif // GRID_WRAPPER_CUH \ No newline at end of file diff --git a/cuda/iterator_wrapper.cu b/cuda/iterator_wrapper.cu new file mode 100644 index 0000000..2232659 --- /dev/null +++ b/cuda/iterator_wrapper.cu @@ -0,0 +1,883 @@ +#include "iterator_wrapper.cuh" + +__device__ const CUSTOMREAL PLUS = 1.0; +__device__ const CUSTOMREAL MINUS = -1.0; +__device__ const CUSTOMREAL v_eps = 1e-12; + +__device__ const CUSTOMREAL _0_5_CR = 0.5; +__device__ const CUSTOMREAL _1_CR = 1.0; +__device__ const CUSTOMREAL _2_CR = 2.0; +__device__ const CUSTOMREAL _3_CR = 3.0; +__device__ const CUSTOMREAL _4_CR = 4.0; + +__device__ CUSTOMREAL my_square_cu(CUSTOMREAL const& x) { + return x*x; +} + +__device__ CUSTOMREAL calc_stencil_1st(CUSTOMREAL const& a, CUSTOMREAL const& b, CUSTOMREAL const& Dinv){ + return Dinv*(a-b); +} + +__device__ CUSTOMREAL calc_stencil_3rd(CUSTOMREAL const& a, CUSTOMREAL const& b, CUSTOMREAL const& c, CUSTOMREAL const& d, CUSTOMREAL const& Dinv_half, CUSTOMREAL const& sign){ + CUSTOMREAL tmp1 = v_eps + my_square_cu(a-_2_CR*b+c); + CUSTOMREAL tmp2 = v_eps + my_square_cu(d-_2_CR*a+b); + CUSTOMREAL ww = _1_CR/(_1_CR+_2_CR*my_square_cu(tmp1/tmp2)); + return sign*((_1_CR-ww)* (b-d)*Dinv_half + ww*(-_3_CR*a+_4_CR*b-c)*Dinv_half); +} + +__device__ CUSTOMREAL cuda_calc_LF_Hamiltonian( \ + CUSTOMREAL const& fac_a_, \ + CUSTOMREAL const& fac_b_, \ + CUSTOMREAL const& fac_c_, \ + CUSTOMREAL const& fac_f_, \ + CUSTOMREAL const& T0r_, \ + CUSTOMREAL const& T0t_, \ + CUSTOMREAL const& T0p_, \ + CUSTOMREAL const& T0v_, \ + CUSTOMREAL& tau_, \ + CUSTOMREAL const& pp1, CUSTOMREAL& pp2, \ + CUSTOMREAL const& pt1, CUSTOMREAL& pt2, \ + CUSTOMREAL const& pr1, CUSTOMREAL& pr2 \ + ) { + // LF Hamiltonian for T = T0 * tau + return sqrt( + fac_a_ * my_square_cu(T0r_ * tau_ + T0v_ * (pr1+pr2)/_2_CR) \ + + fac_b_ * my_square_cu(T0t_ * tau_ + T0v_ * (pt1+pt2)/_2_CR) \ + + fac_c_ * my_square_cu(T0p_ * tau_ + T0v_ * (pp1+pp2)/_2_CR) \ + - _2_CR*fac_f_ * (T0t_ * tau_ + T0v_ * (pt1+pt2)/_2_CR) \ + * (T0p_ * tau_ + T0v_ * (pp1+pp2)/_2_CR) \ + ); +} + +__global__ void cuda_do_sweep_level_kernel_1st(\ + const int i__j__k__[],\ + const int ip1j__k__[],\ + const int im1j__k__[],\ + const int i__jp1k__[],\ + const int i__jm1k__[],\ + const int i__j__kp1[],\ + const int i__j__km1[],\ + const CUSTOMREAL fac_a[], \ + const CUSTOMREAL fac_b[], \ + const CUSTOMREAL fac_c[], \ + const CUSTOMREAL fac_f[], \ + const CUSTOMREAL T0v[], \ + const CUSTOMREAL T0r[], \ + const CUSTOMREAL T0t[], \ + const CUSTOMREAL T0p[], \ + const CUSTOMREAL fun[], \ + const bool changed[], \ + CUSTOMREAL tau[], \ + const int loc_I, \ + const int loc_J, \ + const int loc_K, \ + const CUSTOMREAL dr, \ + const CUSTOMREAL dt, \ + const CUSTOMREAL dp, \ + const int n_nodes_this_level, \ + const int i_start \ +){ + + unsigned int i_node = (blockIdx.y * gridDim.x + blockIdx.x) * blockDim.x + threadIdx.x; + + if (i_node >= n_nodes_this_level) return; + + i_node += i_start; + + //if (i_node >= loc_I*loc_J*loc_K) return; + + if (changed[i_node] != true) return; + + CUSTOMREAL sigr = _1_CR*sqrt(fac_a[i_node])*T0v[i_node]; + CUSTOMREAL sigt = _1_CR*sqrt(fac_b[i_node])*T0v[i_node]; + CUSTOMREAL sigp = _1_CR*sqrt(fac_c[i_node])*T0v[i_node]; + CUSTOMREAL coe = _1_CR/((sigr/dr)+(sigt/dt)+(sigp/dp)); + + CUSTOMREAL pp1 = calc_stencil_1st(tau[i__j__k__[i_node]],tau[im1j__k__[i_node]], _1_CR/dp); + CUSTOMREAL pp2 = calc_stencil_1st(tau[ip1j__k__[i_node]],tau[i__j__k__[i_node]], _1_CR/dp); + + CUSTOMREAL pt1 = calc_stencil_1st(tau[i__j__k__[i_node]],tau[i__jm1k__[i_node]], _1_CR/dt); + CUSTOMREAL pt2 = calc_stencil_1st(tau[i__jp1k__[i_node]],tau[i__j__k__[i_node]], _1_CR/dt); + + CUSTOMREAL pr1 = calc_stencil_1st(tau[i__j__k__[i_node]],tau[i__j__km1[i_node]], _1_CR/dr); + CUSTOMREAL pr2 = calc_stencil_1st(tau[i__j__kp1[i_node]],tau[i__j__k__[i_node]], _1_CR/dr); + + // LF Hamiltonian + CUSTOMREAL Htau = cuda_calc_LF_Hamiltonian(\ + fac_a[i_node], \ + fac_b[i_node], \ + fac_c[i_node], \ + fac_f[i_node], \ + T0r[i_node], \ + T0t[i_node], \ + T0p[i_node], \ + T0v[i_node], \ + tau[i__j__k__[i_node]], \ + pp1, pp2, pt1, pt2, pr1, pr2); + + tau[i__j__k__[i_node]] += coe*((fun[i_node] - Htau) \ + +(sigr*(pr2-pr1) \ + + sigt*(pt2-pt1) \ + + sigp*(pp2-pp1))/_2_CR); + +} + +__global__ void cuda_do_sweep_level_kernel_3rd(\ + const int i__j__k__[],\ + const int ip1j__k__[],\ + const int im1j__k__[],\ + const int i__jp1k__[],\ + const int i__jm1k__[],\ + const int i__j__kp1[],\ + const int i__j__km1[],\ + const int ip2j__k__[],\ + const int im2j__k__[],\ + const int i__jp2k__[],\ + const int i__jm2k__[],\ + const int i__j__kp2[],\ + const int i__j__km2[],\ + const CUSTOMREAL fac_a[], \ + const CUSTOMREAL fac_b[], \ + const CUSTOMREAL fac_c[], \ + const CUSTOMREAL fac_f[], \ + const CUSTOMREAL T0v[], \ + const CUSTOMREAL T0r[], \ + const CUSTOMREAL T0t[], \ + const CUSTOMREAL T0p[], \ + const CUSTOMREAL fun[], \ + const bool changed[], \ + CUSTOMREAL tau[], \ + const int loc_I, \ + const int loc_J, \ + const int loc_K, \ + const CUSTOMREAL dr, \ + const CUSTOMREAL dt, \ + const CUSTOMREAL dp, \ + const int n_nodes_this_level, \ + const int i_start \ +){ + + CUSTOMREAL pp1, pp2, pt1, pt2, pr1, pr2; + + unsigned int i_node = (blockIdx.y * gridDim.x + blockIdx.x) * blockDim.x + threadIdx.x; + + if (i_node >= n_nodes_this_level) return; + + i_node += i_start; + //if (i_node >= loc_I*loc_J*loc_K) return; + + if (changed[i_node] != true) return; + + int k = i__j__k__[i_node] / (loc_I*loc_J); + int j = (i__j__k__[i_node] - k*loc_I*loc_J)/loc_I; + int i = i__j__k__[i_node] - k*loc_I*loc_J - j*loc_I; + + + CUSTOMREAL DRinv = _1_CR/dr; + CUSTOMREAL DTinv = _1_CR/dt; + CUSTOMREAL DPinv = _1_CR/dp; + CUSTOMREAL DRinv_half = DRinv*_0_5_CR; + CUSTOMREAL DTinv_half = DTinv*_0_5_CR; + CUSTOMREAL DPinv_half = DPinv*_0_5_CR; + + CUSTOMREAL sigr = _1_CR*sqrt(fac_a[i_node])*T0v[i_node]; + CUSTOMREAL sigt = _1_CR*sqrt(fac_b[i_node])*T0v[i_node]; + CUSTOMREAL sigp = _1_CR*sqrt(fac_c[i_node])*T0v[i_node]; + CUSTOMREAL coe = _1_CR/((sigr/dr)+(sigt/dt)+(sigp/dp)); + + // direction p + if (i == 1) { + pp1 = calc_stencil_1st(tau[i__j__k__[i_node]],tau[im1j__k__[i_node]],DPinv); + pp2 = calc_stencil_3rd(tau[i__j__k__[i_node]],tau[ip1j__k__[i_node]],tau[ip2j__k__[i_node]],tau[im1j__k__[i_node]],DPinv_half, PLUS); + } else if (i == loc_I-2) { + pp1 = calc_stencil_3rd(tau[i__j__k__[i_node]],tau[im1j__k__[i_node]],tau[im2j__k__[i_node]],tau[ip1j__k__[i_node]],DPinv_half, MINUS); + pp2 = calc_stencil_1st(tau[ip1j__k__[i_node]],tau[i__j__k__[i_node]],DPinv); + } else { + pp1 = calc_stencil_3rd(tau[i__j__k__[i_node]],tau[im1j__k__[i_node]],tau[im2j__k__[i_node]],tau[ip1j__k__[i_node]],DPinv_half, MINUS); + pp2 = calc_stencil_3rd(tau[i__j__k__[i_node]],tau[ip1j__k__[i_node]],tau[ip2j__k__[i_node]],tau[im1j__k__[i_node]],DPinv_half, PLUS); + } + + // direction t + if (j == 1) { + pt1 = calc_stencil_1st(tau[i__j__k__[i_node]],tau[i__jm1k__[i_node]],DTinv); + pt2 = calc_stencil_3rd(tau[i__j__k__[i_node]],tau[i__jp1k__[i_node]],tau[i__jp2k__[i_node]],tau[i__jm1k__[i_node]],DTinv_half, PLUS); + } else if (j == loc_J-2) { + pt1 = calc_stencil_3rd(tau[i__j__k__[i_node]],tau[i__jm1k__[i_node]],tau[i__jm2k__[i_node]],tau[i__jp1k__[i_node]],DTinv_half, MINUS); + pt2 = calc_stencil_1st(tau[i__jp1k__[i_node]],tau[i__j__k__[i_node]],DTinv); + } else { + pt1 = calc_stencil_3rd(tau[i__j__k__[i_node]],tau[i__jm1k__[i_node]],tau[i__jm2k__[i_node]],tau[i__jp1k__[i_node]],DTinv_half, MINUS); + pt2 = calc_stencil_3rd(tau[i__j__k__[i_node]],tau[i__jp1k__[i_node]],tau[i__jp2k__[i_node]],tau[i__jm1k__[i_node]],DTinv_half, PLUS); + } + + // direction r + if (k == 1) { + pr1 = calc_stencil_1st(tau[i__j__k__[i_node]],tau[i__j__km1[i_node]],DRinv); + pr2 = calc_stencil_3rd(tau[i__j__k__[i_node]],tau[i__j__kp1[i_node]],tau[i__j__kp2[i_node]],tau[i__j__km1[i_node]],DRinv_half, PLUS); + } else if (k == loc_K-2) { + pr1 = calc_stencil_3rd(tau[i__j__k__[i_node]],tau[i__j__km1[i_node]],tau[i__j__km2[i_node]],tau[i__j__kp1[i_node]],DRinv_half, MINUS); + pr2 = calc_stencil_1st(tau[i__j__kp1[i_node]],tau[i__j__k__[i_node]],DRinv); + } else { + pr1 = calc_stencil_3rd(tau[i__j__k__[i_node]],tau[i__j__km1[i_node]],tau[i__j__km2[i_node]],tau[i__j__kp1[i_node]],DRinv_half, MINUS); + pr2 = calc_stencil_3rd(tau[i__j__k__[i_node]],tau[i__j__kp1[i_node]],tau[i__j__kp2[i_node]],tau[i__j__km1[i_node]],DRinv_half, PLUS); + } + + CUSTOMREAL Htau = cuda_calc_LF_Hamiltonian(\ + fac_a[i_node], \ + fac_b[i_node], \ + fac_c[i_node], \ + fac_f[i_node], \ + T0r[i_node], \ + T0t[i_node], \ + T0p[i_node], \ + T0v[i_node], \ + tau[i__j__k__[i_node]], \ + pp1, pp2, pt1, pt2, pr1, pr2); + + tau[i__j__k__[i_node]] += coe*((fun[i_node] - Htau) \ + +(sigr*(pr2-pr1) \ + + sigt*(pt2-pt1) \ + + sigp*(pp2-pp1))/_2_CR); + + +} + + +void initialize_sweep_params(Grid_on_device* grid_dv){ + + // check the numBlockPerSm and set the block size accordingly + //int numBlocksPerSm = 0; + //int block_size = CUDA_SWEEPING_BLOCK_SIZE; + + //int device; + //cudaGetDevice(&device); + + //cudaDeviceProp deviceProp; + //cudaGetDeviceProperties(&deviceProp, device); + //if(grid_dv->if_3rd_order) + // cudaOccupancyMaxActiveBlocksPerMultiprocessor(&numBlocksPerSm, cuda_do_sweep_level_kernel_3rd, CUDA_SWEEPING_BLOCK_SIZE, 0); + //else + // cudaOccupancyMaxActiveBlocksPerMultiprocessor(&numBlocksPerSm, cuda_do_sweep_level_kernel_1st, CUDA_SWEEPING_BLOCK_SIZE, 0); + + //int max_cooperative_blocks = deviceProp.multiProcessorCount*numBlocksPerSm; + + //grid_dv->threads_sweep_host = dim3(block_size, 1, 1); + //grid_dv->grid_sweep_host = dim3(max_cooperative_blocks, 1, 1); + + // spawn streams + //grid_dv->level_streams = (cudaStream_t*)malloc(CUDA_MAX_NUM_STREAMS*sizeof(cudaStream_t)); + //for (int i = 0; i < CUDA_MAX_NUM_STREAMS; i++) { + grid_dv->level_streams = (cudaStream_t*)malloc(grid_dv->n_levels_host*sizeof(cudaStream_t)); + for (int i = 0; i < grid_dv->n_levels_host; i++) { + //cudaStreamCreate(&(grid_dv->level_streams[i])); + // add null + //cudaStreamCreateWithFlags(&(grid_dv->level_streams[i]), cudaStreamNonBlocking); + grid_dv->level_streams[i] = nullptr; + + } + + +} + + +void finalize_sweep_params(Grid_on_device* grid_on_dv){ + // destroy streams + //for (int i = 0; i < CUDA_MAX_NUM_STREAMS; i++) { + //for (int i = 0; i < grid_on_dv->n_levels_host; i++) { + // cudaStreamDestroy(grid_on_dv->level_streams[i]); + //} + + free(grid_on_dv->level_streams); +} + + +void run_kernel(Grid_on_device* grid_dv, int const& iswp, int& i_node_offset, int const& i_level, \ + dim3& grid_each, dim3& threads_each, int& n_nodes_this_level){ + + int id_stream = i_level;// % CUDA_MAX_NUM_STREAMS; + + if (grid_dv->if_3rd_order) { + if (iswp == 0){ + void *kernelArgs[]{\ + &(grid_dv->vv_i__j__k___0), \ + &(grid_dv->vv_ip1j__k___0), \ + &(grid_dv->vv_im1j__k___0), \ + &(grid_dv->vv_i__jp1k___0), \ + &(grid_dv->vv_i__jm1k___0), \ + &(grid_dv->vv_i__j__kp1_0), \ + &(grid_dv->vv_i__j__km1_0), \ + &(grid_dv->vv_ip2j__k___0), \ + &(grid_dv->vv_im2j__k___0), \ + &(grid_dv->vv_i__jp2k___0), \ + &(grid_dv->vv_i__jm2k___0), \ + &(grid_dv->vv_i__j__kp2_0), \ + &(grid_dv->vv_i__j__km2_0), \ + &(grid_dv->vv_fac_a_0 ), \ + &(grid_dv->vv_fac_b_0 ), \ + &(grid_dv->vv_fac_c_0 ), \ + &(grid_dv->vv_fac_f_0 ), \ + &(grid_dv->vv_T0v_0 ), \ + &(grid_dv->vv_T0r_0 ), \ + &(grid_dv->vv_T0t_0 ), \ + &(grid_dv->vv_T0p_0 ), \ + &(grid_dv->vv_fun_0 ), \ + &(grid_dv->vv_change_0 ), \ + &(grid_dv->tau), \ + &(grid_dv->loc_I_host), \ + &(grid_dv->loc_J_host), \ + &(grid_dv->loc_K_host), \ + &(grid_dv->dr_host), \ + &(grid_dv->dt_host), \ + &(grid_dv->dp_host), \ + &n_nodes_this_level, \ + &i_node_offset \ + }; + print_CUDA_error_if_any(cudaLaunchKernel((void*) cuda_do_sweep_level_kernel_3rd, grid_each, threads_each, kernelArgs, 0, grid_dv->level_streams[id_stream]), 30001); + + } else if (iswp == 1){ + void* kernelArgs[]{\ + &(grid_dv->vv_i__j__k___1), \ + &(grid_dv->vv_i__jp1k___1), \ + &(grid_dv->vv_i__jm1k___1), \ + &(grid_dv->vv_i__j__kp1_1), \ + &(grid_dv->vv_i__j__km1_1), \ + &(grid_dv->vv_ip1j__k___1), \ + &(grid_dv->vv_im1j__k___1), \ + &(grid_dv->vv_ip2j__k___1), \ + &(grid_dv->vv_im2j__k___1), \ + &(grid_dv->vv_i__jp2k___1), \ + &(grid_dv->vv_i__jm2k___1), \ + &(grid_dv->vv_i__j__kp2_1), \ + &(grid_dv->vv_i__j__km2_1), \ + &(grid_dv->vv_fac_a_1 ), \ + &(grid_dv->vv_fac_b_1 ), \ + &(grid_dv->vv_fac_c_1 ), \ + &(grid_dv->vv_fac_f_1 ), \ + &(grid_dv->vv_T0v_1 ), \ + &(grid_dv->vv_T0r_1 ), \ + &(grid_dv->vv_T0t_1 ), \ + &(grid_dv->vv_T0p_1 ), \ + &(grid_dv->vv_fun_1 ), \ + &(grid_dv->vv_change_1 ), \ + &(grid_dv->tau), \ + &(grid_dv->loc_I_host), \ + &(grid_dv->loc_J_host), \ + &(grid_dv->loc_K_host), \ + &(grid_dv->dr_host), \ + &(grid_dv->dt_host), \ + &(grid_dv->dp_host), \ + &n_nodes_this_level, \ + &i_node_offset \ + }; + print_CUDA_error_if_any(cudaLaunchKernel((void*) cuda_do_sweep_level_kernel_3rd, grid_each, threads_each, kernelArgs, 0, grid_dv->level_streams[id_stream]), 30001); + + } else if (iswp == 2){ + void* kernelArgs[]{\ + &(grid_dv->vv_i__j__k___2), \ + &(grid_dv->vv_i__j__kp1_2), \ + &(grid_dv->vv_i__j__km1_2), \ + &(grid_dv->vv_ip1j__k___2), \ + &(grid_dv->vv_im1j__k___2), \ + &(grid_dv->vv_i__jp1k___2), \ + &(grid_dv->vv_i__jm1k___2), \ + &(grid_dv->vv_ip2j__k___2), \ + &(grid_dv->vv_im2j__k___2), \ + &(grid_dv->vv_i__jp2k___2), \ + &(grid_dv->vv_i__jm2k___2), \ + &(grid_dv->vv_i__j__kp2_2), \ + &(grid_dv->vv_i__j__km2_2), \ + &(grid_dv->vv_fac_a_2), \ + &(grid_dv->vv_fac_b_2), \ + &(grid_dv->vv_fac_c_2), \ + &(grid_dv->vv_fac_f_2), \ + &(grid_dv->vv_T0v_2), \ + &(grid_dv->vv_T0r_2), \ + &(grid_dv->vv_T0t_2), \ + &(grid_dv->vv_T0p_2), \ + &(grid_dv->vv_fun_2), \ + &(grid_dv->vv_change_2), \ + &(grid_dv->tau), \ + &(grid_dv->loc_I_host), \ + &(grid_dv->loc_J_host), \ + &(grid_dv->loc_K_host), \ + &(grid_dv->dr_host), \ + &(grid_dv->dt_host), \ + &(grid_dv->dp_host), \ + &n_nodes_this_level, \ + &i_node_offset \ + }; + print_CUDA_error_if_any(cudaLaunchKernel((void*) cuda_do_sweep_level_kernel_3rd, grid_each, threads_each, kernelArgs, 0, grid_dv->level_streams[id_stream]), 30001); + + } else if (iswp == 3){ + void* kernelArgs[]{\ + &(grid_dv->vv_i__j__k___3), \ + &(grid_dv->vv_ip1j__k___3), \ + &(grid_dv->vv_im1j__k___3), \ + &(grid_dv->vv_i__jp1k___3), \ + &(grid_dv->vv_i__jm1k___3), \ + &(grid_dv->vv_i__j__kp1_3), \ + &(grid_dv->vv_i__j__km1_3), \ + &(grid_dv->vv_ip2j__k___3), \ + &(grid_dv->vv_im2j__k___3), \ + &(grid_dv->vv_i__jp2k___3), \ + &(grid_dv->vv_i__jm2k___3), \ + &(grid_dv->vv_i__j__kp2_3), \ + &(grid_dv->vv_i__j__km2_3), \ + &(grid_dv->vv_fac_a_3), \ + &(grid_dv->vv_fac_b_3), \ + &(grid_dv->vv_fac_c_3), \ + &(grid_dv->vv_fac_f_3), \ + &(grid_dv->vv_T0v_3), \ + &(grid_dv->vv_T0r_3), \ + &(grid_dv->vv_T0t_3), \ + &(grid_dv->vv_T0p_3), \ + &(grid_dv->vv_fun_3), \ + &(grid_dv->vv_change_3), \ + &(grid_dv->tau), \ + &(grid_dv->loc_I_host), \ + &(grid_dv->loc_J_host), \ + &(grid_dv->loc_K_host), \ + &(grid_dv->dr_host), \ + &(grid_dv->dt_host), \ + &(grid_dv->dp_host), \ + &n_nodes_this_level, \ + &i_node_offset \ + }; + print_CUDA_error_if_any(cudaLaunchKernel((void*) cuda_do_sweep_level_kernel_3rd, grid_each, threads_each, kernelArgs, 0, grid_dv->level_streams[id_stream]), 30001); + + } else if (iswp == 4){ + void* kernelArgs[]{\ + &(grid_dv->vv_i__j__k___4), \ + &(grid_dv->vv_ip1j__k___4), \ + &(grid_dv->vv_im1j__k___4), \ + &(grid_dv->vv_i__jp1k___4), \ + &(grid_dv->vv_i__jm1k___4), \ + &(grid_dv->vv_i__j__kp1_4), \ + &(grid_dv->vv_i__j__km1_4), \ + &(grid_dv->vv_ip2j__k___4), \ + &(grid_dv->vv_im2j__k___4), \ + &(grid_dv->vv_i__jp2k___4), \ + &(grid_dv->vv_i__jm2k___4), \ + &(grid_dv->vv_i__j__kp2_4), \ + &(grid_dv->vv_i__j__km2_4), \ + &(grid_dv->vv_fac_a_4), \ + &(grid_dv->vv_fac_b_4), \ + &(grid_dv->vv_fac_c_4), \ + &(grid_dv->vv_fac_f_4), \ + &(grid_dv->vv_T0v_4), \ + &(grid_dv->vv_T0r_4), \ + &(grid_dv->vv_T0t_4), \ + &(grid_dv->vv_T0p_4), \ + &(grid_dv->vv_fun_4), \ + &(grid_dv->vv_change_4), \ + &(grid_dv->tau), \ + &(grid_dv->loc_I_host), \ + &(grid_dv->loc_J_host), \ + &(grid_dv->loc_K_host), \ + &(grid_dv->dr_host), \ + &(grid_dv->dt_host), \ + &(grid_dv->dp_host), \ + &n_nodes_this_level, \ + &i_node_offset \ + }; + print_CUDA_error_if_any(cudaLaunchKernel((void*) cuda_do_sweep_level_kernel_3rd, grid_each, threads_each, kernelArgs, 0, grid_dv->level_streams[id_stream]), 30001); + + } else if (iswp == 5) { + void* kernelArgs[]{\ + &(grid_dv->vv_i__j__k___5), \ + &(grid_dv->vv_ip1j__k___5), \ + &(grid_dv->vv_im1j__k___5), \ + &(grid_dv->vv_i__jp1k___5), \ + &(grid_dv->vv_i__jm1k___5), \ + &(grid_dv->vv_i__j__kp1_5), \ + &(grid_dv->vv_i__j__km1_5), \ + &(grid_dv->vv_ip2j__k___5), \ + &(grid_dv->vv_im2j__k___5), \ + &(grid_dv->vv_i__jp2k___5), \ + &(grid_dv->vv_i__jm2k___5), \ + &(grid_dv->vv_i__j__kp2_5), \ + &(grid_dv->vv_i__j__km2_5), \ + &(grid_dv->vv_fac_a_5), \ + &(grid_dv->vv_fac_b_5), \ + &(grid_dv->vv_fac_c_5), \ + &(grid_dv->vv_fac_f_5), \ + &(grid_dv->vv_T0v_5), \ + &(grid_dv->vv_T0r_5), \ + &(grid_dv->vv_T0t_5), \ + &(grid_dv->vv_T0p_5), \ + &(grid_dv->vv_fun_5), \ + &(grid_dv->vv_change_5), \ + &(grid_dv->tau), \ + &(grid_dv->loc_I_host), \ + &(grid_dv->loc_J_host), \ + &(grid_dv->loc_K_host), \ + &(grid_dv->dr_host), \ + &(grid_dv->dt_host), \ + &(grid_dv->dp_host), \ + &n_nodes_this_level, \ + &i_node_offset \ + }; + print_CUDA_error_if_any(cudaLaunchKernel((void*) cuda_do_sweep_level_kernel_3rd, grid_each, threads_each, kernelArgs, 0, grid_dv->level_streams[id_stream]), 30001); + + } else if (iswp == 6) { + void* kernelArgs[]{\ + &(grid_dv->vv_i__j__k___6), \ + &(grid_dv->vv_ip1j__k___6), \ + &(grid_dv->vv_im1j__k___6), \ + &(grid_dv->vv_i__jp1k___6), \ + &(grid_dv->vv_i__jm1k___6), \ + &(grid_dv->vv_i__j__kp1_6), \ + &(grid_dv->vv_i__j__km1_6), \ + &(grid_dv->vv_ip2j__k___6), \ + &(grid_dv->vv_im2j__k___6), \ + &(grid_dv->vv_i__jp2k___6), \ + &(grid_dv->vv_i__jm2k___6), \ + &(grid_dv->vv_i__j__kp2_6), \ + &(grid_dv->vv_i__j__km2_6), \ + &(grid_dv->vv_fac_a_6), \ + &(grid_dv->vv_fac_b_6), \ + &(grid_dv->vv_fac_c_6), \ + &(grid_dv->vv_fac_f_6), \ + &(grid_dv->vv_T0v_6), \ + &(grid_dv->vv_T0r_6), \ + &(grid_dv->vv_T0t_6), \ + &(grid_dv->vv_T0p_6), \ + &(grid_dv->vv_fun_6), \ + &(grid_dv->vv_change_6), \ + &(grid_dv->tau), \ + &(grid_dv->loc_I_host), \ + &(grid_dv->loc_J_host), \ + &(grid_dv->loc_K_host), \ + &(grid_dv->dr_host), \ + &(grid_dv->dt_host), \ + &(grid_dv->dp_host), \ + &n_nodes_this_level, \ + &i_node_offset \ + }; + print_CUDA_error_if_any(cudaLaunchKernel((void*) cuda_do_sweep_level_kernel_3rd, grid_each, threads_each, kernelArgs, 0, grid_dv->level_streams[id_stream]), 30001); + + } else { + void* kernelArgs[]{\ + &(grid_dv->vv_i__j__k___7), \ + &(grid_dv->vv_ip1j__k___7), \ + &(grid_dv->vv_im1j__k___7), \ + &(grid_dv->vv_i__jp1k___7), \ + &(grid_dv->vv_i__jm1k___7), \ + &(grid_dv->vv_i__j__kp1_7), \ + &(grid_dv->vv_i__j__km1_7), \ + &(grid_dv->vv_ip2j__k___7), \ + &(grid_dv->vv_im2j__k___7), \ + &(grid_dv->vv_i__jp2k___7), \ + &(grid_dv->vv_i__jm2k___7), \ + &(grid_dv->vv_i__j__kp2_7), \ + &(grid_dv->vv_i__j__km2_7), \ + &(grid_dv->vv_fac_a_7), \ + &(grid_dv->vv_fac_b_7), \ + &(grid_dv->vv_fac_c_7), \ + &(grid_dv->vv_fac_f_7), \ + &(grid_dv->vv_T0v_7), \ + &(grid_dv->vv_T0r_7), \ + &(grid_dv->vv_T0t_7), \ + &(grid_dv->vv_T0p_7), \ + &(grid_dv->vv_fun_7), \ + &(grid_dv->vv_change_7), \ + &(grid_dv->tau), \ + &(grid_dv->loc_I_host), \ + &(grid_dv->loc_J_host), \ + &(grid_dv->loc_K_host), \ + &(grid_dv->dr_host), \ + &(grid_dv->dt_host), \ + &(grid_dv->dp_host), \ + &n_nodes_this_level, \ + &i_node_offset \ + }; + print_CUDA_error_if_any(cudaLaunchKernel((void*) cuda_do_sweep_level_kernel_3rd, grid_each, threads_each, kernelArgs, 0, grid_dv->level_streams[id_stream]), 30001); + + } + } else { // 1st order + if (iswp == 0){ + void* kernelArgs[]{\ + &(grid_dv->vv_i__j__k___0), \ + &(grid_dv->vv_ip1j__k___0), \ + &(grid_dv->vv_im1j__k___0), \ + &(grid_dv->vv_i__jp1k___0), \ + &(grid_dv->vv_i__jm1k___0), \ + &(grid_dv->vv_i__j__kp1_0), \ + &(grid_dv->vv_i__j__km1_0), \ + &(grid_dv->vv_fac_a_0), \ + &(grid_dv->vv_fac_b_0), \ + &(grid_dv->vv_fac_c_0), \ + &(grid_dv->vv_fac_f_0), \ + &(grid_dv->vv_T0v_0), \ + &(grid_dv->vv_T0r_0), \ + &(grid_dv->vv_T0t_0), \ + &(grid_dv->vv_T0p_0), \ + &(grid_dv->vv_fun_0), \ + &(grid_dv->vv_change_0), \ + &(grid_dv->tau), \ + &(grid_dv->loc_I_host), \ + &(grid_dv->loc_J_host), \ + &(grid_dv->loc_K_host), \ + &(grid_dv->dr_host), \ + &(grid_dv->dt_host), \ + &(grid_dv->dp_host), \ + &n_nodes_this_level, \ + &i_node_offset \ + }; + print_CUDA_error_if_any(cudaLaunchKernel((void*) cuda_do_sweep_level_kernel_1st, grid_each, threads_each, kernelArgs, 0, grid_dv->level_streams[id_stream]), 30000); + + } else if (iswp == 1){ + void* kernelArgs[]{\ + &(grid_dv->vv_i__j__k___1), \ + &(grid_dv->vv_i__jp1k___1), \ + &(grid_dv->vv_i__jm1k___1), \ + &(grid_dv->vv_i__j__kp1_1), \ + &(grid_dv->vv_i__j__km1_1), \ + &(grid_dv->vv_ip1j__k___1), \ + &(grid_dv->vv_im1j__k___1), \ + &(grid_dv->vv_fac_a_1), \ + &(grid_dv->vv_fac_b_1), \ + &(grid_dv->vv_fac_c_1), \ + &(grid_dv->vv_fac_f_1), \ + &(grid_dv->vv_T0v_1), \ + &(grid_dv->vv_T0r_1), \ + &(grid_dv->vv_T0t_1), \ + &(grid_dv->vv_T0p_1), \ + &(grid_dv->vv_fun_1), \ + &(grid_dv->vv_change_1), \ + &(grid_dv->tau), \ + &(grid_dv->loc_I_host), \ + &(grid_dv->loc_J_host), \ + &(grid_dv->loc_K_host), \ + &(grid_dv->dr_host), \ + &(grid_dv->dt_host), \ + &(grid_dv->dp_host), \ + &n_nodes_this_level, \ + &i_node_offset \ + }; + print_CUDA_error_if_any(cudaLaunchKernel((void*) cuda_do_sweep_level_kernel_1st, grid_each, threads_each, kernelArgs, 0, grid_dv->level_streams[id_stream]), 30001); + + } else if (iswp == 2){ + void* kernelArgs[]{\ + &(grid_dv->vv_i__j__k___2), \ + &(grid_dv->vv_i__j__kp1_2), \ + &(grid_dv->vv_i__j__km1_2), \ + &(grid_dv->vv_ip1j__k___2), \ + &(grid_dv->vv_im1j__k___2), \ + &(grid_dv->vv_i__jp1k___2), \ + &(grid_dv->vv_i__jm1k___2), \ + &(grid_dv->vv_fac_a_2), \ + &(grid_dv->vv_fac_b_2), \ + &(grid_dv->vv_fac_c_2), \ + &(grid_dv->vv_fac_f_2), \ + &(grid_dv->vv_T0v_2), \ + &(grid_dv->vv_T0r_2), \ + &(grid_dv->vv_T0t_2), \ + &(grid_dv->vv_T0p_2), \ + &(grid_dv->vv_fun_2), \ + &(grid_dv->vv_change_2), \ + &(grid_dv->tau), \ + &(grid_dv->loc_I_host), \ + &(grid_dv->loc_J_host), \ + &(grid_dv->loc_K_host), \ + &(grid_dv->dr_host), \ + &(grid_dv->dt_host), \ + &(grid_dv->dp_host), \ + &n_nodes_this_level, \ + &i_node_offset \ + }; + print_CUDA_error_if_any(cudaLaunchKernel((void*) cuda_do_sweep_level_kernel_1st, grid_each, threads_each, kernelArgs, 0, grid_dv->level_streams[id_stream]), 30002); + + } else if (iswp == 3){ + void* kernelArgs[]{\ + &(grid_dv->vv_i__j__k___3), \ + &(grid_dv->vv_ip1j__k___3), \ + &(grid_dv->vv_im1j__k___3), \ + &(grid_dv->vv_i__jp1k___3), \ + &(grid_dv->vv_i__jm1k___3), \ + &(grid_dv->vv_i__j__kp1_3), \ + &(grid_dv->vv_i__j__km1_3), \ + &(grid_dv->vv_fac_a_3), \ + &(grid_dv->vv_fac_b_3), \ + &(grid_dv->vv_fac_c_3), \ + &(grid_dv->vv_fac_f_3), \ + &(grid_dv->vv_T0v_3), \ + &(grid_dv->vv_T0r_3), \ + &(grid_dv->vv_T0t_3), \ + &(grid_dv->vv_T0p_3), \ + &(grid_dv->vv_fun_3), \ + &(grid_dv->vv_change_3), \ + &(grid_dv->tau), \ + &(grid_dv->loc_I_host), \ + &(grid_dv->loc_J_host), \ + &(grid_dv->loc_K_host), \ + &(grid_dv->dr_host), \ + &(grid_dv->dt_host), \ + &(grid_dv->dp_host), \ + &n_nodes_this_level, \ + &i_node_offset \ + }; + print_CUDA_error_if_any(cudaLaunchKernel((void*) cuda_do_sweep_level_kernel_1st, grid_each, threads_each, kernelArgs, 0, grid_dv->level_streams[id_stream]), 30003); + + } else if (iswp == 4){ + void* kernelArgs[]{\ + &(grid_dv->vv_i__j__k___4), \ + &(grid_dv->vv_ip1j__k___4), \ + &(grid_dv->vv_im1j__k___4), \ + &(grid_dv->vv_i__jp1k___4), \ + &(grid_dv->vv_i__jm1k___4), \ + &(grid_dv->vv_i__j__kp1_4), \ + &(grid_dv->vv_i__j__km1_4), \ + &(grid_dv->vv_fac_a_4), \ + &(grid_dv->vv_fac_b_4), \ + &(grid_dv->vv_fac_c_4), \ + &(grid_dv->vv_fac_f_4), \ + &(grid_dv->vv_T0v_4), \ + &(grid_dv->vv_T0r_4), \ + &(grid_dv->vv_T0t_4), \ + &(grid_dv->vv_T0p_4), \ + &(grid_dv->vv_fun_4), \ + &(grid_dv->vv_change_4), \ + &(grid_dv->tau), \ + &(grid_dv->loc_I_host), \ + &(grid_dv->loc_J_host), \ + &(grid_dv->loc_K_host), \ + &(grid_dv->dr_host), \ + &(grid_dv->dt_host), \ + &(grid_dv->dp_host), \ + &n_nodes_this_level, \ + &i_node_offset \ + }; + print_CUDA_error_if_any(cudaLaunchKernel((void*) cuda_do_sweep_level_kernel_1st, grid_each, threads_each, kernelArgs, 0, grid_dv->level_streams[id_stream]), 30004); + + } else if (iswp == 5) { + void* kernelArgs[]{\ + &(grid_dv->vv_i__j__k___5), \ + &(grid_dv->vv_ip1j__k___5), \ + &(grid_dv->vv_im1j__k___5), \ + &(grid_dv->vv_i__jp1k___5), \ + &(grid_dv->vv_i__jm1k___5), \ + &(grid_dv->vv_i__j__kp1_5), \ + &(grid_dv->vv_i__j__km1_5), \ + &(grid_dv->vv_fac_a_5), \ + &(grid_dv->vv_fac_b_5), \ + &(grid_dv->vv_fac_c_5), \ + &(grid_dv->vv_fac_f_5), \ + &(grid_dv->vv_T0v_5), \ + &(grid_dv->vv_T0r_5), \ + &(grid_dv->vv_T0t_5), \ + &(grid_dv->vv_T0p_5), \ + &(grid_dv->vv_fun_5), \ + &(grid_dv->vv_change_5), \ + &(grid_dv->tau), \ + &(grid_dv->loc_I_host), \ + &(grid_dv->loc_J_host), \ + &(grid_dv->loc_K_host), \ + &(grid_dv->dr_host), \ + &(grid_dv->dt_host), \ + &(grid_dv->dp_host), \ + &n_nodes_this_level, \ + &i_node_offset \ + }; + print_CUDA_error_if_any(cudaLaunchKernel((void*) cuda_do_sweep_level_kernel_1st, grid_each, threads_each, kernelArgs, 0, grid_dv->level_streams[id_stream]), 30005); + + } else if (iswp == 6) { + void* kernelArgs[]{\ + &(grid_dv->vv_i__j__k___6), \ + &(grid_dv->vv_ip1j__k___6), \ + &(grid_dv->vv_im1j__k___6), \ + &(grid_dv->vv_i__jp1k___6), \ + &(grid_dv->vv_i__jm1k___6), \ + &(grid_dv->vv_i__j__kp1_6), \ + &(grid_dv->vv_i__j__km1_6), \ + &(grid_dv->vv_fac_a_6), \ + &(grid_dv->vv_fac_b_6), \ + &(grid_dv->vv_fac_c_6), \ + &(grid_dv->vv_fac_f_6), \ + &(grid_dv->vv_T0v_6), \ + &(grid_dv->vv_T0r_6), \ + &(grid_dv->vv_T0t_6), \ + &(grid_dv->vv_T0p_6), \ + &(grid_dv->vv_fun_6), \ + &(grid_dv->vv_change_6), \ + &(grid_dv->tau), \ + &(grid_dv->loc_I_host), \ + &(grid_dv->loc_J_host), \ + &(grid_dv->loc_K_host), \ + &(grid_dv->dr_host), \ + &(grid_dv->dt_host), \ + &(grid_dv->dp_host), \ + &n_nodes_this_level, \ + &i_node_offset \ + }; + print_CUDA_error_if_any(cudaLaunchKernel((void*) cuda_do_sweep_level_kernel_1st, grid_each, threads_each, kernelArgs, 0, grid_dv->level_streams[id_stream]), 30006); + + + } else { + void* kernelArgs[]{\ + &(grid_dv->vv_i__j__k___7), \ + &(grid_dv->vv_ip1j__k___7), \ + &(grid_dv->vv_im1j__k___7), \ + &(grid_dv->vv_i__jp1k___7), \ + &(grid_dv->vv_i__jm1k___7), \ + &(grid_dv->vv_i__j__kp1_7), \ + &(grid_dv->vv_i__j__km1_7), \ + &(grid_dv->vv_fac_a_7 ), \ + &(grid_dv->vv_fac_b_7 ), \ + &(grid_dv->vv_fac_c_7 ), \ + &(grid_dv->vv_fac_f_7 ), \ + &(grid_dv->vv_T0v_7 ), \ + &(grid_dv->vv_T0r_7 ), \ + &(grid_dv->vv_T0t_7 ), \ + &(grid_dv->vv_T0p_7 ), \ + &(grid_dv->vv_fun_7 ), \ + &(grid_dv->vv_change_7 ), \ + &(grid_dv->tau), \ + &(grid_dv->loc_I_host), \ + &(grid_dv->loc_J_host), \ + &(grid_dv->loc_K_host), \ + &(grid_dv->dr_host), \ + &(grid_dv->dt_host), \ + &(grid_dv->dp_host), \ + &n_nodes_this_level, \ + &i_node_offset \ + }; + + print_CUDA_error_if_any(cudaLaunchKernel((void*) cuda_do_sweep_level_kernel_1st, grid_each, threads_each, kernelArgs, 0, grid_dv->level_streams[id_stream]), 30007); + + } + } + + // synchronize all streams + //print_CUDA_error_if_any(cudaStreamSynchronize(grid_dv->level_streams[id_stream]), 30008); +} + + +// this function calculate all levels of one single sweep direction +void cuda_run_iteration_forward(Grid_on_device* grid_dv, int const& iswp){ + + initialize_sweep_params(grid_dv); + + int block_size = CUDA_SWEEPING_BLOCK_SIZE; + int num_blocks_x, num_blocks_y; + int i_node_offset=0; + //get_block_xy(ceil(grid_dv->n_nodes_max_host/block_size+0.5), &num_blocks_x, &num_blocks_y); + //dim3 grid_each(num_blocks_x, num_blocks_y); + //dim3 threads_each(block_size, 1, 1); + + for (size_t i_level = 0; i_level < grid_dv->n_levels_host; i_level++){ + get_block_xy(ceil(grid_dv->n_nodes_on_levels_host[i_level]/block_size+0.5), &num_blocks_x, &num_blocks_y); + dim3 grid_each(num_blocks_x, num_blocks_y); + dim3 threads_each(block_size, 1, 1); + + run_kernel(grid_dv, iswp, i_node_offset, i_level, grid_each, threads_each, grid_dv->n_nodes_on_levels_host[i_level]); + //run_kernel(grid_dv, iswp, i_node_offset, i_level, grid_dv->grid_sweep_host, grid_dv->threads_sweep_host, grid_dv->n_nodes_on_levels_host[i_level]); + + i_node_offset += grid_dv->n_nodes_on_levels_host[i_level]; + } + + finalize_sweep_params(grid_dv); + + // check memory leak + //print_memory_usage(); + +} \ No newline at end of file diff --git a/cuda/iterator_wrapper.cuh b/cuda/iterator_wrapper.cuh new file mode 100644 index 0000000..0da743f --- /dev/null +++ b/cuda/iterator_wrapper.cuh @@ -0,0 +1,27 @@ +#ifndef ITERATOR_WRAPPER_CUH +#define ITERATOR_WRAPPER_CUH + +#include +#include +#include + +#include +#include +#include + +#include +#include "grid_wrapper.cuh" +#include "cuda_utils.cuh" + + +//void cuda_do_sweep_level_kernel_3rd(); +//void cuda_do_sweep_level_kernel_1st(); + +void run_kernel(Grid_on_device*, int const&, int const&, int const&, dim3&, dim3&, int const&); + +void initialize_sweep_params(Grid_on_device*); +void finalize_sweep_params(Grid_on_device*); +void cuda_run_iteration_forward(Grid_on_device*, int const&); + + +#endif // ITERATOR_WRAPPER_CUH \ No newline at end of file diff --git a/debug_mpi.sh b/debug_mpi.sh new file mode 100755 index 0000000..6d544c6 --- /dev/null +++ b/debug_mpi.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +# general mpi debugging + +# instantly start the debugger +#mpirun --oversubscribe -np $1 xterm -e gdb -ex run --args ../../build/bin/TOMOATT -v -i $2 +# for break point insertion +mpirun --oversubscribe -np $1 xterm -e gdb --args ../../build/bin/TOMOATT -v -i $2 +# tui mode +#mpirun --oversubscribe -np $1 xterm -e gdb --tui --args ../../build/bin/TOMOATT -i $2 + + +# valgrind memory leak check +#mpirun --oversubscribe -np $1 valgrind --log-file="log_val" --leak-check=yes --track-origins=yes ../../build/bin/TOMOATT -i $2 + +# cuda debug +#mpirun --oversubscribe -np $1 xterm -e cuda-gdb -ex run --args ../../build/bin/TOMOATT $2 +# nvprof +#nvprof mpirun --oversubscribe -np 1 ../../build/bin/TOMOATT $2 diff --git a/docs/.DS_Store b/docs/.DS_Store new file mode 100644 index 0000000..81cac2b Binary files /dev/null and b/docs/.DS_Store differ diff --git a/docs/logo/TomoATT_logo.png b/docs/logo/TomoATT_logo.png new file mode 100644 index 0000000..2ced40f Binary files /dev/null and b/docs/logo/TomoATT_logo.png differ diff --git a/docs/logo/TomoATT_logo.svg b/docs/logo/TomoATT_logo.svg new file mode 100644 index 0000000..7e581f0 --- /dev/null +++ b/docs/logo/TomoATT_logo.svg @@ -0,0 +1,433 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TomoATT + + diff --git a/docs/logo/TomoATT_logo_2.png b/docs/logo/TomoATT_logo_2.png new file mode 100644 index 0000000..af691be Binary files /dev/null and b/docs/logo/TomoATT_logo_2.png differ diff --git a/docs/logo/TomoATT_logo_only_cube.png b/docs/logo/TomoATT_logo_only_cube.png new file mode 100644 index 0000000..eb08b61 Binary files /dev/null and b/docs/logo/TomoATT_logo_only_cube.png differ diff --git a/docs/manual/index.md b/docs/manual/index.md new file mode 100644 index 0000000..635fa90 --- /dev/null +++ b/docs/manual/index.md @@ -0,0 +1,277 @@ +# TomoATT User Manual version 1.0 + +## Introduction + +TomoATT is a library which implements an eikonal equation solver based Adjoint-state Travel-Time Tomography for a very large-scale computation, following a published article [Ping Tong (2021)](https://doi.org/10.1029/2021JB021818) and [Jing Chen (2022)](add_here_when_published). +The slowness field and anisotropy fields are computed in spherical coordinate system. + +Thanks to the efficiency of an eikonal equation solver, the computation of the travel-time is very fast and requires less amount of computational resources. +As an input data for TomoATT is travel times at seismic stations, we can easily prepare a great amount of input data for the computation. + +This library is developped to be used for modeling a very-large domain. For this purpose, 3-layer parallelization is applied, which are: +- layer 1: simulutaneous run parallelization (travel times for multiple seismic sources may be calculated simultaneously) +- layer 2: subdomain decomposition (If the number of computational nodes requires too large memory, we can separate the domain into subdomains and run each subdomain in a separate compute node) +- layer 3: sweeping parallelization (in each subdomain, sweeping layers are also parallelized) + +The details of the parallelization method applied in this library are described in the paper [Miles Detrixhe and Frédéric Gibou (2016)](https://doi.org/10.1016/j.jcp.2016.06.023). + +Regional events (sources within the global domain) and teleseismic events (sources outside the global domain) may be used for inversion. + +--- + +## Input files + +TomoATT requires 3 input files : +1. input parameter file (setup file for simulation parameters) +2. source receiver file (source and receiver definitions and observation arrival times) +3. initial model file (3d initial model) + + +### 1. input parameter file + +All the necessary parameters for setuping a calculation are described in input parameter file in [yaml format](https://en.wikipedia.org/wiki/YAML). + +Below is an example of input parameter file for making a forward simulation. + +``` yaml +version : 2 + +domain : + min_max_dep : [5740.6370,5790.6370] # depth in km + min_max_lat : [45.0,55.0] # latitude in degree + min_max_lon : [35.0,45.0] # longitude in degree + n_rtp : [40,40,40] # number of nodes + +source : + src_rec_file : 'src_rec_test.dat' # source receiver file + +model : + init_model_path : './test_model_init.h5' # path to initial model file + +inversion : + run_mode : 0 # 0 for forward simulation only, 1 for inversion + +parallel : + n_sims : 1 # number of simultaneous run + ndiv_rtp : [2,2,1] # number of subdomains + nproc_sub : 1 # number of subprocess used for each subdomain + +calculation : + convergence_tolerance : 1e-6 + max_iterations : 100 + stencil_order : 3 # 1 or 3 + sweep_type : 1 # 0: legacy, 1: cuthill-mckee with shm parallelization + +output_setting : + # output the calculated field of all sources. 1 for yes; 0 for no; default: 1 + is_output_source_field : 0 + # output internal parameters, if no, only model parameters are out. 1 for yes; 0 for no; default: 0 + is_verbose_output : 0 + # output model_parameters_inv_0000.dat or not. 1 for yes; 0 for no; default: 1 + is_output_model_dat : 0 + +``` + +There are categories and sub-categories with setup parameters. +Below is the explanation of each category and sub-category. +If a category tag or sub-category tag is missing from the input parameter file, the default value will be used. + +#### domain : +The domain category is for setting a global domain of the simulation. +- `min_max_dep` : `[dep1, dep2]` minimum and maximum depth of the domain in kilo meter +- `min_max_lat` : `[lat1, lat2]` minimum and maximum latitude in degree +- `min_max_lon` : `[lon1, lon2]` minimum and maximum longitude in degree +- `n_rtp` : `[nr, nt, np]` number of computation nodes for r (depth),t (latitude) and p (longitude) direction + +#### source : +Source category is used for setting about source and receiver definitions. +- `src_rec_file` : for specifying a path to a source receiver file (details of this file is in the following section). The calculated travel time at receivers will be output as a new source receiver file in OUTPUT_FILES directory. +- `swap_src_rec` : `0` or `1`. Set 1 for using receivers as sources, which reduces computation time when the number of sources are larger than the number of receivers. (usual when using a large dataset.) + +#### model : +- `init_model_path` : File path for 3D initial model file. Details will be explained in the following section. +- `model_1d_name` : the name of 1d model used for teleseismic tomography. `ak135` and `iasp91` are available. User defined model can be used by modifying the file `1d_models.h` in `include` directory, by changing `model_1d_prem` part and setting this `model_1d_name` parameter as `user_defined`. +#### inversion : +- `run_mode` : + - `0` for running only a forward simulation. + - `1` for do inversion. + - `2` for only precalculation of 2d traveltime field for teleseismic sources. This is an optional step for teleseismic case. If 2d traveltime field is not precalculated, it will be calculated during mode `0` or `1`. This is useful for calculations on HPC as 2d eikonal solver has not been parallelized. Users can run it on a local machine beforehand to reduce CPU time on HPC. + - `3` run earthquake relocation. For using this mode, `sources : swap_src_rec` need to be set to 1. Otherwise the program will exit with an error message. +- `n_inversion_grid` : the number of inversion grid. +- `n_inv_dep_lat_lon` : the numbers of inversion grids for r, t and p direction. +- `min_max_dep_inv` : `[dep1, dep2]` minimum and maximum depth of inversion grid in kilo meter. +- `min_max_lat_inv` : `[lat1, lat2]` minimum and maximum latitude of inversion grid in degree. +- `min_max_lon_inv` : `[lon1, lon2]` minimum and maximum longitude of inversion grid in degree. + +Currently, TomoATT provide two ways for defining the inversion grid. One is a regular grid (even intervals for all axis) type and another uses used defined intervals for each axis. + +For setting the user defined intervals, please use the flags below. +- `type_dep_inv` : `0` for regular grid (default), `1` for user defined intervals. +- `type_lat_inv` : `0` for regular grid (default), `1` for user defined intervals. +- `type_lon_inv` : `0` for regular grid (default), `1` for user defined intervals. + +and the coordinates where the main inversion grids are placed, +- `dep_inv` : `[z1,z2,z3,...]` for user defined intervals. +- `lat_inv` : `[y1,y2,y3,...]` for user defined intervals. +- `lon_inv` : `[x1,x2,x3,...]` for user defined intervals. + +other parameers for inversion seetting. +- `max_iterations_inv` : The limit of iteration number for inversion. +- `step_size` : Maximum step size ratio for updating model. +- `smooth_method` : `0` or `1`. 0 for multigrid parametrization ([Ping Tong 2019](https://doi.org/10.1093/gji/ggz151)). 1 for laplacian smoothing with CG method. +- `l_smooth_rtp` : `[lr, lt, lp]` smoothing coefficients for laplacian smoothing on r,t and p direction. +- `optim_method` : `0`, `1` or `2`. 0 for gradient descent, 1 for gradient descent with halve-stepping, 2 for L-BFGS (THIS MODE IS EXPERIMENTAL AND CURRENTLY NOT WORKING.). +- `regularization_weight`: regularization weight, USED ONLY L-BFGS mode. +- `max_sub_iterations` : maximum number of sub iteration. Used for optim_method 1 and 2. + +#### parallel : +- `n_sims` : number of simulutaneous run +- `ndiv_rtp` : `[ndiv_r, ndiv_t, ndiv_p]` number of domain decomposition on r, t and p direction +- `nproc_sub` : number of processes used for sweeping parallelization +- `use_gpu` : `0` or `1`. Set 1 for using GPU. (Currently gpu mode is used only for a forward simulation. n_sims, ndiv_rtp and nproc_sub need to be 1.) + +The total number of mpi processes (i.e. mpirun -n NUMBER) must be n_sims\*ndiv_r\*ndiv_t\*ndiv_p\*nproc_sub, otherwise the code will stop instantly. + +#### calculation : +- `convergence_tolerance` : convergence criterion for forward and adjoint run. +- `max_iterations` : number of maximum iteration for forward and adjoint run +- `stencil_order` : `1` or `3`. The order of stencil for sweeping. +- `sweep_type` : `0`or `1`. 0 is for sweeping in legacy order (threefold loops on r,t and p), 1 for cuthill-mckee node ordering with sweeping parallelization. +- `output_file_format` : `0` or `1` for selecting input and output file format. `0` is for HDF5 format, `1` is for ASCII format. + +#### output_setting : +- `is_output_source_field` : `0`(no) or `1`(yes). if output the calculated field of all sources. +- `is_verbose_output` : `0` or `1`. if output internal parameters, if no, only model parameters are out. +- `is_output_model_dat` : `0` or `1`. if output model_parameters_inv_0000.dat or not. + + +### 2. source receiver file +Source receiver file is a file which defines source and receiver positions and arrival times. + +Below is an example: +``` +1 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- source 1 +1 1 PCBI 1.8900 98.9253 1000.0000 P 18.000 <- receiver 1 +1 2 MRPI 1.6125 99.3172 1100.0000 P 19.400 <- receiver 2 +1 3 HUTI 2.3153 98.9711 1600.0000 P 19.200 + .... + +``` + +``` +Source line : id_src year month day hour min sec lat lon dep_km magnitude num_recs id_event (weight) +Receiver line : id_src id_rec name_rec lat lon elevation_m phase arrival_time_sec (weight) +``` + +`num_recs` (number of receivers for this source) need to be the same with the number of receiver lines. +The last column of both source and receiver line is for put weight (on objective function). These are the optional column and set to be 1.0 if not written. +`name_rec` need to be different for each station. +`lon` and `lat` are in degree. + +If the source position is out of the global domain (defined in input parameter file.), the code will flag this event as a teleseismic event and run the dedicated routine for teleseimic event. For teleseismic event, swap_src_rec will be ignored for this event (as the teleseismic case, a source is not a point but boundary surfaces). + + +### 3. initial model file + +Initial model file is used for defining parameters of input mode. +Necessary parameters are `vel` (velocity), `eta`, `xi`, `zeta`. + +#### inital model file in HDF5 format + +In HDF5 I/O mode (`output_file_format`: 0 in input parameter file), all the necessary parameters should be saved in one single `.h5` file, with exactly the same name of dataset with parameter name written above. +The dimension of dataset should be the same with `n_rtp` in input parameter file. +Please refer the `examples/inversion_small/make_test_model.py` for details. + + +#### initial model file in ASCII format + +In ASCII I/O mode (`output_file_format`: 1 in input parameter file), all the necessary parameters should be save in one single ASCII file. +The number of rows in the file need to be equivalent with the number of global nodes (i.e. n_rtp[0]\*n_rtp[1]\*n_rtp[2]). + +The node order should be: +```python + # write nodes in rtp + for ir in range(n_rtp[0]): # number of nodes on r direction + for it in range(n_rtp[1]): # number of nodes on t direction + for ip in range(n_rtp[2]): # number of nodes on p direction + # write out parameters + # eta xi zeta fun fac_a fac_b fac_c fac_f + +``` + +Complete example may be found `examples/inversion_small_ASCII/make_test_model.py`. + +--- + +## Output files + +Calculated travel times at the stations will be writen in `(source receiver file)_out.dat` on the column for travel times. + +Volumetric result data files are saved in OUTPUT_FILES directory. + +As the node order in the output file is not in the global domain but each subdomains, it is necessary to do a small post-processing for extracting slices. +`utils/tomoatt_data_retrieval.py` includes functions for this post processing. +Please refer the concrete example in `inversion_small/data_post_process.py` for HDF5 mode, and `inversion_small_ASCII/data_post_process.py` for ASCII mode. + +Only the final iteration result will be saved in 3D matrix form as `final_model.h5` or `final_model.dat`, thus it is not necessary to do post-processing for the final result. + + +### HDF5 I/O mode +In HDF5 mode, the code will carry out collective writing from all MPI processes into one single output file, which will try to maximize the I/O bandwidth for efficient I/O. + +TomoATT produces output files like below: +- out_data_grid.h5 : grid coordinate and connectivity data +- out_data_sim.h5 : field data +- out_data_sim.xmf : XDMF index data for visualizing 3D data. This may be open by Paraview. +- final_model.h5 : final model parameters + +Travel time field for i-th source may be visualized by reading `OUTPUT_FILES/out_data_sim_i.xmf`. +All the inversed parameters from all the sources and receivers are saved in `out_data_sim_0.xmf`. + + +Internal composition of .h5 data may be indicated by `h5ls -r` command. +The composition of out_data_grid.h5 is : +``` +/ Group +/Mesh Group +/Mesh/elem_conn Dataset {21609, 9} # node connectivity used for visualization +/Mesh/node_coords_p Dataset {26010} # longitude [degree] +/Mesh/node_coords_r Dataset {26010} # radious [km] +/Mesh/node_coords_t Dataset {26010} # latiude [degree] +/Mesh/node_coords_x Dataset {26010} # xyz coordinate in WGS84 +/Mesh/node_coords_y Dataset {26010} +/Mesh/node_coords_z Dataset {26010} +/Mesh/procid Dataset {26010} # mpi processor id +``` + + +out_data_sim.h5 is : +``` +/model Group +/model/eta_inv_000j Dataset {25000} # eta at j-th inversion +/model/xi_inv_000j Dataset {25000} # xi +/model/vel_inv_000j Dataset {25000} # velocity field at j-th inversion +``` + +then final_model.h5 is : +``` +eta Dataset {10, 50, 50} +vel Dataset {10, 50, 50} +xi Dataset {10, 50, 50} +``` +The internal composition of the final_model.h5 is exactly the same with the initial model file. Thus it is possible to use the final model file as the initial model file for the next run by specifying `initial_model_file` in input parameter file. + +### ASCII I/O mode +In ASCII mode, code will be do independent writing, (i.e. each MPI process do I/O process sequencially) in a single output file. + +The files that TomoATT creates in OUPUT_FILES directory are : + +``` +out_grid_conn.dat # node connectivity +out_grid_ptr.dat # grid coordinate lon (degree), lat (degree), radius (km) +out_grid_xyz.dat # grid coordinate in WGS84 +eta_inv_000j.dat # eta +xi_inv_000j.dat # xi +vel_inv_000j.dat # velocity +``` + diff --git a/docs/manual/usage_on_HPCs.md b/docs/manual/usage_on_HPCs.md new file mode 100644 index 0000000..55a92f6 --- /dev/null +++ b/docs/manual/usage_on_HPCs.md @@ -0,0 +1,164 @@ +# commands for compiling and running on HPCs + +## Gekko @ NTU + +### 1. Load necessary modules and select GNU compilers +```bash +module purge && module load cmake gnu/gcc-9.3.0 +``` + +### 2. compiler openmpi and HDF5 with parallel option +`./install_mpi_and_hdf5_local.sh` +will create openmpi and hdf5 executables in external_libs/local_mpi_hdf5/bin + +### 3. Compile TomoATT +```bash +# make a build directory +mkdir build + +# compile TomoATT +cd build +CC=/usr/local/gcc-9.3.0/bin/gcc CXX=/usr/local/gcc-9.3.0/bin/g++ cmake .. -DCMAKE_PREFIX_PATH=$(pwd)/../external_libs/local_mpi_hdf5 + +make -j16 +``` + +Then the executable TOMOATT is created in the build directory. + + +## Fugaku @ RIKEN + + +### 0. start interactive job on Fugaku (for accessing arch64 environment) + +```bash +pjsub --interact -g hp220155 -L "node=1" -L "rscgrp=int" -L "elapse=1:00:00" --mpi "max-proc-per-node=12" --sparam "wait-time=600" -x PJM_LLIO_GFSCACHE=/vol0004 --no-check-directory +``` + + +### 1. Load necessary modules +```bash +# prepare spack env +. /vol0004/apps/oss/spack/share/spack/setup-env.sh +# load Fujitsu mpi +spack load /jfzaut5 +# or load gnu 11.2.0 +spack load /nphnrhl /cvur4ou +``` + + + +### 2. Download hdf5 source code and compile it +```bash + +# every file will be placed in external_libs +cd ./external_libs + +# make a local install pass +mkdir local_mpi_hdf5 + +# download hdf5 source +wget https://gamma.hdfgroup.org/ftp/pub/outgoing/hdf5/snapshots/v112/hdf5-1.12.2-1.tar.gz + +#Extract the downloaded directory +tar -xvf hdf5-1.12.2-1.tar.gz && cd hdf5-1.12.2-1 + +# Configure the code. (the pathes to mpicc, mpicxx should vary on the environment) +CC=mpifcc CFLAGS="-Nclang" CXX=mpiFCC CXXFLAGS="-Nclang" ./configure --enable-parallel --enable-unsupported --enable-shared --enable-cxx --prefix=$(pwd)/../local_mpi_hdf5 + +# make +make -j12 && make install + +# now hdf5 executables are in external_libs/local_mpi_hdf5/bin +``` + +or with gnu 11.2.0 +```bash + +# download hdf5 source +wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.13/hdf5-1.13.2/src/hdf5-1.13.2.tar.gz +#Extract the downloaded directory +tar -xvf hdf5-1.13.2.tar.gz +cd hdf5-1.13.2 +# Configure the code. (the pathes to mpicc, mpicxx should vary on the environment) +CC=mpicc CXX=mpic++ ./configure --enable-parallel --enable-unsupported --enable-shared --enable-cxx --prefix=$(pwd)/../local_mpi_hdf5 +# make +make -j12 && make install + +``` + + +### 3. Compile TomoATT +```bash +# cd to TomoATT directory +cd ../.. + +# make a build directory +mkdir build + +# compile TomoATT +cd build + +CC=mpifcc CXX=mpiFCC cmake .. -DCMAKE_PREFIX_PATH=$(pwd)/../external_libs/local_mpi_hdf5 +# or for gnu 11.2.0 +cmake .. -DCMAKE_PREFIX_PATH=$(pwd)/../external_libs/local_mpi_hdf5 + +make -j12 +``` + +### 4. terminalte interactive job +`Ctrl + D` + + + + + +## ASPIRE 1 @ NSCC + +### 0. load necessary modules +```bash +module purge +export PATH=/app/gcc/9.5.0/bin:$PATH && export LD_LIBRARY_PATH=/app/gcc/9.5.0/lib:$LD_LIBRARY_PATH +module load intel/19.0.0.117 +``` + +### 1. Download hdf5 source code and compile it +```bash + +# download openmpi and hdf5 source code on your LOCAL MACHINE +wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.13/hdf5-1.13.3/src/hdf5-1.13.3.tar.gz + +# then upload it to NSCC (for example) +scp -rC hdf5-1.13.3.tar.gz aspire1:~/(where TomoATT placed)/external_libs/ + +# on ASPIURE 1 +cd external_libs + +mkdir local_mpi_hdf5 + +# extract tar file and cd to the directory +tar -xvf hdf5-1.13.3.tar.gz && cd hdf5-1.13.3 + +# configure the code +CC=mpiicc CXX=mpiicpc \ +./configure --enable-parallel --enable-unsupported --enable-shared --enable-cxx --prefix=$(pwd)/../local_mpi_hdf5 + +# make and install to the prefix +make -j16 && make install + +``` + +### 2. Compile TomoATT +```bash +# cd to TomoATT directory +cd ../.. + +# make a build directory +mkdir build + +# compile TomoATT +cd build +CC=icc CXX=icpc cmake .. -DCMAKE_PREFIX_PATH=$(pwd)/../external_libs/local_mpi_hdf5 + +make -j16 +``` diff --git a/docs/mpi_diagram/class_diagram b/docs/mpi_diagram/class_diagram new file mode 100644 index 0000000..683713c --- /dev/null +++ b/docs/mpi_diagram/class_diagram @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/docs/mpi_diagram/earthquake_relocation b/docs/mpi_diagram/earthquake_relocation new file mode 100644 index 0000000..4c79daf --- /dev/null +++ b/docs/mpi_diagram/earthquake_relocation @@ -0,0 +1 @@ +3Vpbd5s4EP41Pmf3oTkgMLYfYyfb7m53223aTfLUI4NsSASiQsT2/vodgTAX0cRJTLD9wkGDJEYz880NBtYsXL/nOPb/Yh6hA2R464F1MUDIdhBcJWGTE0aGmROWPPByUoVwFfxHFNFQ1DTwSFKbKBijIojrRJdFEXFFjYY5Z6v6tAWj9bfGeEk0wpWLqU69Djzh59QxGpX0DyRY+sWbTWeSPwlxMVmdJPGxx1YVknU5sGacMZHfhesZoVJ2hVyuf99c04/3zvs//kl+4G/TP7/+/e+7fLPfnrNkewROIvHireM73/wRfWE4uJlN/U8fHsYT9s501NnEphAY8UB+asi48NmSRZheltQpZ2nkEbmtAaNyzkfGYiCaQLwjQmyUMeBUMCD5IqTqKVkH4qZyfyu3Ohuq0cVa7ZwNNmqQ8ymZa+j1CaGoeQlLuUsekYRSssB8ScRjErO2qgfIEBYSwTewkBOKRfBQ5w4r411u55UKghulo2foy7L61Fepo9vKk3Z9gVb4prJIDm+rz8pl2ejQ9GwZfepZcfmAaareNMPUTeHVBMhfOX7IvLQIQjleBIR6iXwQDpBD4VjTOYe7pbxbMC45zN7JiUuAdy7nhpollXYiVbvyA0GuYpxJcwWxoW4TeJ4wmgpyzl1lNxm1HNkwTARn91u/i7bqBRYEWb9Awbo+il0KL63C1Db+rEqnjwxF8ysOf2h0BVVTE/ChQhUGnwkHWxKEHzh8ixTiKfiiPtFraui9AoZFZo1gjMjBoURTNE/iTGRNyPI0+h5CIgYLBtY5XJFmSjqyKkYAmUos54XrpczpzhaUrVwfODhLJB/ffwbvzsA5qoNzrGPTbMOm0xk2dYEeKjYPFIdoRxz2GkWRjsMVGHpxPBkFceTV4+IJx0TT2TEmWl3hDh0N7rrGj7VruTHptdzQAHS5Fhy7oiUJxZJIsOuXx5cJ6S83ya+nharJsIYqa9QSzUZvGc1sXUvSq+0nY4CUMAwiLKCK6DdpcHrPGtDkWLzXoxm9WcsjyrSir4x+Z1c4eqUrVEs/syASpZ3ZjShpmQ37yRlTqxomtGXjFcWC7mQ/pSJORVbYU6LnJC9EsocFnuOEvDGOLadRmRsjDcfjtsJ82BWMj6cwP9Dk3xztCNlee6UFlxVgfSHYU22yE8pIkNXISFp6X5MWhNmdlde9flUwKvh66qvC462vAwuU411R12vRbY2Oxr3use+ZjZqbHYxF2L364bHmh2c+ce8H2UdfcIdLEslicU9ZDnGDJGDRW1crqO6DHaOlWmlzwt1VK/1+KnyOEz5UhzvZEV6vrkxeh6+Jhi+38rEQAOIFJKt42EJe5nfEzbiC+iKN4BbAUjRCkzSUB2Z6K+eE8qUtDhVW7WELVltLks6wqrdwQA9TvVABSYiGJ8zENmNUNmguIhZJGEPdSBskTIMlOMULFyQnA9RUyjUAQzlXD8LA8+jPisO6X+hMMUNUT2QNR1OM85b96iKxPoJc5pjyFrRr/ZinDr19PtILyG+xl3vVbYebMhfnLrQHD9mC886w2WjHDu0d27HdVZn20YHzwFqvhd98+m+KvbRezznHm8qEWLZUk8rOjc4sGtVz6qFjNIwm33Gv7dhCJhXQnzy0Gx1aq6V22cbYKrSRaT8b2zAsf5nNlVb+d2xd/g8= \ No newline at end of file diff --git a/docs/mpi_diagram/earthquake_relocation.drawio.png b/docs/mpi_diagram/earthquake_relocation.drawio.png new file mode 100644 index 0000000..a407f5e Binary files /dev/null and b/docs/mpi_diagram/earthquake_relocation.drawio.png differ diff --git a/docs/mpi_diagram/mpi_group_explanation b/docs/mpi_diagram/mpi_group_explanation new file mode 100644 index 0000000..a25fdc5 --- /dev/null +++ b/docs/mpi_diagram/mpi_group_explanation @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/docs/mpi_diagram/mpi_group_explanation.pdf b/docs/mpi_diagram/mpi_group_explanation.pdf new file mode 100644 index 0000000..9ae1f76 Binary files /dev/null and b/docs/mpi_diagram/mpi_group_explanation.pdf differ diff --git a/examples/.DS_Store b/examples/.DS_Store new file mode 100644 index 0000000..7d7542f Binary files /dev/null and b/examples/.DS_Store differ diff --git a/examples/clean_examples.sh b/examples/clean_examples.sh new file mode 100755 index 0000000..29feaf5 --- /dev/null +++ b/examples/clean_examples.sh @@ -0,0 +1,7 @@ +rm -r ./*/OUTPUT_FILES +rm ./*/*.dat +rm ./*/*.h5 +rm ./*/*.txt +rm ./*/params_log.yaml +rm -r ./*/OUTPUT_FILES* +rm ./*/*/*.h5 \ No newline at end of file diff --git a/examples/eg1_seismic_tomography/3_input_params/input_params_inv.yaml b/examples/eg1_seismic_tomography/3_input_params/input_params_inv.yaml new file mode 100644 index 0000000..10fae32 --- /dev/null +++ b/examples/eg1_seismic_tomography/3_input_params/input_params_inv.yaml @@ -0,0 +1,215 @@ +version: 3 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-10, 50] # depth in km + min_max_lat: [0, 2] # latitude in degree + min_max_lon: [0, 2] # longitude in degree + n_rtp: [61, 61, 61] # number of nodes in depth,latitude,longitude direction + +################################################# +# traveltime data file path # +################################################# +source: + src_rec_file: OUTPUT_FILES/OUTPUT_FILES_signal/src_rec_file_forward_noisy.dat # source receiver file path + swap_src_rec: true # swap source and receiver (only valid for regional source and receiver, those of tele remain unchanged) + +################################################# +# initial model file path # +################################################# +model: + init_model_path: 2_models/model_init_N61_61_61.h5 # path to initial model file +# model_1d_name: dummy_model_1d_name # 1D model name used in teleseismic 2D solver (iasp91, ak135, user_defined is available), defined in include/1d_model.h + +################################################# +# parallel computation settings # +################################################# +parallel: # parameters for parallel computation + n_sims: 8 # number of simultanoues runs (parallel the sources) + ndiv_rtp: [1, 1, 1] # number of subdivision on each direction (parallel the computional domain) + nproc_sub: 1 # number of processors for sweep parallelization (parallel the fast sweep method) + use_gpu: false # true if use gpu (EXPERIMENTAL) + +############################################ +# output file setting # +############################################ +output_setting: + output_dir: OUTPUT_FILES/OUTPUT_FILES_inv # path to output director (default is ./OUTPUT_FILES/) + output_source_field: false # True: output the traveltime field and adjoint field of all sources at each iteration. Default: false. File: 'out_data_sim_group_X'. + output_kernel: false # True: output sensitivity kernel and kernel density. Default: false. File: 'out_data_sim_group_X'. + output_final_model: true # True: output merged final model. This file can be used as the input model for TomoATT. Default: true. File: 'model_final.h5'. + output_middle_model: false # True: output merged intermediate models during inversion. This file can be used as the input model for TomoATT. Default: false. File: 'middle_model_step_XXXX.h5' + output_in_process: false # True: output at each inv iteration, otherwise, only output step 0, Niter-1, Niter. Default: true. File: 'out_data_sim_group_0'. + output_in_process_data: false # True: output src_rec_file at each inv iteration, otherwise, only output step 0, Niter-2, Niter-1. Default: true. File: 'src_rec_file_step_XXXX.dat' + single_precision_output: false # True: output results in single precision. Default: false. + verbose_output_level: 0 # output internal parameters, (to do). + output_file_format: 0 # 0: hdf5, 1: ascii + +# output files: +# File: 'out_data_grid.h5'. Keys: ['Mesh']['elem_conn'], element index; +# ['Mesh']['node_coords_p'], phi coordinates of nodes; +# ['Mesh']['node_coords_t'], theta coordinates of nodes; +# ['Mesh']['node_coords_r'], r coordinates of nodes; +# ['Mesh']['node_coords_x'], phi coordinates of elements; +# ['Mesh']['node_coords_y'], theta coordinates of elements; +# ['Mesh']['node_coords_z'], r coordinates of elements; +# File: 'out_data_sim_group_0'. Keys: ['model']['vel_inv_XXXX'], velocity model at iteration XXXX; +# ['model']['xi_inv_XXXX'], xi model at iteration XXXX; +# ['model']['eta_inv_XXXX'], eta model at iteration XXXX +# ['model']['Ks_inv_XXXX'], sensitivity kernel related to slowness at iteration XXXX +# ['model']['Kxi_inv_XXXX'], sensitivity kernel related to xi at iteration XXXX +# ['model']['Keta_inv_XXXX'], sensitivity kernel related to eta at iteration XXXX +# ['model']['Ks_density_inv_XXXX'], kernel density of Ks at iteration XXXX +# ['model']['Kxi_density_inv_XXXX'], kernel density of Kxi at iteration XXXX +# ['model']['Keta_density_inv_XXXX'], kernel density of Keta at iteration XXXX +# ['model']['Ks_over_Kden_inv_XXXX'], slowness kernel over kernel density at iteration XXXX +# ['model']['Kxi_over_Kden_inv_XXXX'], xi kernel over kernel density at iteration XXXX +# ['model']['Keta_over_Kden_inv_XXXX'], eta kernel over kernel density at iteration XXXX +# ['model']['Ks_update_inv_XXXX'], slowness kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Kxi_update_inv_XXXX'], xi kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Keta_update_inv_XXXX'], eta kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['1dinv']['vel_1dinv_inv_XXXX'], 2d velocity model at iteration XXXX, in 1d inversion mode +# ['1dinv']['r_1dinv'], r coordinates (depth), in 1d inversion mode +# ['1dinv']['t_1dinv'], t coordinates (epicenter distance), in 1d inversion mode +# File: 'src_rec_file_step_XXXX.dat' or 'src_rec_file_forward.dat'. The synthetic traveltime data file. +# File: 'final_model.h5'. Keys: ['eta'], ['xi'], ['vel'], the final model. +# File: 'middle_model_step_XXXX.h5'. Keys: ['eta'], ['xi'], ['vel'], the model at step XXXX. +# File: 'inversion_grid.txt'. The location of inversion grid nodes +# File: 'objective_function.txt'. The objective function value at each iteration +# File: 'out_data_sim_group_X'. Keys: ['src_YYYY']['time_field_inv_XXXX'], traveltime field of source YYYY at iteration XXXX; +# ['src_YYYY']['adjoint_field_inv_XXXX'], adjoint field of source YYYY at iteration XXXX; +# ['1dinv']['time_field_1dinv_YYYY_inv_XXXX'], 2d traveltime field of source YYYY at iteration XXXX, in 1d inversion mode +# ['1dinv']['adjoint_field_1dinv_YYYY_inv_XXXX'], 2d adjoint field of source YYYY at iteration XXXX, in 1d inversion mode + + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion + earthquake relocation +# 4 for 1d model inversion +run_mode: 1 + +have_tele_data: false # An error will be reported if false but source out of study region is used. Default: false. + +################################################### +# model update parameters setting # +################################################### +model_update: + max_iterations: 40 # maximum number of inversion iterations + optim_method: 0 # optimization method. 0 : grad_descent, 1 : halve-stepping, 2 : lbfgs (EXPERIMENTAL) + + #common parameters for all optim methods + step_length: 0.02 # the initial step length of model perturbation. 0.01 means maximum 1% perturbation for each iteration. + + # parameters for optim_method 0 (gradient_descent) + optim_method_0: + step_method: 1 # the method to modulate step size. 0: according to objective function; 1: according to gradient direction + # if step_method:0. if objective function increase, step size -> step length * step_length_decay. + step_length_decay: 0.9 # default: 0.9 + # if step_method:1. if the angle between the current and the previous gradients is greater than step_length_gradient_angle, step size -> step length * step_length_change[0]. + # otherwise, step size -> step length * step_length_change[1]. + step_length_gradient_angle: 120 # default: 120.0 + step_length_change: [0.5, 1.2] # default: [0.5,1.2] + # Kdensity_coe is used to rescale the final kernel: kernel -> kernel / pow(density of kernel, Kdensity_coe). if Kdensity_coe > 0, the region with less data will be enhanced during the inversion + # e.g., if Kdensity_coe = 0, kernel remains upchanged; if Kdensity_coe = 1, kernel is fully normalized. 0.5 or less is recommended if really required. + Kdensity_coe: 0 # default: 0.0, limited range: 0.0 - 0.95 + + # smoothing + smoothing: + smooth_method: 0 # 0: multiparametrization, 1: laplacian smoothing (EXPERIMENTAL) + l_smooth_rtp: [1, 1, 1] # smoothing coefficients for laplacian smoothing + + # parameters for smooth method 0 (multigrid model parametrization) + # inversion grid can be viewed in OUTPUT_FILES/inversion_grid.txt + n_inversion_grid: 5 # number of inversion grid sets + + uniform_inv_grid_dep: false # true if use uniform inversion grid for dep, false if use flexible inversion grid + uniform_inv_grid_lat: true # true if use uniform inversion grid for lat, false if use flexible inversion grid + uniform_inv_grid_lon: true # true if use uniform inversion grid for lon, false if use flexible inversion grid + + # -------------- uniform inversion grid setting -------------- + # settings for uniform inversion grid + n_inv_dep_lat_lon: [12, 9, 9] # number of the base inversion grid points + min_max_dep_inv: [-10, 50] # depth in km (Radius of the earth is defined in config.h/R_earth) + min_max_lat_inv: [0, 2] # latitude in degree + min_max_lon_inv: [0, 2] # longitude in degree + + # -------------- flexible inversion grid setting -------------- + # settings for flexible inversion grid + dep_inv: [-10, 0, 10, 20, 30, 40, 50, 60] # inversion grid for vel in depth (km) + lat_inv: [30, 30.2, 30.4, 30.6, 30.8, 31, 31.2, 31.4, 31.6, 31.8, 32] # inversion grid for vel in latitude (degree) + lon_inv: [30, 30.2, 30.4, 30.6, 30.8, 31, 31.2, 31.4, 31.6, 31.8, 32] # inversion grid for vel in longitude (degree) + trapezoid: [1, 0, 50] # usually set as [1.0, 0.0, 50.0] (default) + + # Carefully change trapezoid and trapezoid_ani, if you really want to use trapezoid inversion grid, increasing the inversion grid spacing with depth to account for the worse data coverage in greater depths. + # The trapezoid_ inversion grid with index (i,j,k) in longitude, latitude, and depth is defined as: + # if dep_inv[k] < trapezoid[1], lon = lon_inv[i]; + # lat = lat_inv[j]; + # dep = dep_inv[k]; + # if trapezoid[1] <= dep_inv[k] < trapezoid[2], lon = mid_lon_inv+(lon_inv[i]-mid_lon_inv)*(dep_inv[k]-trapezoid[1])/(trapezoid[2]-trapezoid[1])*trapezoid[0]; + # lat = mid_lat_inv+(lat_inv[i]-mid_lat_inv)*(dep_inv[k]-trapezoid[1])/(trapezoid[2]-trapezoid[1])*trapezoid[0]; + # dep = dep_inv[k]; + # if trapezoid[2] <= dep_inv[k], lon = mid_lon_inv+(lon_inv[i]-mid_lon_inv)*trapezoid[0]; + # lat = mid_lat_inv+(lat_inv[i]-mid_lat_inv)*trapezoid[0]; + # dep = dep_inv[k]; + # The shape of trapezoid inversion gird (x) looks like: + # + # lon_inv[0] [1] [2] [3] [4] + # |<-------- (lon_inv[end] - lon_inv[0]) ---->| + # dep_inv[0] | x x x x x | + # | | + # dep_inv[1] | x x x x x | + # | | + # dep_inv[2] = trapezoid[1] / x x x x x \ + # / \ + # dep_inv[3] / x x x x x \ + # / \ + # dep_inv[4] = trapezoid[2] / x x x x x \ + # | | + # dep_inv[5] | x x x x x | + # | | + # dep_inv[6] | x x x x x | + # |<---- trapezoid[0]* (lon_inv[end] - lon_inv[0]) ------>| + + + # In the following data subsection, XXX_weight means a weight is assigned to the data, influencing the objective function and gradient + # XXX_weight : [d1,d2,w1,w2] means: + # if XXX < d1, weight = w1 + # if d1 <= XXX < d2, weight = w1 + (XXX-d1)/(d2-d1)*(w2-w1), (linear interpolation) + # if d2 <= XXX , weight = w2 + # You can easily set w1 = w2 = 1.0 to normalize the weight related to XXX. + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time: true # 'true' for using absolute traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1, 3, 1, 1] # XXX is the absolute traveltime residual (second) = abs(t^{obs}_{n,i} - t^{syn}_{n,j}) + distance_weight: [100, 200, 1, 1] # XXX is epicenter distance (km) between the source and receiver related to the data + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + use_cs_time: false # 'true' for using common source differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1, 3, 1, 1] # XXX is the common source differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{n,j} - t^{syn}_{n,i} + t^{syn}_{n,j}). + azimuthal_weight: [15, 30, 1, 1] # XXX is the azimuth difference between two separate stations related to the common source. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time: false # 'true' for using common receiver differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1, 3, 1, 1] # XXX is the common receiver differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{m,i} - t^{syn}_{n,i} + t^{syn}_{m,i}) + azimuthal_weight: [15, 30, 1, 1] # XXX is the azimuth difference between two separate sources related to the common receiver. + + # -------------- global weight of different types of data (to balance the weight of different data) -------------- + global_weight: + balance_data_weight: false # yes: over the total weight of the each type of the data. no: use original weight (below weight for each type of data needs to be set) + abs_time_weight: 1 # weight of absolute traveltime data after balance, default: 1.0 + cs_dif_time_local_weight: 1 # weight of common source differential traveltime data after balance, default: 1.0 + cr_dif_time_local_weight: 1 # weight of common receiver differential traveltime data after balance, default: 1.0 + teleseismic_weight: 1 # weight of teleseismic data after balance, default: 1.0 (exclude in this version) + + # -------------- inversion parameters -------------- + update_slowness : true # update slowness (velocity) or not. default: true + update_azi_ani : true # update azimuthal anisotropy (xi, eta) or not. default: false diff --git a/examples/eg1_seismic_tomography/3_input_params/input_params_signal.yaml b/examples/eg1_seismic_tomography/3_input_params/input_params_signal.yaml new file mode 100644 index 0000000..376d749 --- /dev/null +++ b/examples/eg1_seismic_tomography/3_input_params/input_params_signal.yaml @@ -0,0 +1,50 @@ +version: 3 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-10, 50] # depth in km + min_max_lat: [0, 2] # latitude in degree + min_max_lon: [0, 2] # longitude in degree + n_rtp: [61, 61, 61] # number of nodes in depth,latitude,longitude direction + +################################################# +# traveltime data file path # +################################################# +source: + src_rec_file: 1_src_rec_files/src_rec_config.dat # source receiver file path + swap_src_rec: true # swap source and receiver + +################################################# +# initial model file path # +################################################# +model: + init_model_path: 2_models/model_ckb_N61_61_61.h5 # path to initial model file + +################################################# +# parallel computation settings # +################################################# +parallel: # parameters for parallel computation + n_sims: 8 # number of simultanoues runs (parallel the sources) + ndiv_rtp: [1, 1, 1] # number of subdivision on each direction (parallel the computional domain) + +############################################ +# output file setting # +############################################ +output_setting: + output_dir: OUTPUT_FILES/OUTPUT_FILES_signal # path to output director (default is ./OUTPUT_FILES/) + output_final_model: true # output merged final model (final_model.h5) or not. + output_in_process: false # output model at each inv iteration or not. + output_in_process_data: false # output src_rec_file at each inv iteration or not. + output_file_format: 0 + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion + earthquake relocation +run_mode: 0 diff --git a/examples/eg1_seismic_tomography/README.md b/examples/eg1_seismic_tomography/README.md new file mode 100644 index 0000000..c7c897c --- /dev/null +++ b/examples/eg1_seismic_tomography/README.md @@ -0,0 +1,29 @@ +# seismic tomography + +This is a toy model to invert traveltimes for Vp and anisotropy (Figure 8c.) + +Reference: +[1] J. Chen, M. Nagaso, M. Xu, and P. Tong, TomoATT: An open-source package for Eikonal equation-based adjoint-state traveltime tomography for seismic velocity and azimuthal anisotropy, submitted. +https://doi.org/10.48550/arXiv.2412.00031 + +Python modules are required to initiate the inversion and to plot final results: +- h5py +- PyTomoAT +- Pygmt +- gmt + +Run this example: + +1. Run bash script `bash run_this_example.sh` to execute the test. + +2. After inversion, run `plot_output.py` to plot the results. + +The initial and true models: + +![](img/model_setting.jpg) + +The inversion result: + +![](img/model_inv.jpg) + + diff --git a/examples/eg1_seismic_tomography/assign_gaussian_noise.py b/examples/eg1_seismic_tomography/assign_gaussian_noise.py new file mode 100644 index 0000000..1126466 --- /dev/null +++ b/examples/eg1_seismic_tomography/assign_gaussian_noise.py @@ -0,0 +1,16 @@ +from pytomoatt.src_rec import SrcRec + +def assign_noise_to_src_rec_file(in_fname, out_fname, noise_level=0.1): + sr = SrcRec.read(in_fname) + sr.add_noise(noise_level) + sr.write(out_fname) + + +if __name__ == "__main__": + in_fname = "OUTPUT_FILES/OUTPUT_FILES_signal/src_rec_file_forward.dat" # input source receiver file + out_fname = "OUTPUT_FILES/OUTPUT_FILES_signal/src_rec_file_forward_noisy.dat" # output source receiver file + sigma = 0.1 # noise level in seconds + assign_noise_to_src_rec_file(in_fname, out_fname, noise_level=sigma) + + + diff --git a/examples/eg1_seismic_tomography/plot_output.py b/examples/eg1_seismic_tomography/plot_output.py new file mode 100644 index 0000000..cbf446a --- /dev/null +++ b/examples/eg1_seismic_tomography/plot_output.py @@ -0,0 +1,250 @@ +# %% +import pygmt +pygmt.config(FONT="16p", IO_SEGMENT_MARKER="<<<") + +import os + +# %% +from pytomoatt.model import ATTModel +from pytomoatt.data import ATTData +import numpy as np + +# %% +# read models + +Ngrid = [61,61,61] +data_file = '2_models/model_init_N%d_%d_%d.h5'%(Ngrid[0],Ngrid[1],Ngrid[2]) +par_file = '3_input_params/input_params_signal.yaml' +model = ATTModel.read(data_file, par_file) +initial_model = model.to_xarray() + +data_file = '2_models/model_ckb_N%d_%d_%d.h5'%(Ngrid[0],Ngrid[1],Ngrid[2]) +model = ATTModel.read(data_file, par_file) +ckb_model = model.to_xarray() + +# initial model +depth = 10.0 +vel_init = initial_model.interp_dep(depth, field='vel') +start = [1.25,0]; end = [1.25,2] +vel_init_sec = initial_model.interp_sec(start, end, field='vel', val = 1) + +# checkerboard model +vel_ckb = ckb_model.interp_dep(depth, field='vel') # lon = [:,0], lat = [:,1], vel = [:,2] +vel_ckb_sec = ckb_model.interp_sec(start, end, field='vel', val = 1) + +# anisotropic arrow +samp_interval = 3 +length = 7 +width = 0.1 +ani_thd = 0.02 + +ani_ckb_phi = ckb_model.interp_dep(depth, field='phi', samp_interval=samp_interval) +ani_ckb_epsilon = ckb_model.interp_dep(depth, field='epsilon', samp_interval=samp_interval) +ani_ckb = np.hstack([ani_ckb_phi, ani_ckb_epsilon[:,2].reshape(-1, 1)*length, np.ones((ani_ckb_epsilon.shape[0],1))*width]) # lon, lat, angle, length, width +idx = np.where(ani_ckb_epsilon[:,2] > ani_thd) +ani_ckb = ani_ckb[idx[0],:] + +try: + os.mkdir('img') +except: + pass + +# %% +# read src_rec_file for data +from pytomoatt.src_rec import SrcRec + +sr = SrcRec.read('1_src_rec_files/src_rec_config.dat') +station = sr.receivers[['stlo','stla','stel']].values.T +true_loc = sr.sources[['evlo','evla','evdp']].values.T +earthquake = true_loc + +# %% +# categorize earthquakes +ev_idx1 = [] +ev_idx2 = [] +ev_idx3 = [] +for i in range(earthquake.shape[1]): + dep = earthquake[2,i] + if dep < 15: + ev_idx1.append(i) + elif dep < 25: + ev_idx2.append(i) + elif dep < 35: + ev_idx3.append(i) + +# %% +# plot the checkerboard model +fig = pygmt.Figure() + +region = [0,2,0,2] +frame = ["xa1","ya1","nSWe"] +projection = "M10c" +spacing = 0.04 + +vel_range = 20 + +# -------------- initial model and earthquake location -------------- +fig.basemap(region=region, frame=["xa1","ya1","+tInitial model and locations"], projection=projection) +# velocity perturbation +pygmt.makecpt(cmap="../utils/svel13_chen.cpt", series=[-vel_range, vel_range], background=True, reverse=False) +x = vel_init[:,0]; y = vel_init[:,1]; value = (vel_init[:,2] - vel_init[:,2])/vel_init[:,2] * 100 +grid = pygmt.surface(x=x, y=y, z=value, spacing=spacing,region=region) +fig.grdimage(grid = grid) +# earthquakes +fig.plot(x = true_loc[0,ev_idx1], y = true_loc[1,ev_idx1], style = "c0.1c", fill = "red") +fig.plot(x = true_loc[0,ev_idx2], y = true_loc[1,ev_idx2], style = "c0.1c", fill = "green") +fig.plot(x = true_loc[0,ev_idx3], y = true_loc[1,ev_idx3], style = "c0.1c", fill = "black") + +# stations +fig.plot(x = station[0,:], y = station[1,:], style = "t0.4c", fill = "blue", pen = "black", label = "Station") + +# # anisotropic arrow +# fig.plot(ani_ckb, style='j', fill='yellow1', pen='0.5p,black') + +fig.shift_origin(xshift=11) + +fig.basemap(region=[0,40,0,2], frame=["xa20+lDepth (km)","ya1","Nswe"], projection="X2c/10c") +x = vel_init_sec[:,3]; y = vel_init_sec[:,1]; value = (vel_init_sec[:,4] - vel_init_sec[:,4])/vel_init_sec[:,4] * 100 +grid = pygmt.surface(x=x, y=y, z=value, spacing="1/0.04",region=[0,40,0,2]) +fig.grdimage(grid = grid) + +# earthquakes +fig.plot(x = true_loc[2,ev_idx1], y = true_loc[1,ev_idx1], style = "c0.1c", fill = "red") +fig.plot(x = true_loc[2,ev_idx2], y = true_loc[1,ev_idx2], style = "c0.1c", fill = "green") +fig.plot(x = true_loc[2,ev_idx3], y = true_loc[1,ev_idx3], style = "c0.1c", fill = "black") + + +fig.shift_origin(xshift=4) + + + + +# -------------- checkerboard model -------------- +fig.basemap(region=region, frame=["xa1","ya1","+tTrue model and locations"], projection=projection) +# velocity perturbation +pygmt.makecpt(cmap="../utils/svel13_chen.cpt", series=[-vel_range, vel_range], background=True, reverse=False) +x = vel_ckb[:,0]; y = vel_ckb[:,1]; value = (vel_ckb[:,2] - vel_init[:,2])/vel_init[:,2] * 100 +grid = pygmt.surface(x=x, y=y, z=value, spacing=spacing,region=region) +fig.grdimage(grid = grid) +# earthquakes +fig.plot(x = earthquake[0,ev_idx1], y = earthquake[1,ev_idx1], style = "c0.1c", fill = "red") +fig.plot(x = earthquake[0,ev_idx2], y = earthquake[1,ev_idx2], style = "c0.1c", fill = "green") +fig.plot(x = earthquake[0,ev_idx3], y = earthquake[1,ev_idx3], style = "c0.1c", fill = "black") + +# stations +# fig.plot(x = loc_st[0,:], y = loc_st[1,:], style = "t0.4c", fill = "blue", pen = "black", label = "Station") + +# anisotropic arrow +fig.plot(ani_ckb, style='j', fill='yellow1', pen='0.5p,black') + +fig.shift_origin(xshift=11) + +fig.basemap(region=[0,40,0,2], frame=["xa20+lDepth (km)","ya1","Nswe"], projection="X2c/10c") +x = vel_ckb_sec[:,3]; y = vel_ckb_sec[:,1]; value = (vel_ckb_sec[:,4] - vel_init_sec[:,4])/vel_init_sec[:,4] * 100 +grid = pygmt.surface(x=x, y=y, z=value, spacing="1/0.04",region=[0,40,0,2]) +fig.grdimage(grid = grid) + +# earthquakes +fig.plot(x = earthquake[2,ev_idx1], y = earthquake[1,ev_idx1], style = "c0.1c", fill = "red") +fig.plot(x = earthquake[2,ev_idx2], y = earthquake[1,ev_idx2], style = "c0.1c", fill = "green") +fig.plot(x = earthquake[2,ev_idx3], y = earthquake[1,ev_idx3], style = "c0.1c", fill = "black") + + +# ------------------- colorbar ------------------- +fig.shift_origin(xshift=-11, yshift=-1.5) +fig.colorbar(frame = ["a%f"%(vel_range),"x+ldlnVp (%)"], position="+e+w4c/0.3c+h") + +fig.shift_origin(xshift=6, yshift=-1) +fig.basemap(region=[0,1,0,1], frame=["wesn"], projection="X6c/1.5c") +ani = [ + [0.2, 0.6, 45, 0.02*length, width], # lon, lat, phi, epsilon, size + [0.5, 0.6, 45, 0.05*length, width], + [0.8, 0.6, 45, 0.10*length, width], + ] +fig.plot(ani, style='j', fill='yellow1', pen='0.5p,black') +fig.text(text=["0.02", "0.05", "0.10"], x=[0.2,0.5,0.8], y=[0.2]*3, font="16p,Helvetica", justify="CM") +fig.shift_origin(xshift= 11, yshift=2.5) + +fig.show() +fig.savefig('img/model_setting.png', dpi=300) + +# %% +# plot the inversion result + +# read models +tag = "inv" +data_file = "OUTPUT_FILES/OUTPUT_FILES_%s/final_model.h5"%(tag) +model = ATTModel.read(data_file, par_file) +inv_model = model.to_xarray() +vel_inv = inv_model.interp_dep(depth, field='vel') # lon = [:,0], lat = [:,1], vel = [:,2] +x = vel_inv[:,0]; y = vel_inv[:,1]; value = (vel_inv[:,2] - vel_init[:,2])/vel_init[:,2] * 100 +vel_inv_sec = inv_model.interp_sec(start, end, field='vel', val = 1) +x_sec = vel_inv_sec[:,3]; y_sec = vel_inv_sec[:,1]; value_sec = (vel_inv_sec[:,4] - vel_init_sec[:,4])/vel_init_sec[:,4] * 100 + +ani_inv_phi = inv_model.interp_dep(depth, field='phi', samp_interval=samp_interval) +ani_inv_epsilon = inv_model.interp_dep(depth, field='epsilon', samp_interval=samp_interval) +ani_inv = np.hstack([ani_inv_phi, ani_inv_epsilon[:,2].reshape(-1, 1)*length, np.ones((ani_inv_epsilon.shape[0],1))*width]) # lon, lat, angle, length, width +idx = np.where(ani_inv_epsilon[:,2] > ani_thd) +ani_inv = ani_inv[idx[0],:] + +# plot the inversion result + +fig = pygmt.Figure() + +region = [0,2,0,2] +frame = ["xa1","ya1","+tInversion results"] +projection = "M10c" +spacing = 0.04 + +vel_range = 20 + +# -------------- checkerboard model -------------- +fig.basemap(region=region, frame=frame, projection=projection) +# velocity perturbation +pygmt.makecpt(cmap="../utils/svel13_chen.cpt", series=[-vel_range, vel_range], background=True, reverse=False) +x = vel_inv[:,0]; y = vel_inv[:,1]; value = (vel_inv[:,2] - vel_init[:,2])/vel_init[:,2] * 100 +grid = pygmt.surface(x=x, y=y, z=value, spacing=spacing,region=region) +fig.grdimage(grid = grid) +# # earthquakes +# fig.plot(x = earthquake[0,ev_idx1], y = earthquake[1,ev_idx1], style = "c0.1c", fill = "red") +# fig.plot(x = earthquake[0,ev_idx2], y = earthquake[1,ev_idx2], style = "c0.1c", fill = "green") +# fig.plot(x = earthquake[0,ev_idx3], y = earthquake[1,ev_idx3], style = "c0.1c", fill = "black") + +# stations +# fig.plot(x = loc_st[0,:], y = loc_st[1,:], style = "t0.4c", fill = "blue", pen = "black", label = "Station") + +# anisotropic arrow +fig.plot(ani_inv, style='j', fill='yellow1', pen='0.5p,black') + +fig.shift_origin(xshift=11) + +fig.basemap(region=[0,40,0,2], frame=["xa20+lDepth (km)","ya1","Nswe"], projection="X2c/10c") +x = vel_inv_sec[:,3]; y = vel_inv_sec[:,1]; value = (vel_inv_sec[:,4] - vel_init_sec[:,4])/vel_init_sec[:,4] * 100 +grid = pygmt.surface(x=x, y=y, z=value, spacing="1/0.04",region=[0,40,0,2]) +fig.grdimage(grid = grid) + +# # earthquakes +# fig.plot(x = earthquake[2,ev_idx1], y = earthquake[1,ev_idx1], style = "c0.1c", fill = "red") +# fig.plot(x = earthquake[2,ev_idx2], y = earthquake[1,ev_idx2], style = "c0.1c", fill = "green") +# fig.plot(x = earthquake[2,ev_idx3], y = earthquake[1,ev_idx3], style = "c0.1c", fill = "black") + +# ------------------- colorbar ------------------- +fig.shift_origin(xshift=-11, yshift=-1.5) +fig.colorbar(frame = ["a%f"%(vel_range),"x+ldlnVp (%)"], position="+e+w4c/0.3c+h") + +fig.shift_origin(xshift=6, yshift=-1) +fig.basemap(region=[0,1,0,1], frame=["wesn"], projection="X6c/1.5c") +ani = [ + [0.2, 0.6, 45, 0.02*length, width], # lon, lat, phi, epsilon, size + [0.5, 0.6, 45, 0.05*length, width], + [0.8, 0.6, 45, 0.10*length, width], + ] +fig.plot(ani, style='j', fill='yellow1', pen='0.5p,black') +fig.text(text=["0.02", "0.05", "0.10"], x=[0.2,0.5,0.8], y=[0.2]*3, font="16p,Helvetica", justify="CM") +fig.shift_origin(xshift= 11, yshift=2.5) + + +fig.show() +fig.savefig('img/model_%s.png'%(tag), dpi=300) + + diff --git a/examples/eg1_seismic_tomography/prepare_input_files.py b/examples/eg1_seismic_tomography/prepare_input_files.py new file mode 100644 index 0000000..13869cd --- /dev/null +++ b/examples/eg1_seismic_tomography/prepare_input_files.py @@ -0,0 +1,63 @@ +# download src_ref_files from Zenodo +import os +import numpy as np +import sys +try: + from pytomoatt.model import ATTModel + from pytomoatt.checkerboard import Checker + from pytomoatt.src_rec import SrcRec +except: + print("ERROR: ATTModel not found. Please install pytomoatt first." + "See https://tomoatt.github.io/PyTomoATT/installation.html for details.") + sys.exit(1) + + +class BuildInitialModel(): + def __init__(self, par_file="./3_input_params/input_params_signal.yaml", output_dir="2_models"): + """ + Build initial model for tomography inversion + """ + self.am = ATTModel(par_file) + self.output_dir = output_dir + + def build_initial_model(self, vel_min=5.0, vel_max=8.0): + """ + Build initial model for tomography inversion + """ + self.am.vel[self.am.depths < 0, :, :] = vel_min + idx = np.where((0 <= self.am.depths) & (self.am.depths < 40.0))[0] + self.am.vel[idx, :, :] = np.linspace(vel_min, vel_max, idx.size)[::-1][:, np.newaxis, np.newaxis] + self.am.vel[self.am.depths >= 40.0, :, :] = vel_max + + +def build_ckb_model(output_dir="2_models"): + cbk = Checker(f'{output_dir}/model_init_N61_61_61.h5', para_fname="./3_input_params/input_params_signal.yaml") + cbk.checkerboard( + n_pert_x=2, n_pert_y=2, n_pert_z=2, + pert_vel=0.2, pert_ani=0.1, ani_dir=60.0, + lim_x=[0.5, 1.5], lim_y=[0.5, 1.5], lim_z=[0, 40] + ) + cbk.write(f'{output_dir}/model_ckb_N61_61_61.h5') + + +if __name__ == "__main__": + # download src_rec_config.dat + url = 'https://zenodo.org/records/14053821/files/src_rec_config.dat' + path = "1_src_rec_files/src_rec_config.dat" + os.makedirs(os.path.dirname(path), exist_ok=True) + if not os.path.exists(path): + sr = SrcRec.read(url) + sr.write(path) + + # build initial model + output_dir = "2_models" + os.makedirs(output_dir, exist_ok=True) + bim = BuildInitialModel(output_dir=output_dir) + bim.build_initial_model() + bim.am.write('{}/model_init_N{:d}_{:d}_{:d}.h5'.format(bim.output_dir, *bim.am.n_rtp)) + + # build ckb model + build_ckb_model(output_dir) + + + diff --git a/examples/eg1_seismic_tomography/run_this_example.sh b/examples/eg1_seismic_tomography/run_this_example.sh new file mode 100644 index 0000000..2b0f0a3 --- /dev/null +++ b/examples/eg1_seismic_tomography/run_this_example.sh @@ -0,0 +1,29 @@ +#!/bin/bash + + +# Step 1: Generate necessary input files +python prepare_input_files.py + +# Step 2: Run forward modeling +# for WSL +# mpirun -n 8 --allow-run-as-root --oversubscribe ../../build/bin/TOMOATT -i 3_input_params/input_params_signal.yaml +# # for Linux +# mpirun -n 8 ../../build/bin/TOMOATT -i 3_input_params/input_params_signal.yaml +# for conda install +mpirun -n 8 TOMOATT -i 3_input_params/input_params_signal.yaml + + +# Step 3: Assign data noise to the observational data +python assign_gaussian_noise.py + +# Step 4: Do inversion +# for WSL +# mpirun -n 8 --allow-run-as-root --oversubscribe ../../build/bin/TOMOATT -i 3_input_params/input_params_inv.yaml +# # for Linux +# mpirun -n 8 ../../build/bin/TOMOATT -i 3_input_params/input_params_inv.yaml +# for conda install +mpirun -n 8 TOMOATT -i 3_input_params/input_params_inv.yaml + + +# Step 5 (Optional): Plot the results +python plot_output.py \ No newline at end of file diff --git a/examples/eg2_earthquake_location/3_input_params/input_params_loc.yaml b/examples/eg2_earthquake_location/3_input_params/input_params_loc.yaml new file mode 100644 index 0000000..f77f6ec --- /dev/null +++ b/examples/eg2_earthquake_location/3_input_params/input_params_loc.yaml @@ -0,0 +1,114 @@ +version: 3 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-10, 50] # depth in km + min_max_lat: [0, 2] # latitude in degree + min_max_lon: [0, 2] # longitude in degree + n_rtp: [61, 61, 61] # number of nodes in depth,latitude,longitude direction + +################################################# +# traveltime data file path # +################################################# +source: + src_rec_file: OUTPUT_FILES/OUTPUT_FILES_signal/src_rec_file_forward_errloc.dat # source receiver file path + swap_src_rec: true # swap source and receiver + +################################################# +# initial model file path # +################################################# +model: + init_model_path: 2_models/model_ckb_N61_61_61.h5 # path to initial model file + +################################################# +# parallel computation settings # +################################################# +parallel: # parameters for parallel computation + n_sims: 8 # number of simultanoues runs (parallel the sources) + ndiv_rtp: [1, 1, 1] # number of subdivision on each direction (parallel the computional domain) + +############################################ +# output file setting # +############################################ +output_setting: + output_dir: OUTPUT_FILES/OUTPUT_FILES_loc # path to output director (default is ./OUTPUT_FILES/) + output_final_model: true # output merged final model (final_model.h5) or not. + output_in_process: false # output model at each inv iteration or not. + output_in_process_data: false # output src_rec_file at each inv iteration or not. + output_file_format: 0 + +# output files: +# File: 'out_data_grid.h5'. Keys: ['Mesh']['elem_conn'], element index; +# ['Mesh']['node_coords_p'], phi coordinates of nodes; +# ['Mesh']['node_coords_t'], theta coordinates of nodes; +# ['Mesh']['node_coords_r'], r coordinates of nodes; +# ['Mesh']['node_coords_x'], phi coordinates of elements; +# ['Mesh']['node_coords_y'], theta coordinates of elements; +# ['Mesh']['node_coords_z'], r coordinates of elements; +# File: 'out_data_sim_group_0'. Keys: ['model']['vel_inv_XXXX'], velocity model at iteration XXXX; +# ['model']['xi_inv_XXXX'], xi model at iteration XXXX; +# ['model']['eta_inv_XXXX'], eta model at iteration XXXX +# ['model']['Ks_inv_XXXX'], sensitivity kernel related to slowness at iteration XXXX +# ['model']['Kxi_inv_XXXX'], sensitivity kernel related to xi at iteration XXXX +# ['model']['Keta_inv_XXXX'], sensitivity kernel related to eta at iteration XXXX +# ['model']['Ks_density_inv_XXXX'], kernel density of Ks at iteration XXXX +# ['model']['Kxi_density_inv_XXXX'], kernel density of Kxi at iteration XXXX +# ['model']['Keta_density_inv_XXXX'], kernel density of Keta at iteration XXXX +# ['model']['Ks_over_Kden_inv_XXXX'], slowness kernel over kernel density at iteration XXXX +# ['model']['Kxi_over_Kden_inv_XXXX'], xi kernel over kernel density at iteration XXXX +# ['model']['Keta_over_Kden_inv_XXXX'], eta kernel over kernel density at iteration XXXX +# ['model']['Ks_update_inv_XXXX'], slowness kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Kxi_update_inv_XXXX'], xi kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Keta_update_inv_XXXX'], eta kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['1dinv']['vel_1dinv_inv_XXXX'], 2d velocity model at iteration XXXX, in 1d inversion mode +# ['1dinv']['r_1dinv'], r coordinates (depth), in 1d inversion mode +# ['1dinv']['t_1dinv'], t coordinates (epicenter distance), in 1d inversion mode +# File: 'src_rec_file_step_XXXX.dat' or 'src_rec_file_forward.dat'. The synthetic traveltime data file. +# File: 'final_model.h5'. Keys: ['eta'], ['xi'], ['vel'], the final model. +# File: 'middle_model_step_XXXX.h5'. Keys: ['eta'], ['xi'], ['vel'], the model at step XXXX. +# File: 'inversion_grid.txt'. The location of inversion grid nodes +# File: 'objective_function.txt'. The objective function value at each iteration +# File: 'out_data_sim_group_X'. Keys: ['src_YYYY']['time_field_inv_XXXX'], traveltime field of source YYYY at iteration XXXX; +# ['src_YYYY']['adjoint_field_inv_XXXX'], adjoint field of source YYYY at iteration XXXX; +# ['1dinv']['time_field_1dinv_YYYY_inv_XXXX'], 2d traveltime field of source YYYY at iteration XXXX, in 1d inversion mode +# ['1dinv']['adjoint_field_1dinv_YYYY_inv_XXXX'], 2d adjoint field of source YYYY at iteration XXXX, in 1d inversion mode + + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion + earthquake relocation +# 4 for 1d model inversion +run_mode: 2 + +################################################# +# relocation parameters setting # +################################################# +relocation: # update earthquake hypocenter and origin time (when run_mode : 2 and 3) + min_Ndata: 4 # if the number of data of the earthquake is less than , the earthquake will not be relocated. defaut value: 4 + + # relocation_strategy + step_length : 0.01 # initial step length of relocation perturbation. 0.01 means maximum 1% perturbation for each iteration. + step_length_decay : 0.9 # if objective function increase, step size -> step length * step_length_decay. default: 0.9 + rescaling_dep_lat_lon_ortime: [10.0, 15.0, 15.0, 1.0] # The perturbation is related to . Unit: km,km,km,second + max_change_dep_lat_lon_ortime: [10.0, 15.0, 15.0, 1.0] # the change of dep,lat,lon,ortime do not exceed max_change. Unit: km,km,km,second + max_iterations : 201 # maximum number of iterations for relocation + tol_gradient : 0.0001 # if the norm of gradient is smaller than the tolerance, the iteration of relocation terminates + + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time : true # 'yes' for using absolute traveltime data to update ortime and location; 'no' for not using (no need to set parameters in this section) + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + use_cs_time : false # 'yes' for using common source differential traveltime data to update ortime and location; 'no' for not using (no need to set parameters in this section) + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time : false # 'yes' for using common receiver differential traveltime data to update ortime and location; 'no' for not using (no need to set parameters in this section) diff --git a/examples/eg2_earthquake_location/3_input_params/input_params_signal.yaml b/examples/eg2_earthquake_location/3_input_params/input_params_signal.yaml new file mode 100644 index 0000000..376d749 --- /dev/null +++ b/examples/eg2_earthquake_location/3_input_params/input_params_signal.yaml @@ -0,0 +1,50 @@ +version: 3 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-10, 50] # depth in km + min_max_lat: [0, 2] # latitude in degree + min_max_lon: [0, 2] # longitude in degree + n_rtp: [61, 61, 61] # number of nodes in depth,latitude,longitude direction + +################################################# +# traveltime data file path # +################################################# +source: + src_rec_file: 1_src_rec_files/src_rec_config.dat # source receiver file path + swap_src_rec: true # swap source and receiver + +################################################# +# initial model file path # +################################################# +model: + init_model_path: 2_models/model_ckb_N61_61_61.h5 # path to initial model file + +################################################# +# parallel computation settings # +################################################# +parallel: # parameters for parallel computation + n_sims: 8 # number of simultanoues runs (parallel the sources) + ndiv_rtp: [1, 1, 1] # number of subdivision on each direction (parallel the computional domain) + +############################################ +# output file setting # +############################################ +output_setting: + output_dir: OUTPUT_FILES/OUTPUT_FILES_signal # path to output director (default is ./OUTPUT_FILES/) + output_final_model: true # output merged final model (final_model.h5) or not. + output_in_process: false # output model at each inv iteration or not. + output_in_process_data: false # output src_rec_file at each inv iteration or not. + output_file_format: 0 + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion + earthquake relocation +run_mode: 0 diff --git a/examples/eg2_earthquake_location/README.md b/examples/eg2_earthquake_location/README.md new file mode 100644 index 0000000..8d2cf5b --- /dev/null +++ b/examples/eg2_earthquake_location/README.md @@ -0,0 +1,29 @@ +# earthquake location + +This is a toy model to invert traveltimes for locating earthquakes (Figure 8a.) + +Reference: +[1] J. Chen, M. Nagaso, M. Xu, and P. Tong, TomoATT: An open-source package for Eikonal equation-based adjoint-state traveltime tomography for seismic velocity and azimuthal anisotropy, submitted. +https://doi.org/10.48550/arXiv.2412.00031 + +Python modules are required to initiate the inversion and to plot final results: +- h5py +- PyTomoAT +- Pygmt +- gmt + +Run this example: + +1. Run bash script `bash run_this_example.sh` to execute the test. + +2. After inversion, run `plot_output.py` to plot the results. + +The initial and true models: + +![](img/model_setting.jpg) + +The location results: + +![](img/model_loc.jpg) + + diff --git a/examples/eg2_earthquake_location/assign_gaussian_noise.py b/examples/eg2_earthquake_location/assign_gaussian_noise.py new file mode 100644 index 0000000..354e0dd --- /dev/null +++ b/examples/eg2_earthquake_location/assign_gaussian_noise.py @@ -0,0 +1,30 @@ +from pytomoatt.src_rec import SrcRec + +class AssignNoise: + def __init__(self, in_fname, out_fname): + self.in_fname = in_fname + self.out_fname = out_fname + self.sr = SrcRec.read(self.in_fname) + + def assign_noise_for_tt(self, noise_level=0.1): + self.sr.add_noise(noise_level) + + def assign_noise_for_src(self, lat_pert=0.1, lon_pert=0.1, dep_pert=10, tau_pert=0.5): + self.sr.add_noise_to_source(lat_pert, lon_pert, dep_pert, tau_pert) + +if __name__ == "__main__": + in_fname = "OUTPUT_FILES/OUTPUT_FILES_signal/src_rec_file_forward.dat" # input source receiver file + out_fname = "OUTPUT_FILES/OUTPUT_FILES_signal/src_rec_file_forward_errloc.dat" # output source receiver file + sigma = 0.1 # noise level in seconds + lat_pert = 0.1 # assign noise for latitude in degrees + lon_pert = 0.1 # assign noise for longitude in degrees + dep_pert = 10 # assign noise for depth in km + tau_pert = 0.5 # assign noise for origin time in seconds + # Initialize the instance + an = AssignNoise(in_fname, out_fname) + # Assign noise for travel time + an.assign_noise_for_tt(sigma) + # Assign noise for source + an.assign_noise_for_src(lat_pert, lon_pert, dep_pert, tau_pert) + # Write the output file + an.sr.write(out_fname) diff --git a/examples/eg2_earthquake_location/plot_output.py b/examples/eg2_earthquake_location/plot_output.py new file mode 100644 index 0000000..c4b7922 --- /dev/null +++ b/examples/eg2_earthquake_location/plot_output.py @@ -0,0 +1,254 @@ +# %% +import pygmt +pygmt.config(FONT="16p", IO_SEGMENT_MARKER="<<<") + +import os + +# %% +from pytomoatt.model import ATTModel +from pytomoatt.data import ATTData +import numpy as np + +# %% +# read models + +Ngrid = [61,61,61] +data_file = '2_models/model_init_N%d_%d_%d.h5'%(Ngrid[0],Ngrid[1],Ngrid[2]) +par_file = '3_input_params/input_params_signal.yaml' +model = ATTModel.read(data_file, par_file) +initial_model = model.to_xarray() + +data_file = '2_models/model_ckb_N%d_%d_%d.h5'%(Ngrid[0],Ngrid[1],Ngrid[2]) +model = ATTModel.read(data_file, par_file) +ckb_model = model.to_xarray() + +# initial model +depth = 10.0 +vel_init = initial_model.interp_dep(depth, field='vel') +start = [1.25,0]; end = [1.25,2] +vel_init_sec = initial_model.interp_sec(start, end, field='vel', val = 1) + +# checkerboard model +vel_ckb = ckb_model.interp_dep(depth, field='vel') # lon = [:,0], lat = [:,1], vel = [:,2] +vel_ckb_sec = ckb_model.interp_sec(start, end, field='vel', val = 1) + +# anisotropic arrow +samp_interval = 3 +length = 7 +width = 0.1 +ani_thd = 0.02 + +ani_ckb_phi = ckb_model.interp_dep(depth, field='phi', samp_interval=samp_interval) +ani_ckb_epsilon = ckb_model.interp_dep(depth, field='epsilon', samp_interval=samp_interval) +ani_ckb = np.hstack([ani_ckb_phi, ani_ckb_epsilon[:,2].reshape(-1, 1)*length, np.ones((ani_ckb_epsilon.shape[0],1))*width]) # lon, lat, angle, length, width +idx = np.where(ani_ckb_epsilon[:,2] > ani_thd) +ani_ckb = ani_ckb[idx[0],:] + +try: + os.mkdir('img') +except: + pass + +# %% +# read src_rec_file for data +from pytomoatt.src_rec import SrcRec + +sr = SrcRec.read('1_src_rec_files/src_rec_config.dat') +station = sr.receivers[['stlo','stla','stel']].values.T +true_loc = sr.sources[['evlo','evla','evdp']].values.T +earthquake = true_loc + +sr = SrcRec.read('OUTPUT_FILES/OUTPUT_FILES_signal/src_rec_file_forward_errloc.dat') +init_loc = sr.sources[['evlo','evla','evdp']].values.T + +# %% +# categorize earthquakes +ev_idx1 = [] +ev_idx2 = [] +ev_idx3 = [] +for i in range(earthquake.shape[1]): + dep = earthquake[2,i] + if dep < 15: + ev_idx1.append(i) + elif dep < 25: + ev_idx2.append(i) + elif dep < 35: + ev_idx3.append(i) + +# %% +# plot the model setting +fig = pygmt.Figure() + +region = [0,2,0,2] +frame = ["xa1","ya1"] +projection = "M10c" +spacing = 0.04 + +vel_range = 20 + +# -------------- initial model and earthquake location -------------- +fig.basemap(region=region, frame=["xa1","ya1","+tInitial model and locations"], projection=projection) +# velocity perturbation +pygmt.makecpt(cmap="../utils/svel13_chen.cpt", series=[-vel_range, vel_range], background=True, reverse=False) +x = vel_ckb[:,0]; y = vel_ckb[:,1]; value = (vel_ckb[:,2] - vel_init[:,2])/vel_init[:,2] * 100 +grid = pygmt.surface(x=x, y=y, z=value, spacing=spacing,region=region) +fig.grdimage(grid = grid) +# earthquakes +fig.plot(x = init_loc[0,ev_idx1], y = init_loc[1,ev_idx1], style = "c0.1c", fill = "red") +fig.plot(x = init_loc[0,ev_idx2], y = init_loc[1,ev_idx2], style = "c0.1c", fill = "green") +fig.plot(x = init_loc[0,ev_idx3], y = init_loc[1,ev_idx3], style = "c0.1c", fill = "black") + +# stations +fig.plot(x = station[0,:], y = station[1,:], style = "t0.4c", fill = "blue", pen = "black", label = "Station") + +# anisotropic arrow +fig.plot(ani_ckb, style='j', fill='yellow1', pen='0.5p,black') + +fig.shift_origin(xshift=11) + +fig.basemap(region=[0,40,0,2], frame=["xa20+lDepth (km)","ya1","Nswe"], projection="X2c/10c") +x = vel_ckb_sec[:,3]; y = vel_ckb_sec[:,1]; value = (vel_ckb_sec[:,4] - vel_init_sec[:,4])/vel_init_sec[:,4] * 100 +grid = pygmt.surface(x=x, y=y, z=value, spacing="1/0.04",region=[0,40,0,2]) +fig.grdimage(grid = grid) + +# earthquakes +fig.plot(x = init_loc[2,ev_idx1], y = init_loc[1,ev_idx1], style = "c0.1c", fill = "red") +fig.plot(x = init_loc[2,ev_idx2], y = init_loc[1,ev_idx2], style = "c0.1c", fill = "green") +fig.plot(x = init_loc[2,ev_idx3], y = init_loc[1,ev_idx3], style = "c0.1c", fill = "black") + + +fig.shift_origin(xshift=4) + + +# -------------- true model and earthquake location -------------- +fig.basemap(region=region, frame=["xa1","ya1","+tTrue model and locations"], projection=projection) +# velocity perturbation +pygmt.makecpt(cmap="../utils/svel13_chen.cpt", series=[-vel_range, vel_range], background=True, reverse=False) +x = vel_ckb[:,0]; y = vel_ckb[:,1]; value = (vel_ckb[:,2] - vel_init[:,2])/vel_init[:,2] * 100 +grid = pygmt.surface(x=x, y=y, z=value, spacing=spacing,region=region) +fig.grdimage(grid = grid) +# earthquakes +fig.plot(x = earthquake[0,ev_idx1], y = earthquake[1,ev_idx1], style = "c0.1c", fill = "red") +fig.plot(x = earthquake[0,ev_idx2], y = earthquake[1,ev_idx2], style = "c0.1c", fill = "green") +fig.plot(x = earthquake[0,ev_idx3], y = earthquake[1,ev_idx3], style = "c0.1c", fill = "black") + +# stations +# fig.plot(x = loc_st[0,:], y = loc_st[1,:], style = "t0.4c", fill = "blue", pen = "black", label = "Station") + +# anisotropic arrow +fig.plot(ani_ckb, style='j', fill='yellow1', pen='0.5p,black') + +fig.shift_origin(xshift=11) + +fig.basemap(region=[0,40,0,2], frame=["xa20+lDepth (km)","ya1","Nswe"], projection="X2c/10c") +x = vel_ckb_sec[:,3]; y = vel_ckb_sec[:,1]; value = (vel_ckb_sec[:,4] - vel_init_sec[:,4])/vel_init_sec[:,4] * 100 +grid = pygmt.surface(x=x, y=y, z=value, spacing="1/0.04",region=[0,40,0,2]) +fig.grdimage(grid = grid) + +# earthquakes +fig.plot(x = earthquake[2,ev_idx1], y = earthquake[1,ev_idx1], style = "c0.1c", fill = "red") +fig.plot(x = earthquake[2,ev_idx2], y = earthquake[1,ev_idx2], style = "c0.1c", fill = "green") +fig.plot(x = earthquake[2,ev_idx3], y = earthquake[1,ev_idx3], style = "c0.1c", fill = "black") + + +# ------------------- colorbar ------------------- +fig.shift_origin(xshift=-11, yshift=-1.5) +fig.colorbar(frame = ["a%f"%(vel_range),"x+ldlnVp (%)"], position="+e+w4c/0.3c+h") + +fig.shift_origin(xshift=6, yshift=-1) +fig.basemap(region=[0,1,0,1], frame=["wesn"], projection="X6c/1.5c") +ani = [ + [0.2, 0.6, 45, 0.02*length, width], # lon, lat, phi, epsilon, size + [0.5, 0.6, 45, 0.05*length, width], + [0.8, 0.6, 45, 0.10*length, width], + ] +fig.plot(ani, style='j', fill='yellow1', pen='0.5p,black') +fig.text(text=["0.02", "0.05", "0.10"], x=[0.2,0.5,0.8], y=[0.2]*3, font="16p,Helvetica", justify="CM") +fig.shift_origin(xshift= 11, yshift=2.5) + +fig.show() +fig.savefig('img/model_setting.png', dpi=300) + +# %% +# plot the location result + +# read models +tag = "loc" +data_file = "OUTPUT_FILES/OUTPUT_FILES_%s/final_model.h5"%(tag) +model = ATTModel.read(data_file, par_file) +inv_model = model.to_xarray() +vel_inv = inv_model.interp_dep(depth, field='vel') # lon = [:,0], lat = [:,1], vel = [:,2] +x = vel_inv[:,0]; y = vel_inv[:,1]; value = (vel_inv[:,2] - vel_init[:,2])/vel_init[:,2] * 100 +vel_inv_sec = inv_model.interp_sec(start, end, field='vel', val = 1) +x_sec = vel_inv_sec[:,3]; y_sec = vel_inv_sec[:,1]; value_sec = (vel_inv_sec[:,4] - vel_init_sec[:,4])/vel_init_sec[:,4] * 100 + +ani_inv_phi = inv_model.interp_dep(depth, field='phi', samp_interval=samp_interval) +ani_inv_epsilon = inv_model.interp_dep(depth, field='epsilon', samp_interval=samp_interval) +ani_inv = np.hstack([ani_inv_phi, ani_inv_epsilon[:,2].reshape(-1, 1)*length, np.ones((ani_inv_epsilon.shape[0],1))*width]) # lon, lat, angle, length, width +idx = np.where(ani_inv_epsilon[:,2] > ani_thd) +ani_inv = ani_inv[idx[0],:] + +sr = SrcRec.read('OUTPUT_FILES/OUTPUT_FILES_loc/src_rec_file_reloc_0201.dat') +re_loc = sr.sources[['evlo','evla','evdp']].values.T + +# plot the inversion result + +fig = pygmt.Figure() + +region = [0,2,0,2] +frame = ["xa1","ya1","+tLocation results"] +projection = "M10c" +spacing = 0.04 + +vel_range = 20 + +# -------------- checkerboard model -------------- +fig.basemap(region=region, frame=frame, projection=projection) +# velocity perturbation +pygmt.makecpt(cmap="../utils/svel13_chen.cpt", series=[-vel_range, vel_range], background=True, reverse=False) +x = vel_inv[:,0]; y = vel_inv[:,1]; value = (vel_inv[:,2] - vel_init[:,2])/vel_init[:,2] * 100 +grid = pygmt.surface(x=x, y=y, z=value, spacing=spacing,region=region) +fig.grdimage(grid = grid) +# earthquakes +fig.plot(x = re_loc[0,ev_idx1], y = re_loc[1,ev_idx1], style = "c0.1c", fill = "red") +fig.plot(x = re_loc[0,ev_idx2], y = re_loc[1,ev_idx2], style = "c0.1c", fill = "green") +fig.plot(x = re_loc[0,ev_idx3], y = re_loc[1,ev_idx3], style = "c0.1c", fill = "black") + +# stations +# fig.plot(x = loc_st[0,:], y = loc_st[1,:], style = "t0.4c", fill = "blue", pen = "black", label = "Station") + +# anisotropic arrow +fig.plot(ani_inv, style='j', fill='yellow1', pen='0.5p,black') + +fig.shift_origin(xshift=11) + +fig.basemap(region=[0,40,0,2], frame=["xa20+lDepth (km)","ya1","Nswe"], projection="X2c/10c") +x = vel_inv_sec[:,3]; y = vel_inv_sec[:,1]; value = (vel_inv_sec[:,4] - vel_init_sec[:,4])/vel_init_sec[:,4] * 100 +grid = pygmt.surface(x=x, y=y, z=value, spacing="1/0.04",region=[0,40,0,2]) +fig.grdimage(grid = grid) + +# earthquakes +fig.plot(x = re_loc[2,ev_idx1], y = re_loc[1,ev_idx1], style = "c0.1c", fill = "red") +fig.plot(x = re_loc[2,ev_idx2], y = re_loc[1,ev_idx2], style = "c0.1c", fill = "green") +fig.plot(x = re_loc[2,ev_idx3], y = re_loc[1,ev_idx3], style = "c0.1c", fill = "black") + +# ------------------- colorbar ------------------- +fig.shift_origin(xshift=-11, yshift=-1.5) +fig.colorbar(frame = ["a%f"%(vel_range),"x+ldlnVp (%)"], position="+e+w4c/0.3c+h") + +fig.shift_origin(xshift=6, yshift=-1) +fig.basemap(region=[0,1,0,1], frame=["wesn"], projection="X6c/1.5c") +ani = [ + [0.2, 0.6, 45, 0.02*length, width], # lon, lat, phi, epsilon, size + [0.5, 0.6, 45, 0.05*length, width], + [0.8, 0.6, 45, 0.10*length, width], + ] +fig.plot(ani, style='j', fill='yellow1', pen='0.5p,black') +fig.text(text=["0.02", "0.05", "0.10"], x=[0.2,0.5,0.8], y=[0.2]*3, font="16p,Helvetica", justify="CM") +fig.shift_origin(xshift= 11, yshift=2.5) + + +fig.show() +fig.savefig('img/model_%s.png'%(tag), dpi=300) + + diff --git a/examples/eg2_earthquake_location/prepare_input_files.py b/examples/eg2_earthquake_location/prepare_input_files.py new file mode 100644 index 0000000..2c3bf9d --- /dev/null +++ b/examples/eg2_earthquake_location/prepare_input_files.py @@ -0,0 +1,61 @@ +import numpy as np +import os +import sys +try: + from pytomoatt.checkerboard import Checker + from pytomoatt.src_rec import SrcRec + from pytomoatt.model import ATTModel +except: + print("ERROR: ATTModel not found. Please install pytomoatt first." + "See https://tomoatt.github.io/PyTomoATT/installation.html for details.") + sys.exit(1) + + +class BuildInitialModel(): + def __init__(self, par_file="./3_input_params/input_params_signal.yaml", output_dir="2_models"): + """ + Build initial model for tomography inversion + """ + self.am = ATTModel(par_file) + self.output_dir = output_dir + + def build_initial_model(self, vel_min=5.0, vel_max=8.0): + """ + Build initial model for tomography inversion + """ + self.am.vel[self.am.depths < 0, :, :] = vel_min + idx = np.where((0 <= self.am.depths) & (self.am.depths < 40.0))[0] + self.am.vel[idx, :, :] = np.linspace(vel_min, vel_max, idx.size)[::-1][:, np.newaxis, np.newaxis] + self.am.vel[self.am.depths >= 40.0, :, :] = vel_max + + +def build_ckb_model(output_dir="2_models"): + cbk = Checker(f'{output_dir}/model_init_N61_61_61.h5', para_fname="./3_input_params/input_params_signal.yaml") + cbk.checkerboard( + n_pert_x=2, n_pert_y=2, n_pert_z=2, + pert_vel=0.2, pert_ani=0.1, ani_dir=60.0, + lim_x=[0.5, 1.5], lim_y=[0.5, 1.5], lim_z=[0, 40] + ) + cbk.write(f'{output_dir}/model_ckb_N61_61_61.h5') + + +if __name__ == "__main__": + # download src_rec_file + url = 'https://zenodo.org/records/14053821/files/src_rec_config.dat' + path = "1_src_rec_files/src_rec_config.dat" + os.makedirs(os.path.dirname(path), exist_ok=True) + if not os.path.exists(path): + sr = SrcRec.read(url) + sr.write(path) + + # build initial model + output_dir = "2_models" + os.makedirs(output_dir, exist_ok=True) + + bim = BuildInitialModel(output_dir=output_dir) + bim.build_initial_model() + bim.am.write('{}/model_init_N{:d}_{:d}_{:d}.h5'.format(bim.output_dir, *bim.am.n_rtp)) + + build_ckb_model(output_dir) + + diff --git a/examples/eg2_earthquake_location/run_this_example.sh b/examples/eg2_earthquake_location/run_this_example.sh new file mode 100644 index 0000000..9d0bbe9 --- /dev/null +++ b/examples/eg2_earthquake_location/run_this_example.sh @@ -0,0 +1,27 @@ +#!/bin/bash + + +# Step 1: Generate necessary input files +python prepare_input_files.py + +# Step 2: Run forward modeling +# # for WSL +# mpirun -n 8 --allow-run-as-root --oversubscribe ../../build/bin/TOMOATT -i 3_input_params/input_params_signal.yaml +# # for Linux +# mpirun -n 8 ../../build/bin/TOMOATT -i 3_input_params/input_params_signal.yaml +# for conda install +mpirun -n 8 TOMOATT -i 3_input_params/input_params_signal.yaml + +# Step 3: Assign data noise and location perturbation to the observational data +python assign_gaussian_noise.py + +# Step 4: Do relocation +# # for WSL +# mpirun -n 8 --allow-run-as-root --oversubscribe ../../build/bin/TOMOATT -i 3_input_params/input_params_loc.yaml +# # for Linux +# mpirun -n 8 ../../build/bin/TOMOATT -i 3_input_params/input_params_loc.yaml +# for conda install +mpirun -n 8 TOMOATT -i 3_input_params/input_params_loc.yaml + +# Step 5 (Optional): Plot the results +# python plot_output.py \ No newline at end of file diff --git a/examples/eg3_joint_inversion/3_input_params/input_params_joint_step1.yaml b/examples/eg3_joint_inversion/3_input_params/input_params_joint_step1.yaml new file mode 100644 index 0000000..974227e --- /dev/null +++ b/examples/eg3_joint_inversion/3_input_params/input_params_joint_step1.yaml @@ -0,0 +1,114 @@ +version: 3 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-10, 50] # depth in km + min_max_lat: [0, 2] # latitude in degree + min_max_lon: [0, 2] # longitude in degree + n_rtp: [61, 61, 61] # number of nodes in depth,latitude,longitude direction + +################################################# +# traveltime data file path # +################################################# +source: + src_rec_file: OUTPUT_FILES/OUTPUT_FILES_signal/src_rec_file_forward_errloc.dat # source receiver file path + swap_src_rec: true # swap source and receiver + +################################################# +# initial model file path # +################################################# +model: + init_model_path: 2_models/model_init_N61_61_61.h5 # path to initial model file + +################################################# +# parallel computation settings # +################################################# +parallel: # parameters for parallel computation + n_sims: 8 # number of simultanoues runs (parallel the sources) + ndiv_rtp: [1, 1, 1] # number of subdivision on each direction (parallel the computional domain) + +############################################ +# output file setting # +############################################ +output_setting: + output_dir: OUTPUT_FILES/OUTPUT_FILES_joint_step1 # path to output director (default is ./OUTPUT_FILES/) + output_final_model: true # output merged final model (final_model.h5) or not. + output_in_process: false # output model at each inv iteration or not. + output_in_process_data: false # output src_rec_file at each inv iteration or not. + output_file_format: 0 + +# output files: +# File: 'out_data_grid.h5'. Keys: ['Mesh']['elem_conn'], element index; +# ['Mesh']['node_coords_p'], phi coordinates of nodes; +# ['Mesh']['node_coords_t'], theta coordinates of nodes; +# ['Mesh']['node_coords_r'], r coordinates of nodes; +# ['Mesh']['node_coords_x'], phi coordinates of elements; +# ['Mesh']['node_coords_y'], theta coordinates of elements; +# ['Mesh']['node_coords_z'], r coordinates of elements; +# File: 'out_data_sim_group_0'. Keys: ['model']['vel_inv_XXXX'], velocity model at iteration XXXX; +# ['model']['xi_inv_XXXX'], xi model at iteration XXXX; +# ['model']['eta_inv_XXXX'], eta model at iteration XXXX +# ['model']['Ks_inv_XXXX'], sensitivity kernel related to slowness at iteration XXXX +# ['model']['Kxi_inv_XXXX'], sensitivity kernel related to xi at iteration XXXX +# ['model']['Keta_inv_XXXX'], sensitivity kernel related to eta at iteration XXXX +# ['model']['Ks_density_inv_XXXX'], kernel density of Ks at iteration XXXX +# ['model']['Kxi_density_inv_XXXX'], kernel density of Kxi at iteration XXXX +# ['model']['Keta_density_inv_XXXX'], kernel density of Keta at iteration XXXX +# ['model']['Ks_over_Kden_inv_XXXX'], slowness kernel over kernel density at iteration XXXX +# ['model']['Kxi_over_Kden_inv_XXXX'], xi kernel over kernel density at iteration XXXX +# ['model']['Keta_over_Kden_inv_XXXX'], eta kernel over kernel density at iteration XXXX +# ['model']['Ks_update_inv_XXXX'], slowness kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Kxi_update_inv_XXXX'], xi kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Keta_update_inv_XXXX'], eta kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['1dinv']['vel_1dinv_inv_XXXX'], 2d velocity model at iteration XXXX, in 1d inversion mode +# ['1dinv']['r_1dinv'], r coordinates (depth), in 1d inversion mode +# ['1dinv']['t_1dinv'], t coordinates (epicenter distance), in 1d inversion mode +# File: 'src_rec_file_step_XXXX.dat' or 'src_rec_file_forward.dat'. The synthetic traveltime data file. +# File: 'final_model.h5'. Keys: ['eta'], ['xi'], ['vel'], the final model. +# File: 'middle_model_step_XXXX.h5'. Keys: ['eta'], ['xi'], ['vel'], the model at step XXXX. +# File: 'inversion_grid.txt'. The location of inversion grid nodes +# File: 'objective_function.txt'. The objective function value at each iteration +# File: 'out_data_sim_group_X'. Keys: ['src_YYYY']['time_field_inv_XXXX'], traveltime field of source YYYY at iteration XXXX; +# ['src_YYYY']['adjoint_field_inv_XXXX'], adjoint field of source YYYY at iteration XXXX; +# ['1dinv']['time_field_1dinv_YYYY_inv_XXXX'], 2d traveltime field of source YYYY at iteration XXXX, in 1d inversion mode +# ['1dinv']['adjoint_field_1dinv_YYYY_inv_XXXX'], 2d adjoint field of source YYYY at iteration XXXX, in 1d inversion mode + + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion + earthquake relocation +# 4 for 1d model inversion +run_mode: 2 + +################################################# +# relocation parameters setting # +################################################# +relocation: # update earthquake hypocenter and origin time (when run_mode : 2 and 3) + min_Ndata: 4 # if the number of data of the earthquake is less than , the earthquake will not be relocated. defaut value: 4 + + # relocation_strategy + step_length : 0.01 # initial step length of relocation perturbation. 0.01 means maximum 1% perturbation for each iteration. + step_length_decay : 0.9 # if objective function increase, step size -> step length * step_length_decay. default: 0.9 + rescaling_dep_lat_lon_ortime: [10.0, 15.0, 15.0, 1.0] # The perturbation is related to . Unit: km,km,km,second + max_change_dep_lat_lon_ortime: [10.0, 15.0, 15.0, 1.0] # the change of dep,lat,lon,ortime do not exceed max_change. Unit: km,km,km,second + max_iterations : 50 # maximum number of iterations for relocation + tol_gradient : 0.0001 # if the norm of gradient is smaller than the tolerance, the iteration of relocation terminates + + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time : true # 'yes' for using absolute traveltime data to update ortime and location; 'no' for not using (no need to set parameters in this section) + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + use_cs_time : false # 'yes' for using common source differential traveltime data to update ortime and location; 'no' for not using (no need to set parameters in this section) + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time : true # 'yes' for using common receiver differential traveltime data to update ortime and location; 'no' for not using (no need to set parameters in this section) diff --git a/examples/eg3_joint_inversion/3_input_params/input_params_joint_step2.yaml b/examples/eg3_joint_inversion/3_input_params/input_params_joint_step2.yaml new file mode 100644 index 0000000..8dd4d8e --- /dev/null +++ b/examples/eg3_joint_inversion/3_input_params/input_params_joint_step2.yaml @@ -0,0 +1,312 @@ +version: 3 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-10, 50] # depth in km + min_max_lat: [0, 2] # latitude in degree + min_max_lon: [0, 2] # longitude in degree + n_rtp: [61, 61, 61] # number of nodes in depth,latitude,longitude direction + +################################################# +# traveltime data file path # +################################################# +source: + src_rec_file: OUTPUT_FILES/OUTPUT_FILES_joint_step1/src_rec_file_reloc_0050_obs.dat # source receiver file path + swap_src_rec: true # swap source and receiver (only valid for regional source and receiver, those of tele remain unchanged) + +################################################# +# initial model file path # +################################################# +model: + init_model_path: 2_models/model_init_N61_61_61.h5 # path to initial model file +# model_1d_name: dummy_model_1d_name # 1D model name used in teleseismic 2D solver (iasp91, ak135, user_defined is available), defined in include/1d_model.h + +################################################# +# parallel computation settings # +################################################# +parallel: # parameters for parallel computation + n_sims: 8 # number of simultanoues runs (parallel the sources) + ndiv_rtp: [1, 1, 1] # number of subdivision on each direction (parallel the computional domain) + nproc_sub: 1 # number of processors for sweep parallelization (parallel the fast sweep method) + use_gpu: false # true if use gpu (EXPERIMENTAL) + +############################################ +# output file setting # +############################################ +output_setting: + output_dir: OUTPUT_FILES/OUTPUT_FILES_joint_step2 # path to output director (default is ./OUTPUT_FILES/) + output_source_field: false # True: output the traveltime field and adjoint field of all sources at each iteration. Default: false. File: 'out_data_sim_group_X'. + output_kernel: false # True: output sensitivity kernel and kernel density. Default: false. File: 'out_data_sim_group_X'. + output_final_model: true # True: output merged final model. This file can be used as the input model for TomoATT. Default: true. File: 'model_final.h5'. + output_middle_model: false # True: output merged intermediate models during inversion. This file can be used as the input model for TomoATT. Default: false. File: 'middle_model_step_XXXX.h5' + output_in_process: false # True: output at each inv iteration, otherwise, only output step 0, Niter-1, Niter. Default: true. File: 'out_data_sim_group_0'. + output_in_process_data: false # True: output src_rec_file at each inv iteration, otherwise, only output step 0, Niter-2, Niter-1. Default: true. File: 'src_rec_file_step_XXXX.dat' + single_precision_output: false # True: output results in single precision. Default: false. + verbose_output_level: 0 # output internal parameters, (to do). + output_file_format: 0 # 0: hdf5, 1: ascii + +# output files: +# File: 'out_data_grid.h5'. Keys: ['Mesh']['elem_conn'], element index; +# ['Mesh']['node_coords_p'], phi coordinates of nodes; +# ['Mesh']['node_coords_t'], theta coordinates of nodes; +# ['Mesh']['node_coords_r'], r coordinates of nodes; +# ['Mesh']['node_coords_x'], phi coordinates of elements; +# ['Mesh']['node_coords_y'], theta coordinates of elements; +# ['Mesh']['node_coords_z'], r coordinates of elements; +# File: 'out_data_sim_group_0'. Keys: ['model']['vel_inv_XXXX'], velocity model at iteration XXXX; +# ['model']['xi_inv_XXXX'], xi model at iteration XXXX; +# ['model']['eta_inv_XXXX'], eta model at iteration XXXX +# ['model']['Ks_inv_XXXX'], sensitivity kernel related to slowness at iteration XXXX +# ['model']['Kxi_inv_XXXX'], sensitivity kernel related to xi at iteration XXXX +# ['model']['Keta_inv_XXXX'], sensitivity kernel related to eta at iteration XXXX +# ['model']['Ks_density_inv_XXXX'], kernel density of Ks at iteration XXXX +# ['model']['Kxi_density_inv_XXXX'], kernel density of Kxi at iteration XXXX +# ['model']['Keta_density_inv_XXXX'], kernel density of Keta at iteration XXXX +# ['model']['Ks_over_Kden_inv_XXXX'], slowness kernel over kernel density at iteration XXXX +# ['model']['Kxi_over_Kden_inv_XXXX'], xi kernel over kernel density at iteration XXXX +# ['model']['Keta_over_Kden_inv_XXXX'], eta kernel over kernel density at iteration XXXX +# ['model']['Ks_update_inv_XXXX'], slowness kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Kxi_update_inv_XXXX'], xi kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Keta_update_inv_XXXX'], eta kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['1dinv']['vel_1dinv_inv_XXXX'], 2d velocity model at iteration XXXX, in 1d inversion mode +# ['1dinv']['r_1dinv'], r coordinates (depth), in 1d inversion mode +# ['1dinv']['t_1dinv'], t coordinates (epicenter distance), in 1d inversion mode +# File: 'src_rec_file_step_XXXX.dat' or 'src_rec_file_forward.dat'. The synthetic traveltime data file. +# File: 'final_model.h5'. Keys: ['eta'], ['xi'], ['vel'], the final model. +# File: 'middle_model_step_XXXX.h5'. Keys: ['eta'], ['xi'], ['vel'], the model at step XXXX. +# File: 'inversion_grid.txt'. The location of inversion grid nodes +# File: 'objective_function.txt'. The objective function value at each iteration +# File: 'out_data_sim_group_X'. Keys: ['src_YYYY']['time_field_inv_XXXX'], traveltime field of source YYYY at iteration XXXX; +# ['src_YYYY']['adjoint_field_inv_XXXX'], adjoint field of source YYYY at iteration XXXX; +# ['1dinv']['time_field_1dinv_YYYY_inv_XXXX'], 2d traveltime field of source YYYY at iteration XXXX, in 1d inversion mode +# ['1dinv']['adjoint_field_1dinv_YYYY_inv_XXXX'], 2d adjoint field of source YYYY at iteration XXXX, in 1d inversion mode + + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion + earthquake relocation +# 4 for 1d model inversion +run_mode: 3 + +have_tele_data: false # An error will be reported if false but source out of study region is used. Default: false. + + +################################################### +# model update parameters setting # +################################################### +model_update: + max_iterations: 40 # maximum number of inversion iterations + optim_method: 0 # optimization method. 0 : grad_descent, 1 : halve-stepping, 2 : lbfgs (EXPERIMENTAL) + + #common parameters for all optim methods + step_length: 0.02 # the initial step length of model perturbation. 0.01 means maximum 1% perturbation for each iteration. + + # parameters for optim_method 0 (gradient_descent) + optim_method_0: + step_method: 1 # the method to modulate step size. 0: according to objective function; 1: according to gradient direction + # if step_method:0. if objective function increase, step size -> step length * step_length_decay. + step_length_decay: 0.9 # default: 0.9 + # if step_method:1. if the angle between the current and the previous gradients is greater than step_length_gradient_angle, step size -> step length * step_length_change[0]. + # otherwise, step size -> step length * step_length_change[1]. + step_length_gradient_angle: 120 # default: 120.0 + step_length_change: [0.5, 1.2] # default: [0.5,1.2] + # Kdensity_coe is used to rescale the final kernel: kernel -> kernel / pow(density of kernel, Kdensity_coe). if Kdensity_coe > 0, the region with less data will be enhanced during the inversion + # e.g., if Kdensity_coe = 0, kernel remains upchanged; if Kdensity_coe = 1, kernel is fully normalized. 0.5 or less is recommended if really required. + Kdensity_coe: 0 # default: 0.0, limited range: 0.0 - 0.95 + + # parameters for optim_method 1 (halve-stepping) or 2 (lbfgs) + optim_method_1_2: + max_sub_iterations: 20 # maximum number of each sub-iteration + regularization_weight: 0.5 # weight value for regularization (lbfgs mode only) + coefs_regulalization_rtp: [1, 1, 1] # regularization coefficients for rtp (lbfgs mode only) + + # smoothing + smoothing: + smooth_method: 0 # 0: multiparametrization, 1: laplacian smoothing (EXPERIMENTAL) + l_smooth_rtp: [1, 1, 1] # smoothing coefficients for laplacian smoothing + + # parameters for smooth method 0 (multigrid model parametrization) + # inversion grid can be viewed in OUTPUT_FILES/inversion_grid.txt + n_inversion_grid: 5 # number of inversion grid sets + + uniform_inv_grid_dep: false # true if use uniform inversion grid for dep, false if use flexible inversion grid + uniform_inv_grid_lat: true # true if use uniform inversion grid for lat, false if use flexible inversion grid + uniform_inv_grid_lon: true # true if use uniform inversion grid for lon, false if use flexible inversion grid + + # -------------- uniform inversion grid setting -------------- + # settings for uniform inversion grid + n_inv_dep_lat_lon: [12, 9, 9] # number of the base inversion grid points + min_max_dep_inv: [-10, 50] # depth in km (Radius of the earth is defined in config.h/R_earth) + min_max_lat_inv: [0, 2] # latitude in degree + min_max_lon_inv: [0, 2] # longitude in degree + + # -------------- flexible inversion grid setting -------------- + # settings for flexible inversion grid + dep_inv: [-10, 0, 10, 20, 30, 40, 50, 60] # inversion grid for vel in depth (km) + lat_inv: [30, 30.2, 30.4, 30.6, 30.8, 31, 31.2, 31.4, 31.6, 31.8, 32] # inversion grid for vel in latitude (degree) + lon_inv: [30, 30.2, 30.4, 30.6, 30.8, 31, 31.2, 31.4, 31.6, 31.8, 32] # inversion grid for vel in longitude (degree) + trapezoid: [1, 0, 50] # usually set as [1.0, 0.0, 50.0] (default) + + # if we want to use another inversion grid for inverting anisotropy, set invgrid_ani: true (default: false) + invgrid_ani: false + + # ---------- uniform inversion grid setting for anisotropy ---------- + n_inv_dep_lat_lon_ani: [12, 11, 11] # number of the base inversion grid points + min_max_dep_inv_ani: [-7, 63] # depth in km (Radius of the earth is defined in config.h/R_earth) + min_max_lat_inv_ani: [30, 32] # latitude in degree + min_max_lon_inv_ani: [30, 32] # longitude in degree + + # ---------- flexible inversion grid setting for anisotropy ---------- + # settings for flexible inversion grid for anisotropy + dep_inv_ani: [-7, -3, 0, 3, 7, 12, 18, 25, 33, 42, 52, 63] # inversion grid for ani in depth (km) + lat_inv_ani: [30, 30.2, 30.4, 30.6, 30.8, 31, 31.2, 31.4, 31.6, 31.8, 32] # inversion grid for ani in latitude (degree) + lon_inv_ani: [30, 30.2, 30.4, 30.6, 30.8, 31, 31.2, 31.4, 31.6, 31.8, 32] # inversion grid for ani in longitude (degree) + trapezoid_ani: [1, 0, 50] # usually set as [1.0, 0.0, 50.0] (default) + + # Carefully change trapezoid and trapezoid_ani, if you really want to use trapezoid inversion grid, increasing the inversion grid spacing with depth to account for the worse data coverage in greater depths. + # The trapezoid_ inversion grid with index (i,j,k) in longitude, latitude, and depth is defined as: + # if dep_inv[k] < trapezoid[1], lon = lon_inv[i]; + # lat = lat_inv[j]; + # dep = dep_inv[k]; + # if trapezoid[1] <= dep_inv[k] < trapezoid[2], lon = mid_lon_inv+(lon_inv[i]-mid_lon_inv)*(dep_inv[k]-trapezoid[1])/(trapezoid[2]-trapezoid[1])*trapezoid[0]; + # lat = mid_lat_inv+(lat_inv[i]-mid_lat_inv)*(dep_inv[k]-trapezoid[1])/(trapezoid[2]-trapezoid[1])*trapezoid[0]; + # dep = dep_inv[k]; + # if trapezoid[2] <= dep_inv[k], lon = mid_lon_inv+(lon_inv[i]-mid_lon_inv)*trapezoid[0]; + # lat = mid_lat_inv+(lat_inv[i]-mid_lat_inv)*trapezoid[0]; + # dep = dep_inv[k]; + # The shape of trapezoid inversion gird (x) looks like: + # + # lon_inv[0] [1] [2] [3] [4] + # |<-------- (lon_inv[end] - lon_inv[0]) ---->| + # dep_inv[0] | x x x x x | + # | | + # dep_inv[1] | x x x x x | + # | | + # dep_inv[2] = trapezoid[1] / x x x x x \ + # / \ + # dep_inv[3] / x x x x x \ + # / \ + # dep_inv[4] = trapezoid[2] / x x x x x \ + # | | + # dep_inv[5] | x x x x x | + # | | + # dep_inv[6] | x x x x x | + # |<---- trapezoid[0]* (lon_inv[end] - lon_inv[0]) ------>| + + # inversion grid volume rescale (kernel -> kernel / volume of inversion grid mesh), + # this precondition may be carefully applied if the sizes of inversion grids are unbalanced + invgrid_volume_rescale: false + + # path to station correction file (under development) + use_sta_correction: false + # initial_sta_correction_file: dummy_sta_correction_file # the path of initial station correction + step_length_sta_correction: 0.001 # step length relate to the update of station correction terms + + + # In the following data subsection, XXX_weight means a weight is assigned to the data, influencing the objective function and gradient + # XXX_weight : [d1,d2,w1,w2] means: + # if XXX < d1, weight = w1 + # if d1 <= XXX < d2, weight = w1 + (XXX-d1)/(d2-d1)*(w2-w1), (linear interpolation) + # if d2 <= XXX , weight = w2 + # You can easily set w1 = w2 = 1.0 to normalize the weight related to XXX. + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time: true # 'true' for using absolute traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1, 3, 1, 1] # XXX is the absolute traveltime residual (second) = abs(t^{obs}_{n,i} - t^{syn}_{n,j}) + distance_weight: [100, 200, 1, 1] # XXX is epicenter distance (km) between the source and receiver related to the data + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + use_cs_time: true # 'true' for using common source differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1, 3, 1, 1] # XXX is the common source differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{n,j} - t^{syn}_{n,i} + t^{syn}_{n,j}). + azimuthal_weight: [15, 30, 1, 1] # XXX is the azimuth difference between two separate stations related to the common source. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time: false # 'true' for using common receiver differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1, 3, 1, 1] # XXX is the common receiver differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{m,i} - t^{syn}_{n,i} + t^{syn}_{m,i}) + azimuthal_weight: [15, 30, 1, 1] # XXX is the azimuth difference between two separate sources related to the common receiver. + + # -------------- global weight of different types of data (to balance the weight of different data) -------------- + global_weight: + balance_data_weight: true # yes: over the total weight of the each type of the data. no: use original weight (below weight for each type of data needs to be set) + abs_time_weight: 1 # weight of absolute traveltime data after balance, default: 1.0 + cs_dif_time_local_weight: 1 # weight of common source differential traveltime data after balance, default: 1.0 + cr_dif_time_local_weight: 1 # weight of common receiver differential traveltime data after balance, default: 1.0 + teleseismic_weight: 1 # weight of teleseismic data after balance, default: 1.0 (exclude in this version) + + # -------------- inversion parameters -------------- + update_slowness : true # update slowness (velocity) or not. default: true + update_azi_ani : true # update azimuthal anisotropy (xi, eta) or not. default: false + + # -------------- for teleseismic inversion (under development) -------------- + # depth_taper : [d1,d2] means: + # if XXX < d1, kernel <- kernel * 0.0 + # if d1 <= XXX < d2, kernel <- kernel * (XXX-d1)/(d2-d1), (linear interpolation) + # if d2 <= XXX , kernel <- kernel * 1.0 + # You can easily set d1 = -200, d1 = -100 to remove this taper. + depth_taper : [-1e+07, -1e+07] + +################################################# +# relocation parameters setting # +################################################# +relocation: # update earthquake hypocenter and origin time (when run_mode : 2 and 3) + min_Ndata: 4 # if the number of data of the earthquake is less than , the earthquake will not be relocated. defaut value: 4 + + # relocation_strategy + step_length : 0.01 # initial step length of relocation perturbation. 0.01 means maximum 1% perturbation for each iteration. + step_length_decay : 0.9 # if objective function increase, step size -> step length * step_length_decay. default: 0.9 + rescaling_dep_lat_lon_ortime : [10, 15, 15, 1] # The perturbation is related to . Unit: km,km,km,second + max_change_dep_lat_lon_ortime : [10, 15, 15, 1] # the change of dep,lat,lon,ortime do not exceed max_change. Unit: km,km,km,second + max_iterations : 201 # maximum number of iterations for relocation + tol_gradient : 0.0001 # if the norm of gradient is smaller than the tolerance, the iteration of relocation terminates + + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time : true # 'yes' for using absolute traveltime data to update ortime and location; 'no' for not using (no need to set parameters in this section) + residual_weight : [1, 3, 1, 1] # XXX is the absolute traveltime residual (second) = abs(t^{obs}_{n,i} - t^{syn}_{n,j}) + distance_weight : [1, 3, 1, 1] # XXX is epicenter distance (km) between the source and receiver related to the data + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + use_cs_time : false # 'yes' for using common source differential traveltime data to update ortime and location; 'no' for not using (no need to set parameters in this section) + residual_weight : [1, 3, 1, 1] # XXX is the common source differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{n,j} - t^{syn}_{n,i} + t^{syn}_{n,j}). + azimuthal_weight : [100, 200, 1, 1] # XXX is the azimuth difference between two separate stations related to the common source. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time : true # 'yes' for using common receiver differential traveltime data to update ortime and location; 'no' for not using (no need to set parameters in this section) + residual_weight : [15, 30, 1, 1] # XXX is the common receiver differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{m,i} - t^{syn}_{n,i} + t^{syn}_{m,i}) + azimuthal_weight : [15, 30, 1, 1] # XXX is the azimuth difference between two separate sources related to the common receiver. + + + # -------------- global weight of different types of data (to balance the weight of different data) -------------- + global_weight: + balance_data_weight: true # yes: over the total weight of the each type of the data. no: use original weight (below weight for each type of data needs to be set) + abs_time_local_weight: 1 # weight of absolute traveltime data for relocation after balance, default: 1.0 + cs_dif_time_local_weight: 1 # weight of common source differential traveltime data for relocation after balance, default: 1.0 + cr_dif_time_local_weight: 1 # weight of common receiver differential traveltime data for relocation after balance, default: 1.0 + +#################################################################### +# inversion strategy for tomography and relocation # +#################################################################### +inversion_strategy: # update model parameters and earthquake hypocenter iteratively (when run_mode : 3) + + inv_mode : 1 # 0 for update model parameters and relocation iteratively. 1 for update model parameters and relocation simultaneously. + + # for inv_mode : 0, parameters below are required + inv_mode_0: # update model for steps, then update location for steps, and repeat the process for loops. + model_update_N_iter : 1 + relocation_N_iter : 1 + max_loop : 10 + + # for inv_mode : 1, parameters below are required + inv_mode_1: # update model and location simultaneously for loops. + max_loop : 40 diff --git a/examples/eg3_joint_inversion/3_input_params/input_params_joint_step3.yaml b/examples/eg3_joint_inversion/3_input_params/input_params_joint_step3.yaml new file mode 100644 index 0000000..60046e3 --- /dev/null +++ b/examples/eg3_joint_inversion/3_input_params/input_params_joint_step3.yaml @@ -0,0 +1,139 @@ +version: 3 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-10, 50] # depth in km + min_max_lat: [0, 2] # latitude in degree + min_max_lon: [0, 2] # longitude in degree + n_rtp: [61, 61, 61] # number of nodes in depth,latitude,longitude direction + +################################################# +# traveltime data file path # +################################################# +source: + src_rec_file: OUTPUT_FILES/OUTPUT_FILES_joint_step2/src_rec_file_inv_0039_reloc_0039_obs.dat # source receiver file path + swap_src_rec: true # swap source and receiver (only valid for regional source and receiver, those of tele remain unchanged) + +################################################# +# initial model file path # +################################################# +model: + init_model_path: OUTPUT_FILES/OUTPUT_FILES_joint_step2/final_model.h5 # path to initial model file +# model_1d_name: dummy_model_1d_name # 1D model name used in teleseismic 2D solver (iasp91, ak135, user_defined is available), defined in include/1d_model.h + +################################################# +# parallel computation settings # +################################################# +parallel: # parameters for parallel computation + n_sims: 8 # number of simultanoues runs (parallel the sources) + ndiv_rtp: [1, 1, 1] # number of subdivision on each direction (parallel the computional domain) + nproc_sub: 1 # number of processors for sweep parallelization (parallel the fast sweep method) + use_gpu: false # true if use gpu (EXPERIMENTAL) + +############################################ +# output file setting # +############################################ +output_setting: + output_dir: OUTPUT_FILES/OUTPUT_FILES_joint_step3 # path to output director (default is ./OUTPUT_FILES/) + output_source_field: false # True: output the traveltime field and adjoint field of all sources at each iteration. Default: false. File: 'out_data_sim_group_X'. + output_kernel: false # True: output sensitivity kernel and kernel density. Default: false. File: 'out_data_sim_group_X'. + output_final_model: true # True: output merged final model. This file can be used as the input model for TomoATT. Default: true. File: 'model_final.h5'. + output_middle_model: false # True: output merged intermediate models during inversion. This file can be used as the input model for TomoATT. Default: false. File: 'middle_model_step_XXXX.h5' + output_in_process: false # True: output at each inv iteration, otherwise, only output step 0, Niter-1, Niter. Default: true. File: 'out_data_sim_group_0'. + output_in_process_data: false # True: output src_rec_file at each inv iteration, otherwise, only output step 0, Niter-2, Niter-1. Default: true. File: 'src_rec_file_step_XXXX.dat' + single_precision_output: false # True: output results in single precision. Default: false. + verbose_output_level: 0 # output internal parameters, (to do). + output_file_format: 0 # 0: hdf5, 1: ascii + +# output files: +# File: 'out_data_grid.h5'. Keys: ['Mesh']['elem_conn'], element index; +# ['Mesh']['node_coords_p'], phi coordinates of nodes; +# ['Mesh']['node_coords_t'], theta coordinates of nodes; +# ['Mesh']['node_coords_r'], r coordinates of nodes; +# ['Mesh']['node_coords_x'], phi coordinates of elements; +# ['Mesh']['node_coords_y'], theta coordinates of elements; +# ['Mesh']['node_coords_z'], r coordinates of elements; +# File: 'out_data_sim_group_0'. Keys: ['model']['vel_inv_XXXX'], velocity model at iteration XXXX; +# ['model']['xi_inv_XXXX'], xi model at iteration XXXX; +# ['model']['eta_inv_XXXX'], eta model at iteration XXXX +# ['model']['Ks_inv_XXXX'], sensitivity kernel related to slowness at iteration XXXX +# ['model']['Kxi_inv_XXXX'], sensitivity kernel related to xi at iteration XXXX +# ['model']['Keta_inv_XXXX'], sensitivity kernel related to eta at iteration XXXX +# ['model']['Ks_density_inv_XXXX'], kernel density of Ks at iteration XXXX +# ['model']['Kxi_density_inv_XXXX'], kernel density of Kxi at iteration XXXX +# ['model']['Keta_density_inv_XXXX'], kernel density of Keta at iteration XXXX +# ['model']['Ks_over_Kden_inv_XXXX'], slowness kernel over kernel density at iteration XXXX +# ['model']['Kxi_over_Kden_inv_XXXX'], xi kernel over kernel density at iteration XXXX +# ['model']['Keta_over_Kden_inv_XXXX'], eta kernel over kernel density at iteration XXXX +# ['model']['Ks_update_inv_XXXX'], slowness kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Kxi_update_inv_XXXX'], xi kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Keta_update_inv_XXXX'], eta kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['1dinv']['vel_1dinv_inv_XXXX'], 2d velocity model at iteration XXXX, in 1d inversion mode +# ['1dinv']['r_1dinv'], r coordinates (depth), in 1d inversion mode +# ['1dinv']['t_1dinv'], t coordinates (epicenter distance), in 1d inversion mode +# File: 'src_rec_file_step_XXXX.dat' or 'src_rec_file_forward.dat'. The synthetic traveltime data file. +# File: 'final_model.h5'. Keys: ['eta'], ['xi'], ['vel'], the final model. +# File: 'middle_model_step_XXXX.h5'. Keys: ['eta'], ['xi'], ['vel'], the model at step XXXX. +# File: 'inversion_grid.txt'. The location of inversion grid nodes +# File: 'objective_function.txt'. The objective function value at each iteration +# File: 'out_data_sim_group_X'. Keys: ['src_YYYY']['time_field_inv_XXXX'], traveltime field of source YYYY at iteration XXXX; +# ['src_YYYY']['adjoint_field_inv_XXXX'], adjoint field of source YYYY at iteration XXXX; +# ['1dinv']['time_field_1dinv_YYYY_inv_XXXX'], 2d traveltime field of source YYYY at iteration XXXX, in 1d inversion mode +# ['1dinv']['adjoint_field_1dinv_YYYY_inv_XXXX'], 2d adjoint field of source YYYY at iteration XXXX, in 1d inversion mode + + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion + earthquake relocation +# 4 for 1d model inversion +run_mode: 2 + +have_tele_data: false # An error will be reported if false but source out of study region is used. Default: false. + + +################################################# +# relocation parameters setting # +################################################# +relocation: # update earthquake hypocenter and origin time (when run_mode : 2 and 3) + min_Ndata: 4 # if the number of data of the earthquake is less than , the earthquake will not be relocated. defaut value: 4 + + # relocation_strategy + step_length : 0.01 # initial step length of relocation perturbation. 0.01 means maximum 1% perturbation for each iteration. + step_length_decay : 0.9 # if objective function increase, step size -> step length * step_length_decay. default: 0.9 + rescaling_dep_lat_lon_ortime : [10, 15, 15, 1] # The perturbation is related to . Unit: km,km,km,second + max_change_dep_lat_lon_ortime : [10, 15, 15, 1] # the change of dep,lat,lon,ortime do not exceed max_change. Unit: km,km,km,second + max_iterations : 100 # maximum number of iterations for relocation + tol_gradient : 0.0001 # if the norm of gradient is smaller than the tolerance, the iteration of relocation terminates + + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time : false # 'yes' for using absolute traveltime data to update ortime and location; 'no' for not using (no need to set parameters in this section) + residual_weight : [1, 3, 1, 1] # XXX is the absolute traveltime residual (second) = abs(t^{obs}_{n,i} - t^{syn}_{n,j}) + distance_weight : [1, 3, 1, 1] # XXX is epicenter distance (km) between the source and receiver related to the data + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + use_cs_time : false # 'yes' for using common source differential traveltime data to update ortime and location; 'no' for not using (no need to set parameters in this section) + residual_weight : [1, 3, 1, 1] # XXX is the common source differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{n,j} - t^{syn}_{n,i} + t^{syn}_{n,j}). + azimuthal_weight : [100, 200, 1, 1] # XXX is the azimuth difference between two separate stations related to the common source. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time : true # 'yes' for using common receiver differential traveltime data to update ortime and location; 'no' for not using (no need to set parameters in this section) + residual_weight : [15, 30, 1, 1] # XXX is the common receiver differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{m,i} - t^{syn}_{n,i} + t^{syn}_{m,i}) + azimuthal_weight : [15, 30, 1, 1] # XXX is the azimuth difference between two separate sources related to the common receiver. + + + # -------------- global weight of different types of data (to balance the weight of different data) -------------- + global_weight: + balance_data_weight: true # yes: over the total weight of the each type of the data. no: use original weight (below weight for each type of data needs to be set) + abs_time_local_weight: 1 # weight of absolute traveltime data for relocation after balance, default: 1.0 + cs_dif_time_local_weight: 1 # weight of common source differential traveltime data for relocation after balance, default: 1.0 + cr_dif_time_local_weight: 1 # weight of common receiver differential traveltime data for relocation after balance, default: 1.0 diff --git a/examples/eg3_joint_inversion/3_input_params/input_params_signal.yaml b/examples/eg3_joint_inversion/3_input_params/input_params_signal.yaml new file mode 100644 index 0000000..376d749 --- /dev/null +++ b/examples/eg3_joint_inversion/3_input_params/input_params_signal.yaml @@ -0,0 +1,50 @@ +version: 3 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-10, 50] # depth in km + min_max_lat: [0, 2] # latitude in degree + min_max_lon: [0, 2] # longitude in degree + n_rtp: [61, 61, 61] # number of nodes in depth,latitude,longitude direction + +################################################# +# traveltime data file path # +################################################# +source: + src_rec_file: 1_src_rec_files/src_rec_config.dat # source receiver file path + swap_src_rec: true # swap source and receiver + +################################################# +# initial model file path # +################################################# +model: + init_model_path: 2_models/model_ckb_N61_61_61.h5 # path to initial model file + +################################################# +# parallel computation settings # +################################################# +parallel: # parameters for parallel computation + n_sims: 8 # number of simultanoues runs (parallel the sources) + ndiv_rtp: [1, 1, 1] # number of subdivision on each direction (parallel the computional domain) + +############################################ +# output file setting # +############################################ +output_setting: + output_dir: OUTPUT_FILES/OUTPUT_FILES_signal # path to output director (default is ./OUTPUT_FILES/) + output_final_model: true # output merged final model (final_model.h5) or not. + output_in_process: false # output model at each inv iteration or not. + output_in_process_data: false # output src_rec_file at each inv iteration or not. + output_file_format: 0 + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion + earthquake relocation +run_mode: 0 diff --git a/examples/eg3_joint_inversion/README.md b/examples/eg3_joint_inversion/README.md new file mode 100644 index 0000000..b6f0a61 --- /dev/null +++ b/examples/eg3_joint_inversion/README.md @@ -0,0 +1,29 @@ +# joint inversion + +This is a toy model to simultaneously update model parameters and locate earthquakes (Figure 8e.) + +Reference: +[1] J. Chen, M. Nagaso, M. Xu, and P. Tong, TomoATT: An open-source package for Eikonal equation-based adjoint-state traveltime tomography for seismic velocity and azimuthal anisotropy, submitted. +https://doi.org/10.48550/arXiv.2412.00031 + +Python modules are required to initiate the inversion and to plot final results: +- h5py +- PyTomoAT +- Pygmt +- gmt + +Run this example: + +1. Run bash script `bash run_this_example.sh` to execute the test. + +2. After inversion, run `plot_output.py` to plot the results. + +The initial and true models: + +![](img/model_setting.jpg) + +The inversion results: + +![](img/model_joint.jpg) + + diff --git a/examples/eg3_joint_inversion/assign_gaussian_noise.py b/examples/eg3_joint_inversion/assign_gaussian_noise.py new file mode 100644 index 0000000..22b4ddf --- /dev/null +++ b/examples/eg3_joint_inversion/assign_gaussian_noise.py @@ -0,0 +1,34 @@ +from pytomoatt.src_rec import SrcRec + +class AssignNoise: + def __init__(self, in_fname, out_fname): + self.in_fname = in_fname + self.out_fname = out_fname + self.sr = SrcRec.read(self.in_fname) + + def assign_noise_for_tt(self, noise_level=0.1): + self.sr.add_noise(noise_level) + + def assign_noise_for_src(self, lat_pert=0.1, lon_pert=0.1, dep_pert=10, tau_pert=0.5): + self.sr.add_noise_to_source(lat_pert, lon_pert, dep_pert, tau_pert) + +if __name__ == "__main__": + in_fname = "OUTPUT_FILES/OUTPUT_FILES_signal/src_rec_file_forward.dat" # input source receiver file + out_fname = "OUTPUT_FILES/OUTPUT_FILES_signal/src_rec_file_forward_errloc.dat" # output source receiver file + sigma = 0.1 # noise level in seconds + lat_pert = 0.1 # assign noise for latitude in degrees + lon_pert = 0.1 # assign noise for longitude in degrees + dep_pert = 10 # assign noise for depth in km + tau_pert = 0.5 # assign noise for origin time in seconds + + # Initialize the instance + an = AssignNoise(in_fname, out_fname) + + # Assign noise for travel time + an.assign_noise_for_tt(sigma) + + # Assign noise for source + an.assign_noise_for_src(lat_pert, lon_pert, dep_pert, tau_pert) + + # Write the output file + an.sr.write(out_fname) \ No newline at end of file diff --git a/examples/eg3_joint_inversion/plot_output.py b/examples/eg3_joint_inversion/plot_output.py new file mode 100644 index 0000000..e6d0cf1 --- /dev/null +++ b/examples/eg3_joint_inversion/plot_output.py @@ -0,0 +1,286 @@ +# %% +import pygmt +pygmt.config(FONT="16p", IO_SEGMENT_MARKER="<<<") + +import os + +# %% +from pytomoatt.model import ATTModel +from pytomoatt.data import ATTData +import numpy as np + +# %% +# read models + +Ngrid = [61,61,61] +data_file = '2_models/model_init_N%d_%d_%d.h5'%(Ngrid[0],Ngrid[1],Ngrid[2]) +par_file = '3_input_params/input_params_signal.yaml' +model = ATTModel.read(data_file, par_file) +initial_model = model.to_xarray() + +data_file = '2_models/model_ckb_N%d_%d_%d.h5'%(Ngrid[0],Ngrid[1],Ngrid[2]) +model = ATTModel.read(data_file, par_file) +ckb_model = model.to_xarray() + +# initial model +depth = 10.0 +vel_init = initial_model.interp_dep(depth, field='vel') +start = [1.25,0]; end = [1.25,2] +vel_init_sec = initial_model.interp_sec(start, end, field='vel', val = 1) + +# checkerboard model +vel_ckb = ckb_model.interp_dep(depth, field='vel') # lon = [:,0], lat = [:,1], vel = [:,2] +vel_ckb_sec = ckb_model.interp_sec(start, end, field='vel', val = 1) + +# anisotropic arrow +samp_interval = 3 +length = 7 +width = 0.1 +ani_thd = 0.02 + +ani_ckb_phi = ckb_model.interp_dep(depth, field='phi', samp_interval=samp_interval) +ani_ckb_epsilon = ckb_model.interp_dep(depth, field='epsilon', samp_interval=samp_interval) +ani_ckb = np.hstack([ani_ckb_phi, ani_ckb_epsilon[:,2].reshape(-1, 1)*length, np.ones((ani_ckb_epsilon.shape[0],1))*width]) # lon, lat, angle, length, width +idx = np.where(ani_ckb_epsilon[:,2] > ani_thd) +ani_ckb = ani_ckb[idx[0],:] + +try: + os.mkdir('img') +except: + pass + +# %% +# read src_rec_file for data +from pytomoatt.src_rec import SrcRec + +sr = SrcRec.read('1_src_rec_files/src_rec_config.dat') +station = sr.receivers[['stlo','stla','stel']].values.T +true_loc = sr.sources[['evlo','evla','evdp']].values.T +earthquake = true_loc + +sr = SrcRec.read('OUTPUT_FILES/OUTPUT_FILES_signal/src_rec_file_forward_errloc.dat') +init_loc = sr.sources[['evlo','evla','evdp']].values.T + +# %% +# categorize earthquakes +ev_idx1 = [] +ev_idx2 = [] +ev_idx3 = [] +for i in range(earthquake.shape[1]): + dep = earthquake[2,i] + if dep < 15: + ev_idx1.append(i) + elif dep < 25: + ev_idx2.append(i) + elif dep < 35: + ev_idx3.append(i) + +# %% +# plot the model setting +fig = pygmt.Figure() + +region = [0,2,0,2] +frame = ["xa1","ya1"] +projection = "M10c" +spacing = 0.04 + +vel_range = 20 + +# -------------- initial model and earthquake location -------------- +fig.basemap(region=region, frame=["xa1","ya1","+tInitial model and locations"], projection=projection) +# velocity perturbation +pygmt.makecpt(cmap="../utils/svel13_chen.cpt", series=[-vel_range, vel_range], background=True, reverse=False) +x = vel_init[:,0]; y = vel_init[:,1]; value = (vel_init[:,2] - vel_init[:,2])/vel_init[:,2] * 100 +grid = pygmt.surface(x=x, y=y, z=value, spacing=spacing,region=region) +fig.grdimage(grid = grid) +# earthquakes +fig.plot(x = init_loc[0,ev_idx1], y = init_loc[1,ev_idx1], style = "c0.1c", fill = "red") +fig.plot(x = init_loc[0,ev_idx2], y = init_loc[1,ev_idx2], style = "c0.1c", fill = "green") +fig.plot(x = init_loc[0,ev_idx3], y = init_loc[1,ev_idx3], style = "c0.1c", fill = "black") + +# stations +fig.plot(x = station[0,:], y = station[1,:], style = "t0.4c", fill = "blue", pen = "black", label = "Station") + +# # anisotropic arrow +# fig.plot(ani_ckb, style='j', fill='yellow1', pen='0.5p,black') + +fig.shift_origin(xshift=11) + +fig.basemap(region=[0,40,0,2], frame=["xa20+lDepth (km)","ya1","Nswe"], projection="X2c/10c") +x = vel_init_sec[:,3]; y = vel_init_sec[:,1]; value = (vel_init_sec[:,4] - vel_init_sec[:,4])/vel_init_sec[:,4] * 100 +grid = pygmt.surface(x=x, y=y, z=value, spacing="1/0.04",region=[0,40,0,2]) +fig.grdimage(grid = grid) + +# earthquakes +fig.plot(x = init_loc[2,ev_idx1], y = init_loc[1,ev_idx1], style = "c0.1c", fill = "red") +fig.plot(x = init_loc[2,ev_idx2], y = init_loc[1,ev_idx2], style = "c0.1c", fill = "green") +fig.plot(x = init_loc[2,ev_idx3], y = init_loc[1,ev_idx3], style = "c0.1c", fill = "black") + + +fig.shift_origin(xshift=4) + + +# -------------- true model and earthquake location -------------- +fig.basemap(region=region, frame=["xa1","ya1","+tTrue model and locations"], projection=projection) +# velocity perturbation +pygmt.makecpt(cmap="../utils/svel13_chen.cpt", series=[-vel_range, vel_range], background=True, reverse=False) +x = vel_ckb[:,0]; y = vel_ckb[:,1]; value = (vel_ckb[:,2] - vel_init[:,2])/vel_init[:,2] * 100 +grid = pygmt.surface(x=x, y=y, z=value, spacing=spacing,region=region) +fig.grdimage(grid = grid) +# earthquakes +fig.plot(x = true_loc[0,ev_idx1], y = true_loc[1,ev_idx1], style = "c0.1c", fill = "red") +fig.plot(x = true_loc[0,ev_idx2], y = true_loc[1,ev_idx2], style = "c0.1c", fill = "green") +fig.plot(x = true_loc[0,ev_idx3], y = true_loc[1,ev_idx3], style = "c0.1c", fill = "black") + +# stations +# fig.plot(x = loc_st[0,:], y = loc_st[1,:], style = "t0.4c", fill = "blue", pen = "black", label = "Station") + +# anisotropic arrow +fig.plot(ani_ckb, style='j', fill='yellow1', pen='0.5p,black') + +fig.shift_origin(xshift=11) + +fig.basemap(region=[0,40,0,2], frame=["xa20+lDepth (km)","ya1","Nswe"], projection="X2c/10c") +x = vel_ckb_sec[:,3]; y = vel_ckb_sec[:,1]; value = (vel_ckb_sec[:,4] - vel_init_sec[:,4])/vel_init_sec[:,4] * 100 +grid = pygmt.surface(x=x, y=y, z=value, spacing="1/0.04",region=[0,40,0,2]) +fig.grdimage(grid = grid) + +# earthquakes +fig.plot(x = true_loc[2,ev_idx1], y = true_loc[1,ev_idx1], style = "c0.1c", fill = "red") +fig.plot(x = true_loc[2,ev_idx2], y = true_loc[1,ev_idx2], style = "c0.1c", fill = "green") +fig.plot(x = true_loc[2,ev_idx3], y = true_loc[1,ev_idx3], style = "c0.1c", fill = "black") + + +# ------------------- colorbar ------------------- +fig.shift_origin(xshift=-11, yshift=-1.5) +fig.colorbar(frame = ["a%f"%(vel_range),"x+ldlnVp (%)"], position="+e+w4c/0.3c+h") + +fig.shift_origin(xshift=6, yshift=-1) +fig.basemap(region=[0,1,0,1], frame=["wesn"], projection="X6c/1.5c") +ani = [ + [0.2, 0.6, 45, 0.02*length, width], # lon, lat, phi, epsilon, size + [0.5, 0.6, 45, 0.05*length, width], + [0.8, 0.6, 45, 0.10*length, width], + ] +fig.plot(ani, style='j', fill='yellow1', pen='0.5p,black') +fig.text(text=["0.02", "0.05", "0.10"], x=[0.2,0.5,0.8], y=[0.2]*3, font="16p,Helvetica", justify="CM") +fig.shift_origin(xshift= 11, yshift=2.5) + +fig.show() +fig.savefig('img/model_setting.png', dpi=300) + +# %% +# plot the joint inversion results + +fig = pygmt.Figure() + +region = [0,2,0,2] +projection = "M10c" +spacing = 0.04 + +vel_range = 20 + +tag_list = ["joint_step1", "joint_step2", "joint_step3"] + +for itag, tag in enumerate(tag_list): + + if (tag == "joint_step1"): + # model + x = vel_init[:,0]; y = vel_init[:,1]; value = (vel_init[:,2] - vel_init[:,2])/vel_init[:,2] * 100 + x_sec = vel_init_sec[:,3]; y_sec = vel_init_sec[:,1]; value_sec = (vel_init_sec[:,4] - vel_init_sec[:,4])/vel_init_sec[:,4] * 100 + + # location + sr = SrcRec.read('OUTPUT_FILES/OUTPUT_FILES_%s/src_rec_file_reloc_0050.dat'%(tag)) + re_loc = sr.sources[['evlo','evla','evdp']].values.T + + frame = ["xa1","ya1","+tStep %d, preliminary location"%(itag+1)] + elif (tag == "joint_step2"): + # model + data_file = "OUTPUT_FILES/OUTPUT_FILES_%s/final_model.h5"%(tag) + model = ATTModel.read(data_file, par_file) + inv_model = model.to_xarray() + vel_inv = inv_model.interp_dep(depth, field='vel') # lon = [:,0], lat = [:,1], vel = [:,2] + x = vel_inv[:,0]; y = vel_inv[:,1]; value = (vel_inv[:,2] - vel_init[:,2])/vel_init[:,2] * 100 + vel_inv_sec = inv_model.interp_sec(start, end, field='vel', val = 1) + x_sec = vel_inv_sec[:,3]; y_sec = vel_inv_sec[:,1]; value_sec = (vel_inv_sec[:,4] - vel_init_sec[:,4])/vel_init_sec[:,4] * 100 + + ani_inv_phi = inv_model.interp_dep(depth, field='phi', samp_interval=samp_interval) + ani_inv_epsilon = inv_model.interp_dep(depth, field='epsilon', samp_interval=samp_interval) + ani_inv = np.hstack([ani_inv_phi, ani_inv_epsilon[:,2].reshape(-1, 1)*length, np.ones((ani_inv_epsilon.shape[0],1))*width]) # lon, lat, angle, length, width + idx = np.where(ani_inv_epsilon[:,2] > ani_thd) + ani = ani_inv[idx[0],:] + + # location + sr = SrcRec.read('OUTPUT_FILES/OUTPUT_FILES_%s/src_rec_file_inv_0039_reloc_0039.dat'%(tag)) + re_loc = sr.sources[['evlo','evla','evdp']].values.T + + frame = ["xa1","ya1","+tStep %d, joint inversion"%(itag+1)] + elif (tag == "joint_step3"): + + # model + x = vel_inv[:,0]; y = vel_inv[:,1]; value = (vel_inv[:,2] - vel_init[:,2])/vel_init[:,2] * 100 + x_sec = vel_inv_sec[:,3]; y_sec = vel_inv_sec[:,1]; value_sec = (vel_inv_sec[:,4] - vel_init_sec[:,4])/vel_init_sec[:,4] * 100 + ani = ani_inv[idx[0],:] + + # location + sr = SrcRec.read('OUTPUT_FILES/OUTPUT_FILES_%s/src_rec_file_reloc_0100.dat'%(tag)) + re_loc = sr.sources[['evlo','evla','evdp']].values.T + + frame = ["xa1","ya1","+tStep %d, relocation"%(itag+1)] + + # plot the inversion result + + + # -------------- inversion model -------------- + fig.basemap(region=region, frame=frame, projection=projection) + # velocity perturbation + pygmt.makecpt(cmap="../utils/svel13_chen.cpt", series=[-vel_range, vel_range], background=True, reverse=False) + grid = pygmt.surface(x=x, y=y, z=value, spacing=spacing,region=region) + fig.grdimage(grid = grid) + # earthquakes + fig.plot(x = re_loc[0,ev_idx1], y = re_loc[1,ev_idx1], style = "c0.1c", fill = "red") + fig.plot(x = re_loc[0,ev_idx2], y = re_loc[1,ev_idx2], style = "c0.1c", fill = "green") + fig.plot(x = re_loc[0,ev_idx3], y = re_loc[1,ev_idx3], style = "c0.1c", fill = "black") + + # stations + # fig.plot(x = loc_st[0,:], y = loc_st[1,:], style = "t0.4c", fill = "blue", pen = "black", label = "Station") + + # anisotropic arrow + if (tag == "joint_step2" or tag == "joint_step3"): + fig.plot(ani, style='j', fill='yellow1', pen='0.5p,black') + + fig.shift_origin(xshift=11) + + fig.basemap(region=[0,40,0,2], frame=["xa20+lDepth (km)","ya1","Nswe"], projection="X2c/10c") + grid = pygmt.surface(x=x_sec, y=y_sec, z=value_sec, spacing="1/0.04",region=[0,40,0,2]) + fig.grdimage(grid = grid) + + # earthquakes + fig.plot(x = re_loc[2,ev_idx1], y = re_loc[1,ev_idx1], style = "c0.1c", fill = "red") + fig.plot(x = re_loc[2,ev_idx2], y = re_loc[1,ev_idx2], style = "c0.1c", fill = "green") + fig.plot(x = re_loc[2,ev_idx3], y = re_loc[1,ev_idx3], style = "c0.1c", fill = "black") + + fig.shift_origin(xshift=4) + +# ------------------- colorbar ------------------- +fig.shift_origin(xshift=-4) + +fig.shift_origin(xshift=-11, yshift=-1.5) +fig.colorbar(frame = ["a%f"%(vel_range),"x+ldlnVp (%)"], position="+e+w4c/0.3c+h") + +fig.shift_origin(xshift=6, yshift=-1) +fig.basemap(region=[0,1,0,1], frame=["wesn"], projection="X6c/1.5c") +ani = [ + [0.2, 0.6, 45, 0.02*length, width], # lon, lat, phi, epsilon, size + [0.5, 0.6, 45, 0.05*length, width], + [0.8, 0.6, 45, 0.10*length, width], + ] +fig.plot(ani, style='j', fill='yellow1', pen='0.5p,black') +fig.text(text=["0.02", "0.05", "0.10"], x=[0.2,0.5,0.8], y=[0.2]*3, font="16p,Helvetica", justify="CM") +fig.shift_origin(xshift= 11, yshift=2.5) + + +fig.show() +fig.savefig('img/model_joint.png', dpi=300) + + diff --git a/examples/eg3_joint_inversion/prepare_input_files.py b/examples/eg3_joint_inversion/prepare_input_files.py new file mode 100644 index 0000000..13869cd --- /dev/null +++ b/examples/eg3_joint_inversion/prepare_input_files.py @@ -0,0 +1,63 @@ +# download src_ref_files from Zenodo +import os +import numpy as np +import sys +try: + from pytomoatt.model import ATTModel + from pytomoatt.checkerboard import Checker + from pytomoatt.src_rec import SrcRec +except: + print("ERROR: ATTModel not found. Please install pytomoatt first." + "See https://tomoatt.github.io/PyTomoATT/installation.html for details.") + sys.exit(1) + + +class BuildInitialModel(): + def __init__(self, par_file="./3_input_params/input_params_signal.yaml", output_dir="2_models"): + """ + Build initial model for tomography inversion + """ + self.am = ATTModel(par_file) + self.output_dir = output_dir + + def build_initial_model(self, vel_min=5.0, vel_max=8.0): + """ + Build initial model for tomography inversion + """ + self.am.vel[self.am.depths < 0, :, :] = vel_min + idx = np.where((0 <= self.am.depths) & (self.am.depths < 40.0))[0] + self.am.vel[idx, :, :] = np.linspace(vel_min, vel_max, idx.size)[::-1][:, np.newaxis, np.newaxis] + self.am.vel[self.am.depths >= 40.0, :, :] = vel_max + + +def build_ckb_model(output_dir="2_models"): + cbk = Checker(f'{output_dir}/model_init_N61_61_61.h5', para_fname="./3_input_params/input_params_signal.yaml") + cbk.checkerboard( + n_pert_x=2, n_pert_y=2, n_pert_z=2, + pert_vel=0.2, pert_ani=0.1, ani_dir=60.0, + lim_x=[0.5, 1.5], lim_y=[0.5, 1.5], lim_z=[0, 40] + ) + cbk.write(f'{output_dir}/model_ckb_N61_61_61.h5') + + +if __name__ == "__main__": + # download src_rec_config.dat + url = 'https://zenodo.org/records/14053821/files/src_rec_config.dat' + path = "1_src_rec_files/src_rec_config.dat" + os.makedirs(os.path.dirname(path), exist_ok=True) + if not os.path.exists(path): + sr = SrcRec.read(url) + sr.write(path) + + # build initial model + output_dir = "2_models" + os.makedirs(output_dir, exist_ok=True) + bim = BuildInitialModel(output_dir=output_dir) + bim.build_initial_model() + bim.am.write('{}/model_init_N{:d}_{:d}_{:d}.h5'.format(bim.output_dir, *bim.am.n_rtp)) + + # build ckb model + build_ckb_model(output_dir) + + + diff --git a/examples/eg3_joint_inversion/run_this_example.sh b/examples/eg3_joint_inversion/run_this_example.sh new file mode 100644 index 0000000..1fbcdea --- /dev/null +++ b/examples/eg3_joint_inversion/run_this_example.sh @@ -0,0 +1,40 @@ +#!/bin/bash + + +# Step 1: Generate necessary input files +python prepare_input_files.py + +# Step 2: Run forward modeling +# # for WSL +# mpirun -n 8 --allow-run-as-root --oversubscribe ../../build/bin/TOMOATT -i 3_input_params/input_params_signal.yaml +# # for Linux +# mpirun -n 8 ../../build/bin/TOMOATT -i 3_input_params/input_params_signal.yaml +# for conda install +mpirun -n 8 TOMOATT -i 3_input_params/input_params_signal.yaml + +# Step 3: Assign data noise and location perturbation to the observational data +python assign_gaussian_noise.py + +# Step 4: Do joint inversion +# # for WSL +# # step 1. relocation for 50 iterations in the initial model, using traveltimes and common-receiver differential arrival times +# mpirun -n 8 --allow-run-as-root --oversubscribe ../../build/bin/TOMOATT -i 3_input_params/input_params_joint_step1.yaml +# # step 2. simultaneously update model parameters and locations for 40 iterations, +# # using traveltimes and common-source differential arrival times for model update +# # using traveltimes and common-receiver differential arrival times for location +# mpirun -n 8 --allow-run-as-root --oversubscribe ../../build/bin/TOMOATT -i 3_input_params/input_params_joint_step2.yaml +# # step 3. relocation for 50 iterations in the initial model, using only common-receiver differential arrival times +# mpirun -n 8 --allow-run-as-root --oversubscribe ../../build/bin/TOMOATT -i 3_input_params/input_params_joint_step3.yaml + +# # for Linux +# mpirun -n 8 ../../build/bin/TOMOATT -i 3_input_params/input_params_joint_step1.yaml +# mpirun -n 8 ../../build/bin/TOMOATT -i 3_input_params/input_params_joint_step2.yaml +# mpirun -n 8 ../../build/bin/TOMOATT -i 3_input_params/input_params_joint_step3.yaml + +# for conda install +mpirun -n 8 TOMOATT -i 3_input_params/input_params_joint_step1.yaml +mpirun -n 8 TOMOATT -i 3_input_params/input_params_joint_step2.yaml +mpirun -n 8 TOMOATT -i 3_input_params/input_params_joint_step3.yaml + +# Step 5 (Optional): Plot the results +python plot_output.py \ No newline at end of file diff --git a/examples/eg4_1d_inversion/3_input_params/input_params_1dinv_inv.yaml b/examples/eg4_1d_inversion/3_input_params/input_params_1dinv_inv.yaml new file mode 100644 index 0000000..1ddddd3 --- /dev/null +++ b/examples/eg4_1d_inversion/3_input_params/input_params_1dinv_inv.yaml @@ -0,0 +1,215 @@ +version: 3 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-10, 50] # depth in km + min_max_lat: [0, 2] # latitude in degree + min_max_lon: [0, 2] # longitude in degree + n_rtp: [61, 61, 61] # number of nodes in depth,latitude,longitude direction + +################################################# +# traveltime data file path # +################################################# +source: + src_rec_file: OUTPUT_FILES/OUTPUT_FILES_1dinv_signal/src_rec_file_step_0000.dat # source receiver file path + swap_src_rec: true # swap source and receiver (only valid for regional source and receiver, those of tele remain unchanged) + +################################################# +# initial model file path # +################################################# +model: + init_model_path: 2_models/model_init_N61_61_61.h5 # path to initial model file +# model_1d_name: dummy_model_1d_name # 1D model name used in teleseismic 2D solver (iasp91, ak135, user_defined is available), defined in include/1d_model.h + +################################################# +# parallel computation settings # +################################################# +parallel: # parameters for parallel computation + n_sims: 8 # number of simultanoues runs (parallel the sources) + ndiv_rtp: [1, 1, 1] # number of subdivision on each direction (parallel the computional domain) + nproc_sub: 1 # number of processors for sweep parallelization (parallel the fast sweep method) + use_gpu: false # true if use gpu (EXPERIMENTAL) + +############################################ +# output file setting # +############################################ +output_setting: + output_dir: OUTPUT_FILES/OUTPUT_FILES_1dinv_inv # path to output director (default is ./OUTPUT_FILES/) + output_source_field: true # True: output the traveltime field and adjoint field of all sources at each iteration. Default: false. File: 'out_data_sim_group_X'. + output_kernel: false # True: output sensitivity kernel and kernel density. Default: false. File: 'out_data_sim_group_X'. + output_final_model: true # True: output merged final model. This file can be used as the input model for TomoATT. Default: true. File: 'model_final.h5'. + output_middle_model: false # True: output merged intermediate models during inversion. This file can be used as the input model for TomoATT. Default: false. File: 'middle_model_step_XXXX.h5' + output_in_process: false # True: output at each inv iteration, otherwise, only output step 0, Niter-1, Niter. Default: true. File: 'out_data_sim_group_0'. + output_in_process_data: false # True: output src_rec_file at each inv iteration, otherwise, only output step 0, Niter-2, Niter-1. Default: true. File: 'src_rec_file_step_XXXX.dat' + single_precision_output: false # True: output results in single precision. Default: false. + verbose_output_level: 0 # output internal parameters, (to do). + output_file_format: 0 # 0: hdf5, 1: ascii + +# output files: +# File: 'out_data_grid.h5'. Keys: ['Mesh']['elem_conn'], element index; +# ['Mesh']['node_coords_p'], phi coordinates of nodes; +# ['Mesh']['node_coords_t'], theta coordinates of nodes; +# ['Mesh']['node_coords_r'], r coordinates of nodes; +# ['Mesh']['node_coords_x'], phi coordinates of elements; +# ['Mesh']['node_coords_y'], theta coordinates of elements; +# ['Mesh']['node_coords_z'], r coordinates of elements; +# File: 'out_data_sim_group_0'. Keys: ['model']['vel_inv_XXXX'], velocity model at iteration XXXX; +# ['model']['xi_inv_XXXX'], xi model at iteration XXXX; +# ['model']['eta_inv_XXXX'], eta model at iteration XXXX +# ['model']['Ks_inv_XXXX'], sensitivity kernel related to slowness at iteration XXXX +# ['model']['Kxi_inv_XXXX'], sensitivity kernel related to xi at iteration XXXX +# ['model']['Keta_inv_XXXX'], sensitivity kernel related to eta at iteration XXXX +# ['model']['Ks_density_inv_XXXX'], kernel density of Ks at iteration XXXX +# ['model']['Kxi_density_inv_XXXX'], kernel density of Kxi at iteration XXXX +# ['model']['Keta_density_inv_XXXX'], kernel density of Keta at iteration XXXX +# ['model']['Ks_over_Kden_inv_XXXX'], slowness kernel over kernel density at iteration XXXX +# ['model']['Kxi_over_Kden_inv_XXXX'], xi kernel over kernel density at iteration XXXX +# ['model']['Keta_over_Kden_inv_XXXX'], eta kernel over kernel density at iteration XXXX +# ['model']['Ks_update_inv_XXXX'], slowness kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Kxi_update_inv_XXXX'], xi kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Keta_update_inv_XXXX'], eta kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['1dinv']['vel_1dinv_inv_XXXX'], 2d velocity model at iteration XXXX, in 1d inversion mode +# ['1dinv']['r_1dinv'], r coordinates (depth), in 1d inversion mode +# ['1dinv']['t_1dinv'], t coordinates (epicenter distance), in 1d inversion mode +# File: 'src_rec_file_step_XXXX.dat' or 'src_rec_file_forward.dat'. The synthetic traveltime data file. +# File: 'final_model.h5'. Keys: ['eta'], ['xi'], ['vel'], the final model. +# File: 'middle_model_step_XXXX.h5'. Keys: ['eta'], ['xi'], ['vel'], the model at step XXXX. +# File: 'inversion_grid.txt'. The location of inversion grid nodes +# File: 'objective_function.txt'. The objective function value at each iteration +# File: 'out_data_sim_group_X'. Keys: ['src_YYYY']['time_field_inv_XXXX'], traveltime field of source YYYY at iteration XXXX; +# ['src_YYYY']['adjoint_field_inv_XXXX'], adjoint field of source YYYY at iteration XXXX; +# ['1dinv']['time_field_1dinv_YYYY_inv_XXXX'], 2d traveltime field of source YYYY at iteration XXXX, in 1d inversion mode +# ['1dinv']['adjoint_field_1dinv_YYYY_inv_XXXX'], 2d adjoint field of source YYYY at iteration XXXX, in 1d inversion mode + + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion + earthquake relocation +# 4 for 1d model inversion +run_mode: 4 + +have_tele_data: false # An error will be reported if false but source out of study region is used. Default: false. + +################################################### +# model update parameters setting # +################################################### +model_update: + max_iterations: 200 # maximum number of inversion iterations + optim_method: 0 # optimization method. 0 : grad_descent, 1 : halve-stepping, 2 : lbfgs (EXPERIMENTAL) + + #common parameters for all optim methods + step_length: 0.02 # the initial step length of model perturbation. 0.01 means maximum 1% perturbation for each iteration. + + # parameters for optim_method 0 (gradient_descent) + optim_method_0: + step_method: 1 # the method to modulate step size. 0: according to objective function; 1: according to gradient direction + # if step_method:0. if objective function increase, step size -> step length * step_length_decay. + step_length_decay: 0.9 # default: 0.9 + # if step_method:1. if the angle between the current and the previous gradients is greater than step_length_gradient_angle, step size -> step length * step_length_change[0]. + # otherwise, step size -> step length * step_length_change[1]. + step_length_gradient_angle: 120 # default: 120.0 + step_length_change: [0.5, 1.2] # default: [0.5,1.2] + # Kdensity_coe is used to rescale the final kernel: kernel -> kernel / pow(density of kernel, Kdensity_coe). if Kdensity_coe > 0, the region with less data will be enhanced during the inversion + # e.g., if Kdensity_coe = 0, kernel remains upchanged; if Kdensity_coe = 1, kernel is fully normalized. 0.5 or less is recommended if really required. + Kdensity_coe: 0 # default: 0.0, limited range: 0.0 - 0.95 + + # smoothing + smoothing: + smooth_method: 0 # 0: multiparametrization, 1: laplacian smoothing (EXPERIMENTAL) + l_smooth_rtp: [1, 1, 1] # smoothing coefficients for laplacian smoothing + + # parameters for smooth method 0 (multigrid model parametrization) + # inversion grid can be viewed in OUTPUT_FILES/inversion_grid.txt + n_inversion_grid: 5 # number of inversion grid sets + + uniform_inv_grid_dep: true # true if use uniform inversion grid for dep, false if use flexible inversion grid + uniform_inv_grid_lat: true # true if use uniform inversion grid for lat, false if use flexible inversion grid + uniform_inv_grid_lon: true # true if use uniform inversion grid for lon, false if use flexible inversion grid + + # -------------- uniform inversion grid setting -------------- + # settings for uniform inversion grid + n_inv_dep_lat_lon: [13, 9, 9] # number of the base inversion grid points + min_max_dep_inv: [-10, 50] # depth in km (Radius of the earth is defined in config.h/R_earth) + min_max_lat_inv: [0, 2] # latitude in degree + min_max_lon_inv: [0, 2] # longitude in degree + + # -------------- flexible inversion grid setting -------------- + # settings for flexible inversion grid + dep_inv: [-10, 0, 10, 20, 30, 40, 50, 60] # inversion grid for vel in depth (km) + lat_inv: [30, 30.2, 30.4, 30.6, 30.8, 31, 31.2, 31.4, 31.6, 31.8, 32] # inversion grid for vel in latitude (degree) + lon_inv: [30, 30.2, 30.4, 30.6, 30.8, 31, 31.2, 31.4, 31.6, 31.8, 32] # inversion grid for vel in longitude (degree) + trapezoid: [1, 0, 50] # usually set as [1.0, 0.0, 50.0] (default) + + # Carefully change trapezoid and trapezoid_ani, if you really want to use trapezoid inversion grid, increasing the inversion grid spacing with depth to account for the worse data coverage in greater depths. + # The trapezoid_ inversion grid with index (i,j,k) in longitude, latitude, and depth is defined as: + # if dep_inv[k] < trapezoid[1], lon = lon_inv[i]; + # lat = lat_inv[j]; + # dep = dep_inv[k]; + # if trapezoid[1] <= dep_inv[k] < trapezoid[2], lon = mid_lon_inv+(lon_inv[i]-mid_lon_inv)*(dep_inv[k]-trapezoid[1])/(trapezoid[2]-trapezoid[1])*trapezoid[0]; + # lat = mid_lat_inv+(lat_inv[i]-mid_lat_inv)*(dep_inv[k]-trapezoid[1])/(trapezoid[2]-trapezoid[1])*trapezoid[0]; + # dep = dep_inv[k]; + # if trapezoid[2] <= dep_inv[k], lon = mid_lon_inv+(lon_inv[i]-mid_lon_inv)*trapezoid[0]; + # lat = mid_lat_inv+(lat_inv[i]-mid_lat_inv)*trapezoid[0]; + # dep = dep_inv[k]; + # The shape of trapezoid inversion gird (x) looks like: + # + # lon_inv[0] [1] [2] [3] [4] + # |<-------- (lon_inv[end] - lon_inv[0]) ---->| + # dep_inv[0] | x x x x x | + # | | + # dep_inv[1] | x x x x x | + # | | + # dep_inv[2] = trapezoid[1] / x x x x x \ + # / \ + # dep_inv[3] / x x x x x \ + # / \ + # dep_inv[4] = trapezoid[2] / x x x x x \ + # | | + # dep_inv[5] | x x x x x | + # | | + # dep_inv[6] | x x x x x | + # |<---- trapezoid[0]* (lon_inv[end] - lon_inv[0]) ------>| + + + # In the following data subsection, XXX_weight means a weight is assigned to the data, influencing the objective function and gradient + # XXX_weight : [d1,d2,w1,w2] means: + # if XXX < d1, weight = w1 + # if d1 <= XXX < d2, weight = w1 + (XXX-d1)/(d2-d1)*(w2-w1), (linear interpolation) + # if d2 <= XXX , weight = w2 + # You can easily set w1 = w2 = 1.0 to normalize the weight related to XXX. + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time: true # 'true' for using absolute traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1, 3, 1, 1] # XXX is the absolute traveltime residual (second) = abs(t^{obs}_{n,i} - t^{syn}_{n,j}) + distance_weight: [100, 200, 1, 1] # XXX is epicenter distance (km) between the source and receiver related to the data + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + use_cs_time: false # 'true' for using common source differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1, 3, 1, 1] # XXX is the common source differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{n,j} - t^{syn}_{n,i} + t^{syn}_{n,j}). + azimuthal_weight: [15, 30, 1, 1] # XXX is the azimuth difference between two separate stations related to the common source. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time: false # 'true' for using common receiver differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1, 3, 1, 1] # XXX is the common receiver differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{m,i} - t^{syn}_{n,i} + t^{syn}_{m,i}) + azimuthal_weight: [15, 30, 1, 1] # XXX is the azimuth difference between two separate sources related to the common receiver. + + # -------------- global weight of different types of data (to balance the weight of different data) -------------- + global_weight: + balance_data_weight: false # yes: over the total weight of the each type of the data. no: use original weight (below weight for each type of data needs to be set) + abs_time_weight: 1 # weight of absolute traveltime data after balance, default: 1.0 + cs_dif_time_local_weight: 1 # weight of common source differential traveltime data after balance, default: 1.0 + cr_dif_time_local_weight: 1 # weight of common receiver differential traveltime data after balance, default: 1.0 + teleseismic_weight: 1 # weight of teleseismic data after balance, default: 1.0 (exclude in this version) + + # -------------- inversion parameters -------------- + update_slowness : true # update slowness (velocity) or not. default: true + update_azi_ani : false # update azimuthal anisotropy (xi, eta) or not. default: false diff --git a/examples/eg4_1d_inversion/3_input_params/input_params_1dinv_signal.yaml b/examples/eg4_1d_inversion/3_input_params/input_params_1dinv_signal.yaml new file mode 100644 index 0000000..025b2fe --- /dev/null +++ b/examples/eg4_1d_inversion/3_input_params/input_params_1dinv_signal.yaml @@ -0,0 +1,215 @@ +version: 3 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-10, 50] # depth in km + min_max_lat: [0, 2] # latitude in degree + min_max_lon: [0, 2] # longitude in degree + n_rtp: [61, 61, 61] # number of nodes in depth,latitude,longitude direction + +################################################# +# traveltime data file path # +################################################# +source: + src_rec_file: 1_src_rec_files/src_rec_config.dat # source receiver file path + swap_src_rec: true # swap source and receiver (only valid for regional source and receiver, those of tele remain unchanged) + +################################################# +# initial model file path # +################################################# +model: + init_model_path: 2_models/model_ckb_N61_61_61.h5 # path to initial model file +# model_1d_name: dummy_model_1d_name # 1D model name used in teleseismic 2D solver (iasp91, ak135, user_defined is available), defined in include/1d_model.h + +################################################# +# parallel computation settings # +################################################# +parallel: # parameters for parallel computation + n_sims: 8 # number of simultanoues runs (parallel the sources) + ndiv_rtp: [1, 1, 1] # number of subdivision on each direction (parallel the computional domain) + nproc_sub: 1 # number of processors for sweep parallelization (parallel the fast sweep method) + use_gpu: false # true if use gpu (EXPERIMENTAL) + +############################################ +# output file setting # +############################################ +output_setting: + output_dir: OUTPUT_FILES/OUTPUT_FILES_1dinv_signal # path to output director (default is ./OUTPUT_FILES/) + output_source_field: false # True: output the traveltime field and adjoint field of all sources at each iteration. Default: false. File: 'out_data_sim_group_X'. + output_kernel: false # True: output sensitivity kernel and kernel density. Default: false. File: 'out_data_sim_group_X'. + output_final_model: true # True: output merged final model. This file can be used as the input model for TomoATT. Default: true. File: 'model_final.h5'. + output_middle_model: false # True: output merged intermediate models during inversion. This file can be used as the input model for TomoATT. Default: false. File: 'middle_model_step_XXXX.h5' + output_in_process: false # True: output at each inv iteration, otherwise, only output step 0, Niter-1, Niter. Default: true. File: 'out_data_sim_group_0'. + output_in_process_data: false # True: output src_rec_file at each inv iteration, otherwise, only output step 0, Niter-2, Niter-1. Default: true. File: 'src_rec_file_step_XXXX.dat' + single_precision_output: false # True: output results in single precision. Default: false. + verbose_output_level: 0 # output internal parameters, (to do). + output_file_format: 0 # 0: hdf5, 1: ascii + +# output files: +# File: 'out_data_grid.h5'. Keys: ['Mesh']['elem_conn'], element index; +# ['Mesh']['node_coords_p'], phi coordinates of nodes; +# ['Mesh']['node_coords_t'], theta coordinates of nodes; +# ['Mesh']['node_coords_r'], r coordinates of nodes; +# ['Mesh']['node_coords_x'], phi coordinates of elements; +# ['Mesh']['node_coords_y'], theta coordinates of elements; +# ['Mesh']['node_coords_z'], r coordinates of elements; +# File: 'out_data_sim_group_0'. Keys: ['model']['vel_inv_XXXX'], velocity model at iteration XXXX; +# ['model']['xi_inv_XXXX'], xi model at iteration XXXX; +# ['model']['eta_inv_XXXX'], eta model at iteration XXXX +# ['model']['Ks_inv_XXXX'], sensitivity kernel related to slowness at iteration XXXX +# ['model']['Kxi_inv_XXXX'], sensitivity kernel related to xi at iteration XXXX +# ['model']['Keta_inv_XXXX'], sensitivity kernel related to eta at iteration XXXX +# ['model']['Ks_density_inv_XXXX'], kernel density of Ks at iteration XXXX +# ['model']['Kxi_density_inv_XXXX'], kernel density of Kxi at iteration XXXX +# ['model']['Keta_density_inv_XXXX'], kernel density of Keta at iteration XXXX +# ['model']['Ks_over_Kden_inv_XXXX'], slowness kernel over kernel density at iteration XXXX +# ['model']['Kxi_over_Kden_inv_XXXX'], xi kernel over kernel density at iteration XXXX +# ['model']['Keta_over_Kden_inv_XXXX'], eta kernel over kernel density at iteration XXXX +# ['model']['Ks_update_inv_XXXX'], slowness kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Kxi_update_inv_XXXX'], xi kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Keta_update_inv_XXXX'], eta kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['1dinv']['vel_1dinv_inv_XXXX'], 2d velocity model at iteration XXXX, in 1d inversion mode +# ['1dinv']['r_1dinv'], r coordinates (depth), in 1d inversion mode +# ['1dinv']['t_1dinv'], t coordinates (epicenter distance), in 1d inversion mode +# File: 'src_rec_file_step_XXXX.dat' or 'src_rec_file_forward.dat'. The synthetic traveltime data file. +# File: 'final_model.h5'. Keys: ['eta'], ['xi'], ['vel'], the final model. +# File: 'middle_model_step_XXXX.h5'. Keys: ['eta'], ['xi'], ['vel'], the model at step XXXX. +# File: 'inversion_grid.txt'. The location of inversion grid nodes +# File: 'objective_function.txt'. The objective function value at each iteration +# File: 'out_data_sim_group_X'. Keys: ['src_YYYY']['time_field_inv_XXXX'], traveltime field of source YYYY at iteration XXXX; +# ['src_YYYY']['adjoint_field_inv_XXXX'], adjoint field of source YYYY at iteration XXXX; +# ['1dinv']['time_field_1dinv_YYYY_inv_XXXX'], 2d traveltime field of source YYYY at iteration XXXX, in 1d inversion mode +# ['1dinv']['adjoint_field_1dinv_YYYY_inv_XXXX'], 2d adjoint field of source YYYY at iteration XXXX, in 1d inversion mode + + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion + earthquake relocation +# 4 for 1d model inversion +run_mode: 4 + +have_tele_data: false # An error will be reported if false but source out of study region is used. Default: false. + +################################################### +# model update parameters setting # +################################################### +model_update: + max_iterations: 1 # maximum number of inversion iterations + optim_method: 0 # optimization method. 0 : grad_descent, 1 : halve-stepping, 2 : lbfgs (EXPERIMENTAL) + + #common parameters for all optim methods + step_length: 0.02 # the initial step length of model perturbation. 0.01 means maximum 1% perturbation for each iteration. + + # parameters for optim_method 0 (gradient_descent) + optim_method_0: + step_method: 1 # the method to modulate step size. 0: according to objective function; 1: according to gradient direction + # if step_method:0. if objective function increase, step size -> step length * step_length_decay. + step_length_decay: 0.9 # default: 0.9 + # if step_method:1. if the angle between the current and the previous gradients is greater than step_length_gradient_angle, step size -> step length * step_length_change[0]. + # otherwise, step size -> step length * step_length_change[1]. + step_length_gradient_angle: 120 # default: 120.0 + step_length_change: [0.5, 1.2] # default: [0.5,1.2] + # Kdensity_coe is used to rescale the final kernel: kernel -> kernel / pow(density of kernel, Kdensity_coe). if Kdensity_coe > 0, the region with less data will be enhanced during the inversion + # e.g., if Kdensity_coe = 0, kernel remains upchanged; if Kdensity_coe = 1, kernel is fully normalized. 0.5 or less is recommended if really required. + Kdensity_coe: 0 # default: 0.0, limited range: 0.0 - 0.95 + + # smoothing + smoothing: + smooth_method: 0 # 0: multiparametrization, 1: laplacian smoothing (EXPERIMENTAL) + l_smooth_rtp: [1, 1, 1] # smoothing coefficients for laplacian smoothing + + # parameters for smooth method 0 (multigrid model parametrization) + # inversion grid can be viewed in OUTPUT_FILES/inversion_grid.txt + n_inversion_grid: 5 # number of inversion grid sets + + uniform_inv_grid_dep: false # true if use uniform inversion grid for dep, false if use flexible inversion grid + uniform_inv_grid_lat: true # true if use uniform inversion grid for lat, false if use flexible inversion grid + uniform_inv_grid_lon: true # true if use uniform inversion grid for lon, false if use flexible inversion grid + + # -------------- uniform inversion grid setting -------------- + # settings for uniform inversion grid + n_inv_dep_lat_lon: [12, 9, 9] # number of the base inversion grid points + min_max_dep_inv: [-10, 50] # depth in km (Radius of the earth is defined in config.h/R_earth) + min_max_lat_inv: [0, 2] # latitude in degree + min_max_lon_inv: [0, 2] # longitude in degree + + # -------------- flexible inversion grid setting -------------- + # settings for flexible inversion grid + dep_inv: [-10, 0, 10, 20, 30, 40, 50, 60] # inversion grid for vel in depth (km) + lat_inv: [30, 30.2, 30.4, 30.6, 30.8, 31, 31.2, 31.4, 31.6, 31.8, 32] # inversion grid for vel in latitude (degree) + lon_inv: [30, 30.2, 30.4, 30.6, 30.8, 31, 31.2, 31.4, 31.6, 31.8, 32] # inversion grid for vel in longitude (degree) + trapezoid: [1, 0, 50] # usually set as [1.0, 0.0, 50.0] (default) + + # Carefully change trapezoid and trapezoid_ani, if you really want to use trapezoid inversion grid, increasing the inversion grid spacing with depth to account for the worse data coverage in greater depths. + # The trapezoid_ inversion grid with index (i,j,k) in longitude, latitude, and depth is defined as: + # if dep_inv[k] < trapezoid[1], lon = lon_inv[i]; + # lat = lat_inv[j]; + # dep = dep_inv[k]; + # if trapezoid[1] <= dep_inv[k] < trapezoid[2], lon = mid_lon_inv+(lon_inv[i]-mid_lon_inv)*(dep_inv[k]-trapezoid[1])/(trapezoid[2]-trapezoid[1])*trapezoid[0]; + # lat = mid_lat_inv+(lat_inv[i]-mid_lat_inv)*(dep_inv[k]-trapezoid[1])/(trapezoid[2]-trapezoid[1])*trapezoid[0]; + # dep = dep_inv[k]; + # if trapezoid[2] <= dep_inv[k], lon = mid_lon_inv+(lon_inv[i]-mid_lon_inv)*trapezoid[0]; + # lat = mid_lat_inv+(lat_inv[i]-mid_lat_inv)*trapezoid[0]; + # dep = dep_inv[k]; + # The shape of trapezoid inversion gird (x) looks like: + # + # lon_inv[0] [1] [2] [3] [4] + # |<-------- (lon_inv[end] - lon_inv[0]) ---->| + # dep_inv[0] | x x x x x | + # | | + # dep_inv[1] | x x x x x | + # | | + # dep_inv[2] = trapezoid[1] / x x x x x \ + # / \ + # dep_inv[3] / x x x x x \ + # / \ + # dep_inv[4] = trapezoid[2] / x x x x x \ + # | | + # dep_inv[5] | x x x x x | + # | | + # dep_inv[6] | x x x x x | + # |<---- trapezoid[0]* (lon_inv[end] - lon_inv[0]) ------>| + + + # In the following data subsection, XXX_weight means a weight is assigned to the data, influencing the objective function and gradient + # XXX_weight : [d1,d2,w1,w2] means: + # if XXX < d1, weight = w1 + # if d1 <= XXX < d2, weight = w1 + (XXX-d1)/(d2-d1)*(w2-w1), (linear interpolation) + # if d2 <= XXX , weight = w2 + # You can easily set w1 = w2 = 1.0 to normalize the weight related to XXX. + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time: true # 'true' for using absolute traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1, 3, 1, 1] # XXX is the absolute traveltime residual (second) = abs(t^{obs}_{n,i} - t^{syn}_{n,j}) + distance_weight: [100, 200, 1, 1] # XXX is epicenter distance (km) between the source and receiver related to the data + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + use_cs_time: false # 'true' for using common source differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1, 3, 1, 1] # XXX is the common source differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{n,j} - t^{syn}_{n,i} + t^{syn}_{n,j}). + azimuthal_weight: [15, 30, 1, 1] # XXX is the azimuth difference between two separate stations related to the common source. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time: false # 'true' for using common receiver differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1, 3, 1, 1] # XXX is the common receiver differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{m,i} - t^{syn}_{n,i} + t^{syn}_{m,i}) + azimuthal_weight: [15, 30, 1, 1] # XXX is the azimuth difference between two separate sources related to the common receiver. + + # -------------- global weight of different types of data (to balance the weight of different data) -------------- + global_weight: + balance_data_weight: false # yes: over the total weight of the each type of the data. no: use original weight (below weight for each type of data needs to be set) + abs_time_weight: 1 # weight of absolute traveltime data after balance, default: 1.0 + cs_dif_time_local_weight: 1 # weight of common source differential traveltime data after balance, default: 1.0 + cr_dif_time_local_weight: 1 # weight of common receiver differential traveltime data after balance, default: 1.0 + teleseismic_weight: 1 # weight of teleseismic data after balance, default: 1.0 (exclude in this version) + + # -------------- inversion parameters -------------- + update_slowness : true # update slowness (velocity) or not. default: true + update_azi_ani : false # update azimuthal anisotropy (xi, eta) or not. default: false diff --git a/examples/eg4_1d_inversion/plot_output.py b/examples/eg4_1d_inversion/plot_output.py new file mode 100644 index 0000000..9a86fef --- /dev/null +++ b/examples/eg4_1d_inversion/plot_output.py @@ -0,0 +1,37 @@ +import h5py +import matplotlib.pyplot as plt +import numpy as np +import os + +try: + os.mkdir("img") +except: + pass + +dep = np.linspace(50,-10, 61) + +with h5py.File("OUTPUT_FILES/OUTPUT_FILES_1dinv_inv/final_model.h5", "r") as f: + vel_final= np.array(f["vel"]) +with h5py.File("2_models/model_init_N61_61_61.h5", "r") as f: + vel_init = np.array(f["vel"]) +with h5py.File("2_models/model_ckb_N61_61_61.h5", "r") as f: + vel_ckb = np.array(f["vel"]) + +fig = plt.figure(figsize=(6, 6)) +ax = fig.add_subplot(111) +ax.plot(vel_init[:,0,0] , dep, label="init") +ax.plot(vel_ckb[:,0,0], dep, label="ckb") +ax.plot(vel_final[:,0,0], dep, label="inv") +ax.grid() +ax.set_xlabel("Velocity (m/s)",fontsize=16) +ax.set_ylabel("Depth (km)",fontsize=16) +ax.get_xaxis().set_tick_params(labelsize=16) +ax.get_yaxis().set_tick_params(labelsize=16) +ax.set_xlim([4.5,8.5]) +ax.set_ylim([0,50]) + +plt.gca().invert_yaxis() +plt.legend(fontsize=16) + +plt.show() +fig.savefig("img/1d_model_inversion.png", dpi=300, bbox_inches="tight", edgecolor="w", facecolor="w") diff --git a/examples/eg4_1d_inversion/prepare_input_files.py b/examples/eg4_1d_inversion/prepare_input_files.py new file mode 100644 index 0000000..0cd5cdf --- /dev/null +++ b/examples/eg4_1d_inversion/prepare_input_files.py @@ -0,0 +1,64 @@ +# %% +# download src_ref_files from Zenodo +import os +import numpy as np +import sys +try: + from pytomoatt.model import ATTModel + from pytomoatt.checkerboard import Checker + from pytomoatt.src_rec import SrcRec +except: + print("ERROR: ATTModel not found. Please install pytomoatt first." + "See https://tomoatt.github.io/PyTomoATT/installation.html for details.") + sys.exit(1) + + +class BuildInitialModel(): + def __init__(self, par_file="./3_input_params/input_params_signal.yaml", output_dir="2_models"): + """ + Build initial model for tomography inversion + """ + self.am = ATTModel(par_file) + self.output_dir = output_dir + + def build_initial_model(self, vel_min=5.0, vel_max=8.0): + """ + Build initial model for tomography inversion + """ + self.am.vel[self.am.depths < 0, :, :] = vel_min + idx = np.where((0 <= self.am.depths) & (self.am.depths < 40.0))[0] + self.am.vel[idx, :, :] = np.linspace(vel_min, vel_max, idx.size)[::-1][:, np.newaxis, np.newaxis] + self.am.vel[self.am.depths >= 40.0, :, :] = vel_max + + def build_ckb_model(self): + """ + Build checkerboard model for tomography inversion + """ + nr = self.am.n_rtp[0] + for ir in range(nr): + dep = self.am.depths[ir] + self.am.vel[ir, :, :] = (1 + 0.05 * np.sin(np.pi * dep / 10.0)) * self.am.vel[ir, :, :] + + + +if __name__ == "__main__": + # download src_rec_config.dat + url = 'https://zenodo.org/records/14053821/files/src_rec_config.dat' + path = "1_src_rec_files/src_rec_config.dat" + os.makedirs(os.path.dirname(path), exist_ok=True) + if not os.path.exists(path): + sr = SrcRec.read(url) + sr.write(path) + + # build initial model + output_dir = "2_models" + os.makedirs(output_dir, exist_ok=True) + bim = BuildInitialModel(output_dir=output_dir) + bim.build_initial_model() + bim.am.write('{}/model_init_N{:d}_{:d}_{:d}.h5'.format(bim.output_dir, *bim.am.n_rtp)) + + bim.build_ckb_model() + bim.am.write('{}/model_ckb_N{:d}_{:d}_{:d}.h5'.format(bim.output_dir, *bim.am.n_rtp)) + + + diff --git a/examples/eg4_1d_inversion/run_this_example.sh b/examples/eg4_1d_inversion/run_this_example.sh new file mode 100644 index 0000000..f2e4003 --- /dev/null +++ b/examples/eg4_1d_inversion/run_this_example.sh @@ -0,0 +1,27 @@ +#!/bin/bash + + +# Step 1: Generate necessary input files +echo "Generating TomoATT input files..." +python prepare_input_files.py + +# Step 2: Run forward modeling +# # for WSL +# mpirun -n 8 --allow-run-as-root --oversubscribe ../../build/bin/TOMOATT -i 3_input_params/input_params_1dinv_signal.yaml +# # for Linux +# mpirun -n 8 ../../build/bin/TOMOATT -i 3_input_params/input_params_1dinv_signal.yaml +# for conda install +mpirun -n 8 TOMOATT -i 3_input_params/input_params_1dinv_signal.yaml + +# Step 3: Do inversion +# # for WSL +# mpirun -n 8 --allow-run-as-root --oversubscribe ../../build/bin/TOMOATT -i 3_input_params/input_params_1dinv_inv.yaml +# # for Linux +# mpirun -n 8 ../../build/bin/TOMOATT -i 3_input_params/input_params_1dinv_inv.yaml +# for conda install +mpirun -n 8 TOMOATT -i 3_input_params/input_params_1dinv_inv.yaml + +# Step 4 (Optional): Plot the results +echo "Plotting the results..." +python plot_output.py + diff --git a/examples/realcase1_regional_tomography_California/.DS_Store b/examples/realcase1_regional_tomography_California/.DS_Store new file mode 100644 index 0000000..dd0a91e Binary files /dev/null and b/examples/realcase1_regional_tomography_California/.DS_Store differ diff --git a/examples/realcase1_regional_tomography_California/3_input_params/input_params_real.yaml b/examples/realcase1_regional_tomography_California/3_input_params/input_params_real.yaml new file mode 100644 index 0000000..39b35ef --- /dev/null +++ b/examples/realcase1_regional_tomography_California/3_input_params/input_params_real.yaml @@ -0,0 +1,186 @@ +version: 3 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-5, 45] # depth in km + min_max_lat: [-2.0, 2.4] # latitude in degree + min_max_lon: [-0.8, 0.8] # longitude in degree + n_rtp: [51, 89, 33] # number of nodes in depth,latitude,longitude direction + +################################################# +# traveltime data file path # +################################################# +source: + src_rec_file: 1_src_rec_files/src_rec_file.dat # source receiver file path + swap_src_rec: true # swap source and receiver + +################################################# +# initial model file path # +################################################# +model: + init_model_path: 2_models/model_init_N51_89_33.h5 # path to initial model file + +################################################# +# parallel computation settings # +################################################# +parallel: # parameters for parallel computation + n_sims: 8 # number of simultanoues runs (parallel the sources) + ndiv_rtp: [1, 1, 1] # number of subdivision on each direction (parallel the computional domain) + +############################################ +# output file setting # +############################################ +output_setting: + output_dir: OUTPUT_FILES/OUTPUT_FILES_inv # path to output director (default is ./OUTPUT_FILES/) + output_source_field: false # True: output the traveltime field and adjoint field of all sources at each iteration. Default: false. File: 'out_data_sim_group_X'. + output_kernel: true + output_final_model: true # True: output merged final model. This file can be used as the input model for TomoATT. Default: true. File: 'model_final.h5'. + output_middle_model: true # True: output merged intermediate models during inversion. This file can be used as the input model for TomoATT. Default: false. File: 'middle_model_step_XXXX.h5' + output_in_process: true # True: output at each inv iteration, otherwise, only output step 0, Niter-1, Niter. Default: true. File: 'out_data_sim_group_0'. + output_in_process_data: true # True: output src_rec_file at each inv iteration, otherwise, only output step 0, Niter-2, Niter-1. Default: true. File: 'src_rec_file_step_XXXX.dat' + single_precision_output: false # True: output results in single precision. Default: false. + verbose_output_level: 0 # output internal parameters, (to do) + output_file_format: 0 # 0: hdf5, 1: ascii + +# output files: +# File: 'out_data_grid.h5'. Keys: ['Mesh']['elem_conn'], element index; +# ['Mesh']['node_coords_p'], phi coordinates of nodes; +# ['Mesh']['node_coords_t'], theta coordinates of nodes; +# ['Mesh']['node_coords_r'], r coordinates of nodes; +# ['Mesh']['node_coords_x'], phi coordinates of elements; +# ['Mesh']['node_coords_y'], theta coordinates of elements; +# ['Mesh']['node_coords_z'], r coordinates of elements; +# File: 'out_data_sim_group_0'. Keys: ['model']['vel_inv_XXXX'], velocity model at iteration XXXX; +# ['model']['xi_inv_XXXX'], xi model at iteration XXXX; +# ['model']['eta_inv_XXXX'], eta model at iteration XXXX +# ['model']['Ks_inv_XXXX'], sensitivity kernel related to slowness at iteration XXXX +# ['model']['Kxi_inv_XXXX'], sensitivity kernel related to xi at iteration XXXX +# ['model']['Keta_inv_XXXX'], sensitivity kernel related to eta at iteration XXXX +# ['model']['Ks_density_inv_XXXX'], kernel density of Ks at iteration XXXX +# ['model']['Kxi_density_inv_XXXX'], kernel density of Kxi at iteration XXXX +# ['model']['Keta_density_inv_XXXX'], kernel density of Keta at iteration XXXX +# ['model']['Ks_over_Kden_inv_XXXX'], slowness kernel over kernel density at iteration XXXX +# ['model']['Kxi_over_Kden_inv_XXXX'], xi kernel over kernel density at iteration XXXX +# ['model']['Keta_over_Kden_inv_XXXX'], eta kernel over kernel density at iteration XXXX +# ['model']['Ks_update_inv_XXXX'], slowness kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Kxi_update_inv_XXXX'], xi kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Keta_update_inv_XXXX'], eta kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['1dinv']['vel_1dinv_inv_XXXX'], 2d velocity model at iteration XXXX, in 1d inversion mode +# ['1dinv']['r_1dinv'], r coordinates (depth), in 1d inversion mode +# ['1dinv']['t_1dinv'], t coordinates (epicenter distance), in 1d inversion mode +# File: 'src_rec_file_step_XXXX.dat' or 'src_rec_file_forward.dat'. The synthetic traveltime data file. +# File: 'final_model.h5'. Keys: ['eta'], ['xi'], ['vel'], the final model. +# File: 'middle_model_step_XXXX.h5'. Keys: ['eta'], ['xi'], ['vel'], the model at step XXXX. +# File: 'inversion_grid.txt'. The location of inversion grid nodes +# File: 'objective_function.txt'. The objective function value at each iteration +# File: 'out_data_sim_group_X'. Keys: ['src_YYYY']['time_field_inv_XXXX'], traveltime field of source YYYY at iteration XXXX; +# ['src_YYYY']['adjoint_field_inv_XXXX'], adjoint field of source YYYY at iteration XXXX; +# ['1dinv']['time_field_1dinv_YYYY_inv_XXXX'], 2d traveltime field of source YYYY at iteration XXXX, in 1d inversion mode +# ['1dinv']['adjoint_field_1dinv_YYYY_inv_XXXX'], 2d adjoint field of source YYYY at iteration XXXX, in 1d inversion mode + + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion + earthquake relocation +# 4 for 1d model inversion +run_mode: 1 + +################################################### +# model update parameters setting # +################################################### +model_update: + max_iterations: 80 # maximum number of inversion iterations + + step_length: 0.01 # the initial step length of model perturbation. 0.01 means maximum 1% perturbation for each iteration. + + # parameters for optim_method 0 (gradient_descent) + optim_method_0: + # if step_method:1. if the angle between the current and the previous gradients is greater than step_length_gradient_angle, step size -> step length * step_length_change[0]. + # otherwise, step size -> step length * step_length_change[1]. + step_length_gradient_angle: 120 # default: 120.0 + step_length_change: [0.5, 1.41] # default: [0.5,1.2] + Kdensity_coe: 0.3 # default: 0.0, range: 0.0 - 1.0 + + # parameters for smooth method 0 (multigrid model parametrization) + # inversion grid can be viewed in OUTPUT_FILES/inversion_grid.txt + n_inversion_grid: 5 # number of inversion grid sets + + uniform_inv_grid_dep: false # true if use uniform inversion grid for dep, false if use flexible inversion grid + uniform_inv_grid_lat: false # true if use uniform inversion grid for lat, false if use flexible inversion grid + uniform_inv_grid_lon: false # true if use uniform inversion grid for lon, false if use flexible inversion grid + + # settings for uniform inversion grid + n_inv_dep_lat_lon: [3, 11, 11] # number of inversion grid in depth, latitude, and longitude direction + min_max_dep_inv: [-5 , 5] # inversion grid for vel in depth (km) + min_max_lat_inv: [0, 1] # inversion grid for vel in latitude (degree) + min_max_lon_inv: [0, 1] # inversion grid for vel in longitude (degree) + + # settings for flexible inversion grid + dep_inv: [-5, -2, 0, 3, 7, 12, 17, 23, 30, 38, 47, 57] # inversion grid for vel in depth (km) + lat_inv: [-2.5, -2.2, -1.9, -1.6, -1.3, -1.0, -0.7, -0.4, -0.1, 0.2, 0.5, 0.8, 1.1, 1.4, 1.7, 2.0, 2.3, 2.6] # inversion grid for vel in latitude (degree) + lon_inv: [-1.2, -0.9, -0.6, -0.3, 0, 0.3, 0.6, 0.9, 1.2] # inversion grid for vel in longitude (degree) + trapezoid: [1, 0, 50] # usually set as [1.0, 0.0, 50.0] (default) + + # if we want to use another inversion grid for inverting anisotropy, set invgrid_ani: true (default: false) + invgrid_ani: true + + # ---------- flexible inversion grid setting for anisotropy ---------- + # settings for flexible inversion grid for anisotropy + dep_inv_ani: [-5, -2, 0, 3, 7, 12, 17, 23, 30, 38, 47, 57] # inversion grid for ani in depth (km) + lat_inv_ani: [-2.8, -2.3, -1.8, -1.3, -0.8, -0.3, 0.2, 0.7, 1.2, 1.7, 2.2, 2.7] # inversion grid for ani in latitude (degree) + lon_inv_ani: [-1.2, -0.9, -0.6, -0.3, 0, 0.3, 0.6, 0.9, 1.2] # inversion grid for ani in longitude (degree) + trapezoid_ani: [1, 0, 50] # usually set as [1.0, 0.0, 50.0] (default) + + + # Carefully change trapezoid and trapezoid_ani, if you really want to use trapezoid inversion grid, increasing the inversion grid spacing with depth to account for the worse data coverage in greater depths. + # The trapezoid_ inversion grid with index (i,j,k) in longitude, latitude, and depth is defined as: + # if dep_inv[k] < trapezoid[1], lon = lon_inv[i]; + # lat = lat_inv[j]; + # dep = dep_inv[k]; + # if trapezoid[1] <= dep_inv[k] < trapezoid[2], lon = mid_lon_inv+(lon_inv[i]-mid_lon_inv)*(dep_inv[k]-trapezoid[1])/(trapezoid[2]-trapezoid[1])*trapezoid[0]; + # lat = mid_lat_inv+(lat_inv[i]-mid_lat_inv)*(dep_inv[k]-trapezoid[1])/(trapezoid[2]-trapezoid[1])*trapezoid[0]; + # dep = dep_inv[k]; + # if trapezoid[2] <= dep_inv[k], lon = mid_lon_inv+(lon_inv[i]-mid_lon_inv)*trapezoid[0]; + # lat = mid_lat_inv+(lat_inv[i]-mid_lat_inv)*trapezoid[0]; + # dep = dep_inv[k]; + # The shape of trapezoid inversion gird (x) looks like: + # + # lon_inv[0] [1] [2] [3] [4] + # |<-------- (lon_inv[end] - lon_inv[0]) ---->| + # dep_inv[0] | x x x x x | + # | | + # dep_inv[1] | x x x x x | + # | | + # dep_inv[2] = trapezoid[1] / x x x x x \ + # / \ + # dep_inv[3] / x x x x x \ + # / \ + # dep_inv[4] = trapezoid[2] / x x x x x \ + # | | + # dep_inv[5] | x x x x x | + # | | + # dep_inv[6] | x x x x x | + # |<---- trapezoid[0]* (lon_inv[end] - lon_inv[0]) ------>| + + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time: true # 'true' for using absolute traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + use_cs_time: false # 'true' for using common source differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time: false # 'true' for using common receiver differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + + # -------------- inversion parameters -------------- + update_slowness : true # update slowness (velocity) or not. default: true + update_azi_ani : true # update azimuthal anisotropy (xi, eta) or not. default: false diff --git a/examples/realcase1_regional_tomography_California/README.md b/examples/realcase1_regional_tomography_California/README.md new file mode 100644 index 0000000..537aff4 --- /dev/null +++ b/examples/realcase1_regional_tomography_California/README.md @@ -0,0 +1,30 @@ +# Real case of regional tomography in central California near Parkfield + +This is a real case to invert traveltimes for velocity heterogeneity and azimuthal anisotropy in central California near Parkfield + +Reference: + +[1] J. Chen, G. Chen, M. Nagaso, and P. Tong, Adjoint-state traveltime tomography for azimuthally anisotropic media in spherical coordinates. Geophys. J. Int., 234 (2023), pp. 712-736. +https://doi.org/10.1093/gji/ggad093 + +[2] J. Chen, M. Nagaso, M. Xu, and P. Tong, TomoATT: An open-source package for Eikonal equation-based adjoint-state traveltime tomography for seismic velocity and azimuthal anisotropy, submitted. +https://doi.org/10.48550/arXiv.2412.00031 + + +Python modules are required to initiate the inversion and to plot final results: +- h5py +- PyTomoAT +- Pygmt +- gmt + +Run this example: + +1. Run bash script `bash run_this_example.sh` to execute the test. + +2. After inversion, run `plot_output.py` to plot the results. + +The imaging results: + +![](img/imaging_result.jpg) + + diff --git a/examples/realcase1_regional_tomography_California/plot_output.py b/examples/realcase1_regional_tomography_California/plot_output.py new file mode 100644 index 0000000..81bd195 --- /dev/null +++ b/examples/realcase1_regional_tomography_California/plot_output.py @@ -0,0 +1,222 @@ +# %% +import pygmt +pygmt.config(FONT="16p", IO_SEGMENT_MARKER="<<<") + +import os + +# %% +from pytomoatt.model import ATTModel +from pytomoatt.data import ATTData +import numpy as np + +# %% +# read model files + +Ngrid = [51,89,33] +data_file = '2_models/model_init_N%d_%d_%d.h5'%(Ngrid[0],Ngrid[1],Ngrid[2]) +par_file = '3_input_params/input_params_real.yaml' +model = ATTModel.read(data_file, par_file) +initial_model = model.to_xarray() + +data_file = 'OUTPUT_FILES/OUTPUT_FILES_real/final_model.h5' +model = ATTModel.read(data_file, par_file) +inv_model = model.to_xarray() + +# %% +# read earthquakes and stations + +from pytomoatt.src_rec import SrcRec + +# read src_rec_file +sr = SrcRec.read("1_src_rec_files/src_rec_file.dat") + +# rotate back to original coordinates +central_lat = 35.6 +central_lon = -120.45 +rotation_angle = -30 +sr.rotate(central_lat, central_lon, rotation_angle, reverse=True) + +# get the coordinates of the stations and earthquakes +stations = sr.receivers[['stlo','stla','stel']].values.T +earthquakes = sr.sources[['evlo','evla','evdp']].values.T + +print(stations.shape) +print(earthquakes.shape) + +# %% +# study region + +import sys +sys.path.append('../utils') +import functions_for_data as ffd + +lat1 = -1.8; lat2 = 2.2; +lon1 = -0.7; lon2 = 0.7; + +lat_lon_rotate = np.array([[lon1,lat1],[lon1,lat2],[lon2,lat2],[lon2,lat1],[lon1,lat1]]) +lat_lon = ffd.rtp_rotation_reverse(lat_lon_rotate[:,1],lat_lon_rotate[:,0],central_lat,central_lon,rotation_angle) +studt_lat = lat_lon[0] +studt_lon = lat_lon[1] + +# %% +# load topography +region = [-122.8,-118.5,33.5,38] +grid_topo = pygmt.datasets.load_earth_relief(resolution="01m", region=region) +grid_gra = pygmt.grdgradient(grid = grid_topo, azimuth = 0) + +# %% +def line_read(file): + doc=open(file,'r') + file = doc.readlines() + doc.close() + lat = []; lon = []; + for info in file: + tmp = info.split() + lon.append(float(tmp[0])) + lat.append(float(tmp[1])) + return((lat,lon)) + +# %% +# plot imgaing results + +fig = pygmt.Figure() +try: + os.mkdir("img") +except: + pass + + +# ------------------ Sub fig 1. topography ------------------ +region = [-122.8,-118.5,33.5,38] +frame = ["xa1","ya1","nSWe"] +projection = "M10c" + +# topography +pygmt.makecpt(cmap="globe", series=[-4000,4000], background = True) +fig.grdimage(grid=grid_topo, shading = grid_gra, projection=projection, frame=frame,region=region) +# study region +fig.plot(x = studt_lon, y = studt_lat, pen = "1.5p,red") +# earthquakes +fig.plot(x = earthquakes[0,:], y = earthquakes[1,:], style = "c0.02c", fill = "red",label = "Earthquake") +# stations +fig.plot(x = stations[0,:], y = stations[1,:], style = "t0.2c", fill = "blue", pen = "white", label = "Station") + + +fig.basemap(region=[0,1,0,1], frame=["wesn+gwhite"], projection="X4c/2c") +fig.plot(x=0.1, y=0.3, style='c0.2c', fill='red') +fig.text(text="Earthquake", x=0.2, y=0.3, font="16p,Helvetica", justify="LM") +fig.plot(x=0.1, y=0.7, style='t0.4c', fill='blue', pen='black') +fig.text(text="Station", x=0.2, y=0.7, font="16p,Helvetica", justify="LM") + + +# ------------------ Sub fig 2. colorbar ------------------ +fig.shift_origin(xshift= 2, yshift= -2) + +pygmt.makecpt(cmap="globe", series=[-4000,4000], background = True) +fig.colorbar(frame = ["a%f"%(4000),"y+lElevation (m)"], position="+e+w4c/0.3c+h") +fig.shift_origin(yshift=-2) + +pygmt.makecpt(cmap="../utils/svel13_chen.cpt", series=[-8, 8], background=True, reverse=False) +fig.colorbar(frame = ["a%f"%(4),"y+ldlnVp (%)"], position="+e+w4c/0.3c+h") +fig.shift_origin(yshift=-2) + +pygmt.makecpt(cmap="cool", series=[0, 0.08], background=True, reverse=False) +fig.colorbar(frame = ["a%f"%(0.04),"y+lAnisotropy"], position="+ef+w4c/0.3c+h") + + + +# ------------------ Sub fig 3. model ------------------ +fig.shift_origin(xshift = 10, yshift=8) + +region_oblique = [-0.7,0.7,-2.2,1.8] +projection = "OA%s/%s/%s/4c"%(central_lon,central_lat,rotation_angle-90.0) +perspective = "30/90" +spacing = "1m" + +depth_list = [4,8,16] + +for idepth, depth in enumerate(depth_list): + + # initial model + vel_init = initial_model.interp_dep(depth, field='vel') + + # output model + vel_inv = inv_model.interp_dep(depth, field='vel') # velocity + epsilon_inv = inv_model.interp_dep(depth, field='epsilon') # magnitude of anisotropy + + # fast velocity directions + samp_interval = 3 + ani_thd = 0.015 + length = 20 + width = 0.1 + + ani_inv_phi = inv_model.interp_dep(depth, field='phi', samp_interval=samp_interval) + ani_inv_epsilon = inv_model.interp_dep(depth, field='epsilon', samp_interval=samp_interval) + ani_inv = np.hstack([ani_inv_phi, ani_inv_epsilon[:,2].reshape(-1, 1)*length, np.ones((ani_inv_epsilon.shape[0],1))*width]) # lon, lat, angle, length, width + idx = np.where(ani_inv_epsilon[:,2] > ani_thd) + ani = ani_inv[idx[0],:] + + # --------- plot velocity ------------ + if idepth == 0: + frame = ["xa100","ya1","nSwE"] + elif idepth == len(depth_list)-1: + frame = ["xa100","ya1","NsWe"] + else: + frame = ["xa100","ya1","nswe"] + + fig.basemap(region=region_oblique, frame=frame, projection=projection, perspective=perspective) + pygmt.makecpt(cmap="../utils/svel13_chen.cpt", series=[-8, 8], background=True, reverse=False) + + x = vel_init[:,0]; y = vel_init[:,1]; value = (vel_inv[:,2] - vel_init[:,2])/vel_init[:,2] * 100 + y,x = ffd.rtp_rotation_reverse(y,x,central_lat,central_lon,rotation_angle) + grid = pygmt.surface(x=x, y=y, z=value, spacing=spacing,region=region) + fig.grdimage(frame=frame,grid = grid,projection=projection, region=region_oblique,perspective=perspective) # nan_transparent may work + + # tectonic setting + fig.coast(region=region_oblique, frame=frame, projection=projection, perspective=perspective, shorelines="1p,black") # coastlines + (SAFy,SAFx) = line_read("tectonics/SAF") + fig.plot(x = SAFx, y = SAFy, pen = '3.0p,black', perspective = perspective) # SAF + if idepth == 0: + fig.text(text = "SMB", x = -120.45 , y = 35.0, font = "16p,Helvetica-Bold,black", angle = 150, fill = "lightblue", perspective = perspective) # SMB + fig.text(text = "FT", x = -120.6 , y = 36.50, font = "16p,Helvetica-Bold,black", angle = 150, fill = "lightblue", perspective = perspective) # Franciscan terrane + fig.text(text = "ST", x = -121.1 , y = 36.0, font = "16p,Helvetica-Bold,black", angle = 150, fill = "lightblue", perspective = perspective) # Salinian terrane + fig.text(text = "TR", x = -119.30 , y = 34.70, font = "16p,Helvetica-Bold,black", angle = 150, fill = "lightblue", perspective = perspective) # Coast Ranges + + # depth label + fig.text(text="%d km"%(depth), x = -119.8 , y = 34.0, font = "16p,Helvetica-Bold,black", angle = 180, fill = "white", perspective = perspective) # Coast Ranges + + + # --------- plot anisotropy ------------ + fig.shift_origin(yshift=-12) + + fig.basemap(region=region_oblique, frame=frame, projection=projection, perspective=perspective) + pygmt.makecpt(cmap="cool", series=[0, 0.08], background=True) + value = epsilon_inv[:,2] + grid = pygmt.surface(x=x, y=y, z=value, spacing=spacing,region=region) + fig.grdimage(frame=frame,grid = grid,projection=projection, region=region_oblique,perspective=perspective) # nan_transparent may work + + # tectonic setting + fig.coast(region=region_oblique, frame=frame, projection=projection, perspective=perspective, shorelines="1p,black") # coastlines + (line_y,line_x) = line_read("tectonics/SAF_creeping") + fig.plot(x = line_x, y = line_y, pen = '3.0p,black',perspective = perspective) + (line_y,line_x) = line_read("tectonics/SAF_transition") + fig.plot(x = line_x, y = line_y, pen = '3.0p,red',perspective = perspective) + (line_y,line_x) = line_read("tectonics/SAF_locked") + fig.plot(x = line_x, y = line_y, pen = '3.0p,blue',perspective = perspective) + + # anisotropy + if len(ani) > 0: + # rotate back to original coordinates + x = ani[:,0]; y = ani[:,1] + y,x = ffd.rtp_rotation_reverse(y,x,central_lat,central_lon,rotation_angle) + ani[:,0] = x; ani[:,1] = y; # no need to modify the angle, because the porjection angle and rotate angle are the same + fig.plot(ani, style='j', fill='yellow1', pen='0.5p,black',perspective=perspective) + + fig.shift_origin(xshift=6,yshift=12) + + +fig.show() + +fig.savefig("img/imaging_result.png") + + diff --git a/examples/realcase1_regional_tomography_California/prepare_input_files.py b/examples/realcase1_regional_tomography_California/prepare_input_files.py new file mode 100644 index 0000000..d28a636 --- /dev/null +++ b/examples/realcase1_regional_tomography_California/prepare_input_files.py @@ -0,0 +1,45 @@ +# %% +# download src_ref_files from Zenodo +import os +import requests + +url = 'https://zenodo.org/records/14065341/files/src_rec_file.dat?download=1' + +path = "1_src_rec_files/src_rec_file.dat" + +# check file existence +if not os.path.exists(path): + try: + os.mkdir("1_src_rec_files") + except: + pass + print("Downloading src_rec_file.dat from Zenodo...") + response = requests.get(url, stream=True) + with open(path, 'wb') as out_file: + out_file.write(response.content) + print("Download complete.") +else: + print("src_rec_file.dat already exists.") + +# %% +# download initial model from Zenodo + +url = 'https://zenodo.org/records/14065341/files/model_init_N51_89_33.h5?download=1' + +path = "2_models/model_init_N51_89_33.h5" + +# check file existence +if not os.path.exists(path): + try: + os.mkdir("2_models") + except: + pass + print("Downloading model_init_N51_89_33.h5 from Zenodo...") + response = requests.get(url, stream=True) + with open(path, 'wb') as out_file: + out_file.write(response.content) + print("Download complete.") +else: + print("model_init_N51_89_33.h5 already exists.") + + diff --git a/examples/realcase1_regional_tomography_California/run_this_example.sh b/examples/realcase1_regional_tomography_California/run_this_example.sh new file mode 100644 index 0000000..59016cc --- /dev/null +++ b/examples/realcase1_regional_tomography_California/run_this_example.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# Step 1: Generate necessary input files +python prepare_input_files.py + +# Step 2: Run inversion +# # for WSL +# mpirun -n 8 --allow-run-as-root --oversubscribe ../../build/bin/TOMOATT -i 3_input_params/input_params_real.yaml +# for Linux +# mpirun -n 8 ../../build/bin/TOMOATT -i 3_input_params/input_params_real.yaml +# for conda install +mpirun -n 8 TOMOATT -i 3_input_params/input_params_real.yaml + +# Step 3 (Optional): Plot the results +python plot_output.py + diff --git a/examples/realcase1_regional_tomography_California/tectonics/SAF b/examples/realcase1_regional_tomography_California/tectonics/SAF new file mode 100644 index 0000000..c91fe84 --- /dev/null +++ b/examples/realcase1_regional_tomography_California/tectonics/SAF @@ -0,0 +1,68 @@ +-122.73566 37.96894 +-122.70941 37.93895 +-122.65033 37.88999 +-122.62177 37.83209 +-122.59009 37.79618 +-122.56673 37.74661 +-122.51982 37.71281 +-122.47924 37.65959 +-122.40956 37.58436 +-122.38051 37.54962 +-122.32748 37.48461 +-122.23632 37.38344 +-122.18852 37.34638 +-122.15621 37.31470 +-122.11902 37.26828 +-122.01512 37.19501 +-121.92424 37.12444 +-121.88689 37.10485 +-121.86086 37.08276 +-121.78342 37.04335 +-121.70450 36.97942 +-121.65426 36.93801 +-121.57487 36.88348 +-121.47861 36.81956 +-121.43712 36.78821 +-121.40534 36.76781 +-121.36812 36.75009 +-121.33557 36.71495 +-121.27255 36.67184 +-121.16342 36.57248 +-121.09358 36.51578 +-121.02139 36.44378 +-120.93316 36.35578 +-120.79679 36.21978 +-120.63636 36.07582 +-120.52406 35.97185 +-120.43583 35.90791 +-120.33957 35.81993 +-120.29568 35.74979 +-120.26271 35.71512 +-120.23380 35.67390 +-120.19772 35.63300 +-120.12299 35.56383 +-120.02674 35.48387 +-119.98846 35.44344 +-119.88017 35.32590 +-119.78610 35.24387 +-119.67380 35.14792 +-119.53743 35.04400 +-119.40726 34.94926 +-119.34920 34.92597 +-119.31423 34.90995 +-119.24588 34.88266 +-119.20791 34.87552 +-119.16832 34.87107 +-119.12954 34.86300 +-119.09076 34.86210 +-118.97416 34.84129 +-118.93565 34.84176 +-118.85999 34.82469 +-118.78894 34.79661 +-118.72217 34.76987 +-118.68535 34.75631 +-118.56902 34.72084 +-118.49005 34.70185 +-118.39037 34.66204 +-118.22995 34.61434 +-118.06150 34.54260 diff --git a/examples/realcase1_regional_tomography_California/tectonics/SAF_creeping b/examples/realcase1_regional_tomography_California/tectonics/SAF_creeping new file mode 100644 index 0000000..ef46433 --- /dev/null +++ b/examples/realcase1_regional_tomography_California/tectonics/SAF_creeping @@ -0,0 +1,10 @@ +-121.36812 36.75009 +-121.33557 36.71495 +-121.27255 36.67184 +-121.16342 36.57248 +-121.09358 36.51578 +-121.02139 36.44378 +-120.93316 36.35578 +-120.79679 36.21978 +-120.63636 36.07582 +-120.52406 35.97185 diff --git a/examples/realcase1_regional_tomography_California/tectonics/SAF_locked b/examples/realcase1_regional_tomography_California/tectonics/SAF_locked new file mode 100644 index 0000000..dd7d6a6 --- /dev/null +++ b/examples/realcase1_regional_tomography_California/tectonics/SAF_locked @@ -0,0 +1,10 @@ +-120.26271 35.71512 +-120.23380 35.67390 +-120.19772 35.63300 +-120.12299 35.56383 +-120.02674 35.48387 +-119.98846 35.44344 +-119.88017 35.32590 +-119.78610 35.24387 +-119.67380 35.14792 +-119.53743 35.04400 \ No newline at end of file diff --git a/examples/realcase1_regional_tomography_California/tectonics/SAF_transition b/examples/realcase1_regional_tomography_California/tectonics/SAF_transition new file mode 100644 index 0000000..a530619 --- /dev/null +++ b/examples/realcase1_regional_tomography_California/tectonics/SAF_transition @@ -0,0 +1,5 @@ +-120.52406 35.97185 +-120.43583 35.90791 +-120.33957 35.81993 +-120.29568 35.74979 +-120.26271 35.71512 \ No newline at end of file diff --git a/examples/realcase2_teleseismic_tomography_Thailand/.DS_Store b/examples/realcase2_teleseismic_tomography_Thailand/.DS_Store new file mode 100644 index 0000000..366fd7e Binary files /dev/null and b/examples/realcase2_teleseismic_tomography_Thailand/.DS_Store differ diff --git a/examples/realcase2_teleseismic_tomography_Thailand/3_input_params/input_params_real.yaml b/examples/realcase2_teleseismic_tomography_Thailand/3_input_params/input_params_real.yaml new file mode 100644 index 0000000..623ce4f --- /dev/null +++ b/examples/realcase2_teleseismic_tomography_Thailand/3_input_params/input_params_real.yaml @@ -0,0 +1,187 @@ +version: 3 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-50, 550] # depth in km + min_max_lat: [10.5, 22.5] # latitude in degree + min_max_lon: [95.5, 107.5] # longitude in degree + n_rtp: [121, 121, 121] # number of nodes in depth,latitude,longitude direction + +################################################# +# traveltime data file path # +################################################# +source: + src_rec_file: 1_src_rec_files/src_rec_file.dat # source receiver file path + swap_src_rec: false # swap source and receiver + +################################################# +# initial model file path # +################################################# +model: + init_model_path: 2_models/model_init_N121_121_121.h5 # path to initial model file + +################################################# +# parallel computation settings # +################################################# +parallel: # parameters for parallel computation + n_sims: 8 # number of simultanoues runs (parallel the sources) + ndiv_rtp: [1, 1, 1] # number of subdivision on each direction (parallel the computional domain) + +############################################ +# output file setting # +############################################ +output_setting: + output_dir: OUTPUT_FILES/OUTPUT_FILES_real # path to output director (default is ./OUTPUT_FILES/) + output_source_field: false # True: output the traveltime field and adjoint field of all sources at each iteration. Default: false. File: 'out_data_sim_group_X'. + output_kernel: false + output_final_model: true # True: output merged final model. This file can be used as the input model for TomoATT. Default: true. File: 'model_final.h5'. + output_middle_model: false # True: output merged intermediate models during inversion. This file can be used as the input model for TomoATT. Default: false. File: 'middle_model_step_XXXX.h5' + output_in_process: false # True: output at each inv iteration, otherwise, only output step 0, Niter-1, Niter. Default: true. File: 'out_data_sim_group_0'. + output_in_process_data: false # True: output src_rec_file at each inv iteration, otherwise, only output step 0, Niter-2, Niter-1. Default: true. File: 'src_rec_file_step_XXXX.dat' + single_precision_output: false # True: output results in single precision. Default: false. + verbose_output_level: 0 # output internal parameters, (to do) + output_file_format: 0 # 0: hdf5, 1: ascii + +# output files: +# File: 'out_data_grid.h5'. Keys: ['Mesh']['elem_conn'], element index; +# ['Mesh']['node_coords_p'], phi coordinates of nodes; +# ['Mesh']['node_coords_t'], theta coordinates of nodes; +# ['Mesh']['node_coords_r'], r coordinates of nodes; +# ['Mesh']['node_coords_x'], phi coordinates of elements; +# ['Mesh']['node_coords_y'], theta coordinates of elements; +# ['Mesh']['node_coords_z'], r coordinates of elements; +# File: 'out_data_sim_group_0'. Keys: ['model']['vel_inv_XXXX'], velocity model at iteration XXXX; +# ['model']['xi_inv_XXXX'], xi model at iteration XXXX; +# ['model']['eta_inv_XXXX'], eta model at iteration XXXX +# ['model']['Ks_inv_XXXX'], sensitivity kernel related to slowness at iteration XXXX +# ['model']['Kxi_inv_XXXX'], sensitivity kernel related to xi at iteration XXXX +# ['model']['Keta_inv_XXXX'], sensitivity kernel related to eta at iteration XXXX +# ['model']['Ks_density_inv_XXXX'], kernel density of Ks at iteration XXXX +# ['model']['Kxi_density_inv_XXXX'], kernel density of Kxi at iteration XXXX +# ['model']['Keta_density_inv_XXXX'], kernel density of Keta at iteration XXXX +# ['model']['Ks_over_Kden_inv_XXXX'], slowness kernel over kernel density at iteration XXXX +# ['model']['Kxi_over_Kden_inv_XXXX'], xi kernel over kernel density at iteration XXXX +# ['model']['Keta_over_Kden_inv_XXXX'], eta kernel over kernel density at iteration XXXX +# ['model']['Ks_update_inv_XXXX'], slowness kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Kxi_update_inv_XXXX'], xi kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Keta_update_inv_XXXX'], eta kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['1dinv']['vel_1dinv_inv_XXXX'], 2d velocity model at iteration XXXX, in 1d inversion mode +# ['1dinv']['r_1dinv'], r coordinates (depth), in 1d inversion mode +# ['1dinv']['t_1dinv'], t coordinates (epicenter distance), in 1d inversion mode +# File: 'src_rec_file_step_XXXX.dat' or 'src_rec_file_forward.dat'. The synthetic traveltime data file. +# File: 'final_model.h5'. Keys: ['eta'], ['xi'], ['vel'], the final model. +# File: 'middle_model_step_XXXX.h5'. Keys: ['eta'], ['xi'], ['vel'], the model at step XXXX. +# File: 'inversion_grid.txt'. The location of inversion grid nodes +# File: 'objective_function.txt'. The objective function value at each iteration +# File: 'out_data_sim_group_X'. Keys: ['src_YYYY']['time_field_inv_XXXX'], traveltime field of source YYYY at iteration XXXX; +# ['src_YYYY']['adjoint_field_inv_XXXX'], adjoint field of source YYYY at iteration XXXX; +# ['1dinv']['time_field_1dinv_YYYY_inv_XXXX'], 2d traveltime field of source YYYY at iteration XXXX, in 1d inversion mode +# ['1dinv']['adjoint_field_1dinv_YYYY_inv_XXXX'], 2d adjoint field of source YYYY at iteration XXXX, in 1d inversion mode + + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion + earthquake relocation +# 4 for 1d model inversion +run_mode: 1 + +have_tele_data: true # An error will be reported if false but source out of study region is used. Default: false. +ignore_velocity_discontinuity: true # An error will be reported if false but there is velocity discontinuity (v[ix,iy,iz+1] > v[ix,iy,iz] * 1.2 or v[ix,iy,iz+1] < v[ix,iy,iz] * 0.8) in the input model. Default: false. + +################################################### +# model update parameters setting # +################################################### +model_update: + max_iterations: 80 # maximum number of inversion iterations + + step_length: 0.01 # the initial step length of model perturbation. 0.01 means maximum 1% perturbation for each iteration. + + # parameters for optim_method 0 (gradient_descent) + optim_method_0: + # if step_method:1. if the angle between the current and the previous gradients is greater than step_length_gradient_angle, step size -> step length * step_length_change[0]. + # otherwise, step size -> step length * step_length_change[1]. + step_length_gradient_angle: 120 # default: 120.0 + step_length_change: [0.5, 1.41] # default: [0.5,1.2] + Kdensity_coe: 0.3 # default: 0.0, range: 0.0 - 1.0 + + # parameters for smooth method 0 (multigrid model parametrization) + # inversion grid can be viewed in OUTPUT_FILES/inversion_grid.txt + n_inversion_grid: 5 # number of inversion grid sets + + uniform_inv_grid_dep: false # true if use uniform inversion grid for dep, false if use flexible inversion grid + uniform_inv_grid_lat: false # true if use uniform inversion grid for lat, false if use flexible inversion grid + uniform_inv_grid_lon: false # true if use uniform inversion grid for lon, false if use flexible inversion grid + + # settings for flexible inversion grid + dep_inv: [-50, -25, 0, 50, 100, 150, 200, 275, 350, 425, 500, 600,700] # inversion grid for vel in depth (km) + lat_inv: [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23] # inversion grid for vel in latitude (degree) + lon_inv: [95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108] # inversion grid for vel in longitude (degree) + trapezoid: [1, 0, 50] # usually set as [1.0, 0.0, 50.0] (default) + + # if we want to use another inversion grid for inverting anisotropy, set invgrid_ani: true (default: false) + invgrid_ani: false + + # ---------- flexible inversion grid setting for anisotropy ---------- + # settings for flexible inversion grid for anisotropy + dep_inv_ani: [-5, -2, 0, 3, 7, 12, 17, 23, 30, 38, 47, 57] # inversion grid for ani in depth (km) + lat_inv_ani: [-2.8, -2.3, -1.8, -1.3, -0.8, -0.3, 0.2, 0.7, 1.2, 1.7, 2.2, 2.7] # inversion grid for ani in latitude (degree) + lon_inv_ani: [-1.2, -0.9, -0.6, -0.3, 0, 0.3, 0.6, 0.9, 1.2] # inversion grid for ani in longitude (degree) + trapezoid_ani: [1, 0, 50] # usually set as [1.0, 0.0, 50.0] (default) + + + # Carefully change trapezoid and trapezoid_ani, if you really want to use trapezoid inversion grid, increasing the inversion grid spacing with depth to account for the worse data coverage in greater depths. + # The trapezoid_ inversion grid with index (i,j,k) in longitude, latitude, and depth is defined as: + # if dep_inv[k] < trapezoid[1], lon = lon_inv[i]; + # lat = lat_inv[j]; + # dep = dep_inv[k]; + # if trapezoid[1] <= dep_inv[k] < trapezoid[2], lon = mid_lon_inv+(lon_inv[i]-mid_lon_inv)*(dep_inv[k]-trapezoid[1])/(trapezoid[2]-trapezoid[1])*trapezoid[0]; + # lat = mid_lat_inv+(lat_inv[i]-mid_lat_inv)*(dep_inv[k]-trapezoid[1])/(trapezoid[2]-trapezoid[1])*trapezoid[0]; + # dep = dep_inv[k]; + # if trapezoid[2] <= dep_inv[k], lon = mid_lon_inv+(lon_inv[i]-mid_lon_inv)*trapezoid[0]; + # lat = mid_lat_inv+(lat_inv[i]-mid_lat_inv)*trapezoid[0]; + # dep = dep_inv[k]; + # The shape of trapezoid inversion gird (x) looks like: + # + # lon_inv[0] [1] [2] [3] [4] + # |<-------- (lon_inv[end] - lon_inv[0]) ---->| + # dep_inv[0] | x x x x x | + # | | + # dep_inv[1] | x x x x x | + # | | + # dep_inv[2] = trapezoid[1] / x x x x x \ + # / \ + # dep_inv[3] / x x x x x \ + # / \ + # dep_inv[4] = trapezoid[2] / x x x x x \ + # | | + # dep_inv[5] | x x x x x | + # | | + # dep_inv[6] | x x x x x | + # |<---- trapezoid[0]* (lon_inv[end] - lon_inv[0]) ------>| + + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time: false # 'true' for using absolute traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + use_cs_time: true # 'true' for using common source differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time: false # 'true' for using common receiver differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + + # -------------- inversion parameters -------------- + update_slowness : true # update slowness (velocity) or not. default: true + update_azi_ani : false # update azimuthal anisotropy (xi, eta) or not. default: false + + use_sta_correction: true + # initial_sta_correction_file: 4_initial_station_correct/station_correction_file_step_0010.dat # the path of initial station correction + step_length_sta_correction: 0.01 # step length relate to the update of station correction terms diff --git a/examples/realcase2_teleseismic_tomography_Thailand/README.md b/examples/realcase2_teleseismic_tomography_Thailand/README.md new file mode 100644 index 0000000..c83eb7c --- /dev/null +++ b/examples/realcase2_teleseismic_tomography_Thailand/README.md @@ -0,0 +1,29 @@ +# Real case of teleseismic tomography in Thailand and adjacent areas + +This is a real case to invert common-source differential arrival times for velocity heterogeneity in Thailand and adjacent areas + +Reference: + +[1] J. Chen, S. Wu, M. Xu, M. Nagaso, J. Yao, K. Wang, T. Li, Y. Bai, and P. Tong, Adjoint-state teleseismic traveltime tomography: method and application to Thailand in Indochina Peninsula. J.Geophys. Res. Solid Earth, 128(2023), e2023JB027348. +https://doi.org/10.1029/2023JB027348 + +[2] J. Chen, M. Nagaso, M. Xu, and P. Tong, TomoATT: An open-source package for Eikonal equation-based adjoint-state traveltime tomography for seismic velocity and azimuthal anisotropy, submitted. +https://doi.org/10.48550/arXiv.2412.00031 + +Python modules are required to initiate the inversion and to plot final results: +- h5py +- PyTomoAT +- Pygmt +- gmt + +Run this example: + +1. Run bash script `bash run_this_example.sh` to execute the test. + +2. After inversion, run `plot_output.py` to plot the results. + +The imaging results: + +![](img/imaging_result.jpg) + + diff --git a/examples/realcase2_teleseismic_tomography_Thailand/plot_output.py b/examples/realcase2_teleseismic_tomography_Thailand/plot_output.py new file mode 100644 index 0000000..fcc45b9 --- /dev/null +++ b/examples/realcase2_teleseismic_tomography_Thailand/plot_output.py @@ -0,0 +1,260 @@ +# %% +import pygmt +pygmt.config(FONT="16p", IO_SEGMENT_MARKER="<<<") + +import os + +# %% +from pytomoatt.model import ATTModel +from pytomoatt.data import ATTData +import numpy as np + +# %% +# read model files + +Ngrid = [121,121,121] +data_file = '2_models/model_init_N%d_%d_%d.h5'%(Ngrid[0],Ngrid[1],Ngrid[2]) +par_file = '3_input_params/input_params_real.yaml' +model = ATTModel.read(data_file, par_file) +init_model = model.to_xarray() + +data_file = 'OUTPUT_FILES/OUTPUT_FILES_real/final_model.h5' +model = ATTModel.read(data_file, par_file) +inv_model = model.to_xarray() + +# %% +# # read earthquakes and stations + +# from pytomoatt.src_rec import SrcRec + +# # read src_rec_file +# sr = SrcRec.read("1_src_rec_files/src_rec_file.dat") + +# # get the coordinates of the stations and earthquakes +# stations = sr.receivers[['stlo','stla','stel']].values.T +# earthquakes = sr.sources[['evlo','evla','evdp']].values.T + +# print(stations.shape) +# print(earthquakes.shape) + +# %% +# read earthquakes and stations + +import sys +sys.path.append('../utils') +import functions_for_data as ffd + +ev, st = ffd.read_src_rec_file('1_src_rec_files/src_rec_file.dat') +# earthquake location +ev_lon, ev_lat, ev_dep , _ = ffd.data_lon_lat_dep_wt_ev(ev) +# station location +st_lon, st_lat, _, _ = ffd.data_lon_lat_ele_wt_st(ev,st) + +# %% +# load topography +region = [97,106,12,21] +grid_topo = pygmt.datasets.load_earth_relief(resolution="01m", region=region) +grid_gra = pygmt.grdgradient(grid = grid_topo, azimuth = 0) + +# %% +def line_read(file): + doc=open(file,'r') + file = doc.readlines() + doc.close() + lat = []; lon = []; + for info in file: + tmp = info.split() + lon.append(float(tmp[0])) + lat.append(float(tmp[1])) + return((lat,lon)) + +# %% +# plot imgaing results + +fig = pygmt.Figure() +try: + os.mkdir("img") +except: + pass + + +# ------------------ Sub fig 1. topography ------------------ +region = [97,106,12,21] +projection = "B101.5/16.5/12/21/10c" +frame = ["xa2+lLongitude", "ya2+lLatitude", "nSWe"] +spacing = [0.1, 0.1] + +# topography +pygmt.makecpt(cmap="globe", series=[-4000,4000], background = True) +fig.grdimage(grid=grid_topo, shading = grid_gra, projection=projection, frame=frame,region=region) + +# station +fig.plot(x = st_lon, y = st_lat, style = "t0.4c", fill = "blue", pen = "1p,white", label = "Station") + + +# tectonic setting +(lat,lon) = line_read('tectonics/Khorat_new.txt') # Khorat Plateau +fig.plot(x = lon, y = lat, pen = "1p,black") +fig.text(text = "Khorat", x = 103.5, y = 17.5, font = "15p,Helvetica-Bold,black", angle = 0) +fig.text(text = "Plateau", x = 103.5, y = 16.5, font = "15p,Helvetica-Bold,black", angle = 0) +(lat,lon) = line_read('tectonics/WangChaoFault.txt') # Wang-Chao Fault +fig.plot(x = lon, y = lat, pen = "1p,black,-") +fig.text(text = "WCF", x = 100, y = 16, font = "20p,Helvetica-Bold,white=1p", angle = 315) +(lat,lon) = line_read('tectonics/3PagodasFault.txt') # Three Pagodas Fault +fig.plot(x = lon, y = lat, pen = "1p,black,-") +fig.text(text = "TPF", x = 98.5, y = 14.5, font = "20p,Helvetica-Bold,white=1p", angle = 315) +(lat,lon) = line_read('tectonics/DBPF.txt') # Dien Bien Phu Fault +fig.plot(x = lon, y = lat, pen = "1p,black,-") +fig.text(text = "DBPF", x = 102, y = 19.5, font = "20p,Helvetica-Bold,white=1p", angle = 55) +(lat,lon) = line_read('tectonics/SongMaSuture.txt') # Song Ma Suture +fig.plot(x = lon, y = lat, pen = "1p,black,-") +fig.text(text = "Shan-Thai", x = 99, y = 20, font = "18p,Helvetica-Bold,black=0.5p,white", angle = 0) +fig.text(text = "Block", x = 99, y = 19.3, font = "18p,Helvetica-Bold,black=0.5p,white", angle = 0) +fig.text(text = "Indochina Block", x = 103.5, y = 15, font = "18p,Helvetica-Bold,black=0.5p,white", angle = 315) + + +fig.shift_origin(xshift= 1, yshift=-1.5) +fig.colorbar(frame = ["a%f"%(4000),"y+lElevation (m)"], position="+w4c/0.3c+h") +fig.shift_origin(xshift=-1, yshift=+1.5) + +fig.shift_origin(xshift=0, yshift=-13) + + +# ------------------ Sub fig 2. earthquakes ------------------ + +region = "g" +projection = "E101/16/90/10c" # centerlon/centerlat/distnace_range/fig_size +frame = ["ya180"] +spacing = [0.1, 5] + +fig.basemap(region=region, projection=projection, frame=frame) +fig.coast(region=region, projection=projection, frame=frame, water="white", land="gray", A=10000) + +fig.plot(x=101.5, y=16.5, pen="1p,black,-", style="E-60d") +fig.plot(x=101.5, y=16.5, pen="1p,black,-", style="E-120d") +fig.plot(x=101.5, y=16.5, pen="1p,black,-", style="E-180d") +fig.text(x = [101.5, 101.5, 101.5], y = [-8.0, -38.0, -68], text = ['30', '60', '90'], font="13p") + +fig.plot(x=[97,97,106,106,97], y=[11,21,21,11,11], pen="1p,red") +pygmt.makecpt(cmap="jet", series=[0, 100], background=True) +fig.plot(x = ev_lon, y = ev_lat, size = [0.4]*len(ev_lon), fill = ev_dep, style = "a", cmap = True, pen = "0.5p,white") + + +fig.shift_origin(xshift= 1, yshift=-1) +fig.colorbar(frame = ["a%f"%(50),"y+lFocal depth (km)"], position="+w4c/0.3c+h") +fig.shift_origin(xshift=-1, yshift=+1) + +fig.shift_origin(xshift= 13, yshift= 13) + + +# ------------------ Sub fig 3. depth and vertical profile ------------------ + +region = [97,106,12,21] +projection = "B101.5/16.5/12/21/10c" +frame = ["xa2+lLongitude", "ya2+lLatitude", "nSWe"] +spacing = [0.1, 0.1] + +depth_list = [100,200,300,400] +start_list = [ [97, 19], [97, 17.2], [101.8, 12] ] +end_list = [ [106, 15], [106, 13.2], [101.8, 21] ] + +# depth profiles +for idepth, depth in enumerate(depth_list): + + # read models + vel_init = init_model.interp_dep(depth, field='vel') + vel_inv = inv_model.interp_dep(depth, field='vel') + + if idepth == 3: + fig.shift_origin(xshift=-39, yshift=-13) + + pygmt.makecpt(cmap="../utils/svel13_chen.cpt", series=[-2, 2], background=True) + x = vel_inv[:,0]; y = vel_inv[:,1]; value = (vel_inv[:,2] - vel_init[:,2])/vel_init[:,2]*100 + grid = pygmt.surface(x=x, y=y, z=value, spacing=spacing,region=region) + fig.grdimage(frame=frame,grid = grid,projection=projection, region=region) # nan_transparent may work + + (lat,lon) = line_read('tectonics/Khorat_new.txt') # Khorat Plateau + fig.plot(x = lon, y = lat, pen = "1p,black") + + # vertical profile location + fig.plot(x = [start_list[0][0],end_list[0][0]], y = [start_list[0][1],end_list[0][1],], pen = "2p,green,-") + fig.text(text = "A", x = start_list[0][0] + 0.5, y = start_list[0][1], font = "18p,Helvetica-Bold,black", fill = "lightblue", angle = 0) + fig.text(text = "A@+'@+", x = end_list[0][0] - 0.5, y = end_list[0][1] + 0.5, font = "18p,Helvetica-Bold,black", fill = "lightblue", angle = 0) + + fig.plot(x = [start_list[1][0],end_list[1][0]], y = [start_list[1][1],end_list[1][1],], pen = "2p,green,-") + fig.text(text = "B", x = start_list[1][0] + 0.5, y = start_list[1][1], font = "18p,Helvetica-Bold,black", fill = "lightblue", angle = 0) + fig.text(text = "B@+'@+", x = end_list[1][0] - 0.5, y = end_list[1][1] + 0.5, font = "18p,Helvetica-Bold,black", fill = "lightblue", angle = 0) + + fig.plot(x = [start_list[2][0],end_list[2][0]], y = [start_list[2][1],end_list[2][1],], pen = "2p,green,-") + fig.text(text = "C", x = start_list[2][0] - 0.5, y = start_list[2][1] + 0.5, font = "18p,Helvetica-Bold,black", fill = "lightblue", angle = 0) + fig.text(text = "C@+'@+", x = end_list[2][0] - 0.5, y = end_list[2][1] - 0.5, font = "18p,Helvetica-Bold,black", fill = "lightblue", angle = 0) + + # depth label + fig.text(text="%d km"%(depth), x = 98 , y = 12.5, font = "14p,Helvetica-Bold,black", fill = "white") + + + fig.shift_origin(xshift=13) + +fig.shift_origin(yshift=6) + +# vertical profiles +for iprof in range(len(start_list)): + + # generate topography data + Npoints = 100 + point_x = np.linspace(start_list[iprof][0],end_list[iprof][0],Npoints) + point_y = np.linspace(start_list[iprof][1],end_list[iprof][1],Npoints) + points = np.hstack((point_x.reshape(-1,1),point_y.reshape(-1,1))) + topo = np.array(pygmt.grdtrack(points=points, grid=grid_topo)[2]) + topo_dis = [0] + for ip in range(1, Npoints): + dis = ffd.cal_dis(point_y[0], point_x[0], point_y[ip], point_x[ip]) + topo_dis.append(dis) + topo_dis = np.array(topo_dis) + + # read models + vel_init_sec = init_model.interp_sec(start_list[iprof], end_list[iprof], field='vel', val=10) + vel_inv_sec = inv_model.interp_sec(start_list[iprof], end_list[iprof], field='vel', val=10) + + + # plot topography + max_dis = np.max(vel_init_sec[:,2]) + + region = [0,max_dis,0,2000] + projection = "X%f/1c"%(max_dis/400*4) + frame = ["ya2000+lElevation (m)", "sW"] + + fig.shift_origin(yshift=4) + fig.basemap(region=region, projection=projection, frame=frame) + fig.plot(x = topo_dis, y = topo, pen = "1p,black", frame = frame, projection = projection, region = region) + fig.shift_origin(yshift=-4) + + # plot model + region = [0,max_dis,0,400] + projection = "X%f/-4c"%(max_dis/400*4) + frame = ["xa300+lDistance (km)", "ya100+lDepth (km)", "nSWe"] + spacing = [10, 5] + + x_sec = vel_inv_sec[:,2]; y_sec = vel_inv_sec[:,3]; value_sec = (vel_inv_sec[:,4] - vel_init_sec[:,4])/vel_init_sec[:,4]*100 + grid = pygmt.surface(x=x_sec, y=y_sec, z=value_sec, spacing=spacing,region=region) + fig.grdimage(frame=frame,grid = grid,projection=projection, region=region) # nan_transparent may work + + label_list = ['A', 'B', 'C'] + fig.text(text = "%s"%(label_list[iprof]), x = 50, y = 50 , font = "18p,Helvetica-Bold,black", fill = "lightblue", angle = 0) + fig.text(text = "%s@+'@+"%(label_list[iprof]), x = np.max(x) - 50, y = 50, font = "18p,Helvetica-Bold,black", fill = "lightblue", angle = 0) + + + if (iprof == 0): + fig.shift_origin(xshift=0, yshift=-6.5) + elif (iprof == 1): + fig.shift_origin(xshift=13, yshift=6.5) + +fig.shift_origin(xshift= 2, yshift=-2.5) +fig.colorbar(frame = ["a%f"%(2),"y+ldlnVp (%)"], position="+w4c/0.3c+h") +fig.shift_origin(xshift=-2, yshift=+2.5) + +fig.show() + +fig.savefig("img/imaging_result.png") + + diff --git a/examples/realcase2_teleseismic_tomography_Thailand/prepare_input_files.py b/examples/realcase2_teleseismic_tomography_Thailand/prepare_input_files.py new file mode 100644 index 0000000..cfb7ab3 --- /dev/null +++ b/examples/realcase2_teleseismic_tomography_Thailand/prepare_input_files.py @@ -0,0 +1,45 @@ +# %% +# download src_ref_files from Zenodo +import os +import requests + +url = 'https://zenodo.org/records/14092478/files/src_rec_file.dat?download=1' + +path = "1_src_rec_files/src_rec_file.dat" + +# check file existence +if not os.path.exists(path): + try: + os.mkdir("1_src_rec_files") + except: + pass + print("Downloading src_rec_file.dat from Zenodo...") + response = requests.get(url, stream=True) + with open(path, 'wb') as out_file: + out_file.write(response.content) + print("Download complete.") +else: + print("src_rec_file.dat already exists.") + +# %% +# download initial model from Zenodo + +url = 'https://zenodo.org/records/14092478/files/model_init_N121_121_121.h5?download=1' + +path = "2_models/model_init_N121_121_121.h5" + +# check file existence +if not os.path.exists(path): + try: + os.mkdir("2_models") + except: + pass + print("Downloading model_init_N121_121_121.h5 from Zenodo...") + response = requests.get(url, stream=True) + with open(path, 'wb') as out_file: + out_file.write(response.content) + print("Download complete.") +else: + print("model_init_N121_121_121.h5 already exists.") + + diff --git a/examples/realcase2_teleseismic_tomography_Thailand/run_this_example.sh b/examples/realcase2_teleseismic_tomography_Thailand/run_this_example.sh new file mode 100644 index 0000000..b0ecd3f --- /dev/null +++ b/examples/realcase2_teleseismic_tomography_Thailand/run_this_example.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# Step 1: Generate necessary input files +python prepare_input_files.py + +# Step 2: Run inversion +# # for WSL +# mpirun -n 8 --allow-run-as-root --oversubscribe ../../build/bin/TOMOATT -i 3_input_params/input_params_real.yaml +# for Linux +# mpirun -n 8 ../../build/bin/TOMOATT -i 3_input_params/input_params_real.yaml +# for conda install +mpirun -n 8 TOMOATT -i 3_input_params/input_params_real.yaml + +# # Step 3 (Optional): Plot the results +# python plot_output.py + diff --git a/examples/realcase2_teleseismic_tomography_Thailand/tectonics/3PagodasFault.txt b/examples/realcase2_teleseismic_tomography_Thailand/tectonics/3PagodasFault.txt new file mode 100644 index 0000000..8af7384 --- /dev/null +++ b/examples/realcase2_teleseismic_tomography_Thailand/tectonics/3PagodasFault.txt @@ -0,0 +1,9 @@ +97.716435 15.996933 +97.909999 15.704275 +98.075912 15.388543 +98.283303 15.065462 +98.504520 14.792299 +98.753389 14.414982 +99.306431 13.919170 +99.569126 13.657715 +99.831821 13.344572 \ No newline at end of file diff --git a/examples/realcase2_teleseismic_tomography_Thailand/tectonics/DBPF.txt b/examples/realcase2_teleseismic_tomography_Thailand/tectonics/DBPF.txt new file mode 100644 index 0000000..6d2284f --- /dev/null +++ b/examples/realcase2_teleseismic_tomography_Thailand/tectonics/DBPF.txt @@ -0,0 +1,12 @@ +100.26019 17.132888 +100.51411 17.490642 +100.79624 17.903402 +101.10658 18.261329 +101.47335 18.591967 +101.75549 19.004727 +102.00940 19.362481 +102.29154 19.802702 +102.51724 20.242749 +102.74295 20.627877 +102.91223 21.122673 +103.02508 21.919356 \ No newline at end of file diff --git a/examples/realcase2_teleseismic_tomography_Thailand/tectonics/Khorat_new.txt b/examples/realcase2_teleseismic_tomography_Thailand/tectonics/Khorat_new.txt new file mode 100644 index 0000000..b935bbd --- /dev/null +++ b/examples/realcase2_teleseismic_tomography_Thailand/tectonics/Khorat_new.txt @@ -0,0 +1,74 @@ +101.3217 15.25436 +101.3610 15.02633 +101.4085 14.66495 +101.6319 14.56644 +101.6012 14.38869 +101.4514 14.26901 +101.7127 14.13520 +101.9088 14.04399 +102.1729 14.00737 +102.4503 14.00100 +102.7636 14.00578 +103.0485 14.13474 +103.3082 14.27712 +103.5336 14.33471 +103.7845 14.37077 +103.9997 14.34649 +104.2485 14.32079 +104.4734 14.33280 +104.6885 14.37674 +104.9102 14.34013 +105.1688 14.31806 +105.3968 14.38630 +105.5182 14.48660 +105.5693 14.77796 +105.8248 14.91528 +106.1238 14.87758 +106.3348 14.64013 +106.4688 14.60983 +106.7040 14.63849 +106.9841 14.69472 +107.1072 14.88782 +106.9818 15.16007 +106.8467 15.43551 +106.7018 15.70776 +106.4761 15.91474 +106.7336 16.04609 +106.9007 16.14401 +106.9118 16.31668 +106.7038 16.57524 +106.4385 16.64211 +106.2010 16.67623 +106.0120 16.46044 +105.8274 16.65030 +105.8194 16.91355 +105.5656 17.01331 +105.2865 17.09928 +104.9742 17.44792 +104.8155 17.65625 +104.6904 17.84917 +104.4882 18.06029 +104.2648 18.23726 +104.2338 18.42014 +104.0404 18.69778 +103.8294 18.71916 +103.6035 18.82287 +103.4194 18.79012 +103.1891 18.75828 +102.9576 18.78853 +102.7519 18.78060 +102.4620 18.70688 +102.2884 18.31131 +102.3415 17.97336 +102.3233 17.61750 +102.3959 17.36994 +102.5198 17.16424 +102.4485 16.89594 +102.2198 17.03361 +102.0690 16.82544 +101.9004 16.52085 +101.7902 16.17219 +101.5551 16.16099 +101.3962 15.84821 +101.3255 15.53741 +101.3217 15.25436 \ No newline at end of file diff --git a/examples/realcase2_teleseismic_tomography_Thailand/tectonics/SongMaSuture.txt b/examples/realcase2_teleseismic_tomography_Thailand/tectonics/SongMaSuture.txt new file mode 100644 index 0000000..b39f66d --- /dev/null +++ b/examples/realcase2_teleseismic_tomography_Thailand/tectonics/SongMaSuture.txt @@ -0,0 +1,7 @@ +103.42006 21.261522 +103.75862 21.015416 +104.12539 20.687015 +104.54859 20.386247 +104.94357 20.140313 +105.33856 19.811998 +105.67712 19.565892 \ No newline at end of file diff --git a/examples/realcase2_teleseismic_tomography_Thailand/tectonics/WangChaoFault.txt b/examples/realcase2_teleseismic_tomography_Thailand/tectonics/WangChaoFault.txt new file mode 100644 index 0000000..5ee10ef --- /dev/null +++ b/examples/realcase2_teleseismic_tomography_Thailand/tectonics/WangChaoFault.txt @@ -0,0 +1,35 @@ +97.160627 18.667449 +97.439913 18.296889 +97.702608 18.010759 +97.979130 17.718541 +98.283303 17.463175 +98.550606 17.271720 +98.765678 17.102918 +99.057562 16.870374 +99.306431 16.669104 +99.555300 16.377656 +99.831821 16.064504 +100.03921 15.742171 +100.21895 15.443462 +100.39869 15.086120 +100.56460 14.752446 +100.78582 14.447648 +100.96556 14.282677 +101.60156 13.889472 +101.90573 13.651846 +102.20990 13.442356 +102.51408 13.201059 +102.80719 12.957404 +103.10972 12.693070 +103.48190 12.438190 +103.78607 12.172426 +104.09025 11.987404 +104.36677 11.761654 +104.62946 11.466553 +104.91981 11.204539 +105.18250 10.882527 +105.43137 10.599681 +105.72172 10.344518 +106.01207 10.087398 +106.30241 9.8312565 +106.50981 9.6872272 \ No newline at end of file diff --git a/examples/scripts_of_generate_community_model/1_crust1.0_ak135_model.py b/examples/scripts_of_generate_community_model/1_crust1.0_ak135_model.py new file mode 100644 index 0000000..06a3ceb --- /dev/null +++ b/examples/scripts_of_generate_community_model/1_crust1.0_ak135_model.py @@ -0,0 +1,105 @@ +# %% +from pytomoatt.model import ATTModel +import os +import numpy as np +import h5py +# %% [markdown] +# # Step 1. Generate the ATT model based on the crust1.0 model. + +# %% +# generate the .h5 model for TomoATT based on the crust1.0 model. Nearest extrapolation is used. + +param_file = "./3_input_params/input_params_real.yaml" +am_crust1p0 = ATTModel(param_file) +am_crust1p0.grid_data_crust1(type="vp") + +# %% [markdown] +# # Step 2. Generate the ATT model based on ak135 model. + +# %% +# Step 2. Generate the ATT model based on ak135 model. + +# ak135.h5 has a three-column dataset 'model'. First column: depth (in km), second column: Vp (in km/s), third column: Vs (in km/s). +# a text version of the ak135 model can be found in Kennett et al. (1995): +# Kennett, B. L., Engdahl, E. R., & Buland, R. (1995). Constraints on seismic velocities in the Earth from traveltimes. Geophysical Journal International, 122(1), 108-124. + +# Load the 1D ak135 model from the .h5 file. +with h5py.File('ak135.h5', 'r') as f: + points_ak135 = f['model'][:] + +am_ak135 = ATTModel(param_file) + +# interpolate the 1D ak135 velocity model to the depths of the ATT model. +vel_1d = np.interp(am_ak135.depths, points_ak135[:,0], points_ak135[:,1], left=points_ak135[0,1], right=points_ak135[-1,1]) + +# Set the 3D velocity model by tiling the 1D velocity model along lat and lon directions. +am_ak135.vel = np.tile(vel_1d[:, None, None], (1, am_ak135.n_rtp[1], am_ak135.n_rtp[2])) + + +# %% [markdown] +# # Step 3. Combine ak135 model with crust1.0 model + +# %% +# 1. set two depths +# if depth < depth_1, vel = crust1p0 +# if depth_1 <= depth <= depth_2, vel = linear_interp between crust1p0 and ak135 +# if depth > depth_2, vel = ak135 + +am_combined = ATTModel(param_file) + +depth_1 = 35.0 +depth_2 = 70.0 + +ratio = (am_ak135.depths - depth_1) / (depth_2 - depth_1) +ratio = np.clip(ratio, 0.0, 1.0) +ratio_3d = np.tile(ratio[:, None, None], (1, am_ak135.n_rtp[1], am_ak135.n_rtp[2])) + +# linear interpolation +am_combined.vel = am_crust1p0.vel * (1 - ratio_3d) + am_ak135.vel * ratio_3d + +# %% [markdown] +# # Step 4. post processing (OPTIONAL) + +# %% +am_processed = am_combined.copy() + +# 1. (OPTIONAL) monotonic increase check +# Ensure that the velocity model increases monotonically with depth. +am_processed.vel[::-1,:,:] = np.maximum.accumulate(am_processed.vel[::-1,:,:], axis=0) + +# 2. (OPTIONAL) Gaussian smoothing to the combined model to avoid sharp discontinuities. +## Upgrade PyTomoATT to version 0.2.10 or later to use this function. +am_processed.smooth(sigma=am_processed.d_rtp, unit_deg=True, mode='nearest') # standard deviation for Gaussian kernel along each axis (ddep, dlat, dlon) + + +# %% +# output as .h5 file +n_rtp = am_processed.n_rtp +fname = f"constant_velocity_N{n_rtp[0]:d}_{n_rtp[1]:d}_{n_rtp[2]:d}_PyTomoATT.h5" +am_processed.write(fname) + +# %% +# visualization of the central lat-lon slice +import matplotlib.pyplot as plt +dep = am_processed.depths +vel = am_processed.vel[:, am_processed.n_rtp[1]//2, am_processed.n_rtp[2]//2] +lat = am_processed.latitudes[am_processed.n_rtp[1]//2] +lon = am_processed.longitudes[am_processed.n_rtp[2]//2] +fig = plt.figure(figsize=(6,6)) +ax = fig.add_subplot(1,1,1) +ax.plot(vel, dep, label='Velocity', color='blue') +ax.invert_yaxis() +ax.set_xlabel('Vp (km/s)', fontsize=16) +ax.set_ylabel('Depth (km)', fontsize=16) +ax.tick_params(axis='x', labelsize=16) +ax.tick_params(axis='y', labelsize=16) + +ax.set_title(f'Velocity Profile at Lat: {lat:.2f}, Lon: {lon:.2f}', fontsize=16) +ax.grid() +ax.legend(fontsize=16) +plt.show() + +os.makedirs("figs", exist_ok=True) +fig.savefig("figs/velocity_profile_lat%.2f_lon%.2f.png"%(lat, lon), facecolor='white', edgecolor='white', bbox_inches='tight') + + diff --git a/examples/scripts_of_generate_community_model/3_input_params/input_params_real.yaml b/examples/scripts_of_generate_community_model/3_input_params/input_params_real.yaml new file mode 100644 index 0000000..5219217 --- /dev/null +++ b/examples/scripts_of_generate_community_model/3_input_params/input_params_real.yaml @@ -0,0 +1,186 @@ +version: 3 + +################################################# +# computational domain # +################################################# +domain: + min_max_dep: [-50, 550] # depth in km + min_max_lat: [10.5, 22.5] # latitude in degree + min_max_lon: [95.5, 107.5] # longitude in degree + n_rtp: [121, 121, 121] # number of nodes in depth,latitude,longitude direction + +################################################# +# traveltime data file path # +################################################# +source: + src_rec_file: 1_src_rec_files/src_rec_file.dat # source receiver file path + swap_src_rec: false # swap source and receiver + +################################################# +# initial model file path # +################################################# +model: + init_model_path: 2_models/model_init_N121_121_121.h5 # path to initial model file + +################################################# +# parallel computation settings # +################################################# +parallel: # parameters for parallel computation + n_sims: 8 # number of simultaneous runs (parallel the sources) + ndiv_rtp: [1, 1, 1] # number of subdivision on each direction (parallel the computional domain) + +############################################ +# output file setting # +############################################ +output_setting: + output_dir: OUTPUT_FILES/OUTPUT_FILES_real # path to output directory (default is ./OUTPUT_FILES/) + output_source_field: false # True: output the traveltime field and adjoint field of all sources at each iteration. Default: false. File: 'out_data_sim_group_X'. + output_kernel: false + output_final_model: true # True: output merged final model. This file can be used as the input model for TomoATT. Default: true. File: 'model_final.h5'. + output_middle_model: false # True: output merged intermediate models during inversion. This file can be used as the input model for TomoATT. Default: false. File: 'middle_model_step_XXXX.h5' + output_in_process: false # True: output at each inv iteration, otherwise, only output step 0, Niter-1, Niter. Default: true. File: 'out_data_sim_group_0'. + output_in_process_data: false # True: output src_rec_file at each inv iteration, otherwise, only output step 0, Niter-2, Niter-1. Default: true. File: 'src_rec_file_step_XXXX.dat' + single_precision_output: false # True: output results in single precision. Default: false. + verbose_output_level: 0 # output internal parameters, (to do) + output_file_format: 0 # 0: hdf5, 1: ascii + +# output files: +# File: 'out_data_grid.h5'. Keys: ['Mesh']['elem_conn'], element index; +# ['Mesh']['node_coords_p'], phi coordinates of nodes; +# ['Mesh']['node_coords_t'], theta coordinates of nodes; +# ['Mesh']['node_coords_r'], r coordinates of nodes; +# ['Mesh']['node_coords_x'], phi coordinates of elements; +# ['Mesh']['node_coords_y'], theta coordinates of elements; +# ['Mesh']['node_coords_z'], r coordinates of elements; +# File: 'out_data_sim_group_0'. Keys: ['model']['vel_inv_XXXX'], velocity model at iteration XXXX; +# ['model']['xi_inv_XXXX'], xi model at iteration XXXX; +# ['model']['eta_inv_XXXX'], eta model at iteration XXXX +# ['model']['Ks_inv_XXXX'], sensitivity kernel related to slowness at iteration XXXX +# ['model']['Kxi_inv_XXXX'], sensitivity kernel related to xi at iteration XXXX +# ['model']['Keta_inv_XXXX'], sensitivity kernel related to eta at iteration XXXX +# ['model']['Ks_density_inv_XXXX'], kernel density of Ks at iteration XXXX +# ['model']['Kxi_density_inv_XXXX'], kernel density of Kxi at iteration XXXX +# ['model']['Keta_density_inv_XXXX'], kernel density of Keta at iteration XXXX +# ['model']['Ks_over_Kden_inv_XXXX'], slowness kernel over kernel density at iteration XXXX +# ['model']['Kxi_over_Kden_inv_XXXX'], xi kernel over kernel density at iteration XXXX +# ['model']['Keta_over_Kden_inv_XXXX'], eta kernel over kernel density at iteration XXXX +# ['model']['Ks_update_inv_XXXX'], slowness kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Kxi_update_inv_XXXX'], xi kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['model']['Keta_update_inv_XXXX'], eta kernel over kernel density at iteration XXXX, smoothed by inversion grid +# ['1dinv']['vel_1dinv_inv_XXXX'], 2d velocity model at iteration XXXX, in 1d inversion mode +# ['1dinv']['r_1dinv'], r coordinates (depth), in 1d inversion mode +# ['1dinv']['t_1dinv'], t coordinates (epicenter distance), in 1d inversion mode +# File: 'src_rec_file_step_XXXX.dat' or 'src_rec_file_forward.dat'. The synthetic traveltime data file. +# File: 'final_model.h5'. Keys: ['eta'], ['xi'], ['vel'], the final model. +# File: 'middle_model_step_XXXX.h5'. Keys: ['eta'], ['xi'], ['vel'], the model at step XXXX. +# File: 'inversion_grid.txt'. The location of inversion grid nodes +# File: 'objective_function.txt'. The objective function value at each iteration +# File: 'out_data_sim_group_X'. Keys: ['src_YYYY']['time_field_inv_XXXX'], traveltime field of source YYYY at iteration XXXX; +# ['src_YYYY']['adjoint_field_inv_XXXX'], adjoint field of source YYYY at iteration XXXX; +# ['1dinv']['time_field_1dinv_YYYY_inv_XXXX'], 2d traveltime field of source YYYY at iteration XXXX, in 1d inversion mode +# ['1dinv']['adjoint_field_1dinv_YYYY_inv_XXXX'], 2d adjoint field of source YYYY at iteration XXXX, in 1d inversion mode + + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion + earthquake relocation +# 4 for 1d model inversion +run_mode: 1 + +have_tele_data: true # An error will be reported if false but source out of study region is used. Default: false. + +################################################### +# model update parameters setting # +################################################### +model_update: + max_iterations: 80 # maximum number of inversion iterations + + step_length: 0.01 # the initial step length of model perturbation. 0.01 means maximum 1% perturbation for each iteration. + + # parameters for optim_method 0 (gradient_descent) + optim_method_0: + # if step_method:1. if the angle between the current and the previous gradients is greater than step_length_gradient_angle, step size -> step length * step_length_change[0]. + # otherwise, step size -> step length * step_length_change[1]. + step_length_gradient_angle: 120 # default: 120.0 + step_length_change: [0.5, 1.41] # default: [0.5,1.2] + Kdensity_coe: 0.3 # default: 0.0, range: 0.0 - 1.0 + + # parameters for smooth method 0 (multigrid model parametrization) + # inversion grid can be viewed in OUTPUT_FILES/inversion_grid.txt + n_inversion_grid: 5 # number of inversion grid sets + + uniform_inv_grid_dep: false # true if use uniform inversion grid for dep, false if use flexible inversion grid + uniform_inv_grid_lat: false # true if use uniform inversion grid for lat, false if use flexible inversion grid + uniform_inv_grid_lon: false # true if use uniform inversion grid for lon, false if use flexible inversion grid + + # settings for flexible inversion grid + dep_inv: [-50, -25, 0, 50, 100, 150, 200, 275, 350, 425, 500, 600,700] # inversion grid for vel in depth (km) + lat_inv: [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23] # inversion grid for vel in latitude (degree) + lon_inv: [95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108] # inversion grid for vel in longitude (degree) + trapezoid: [1, 0, 50] # usually set as [1.0, 0.0, 50.0] (default) + + # if we want to use another inversion grid for inverting anisotropy, set invgrid_ani: true (default: false) + invgrid_ani: false + + # ---------- flexible inversion grid setting for anisotropy ---------- + # settings for flexible inversion grid for anisotropy + dep_inv_ani: [-5, -2, 0, 3, 7, 12, 17, 23, 30, 38, 47, 57] # inversion grid for ani in depth (km) + lat_inv_ani: [-2.8, -2.3, -1.8, -1.3, -0.8, -0.3, 0.2, 0.7, 1.2, 1.7, 2.2, 2.7] # inversion grid for ani in latitude (degree) + lon_inv_ani: [-1.2, -0.9, -0.6, -0.3, 0, 0.3, 0.6, 0.9, 1.2] # inversion grid for ani in longitude (degree) + trapezoid_ani: [1, 0, 50] # usually set as [1.0, 0.0, 50.0] (default) + + + # Carefully change trapezoid and trapezoid_ani, if you really want to use trapezoid inversion grid, increasing the inversion grid spacing with depth to account for the worse data coverage in greater depths. + # The trapezoid_ inversion grid with index (i,j,k) in longitude, latitude, and depth is defined as: + # if dep_inv[k] < trapezoid[1], lon = lon_inv[i]; + # lat = lat_inv[j]; + # dep = dep_inv[k]; + # if trapezoid[1] <= dep_inv[k] < trapezoid[2], lon = mid_lon_inv+(lon_inv[i]-mid_lon_inv)*(dep_inv[k]-trapezoid[1])/(trapezoid[2]-trapezoid[1])*trapezoid[0]; + # lat = mid_lat_inv+(lat_inv[i]-mid_lat_inv)*(dep_inv[k]-trapezoid[1])/(trapezoid[2]-trapezoid[1])*trapezoid[0]; + # dep = dep_inv[k]; + # if trapezoid[2] <= dep_inv[k], lon = mid_lon_inv+(lon_inv[i]-mid_lon_inv)*trapezoid[0]; + # lat = mid_lat_inv+(lat_inv[i]-mid_lat_inv)*trapezoid[0]; + # dep = dep_inv[k]; + # The shape of trapezoid inversion gird (x) looks like: + # + # lon_inv[0] [1] [2] [3] [4] + # |<-------- (lon_inv[end] - lon_inv[0]) ---->| + # dep_inv[0] | x x x x x | + # | | + # dep_inv[1] | x x x x x | + # | | + # dep_inv[2] = trapezoid[1] / x x x x x \ + # / \ + # dep_inv[3] / x x x x x \ + # / \ + # dep_inv[4] = trapezoid[2] / x x x x x \ + # | | + # dep_inv[5] | x x x x x | + # | | + # dep_inv[6] | x x x x x | + # |<---- trapezoid[0]* (lon_inv[end] - lon_inv[0]) ------>| + + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time: false # 'true' for using absolute traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + use_cs_time: true # 'true' for using common source differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time: false # 'true' for using common receiver differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + + # -------------- inversion parameters -------------- + update_slowness : true # update slowness (velocity) or not. default: true + update_azi_ani : false # update azimuthal anisotropy (xi, eta) or not. default: false + + use_sta_correction: true + # initial_sta_correction_file: 4_initial_station_correct/station_correction_file_step_0010.dat # the path of initial station correction + step_length_sta_correction: 0.01 # step length relate to the update of station correction terms diff --git a/examples/scripts_of_generate_community_model/ak135.h5 b/examples/scripts_of_generate_community_model/ak135.h5 new file mode 100644 index 0000000..46c6455 Binary files /dev/null and b/examples/scripts_of_generate_community_model/ak135.h5 differ diff --git a/examples/scripts_of_generate_community_model/run_this_example.sh b/examples/scripts_of_generate_community_model/run_this_example.sh new file mode 100644 index 0000000..ba570dd --- /dev/null +++ b/examples/scripts_of_generate_community_model/run_this_example.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# run the script to generate HDF5 model files based on community models +# 1. crust1.0 (Laske et al., 2013) + ak135 model (Kennett et al., 1995) +python 1_crust1.0_ak135_model.py + + +# References: +# Laske, G., Masters, G., Ma, Z., & Pasyanos, M. (2013, April). Update on CRUST1. 0—A 1-degree global model of Earth’s crust. In Geophysical research abstracts (Vol. 15, No. 15, p. 2658). +# Kennett, B. L., Engdahl, E. R., & Buland, R. (1995). Constraints on seismic velocities in the Earth from traveltimes. Geophysical Journal International, 122(1), 108-124. \ No newline at end of file diff --git a/examples/scripts_of_generate_hdf5_model/1_generate_models.py b/examples/scripts_of_generate_hdf5_model/1_generate_models.py new file mode 100644 index 0000000..efcad49 --- /dev/null +++ b/examples/scripts_of_generate_hdf5_model/1_generate_models.py @@ -0,0 +1,287 @@ +# %% +from pytomoatt.model import ATTModel +from pytomoatt.checkerboard import Checker +import os +import numpy as np +import h5py + +# %% [markdown] +# # read YAML parameter file to obtain the grid parameters for the model + +# %% +output_path = "models" +os.makedirs(output_path, exist_ok=True) + +par_file = "input_params/input_params.yaml" + +att_model = ATTModel(par_file) + +n_rtp = att_model.n_rtp # grid node numbers in r (depth), t (longtitude), p (latitude) directions +am_depths = att_model.depths # depths in km +am_latitudes = att_model.latitudes # latitudes in degrees +am_longitudes = att_model.longitudes # longitudes in degrees + +print("grid node numbers (N_r, N_t, N_p):", n_rtp) +print("depths (km):", am_depths) +print("latitudes (degree):", am_latitudes) +print("longitudes (degree):", am_longitudes) + +# %% [markdown] +# # eg1. generate model with constant velocity + +# %% +# case 1. ---------- generate a constant velocity model using PyTomoATT module ------------- + +# set the velocity model to a constant value +constant_v = 6.0 # constant velocity (km/s) +att_model.vel[:,:,:] = constant_v +att_model.xi[:,:,:] = 0.0 +att_model.eta[:,:,:] = 0.0 + +# write the model to a file +fname = "%s/constant_velocity_N%d_%d_%d_PyTomoATT.h5"%(output_path, n_rtp[0], n_rtp[1], n_rtp[2]) +att_model.write(fname) +print("generate model using PyTomoATT:", fname) + + +# case 2. ---------- generate a constant velocity model using plain loop (h5py module is required) ------------- + +# set the velocity model to a constant value +vel = np.zeros(n_rtp) +xi = np.zeros(n_rtp) +eta = np.zeros(n_rtp) +for ir in range(n_rtp[0]): + for it in range(n_rtp[1]): + for ip in range(n_rtp[2]): + vel[ir, it, ip] = constant_v + +fname = "%s/constant_velocity_N%d_%d_%d_loop.h5"%(output_path, n_rtp[0], n_rtp[1], n_rtp[2]) + +with h5py.File(fname, 'w') as f: + f.create_dataset('vel', data=vel) + f.create_dataset('xi', data=xi) + f.create_dataset('eta', data=eta) +print("generate model using plain loop:", fname) + +# %% [markdown] +# # eg2. generate a linear velocity model: +# vel = 5.0, if depth < 0 km +# +# vel = 5.0 + 0.1 * depth, if 0 km <= depth <= 30 km +# +# vel = 8.0, if depth > 30 km + +# %% +# case 1. ---------- generate a constant velocity model using PyTomoATT module ------------- + +# set the velocity model to a constant value +idx = np.where((am_depths >= 0.0) & (am_depths <= 30.0)) +depth = am_depths[idx] +att_model.vel[idx,:,:] = 5.0 + 0.1 * depth[:, np.newaxis, np.newaxis] # velocity increases linearly from 5.0 to 8.0 km/s +att_model.vel[np.where(am_depths > 30.0),:,:] = 8.0 # velocity is constant at 8.0 km/s below 30.0 km depth +att_model.vel[np.where(am_depths < 0.0),:,:] = 5.0 # velocity is constant at 5.0 km/s above 0.0 km depth + +att_model.xi[:,:,:] = 0.0 +att_model.eta[:,:,:] = 0.0 + +# write the model to a file +fname = "%s/linear_velocity_N%d_%d_%d_PyTomoATT.h5"%(output_path, n_rtp[0], n_rtp[1], n_rtp[2]) +att_model.write(fname) +print("generate model using PyTomoATT:", fname) + +# case 2. ---------- generate a linear velocity model using plain loop (h5py module is required) ------------- + +# set the velocity model to a linear value +vel = np.zeros(n_rtp) +xi = np.zeros(n_rtp) +eta = np.zeros(n_rtp) + +for ir in range(n_rtp[0]): + for it in range(n_rtp[1]): + for ip in range(n_rtp[2]): + if am_depths[ir] < 0.0: + vel[ir, it, ip] = 5.0 + elif am_depths[ir] <= 30.0: + vel[ir, it, ip] = 5.0 + 0.1 * am_depths[ir] + else: + vel[ir, it, ip] = 8.0 +fname = "%s/linear_velocity_N%d_%d_%d_loop.h5"%(output_path, n_rtp[0], n_rtp[1], n_rtp[2]) + +with h5py.File(fname, 'w') as f: + f.create_dataset('vel', data=vel) + f.create_dataset('xi', data=xi) + f.create_dataset('eta', data=eta) +print("generate model using plain loop:", fname) + +# %% [markdown] +# # eg3. generate checkerboard model for velocity and anisotropy. +# +# assign perturbation + +# %% +# case 1. ---------- generate a constant velocity model using PyTomoATT module ------------- + +# file name of the background model +bg_model_fname = "%s/linear_velocity_N%d_%d_%d_PyTomoATT.h5" % (output_path, n_rtp[0], n_rtp[1], n_rtp[2]) + +lim_x = [0.5, 1.5] # longitude limits of the checkerboard +lim_y = [0.25, 0.75] # latitude limits of the checkerboard +lim_z = [0, 30] # depth limits of the checkerboard +pert_vel = 0.1 # amplitude of velocity perturbation (%) +pert_ani = 0.05 # amplitude of anisotropy perturbation (fraction) +ani_dir = 60.0 # fast velocity direction (anti-clockwise from x-axis, in degrees) +n_pert_x = 4 # number of checkers in x (lon) direction +n_pert_y = 2 # number of checkers in y (lat) direction +n_pert_z = 3 # number of checkers in z (dep) direction + +size_x = (lim_x[1] - lim_x[0]) / n_pert_x # size of each checker in x direction +size_y = (lim_y[1] - lim_y[0]) / n_pert_y # size of each checker in y direction +size_z = (lim_z[1] - lim_z[0]) / n_pert_z # size of each checker in z direction + + +ckb = Checker(bg_model_fname, para_fname=par_file) +# n_pert_x, n_pert_y, n_pert_z: number of checkers in x (lon), y (lat), z (dep) directions +# pert_vel: amplitude of velocity perturbation (km/s) +# pert_ani: amplitude of anisotropy perturbation (fraction) +# ani_dir: fast velicty direction (anti-cloclkwise from x-axis, in degrees) +# lim_x, lim_y, lim_z: limits of the checkerboard in x (lon), y (lat), z (dep) directions +ckb.checkerboard( + n_pert_x=n_pert_x, n_pert_y=n_pert_y, n_pert_z=n_pert_z, + pert_vel=pert_vel, pert_ani=pert_ani, ani_dir=ani_dir, + lim_x=lim_x, lim_y=lim_y, lim_z=lim_z +) + +fname = "%s/linear_velocity_ckb_N%d_%d_%d_PyTomoATT.h5" % (output_path, n_rtp[0], n_rtp[1], n_rtp[2]) +ckb.write(fname) +print("generate checkerboard model based on the linear velocity model using PyTomoATT:", fname) + +# case 2. ---------- generate a checkerboard model using plain loop (h5py module is required) ------------- + +# read the background model +bg_model = np.zeros(n_rtp) +with h5py.File(bg_model_fname, 'r') as f: + bg_model = f['vel'][:] + +# set the checkerboard model +vel = np.zeros(n_rtp) +xi = np.zeros(n_rtp) +eta = np.zeros(n_rtp) + +for ir in range(n_rtp[0]): + for it in range(n_rtp[1]): + for ip in range(n_rtp[2]): + depth = am_depths[ir] + lat = am_latitudes[it] + lon = am_longitudes[ip] + + # check if the current grid node is within the checkerboard limits + if (lim_x[0] <= lon <= lim_x[1]) and (lim_y[0] <= lat <= lim_y[1]) and (lim_z[0] <= depth <= lim_z[1]): + + sigma_vel = np.sin(np.pi * (lon - lim_x[0])/size_x) * np.sin(np.pi * (lat - lim_y[0])/size_y) * np.sin(np.pi * (depth - lim_z[0])/size_z) + sigma_ani = np.sin(np.pi * (lon - lim_x[0])/size_x) * np.sin(np.pi * (lat - lim_y[0])/size_y) * np.sin(np.pi * (depth - lim_z[0])/size_z) + + if (sigma_ani > 0): + psi = ani_dir / 180.0 * np.pi # convert degrees to radians + elif (sigma_ani < 0): + psi = (ani_dir + 90.0) / 180.0 * np.pi + else: + psi = 0.0 + + else: + sigma_vel = 0.0 + sigma_ani = 0.0 + psi = 0.0 + + # set the velocity and anisotropy + vel[ir, it, ip] = bg_model[ir, it, ip] * (1.0 + pert_vel * sigma_vel) + xi[ir, it, ip] = pert_ani * abs(sigma_ani) * np.cos(2*psi) + eta[ir, it, ip] = pert_ani * abs(sigma_ani) * np.sin(2*psi) + +# write the model to a file +fname = "%s/linear_velocity_ckb_N%d_%d_%d_loop.h5" % (output_path, n_rtp[0], n_rtp[1], n_rtp[2]) +with h5py.File(fname, 'w') as f: + f.create_dataset('vel', data=vel) + f.create_dataset('xi', data=xi) + f.create_dataset('eta', data=eta) +print("generate checkerboard model based on the linear velocity model using plain loop:", fname) + + +# %% [markdown] +# # eg4. generate flexible checkerboard model +# +# the checker size increases with depth; +# +# the checker size is large for anisotropy; + +# %% +# only + +# file name of the background model +bg_model_fname = "%s/linear_velocity_N%d_%d_%d_PyTomoATT.h5" % (output_path, n_rtp[0], n_rtp[1], n_rtp[2]) + +# read the background model +bg_model = np.zeros(n_rtp) +with h5py.File(bg_model_fname, 'r') as f: + bg_model = f['vel'][:] + +# set the checkerboard model +vel = np.zeros(n_rtp) +xi = np.zeros(n_rtp) +eta = np.zeros(n_rtp) + +for ir in range(n_rtp[0]): + for it in range(n_rtp[1]): + for ip in range(n_rtp[2]): + depth = am_depths[ir] + lat = am_latitudes[it] + lon = am_longitudes[ip] + + if ((depth >= 0.0) and (depth <= 8.0)): + size_vel = 0.2 + size_ani = 0.3 + + sigma_vel = np.sin(np.pi * lon/size_vel) * np.sin(np.pi * lat/size_vel) * np.sin(np.pi * depth/8.0) + sigma_ani = np.sin(np.pi * lon/size_ani) * np.sin(np.pi * lat/size_ani) * np.sin(np.pi * depth/8.0) + + elif ((depth > 8.0) and (depth <= 20.0)): + + size_vel = 0.3 + size_ani = 0.4 + + sigma_vel = np.sin(np.pi * lon/size_vel) * np.sin(np.pi * lat/size_vel) * np.sin(np.pi * (depth - 8.0)/12.0 + np.pi) + sigma_ani = np.sin(np.pi * lon/size_ani) * np.sin(np.pi * lat/size_ani) * np.sin(np.pi * (depth - 8.0)/12.0 + np.pi) + + elif ((depth > 20.0) and (depth <= 36.0)): + + size_vel = 0.4 + size_ani = 0.5 + + sigma_vel = np.sin(np.pi * lon/size_vel) * np.sin(np.pi * lat/size_vel) * np.sin(np.pi * (depth - 20.0)/16.0 + 2*np.pi) + sigma_ani = np.sin(np.pi * lon/size_ani) * np.sin(np.pi * lat/size_ani) * np.sin(np.pi * (depth - 20.0)/16.0 + 2*np.pi) + + else: + sigma_vel = 0.0 + sigma_ani = 0.0 + + if (sigma_ani > 0): + psi = ani_dir / 180.0 * np.pi # convert degrees to radians + elif (sigma_ani < 0): + psi = (ani_dir + 90.0) / 180.0 * np.pi + else: + psi = 0.0 + + # set the velocity and anisotropy + vel[ir, it, ip] = bg_model[ir, it, ip] * (1.0 + pert_vel * sigma_vel) + xi[ir, it, ip] = pert_ani * abs(sigma_ani) * np.cos(2*psi) + eta[ir, it, ip] = pert_ani * abs(sigma_ani) * np.sin(2*psi) + +# write the model to a file +fname = "%s/linear_velocity_ckb_flex_N%d_%d_%d.h5" % (output_path, n_rtp[0], n_rtp[1], n_rtp[2]) +with h5py.File(fname, 'w') as f: + f.create_dataset('vel', data=vel) + f.create_dataset('xi', data=xi) + f.create_dataset('eta', data=eta) + +print("generate flexible checkerboard model based on the linear velocity model using plain loop:", fname) + + diff --git a/examples/scripts_of_generate_hdf5_model/2_plot_models.py b/examples/scripts_of_generate_hdf5_model/2_plot_models.py new file mode 100644 index 0000000..4bf5d2a --- /dev/null +++ b/examples/scripts_of_generate_hdf5_model/2_plot_models.py @@ -0,0 +1,338 @@ +# %% +import pygmt +pygmt.config(FONT="16p", IO_SEGMENT_MARKER="<<<") + +from pytomoatt.model import ATTModel +from pytomoatt.data import ATTData +import numpy as np + + +# %% +import os +output_path = "figs" +os.makedirs(output_path, exist_ok=True) + + +# %% [markdown] +# # eg1. plot constant velocity model + +# %% +# ---------------- read model files ---------------- +# file names +# init_model_file = 'models/constant_velocity_N61_51_101_PyTomoATT.h5' # initial model file +init_model_file = 'models/constant_velocity_N61_51_101_loop.h5' # initial model file +par_file = 'input_params/input_params.yaml' # parameter file + +# read initial and final model file +att_model = ATTModel.read(init_model_file, par_file) +init_model = att_model.to_xarray() + +# interp vel at depth = 20 km +depth = 20.0 +vel_init = init_model.interp_dep(depth, field='vel') # vel_init[i,:] are (lon, lat, vel) + +# ----------------- pygmt plot ------------------ + +fig = pygmt.Figure() +pygmt.makecpt(cmap="seis", series=[5, 7], background=True, reverse=False) # colorbar + + +# ------------ plot horizontal profile of velocity ------------ +region = [0, 2, 0, 1] # region of interest +fig.basemap(region=region, frame=["xa1","ya1","+tVelocity (km/s)"], projection="M10c") # base map + +depth = 20.0 +prof_init = init_model.interp_dep(depth, field='vel') # prof_init[i,:] are (lon, lat, vel) +lon = prof_init[:,0] # longitude +lat = prof_init[:,1] # latitude +vel = prof_init[:,2] # velocity + +grid = pygmt.surface(x=lon, y=lat, z=vel, spacing=0.04,region=region) + +fig.grdimage(grid = grid) # plot figure +fig.text(text="%d km"%(depth), x = 0.2 , y = 0.1, font = "14p,Helvetica-Bold,black", fill = "white") + +# colorbar +fig.shift_origin(xshift=0, yshift=-1.5) +fig.colorbar(frame = ["a1","y+lVp (km/s)"], position="+e+w4c/0.3c+h") +fig.shift_origin(xshift=0, yshift= 1.5) + +# ------------ plot horivertical profile of velocity ------------ +fig.shift_origin(xshift=11, yshift= 0) + +region = [0, 40, 0, 1] # region of interest +fig.basemap(region=region, frame=["xa20+lDepth (km)","ya1+lLatitude","nSwE"], projection="X3c/5c") # base map + +start = [1,0]; end = [1,1]; gap = 1 +prof_init = init_model.interp_sec(start, end, field='vel', val = gap) # prof_init[i,:] are (lon, lat, dis, dep, vel) +lat = prof_init[:,1] # lat +dep = prof_init[:,3] # depth +vel = prof_init[:,4] # velocity + +grid = pygmt.surface(x=dep, y=lat, z=vel, spacing="1/0.04",region=region) + +fig.grdimage(grid = grid) # plot figure + +fig.savefig("figs/constant_velocity.png") # save figure +fig.show() + + + +# %% [markdown] +# # eg2. plot linear velocity model + +# %% +# ---------------- read model files ---------------- +# file names +# init_model_file = 'models/linear_velocity_N61_51_101_PyTomoATT.h5' # initial model file +init_model_file = 'models/linear_velocity_N61_51_101_loop.h5' # initial model file +par_file = 'input_params/input_params.yaml' # parameter file + +# read initial and final model file +att_model = ATTModel.read(init_model_file, par_file) +init_model = att_model.to_xarray() + +# # interp vel at depth = 20 km +# depth = 20.0 +# vel_init = init_model.interp_dep(depth, field='vel') # vel_init[i,:] are (lon, lat, vel) + +# ----------------- pygmt plot ------------------ + +fig = pygmt.Figure() +pygmt.makecpt(cmap="seis", series=[5, 8], background=True, reverse=False) # colorbar + + +# ------------ plot horizontal profile of velocity ------------ +region = [0, 2, 0, 1] # region of interest +fig.basemap(region=region, frame=["xa1","ya1","+tVelocity (km/s)"], projection="M10c") # base map + +depth = 20.0 +prof_init = init_model.interp_dep(depth, field='vel') # prof_init[i,:] are (lon, lat, vel) +lon = prof_init[:,0] # longitude +lat = prof_init[:,1] # latitude +vel = prof_init[:,2] # velocity + +grid = pygmt.surface(x=lon, y=lat, z=vel, spacing=0.04,region=region) + +fig.grdimage(grid = grid) # plot figure +fig.text(text="%d km"%(depth), x = 0.2 , y = 0.1, font = "14p,Helvetica-Bold,black", fill = "white") + +# colorbar +fig.shift_origin(xshift=0, yshift=-1.5) +fig.colorbar(frame = ["a1","y+lVp (km/s)"], position="+e+w4c/0.3c+h") +fig.shift_origin(xshift=0, yshift= 1.5) + +# ------------ plot horivertical profile of velocity ------------ +fig.shift_origin(xshift=11, yshift= 0) + +region = [0, 40, 0, 1] # region of interest +fig.basemap(region=region, frame=["xa20+lDepth (km)","ya1+lLatitude","nSwE"], projection="X3c/5c") # base map + +start = [1,0]; end = [1,1]; gap = 1 +prof_init = init_model.interp_sec(start, end, field='vel', val = gap) # prof_init[i,:] are (lon, lat, dis, dep, vel) +lat = prof_init[:,1] # lat +dep = prof_init[:,3] # depth +vel = prof_init[:,4] # velocity + +grid = pygmt.surface(x=dep, y=lat, z=vel, spacing="1/0.04",region=region) + +fig.grdimage(grid = grid) # plot figure + +fig.savefig("figs/linear_velocity.png") # save figure +fig.show() + + + +# %% [markdown] +# # eg3. plot checkerboard model + +# %% +# ---------------- read model files ---------------- +# file names +init_model_file = 'models/linear_velocity_N61_51_101_PyTomoATT.h5' # initial model file +ckb_model_file = 'models/linear_velocity_ckb_N61_51_101_PyTomoATT.h5' # checkerboard model file +# ckb_model_file = 'models/linear_velocity_ckb_N61_51_101_loop.h5' # checkerboard model file +par_file = 'input_params/input_params.yaml' # parameter file + +# read initial and final model file +att_model = ATTModel.read(init_model_file, par_file) +init_model = att_model.to_xarray() + +att_model = ATTModel.read(ckb_model_file, par_file) +ckb_model = att_model.to_xarray() + +# # interp vel at depth = 20 km +# depth = 20.0 +# vel_init = init_model.interp_dep(depth, field='vel') # vel_init[i,:] are (lon, lat, vel) +# vel_ckb = ckb_model.interp_dep(depth, field='vel') # vel_ckb[i,:] are (lon, lat, vel) + +# ----------------- pygmt plot ------------------ + +fig = pygmt.Figure() +pygmt.makecpt(cmap="../utils/svel13_chen.cpt", series=[-10,10], background=True, reverse=False) # colorbar + + +# ------------ plot horizontal profile of velocity ------------ +region = [0, 2, 0, 1] # region of interest +fig.basemap(region=region, frame=["xa1","ya1","+tVelocity perturbation (%)"], projection="M10c") # base map + +# velocity perturbation at depth = 15 km +depth = 15.0 +prof_init = init_model.interp_dep(depth, field='vel') # prof_init[i,:] are (lon, lat, vel) +prof_ckb = ckb_model.interp_dep(depth, field='vel') # prof_ckb[i,:] are (lon, lat, vel) +lon = prof_init[:,0] # longitude +lat = prof_init[:,1] # latitude +vel_pert = (prof_ckb[:,2] - prof_init[:,2])/prof_init[:,2] * 100 # velocity perturbation related to initial model + +grid = pygmt.surface(x=lon, y=lat, z=vel_pert, spacing=0.01,region=region) + +fig.grdimage(grid = grid) # plot figure +fig.text(text="%d km"%(depth), x = 0.2 , y = 0.1, font = "14p,Helvetica-Bold,black", fill = "white") + +# fast velocity directions (FVDs) +samp_interval = 3 # control the density of anisotropic arrows +width = 0.06 # width of the anisotropic arrow +ani_per_1 = 0.01; ani_per_2 = 0.05; scale = 0.5; basic = 0.1 # control the length of anisotropic arrows related to the amplitude of anisotropy. length = 0.1 + (amplitude - ani_per_1) / (ani_per_2 - ani_per_1) * scale +ani_thd = ani_per_1 # if the amplitude of anisotropy is smaller than ani_thd, no anisotropic arrow will be plotted + +phi = ckb_model.interp_dep(depth, field='phi', samp_interval=samp_interval) # phi_inv[i,:] are (lon, lat, phi) +epsilon = ckb_model.interp_dep(depth, field='epsilon', samp_interval=samp_interval) # epsilon_inv[i,:] are (lon, lat, epsilon) +ani_lon = phi[:,0].reshape(-1,1) +ani_lat = phi[:,1].reshape(-1,1) +ani_phi = phi[:,2].reshape(-1,1) +length = ((epsilon[:,2] - ani_per_1) / (ani_per_2 - ani_per_1) * scale + basic).reshape(-1,1) +ani_arrow = np.hstack([ani_lon, ani_lat, ani_phi, length, np.ones((ani_lon.size,1))*width]) # lon, lat, color, angle[-90,90], length, width + +# remove arrows with small amplitude of anisotropy +idx = np.where(epsilon[:,2] > ani_thd)[0] # indices of arrows with large enough amplitude of anisotropy +ani_arrow = ani_arrow[idx,:] # remove arrows with small amplitude of anisotropy + +# plot anisotropic arrows +fig.plot(ani_arrow, style='j', fill='yellow1', pen='0.5p,black') # plot fast velocity direction + + +# colorbar +fig.shift_origin(xshift=0, yshift=-1.5) +fig.colorbar(frame = ["a10","y+ldlnVp (%)"], position="+e+w4c/0.3c+h") +fig.shift_origin(xshift=0, yshift= 1.5) + +# ------------ plot horivertical profile of velocity ------------ +fig.shift_origin(xshift=11, yshift= 0) + +region = [0, 40, 0, 1] # region of interest +fig.basemap(region=region, frame=["xa20+lDepth (km)","ya1+lLatitude","nSwE"], projection="X3c/5c") # base map + +start = [0.875,0]; end = [0.875,1]; gap = 1 +prof_init = init_model.interp_sec(start, end, field='vel', val = gap) # prof_init[i,:] are (lon, lat, dis, dep, vel) +prof_ckb = ckb_model.interp_sec(start, end, field='vel', val = gap) # prof_ckb[i,:] are (lon, lat, dis, dep, vel) +lat = prof_init[:,1] # lat +dep = prof_init[:,3] # depth +vel = (prof_ckb[:,4] - prof_init[:,4])/prof_init[:,4] * 100 # velocity perturbation related to initial model + +grid = pygmt.surface(x=dep, y=lat, z=vel, spacing="1/0.01",region=region) + +fig.grdimage(grid = grid) # plot figure + +fig.savefig("figs/checkerboard_velocity.png") # save figure +fig.show() + + +# %% [markdown] +# # eg4. plot flexible checkerboard model + +# %% +# ---------------- read model files ---------------- +# file names +init_model_file = 'models/linear_velocity_N61_51_101_PyTomoATT.h5' # initial model file +ckb_model_file = 'models/linear_velocity_ckb_flex_N61_51_101.h5' # checkerboard model file +par_file = 'input_params/input_params.yaml' # parameter file + +# read initial and final model file +att_model = ATTModel.read(init_model_file, par_file) +init_model = att_model.to_xarray() + +att_model = ATTModel.read(ckb_model_file, par_file) +ckb_model = att_model.to_xarray() + +# # interp vel at depth = 20 km +# depth = 20.0 +# vel_init = init_model.interp_dep(depth, field='vel') # vel_init[i,:] are (lon, lat, vel) +# vel_ckb = ckb_model.interp_dep(depth, field='vel') # vel_ckb[i,:] are (lon, lat, vel) + +# ----------------- pygmt plot ------------------ + +fig = pygmt.Figure() +pygmt.makecpt(cmap="../utils/svel13_chen.cpt", series=[-10,10], background=True, reverse=False) # colorbar + + +for depth in [4,14,28]: + # ------------ plot horizontal profile of velocity ------------ + region = [0, 2, 0, 1] # region of interest + fig.basemap(region=region, frame=["xa1","ya1","NsEw"], projection="M10c") # base map + + # velocity perturbation at depth = 15 km + prof_init = init_model.interp_dep(depth, field='vel') # prof_init[i,:] are (lon, lat, vel) + prof_ckb = ckb_model.interp_dep(depth, field='vel') # prof_ckb[i,:] are (lon, lat, vel) + lon = prof_init[:,0] # longitude + lat = prof_init[:,1] # latitude + vel_pert = (prof_ckb[:,2] - prof_init[:,2])/prof_init[:,2] * 100 # velocity perturbation related to initial model + + grid = pygmt.surface(x=lon, y=lat, z=vel_pert, spacing=0.01,region=region) + + fig.grdimage(grid = grid) # plot figure + + # fast velocity directions (FVDs) + samp_interval = 3 # control the density of anisotropic arrows + width = 0.06 # width of the anisotropic arrow + ani_per_1 = 0.01; ani_per_2 = 0.05; scale = 0.5; basic = 0.1 # control the length of anisotropic arrows related to the amplitude of anisotropy. length = 0.1 + (amplitude - ani_per_1) / (ani_per_2 - ani_per_1) * scale + ani_thd = ani_per_1 # if the amplitude of anisotropy is smaller than ani_thd, no anisotropic arrow will be plotted + + phi = ckb_model.interp_dep(depth, field='phi', samp_interval=samp_interval) # phi_inv[i,:] are (lon, lat, phi) + epsilon = ckb_model.interp_dep(depth, field='epsilon', samp_interval=samp_interval) # epsilon_inv[i,:] are (lon, lat, epsilon) + ani_lon = phi[:,0].reshape(-1,1) + ani_lat = phi[:,1].reshape(-1,1) + ani_phi = phi[:,2].reshape(-1,1) + length = ((epsilon[:,2] - ani_per_1) / (ani_per_2 - ani_per_1) * scale + basic).reshape(-1,1) + ani_arrow = np.hstack([ani_lon, ani_lat, ani_phi, length, np.ones((ani_lon.size,1))*width]) # lon, lat, color, angle[-90,90], length, width + + # remove arrows with small amplitude of anisotropy + idx = np.where(epsilon[:,2] > ani_thd)[0] # indices of arrows with large enough amplitude of anisotropy + ani_arrow = ani_arrow[idx,:] # remove arrows with small amplitude of anisotropy + + # plot anisotropic arrows + fig.plot(ani_arrow, style='j', fill='yellow1', pen='0.5p,black') # plot fast velocity direction + + fig.text(text="%d km"%(depth), x = 0.2 , y = 0.1, font = "14p,Helvetica-Bold,black", fill = "white") + + # plot vertical profile + fig.plot(x=[0.9, 0.9], y=[0, 1], pen="2p,black,-") # vertical line + + fig.shift_origin(xshift=0, yshift=-6) + +# colorbar +fig.shift_origin(xshift=0, yshift= 4.5) +fig.colorbar(frame = ["a10","y+ldlnVp (%)"], position="+e+w4c/0.3c+h") +fig.shift_origin(xshift=0, yshift= 1.5) + +# ------------ plot horivertical profile of velocity ------------ +fig.shift_origin(xshift=11, yshift= 0) + +region = [0, 40, 0, 1] # region of interest +fig.basemap(region=region, frame=["xa20+lDepth (km)","ya1+lLatitude","nSwE"], projection="X3c/5c") # base map + +start = [0.9,0]; end = [0.9,1]; gap = 1 +prof_init = init_model.interp_sec(start, end, field='vel', val = gap) # prof_init[i,:] are (lon, lat, dis, dep, vel) +prof_ckb = ckb_model.interp_sec(start, end, field='vel', val = gap) # prof_ckb[i,:] are (lon, lat, dis, dep, vel) +lat = prof_init[:,1] # lat +dep = prof_init[:,3] # depth +vel = (prof_ckb[:,4] - prof_init[:,4])/prof_init[:,4] * 100 # velocity perturbation related to initial model + +grid = pygmt.surface(x=dep, y=lat, z=vel, spacing="1/0.01",region=region) + +fig.grdimage(grid = grid) # plot figure + +fig.savefig("figs/flexible_checkerboard_velocity.png") # save figure +fig.show() + + + diff --git a/examples/scripts_of_generate_hdf5_model/input_params/input_params.yaml b/examples/scripts_of_generate_hdf5_model/input_params/input_params.yaml new file mode 100644 index 0000000..dffdc97 --- /dev/null +++ b/examples/scripts_of_generate_hdf5_model/input_params/input_params.yaml @@ -0,0 +1,50 @@ +version: 3 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-10, 50] # depth in km + min_max_lat: [0, 1] # latitude in degree + min_max_lon: [0, 2] # longitude in degree + n_rtp: [61, 51, 101] # number of nodes in depth,latitude,longitude direction + +################################################# +# traveltime data file path # +################################################# +source: + src_rec_file: 1_src_rec_files/src_rec_config.dat # source receiver file path + swap_src_rec: true # swap source and receiver + +################################################# +# initial model file path # +################################################# +model: + init_model_path: 2_models/model_ckb_N61_51_101.h5 # path to initial model file + +################################################# +# parallel computation settings # +################################################# +parallel: # parameters for parallel computation + n_sims: 8 # number of simultanoues runs (parallel the sources) + ndiv_rtp: [1, 1, 1] # number of subdivision on each direction (parallel the computional domain) + +############################################ +# output file setting # +############################################ +output_setting: + output_dir: OUTPUT_FILES/OUTPUT_FILES_signal # path to output director (default is ./OUTPUT_FILES/) + output_final_model: true # output merged final model (final_model.h5) or not. + output_in_process: false # output model at each inv iteration or not. + output_in_process_data: false # output src_rec_file at each inv iteration or not. + output_file_format: 0 + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion + earthquake relocation +run_mode: 0 diff --git a/examples/scripts_of_generate_hdf5_model/run_this_example.sh b/examples/scripts_of_generate_hdf5_model/run_this_example.sh new file mode 100644 index 0000000..5257145 --- /dev/null +++ b/examples/scripts_of_generate_hdf5_model/run_this_example.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +# run the script to generate HDF5 model files for TomoATT. Four models will be generated for TomoATT +# 1. constant velocity model +# 2. linear velocity model +# 3. regular checkerboard model based on the linear velocity model +# 4. flexible checkerboard model based on the linear velocity model + +python 1_generate_models.py + +# run the script to plot the generated models (optional) + +python 2_plot_models.py diff --git a/examples/scripts_of_plotting/1_plot_model.py b/examples/scripts_of_plotting/1_plot_model.py new file mode 100644 index 0000000..3c8f24b --- /dev/null +++ b/examples/scripts_of_plotting/1_plot_model.py @@ -0,0 +1,173 @@ +# %% +import pygmt +pygmt.config(FONT="16p", IO_SEGMENT_MARKER="<<<") + +from pytomoatt.model import ATTModel +from pytomoatt.data import ATTData +import numpy as np + +# %% +# (Option 1) plot the final model after inversion + +# Need to set "output_final_model" as "True" in the input_params.yaml file + +# ---------------- read model files ---------------- +# file names +init_model_file = 'input_files/model_init_N61_61_61.h5' # initial model file +inv_model_file = 'OUTPUT_FILES/final_model.h5' # final model file +par_file = 'input_files/input_params.yaml' # parameter file + +# read initial and final model file +model = ATTModel.read(init_model_file, par_file) +init_model = model.to_xarray() + +model = ATTModel.read(inv_model_file, par_file) +inv_model = model.to_xarray() + + +# %% +# # (Option 2) plot the model at the XX iteration + +# # Need to set "output_middle_model" as "True" in the input_params.yaml file + +# # ---------------- read model files ---------------- +# # file names +# init_model_file = 'input_files/model_init_N61_61_61.h5' # initial model file +# inv_model_file = 'OUTPUT_FILES/middle_model_step_0007.h5' # final model file +# par_file = 'input_files/input_params.yaml' # parameter file + +# # read initial and final model file +# model = ATTModel.read(init_model_file, par_file) +# init_model = model.to_xarray() + +# model = ATTModel.read(inv_model_file, par_file) +# inv_model = model.to_xarray() + +# %% +import os +try: + os.mkdir('img') +except: + pass + +# %% +# ---------------- access 3D model parameters ---------------- + +# we can access 3D dataset with keys: +# 1. "vel" for velocity +# 2. "phi" fast velocity direction, anti-clock angle w.r.t the east direction. (only available for anisotropic model) +# 3. "epsilon" for anisotropic magnitude (only available for anisotropic model) +# 4. "xi" and "eta" for anisotropic parameters: xi = epsilon * cos(phi), eta = epsilon * sin(phi) +vel_3d_array = inv_model["vel"] +phi_3d_array = inv_model["phi"] +epsilon_3d_array = inv_model["epsilon"] +xi_3d_array = inv_model["xi"] +eta_3d_array = inv_model["eta"] + +print("3D array of model parameters. \n vel: ", vel_3d_array.shape, " \n phi: ", phi_3d_array.shape, + " \n epsilon: ", epsilon_3d_array.shape, " \n xi: ", xi_3d_array.shape, " \n eta: ", eta_3d_array.shape) + +# %% +# ---------------- 2D depth profile of velocity perturbation ---------------- + +# interp vel at depth = 20 km +depth = 20.0 +vel_init = init_model.interp_dep(depth, field='vel') # vel_init[i,:] are (lon, lat, vel) +vel_inv = inv_model.interp_dep(depth, field='vel') + +print("vel_depth at depth = ", depth, " km. vel_depth:", vel_init.shape, ", (lon, lat, vel)") + +# plot +fig = pygmt.Figure() +fig.basemap(region=[0,2,0,2], frame=["xa1","ya1","+tVelocity perturbation"], projection="M10c") # base map +pygmt.makecpt(cmap="../utils/svel13_chen.cpt", series=[-20, 20], background=True, reverse=False) # colorbar + +x = vel_init[:,0]; # longitude +y = vel_init[:,1]; # latitude +value = (vel_inv[:,2] - vel_init[:,2])/vel_init[:,2] * 100 # velocity perturbation relative to the initial model +grid = pygmt.surface(x=x, y=y, z=value, spacing=0.04,region=[0,2,0,2]) + +fig.grdimage(grid = grid) # plot figure +fig.text(text="%d km"%(depth), x = 0.2 , y = 0.1, font = "14p,Helvetica-Bold,black", fill = "white") + +# colorbar +fig.shift_origin(xshift=0, yshift=-1.5) +fig.colorbar(frame = ["a20","y+ldlnVp (%)"], position="+e+w4c/0.3c+h") + +fig.savefig("img/1_dep_vel.png") + +# %% +# ---------------- 2D depth profile of azimuthal anisotropy ---------------- + +# interp magnitude of anisotropy at depth = 20 km +depth = 20.0 +epsilon_inv = inv_model.interp_dep(depth, field='epsilon') # epsilon_inv[i,:] are (lon, lat, epsilon) + +print("epsilon_inv at depth = ", depth, " km. epsilon_inv:", epsilon_inv.shape, ", (lon, lat, epsilon)") + +# generate fast velocity direction (anisotropic arrow) +samp_interval = 3 +length = 10 +width = 0.1 +ani_thd = 0.02 +ani_phi = inv_model.interp_dep(depth, field='phi', samp_interval=samp_interval) +ani_epsilon = inv_model.interp_dep(depth, field='epsilon', samp_interval=samp_interval) +ani_arrow = np.hstack([ani_phi, ani_epsilon[:,2].reshape(-1, 1)*length, np.ones((ani_epsilon.shape[0],1))*width]) # lon, lat, angle, length, width +idx = np.where(ani_epsilon[:,2] > ani_thd) +ani_arrow = ani_arrow[idx[0],:] + +print("ani_arrow at depth = ", depth, " km. ani_arrow:", ani_arrow.shape, ", (lon, lat, angle, length, width)") + + +# plot +fig = pygmt.Figure() +fig.basemap(region=[0,2,0,2], frame=["xa1","ya1","+tAzimuthal Anisotropy"], projection="M10c") # base map +pygmt.makecpt(cmap="cool", series=[0, 0.1], background=True, reverse=False) # colorbar + +x = epsilon_inv[:,0]; # longitude +y = epsilon_inv[:,1]; # latitude +value = epsilon_inv[:,2] # magnitude of anisotropy +grid = pygmt.surface(x=x, y=y, z=value, spacing=0.04,region=[0,2,0,2]) + +fig.grdimage(grid = grid) # plot magnitude of anisotropy +fig.plot(ani_arrow, style='j', fill='yellow1', pen='0.5p,black') # plot fast velocity direction + +fig.text(text="%d km"%(depth), x = 0.2 , y = 0.1, font = "14p,Helvetica-Bold,black", fill = "white") + +# colorbar +fig.shift_origin(xshift=0, yshift=-1.5) +fig.colorbar(frame = ["a0.1","y+lAnisotropy"], position="+e+w4c/0.3c+h") + +fig.savefig("img/1_dep_ani.png") + +# %% +# ---------------- 2D vertical profile of velocity perturbation ---------------- + +# interp vel from [0,0.75] in lon-lat to [2,0.75] in lon-lat, gap = 1 km +start = [0,0.75]; end = [2,0.75]; gap = 1 +vel_init_sec = init_model.interp_sec(start, end, field='vel', val = gap) # vel_init_sec[i,:] are (lon, lat, dis, dep, vel) +vel_inv_sec = inv_model.interp_sec(start, end, field='vel', val = gap) + +print("vel_init_sec:", vel_init_sec.shape, ", (lon, lat, distance, depth, vel)") + +# plot +fig = pygmt.Figure() +fig.basemap(region=[0,2,0,40], frame=["xa1+lLongitude","ya20+lDepth (km)","+tVelocity perturbation"], projection="X10c/-4c") # base map +pygmt.makecpt(cmap="../utils/svel13_chen.cpt", series=[-20, 20], background=True, reverse=False) # colorbar + +x = vel_init_sec[:,0]; # longitude +y = vel_init_sec[:,3]; # depth +value = (vel_inv_sec[:,4] - vel_init_sec[:,4])/vel_init_sec[:,4] * 100 # velocity perturbation relative to the initial model +grid = pygmt.surface(x=x, y=y, z=value, spacing="0.04/1",region=[0,2,0,40]) + +fig.grdimage(grid = grid) # plot figure +fig.text(text="A", x = 0.1 , y = 5, font = "14p,Helvetica-Bold,black", fill = "white") +fig.text(text="A@+'@+", x = 1.9 , y = 5, font = "14p,Helvetica-Bold,black", fill = "white") + +# colorbar +fig.shift_origin(xshift=0, yshift=-2) +fig.colorbar(frame = ["a20","y+ldlnVp (%)"], position="+e+w4c/0.3c+h") + +fig.savefig("img/1_sec_vel.png") + + diff --git a/examples/scripts_of_plotting/2_plot_time_field.py b/examples/scripts_of_plotting/2_plot_time_field.py new file mode 100644 index 0000000..19726bb --- /dev/null +++ b/examples/scripts_of_plotting/2_plot_time_field.py @@ -0,0 +1,187 @@ +# %% +import pygmt +pygmt.config(FONT="16p", IO_SEGMENT_MARKER="<<<") + +from pytomoatt.model import ATTModel +from pytomoatt.data import ATTData +import numpy as np + +# %% +# plot the traveltime field and adjoint field of the source at the XX iteration +# 1. set "output_source_field" to be "True" in the input_params.yaml file + +# Because source parallelizaion is used, the source field is only stored in one out_data_sim_group_XX.h5 file. +# For example, if we use 8 processors for source parallelization, we have +# src_JC00 is stored in out_data_sim_group_0.h5 file. +# src_JC05 is stored in out_data_sim_group_5.h5 file. +# src_JC07 is stored in out_data_sim_group_7.h5 file. +# src_JC08 is stored in out_data_sim_group_0.h5 file. +# src_JC09 is stored in out_data_sim_group_1.h5 file. +# src_JC10 is stored in out_data_sim_group_2.h5 file. +# ... +# src_JC24 is stored in out_data_sim_group_0.h5 file. + +# ---------------- read files ---------------- +src_name = 'JC05' +Nstep = "0007" + +# file names +data_file = 'OUTPUT_FILES/out_data_sim_group_5.h5' # data file +par_file = 'input_files/input_params.yaml' # parameter file +grid_file = 'OUTPUT_FILES/out_data_grid.h5' # grid file +group = 'src_%s'%(src_name) # src_${src_name} + +# read traveltime field +dataset_time = 'time_field_inv_%s'%(Nstep) # time_field_inv_${Nstep} +data = ATTData.read(data_file, par_file, grid_file, group, dataset_time) +time_field = data.to_xarray() + +# read adjoint field +dataset_adjoint = 'adjoint_field_inv_%s'%(Nstep) # adjoint_field_inv_${Nstep} +data = ATTData.read(data_file, par_file, grid_file, group, dataset_adjoint) +adjoint_field = data.to_xarray() + + +# %% +import os +try: + os.mkdir('img') +except: + pass + +# %% +# ---------------- access 3D time field and adjoint field ---------------- +# we can access 3D dataset: + +dep_1d_array = time_field["dep"] +lat_1d_array = time_field["lat"] +lon_1d_array = time_field["lon"] + +print("3D array of coordinates. \n dep: ", dep_1d_array.shape, " \n lat: ", lat_1d_array.shape, " \n lon: ", lon_1d_array.shape) + +time_3d_array = time_field[dataset_time] +adjoint_3d_array = adjoint_field[dataset_adjoint] + +print("3D array of fields. \n time: ", time_3d_array.shape, " \n adjoint: ", adjoint_3d_array.shape) + +# %% +# ---------------- 2D depth profile of time field ---------------- + +# interp vel at depth = 20 km +depth = 20.0 +time = time_field.interp_dep(depth, field=dataset_time) # time[i,:] are (lon, lat, vel) + +print("time at depth = ", depth, " km. time:", time.shape, ", (lon, lat, time)") + +# plot +fig = pygmt.Figure() +fig.basemap(region=[0,2,0,2], frame=["xa1","ya1","+tTraveltime"], projection="M10c") # base map +pygmt.makecpt(cmap="jet", series=[0, 30], background=True, reverse=True) # colorbar + +x = time[:,0]; # longitude +y = time[:,1]; # latitude +value = time[:,2] # traveltime +grid = pygmt.surface(x=x, y=y, z=value, spacing=0.04,region=[0,2,0,2]) + +fig.grdimage(grid = grid) # plot figure +fig.contour(x=x, y=y, z=value, levels=5, pen="1.5p,white") # contour +fig.text(text="%d km"%(depth), x = 0.2 , y = 0.1, font = "14p,Helvetica-Bold,black", fill = "white") + +# colorbar +fig.shift_origin(xshift=0, yshift=-1.5) +fig.colorbar(frame = ["a20","y+lTraveltime (s)"], position="+e+w4c/0.3c+h") + +fig.savefig("img/2_dep_time.png") + +# %% +# ---------------- 2D depth profile of adjoint field ---------------- + +# interp vel at depth = 20 km +depth = 20.0 +adjoint = adjoint_field.interp_dep(depth, field=dataset_adjoint) + +print("time at depth = ", depth, " km. time:", time.shape, ", (lon, lat, time)") + +# plot +fig = pygmt.Figure() +fig.basemap(region=[0,2,0,2], frame=["xa1","ya1","+tAdjoint field"], projection="M10c") # base map +pygmt.makecpt(cmap="jet", series=[-0.5, 0.5], background=True, reverse=False) # colorbar + +x = time[:,0]; # longitude +y = time[:,1]; # latitude +value = adjoint[:,2] # traveltime +value = value/np.nanmax(np.abs(value)) +grid = pygmt.surface(x=x, y=y, z=value, spacing=0.04,region=[0,2,0,2]) + +fig.grdimage(grid = grid) # plot figure +fig.contour(x=x, y=y, z=time[:,2], levels=5, pen="1.5p,white") # contour +fig.text(text="%d km"%(depth), x = 0.2 , y = 0.1, font = "14p,Helvetica-Bold,black", fill = "white") + +# colorbar +fig.shift_origin(xshift=0, yshift=-1.5) +fig.colorbar(frame = ["a0.5","y+lAdjoint field"], position="+e+w4c/0.3c+h") + +fig.savefig("img/2_dep_adjoint.png") + +# %% +# ---------------- 2D vertical profile of traveltime field ---------------- + +# interp from [0,0.6] in lon-lat to [2,0.6] in lon-lat, gap = 1 km +start = [0,0.6]; end = [2,0.6]; gap = 1 +time_sec = time_field.interp_sec(start, end, field=dataset_time, val = gap) # time_sec[i,:] are (lon, lat, dis, dep, time) + +print("time_sec:", time_sec.shape, ", (lon, lat, distance, depth, time)") + +# plot +fig = pygmt.Figure() +fig.basemap(region=[0,2,0,40], frame=["xa1+lLongitude","ya20+lDepth (km)","+tTraveltime"], projection="X10c/-2c") # base map +pygmt.makecpt(cmap="jet", series=[0, 30], background=True, reverse=True) # colorbar + +x = time_sec[:,0]; # longitude +y = time_sec[:,3]; # depth +value = time_sec[:,4] # traveltime +grid = pygmt.surface(x=x, y=y, z=value, spacing="0.04/1",region=[0,2,0,40]) + +fig.grdimage(grid = grid) # plot figure +fig.contour(x=x, y=y, z=value, levels=5, pen="1.5p,white") # contour +fig.text(text="A", x = 0.1 , y = 5, font = "14p,Helvetica-Bold,black", fill = "white") +fig.text(text="A@+'@+", x = 1.9 , y = 5, font = "14p,Helvetica-Bold,black", fill = "white") + +# colorbar +fig.shift_origin(xshift=0, yshift=-2) +fig.colorbar(frame = ["a20","y+lTraveltime (s)"], position="+e+w4c/0.3c+h") + +fig.savefig("img/2_sec_time.png") + +# %% +# ---------------- 2D vertical profile of adjoint field ---------------- + +# interp from [0,0.6] in lon-lat to [2,0.6] in lon-lat, gap = 1 km +start = [0,0.6]; end = [2,0.6]; gap = 1 +adjoint_sec = adjoint_field.interp_sec(start, end, field=dataset_adjoint, val = gap) + +print("adjoint_sec:", time_sec.shape, ", (lon, lat, distance, depth, adjoint)") + +# plot +fig = pygmt.Figure() +fig.basemap(region=[0,2,0,40], frame=["xa1+lLongitude","ya20+lDepth (km)","+tAdjoint field"], projection="X10c/-2c") # base map +pygmt.makecpt(cmap="jet", series=[-0.5, 0.5], background=True, reverse=False) # colorbar + +x = adjoint_sec[:,0]; # longitude +y = adjoint_sec[:,3]; # depth +value = adjoint_sec[:,4] # traveltime +value = value/np.nanmax(np.abs(value)) +grid = pygmt.surface(x=x, y=y, z=value, spacing="0.04/1",region=[0,2,0,40]) + +fig.grdimage(grid = grid) # plot figure +fig.contour(x=x, y=y, z=time_sec[:,4], levels=5, pen="1.5p,white") # contour +fig.text(text="A", x = 0.1 , y = 5, font = "14p,Helvetica-Bold,black", fill = "white") +fig.text(text="A@+'@+", x = 1.9 , y = 5, font = "14p,Helvetica-Bold,black", fill = "white") + +# colorbar +fig.shift_origin(xshift=0, yshift=-2) +fig.colorbar(frame = ["a0.5","y+lAdjoint"], position="+e+w4c/0.3c+h") + +fig.savefig("img/2_sec_adjoint.png") + + diff --git a/examples/scripts_of_plotting/3_plot_kernel.py b/examples/scripts_of_plotting/3_plot_kernel.py new file mode 100644 index 0000000..9bc64d3 --- /dev/null +++ b/examples/scripts_of_plotting/3_plot_kernel.py @@ -0,0 +1,189 @@ +# %% +import pygmt +pygmt.config(FONT="16p", IO_SEGMENT_MARKER="<<<") + +from pytomoatt.model import ATTModel +from pytomoatt.data import ATTData +import numpy as np + +# %% +# plot sensitivity kernel at the XX iteration +# 1. set "output_kernel" to be "True" in the input_params.yaml file + +# ---------------- read files ---------------- +Nstep = "0007" +kernel_list = {} # dictionary to store all the kernels + +# file names +data_file = 'OUTPUT_FILES/out_data_sim_group_0.h5' # data file +par_file = 'input_files/input_params.yaml' # parameter file +grid_file = 'OUTPUT_FILES/out_data_grid.h5' # grid file +group = 'model' + +# (Option 1) read original sensitivity kernel +# Ks: kernel w.r.t. slowness at the 7-th iteration +dataset = 'Ks_inv_%s'%(Nstep) +data = ATTData.read(data_file, par_file, grid_file, group, dataset) +kernel_list[dataset] = data.to_xarray() + +# Kxi: kernel w.r.t. xi (anisotropic parameter) at the 7-th iteration +dataset = 'Kxi_inv_%s'%(Nstep) +data = ATTData.read(data_file, par_file, grid_file, group, dataset) +kernel_list[dataset] = data.to_xarray() + +# Keta: kernel w.r.t. eta (anisotropic parameter) at the 7-th iteration +dataset = 'Keta_inv_%s'%(Nstep) +data = ATTData.read(data_file, par_file, grid_file, group, dataset) +kernel_list[dataset] = data.to_xarray() + +# %% +# (Option 2) read kernel_density +# Ks_den: kernel density w.r.t. slowness at the 7-th iteration +dataset = 'Ks_density_inv_%s'%(Nstep) +data = ATTData.read(data_file, par_file, grid_file, group, dataset) +kernel_list[dataset] = data.to_xarray() + +# Kxi_den: kernel density w.r.t. xi (anisotropic parameter) at the 7-th iteration +dataset = 'Kxi_density_inv_%s'%(Nstep) +data = ATTData.read(data_file, par_file, grid_file, group, dataset) +kernel_list[dataset] = data.to_xarray() + +# Keta_den: kernel density w.r.t. eta (anisotropic parameter) at the 7-th iteration +dataset = 'Keta_density_inv_%s'%(Nstep) +data = ATTData.read(data_file, par_file, grid_file, group, dataset) +kernel_list[dataset] = data.to_xarray() + +# %% +# kernel density normalization is performed after smoothing. So tag 'Ks_over_Kden_inv_%s'%(Nstep) is not available for version > 1.0.3 +# # (Option 3) read normalized kernel, K/(k_den)^\zeta +# dataset = 'Ks_over_Kden_inv_%s'%(Nstep) +# data = ATTData.read(data_file, par_file, grid_file, group, dataset) +# kernel_list[dataset] = data.to_xarray() + +# # Kxi_norm: normalized kernel w.r.t. xi (anisotropic parameter) at the 7-th iteration +# dataset = 'Kxi_over_Kden_inv_%s'%(Nstep) +# data = ATTData.read(data_file, par_file, grid_file, group, dataset) +# kernel_list[dataset] = data.to_xarray() + +# # Keta_norm: normalized kernel w.r.t. eta (anisotropic parameter) at the 7-th iteration +# dataset = 'Keta_over_Kden_inv_%s'%(Nstep) +# data = ATTData.read(data_file, par_file, grid_file, group, dataset) +# kernel_list[dataset] = data.to_xarray() + +# %% +# this part works for version > 1.0.3 +# # (Option 3) read kernel density smoothed by multigrid parameterization, +# dataset = 'Ks_density_update_inv_%s'%(Nstep) +# data = ATTData.read(data_file, par_file, grid_file, group, dataset) +# kernel_list[dataset] = data.to_xarray() + +# # Kxi_norm: normalized kernel w.r.t. xi (anisotropic parameter) at the 7-th iteration +# dataset = 'Kxi_density_update_inv_%s'%(Nstep) +# data = ATTData.read(data_file, par_file, grid_file, group, dataset) +# kernel_list[dataset] = data.to_xarray() + +# # Keta_norm: normalized kernel w.r.t. eta (anisotropic parameter) at the 7-th iteration +# dataset = 'Keta_density_update_inv_%s'%(Nstep) +# data = ATTData.read(data_file, par_file, grid_file, group, dataset) +# kernel_list[dataset] = data.to_xarray() + +# %% +# (Option 4) read normalized kernel smoothed by multigrid parameterization +# Ks_update: smoothed normalized kernel w.r.t. slowness at the 7-th iteration +dataset = 'Ks_update_inv_%s'%(Nstep) +data = ATTData.read(data_file, par_file, grid_file, group, dataset) +kernel_list[dataset] = data.to_xarray() + +# Kxi_update: smoothed normalized kernel w.r.t. xi (anisotropic parameter) at the 7-th iteration +dataset = 'Kxi_update_inv_%s'%(Nstep) +data = ATTData.read(data_file, par_file, grid_file, group, dataset) +kernel_list[dataset] = data.to_xarray() + +# Keta_update: smoothed normalized kernel w.r.t. eta (anisotropic parameter) at the 7-th iteration +dataset = 'Keta_update_inv_%s'%(Nstep) +data = ATTData.read(data_file, par_file, grid_file, group, dataset) +kernel_list[dataset] = data.to_xarray() + +# %% +import os +try: + os.mkdir('img') +except: + pass + +# %% +# ---------------- access 3D array ---------------- +# we can access 3D dataset: + +dep_1d_array = kernel_list['Ks_inv_0007']["dep"] +lat_1d_array = kernel_list['Ks_inv_0007']["lat"] +lon_1d_array = kernel_list['Ks_inv_0007']["lon"] + +print("3D array of coordinates. \n dep: ", dep_1d_array.shape, " \n lat: ", lat_1d_array.shape, " \n lon: ", lon_1d_array.shape) + +array = kernel_list['Ks_inv_0007']["Ks_inv_0007"] + +print("3D array of kernel. \n Ks: ", array.shape) + +# %% +# ---------------- 2D depth profile of kernels ---------------- + +for dataset in kernel_list: + + # interp vel at depth = 20 km + depth = 20.0 + kernel = kernel_list[dataset].interp_dep(depth, field=dataset) # kernel[i,:] are (lon, lat, kernel) + + print("kernel at depth = ", depth, " km. kernel:", kernel.shape, ", (lon, lat, kernel)") + + # plot + fig = pygmt.Figure() + fig.basemap(region=[0,2,0,2], frame=["xa1","ya1","+t%s"%(dataset)], projection="M10c") # base map + pygmt.makecpt(cmap="jet", series=[-0.5, 0.5], background=True, reverse=True) # colorbar + + x = kernel[:,0]; # longitude + y = kernel[:,1]; # latitude + value = kernel[:,2]/np.nanmax(np.abs(kernel[:,2])) # traveltime + grid = pygmt.surface(x=x, y=y, z=value, spacing=0.04,region=[0,2,0,2]) + + fig.grdimage(grid = grid) # plot figure + fig.text(text="%d km"%(depth), x = 0.2 , y = 0.1, font = "14p,Helvetica-Bold,black", fill = "white") + + # colorbar + fig.shift_origin(xshift=0, yshift=-1.5) + fig.colorbar(frame = ["a0.5","y+l%s"%(dataset)], position="+e+w4c/0.3c+h") + + fig.savefig("img/3_dep_%s.png"%(dataset)) + +# %% +# ---------------- 2D vertical profile of kernels ---------------- + +for dataset in kernel_list: + + # interp from [0,0.6] in lon-lat to [2,0.6] in lon-lat, gap = 1 km + start = [0,0.6]; end = [2,0.6]; gap = 1 + kernel_sec = kernel_list[dataset].interp_sec(start, end, field=dataset, val = gap) # kernel_sec[i,:] are (lon, lat, dis, dep, kernel) + + print("kernel_sec:", kernel_sec.shape, ", (lon, lat, distance, depth, kernel)") + + # plot + fig = pygmt.Figure() + fig.basemap(region=[0,2,0,40], frame=["xa1+lLongitude","ya20+lDepth (km)","+t%s"%(dataset)], projection="X10c/-2c") # base map + pygmt.makecpt(cmap="jet", series=[-0.5, 0.5], background=True, reverse=True) # colorbar + + x = kernel_sec[:,0]; # longitude + y = kernel_sec[:,3]; # depth + value = kernel_sec[:,4]/np.nanmax(np.abs(kernel_sec[:,4])) # traveltime + grid = pygmt.surface(x=x, y=y, z=value, spacing="0.04/1",region=[0,2,0,40]) + + fig.grdimage(grid = grid) # plot figure + fig.text(text="A", x = 0.1 , y = 5, font = "14p,Helvetica-Bold,black", fill = "white") + fig.text(text="A@+'@+", x = 1.9 , y = 5, font = "14p,Helvetica-Bold,black", fill = "white") + + # colorbar + fig.shift_origin(xshift=0, yshift=-2) + fig.colorbar(frame = ["a0.5","y+l%s"%(dataset)], position="+e+w4c/0.3c+h") + + fig.savefig("img/3_sec_%s.png"%(dataset)) + + diff --git a/examples/scripts_of_plotting/4_plot_earthquake_station.py b/examples/scripts_of_plotting/4_plot_earthquake_station.py new file mode 100644 index 0000000..ba78905 --- /dev/null +++ b/examples/scripts_of_plotting/4_plot_earthquake_station.py @@ -0,0 +1,54 @@ +# %% +import pygmt +pygmt.config(FONT="16p", IO_SEGMENT_MARKER="<<<") + + +# %% +from pytomoatt.src_rec import SrcRec + +# read src_rec_file +sr = SrcRec.read("input_files/src_rec_file.dat") + +# get the coordinates of the stations and earthquakes +stations = sr.receivers[['stlo','stla','stel']].values.T +earthquakes = sr.sources[['evlo','evla','evdp']].values.T + +print(stations.shape) +print(earthquakes.shape) + +# %% +# plot earthquakes and locations + +fig = pygmt.Figure() + +pygmt.makecpt(cmap="jet", series=[0, 40], background=True, reverse=True) # colorbar + +# -------- horizontal view (x-y) -------- +fig.basemap(region=[0,2,0,2], frame=["xa1","ya1","NsWe"], projection="M10c") # base map +# earthquakes +fig.plot(x = earthquakes[0,:], y = earthquakes[1,:], cmap = True, style = "c0.1c", fill = earthquakes[2,:]) +# stations +fig.plot(x = stations[0,:], y = stations[1,:], style = "t0.4c", fill = "blue", pen = "black", label = "Station") + + +# -------- vertical view (x-z) -------- +fig.shift_origin(xshift=0, yshift=-3) +fig.basemap(region=[0,2,0,40], frame=["xa1","ya20+lDepth (km)","NsWe"], projection="X10c/-2c") # base map +# earthquakes +fig.plot(x = earthquakes[0,:], y = earthquakes[2,:], cmap = True, style = "c0.1c", fill = earthquakes[2,:]) + + +# -------- vertical view (z-y) -------- +fig.shift_origin(xshift=11, yshift=3) +fig.basemap(region=[0,40,0,2], frame=["xa20+lDepth (km)","ya1","NsWe"], projection="X2c/10c") # base map +# earthquakes +fig.plot(x = earthquakes[2,:], y = earthquakes[1,:], cmap = True, style = "c0.1c", fill = earthquakes[2,:]) + + +# colorbar +fig.shift_origin(xshift=0, yshift=-1.5) +fig.colorbar(frame = ["a20","x+lDepth (km)"], position="+e+w2c/0.3c+h") + +fig.savefig("img/4_earthquakes_and_stations.png") + + diff --git a/examples/scripts_of_plotting/5_plot_objective_function.py b/examples/scripts_of_plotting/5_plot_objective_function.py new file mode 100644 index 0000000..8ba2eb0 --- /dev/null +++ b/examples/scripts_of_plotting/5_plot_objective_function.py @@ -0,0 +1,124 @@ +# %% +import sys +sys.path.append('../utils') +import functions_for_data as ffd + +# %% +# read objective function + +path = "OUTPUT_FILES" +full_curve, location_curve, model_curve = ffd.read_objective_function_file(path) + +print("full_curve: ", full_curve.shape, ", the total objective function value during the inversion, including relocation and model update") +print("location_curve: ", location_curve.shape, ", the objective function value during the relocation step") +print("model_curve: ", model_curve.shape, ", the objective function value during the model update step") + +print("The first index is iteraion number, the second index is the objective function value vector") + + +# %% +# (Option 1) objective function value +full_obj = full_curve[:,0] +location_obj = location_curve[:,0] +model_obj = model_curve[:,0] + +# (Option 2) objective function value for only traveltime +full_obj_tt = full_curve[:,1] +location_obj_tt = location_curve[:,1] +model_obj_tt = model_curve[:,1] + +# (Option 3) objective function value for only common source differential arrival time +full_obj_cs = full_curve[:,2] +location_obj_cs = location_curve[:,2] +model_obj_cs = model_curve[:,2] + +# (Option 4) objective function value for only common receiver differential arrival time +full_obj_cr = full_curve[:,3] +location_obj_cr = location_curve[:,3] +model_obj_cr = model_curve[:,3] + +# (Option 5) objective function value for teleseismic differential arrival time +full_obj_tele = full_curve[:,4] +location_obj_tele = location_curve[:,4] +model_obj_tele = model_curve[:,4] + +# (Option 6) mean value of all data residual +full_mean = full_curve[:,5] +location_mean = location_curve[:,5] +model_mean = model_curve[:,5] + +# (Option 7) standard deviation of all data residual +full_std = full_curve[:,6] +location_std = location_curve[:,6] +model_std = model_curve[:,6] + +# (Option 8) mean value of residuals of traveltime +full_mean_tt = full_curve[:,7] +location_mean_tt = location_curve[:,7] +model_mean_tt = model_curve[:,7] + +# (Option 9) standard deviation of residuals of traveltime +full_std_tt = full_curve[:,8] +location_std_tt = location_curve[:,8] +model_std_tt = model_curve[:,8] + +# (Option 10) mean value of residuals of common source differential arrival time +full_mean_cs = full_curve[:,9] +location_mean_cs = location_curve[:,9] +model_mean_cs = model_curve[:,9] + +# (Option 11) standard deviation of residuals of common source differential arrival time +full_std_cs = full_curve[:,10] +location_std_cs = location_curve[:,10] +model_std_cs = model_curve[:,10] + +# (Option 12) mean value of residuals of common receiver differential arrival time +full_mean_cr = full_curve[:,11] +location_mean_cr = location_curve[:,11] +model_mean_cr = model_curve[:,11] + +# (Option 13) standard deviation of residuals of common receiver differential arrival time +full_std_cr = full_curve[:,12] +location_std_cr = location_curve[:,12] +model_std_cr = model_curve[:,12] + +# (Option 14) mean value of residuals of teleseismic differential arrival time +full_mean_tele = full_curve[:,13] +location_mean_tele = location_curve[:,13] +model_mean_tele = model_curve[:,13] + +# (Option 15) standard deviation of residuals of teleseismic differential arrival time +full_std_tele = full_curve[:,14] +location_std_tele = location_curve[:,14] +model_std_tele = model_curve[:,14] + + +# %% +import os +try: + os.mkdir("img") +except: + pass + +# %% +# plot objective functin reduction + +import matplotlib.pyplot as plt +import numpy as np + +plt.figure(figsize=(10, 6)) +ax = plt.subplot(1, 1, 1) + +ax.plot(model_obj/np.max(model_obj), label='objective function', linewidth=2) +ax.set_xlim([-0.2, len(model_obj)-0.8]) +ax.set_ylim([0, 1.1]) +ax.grid() +ax.set_xlabel('Iteration number',fontsize=14) +ax.set_ylabel('Normalized value',fontsize=14) +ax.tick_params(axis='x', labelsize=14) +ax.tick_params(axis='y', labelsize=14) +ax.legend(fontsize=14) + +plt.savefig('img/5_objective_function_reduction.png', dpi=300, bbox_inches='tight', edgecolor='w', facecolor='w') + + diff --git a/examples/scripts_of_plotting/6_plot_data_residual.py b/examples/scripts_of_plotting/6_plot_data_residual.py new file mode 100644 index 0000000..f8193ed --- /dev/null +++ b/examples/scripts_of_plotting/6_plot_data_residual.py @@ -0,0 +1,86 @@ +# %% +import sys +sys.path.append('../utils') +import functions_for_data as ffd + + +# %% +# synthetic and observational traveltime files in the initial and final models + +file_init_syn = "OUTPUT_FILES/src_rec_file_inv_0000_reloc_0000.dat" # synthetic traveltime in the initial model +file_init_obs = "input_files/src_rec_file.dat" # observational traveltime in the initial model + +file_final_syn = "OUTPUT_FILES/src_rec_file_inv_0009_reloc_0009.dat" # synthetic traveltime in the final model +file_final_obs = "OUTPUT_FILES/src_rec_file_inv_0009_reloc_0009_obs.dat" # observational traveltime in the final model + + +# %% +# from pytomoatt.src_rec import SrcRec +# init_syn = SrcRec.read(file_init_syn) +# init_obs = SrcRec.read(file_init_obs) + +# final_syn = SrcRec.read(file_final_syn) +# final_obs = SrcRec.read(file_final_obs) + +# %% +ev, st = ffd.read_src_rec_file(file_init_syn) +time_init_syn = ffd.data_dis_time(ev, st)[1] # synthetic traveltime in the initial model + +ev, st = ffd.read_src_rec_file(file_init_obs) +time_init_obs = ffd.data_dis_time(ev, st)[1] # observational traveltime in the initial model + +ev, st = ffd.read_src_rec_file(file_final_syn) +time_final_syn = ffd.data_dis_time(ev, st)[1] # synthetic traveltime in the final model + +ev, st = ffd.read_src_rec_file(file_final_obs) +time_final_obs = ffd.data_dis_time(ev, st)[1] # observational traveltime in the final model + +# %% +import os +try: + os.mkdir("img") +except: + pass + +# %% +import numpy as np +import matplotlib.pyplot as plt + +fig = plt.figure(figsize=(8,8)) +ax = fig.add_subplot(111) + +range_l = -1.5 +range_r = 1.5 +Nbar = 20 + +bins=np.linspace(range_l,range_r,Nbar) +error_init = time_init_syn - time_init_obs +error_final = time_final_syn - time_final_obs + +tag1 = "initial mode" +tag2 = "final mode" + +hist_init, _, _ = ax.hist(error_init,bins=bins,histtype='step', edgecolor = "red", linewidth = 2, + label = "%s: std = %5.3f s, mean = %5.3f s"%(tag1,np.std(error_init),np.mean(error_init))) + +hist_final, _, _ = ax.hist(error_final,bins=bins,alpha = 0.5, color = "blue", + label = "%s: std = %5.3f s, mean = %5.3f s"%(tag2,np.std(error_final),np.mean(error_final))) + +print("residual for ",tag1," model is: ","mean: ",np.mean(error_init),"sd: ",np.std(error_init)) +print("residual for ",tag2," model is: ","mean: ",np.mean(error_final),"sd: ",np.std(error_final)) +ax.legend(fontsize=14) + +ax.set_xlim(range_l - abs(range_l)*0.1,range_r + abs(range_r)*0.1) +ax.set_ylim(0,1.3*max(max(hist_init),max(hist_final))) + +ax.tick_params(axis='x',labelsize=18) +ax.tick_params(axis='y',labelsize=18) +ax.set_ylabel('Count of data',fontsize=18) +ax.set_xlabel('Traveltime residuals (s)',fontsize=18) +ax.set_title("$t_{syn} - t_{obs}$",fontsize=18) +ax.grid() + +plt.savefig("img/6_data_residual.png",dpi=300, bbox_inches='tight', edgecolor='w', facecolor='w' ) +plt.show() + + diff --git a/examples/scripts_of_plotting/7_plot_inversion_grid.py b/examples/scripts_of_plotting/7_plot_inversion_grid.py new file mode 100644 index 0000000..df3c589 --- /dev/null +++ b/examples/scripts_of_plotting/7_plot_inversion_grid.py @@ -0,0 +1,61 @@ +# %% +import pygmt +pygmt.config(FONT="16p", IO_SEGMENT_MARKER="<<<") + + +# %% +import sys +sys.path.append('../utils') +import functions_for_data as ffd + +# %% +# read inversion grid file + +inv_grid_vel, inv_grid_ani = ffd.read_inversion_grid_file("OUTPUT_FILES") + +print("inversion grid for velocity: ", inv_grid_vel.shape) +print("inversion grid for anisotropy: ", inv_grid_vel.shape) + +Nset = inv_grid_vel.shape[0] +Ngrid = inv_grid_vel.shape[1] + +colorlist = ["green","blue","red","purple","orange","yellow","black","gray","pink","cyan"] + +# %% +# plot earthquakes and locations + +fig = pygmt.Figure() + +pygmt.makecpt(cmap="jet", series=[0, 40], background=True, reverse=True) # colorbar + +# -------- horizontal view (x-y) -------- +fig.basemap(region=[0,2,0,2], frame=["xa1","ya1","NsWe"], projection="M10c") # base map +# plot inversion grid +for igrid in range(Nset): + x = inv_grid_vel[igrid,:,0] + y = inv_grid_vel[igrid,:,1] + fig.plot(x=x, y=y, style="c0.1c", fill=colorlist[igrid]) + +# -------- vertical view (x-z) -------- +fig.shift_origin(xshift=0, yshift=-3) +fig.basemap(region=[0,2,0,40], frame=["xa1","ya20+lDepth (km)","NsWe"], projection="X10c/-2c") # base map +# plot inversion grid +for igrid in range(Nset): + x = inv_grid_vel[igrid,:,0] + y = inv_grid_vel[igrid,:,2] + fig.plot(x=x, y=y, style="c0.1c", fill=colorlist[igrid]) + + +# -------- vertical view (z-y) -------- +fig.shift_origin(xshift=11, yshift=3) +fig.basemap(region=[0,40,0,2], frame=["xa20+lDepth (km)","ya1","NsWe"], projection="X2c/10c") # base map +# plot inversion grid +for igrid in range(Nset): + x = inv_grid_vel[igrid,:,2] + y = inv_grid_vel[igrid,:,1] + fig.plot(x=x, y=y, style="c0.1c", fill=colorlist[igrid]) + + +fig.savefig("img/7_inversion_grid.png") + + diff --git a/examples/scripts_of_plotting/README.md b/examples/scripts_of_plotting/README.md new file mode 100644 index 0000000..6ca9b8a --- /dev/null +++ b/examples/scripts_of_plotting/README.md @@ -0,0 +1,16 @@ +# Scripts of plotting + +It includes examples to illustrate the output file of TomoATT + + +Python modules are required to initiate the inversion and to plot final results: +- h5py +- PyTomoAT +- Pygmt +- gmt + +Run this example: + +1. Run bash script `bash run_this_example.sh` to execute the test. + + diff --git a/examples/scripts_of_plotting/prepare_files.py b/examples/scripts_of_plotting/prepare_files.py new file mode 100644 index 0000000..d6de7f2 --- /dev/null +++ b/examples/scripts_of_plotting/prepare_files.py @@ -0,0 +1,21 @@ +# %% +# download model file from Zenodo +import os +import requests + +url = 'https://zenodo.org/records/14160818/files/files_for_plotting.tar.gz?download=1' + +path = "files_for_plotting.tar.gz" + +# check file existence +if not os.path.exists(path): + print("Downloading src_rec_file.dat from Zenodo...") + print("The file is about 400 MB, so it may take a while.") + response = requests.get(url, stream=True) + with open(path, 'wb') as out_file: + out_file.write(response.content) + print("Download complete.") +else: + print("files_for_plotting.tar.gz already exists.") + + diff --git a/examples/scripts_of_plotting/run_this_example.sh b/examples/scripts_of_plotting/run_this_example.sh new file mode 100644 index 0000000..10ec932 --- /dev/null +++ b/examples/scripts_of_plotting/run_this_example.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +# Some script to plot figures for the output file of TomoATT + +python prepare_files.py # download the files for plotting +tar -xf files_for_plotting.tar.gz # extract the files + + +# Test 1: plot velocity perturbation and azimuthal anisotropy fields to generate +# img/1_dep_vel.png 2D velocity perturbation at 20 km depth +# img/1_dep_ani.png 2D azimuthal anisotropy at 20 km depth +# img/1_sec_vel.png 2D velocity perturbation along vertical section +python 1_plot_model.py + +# Test 2: plot traveltime and adjoint fields to generate +# img/2_dep_time.png 2D traveltime field at 20 km depth +# img/2_sec_time.png 2D traveltime field along vertical section +# img/2_dep_adjoint.png 2D adjoint field at XX depth +# img/2_sec_adjoint.png 2D adjoint field along vertical section +python 2_plot_time_field.py + +# Test 3: plot kernels to generate +# img/3_dep_Ks_inv_0007.png Ks: original kernel w.r.t slowness at 20 km depth +# img/3_dep_Ks_density_inv_0007.png Kden: kernel density w.r.t slowness at 20 km depth +# img/3_dep_Ks_over_Kden_inv_0007.png Ks/Kden^{\zeta}: normalized kernel w.r.t slowness at 20 km depth +# img/3_dep_Ks_update_inv_0007.png smoothed normalized kernel w.r.t slowness at 20 km depth +# img/3_sec_Ks_inv_0007.png Ks: original kernel w.r.t slowness along vertical section +# img/3_sec_Ks_density_inv_0007.png Kden: kernel density w.r.t slowness along vertical section +# img/3_sec_Ks_over_Kden_inv_0007.png Ks/Kden^{\zeta}: normalized kernel w.r.t slowness along vertical section +# img/3_sec_Ks_update_inv_0007.png smoothed normalized kernel w.r.t slowness along vertical section +# and the same for kernels w.r.t xi and eta (azimuthal anisotropy) +python 3_plot_kernel.py + +# Test 4: plot earthquakes and stations to generate +# img/4_earthquakes_and_stations.png the location of earthquakes and stations +python 4_plot_earthquake_station.py + +# Test 5: plot objective function reduction to generate +# img/5_objective_function_reduction.png the reduction of objective function value +python 5_plot_objective_function.py + +# Test 6: plot traveltime residuals to generate +# img/6_data_residual.png the traveltime residuals +python 6_plot_data_residual.py + +# Test 7: plot inversion grid to generate +# img/7_inversion_grid.png the inversion grid +python 7_plot_inversion_grid.py + + diff --git a/examples/src_rec_file_instruction.jpg b/examples/src_rec_file_instruction.jpg new file mode 100644 index 0000000..c6444f5 Binary files /dev/null and b/examples/src_rec_file_instruction.jpg differ diff --git a/examples/utils/functions_for_data.ipynb b/examples/utils/functions_for_data.ipynb new file mode 100644 index 0000000..f375dff --- /dev/null +++ b/examples/utils/functions_for_data.ipynb @@ -0,0 +1,2719 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Initialization, class definition, and declaration.\n", + "\n", + "import os\n", + "import math\n", + "from obspy import UTCDateTime\n", + "import numpy as np\n", + "import copy\n", + "\n", + "class Event(): # class of earthquake\n", + " def __init__(self):\n", + " self.name = \"nan\" # evname1 Earthquake name, recommended as \"earthquake\".\n", + " self.id = -1\n", + " self.lat = 0.0\n", + " self.lon = 0.0\n", + " self.dep = 0.0\n", + " self.mag = 0.0\n", + " self.ortime = UTCDateTime(1999,1,1,0,0,0)\n", + " self.Nt = 0 # Number of the absolute traveltime of earthquake\n", + " self.Ncs_dt = 0 # Number of the commmon source differential traveltime of earthquake\n", + " self.Ncr_dt = 0 # Number of the commmon receiver differential traveltime of earthquake\n", + " self.t = {} # stname1+phase -> (stname1, phase, time, data_weight)\n", + " self.cs_dt = {} # stname1 + stname2 + phase -> (stname1, stname2, phase, dif_time, data_weight)\n", + " self.cr_dt = {} # stname1 + evname2 + phase -> (stname1, evname2, phase, dif_time, data_weight)\n", + " self.azi_gap = 360.0 # the max azimuthal gap of each earthquake\n", + " self.misfit = {} # traveltime residual of the data, the difference between real data and synthetic data, used for evaluation. stname or stname1+stname2 or stname1+evname2 -> residual\n", + " self.tag = {} # additional tags for the earthquake, e.g., azi_gap, weight. (azimuthal gap, weight of the earthquake)\n", + "\n", + "class Station():\n", + " def __init__(self):\n", + " self.name = \"nan\" # stname1, recommend: network.stname\n", + " self.id = -1\n", + " self.lat = 0.0\n", + " self.lon = 0.0\n", + " self.ele = 0.0\n", + " self.tag = {} # additional tags for the station, e.g., wright\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Functions: some basic auxiliary functions for processing data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# function: cal_dis(lat1, lon1,lat2, lon2) (in kilometers), cal_azimuth(lat1, lon1, lat2, lon2) (degree) calculate epicentral distance (km) and azimuth (degree)\n", + "\n", + "def cal_dis(lat1, lon1,lat2, lon2, R = 6371):\n", + " latitude1 = (math.pi/180)*lat1\n", + " latitude2 = (math.pi/180)*lat2\n", + " longitude1 = (math.pi/180)*lon1\n", + " longitude2= (math.pi/180)*lon2\n", + " # Therefore, the spherical distance between points A and B is:{arccos[sinb*siny+cosb*cosy*cos(a-x)]}*R\n", + " # Radius of the earth\n", + " if((lat1-lat2)**2+(lon1-lon2)**2<0.000001):\n", + " return 0\n", + "\n", + " d = math.acos(math.sin(latitude1)*math.sin(latitude2)+ math.cos(latitude1)*math.cos(latitude2)*math.cos(longitude2-longitude1))/math.pi*180\n", + " return d * 2 * math.pi * R / 360\n", + "\n", + "def cal_azimuth(lat1, lon1, lat2, lon2):\n", + " lat1_rad = lat1 * math.pi / 180\n", + " lon1_rad = lon1 * math.pi / 180\n", + " lat2_rad = lat2 * math.pi / 180\n", + " lon2_rad = lon2 * math.pi / 180\n", + "\n", + " y = math.sin(lon2_rad - lon1_rad) * math.cos(lat2_rad)\n", + " x = math.cos(lat1_rad) * math.sin(lat2_rad) - math.sin(lat1_rad) * math.cos(lat2_rad) * math.cos(lon2_rad - lon1_rad)\n", + " brng = math.atan2(y, x) * 180 / math.pi\n", + " if((lat1-lat2)**2+(lon1-lon2)**2<0.0001):\n", + " return 0\n", + " return float((brng + 360.0) % 360.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: Coordinate rotation rotate_src_rec(ev_info, st_info, theta0, phi0, psi): rotate to the new coordinate system, satisfying the center point transformation r0, t0, p0 -> r0, 0, 0 and an anticlockwise rotation angle psi.\n", + "# Satisfying the center point transformation r0, t0, p0 -> r0, 0, 0 and an anticlockwise rotation angle psi.\n", + "\n", + "import numpy as np\n", + "\n", + "RAD2DEG = 180/np.pi\n", + "DEG2RAD = np.pi/180\n", + "R_earth = 6371.0\n", + "\n", + "# Spherical coordinates to Cartesian coordinate\n", + "def rtp2xyz(r,theta,phi):\n", + " x = r * np.cos(theta*DEG2RAD) * np.cos(phi*DEG2RAD)\n", + " y = r * np.cos(theta*DEG2RAD) * np.sin(phi*DEG2RAD)\n", + " z = r * np.sin(theta*DEG2RAD)\n", + " return (x,y,z)\n", + "\n", + "# Cartesian coordinates to Spherical coordinate\n", + "def xyz2rtp(x,y,z):\n", + " # theta: -90~90; phi: -180~180\n", + " r = np.sqrt(x**2+y**2+z**2)\n", + " theta = np.arcsin(z/r)\n", + " phi = np.arcsin(y/r/np.cos(theta))\n", + "\n", + "\n", + " idx = np.where((phi > 0) & (x*y < 0))\n", + " phi[idx] = np.pi - phi[idx]\n", + " idx = np.where((phi < 0) & (x*y > 0))\n", + " phi[idx] = -np.pi - phi[idx]\n", + "\n", + "\n", + " # for i in range(phi.size):\n", + " # if(phi[i] > 0 and x[i]*y[i] < 0):\n", + " # phi[i] = np.pi - phi[i]\n", + " # if(phi[i] < 0 and x[i]*y[i] > 0):\n", + " # phi[i] = -np.pi - phi[i]\n", + "\n", + " return (r,theta*RAD2DEG,phi*RAD2DEG)\n", + "\n", + "# anti-clockwise rotation along x-axis\n", + "def rotate_x(x,y,z,theta):\n", + " new_x = x\n", + " new_y = y * np.cos(theta*DEG2RAD) + z * -np.sin(theta*DEG2RAD)\n", + " new_z = y * np.sin(theta*DEG2RAD) + z * np.cos(theta*DEG2RAD)\n", + " return (new_x,new_y,new_z)\n", + "\n", + "# anti-clockwise rotation along y-axis\n", + "def rotate_y(x,y,z,theta):\n", + " new_x = x * np.cos(theta*DEG2RAD) + z * np.sin(theta*DEG2RAD)\n", + " new_y = y\n", + " new_z = x * -np.sin(theta*DEG2RAD) + z * np.cos(theta*DEG2RAD)\n", + " return (new_x,new_y,new_z)\n", + "\n", + "# anti-clockwise rotation along z-axis\n", + "def rotate_z(x,y,z,theta):\n", + " new_x = x * np.cos(theta*DEG2RAD) + y * -np.sin(theta*DEG2RAD)\n", + " new_y = x * np.sin(theta*DEG2RAD) + y * np.cos(theta*DEG2RAD)\n", + " new_z = z\n", + " return (new_x,new_y,new_z)\n", + "\n", + "# spherical Rotation\n", + "\n", + "# rotate to the new coordinate, satisfying the center r0,t0,p0 -> r0,0,0 and a anticlockwise angle psi\n", + "def rtp_rotation(t,p,theta0,phi0,psi):\n", + " # step 1: r,t,p -> x,y,z\n", + " (x,y,z) = rtp2xyz(1.0,t,p)\n", + "\n", + " # step 2: anti-clockwise rotation with -phi0 along z-axis: r0,t0,p0 -> r0,t0,0\n", + " (x,y,z) = rotate_z(x,y,z,-phi0)\n", + "\n", + " # step 3: anti-clockwise rotation with theta0 along y-axis: r0,t0,0 -> r0,0,0\n", + " (x,y,z) = rotate_y(x,y,z,theta0)\n", + "\n", + " # # step 4: anti-clockwise rotation with psi along x-axis\n", + " (x,y,z) = rotate_x(x,y,z,psi)\n", + "\n", + " # step 5: x,y,z -> r,t,p\n", + " (new_r,new_t,new_p) = xyz2rtp(x,y,z)\n", + "\n", + " return (new_t,new_p)\n", + "\n", + "\n", + "def rtp_rotation_reverse(new_t,new_p,theta0,phi0,psi):\n", + " # step 1: r,t,p -> x,y,z\n", + " (x,y,z) = rtp2xyz(1.0,new_t,new_p)\n", + "\n", + " # step 2: anti-clockwise rotation with -psi along x-axis\n", + " (x,y,z) = rotate_x(x,y,z,-psi)\n", + "\n", + " # step 3: anti-clockwise rotation with -theta0 along y-axis: r0,0,0 -> r0,t0,0\n", + " (x,y,z) = rotate_y(x,y,z,-theta0)\n", + "\n", + " # step 4: anti-clockwise rotation with phi0 along z-axis: r0,t0,0 -> r0,t0,p0\n", + " (x,y,z) = rotate_z(x,y,z,phi0)\n", + "\n", + " # step 5: x,y,z -> r,t,p\n", + " (r,t,p) = xyz2rtp(x,y,z)\n", + "\n", + " return (t,p)\n", + "\n", + "def rotate_src_rec(ev_info,st_info,theta0,phi0,psi):\n", + " ev_info_rotate = {}\n", + " st_info_rotate = {}\n", + "\n", + " # rotate earthquakes\n", + " for key_ev in ev_info:\n", + " ev = ev_info[key_ev]\n", + " ev_lat = np.array([ev.lat]); ev_lon = np.array([ev.lon])\n", + " (ev_lat,ev_lon,) = rtp_rotation(ev_lat,ev_lon,theta0,phi0,psi)\n", + " ev.lat = ev_lat[0]; ev.lon = ev_lon[0]\n", + " ev_info_rotate[key_ev] = ev\n", + "\n", + " # rotate stations\n", + " for key_st in st_info:\n", + " st = st_info[key_st]\n", + " st_lat = np.array([st.lat]); st_lon = np.array([st.lon])\n", + " (st_lat,st_lon) = rtp_rotation(st_lat,st_lon,theta0,phi0,psi)\n", + " st.lat = st_lat[0]; st.lon = st_lon[0]\n", + " st_info_rotate[key_st] = st\n", + "\n", + " return (ev_info_rotate,st_info_rotate)\n", + "\n", + "def rotate_src_rec_reverse(ev_info_rotate,st_info_rotate,theta0,phi0,psi):\n", + " ev_info = {}\n", + " st_info = {}\n", + "\n", + " # rotate earthquakes\n", + " for key_ev in ev_info_rotate:\n", + " ev = ev_info_rotate[key_ev]\n", + " ev_lat = np.array([ev.lat]); ev_lon = np.array([ev.lon])\n", + " (ev_lat,ev_lon,) = rtp_rotation_reverse(ev_lat,ev_lon,theta0,phi0,psi)\n", + " ev.lat = ev_lat[0]; ev.lon = ev_lon[0]\n", + " ev_info[key_ev] = ev\n", + "\n", + " # rotate stations\n", + " for key_st in st_info_rotate:\n", + " st = st_info_rotate[key_st]\n", + " st_lat = np.array([st.lat]); st_lon = np.array([st.lon])\n", + " (st_lat,st_lon) = rtp_rotation_reverse(st_lat,st_lon,theta0,phi0,psi)\n", + " st.lat = st_lat[0]; st.lon = st_lon[0]\n", + " st_info[key_st] = st\n", + "\n", + " return (ev_info,st_info)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# # Function: Coordinate rotation rotate_src_rec(ev_info, st_info, theta0, phi0, psi): rotate to the new coordinate system, satisfying the center point transformation r0, t0, p0 -> r0, 0, 0 and an anticlockwise rotation angle psi.\n", + "# # Satisfying the center point transformation r0, t0, p0 -> r0, 0, 0 and an anticlockwise rotation angle psi.\n", + "\n", + "# import numpy as np\n", + "\n", + "# RAD2DEG = 180/np.pi\n", + "# DEG2RAD = np.pi/180\n", + "# R_earth = 6371.0\n", + "\n", + "# # Spherical coordinates to Cartesian coordinate\n", + "# def rtp2xyz(r,theta,phi):\n", + "# x = r * np.cos(theta*DEG2RAD) * np.cos(phi*DEG2RAD)\n", + "# y = r * np.cos(theta*DEG2RAD) * np.sin(phi*DEG2RAD)\n", + "# z = r * np.sin(theta*DEG2RAD)\n", + "# return (x,y,z)\n", + "\n", + "# # Cartesian coordinates to Spherical coordinate\n", + "# def xyz2rtp(x,y,z):\n", + "# # theta: -90~90; phi: -180~180\n", + "# r = np.sqrt(x**2+y**2+z**2)\n", + "# theta = np.arcsin(z/r)\n", + "# phi = np.arcsin(y/r/np.cos(theta))\n", + "\n", + "\n", + "# if(phi > 0 and x*y < 0):\n", + "# phi = np.pi - phi\n", + "# if(phi < 0 and x*y > 0):\n", + "# phi = -np.pi - phi\n", + "\n", + "# return (r,theta*RAD2DEG,phi*RAD2DEG)\n", + "\n", + "# # anti-clockwise rotation along x-axis\n", + "# def rotate_x(x,y,z,theta):\n", + "# new_x = x\n", + "# new_y = y * np.cos(theta*DEG2RAD) + z * -np.sin(theta*DEG2RAD)\n", + "# new_z = y * np.sin(theta*DEG2RAD) + z * np.cos(theta*DEG2RAD)\n", + "# return (new_x,new_y,new_z)\n", + "\n", + "# # anti-clockwise rotation along y-axis\n", + "# def rotate_y(x,y,z,theta):\n", + "# new_x = x * np.cos(theta*DEG2RAD) + z * np.sin(theta*DEG2RAD)\n", + "# new_y = y\n", + "# new_z = x * -np.sin(theta*DEG2RAD) + z * np.cos(theta*DEG2RAD)\n", + "# return (new_x,new_y,new_z)\n", + "\n", + "# # anti-clockwise rotation along z-axis\n", + "# def rotate_z(x,y,z,theta):\n", + "# new_x = x * np.cos(theta*DEG2RAD) + y * -np.sin(theta*DEG2RAD)\n", + "# new_y = x * np.sin(theta*DEG2RAD) + y * np.cos(theta*DEG2RAD)\n", + "# new_z = z\n", + "# return (new_x,new_y,new_z)\n", + "\n", + "# # spherical Rotation\n", + "\n", + "# # rotate to the new coordinate, satisfying the center r0,t0,p0 -> r0,0,0 and a anticlockwise angle psi\n", + "# def rtp_rotation(t,p,theta0,phi0,psi):\n", + "# # step 1: r,t,p -> x,y,z\n", + "# (x,y,z) = rtp2xyz(1.0,t,p)\n", + "\n", + "# # step 2: anti-clockwise rotation with -phi0 along z-axis: r0,t0,p0 -> r0,t0,0\n", + "# (x,y,z) = rotate_z(x,y,z,-phi0)\n", + "\n", + "# # step 3: anti-clockwise rotation with theta0 along y-axis: r0,t0,0 -> r0,0,0\n", + "# (x,y,z) = rotate_y(x,y,z,theta0)\n", + "\n", + "# # # step 4: anti-clockwise rotation with psi along x-axis\n", + "# (x,y,z) = rotate_x(x,y,z,psi)\n", + "\n", + "# # step 5: x,y,z -> r,t,p\n", + "# (new_r,new_t,new_p) = xyz2rtp(x,y,z)\n", + "\n", + "# return (new_t,new_p)\n", + "\n", + "\n", + "# def rtp_rotation_reverse(new_t,new_p,theta0,phi0,psi):\n", + "# # step 1: r,t,p -> x,y,z\n", + "# (x,y,z) = rtp2xyz(1.0,new_t,new_p)\n", + "\n", + "# # step 2: anti-clockwise rotation with -psi along x-axis\n", + "# (x,y,z) = rotate_x(x,y,z,-psi)\n", + "\n", + "# # step 3: anti-clockwise rotation with -theta0 along y-axis: r0,0,0 -> r0,t0,0\n", + "# (x,y,z) = rotate_y(x,y,z,-theta0)\n", + "\n", + "# # step 4: anti-clockwise rotation with phi0 along z-axis: r0,t0,0 -> r0,t0,p0\n", + "# (x,y,z) = rotate_z(x,y,z,phi0)\n", + "\n", + "# # step 5: x,y,z -> r,t,p\n", + "# (r,t,p) = xyz2rtp(x,y,z)\n", + "\n", + "# return (t,p)\n", + "\n", + "# def rotate_src_rec(ev_info,st_info,theta0,phi0,psi):\n", + "# ev_info_rotate = {}\n", + "# st_info_rotate = {}\n", + "\n", + "# # rotate earthquakes\n", + "# for key_ev in ev_info:\n", + "# ev = ev_info[key_ev]\n", + "# (ev.lat,ev.lon,) = rtp_rotation(ev.lat,ev.lon,theta0,phi0,psi)\n", + "# ev_info_rotate[key_ev] = ev\n", + "\n", + "# # rotate stations\n", + "# for key_st in st_info:\n", + "# st = st_info[key_st]\n", + "# (st.lat,st.lon) = rtp_rotation(st.lat,st.lon,theta0,phi0,psi)\n", + "# st_info_rotate[key_st] = st\n", + "\n", + "# return (ev_info_rotate,st_info_rotate)\n", + "\n", + "# def rotate_src_rec_reverse(ev_info_rotate,st_info_rotate,theta0,phi0,psi):\n", + "# ev_info = {}\n", + "# st_info = {}\n", + "\n", + "# # rotate earthquakes\n", + "# for key_ev in ev_info_rotate:\n", + "# ev = ev_info_rotate[key_ev]\n", + "# (ev.lat,ev.lon) = rtp_rotation_reverse(ev.lat,ev.lon,theta0,phi0,psi)\n", + "# ev_info[key_ev] = ev\n", + "\n", + "# # rotate stations\n", + "# for key_st in st_info_rotate:\n", + "# st = st_info_rotate[key_st]\n", + "# (st.lat,st.lon) = rtp_rotation_reverse(st.lat,st.lon,theta0,phi0,psi)\n", + "# st_info[key_st] = st\n", + "\n", + "# return (ev_info,st_info)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# linear_regression(X,Y)\n", + "def linear_regression(X,Y):\n", + " slope,intercept = np.polyfit(X,Y,deg=1)\n", + " fitted_values = slope * X + intercept\n", + " residual = Y - fitted_values\n", + " SEE = np.std(residual)\n", + " return (slope,intercept,SEE)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Functions: obtain target information from ev_info and st_info" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# function: output the [lon,lat,dep,weight] of the earthquake\n", + "def data_lon_lat_dep_wt_ev(ev_info):\n", + " lat = []\n", + " lon = []\n", + " dep = []\n", + " weight = []\n", + " for key in ev_info:\n", + " lat.append(ev_info[key].lat)\n", + " lon.append(ev_info[key].lon)\n", + " dep.append(ev_info[key].dep)\n", + " try:\n", + " weight.append(ev_info[key].tag[\"weight\"])\n", + " except:\n", + " weight.append(1.0)\n", + " return [np.array(lon),np.array(lat),np.array(dep),np.array(weight)]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# function: output the [lon, lat, dep, ortime] of the earthquake\n", + "def data_ev_loc(ev_info):\n", + " lat = []\n", + " lon = []\n", + " dep = []\n", + " ortime = []\n", + " for key in ev_info:\n", + " lat.append(ev_info[key].lat)\n", + " lon.append(ev_info[key].lon)\n", + " dep.append(ev_info[key].dep)\n", + " ortime.append(ev_info[key].ortime.timestamp)\n", + " return [np.array(lon),np.array(lat),np.array(dep),np.array(ortime)]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# function: output the [lon,lat,dep,weight] of the station\n", + "def data_lon_lat_ele_wt_st(ev_info,st_info):\n", + " names = {}\n", + " lat = []\n", + " lon = []\n", + " ele = []\n", + " weight = []\n", + " for key_ev in ev_info:\n", + " for key_t in ev_info[key_ev].t: # absolute traveltime data\n", + " name_st = ev_info[key_ev].t[key_t][0]\n", + " names[name_st] = name_st\n", + "\n", + " for key_t in ev_info[key_ev].cs_dt: # common source differential traveltime data\n", + " name_st = ev_info[key_ev].cs_dt[key_t][0]\n", + " names[name_st] = name_st\n", + " name_st = ev_info[key_ev].cs_dt[key_t][1]\n", + " names[name_st] = name_st\n", + "\n", + " for key_t in ev_info[key_ev].cr_dt: # common receiver differential traveltime data\n", + " name_st = ev_info[key_ev].cr_dt[key_t][0]\n", + " names[name_st] = name_st\n", + "\n", + " for name in names: # only output the station which has data\n", + " lat.append(st_info[name].lat)\n", + " lon.append(st_info[name].lon)\n", + " ele.append(st_info[name].ele)\n", + " try:\n", + " weight.append(st_info[name].tag[\"weight\"])\n", + " except:\n", + " weight.append(1.0)\n", + " return [np.array(lon),np.array(lat),np.array(ele),np.array(weight)]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# function: output the [dis,time] of all data\n", + "def data_dis_time(ev_info,st_info):\n", + " all_dis = []\n", + " all_time = []\n", + " for key_ev in ev_info:\n", + " lat_ev = ev_info[key_ev].lat\n", + " lon_ev = ev_info[key_ev].lon\n", + " dep_ev = ev_info[key_ev].dep\n", + " for key_t in ev_info[key_ev].t:\n", + " all_time.append(ev_info[key_ev].t[key_t][2])\n", + " lat_st = st_info[ev_info[key_ev].t[key_t][0]].lat\n", + " lon_st = st_info[ev_info[key_ev].t[key_t][0]].lon\n", + " ele_st = st_info[ev_info[key_ev].t[key_t][0]].ele\n", + " dis = math.sqrt(cal_dis(lat_ev,lon_ev,lat_st,lon_st)**2 + (dep_ev+ele_st/1000)**2)\n", + " all_dis.append(dis)\n", + "\n", + " return [np.array(all_dis),np.array(all_time)]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# function: output the [epidis,time] of all data\n", + "def data_epidis_time(ev_info,st_info):\n", + " all_dis = []\n", + " all_time = []\n", + " for key_ev in ev_info:\n", + " lat_ev = ev_info[key_ev].lat\n", + " lon_ev = ev_info[key_ev].lon\n", + " for key_t in ev_info[key_ev].t:\n", + " all_time.append(ev_info[key_ev].t[key_t][2])\n", + " lat_st = st_info[ev_info[key_ev].t[key_t][0]].lat\n", + " lon_st = st_info[ev_info[key_ev].t[key_t][0]].lon\n", + " dis = cal_dis(lat_ev,lon_ev,lat_st,lon_st)**2\n", + " all_dis.append(dis)\n", + "\n", + " return [np.array(all_dis),np.array(all_time)]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# function: output the [cs_dt] of all data\n", + "def data_cs_dt(ev_info):\n", + " all_time = []\n", + " for key_ev in ev_info:\n", + " for key_dt in ev_info[key_ev].cs_dt:\n", + " all_time.append(ev_info[key_ev].cs_dt[key_dt][3])\n", + "\n", + " return np.array(all_time)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: data_dis_time_phase(ev_info, st_info, phase_list) Given a list of seismic phases, output the [epicentral distance, arrival time] for each phase.\n", + "def data_dis_time_phase(ev_info,st_info,phase_list):\n", + " all_dis = {}\n", + " all_time = {}\n", + " for phase in phase_list:\n", + " all_dis[phase] = []\n", + " all_time[phase] = []\n", + "\n", + " for key_ev in ev_info:\n", + " lat_ev = ev_info[key_ev].lat\n", + " lon_ev = ev_info[key_ev].lon\n", + " dep_ev = ev_info[key_ev].dep\n", + " for key_t in ev_info[key_ev].t:\n", + " phase = key_t.split(\"+\")[1]\n", + " if (not phase in phase_list):\n", + " continue\n", + "\n", + " all_time[phase].append(ev_info[key_ev].t[key_t][2])\n", + " lat_st = st_info[ev_info[key_ev].t[key_t][0]].lat\n", + " lon_st = st_info[ev_info[key_ev].t[key_t][0]].lon\n", + " ele_st = st_info[ev_info[key_ev].t[key_t][0]].ele\n", + "\n", + " dis = math.sqrt(cal_dis(lat_ev,lon_ev,lat_st,lon_st)**2 + (dep_ev+ele_st/1000)**2)\n", + " all_dis[phase].append(dis)\n", + "\n", + " for phase in phase_list:\n", + " all_dis[phase] = np.array(all_dis[phase])\n", + " all_time[phase] = np.array(all_time[phase])\n", + "\n", + " return [all_dis,all_time]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: data_lon_lat_dep_wt_ev(ev_info) Outputs the lines connecting station and earthquake for traveltime data as [line_x, line_y].\n", + "\n", + "def data_line(ev_info,st_info):\n", + " line_x = []\n", + " line_y = []\n", + "\n", + " for key_ev in ev_info:\n", + " lat_ev = ev_info[key_ev].lat\n", + " lon_ev = ev_info[key_ev].lon\n", + " for key_t in ev_info[key_ev].t:\n", + " lat_st = st_info[ev_info[key_ev].t[key_t][0]].lat\n", + " lon_st = st_info[ev_info[key_ev].t[key_t][0]].lon\n", + "\n", + " line_x.append([lon_ev,lon_st])\n", + " line_y.append([lat_ev,lat_st])\n", + "\n", + " return [line_x,line_y]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Functions: discard some data in ev_info and st_info based on selection criteria" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: limit_ev_region(ev_info, lat1, lat2, lon1, lon2, dep1, dep2) Delete the earthquakes that are out of the specified region.\n", + "\n", + "def limit_ev_region(ev_info,lat_min,lat_max,lon_min,lon_max,dep_min,dep_max):\n", + " count_delete = 0\n", + "\n", + " del_key_ev = []\n", + " for key_ev in ev_info:\n", + " ev = ev_info[key_ev]\n", + " lat = ev.lat\n", + " lon = ev.lon\n", + " dep = ev.dep\n", + "\n", + " if (lat < min(lat_min,lat_max) or lat > max(lat_min,lat_max) \\\n", + " or lon < min(lon_min,lon_max) or lon > max(lon_min,lon_max) \\\n", + " or dep < min(dep_min,dep_max) or dep > max(dep_min,dep_max)):\n", + " del_key_ev.append(key_ev)\n", + " count_delete += 1\n", + "\n", + " del_key_t = []\n", + " for key_t in ev_info[key_ev].cr_dt:\n", + " name_ev2 = ev_info[key_ev].cr_dt[key_t][1]\n", + " lat2 = ev_info[name_ev2].lat\n", + " lon2 = ev_info[name_ev2].lon\n", + " dep2 = ev_info[name_ev2].dep\n", + " if (lat2 < min(lat_min,lat_max) or lat2 > max(lat_min,lat_max) \\\n", + " or lon2 < min(lon_min,lon_max) or lon2 > max(lon_min,lon_max) \\\n", + " or dep2 < min(dep_min,dep_max) or dep2 > max(dep_min,dep_max)):\n", + "\n", + " del_key_t.append(key_t)\n", + "\n", + " for key_t in del_key_t:\n", + " del ev_info[key_ev].cr_dt[key_t]\n", + "\n", + " ev_info[key_ev].Ncr_dt = len(ev_info[key_ev].cr_dt)\n", + "\n", + " for key_ev in del_key_ev:\n", + " del ev_info[key_ev]\n", + "\n", + " print(\"delete %d events out of the region, now %d earthquakes are retained within the study region\"%(count_delete,len(ev_info)))\n", + " return ev_info" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: limit_st_region(ev_info, st_info, lat1, lat2, lon1, lon2) Delete the stations that are out of the specified region.\n", + "\n", + "def limit_st_region(ev_info,st_info,lat1,lat2,lon1,lon2):\n", + "\n", + " for key_ev in ev_info:\n", + " # delete the station out of the region in the absolute traveltime data\n", + " del_key_t = []\n", + " for key_t in ev_info[key_ev].t:\n", + " name_st = ev_info[key_ev].t[key_t][0]\n", + " lat_st = st_info[name_st].lat\n", + " lon_st = st_info[name_st].lon\n", + " if(lat_st < min(lat1,lat2) or lat_st > max(lat1,lat2) or lon_st < min(lon1,lon2) or lon_st > max(lon1,lon2)):\n", + " del_key_t.append(key_t)\n", + "\n", + " for key_t in del_key_t:\n", + " del ev_info[key_ev].t[key_t]\n", + " ev_info[key_ev].Nt = len(ev_info[key_ev].t)\n", + "\n", + " # delete the station out of the region in the common source differential traveltime data\n", + " del_key_t = []\n", + " for key_t in ev_info[key_ev].cs_dt:\n", + " name_st1 = ev_info[key_ev].cs_dt[key_t][0]\n", + " lat_st1 = st_info[name_st1].lat\n", + " lon_st1 = st_info[name_st1].lon\n", + "\n", + " name_st2 = ev_info[key_ev].cs_dt[key_t][1]\n", + " lat_st2 = st_info[name_st2].lat\n", + " lon_st2 = st_info[name_st2].lon\n", + " if(lat_st1 < min(lat1,lat2) or lat_st1 > max(lat1,lat2) or lon_st1 < min(lon1,lon2) or lon_st1 > max(lon1,lon2) \\\n", + " or lat_st2 < min(lat1,lat2) or lat_st2 > max(lat1,lat2) or lon_st2 < min(lon1,lon2) or lon_st2 > max(lon1,lon2)):\n", + " del_key_t.append(key_t)\n", + "\n", + " for key_t in del_key_t:\n", + " del ev_info[key_ev].cs_dt[key_t]\n", + " ev_info[key_ev].Ncs_dt = len(ev_info[key_ev].cs_dt)\n", + "\n", + " # delete the station out of the region in the common receiver differential traveltime data\n", + " del_key_st = []\n", + " for key_t in ev_info[key_ev].cr_dt:\n", + " name_st = ev_info[key_ev].cr_dt[key_t][0]\n", + " lat_st = st_info[name_st].lat\n", + " lon_st = st_info[name_st].lon\n", + " if(lat_st < min(lat1,lat2) or lat_st > max(lat1,lat2) or lon_st < min(lon1,lon2) or lon_st > max(lon1,lon2)):\n", + " del_key_st.append(key_t)\n", + "\n", + " for key_t in del_key_st:\n", + " del ev_info[key_ev].cr_dt[key_t]\n", + " ev_info[key_ev].Ncr_dt = len(ev_info[key_ev].cr_dt)\n", + "\n", + " return ev_info\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: limit_epi_dis(ev_info, st_info, epi_dis1, epi_dis2) Delete the stations with epicentral distance in the range from epi_dis1 to epi_dis2.\n", + "\n", + "def limit_epi_dis(ev_info,st_info,epi_dis1,epi_dis2):\n", + "\n", + " for key_ev in ev_info:\n", + " ev = ev_info[key_ev]\n", + "\n", + " lat_ev = ev.lat\n", + " lon_ev = ev.lon\n", + "\n", + " # delete the absolute traveltime data\n", + " del_key_t = []\n", + " for key_t in ev.t:\n", + " stname = ev.t[key_t][0]\n", + " lat_st = st_info[stname].lat\n", + " lon_st = st_info[stname].lon\n", + " dis = cal_dis(lat_ev, lon_ev, lat_st, lon_st)\n", + " if (dis > epi_dis1 and dis < epi_dis2):\n", + " del_key_t.append(key_t)\n", + " for key_t in del_key_t:\n", + " del ev.t[key_t]\n", + " ev.Nt = len(ev.t)\n", + "\n", + " # delete the common source differential traveltime data\n", + " del_key_t = []\n", + " for key_t in ev.cs_dt:\n", + " for i in range(2):\n", + " stname = ev.t[key_t][i]\n", + " lat_st = st_info[stname].lat\n", + " lon_st = st_info[stname].lon\n", + " dis = cal_dis(lat_ev, lon_ev, lat_st, lon_st)\n", + "\n", + " if (dis > epi_dis1 and dis < epi_dis2):\n", + " del_key_t.append(key_t)\n", + " break\n", + " for key_t in del_key_t:\n", + " del ev.cs_dt[key_t]\n", + " ev.Ncs_dt = len(ev.cs_dt)\n", + "\n", + " # delete the common receiver differential traveltime data\n", + " del_key_t = []\n", + " for key_t in ev.cr_dt:\n", + " stname = ev.cr_dt[key_t][0]\n", + " lat_st = st_info[stname].lat\n", + " lon_st = st_info[stname].lon\n", + " dis = cal_dis(lat_ev, lon_ev, lat_st, lon_st)\n", + " if (dis > epi_dis1 and dis < epi_dis2):\n", + " del_key_t.append(key_t)\n", + "\n", + " lat_ev2 = ev_info[ev.cr_dt[key_t][1]].lat\n", + " lon_ev2 = ev_info[ev.cr_dt[key_t][1]].lon\n", + " dis = cal_dis(lat_ev2, lon_ev2, lat_st, lon_st)\n", + " if (dis > epi_dis1 and dis < epi_dis2):\n", + " del_key_t.append(key_t)\n", + "\n", + " for key_t in del_key_t:\n", + " del ev.cr_dt[key_t]\n", + " ev.Ncr_dt = len(ev.cr_dt)\n", + "\n", + "\n", + " ev_info[key_ev] = ev\n", + "\n", + " return ev_info" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: limit_data_residual(ev_info, st_info, slope, intercept, up, down) Limit the data within the range defined by the line time = dis * slope + intercept and the bounds up and down.\n", + "\n", + "# remove outliers, only retain data satisfying: slope * dis + intercept + down < time < slope * dis + intercept + up\n", + "def limit_data_residual(ev_info,st_info,slope,intercept,up,down):\n", + " for key_ev in ev_info:\n", + " lat_ev = ev_info[key_ev].lat\n", + " lon_ev = ev_info[key_ev].lon\n", + " dep_ev = ev_info[key_ev].dep\n", + " del_key_t = []\n", + " for key_t in ev_info[key_ev].t:\n", + " name_st = ev_info[key_ev].t[key_t][0]\n", + " lat_st = st_info[name_st].lat\n", + " lon_st = st_info[name_st].lon\n", + " ele_st = st_info[name_st].ele\n", + " dis = math.sqrt(cal_dis(lat_ev,lon_ev,lat_st,lon_st)**2 + (dep_ev+ele_st/1000)**2)\n", + " residual = ev_info[key_ev].t[key_t][2] - (slope*dis+intercept)\n", + "\n", + " if (residual < down or residual > up):\n", + " del_key_t.append(key_t)\n", + "\n", + " for key_t in del_key_t:\n", + " del ev_info[key_ev].t[key_t]\n", + "\n", + " for key_ev in ev_info:\n", + " ev_info[key_ev].Nt = len(ev_info[key_ev].t)\n", + "\n", + " return ev_info\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: limit_data_phase(ev_info, phase_list) Retain only the specified seismic phases.\n", + "\n", + "def limit_data_phase(ev_info,phase_list):\n", + " for key_ev in ev_info:\n", + " # process the absolute traveltime data\n", + " new_t = {}\n", + " for key_t in ev_info[key_ev].t:\n", + " phase = ev_info[key_ev].t[key_t][1]\n", + " if phase in phase_list:\n", + " new_t[key_t] = ev_info[key_ev].t[key_t]\n", + "\n", + " ev_info[key_ev].t = new_t\n", + " ev_info[key_ev].Nt = len(ev_info[key_ev].t)\n", + "\n", + " # process the common source differential traveltime data\n", + " new_t = {}\n", + " for key_t in ev_info[key_ev].cs_dt:\n", + " phase = ev_info[key_ev].cs_dt[key_t][2]\n", + " phase = phase.split(\",\")[0]\n", + " if phase in phase_list:\n", + " new_t[key_t] = ev_info[key_ev].cs_dt[key_t]\n", + "\n", + " ev_info[key_ev].cs_dt = new_t\n", + " ev_info[key_ev].Ncs_dt = len(ev_info[key_ev].cs_dt)\n", + "\n", + " # process the common receiver differential traveltime data\n", + " new_t = {}\n", + " for key_t in ev_info[key_ev].cr_dt:\n", + " phase = ev_info[key_ev].cr_dt[key_t][2]\n", + " phase = phase.split(\",\")[0]\n", + " if phase in phase_list:\n", + " new_t[key_t] = ev_info[key_ev].cr_dt[key_t]\n", + "\n", + " ev_info[key_ev].cr_dt = new_t\n", + " ev_info[key_ev].Ncr_dt = len(ev_info[key_ev].cr_dt)\n", + "\n", + " return ev_info" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: limit_min_Nt(min_Nt_thd, ev_info) Delete the earthquakes with the number of data less than min_Nt_thd.\n", + "\n", + "def limit_min_Nt(min_Nt_thd, ev_info):\n", + " Nev = len(ev_info)\n", + "\n", + " del_key_ev = []\n", + " for key_ev in ev_info:\n", + " if(ev_info[key_ev].Nt < min_Nt_thd):\n", + " del_key_ev.append(key_ev)\n", + "\n", + " for key_ev in del_key_ev:\n", + " del ev_info[key_ev]\n", + "\n", + " print(\"Original data set has %d earthquakes, %d earthquakes are deleted, %d earthquakes are retained\"%(Nev,len(del_key_ev),len(ev_info)))\n", + "\n", + " return ev_info" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: limit_azi_gap(gap_thd) Calculate the azimuthal gap for all events and delete events with a gap greater than gap_thd.\n", + "def limit_azi_gap(gap_thd,ev_info,st_info):\n", + " Nev = len(ev_info)\n", + "\n", + " del_key_ev = []\n", + " for key_ev in ev_info:\n", + " ev = ev_info[key_ev]\n", + " gap = cal_azi_gap(ev,st_info)\n", + " if (gap > gap_thd):\n", + " del_key_ev.append(key_ev)\n", + " else:\n", + " ev_info[key_ev].tag[\"azi_gap\"] = gap\n", + " for key_ev in del_key_ev:\n", + " del ev_info[key_ev]\n", + "\n", + " print(\"Original data set has %d earthquakes, %d earthquakes are deleted, %d earthquakes are retained\"%(Nev,len(del_key_ev),len(ev_info)))\n", + "\n", + " return ev_info\n", + "\n", + "# Function: cal_azi_gap(ev, st_info) Calculate the azimuthal gap of a single earthquake.\n", + "def cal_azi_gap(ev,st_info):\n", + " azi_all = []\n", + " lat_ev = ev.lat\n", + " lon_ev = ev.lon\n", + " stlist = {}\n", + " for key in ev.t:\n", + " stname = ev.t[key][0]\n", + " if (not stname in stlist):\n", + " lat_st = st_info[stname].lat\n", + " lon_st = st_info[stname].lon\n", + " azi = cal_azimuth(lat_ev, lon_ev, lat_st, lon_st)\n", + " azi_all.append(azi)\n", + " stlist[stname] = 1\n", + "\n", + " azi_all.sort()\n", + " if(len(azi_all) < 2):\n", + " return 360.0\n", + " else:\n", + " gap = 0.0\n", + " for i in range(len(azi_all)-1):\n", + " gap = max(gap,azi_all[i+1] - azi_all[i])\n", + " gap = max(gap,azi_all[0] + 360 - azi_all[-1])\n", + " return gap\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: limit_earthquake_decluster_Nt(ev_info, dlat, dlon, ddep, Top_N) Divide the region into several subdomains, sort by the number of arrival times, and retain only the top Top_N earthquakes with the most arrival times in each box.\n", + "# option 3, declustering. Divide the region into several subdomains, retain the Top N earthquakes in terms of the number of arrival times in each subdomain.\n", + "def limit_earthquake_decluster_Nt(ev_info,dlat,dlon,ddep,Top_N):\n", + " # subdivide earthquakes into different subdomains\n", + " [ev_info,tag2name] = tag_event_cluster(dlat,dlon,ddep,ev_info)\n", + "\n", + " # sort earthquakes in the same subdomain\n", + " # Sort the quality of earthquakes within each tag based on the number of arrivals.\n", + " tag2name = sort_cluster_Nt(ev_info, tag2name)\n", + "\n", + " # only retain Top_N earthquakes in each subdomain\n", + " # Within each tag, prioritize selecting the top Top_N earthquakes.\n", + " [ev_info,tag2name] = limit_decluster(ev_info, tag2name,Top_N)\n", + "\n", + " return ev_info\n", + "\n", + "\n", + "\n", + "# Function: tag_event_cluster(size_lat, size_lon, size_dep, ev_info) Subdivide the study area, assign each earthquake to a subregion, and place it in a tag.\n", + "def tag_event_cluster(size_lat,size_lon,size_dep,ev_info):\n", + " tag2name = {}\n", + " for key_ev in ev_info:\n", + " name = ev_info[key_ev].name\n", + " lat = ev_info[key_ev].lat\n", + " lon = ev_info[key_ev].lon\n", + " dep = ev_info[key_ev].dep\n", + " tag = \"%d_%d_%d\"%(math.floor(lon/size_lon),math.floor(lat/size_lat),math.floor(dep/size_dep))\n", + " ev_info[key_ev].tag[\"cluster\"] = tag\n", + "\n", + " if (tag in tag2name):\n", + " tag2name[tag].append(name)\n", + " else:\n", + " tag2name[tag] = []\n", + " tag2name[tag].append(name)\n", + "\n", + " return [ev_info,tag2name]\n", + "\n", + "# Function: sort_cluster_Nt(ev_info, tag2name) Sort the quality of earthquakes within each tag based on the number of arrivals.\n", + "def sort_cluster_Nt(ev_info, tag2name):\n", + " for key_tag in tag2name:\n", + " names_ev = tag2name[key_tag]\n", + " Nt = []\n", + " for key_ev in names_ev:\n", + " Nt.append(len(ev_info[key_ev].t))\n", + "\n", + " # Sort the earthquakes within each tag based on the number of arrivals.\n", + " sorted_Nt = sorted(enumerate(Nt), key=lambda x: x[1], reverse=True)\n", + " tag2name[key_tag] = []\n", + " for index, Nt in sorted_Nt:\n", + " tag2name[key_tag].append(names_ev[index])\n", + "\n", + " return tag2name\n", + "\n", + "# Function: limit_cluster(ev_info, tag2name, Max) Prioritize selecting the top Max earthquakes within each tag.\n", + "def limit_decluster(ev_info, tag2name, Max):\n", + " del_key_ev = []\n", + " for key_tag in tag2name:\n", + " names_ev = tag2name[key_tag]\n", + "\n", + " if(len(names_ev) > Max):\n", + " tag2name[key_tag] = names_ev[0:Max]\n", + " for i in range(Max,len(names_ev)): # Delete earthquakes that exceed the threshold in the sorted list.\n", + " del_key_ev.append(names_ev[i])\n", + "\n", + " for key_ev in del_key_ev:\n", + " del ev_info[key_ev]\n", + "\n", + " return [ev_info,tag2name]\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Functions: assign weights to earthquakes, stations, and data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: box_weighting_ev(ev_info, dlat, dlon, ddep) Assign box-weight to the earthquakes.\n", + "def box_weighting_ev(ev_info,dlon,dlat,ddep):\n", + "\n", + " # categorization\n", + " distribute = {}\n", + " all_tag_wt = {}\n", + "\n", + " for key_ev in ev_info:\n", + " lat_id = math.floor((ev_info[key_ev].lat) / dlat)\n", + " lon_id = math.floor((ev_info[key_ev].lon) / dlon)\n", + " dep_id = math.floor((ev_info[key_ev].dep) / ddep)\n", + "\n", + " tag = '%d_%d_%d'%(lat_id,lon_id,dep_id)\n", + " if (tag in distribute):\n", + " distribute[tag] += 1\n", + " else:\n", + " distribute[tag] = 1\n", + "\n", + " max_weight = 0\n", + " for tag in distribute:\n", + " all_tag_wt[tag] = 1.0/math.sqrt(distribute[tag])\n", + " max_weight = max(max_weight,all_tag_wt[tag])\n", + "\n", + " for key_ev in ev_info:\n", + " lat_id = math.floor((ev_info[key_ev].lat) / dlat)\n", + " lon_id = math.floor((ev_info[key_ev].lon) / dlon)\n", + " dep_id = math.floor((ev_info[key_ev].dep) / ddep)\n", + "\n", + " tag = '%d_%d_%d'%(lat_id,lon_id,dep_id)\n", + "\n", + " ev_info[key_ev].tag[\"weight\"] = all_tag_wt[tag]/max_weight\n", + "\n", + " return ev_info" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: geographical_weighting_ev_rough(ev_info, dlat, dlon, ddep) Assign geographical weighting to the earthquakes roughly.\n", + "def geographical_weighting_ev_rough(ev_info,dlat,dlon,ddep,coefficient = 0.5):\n", + "\n", + " # categorization\n", + " distribute = {}\n", + " all_tag_wt = {}\n", + "\n", + " for key_ev in ev_info:\n", + " lat_id = int(ev_info[key_ev].lat/dlat)\n", + " lon_id = int(ev_info[key_ev].lon/dlat)\n", + " dep_id = int(ev_info[key_ev].dep/ddep)\n", + "\n", + "\n", + " tag = '%d_%d_%d'%(lat_id,lon_id,dep_id)\n", + " if (tag in distribute):\n", + " distribute[tag] += 1\n", + " else:\n", + " distribute[tag] = 1\n", + "\n", + " # Calculate the weight of each category.\n", + " delta0 = 0\n", + " for tag1 in distribute:\n", + " tmp1 = tag1.split('_')\n", + " # evlat1 = float(tmp1[0])*dlat; evlon1 = float(tmp1[1])*dlon; evdep1 = float(tmp1[2])*ddep\n", + "\n", + " for tag2 in distribute:\n", + " tmp2 = tag2.split('_')\n", + " # evlat2 = float(tmp2[0])*dlat; evlon2 = float(tmp2[1])*dlon; evdep2 = float(tmp2[2])*ddep\n", + "\n", + " # distance of id\n", + " delta_tp = math.sqrt((int(tmp1[0]) - int(tmp2[0]))**2 + (int(tmp1[1]) - int(tmp2[1]))**2 + (int(tmp1[2]) - int(tmp2[2]))**2)\n", + " delta0 = delta0 + distribute[tag1] * distribute[tag2] * delta_tp\n", + "\n", + " delta0 = delta0/(len(ev_info)**2) * coefficient\n", + "\n", + " max_weight = 0.0\n", + " for tag1 in distribute:\n", + " tmp1 = tag1.split('_')\n", + " # evlat1 = float(tmp1[0])*dlat; evlon1 = float(tmp1[1])*dlon; evdep1 = float(tmp1[2])*ddep\n", + "\n", + " weight = 0\n", + " for tag2 in distribute:\n", + " tmp2 = tag2.split('_')\n", + " # evlat2 = float(tmp2[0])*dlat; evlon2 = float(tmp2[1])*dlon; evdep2 = float(tmp2[2])*ddep\n", + "\n", + " delta_tp = math.sqrt((int(tmp1[0]) - int(tmp2[0]))**2 + (int(tmp1[1]) - int(tmp2[1]))**2 + (int(tmp1[2]) - int(tmp2[2]))**2)\n", + " weight = weight + math.exp(-(delta_tp/delta0)**2) * distribute[tag2]\n", + "\n", + " all_tag_wt[tag1] = (1.0/weight)\n", + " max_weight = max(max_weight,1.0/weight)\n", + "\n", + " # Assign weights to each earthquake based on its tag.\n", + " for key_ev in ev_info:\n", + " lat_id = int(ev_info[key_ev].lat/dlat)\n", + " lon_id = int(ev_info[key_ev].lon/dlon)\n", + " dep_id = int(ev_info[key_ev].dep/ddep)\n", + "\n", + " tag = '%d_%d_%d'%(lat_id,lon_id,dep_id)\n", + "\n", + " ev_info[key_ev].tag[\"weight\"] = all_tag_wt[tag]/max_weight\n", + " return ev_info\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: box_weighting_st(ev_info, st_info, dlat, dlon) Assign geographical weighting to the stations roughly.\n", + "def box_weighting_st(ev_info,st_info,dlon,dlat):\n", + "\n", + " [lon_ev,lat_ev,dep_ev,wt_ev] = data_lon_lat_dep_wt_ev(ev_info)\n", + "\n", + " # Integrate all involved stations.\n", + " wt_st = {}\n", + " name_st = {}\n", + " for key_ev in ev_info:\n", + " for key_t in ev_info[key_ev].t:\n", + " name_rec = ev_info[key_ev].t[key_t][0]\n", + " wt_st[name_rec] = -1.0\n", + " name_st[name_rec] = 1\n", + "\n", + " # categorization\n", + " distribute = {}\n", + " all_tag_wt = {}\n", + "\n", + " # Count the number of stations in each subdomain.\n", + " for key_st in name_st:\n", + " lat_id = math.floor((st_info[key_st].lat) / dlat)\n", + " lon_id = math.floor((st_info[key_st].lon) / dlon)\n", + "\n", + " tag = '%d_%d'%(lat_id,lon_id)\n", + " if (tag in distribute):\n", + " distribute[tag] += 1\n", + " else:\n", + " distribute[tag] = 1\n", + "\n", + " max_weight = 0\n", + " for tag in distribute:\n", + " all_tag_wt[tag] = 1.0/math.sqrt(distribute[tag])\n", + " max_weight = max(max_weight,all_tag_wt[tag])\n", + "\n", + " # Assign weights to each station based on its tag.\n", + " for key_st in name_st:\n", + " lat_id = math.floor((st_info[key_st].lat) / dlat)\n", + " lon_id = math.floor((st_info[key_st].lon) / dlon)\n", + " tag = '%d_%d'%(lat_id,lon_id)\n", + " wt_st[key_st] = all_tag_wt[tag]/max_weight\n", + "\n", + " # modify weight tag in st_info\n", + " for key_t in wt_st:\n", + " st_info[key_t].tag[\"weight\"] = wt_st[key_t]\n", + "\n", + " # modify weight of abs data ev_info\n", + " for key_ev in ev_info:\n", + " for key_t in ev_info[key_ev].t:\n", + " name_rec = ev_info[key_ev].t[key_t][0]\n", + " ev_info[key_ev].t[key_t][3] = wt_st[name_rec]\n", + "\n", + " return [ev_info,st_info]\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: geographical_weighting_st(ev_info,st_info) Assign geographical weighting to the stations roughly.\n", + "def geographical_weighting_st(ev_info,st_info,coefficient = 0.5):\n", + "\n", + " # Integrate all involved stations.\n", + " wt_st = {}\n", + " name_st = {}\n", + " for key_ev in ev_info:\n", + " for key_t in ev_info[key_ev].t:\n", + " name_rec = ev_info[key_ev].t[key_t][0]\n", + " wt_st[name_rec] = -1.0\n", + " name_st[name_rec] = 1\n", + "\n", + " # Calculate the weight of each station.\n", + " delta0 = 0\n", + " for key_st1 in name_st:\n", + " stlat1 = st_info[key_st1].lat\n", + " stlon1 = st_info[key_st1].lon\n", + "\n", + " for key_st2 in name_st:\n", + " stlat2 = st_info[key_st2].lat\n", + " stlon2 = st_info[key_st2].lon\n", + "\n", + " delta_tp = cal_dis(stlat1,stlon1,stlat2,stlon2)\n", + " delta0 = delta0 + delta_tp\n", + "\n", + " delta0 = delta0/(len(wt_st)**2)*coefficient\n", + "\n", + " max_weight = 0.0\n", + " for key_st1 in name_st:\n", + " stlat1 = st_info[key_st1].lat\n", + " stlon1 = st_info[key_st1].lon\n", + "\n", + " weight = 0\n", + " for key_st2 in name_st:\n", + " stlat2 = st_info[key_st2].lat\n", + " stlon2 = st_info[key_st2].lon\n", + "\n", + " delta_tp = cal_dis(stlat1,stlon1,stlat2,stlon2)\n", + " weight = weight + math.exp(-(delta_tp/delta0)**2)\n", + "\n", + " wt_st[key_st1] = (1.0/weight)\n", + " max_weight = max(max_weight,1.0/weight)\n", + "\n", + " for key_st1 in wt_st:\n", + " wt_st[key_st1] = wt_st[key_st1]/max_weight\n", + "\n", + " # Add weight to each data point in the earthquakes.\n", + " for key_ev in ev_info:\n", + " for key_t in ev_info[key_ev].t:\n", + " name_rec = ev_info[key_ev].t[key_t][0]\n", + " if (not name_rec in wt_st):\n", + " ValueError(\"The station of the data is not in the calculation list\")\n", + "\n", + " if (len(ev_info[key_ev].t[key_t])==3):\n", + " ev_info[key_ev].t[key_t].append(wt_st[name_rec])\n", + " elif (len(ev_info[key_ev].t[key_t])==4):\n", + " ev_info[key_ev].t[key_t][3] = wt_st[name_rec]\n", + " else:\n", + " ValueError(\"Error in the weight information of the absolute traveltime data\")\n", + "\n", + " # modify weight tag in st_info\n", + " for key_t in wt_st:\n", + " st_info[key_t].tag[\"weight\"] = wt_st[key_t]\n", + "\n", + " # modify weight of abs data ev_info\n", + " for key_ev in ev_info:\n", + " for key_t in ev_info[key_ev].t:\n", + " name_rec = ev_info[key_ev].t[key_t][0]\n", + " ev_info[key_ev].t[key_t][3] = wt_st[name_rec]\n", + "\n", + " return [ev_info,st_info]\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Function: add noise into data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function:assign_gaussian_noise():\n", + "def assign_gaussian_noise(ev_info,sigma):\n", + "\n", + " # Record which seismic phases correspond to each station.\n", + " st2phase = {} # Station name -> [Keys of absolute arrival time data related to this station]\n", + "\n", + "\n", + " for key_ev in ev_info:\n", + " # Absolute arrival time noise\n", + " for key_t in ev_info[key_ev].t:\n", + " stname = ev_info[key_ev].t[key_t][0]\n", + " ev_info[key_ev].t[key_t][2] = ev_info[key_ev].t[key_t][2] + np.random.normal(0,sigma)\n", + " if(stname in st2phase):\n", + " st2phase[stname].append(key_t)\n", + " else:\n", + " st2phase[stname] = [key_t]\n", + "\n", + " for key_ev in ev_info:\n", + " # Double-difference arrival time noise\n", + " for key_dt in ev_info[key_ev].cs_dt:\n", + " stname1 = ev_info[key_ev].cs_dt[key_dt][0]\n", + " stname2 = ev_info[key_ev].cs_dt[key_dt][1]\n", + " t1 = -999\n", + " t2 = -999\n", + " # Search for the arrival time of the data.\n", + " if (stname1 in st2phase):\n", + " for key_t in st2phase[stname1]:\n", + " if (key_t in ev_info[key_ev].t):\n", + " t1 = ev_info[key_ev].t[key_t][2]\n", + " break\n", + " if (stname2 in st2phase):\n", + " for key_t in st2phase[stname2]:\n", + " if (key_t in ev_info[key_ev].t):\n", + " t2 = ev_info[key_ev].t[key_t][2]\n", + " break\n", + "\n", + " if (t1 == -999 or t2 == -999):\n", + " # If there is no absolute arrival time data, the double-difference data residuals increase by a factor of sqrt(2) in noise.\n", + " ev_info[key_ev].cs_dt[key_dt][3] = ev_info[key_ev].cs_dt[key_dt][3] + np.random.normal(0,sigma*np.sqrt(2))\n", + " print('no data: ', key_ev, key_dt)\n", + " else:\n", + " # If there is absolute arrival time data, the double-difference data is obtained by subtraction.\n", + " ev_info[key_ev].cs_dt[key_dt][3] = t1 - t2\n", + "\n", + " # Common station double-difference arrival time\n", + " for key_dt in ev_info[key_ev].cr_dt:\n", + " stname = ev_info[key_ev].cr_dt[key_dt][0]\n", + " key_ev2 = ev_info[key_ev].cr_dt[key_dt][1]\n", + "\n", + " t1 = -999\n", + " t2 = -999\n", + " # Search for the arrival time of the data.\n", + " if (stname in st2phase):\n", + " for key_t in st2phase[stname]:\n", + " if (key_t in ev_info[key_ev].t):\n", + " t1 = ev_info[key_ev].t[key_t][2]\n", + " break\n", + " else:\n", + " print('not found 1: ', key_ev, key_t)\n", + "\n", + " for key_t in st2phase[stname]:\n", + " if (key_t in ev_info[key_ev2].t):\n", + " t2 = ev_info[key_ev2].t[key_t][2]\n", + " break\n", + " else:\n", + " print('not found 2: ', key_ev, key_t)\n", + "\n", + " if (t1 == -999 or t2 == -999):\n", + " # If there is no absolute arrival time data, the double-difference data residuals increase by a factor of sqrt(2) in noise.\n", + " ev_info[key_ev].cr_dt[key_dt][3] = ev_info[key_ev].cr_dt[key_dt][3] + np.random.normal(0,sigma*np.sqrt(2))\n", + " print('no data: ', key_ev, key_dt)\n", + " else:\n", + " # If there is absolute arrival time data, the double-difference data is obtained by subtraction.\n", + " ev_info[key_ev].cr_dt[key_dt][3] = t1 - t2\n", + "\n", + " return ev_info" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function:assign_uniform_noise_to_ev():\n", + "def assign_uniform_noise_to_ev(ev_info, range_lat, range_lon, range_dep, range_time):\n", + "\n", + " # Loop through all earthquakes and assign noise to them.\n", + " ev_noise = {} # Name of the earthquake -> noise of [lat,lon,dep,ortime]\n", + " # loop list of earthquakes\n", + " for key_ev in ev_info:\n", + " evname = key_ev\n", + " if (evname in ev_noise):\n", + " print(\"error: repeated earthquake name\")\n", + " exit()\n", + " else:\n", + " # generate noise\n", + " ev_noise[evname] = np.random.uniform(-1,1,4) * np.array([range_lat,range_lon,range_dep,range_time])\n", + "\n", + " # Add noise to each data point.\n", + " for key_ev in ev_info:\n", + "\n", + " # Absolute arrival time noise\n", + " for key_t in ev_info[key_ev].t:\n", + "\n", + " ev_info[key_ev].t[key_t][2] = ev_info[key_ev].t[key_t][2] - ev_noise[key_ev][3]\n", + "\n", + "\n", + " # Double-difference arrival time noise (double-difference arrival time remains unchanged)\n", + "\n", + " # Common station double-difference arrival time\n", + " for key_dt in ev_info[key_ev].cr_dt:\n", + " key_ev2 = ev_info[key_ev].cr_dt[key_dt][1]\n", + "\n", + " if (key_ev2 in ev_noise):\n", + " ev_info[key_ev].cr_dt[key_dt][3] = ev_info[key_ev].cr_dt[key_dt][3] - ev_noise[key_ev][3] + ev_noise[key_ev2][3]\n", + " else:\n", + " print(\"earthquake %s is not included in ev_list\"%(key_ev2))\n", + " ev_noise[key_ev2] = np.random.uniform(-1,1,4) * np.array([range_lat,range_lon,range_dep,range_time])\n", + " ev_info[key_ev].cr_dt[key_dt][3] = ev_info[key_ev].cr_dt[key_dt][3] - ev_noise[key_ev][3] + ev_noise[key_ev2][3]\n", + "\n", + "\n", + " # Add noise to each earthquake.\n", + " for key_ev in ev_noise:\n", + " ev_info[key_ev].lat = ev_info[key_ev].lat + ev_noise[key_ev][0]\n", + " ev_info[key_ev].lon = ev_info[key_ev].lon + ev_noise[key_ev][1]\n", + " ev_info[key_ev].dep = abs(ev_info[key_ev].dep + ev_noise[key_ev][2])\n", + " ev_info[key_ev].ortime = ev_info[key_ev].ortime + ev_noise[key_ev][3]\n", + "\n", + "\n", + " return ev_info" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Functions: generate differential traveltime" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: generate_cs_dif(ev_info, st_info, dis_thd, azi_thd) Generate double-difference arrival times from absolute arrival times, with inter-station distance less than dis_thd and azimuthal difference less than azi_thd.\n", + "# function: generate common source differential traveltime data from absolute traveltime data, the stations separation is less than dis_thd, the azimuth difference is less than azi_thd\n", + "def generate_cs_dif(ev_info,st_info,dis_thd,azi_thd):\n", + " count_t = 0\n", + " count_cs_dt = 0\n", + "\n", + " for key_ev in ev_info:\n", + " ev = ev_info[key_ev]\n", + "\n", + " lat_ev = ev.lat\n", + " lon_ev = ev.lon\n", + "\n", + " # traverse all arrival times\n", + " name_st_list = [] # names of stations\n", + " t_list = [] # traveltime\n", + " wt_list = [] # weight\n", + " for key_t in ev.t:\n", + " name_st_list.append(ev.t[key_t][0])\n", + " t_list.append(ev.t[key_t][2])\n", + " wt_list.append(ev.t[key_t][3])\n", + " count_t += 1\n", + "\n", + " # search for possible double-difference arrival times\n", + " for id_st1 in range(len(name_st_list)-1):\n", + " name_st1 = name_st_list[id_st1]\n", + " lat_st1 = st_info[name_st1].lat\n", + " lon_st1 = st_info[name_st1].lon\n", + " t_st1 = t_list[id_st1]\n", + " wt_st1 = wt_list[id_st1]\n", + "\n", + " for id_st2 in range(id_st1+1,len(name_st_list)):\n", + " name_st2 = name_st_list[id_st2]\n", + " lat_st2 = st_info[name_st2].lat\n", + " lon_st2 = st_info[name_st2].lon\n", + " t_st2 = t_list[id_st2]\n", + " wt_st2 = wt_list[id_st2]\n", + "\n", + " dis = cal_dis(lat_st1,lon_st1,lat_st2,lon_st2)\n", + " azi_st1 = cal_azimuth(lat_ev,lon_ev,lat_st1,lon_st1)\n", + " azi_st2 = cal_azimuth(lat_ev,lon_ev,lat_st2,lon_st2)\n", + "\n", + " azi_dif = abs(azi_st1 - azi_st2)\n", + "\n", + " if(dis < dis_thd and (azi_dif < azi_thd or (360-azi_dif) < azi_thd )):\n", + " ev.cs_dt[\"%s+%s+%s\"%(name_st1,name_st2,\"P,cs\")] = [name_st1,name_st2,\"P,cs\",t_st1-t_st2,(wt_st1+wt_st2)/2]\n", + " count_cs_dt += 1\n", + "\n", + " ev_info[key_ev].Ncs_dt = len(ev.cs_dt)\n", + "\n", + " print('we generate %d common source differential traveltimes from %s absolute traveltimes'%(count_cs_dt,count_t))\n", + " return ev_info\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: generate_cr_dif(ev_info, st_info, dis_thd) Generate common station double-difference arrival times from absolute arrival times, with inter-event distance less than dis_thd.\n", + "# Function: generate common receiver differential traveltime data from absolute traveltime data, the earthquake separation is less than dis_thd\n", + "def generate_cr_dif(ev_info,st_info,dis_thd,azi_thd):\n", + "\n", + " # Construct mapping:rec2src[name_ev] -> {name_st: [name_ev, name_st, t, wt]; name_st: [name_ev, name_st, t, wt]; ...}\n", + " rec2src = build_rec_src_map(ev_info,dis_thd)\n", + " print(\"rec to src map generation finished\")\n", + "\n", + " # Construct double-difference data association mapping:rec2src_pair[key_t]\n", + " rec2src_pair = build_rec_src_pair_map(rec2src)\n", + " print(\"rec to src_pair map generation finished\")\n", + "\n", + " for key_t in rec2src_pair:\n", + " name_st = key_t.split('+')[0]\n", + " lat_st = st_info[name_st].lat\n", + " lon_st = st_info[name_st].lon\n", + "\n", + " for ev_tag in rec2src_pair[key_t]:\n", + " name_ev1 = rec2src_pair[key_t][ev_tag][0]\n", + " lat_ev1 = ev_info[name_ev1].lat\n", + " lon_ev1 = ev_info[name_ev1].lon\n", + " dep_ev1 = ev_info[name_ev1].dep\n", + "\n", + " name_ev2 = rec2src_pair[key_t][ev_tag][1]\n", + " lat_ev2 = ev_info[name_ev2].lat\n", + " lon_ev2 = ev_info[name_ev2].lon\n", + " dep_ev2 = ev_info[name_ev2].dep\n", + "\n", + " dis_xy = cal_dis(lat_ev1,lon_ev1,lat_ev2,lon_ev2)\n", + " dis_z = abs(dep_ev1 - dep_ev2)\n", + " dis = math.sqrt(dis_xy**2 + dis_z**2)\n", + " if(dis > dis_thd): # limit of the distance between two earthquakes\n", + " continue\n", + "\n", + " azi1 = cal_azimuth(lat_ev1,lon_ev1,lat_st,lon_st)\n", + " azi2 = cal_azimuth(lat_ev2,lon_ev2,lat_st,lon_st)\n", + " azi_dif = abs(azi1 - azi2)\n", + "\n", + " if(azi_dif > azi_thd and (360-azi_dif) > azi_thd): # limit of the azimuth difference between two earthquakes\n", + " continue\n", + "\n", + " t_ev1 = ev_info[name_ev1].t[key_t][2]\n", + " t_ev2 = ev_info[name_ev2].t[key_t][2]\n", + " wt_ev1 = ev_info[name_ev1].t[key_t][3] * ev_info[name_ev1].tag[\"weight\"]\n", + " wt_ev2 = ev_info[name_ev2].t[key_t][3] * ev_info[name_ev2].tag[\"weight\"]\n", + " # The actual data weight is wt_ev1 + wt_ev2, but in TomoATT calculations, we need to divide it by ev_info[name_ev1].tag[\"weight\"].\n", + " wt = (wt_ev1 + wt_ev2)/2/ev_info[name_ev1].tag[\"weight\"]\n", + "\n", + " ev_info[name_ev1].cr_dt[\"%s+%s+%s\"%(name_st,name_ev2,\"P,cr\")] = [name_st,name_ev2,\"P,cr\",t_ev1-t_ev2,wt]\n", + "\n", + " # Count the number of double-difference data points.\n", + " count_cr_dt = 0\n", + " count_t = 0\n", + " for key_ev in ev_info:\n", + " ev_info[key_ev].Ncr_dt = len(ev_info[key_ev].cr_dt)\n", + " count_cr_dt += ev_info[key_ev].Ncr_dt\n", + " count_t += ev_info[key_ev].Nt\n", + "\n", + " print('we generate %d common receiver differential traveltimes from %s absolute traveltimes'%(count_cr_dt,count_t))\n", + "\n", + " return ev_info\n", + "\n", + "# Construct mapping: rec2src = {key_t: dict_tag; key_t: dict_tag; ...}\n", + "# dict_tag = {tag: list_name_ev; tag: list_name_ev; ...}\n", + "# list_name_ev = [name_ev1, name_ev2, ...]\n", + "# Assign earthquakes to different subregions based on their locations. The subregion size is dlat * dlon * ddep. When performing common station double-difference calculations, only earthquake pairs within the same subregion or adjacent subregions will be considered.\n", + "def build_rec_src_map(ev_info,dis_thd):\n", + " rec2src = {}\n", + " for key_ev in ev_info:\n", + " name_ev = ev_info[key_ev].name\n", + " lat = ev_info[key_ev].lat\n", + " lon = ev_info[key_ev].lon\n", + " dep = ev_info[key_ev].dep\n", + " tag_dep = math.floor(dep/dis_thd)\n", + " tag_lat = math.floor(lat/180*math.pi*R_earth/dis_thd)\n", + " tag_lon = math.floor(lon/180*math.pi*R_earth*math.cos(lat)/dis_thd)\n", + " tag = \"%d_%d_%d\"%(tag_lon,tag_lat,tag_dep)\n", + "\n", + "\n", + " for key_t in ev_info[key_ev].t:\n", + "\n", + " # create dictionary\n", + " if (not key_t in rec2src):\n", + " rec2src[key_t] = {tag:[]}\n", + " elif (not tag in rec2src[key_t]):\n", + " rec2src[key_t][tag] = []\n", + "\n", + " # Add data\n", + " rec2src[key_t][tag].append(name_ev)\n", + "\n", + " return rec2src\n", + "\n", + "# Function: generate_adjacent_tag(tag) Generate tags surrounding the given tag.\n", + "def generate_adjacent_tag(tag): # Excluding the tag itself.\n", + " adjacent_tag_list = []\n", + " tmp = tag.split('_')\n", + " tag_lon = int(tmp[0])\n", + " tag_lat = int(tmp[1])\n", + " tag_dep = int(tmp[2])\n", + "\n", + " for i in range(-1,2):\n", + " for j in range(-1,2):\n", + " for k in range(-1,2):\n", + " if(i == 0 and j == 0 and k == 0):\n", + " continue\n", + " adjacent_tag_list.append(\"%d_%d_%d\"%(tag_lon+i,tag_lat+j,tag_dep+k))\n", + "\n", + " return adjacent_tag_list\n", + "\n", + "\n", + "# construct mapping:rec2src_pair\n", + "def build_rec_src_pair_map(rec2src):\n", + " rec2src_pair = {}\n", + "\n", + " for key_t in rec2src:\n", + " rec2src_pair[key_t] = {}\n", + "\n", + " for tag in rec2src[key_t]:\n", + " name_ev_list1 = rec2src[key_t][tag]\n", + "\n", + " name_ev_list2 = rec2src[key_t][tag]\n", + " adjacent_tag_list = generate_adjacent_tag(tag)\n", + " for adjacent_tag in adjacent_tag_list:\n", + " if (adjacent_tag in rec2src[key_t]): # If the surrounding tag's region has earthquakes, add them to the earthquake list.\n", + " name_ev_list2 = name_ev_list2 + rec2src[key_t][adjacent_tag]\n", + "\n", + " # Find possible earthquake pairs.\n", + " for id_ev1 in range(len(name_ev_list1)-1):\n", + " name_ev1 = name_ev_list1[id_ev1]\n", + "\n", + " for id_ev2 in range(id_ev1+1,len(name_ev_list2)): # Starting from id_ev1 + 1 already excludes duplicate earthquakes within the tag.\n", + " name_ev2 = name_ev_list2[id_ev2]\n", + "\n", + " ev_tag1 = \"%s+%s\"%(name_ev1,name_ev2)\n", + " ev_tag2 = \"%s+%s\"%(name_ev2,name_ev1)\n", + "\n", + " if(ev_tag1 in rec2src_pair[key_t] or ev_tag2 in rec2src_pair[key_t]):\n", + " continue\n", + "\n", + " rec2src_pair[key_t][ev_tag1] = [name_ev1,name_ev2]\n", + "\n", + "\n", + " return rec2src_pair" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Functions: read and write src_rec.dat file" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: reorder_src(ev) Reorder the earthquake IDs. If the earthquake has no data, the ID is -999.\n", + "def reorder_src(ev_info):\n", + "\n", + " ev_id = 0\n", + " for key_ev in ev_info:\n", + " ev = ev_info[key_ev]\n", + "\n", + " if(ev.Nt + ev.Ncs_dt + ev.Ncr_dt == 0):\n", + " ev.id = -999\n", + " else:\n", + " ev_info[key_ev].id = ev_id\n", + " ev_id += 1\n", + "\n", + " return ev_info\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: read_src_rec_file(fname) Read the src_rec.dat file.\n", + "#\n", + "def read_src_rec_file(fname):\n", + " ev_info = {}\n", + " st_info = {}\n", + "\n", + " tmp_ev_info = {}\n", + "\n", + " doc = open(fname,'r')\n", + " doc_input = doc.readlines()\n", + " doc.close()\n", + "\n", + " cc = 0\n", + " for info in doc_input:\n", + " tmp=info.split()\n", + " if (cc == 0): # event line\n", + " ev = Event()\n", + " # 1 2000 1 2 20 28 37.270 38.2843 39.0241 11.00 3.60 8 1725385\n", + " # id_ev = int(tmp[0])\n", + " ev.id = int(tmp[0])\n", + " year = int(tmp[1])\n", + " month = int(tmp[2])\n", + " day = int(tmp[3])\n", + " hour = int(tmp[4])\n", + " minute = int(tmp[5])\n", + " second = float(tmp[6])\n", + " ev.ortime = UTCDateTime(year,month,day,hour,minute,0) + second\n", + " ev.lat = float(tmp[7])\n", + " ev.lon = float(tmp[8])\n", + " ev.dep = float(tmp[9])\n", + " ev.mag = float(tmp[10])\n", + " ev.Nt = 0\n", + " ev.Ncs_dt = 0\n", + " ev.Ncr_dt = 0\n", + " ev.t = {}\n", + " ev.cs_dt = {}\n", + " ev.cr_dt = {}\n", + " ndata = int(tmp[11])\n", + " name_ev = tmp[12]\n", + " ev.name = name_ev\n", + " cc += 1\n", + " try:\n", + " ev.tag[\"weight\"] = float(tmp[13])\n", + " except:\n", + " pass\n", + "\n", + " if (ndata == 0):\n", + " cc = 0\n", + " ev_info[name_ev] = ev\n", + "\n", + " else: # data line\n", + " # 1 1 MYA 38.3261 38.4253 1050.0000 P 52.46 6.630 weight\n", + " if(len(tmp) < 10): # absolue traveltime data\n", + " name_st = tmp[2]\n", + " phase = tmp[6]\n", + " if (phase == \"PG\"):\n", + " phase = \"Pg\"\n", + " if (phase == \"PB\"):\n", + " phase = \"Pb\"\n", + " if (phase == \"PN\"):\n", + " phase = \"Pn\"\n", + "\n", + " if (not name_st in st_info):\n", + " st = Station()\n", + " st.name = name_st\n", + " st.id = float(tmp[1])\n", + " st.lat = float(tmp[3])\n", + " st.lon = float(tmp[4])\n", + " st.ele = float(tmp[5])\n", + " st_info[name_st] = st\n", + "\n", + " time = float(tmp[7])\n", + " if(len(tmp) == 9):\n", + " weight = float(tmp[8])\n", + " else:\n", + " weight = 1.0\n", + " ev.t[\"%s+%s\"%(name_st,phase)] = [name_st,phase,time,weight]\n", + " ev.Nt += 1\n", + "\n", + " else: # differential traveltime data\n", + " phase = tmp[11]\n", + " if (phase.__contains__(\"cr\")): # common receiver differential traveltime\n", + " # evid stid1 stname1 lat1 lon1 eve1 evid2 evname2 lat2 lon2 dep2 phase,cr diftime weight\n", + "\n", + " name_st1 = tmp[2]\n", + " if (not name_st1 in st_info): # add station to the station list\n", + " st = Station()\n", + " st.name = name_st1\n", + " st.id = float(tmp[1])\n", + " st.lat = float(tmp[3])\n", + " st.lon = float(tmp[4])\n", + " st.ele = float(tmp[5])\n", + " st_info[name_st1] = st\n", + "\n", + " name_ev2 = tmp[7]\n", + " # add earthquake to the temp earthquake list\n", + " ev2 = Event()\n", + " ev2.name = name_ev2\n", + " ev2.id = float(tmp[6])\n", + " ev2.lat = float(tmp[8])\n", + " ev2.lon = float(tmp[9])\n", + " ev2.dep = float(tmp[10])\n", + " tmp_ev_info[name_ev2] = ev2\n", + "\n", + "\n", + " dif_time = float(tmp[12])\n", + " if(len(tmp) == 14):\n", + " weight = float(tmp[13])\n", + " else:\n", + " weight = 1.0\n", + " ev.cr_dt[\"%s+%s+%s\"%(name_st1,name_ev2,phase)] = [name_st1,name_ev2,phase,dif_time,weight]\n", + " ev.Ncr_dt += 1\n", + "\n", + " else: # common source differential traveltime\n", + " # evid stid1 stname1 lat1 lon1 eve1 stid2 stname2 lat2 lon2 ele2 phase,cs diftime weight\n", + "\n", + " name_st1 = tmp[2]\n", + " if (not name_st1 in st_info):\n", + " st = Station()\n", + " st.name = name_st1\n", + " st.id = len(st_info)\n", + " st.lat = float(tmp[3])\n", + " st.lon = float(tmp[4])\n", + " st.ele = float(tmp[5])\n", + " st_info[name_st1] = st\n", + "\n", + " name_st2 = tmp[7]\n", + " if (not name_st2 in st_info):\n", + " st = Station()\n", + " st.name = name_st2\n", + " st.id = float(tmp[6])\n", + " st.lat = float(tmp[8])\n", + " st.lon = float(tmp[9])\n", + " st.ele = float(tmp[10])\n", + " st_info[name_st2] = st\n", + "\n", + " dif_time = float(tmp[12])\n", + " if(len(tmp) == 14):\n", + " weight = float(tmp[13])\n", + " else:\n", + " weight = 1.0\n", + " ev.cs_dt[\"%s+%s+%s\"%(name_st1,name_st2,phase)] = [name_st1,name_st2,phase,dif_time,weight]\n", + " ev.Ncs_dt += 1\n", + "\n", + " if (cc == ndata): # end of the event data\n", + " cc = 0\n", + " ev_info[name_ev] = ev\n", + " else:\n", + " cc += 1\n", + "\n", + " # Add earthquakes from the temporary earthquake list to the main earthquake list.\n", + " for key_ev in tmp_ev_info:\n", + " if (not key_ev in ev_info):\n", + " ev_info[key_ev] = tmp_ev_info[key_ev]\n", + "\n", + " return [ev_info,st_info]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: write_src_rec_file(fname, ev_info, st_info) Output the src_rec.dat file.\n", + "def write_src_rec_file(fname,ev_info,st_info):\n", + " ev_info = reorder_src(ev_info)\n", + " doc_src_rec = open(fname,'w')\n", + "\n", + " min_lat = 9999\n", + " max_lat = -9999\n", + " min_lon = 9999\n", + " max_lon = -9999\n", + " min_dep = 9999\n", + " max_dep = -9999\n", + "\n", + " record_ev = {}\n", + " record_st = {}\n", + " Nt_total = 0\n", + " Ncs_dt_total = 0\n", + " Ncr_dt_total = 0\n", + "\n", + " for key_ev in ev_info:\n", + " ev = ev_info[key_ev]\n", + " evid = ev.id\n", + " year = ev.ortime.year\n", + " month = ev.ortime.month\n", + " day = ev.ortime.day\n", + " hour = ev.ortime.hour\n", + " minute = ev.ortime.minute\n", + " second = ev.ortime.second\n", + " msec = ev.ortime.microsecond\n", + " lat_ev = ev.lat\n", + " lon_ev = ev.lon\n", + " dep_ev = ev.dep\n", + " mag = ev.mag\n", + " ndata = ev.Nt + ev.Ncs_dt + ev.Ncr_dt\n", + " name_ev = ev.name\n", + " try:\n", + " weight_ev = ev.tag[\"weight\"]\n", + " except:\n", + " weight_ev = 1.0\n", + "\n", + " if(ndata == 0): # if the earthquake has no data, do not output it\n", + " continue\n", + "\n", + " doc_src_rec.write('%7d %6d %2d %2d %2d %2d %5.2f %9.4f %9.4f %9.4f %5.2f %7d %s %7.3f\\n'%(\\\n", + " evid,year,month,day,hour,minute,second+msec/1000000,lat_ev,lon_ev,dep_ev,mag,ndata,name_ev,weight_ev))\n", + "\n", + " min_lat = min(min_lat, lat_ev)\n", + " max_lat = max(max_lat, lat_ev)\n", + " min_lon = min(min_lon, lon_ev)\n", + " max_lon = max(max_lon, lon_ev)\n", + " min_dep = min(min_dep, dep_ev)\n", + " max_dep = max(max_dep, dep_ev)\n", + "\n", + " record_ev[name_ev] = 1 # record this earthquake\n", + " Nt_total += ev.Nt\n", + " Ncs_dt_total += ev.Ncs_dt\n", + " Ncr_dt_total += ev.Ncr_dt\n", + "\n", + " for key_t in ev.t:\n", + " data = ev.t[key_t]\n", + " st = st_info[data[0]]\n", + " stid = st.id\n", + " name_st = st.name\n", + " lat_st = st.lat\n", + " lon_st = st.lon\n", + " ele_st = st.ele\n", + " phase = data[1]\n", + " time = data[2]\n", + " try:\n", + " weight_data = data[3]\n", + " except:\n", + " weight_data = 1.0\n", + " doc_src_rec.write('%7d %7d %6s %9.4f %9.4f %9.4f %s %8.4f %7.3f \\n'%(evid,stid,name_st,lat_st,lon_st,ele_st,phase,time,weight_data))\n", + "\n", + " min_lat = min(min_lat, lat_st)\n", + " max_lat = max(max_lat, lat_st)\n", + " min_lon = min(min_lon, lon_st)\n", + " max_lon = max(max_lon, lon_st)\n", + " min_dep = min(min_dep, -ele_st/1000)\n", + " max_dep = max(max_dep, -ele_st/1000)\n", + "\n", + " record_st[name_st] = 1 # record this station\n", + "\n", + " for key_t in ev.cs_dt:\n", + " data = ev.cs_dt[key_t]\n", + " st1 = st_info[data[0]]\n", + " stid1 = st1.id\n", + " name_st1= st1.name\n", + " lat_st1 = st1.lat\n", + " lon_st1 = st1.lon\n", + " ele_st1 = st1.ele\n", + " st2 = st_info[data[1]]\n", + " stid2 = st2.id\n", + " name_st2= st2.name\n", + " lat_st2 = st2.lat\n", + " lon_st2 = st2.lon\n", + " ele_st2 = st2.ele\n", + " phase = data[2]\n", + " time = data[3]\n", + " try:\n", + " weight_data = data[4]\n", + " except:\n", + " weight_data = 1.0\n", + " doc_src_rec.write('%7d %7d %6s %9.4f %9.4f %9.4f %7d %6s %9.4f %9.4f %9.4f %s %8.4f %7.3f \\n'%(\\\n", + " evid,stid1,name_st1,lat_st1,lon_st1,ele_st1,stid2,name_st2,lat_st2,lon_st2,ele_st2,phase,time,weight_data))\n", + "\n", + " min_lat = min(min_lat, lat_st1)\n", + " max_lat = max(max_lat, lat_st1)\n", + " min_lon = min(min_lon, lon_st1)\n", + " max_lon = max(max_lon, lon_st1)\n", + " min_dep = min(min_dep, -ele_st1/1000)\n", + " max_dep = max(max_dep, -ele_st1/1000)\n", + "\n", + " min_lat = min(min_lat, lat_st2)\n", + " max_lat = max(max_lat, lat_st2)\n", + " min_lon = min(min_lon, lon_st2)\n", + " max_lon = max(max_lon, lon_st2)\n", + " min_dep = min(min_dep, -ele_st2/1000)\n", + " max_dep = max(max_dep, -ele_st2/1000)\n", + "\n", + " record_st[name_st1] = 1 # record this station\n", + " record_st[name_st2] = 1 # record this station\n", + "\n", + " for key_t in ev.cr_dt:\n", + " data = ev.cr_dt[key_t]\n", + " st = st_info[data[0]]\n", + " stid = st.id\n", + " name_st = st.name\n", + " lat_st = st.lat\n", + " lon_st = st.lon\n", + " ele_st = st.ele\n", + " ev2 = ev_info[data[1]]\n", + " evid2 = ev2.id\n", + " name_ev2= ev2.name\n", + " lat_ev2 = ev2.lat\n", + " lon_ev2 = ev2.lon\n", + " dep_ev2 = ev2.dep\n", + " phase = data[2]\n", + " time = data[3]\n", + " try:\n", + " weight_data = data[4]\n", + " except:\n", + " weight_data = 1.0\n", + " doc_src_rec.write('%7d %7d %6s %9.4f %9.4f %9.4f %7d %6s %9.4f %9.4f %9.4f %s %8.4f %7.3f \\n'%(\\\n", + " evid,stid,name_st,lat_st,lon_st,ele_st,evid2,name_ev2,lat_ev2,lon_ev2,dep_ev2,phase,time,weight_data))\n", + "\n", + " min_lat = min(min_lat, lat_st)\n", + " max_lat = max(max_lat, lat_st)\n", + " min_lon = min(min_lon, lon_st)\n", + " max_lon = max(max_lon, lon_st)\n", + " min_dep = min(min_dep, -ele_st/1000)\n", + " max_dep = max(max_dep, -ele_st/1000)\n", + "\n", + " min_lat = min(min_lat, lat_ev2)\n", + " max_lat = max(max_lat, lat_ev2)\n", + " min_lon = min(min_lon, lon_ev2)\n", + " max_lon = max(max_lon, lon_ev2)\n", + " min_dep = min(min_dep, dep_ev2)\n", + " max_dep = max(max_dep, dep_ev2)\n", + "\n", + " record_ev[name_ev2] = 1 # record this station\n", + " record_st[name_st] = 1 # record this station\n", + "\n", + " doc_src_rec.close()\n", + "\n", + " print(\"src_rec.dat has been outputed: %d events, %d stations, %d abs traveltime, %d cs_dif traveltime, %d cr_dif traveltime. \" \\\n", + " %(len(record_ev),len(record_st),Nt_total,Ncs_dt_total,Ncr_dt_total))\n", + " print(\"earthquake and station region, lat: %6.1f - %6.1f, lon: %6.1f - %6.1f, dep: %6.1f - %6.1f\"%(min_lat,max_lat,min_lon,max_lon,min_dep,max_dep) )\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: write_src_list_file(fname, ev_info) Output the event list file.\n", + "def write_src_list_file(fname,ev_info):\n", + " doc_ev_list = open(fname,'w')\n", + "\n", + " for key_ev in ev_info:\n", + " ev = ev_info[key_ev]\n", + " evid = ev.id\n", + " lat_ev = ev.lat\n", + " lon_ev = ev.lon\n", + " dep_ev = ev.dep\n", + " mag = ev.mag\n", + " name_ev = ev.name\n", + " if (ev.id == -999): # if the earthquake has no data, do not output it\n", + " continue\n", + " doc_ev_list.write(\"%7d %s %s %9.4f %9.4f %9.4f %5.2f \\n\"%(evid,name_ev,ev.ortime,lat_ev,lon_ev,dep_ev,mag))\n", + " doc_ev_list.close()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: write_rec_list_file(fname, ev_info, st_info) Output the station list file.\n", + "def write_rec_list_file(fname,ev_info,st_info):\n", + " doc_st_list = open(fname,'w')\n", + "\n", + " st_list = {}\n", + " for key_ev in ev_info:\n", + " ev = ev_info[key_ev]\n", + "\n", + " for key_t in ev.t:\n", + " data = ev.t[key_t]\n", + " st = st_info[data[0]]\n", + " name_st = st.name\n", + " lat_st = st.lat\n", + " lon_st = st.lon\n", + " ele_st = st.ele\n", + " if(not name_st in st_list):\n", + " doc_st_list.write(\"%6s %9.4f %9.4f %10.4f \\n\"%(name_st,lat_st,lon_st,ele_st))\n", + " st_list[name_st] = 1\n", + "\n", + " for key_t in ev.cs_dt:\n", + " data = ev.cs_dt[key_t]\n", + " st1 = st_info[data[0]]\n", + " name_st1= st1.name\n", + " lat_st1 = st1.lat\n", + " lon_st1 = st1.lon\n", + " ele_st1 = st1.ele\n", + " st2 = st_info[data[0]]\n", + " name_st2= st2.name\n", + " lat_st2 = st2.lat\n", + " lon_st2 = st2.lon\n", + " ele_st2 = st2.ele\n", + " if(not name_st1 in st_list):\n", + " doc_st_list.write(\"%6s %9.4f %9.4f %10.4f \\n\"%(name_st1,lat_st1,lon_st1,ele_st1))\n", + " st_list[name_st1] = 1\n", + " if(not name_st2 in st_list):\n", + " doc_st_list.write(\"%6s %9.4f %9.4f %10.4f \\n\"%(name_st2,lat_st2,lon_st2,ele_st2))\n", + " st_list[name_st2] = 1\n", + "\n", + " for key_t in ev.cr_dt:\n", + " data = ev.cr_dt[key_t]\n", + " st = st_info[data[0]]\n", + " name_st = st.name\n", + " lat_st = st.lat\n", + " lon_st = st.lon\n", + " ele_st = st.ele\n", + " if(not name_st in st_list):\n", + " doc_st_list.write(\"%6s %9.4f %9.4f %10.4f \\n\"%(name_st,lat_st,lon_st,ele_st))\n", + " st_list[name_st] = 1\n", + "\n", + " doc_st_list.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Functions: read objective function file" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: read_objective_function_file(path)\n", + "def read_objective_function_file(path):\n", + "\n", + " full_curve = []\n", + " location_curve = []\n", + " model_curve = []\n", + "\n", + " with open('%s/objective_function.txt'%(path)) as f:\n", + " for i,line in enumerate(f):\n", + " tmp = line.split(',')\n", + " if (tmp[0].__contains__(\"#\")):\n", + " continue # skip the comment line\n", + " \n", + " iter = int(tmp[0])\n", + " tag = tmp[1]\n", + " obj = float(tmp[2])\n", + " obj_abs = float(tmp[3])\n", + " obj_cs = float(tmp[4])\n", + " obj_cr = float(tmp[5])\n", + " obj_tele = float(tmp[6])\n", + " tmp2 = tmp[7].split('/')\n", + " mean = float(tmp2[0])\n", + " std = float(tmp2[1])\n", + " tmp2 = tmp[8].split('/')\n", + " mean_abs = float(tmp2[0])\n", + " std_abs = float(tmp2[1])\n", + " tmp2 = tmp[9].split('/')\n", + " mean_cs = float(tmp2[0])\n", + " std_cs = float(tmp2[1])\n", + " tmp2 = tmp[10].split('/')\n", + " mean_cr = float(tmp2[0])\n", + " std_cr = float(tmp2[1])\n", + " tmp2 = tmp[11].split('/')\n", + " mean_tele = float(tmp2[0])\n", + " std_tele = float(tmp2[1])\n", + "\n", + " full_curve.append([obj,obj_abs,obj_cs,obj_cr,obj_tele,mean,std,mean_abs,std_abs,mean_cs,std_cs,mean_cr,std_cr,mean_tele,std_tele])\n", + " if tag.__contains__(\"relocation\"):\n", + " location_curve.append([obj,obj_abs,obj_cs,obj_cr,obj_tele,mean,std,mean_abs,std_abs,mean_cs,std_cs,mean_cr,std_cr,mean_tele,std_tele])\n", + " if tag.__contains__(\"model\"):\n", + " model_curve.append([obj,obj_abs,obj_cs,obj_cr,obj_tele,mean,std,mean_abs,std_abs,mean_cs,std_cs,mean_cr,std_cr,mean_tele,std_tele])\n", + "\n", + " return np.array(full_curve),np.array(location_curve),np.array(model_curve)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Functions: read inversion grid file" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: read the inversion grid file\n", + "def read_inversion_grid_file(path):\n", + "\n", + " inv_grid_vel = []\n", + " inv_grid_ani = []\n", + "\n", + " switch = False\n", + " igrid = -1\n", + " with open('%s/inversion_grid.txt'%(path)) as f:\n", + " tmp_inv_grid = []\n", + " for i,line in enumerate(f):\n", + "\n", + " # read the number of inversion grid in dep, lat, lon directions\n", + " if(i==0):\n", + " tmp = line.split()\n", + " ndep = int(tmp[1])\n", + " nlines = 3*ndep+1 # The number of rows for each inversion grid is 3*ndep+1\n", + "\n", + " iline = i % nlines\n", + "\n", + " if(iline == 0): # info: number of inversion grid\n", + " tmp = line.split()\n", + " if (int(tmp[0]) > igrid):\n", + " igrid = int(tmp[0])\n", + " else: # change from vel to ani\n", + " switch = True\n", + " igrid = int(tmp[0])\n", + "\n", + " else: # info location of inversion grid\n", + " iline_sub = (iline-1) % 3\n", + " if(iline_sub == 0): # dep\n", + " tmp = line.split()\n", + " dep = float(tmp[0])\n", + " if(iline_sub == 1): # list of lat\n", + " lat_list = line.split()\n", + " if(iline_sub == 2): # list of lon\n", + " lon_list = line.split()\n", + "\n", + " # add inversion grid\n", + " for lat in lat_list:\n", + " for lon in lon_list:\n", + " tmp_inv_grid.append([float(lon), float(lat), dep])\n", + "\n", + " if(iline == nlines-1): # the last line of inversion grid\n", + " if(switch):\n", + " inv_grid_ani.append(tmp_inv_grid)\n", + " else:\n", + " inv_grid_vel.append(tmp_inv_grid)\n", + " tmp_inv_grid = []\n", + "\n", + " return [np.array(inv_grid_vel),np.array(inv_grid_ani)]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Functions: for plotting" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: fig_ev_st_distribution_dep(ev_info, st_info) Plot the distribution of the earthquakes and stations, color-coded by earthquake depth.\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.gridspec import GridSpec\n", + "\n", + "def fig_ev_st_distribution_dep(ev_info,st_info):\n", + "\n", + " [lon_ev,lat_ev,dep_ev,wt_ev] = data_lon_lat_dep_wt_ev(ev_info)\n", + " [lon_st,lat_st,ele_st,wt_st] = data_lon_lat_ele_wt_st(ev_info,st_info)\n", + "\n", + " min_lon = min(min(lon_ev),min(lon_st))\n", + " max_lon = max(max(lon_ev),max(lon_st))\n", + "\n", + " min_lat = min(min(lat_ev),min(lat_st))\n", + " max_lat = max(max(lat_ev),max(lat_st))\n", + "\n", + " max_dep = max(dep_ev)\n", + "\n", + " # Insert a value that does not affect the plot to make the colorbar range look better.\n", + " lon_ev = np.insert(lon_ev, 0, 9999); lat_ev = np.insert(lat_ev, 0, 9999); dep_ev = np.insert(dep_ev, 0, 0);\n", + "\n", + " fig = plt.figure(figsize=(12,12))\n", + " gridspace = GridSpec(12,12,figure = fig)\n", + "\n", + " xrange = max_lon - min_lon + 1.0\n", + " yrange = max_lat - min_lat + 1.0\n", + "\n", + " if (xrange > yrange):\n", + " fig_x_size = 6\n", + " fig_y_size = round(6*yrange/xrange)\n", + " else:\n", + " fig_x_size = round(6*xrange/yrange)\n", + " fig_y_size = 6\n", + "\n", + "\n", + " ax1 = fig.add_subplot(gridspace[0:fig_y_size,0:fig_x_size])\n", + "\n", + " bar_ev = ax1.scatter(lon_ev,lat_ev,c=dep_ev,cmap=\"jet\",label = \"src\",s = 3)\n", + " # ax1.plot(lon_st,lat_st,'rv',label = \"rec\",markersize = 6)\n", + " bar_st = ax1.scatter(lon_st,lat_st,c=\"red\",label = \"rec\",s = 100,marker='v',edgecolors='white')\n", + "\n", + " ax1.legend(fontsize = 14)\n", + " ax1.tick_params(axis='x',labelsize=18)\n", + " ax1.tick_params(axis='y',labelsize=18)\n", + " ax1.set_xlabel('Lon',fontsize=18)\n", + " ax1.set_ylabel('Lat',fontsize=18)\n", + " ax1.set_xlim((min_lon - (max_lon - min_lon)*0.1,max_lon + (max_lon - min_lon)*0.1))\n", + " ax1.set_ylim((min_lat - (max_lat - min_lat)*0.1,max_lat + (max_lat - min_lat)*0.1))\n", + "\n", + "\n", + " ax2 = fig.add_subplot(gridspace[0:fig_y_size, fig_x_size+1 : fig_x_size+3])\n", + "\n", + " ax2.scatter(dep_ev,lat_ev,c=dep_ev,cmap=\"jet\",label = \"src\",s = 3)\n", + "\n", + " ax2.tick_params(axis='x',labelsize=18)\n", + " ax2.tick_params(axis='y',labelsize=18)\n", + " ax2.set_xlabel('Dep',fontsize=18)\n", + " ax2.set_ylabel('Lat',fontsize=18)\n", + " ax2.set_xlim((-max_dep*0.05,max_dep*1.1))\n", + " ax2.set_ylim((min_lat - (max_lat - min_lat)*0.1,max_lat + (max_lat - min_lat)*0.1))\n", + "\n", + "\n", + " ax3 = fig.add_subplot(gridspace[fig_y_size+1:fig_y_size+3,0:fig_x_size])\n", + "\n", + " ax3.scatter(lon_ev,dep_ev,c=dep_ev,cmap=\"jet\",label = \"src\",s = 3)\n", + "\n", + " ax3.tick_params(axis='x',labelsize=18)\n", + " ax3.tick_params(axis='y',labelsize=18)\n", + " ax3.set_xlabel('Lon',fontsize=18)\n", + " ax3.set_ylabel('Dep',fontsize=18)\n", + " ax3.set_xlim((min_lon - (max_lon - min_lon)*0.1,max_lon + (max_lon - min_lon)*0.1))\n", + " ax3.set_ylim((-max_dep*0.05,max_dep*1.1))\n", + " ax3.invert_yaxis()\n", + "\n", + " # Place the colorbar on a new axis.\n", + " ax4 = fig.add_subplot(gridspace[fig_y_size+2:fig_y_size+3,fig_x_size+1:fig_x_size+3])\n", + " cbar1 = plt.colorbar(bar_ev, ax=ax4,orientation='horizontal')\n", + " cbar1.set_label('Depth of earthquakes',fontsize=16)\n", + " cbar1.ax.tick_params(axis='x', labelsize=16) # Colorbar font size.\n", + "\n", + " # Hide the borders of the axes.\n", + " ax4.spines['top'].set_visible(False)\n", + " ax4.spines['right'].set_visible(False)\n", + " ax4.spines['bottom'].set_visible(False)\n", + " ax4.spines['left'].set_visible(False)\n", + "\n", + " # Hide the tick values of the axes.\n", + " ax4.set_xticks([])\n", + " ax4.set_yticks([])\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Function: fig_ev_st_distribution_wt(ev_info, st_info) Plot the distribution of the earthquakes and stations, color-coded by weight.\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.gridspec import GridSpec\n", + "from matplotlib.colors import ListedColormap\n", + "from mpl_toolkits.axes_grid1 import make_axes_locatable\n", + "import math\n", + "\n", + "def fig_ev_st_distribution_wt(ev_info,st_info):\n", + "\n", + "\n", + " [lon_ev,lat_ev,dep_ev,wt_ev] = data_lon_lat_dep_wt_ev(ev_info)\n", + " [lon_st,lat_st,ele_st,wt_st] = data_lon_lat_ele_wt_st(ev_info,st_info)\n", + "\n", + " # Insert a value that does not affect the plot to make the colorbar range look better.\n", + " lon_ev = np.insert(lon_ev, 0, lon_ev[0]); lat_ev = np.insert(lat_ev, 0, lat_ev[0]); dep_ev = np.insert(dep_ev, 0, dep_ev[0]); wt_ev = np.insert(wt_ev, 0, 0.0)\n", + " lon_ev = np.insert(lon_ev, 0, lon_ev[0]); lat_ev = np.insert(lat_ev, 0, lat_ev[0]); dep_ev = np.insert(dep_ev, 0, dep_ev[0]); wt_ev = np.insert(wt_ev, 0, 1.0)\n", + " lon_st = np.insert(lon_st, 0, lon_st[0]); lat_st = np.insert(lat_st, 0, lat_st[0]); ele_st = np.insert(ele_st, 0, ele_st[0]); wt_st = np.insert(wt_st, 0, 0.0)\n", + " lon_st = np.insert(lon_st, 0, lon_st[0]); lat_st = np.insert(lat_st, 0, lat_st[0]); ele_st = np.insert(ele_st, 0, ele_st[0]); wt_st = np.insert(wt_st, 0, 1.0)\n", + "\n", + " min_lon = min(min(lon_ev),min(lon_st))\n", + " max_lon = max(max(lon_ev),max(lon_st))\n", + "\n", + " min_lat = min(min(lat_ev),min(lat_st))\n", + " max_lat = max(max(lat_ev),max(lat_st))\n", + "\n", + " max_dep = max(dep_ev)\n", + "\n", + " fig = plt.figure(figsize=(12,12))\n", + " gridspace = GridSpec(12,12,figure = fig)\n", + "\n", + " xrange = max_lon - min_lon + 1.0\n", + " yrange = max_lat - min_lat + 1.0\n", + "\n", + " if (xrange > yrange):\n", + " fig_x_size = 6\n", + " fig_y_size = round(6*yrange/xrange)\n", + " else:\n", + " fig_x_size = round(6*xrange/yrange)\n", + " fig_y_size = 6\n", + "\n", + "\n", + " ax1 = fig.add_subplot(gridspace[0:fig_y_size,0:fig_x_size])\n", + "\n", + " bar_ev = ax1.scatter(lon_ev,lat_ev,c=wt_ev,cmap=\"jet\",label = \"src\",s = 3)\n", + " bar_st = ax1.scatter(lon_st,lat_st,c=wt_st,cmap=\"jet\",label = \"rec\",s = 100,marker='^',edgecolors='white')\n", + "\n", + " ax1.legend(fontsize = 14)\n", + " ax1.tick_params(axis='x',labelsize=18)\n", + " ax1.tick_params(axis='y',labelsize=18)\n", + " ax1.set_xlabel('Lon',fontsize=18)\n", + " ax1.set_ylabel('Lat',fontsize=18)\n", + " ax1.set_xlim((min_lon - (max_lon - min_lon)*0.1,max_lon + (max_lon - min_lon)*0.1))\n", + " ax1.set_ylim((min_lat - (max_lat - min_lat)*0.1,max_lat + (max_lat - min_lat)*0.1))\n", + "\n", + "\n", + " ax2 = fig.add_subplot(gridspace[0:fig_y_size, fig_x_size+1 : fig_x_size+3])\n", + "\n", + " ax2.scatter(dep_ev,lat_ev,c=wt_ev,cmap=\"jet\",label = \"src\",s = 3)\n", + "\n", + " ax2.tick_params(axis='x',labelsize=18)\n", + " ax2.tick_params(axis='y',labelsize=18)\n", + " ax2.set_xlabel('Dep',fontsize=18)\n", + " ax2.set_ylabel('Lat',fontsize=18)\n", + " ax2.set_xlim((-max_dep*0.05,max_dep*1.1))\n", + " ax2.set_ylim((min_lat - (max_lat - min_lat)*0.1,max_lat + (max_lat - min_lat)*0.1))\n", + "\n", + "\n", + " ax3 = fig.add_subplot(gridspace[fig_y_size+1:fig_y_size+3,0:fig_x_size])\n", + "\n", + " ax3.scatter(lon_ev,dep_ev,c=wt_ev,cmap=\"jet\",label = \"src\",s = 3)\n", + "\n", + " ax3.tick_params(axis='x',labelsize=18)\n", + " ax3.tick_params(axis='y',labelsize=18)\n", + " ax3.set_xlabel('Lon',fontsize=18)\n", + " ax3.set_ylabel('Dep',fontsize=18)\n", + " ax3.set_xlim((min_lon - (max_lon - min_lon)*0.1,max_lon + (max_lon - min_lon)*0.1))\n", + " ax3.set_ylim((-max_dep*0.05,max_dep*1.1))\n", + " ax3.invert_yaxis()\n", + "\n", + " # Place the colorbar on a new axis.\n", + " ax4 = fig.add_subplot(gridspace[fig_y_size+2:fig_y_size+3,fig_x_size+1:fig_x_size+3])\n", + " cbar1 = plt.colorbar(bar_st, ax=ax4,orientation='horizontal')\n", + " cbar1.set_label('Weight of stations',fontsize=16)\n", + " cbar1.ax.tick_params(axis='x', labelsize=16) # colorbar font size.\n", + " # Hide the borders of the axes.\n", + " ax4.spines['top'].set_visible(False)\n", + " ax4.spines['right'].set_visible(False)\n", + " ax4.spines['bottom'].set_visible(False)\n", + " ax4.spines['left'].set_visible(False)\n", + "\n", + " # Hide the tick values of the axes.\n", + " ax4.set_xticks([])\n", + " ax4.set_yticks([])\n", + "\n", + " # Place the colorbar on a new axis.\n", + " ax5 = fig.add_subplot(gridspace[fig_y_size+1:fig_y_size+2,fig_x_size+1:fig_x_size+3])\n", + " cbar1 = plt.colorbar(bar_ev, ax=ax5,orientation='horizontal')\n", + " cbar1.set_label('Weight of earthquakes',fontsize=16)\n", + " cbar1.ax.tick_params(axis='x', labelsize=16) # colorbar font size.\n", + " # Hide the borders of the axes.\n", + " ax5.spines['top'].set_visible(False)\n", + " ax5.spines['right'].set_visible(False)\n", + " ax5.spines['bottom'].set_visible(False)\n", + " ax5.spines['left'].set_visible(False)\n", + "\n", + " # Hide the tick values of the axes.\n", + " ax5.set_xticks([])\n", + " ax5.set_yticks([])\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot and function: plot the distance-time scatter plot, remove the outliers.\n", + "# Limit the data within the range defined by the line time = dis * slope + intercept and the bounds up and down.\n", + "# Remove outliers, only retain data satisfying: slope * dis + intercept + down < time < slope * dis + intercept + up.\n", + "\n", + "def fig_data_plot_remove_outliers(ev_info,st_info,slope,intercept,up,down,dis_min,dis_max):\n", + "\n", + " fig = plt.figure(figsize=(10,10))\n", + " gridspace = GridSpec(6,6,figure = fig)\n", + " ax2 = fig.add_subplot(gridspace[0:6, 0:6])\n", + "\n", + " # plot original data\n", + " [dis_obs,time_obs] = data_dis_time(ev_info,st_info)\n", + " ax2.plot(dis_obs,time_obs,'r.',markersize=1.5,label = \"discarded\")\n", + "\n", + " # remove outliers, only retain data satisfying: slope * dis + intercept + down < time < slope * dis + intercept + up\n", + " ev_info = limit_data_residual(ev_info,st_info,slope,intercept,up,down)\n", + "\n", + " [dis_obs,time_obs] = data_dis_time(ev_info,st_info)\n", + " ax2.plot(dis_obs,time_obs,'b.',markersize=1.5,label = \"retained\")\n", + "\n", + " ax2.plot([dis_min,dis_max],[slope*dis_min+intercept+up,slope*dis_max+intercept+up],'b-',linewidth=2)\n", + " ax2.plot([dis_min,dis_max],[slope*dis_min+intercept+down,slope*dis_max+intercept+down],'b-',linewidth=2)\n", + " ax2.plot([dis_min,dis_max],[slope*dis_min+intercept,slope*dis_max+intercept],'k-',linewidth=2)\n", + "\n", + " ax2.legend(fontsize = 14)\n", + " ax2.tick_params(axis='x',labelsize=18)\n", + " ax2.tick_params(axis='y',labelsize=18)\n", + " ax2.set_xlabel('Distance (km)',fontsize=18)\n", + " ax2.set_ylabel('Traveltime',fontsize=18)\n", + " ax2.set_xlim((dis_min,dis_max))\n", + " ax2.set_ylim((intercept+down-5,slope*dis_max+intercept+up+5))\n", + "\n", + " return ev_info" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot: distance-time scatter plot of given phases.\n", + "\n", + "def fig_data_plot_phase(ev_info,st_info,phase_list,color_list,dis_min,dis_max):\n", + "\n", + " [dis_obs_phase,time_obs_phase] = data_dis_time_phase(ev_info,st_info,phase_list)\n", + "\n", + " regression = {}\n", + " # Calculate the least squares y = ax+b\n", + " for key_phase in phase_list:\n", + " X = dis_obs_phase[key_phase]\n", + " Y = time_obs_phase[key_phase]\n", + "\n", + " if(len(X)>20):\n", + " regression[key_phase] = linear_regression(X,Y)\n", + " else:\n", + " print(\"No enough data: %d, for %s\"%(len(X),key_phase))\n", + " regression[key_phase] = [0,0,0]\n", + "\n", + "\n", + " # draw\n", + " fig = plt.figure(figsize=(10,10))\n", + " gridspace = GridSpec(6,6,figure = fig)\n", + " ax2 = fig.add_subplot(gridspace[0:6, 0:6])\n", + " y1 = 99999; y2 = -99999\n", + "\n", + " # scatter plot\n", + " for iphase in range(len(phase_list)):\n", + " phase = phase_list[iphase]\n", + " color = color_list[iphase]\n", + " ax2.plot(dis_obs_phase[phase],time_obs_phase[phase],'%s.'%(color),markersize=1)\n", + "\n", + " # linear regression plot\n", + " for iphase in range(len(phase_list)):\n", + " phase = phase_list[iphase]\n", + " color = color_list[iphase]\n", + " (slope,intercept,SEE)= regression[phase]\n", + " ax2.plot([dis_min,dis_max],[dis_min*slope+intercept,dis_max*slope+intercept],'%s-'%(color),linewidth=2,label = \"%s: a,b,SEE=%5.2f,%5.2f,%5.2f\"%(phase,slope,intercept,SEE))\n", + " y1 = min(y1,intercept-5)\n", + " y2 = max(y2,dis_max*slope+intercept+5)\n", + "\n", + " ax2.legend(fontsize = 14)\n", + " ax2.tick_params(axis='x',labelsize=18)\n", + " ax2.tick_params(axis='y',labelsize=18)\n", + " ax2.set_xlabel('Distance (km)',fontsize=18)\n", + " ax2.set_ylabel('Traveltime (s)',fontsize=18)\n", + " ax2.set_xlim((dis_min,dis_max))\n", + "\n", + "\n", + " for iphase in range(len(phase_list)):\n", + " try:\n", + " y1 = min(y1,min(time_obs_phase[phase]))\n", + " y2 = max(y2,max(time_obs_phase[phase]))\n", + " except:\n", + " pass\n", + " ax2.set_ylim((y1,y2))\n", + "\n", + " title = \"\"\n", + " for phase in dis_obs_phase:\n", + " title = title + \"%s(%d) \"%(phase,len(dis_obs_phase[phase]))\n", + "\n", + " ax2.set_title(title)\n", + "\n", + " print(\"a is slope, b is intercept, SEE is standard error of estimate\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Functions: results analysis and evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot: plot the residual histogram of the initial and final model\n", + "def fig_residual_histogram(fn_syn_init,fn_syn_final,fn_obs,range_l,range_r,Nbar,tag1 = \"initial\",tag2 = \"final\"):\n", + "\n", + " # read synthetic traveltime data in the initial model\n", + " [ev_info_syn_init, st_info_syn_init] = read_src_rec_file(fn_syn_init)\n", + " time_syn_init = data_dis_time(ev_info_syn_init,st_info_syn_init)[1]\n", + "\n", + " # read synthetic traveltime data in the final model\n", + " [ev_info_syn_final, st_info_syn_final] = read_src_rec_file(fn_syn_final)\n", + " time_syn_final = data_dis_time(ev_info_syn_final,st_info_syn_final)[1]\n", + "\n", + " # read observed traveltime data\n", + " [ev_info_obs, st_info_obs] = read_src_rec_file(fn_obs)\n", + " time_obs = data_dis_time(ev_info_obs,st_info_obs)[1]\n", + "\n", + " fig = plt.figure(figsize=(6,6))\n", + " gridspace = GridSpec(6,6,figure = fig)\n", + "\n", + " ax2 = fig.add_subplot(gridspace[0:6, 0:6])\n", + "\n", + " bins=np.linspace(range_l,range_r,Nbar)\n", + " error_init = time_syn_init - time_obs\n", + " error_final = time_syn_final - time_obs\n", + "\n", + " hist_init, _, _ = ax2.hist(error_init,bins=bins,histtype='step', edgecolor = \"red\", linewidth = 2,\n", + " label = \"%s: std = %5.3f s, mean = %5.3f s\"%(tag1,np.std(error_init),np.mean(error_init)))\n", + "\n", + " hist_final, _, _ = ax2.hist(error_final,bins=bins,alpha = 0.5, color = \"blue\",\n", + " label = \"%s: std = %5.3f s, mean = %5.3f s\"%(tag2,np.std(error_final),np.mean(error_final)))\n", + "\n", + " print(\"residual for \",tag1,\" model is: \",\"mean: \",np.mean(error_init),\"sd: \",np.std(error_init))\n", + " print(\"residual for \",tag2,\" model is: \",\"mean: \",np.mean(error_final),\"sd: \",np.std(error_final))\n", + " ax2.legend(fontsize=14)\n", + "\n", + " ax2.set_xlim(range_l - abs(range_l)*0.1,range_r + abs(range_r)*0.1)\n", + " ax2.set_ylim(0,1.3*max(max(hist_init),max(hist_final)))\n", + "\n", + " ax2.tick_params(axis='x',labelsize=18)\n", + " ax2.tick_params(axis='y',labelsize=18)\n", + " ax2.set_ylabel('Number of data',fontsize=18)\n", + " ax2.set_xlabel('Traveltime residuals (s)',fontsize=18)\n", + " ax2.set_title(\"$t_{syn} - t_{obs}$\",fontsize=18)\n", + " ax2.grid()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot: plot the residual histogram of the initial and final model\n", + "def fig_data_difference_histogram(fn_A,fn_B,range_l,range_r,Nbar):\n", + "\n", + " # read data A\n", + " [ev_info_A, st_info_A] = read_src_rec_file(fn_A)\n", + "\n", + " # read data B\n", + " [ev_info_B, st_info_B] = read_src_rec_file(fn_B)\n", + "\n", + " # absolute traveltime residual\n", + " error_t = []\n", + " for key_ev in ev_info_A:\n", + " for key_t in ev_info_A[key_ev].t:\n", + " data_A = ev_info_A[key_ev].t[key_t]\n", + " if (key_ev in ev_info_B and key_t in ev_info_B[key_ev].t):\n", + " data_B = ev_info_B[key_ev].t[key_t]\n", + " error_t.append(data_A[2] - data_B[2])\n", + "\n", + " # common-source differential traveltime residual\n", + " error_cs_dt = []\n", + " for key_ev in ev_info_A:\n", + " for key_dt in ev_info_A[key_ev].cs_dt:\n", + " data_A = ev_info_A[key_ev].cs_dt[key_dt]\n", + " if (key_ev in ev_info_B and key_dt in ev_info_B[key_ev].cs_dt):\n", + " data_B = ev_info_B[key_ev].cs_dt[key_dt]\n", + " error_cs_dt.append(data_A[3] - data_B[3])\n", + " else:\n", + " print(key_ev,key_dt)\n", + "\n", + " # common-receiver differential traveltime residual\n", + " error_cr_dt = []\n", + " for key_ev in ev_info_A:\n", + " for key_dt in ev_info_A[key_ev].cr_dt:\n", + " data_A = ev_info_A[key_ev].cr_dt[key_dt]\n", + " if (key_ev in ev_info_B and key_dt in ev_info_B[key_ev].cr_dt):\n", + " data_B = ev_info_B[key_ev].cr_dt[key_dt]\n", + " error_cr_dt.append(data_A[3] - data_B[3])\n", + "\n", + " # plot\n", + " fig = plt.figure(figsize=(14,6))\n", + " gridspace = GridSpec(6,14,figure = fig)\n", + "\n", + "\n", + " ax2 = fig.add_subplot(gridspace[0:6, 0:6])\n", + " bins=np.linspace(range_l,range_r,Nbar)\n", + " # hist_t, _, _ = ax2.hist(error_t,bins=bins,histtype='step', edgecolor = \"red\", linewidth = 2,\n", + " # label = \"noise: std = %5.3f s, mean = %5.3f s\"%(np.std(error_t),np.mean(error_t)))\n", + " hist_t, _, _ = ax2.hist(error_t,bins=bins,alpha = 0.5, color = \"blue\",\n", + " label = \"noise: std = %5.3f s, mean = %5.3f s\"%(np.std(error_t),np.mean(error_t)))\n", + "\n", + " ax2.legend(fontsize=14)\n", + " ax2.set_xlim(range_l - abs(range_l)*0.1,range_r + abs(range_r)*0.1)\n", + " try:\n", + " ax2.set_ylim(0,1.3*max(hist_t))\n", + " except:\n", + " ax2.set_ylim(0,1.0)\n", + " ax2.tick_params(axis='x',labelsize=18)\n", + " ax2.tick_params(axis='y',labelsize=18)\n", + " ax2.set_ylabel('Number of data',fontsize=18)\n", + " ax2.set_xlabel('Noise (s)',fontsize=18)\n", + " ax2.set_title(\"Noise of traveltime\",fontsize=18)\n", + "\n", + "\n", + " ax3 = fig.add_subplot(gridspace[0:6,8:14])\n", + " bins=np.linspace(range_l,range_r,Nbar)\n", + " # hist_t, _, _ = ax3.hist(error_t,bins=bins,histtype='step', edgecolor = \"red\", linewidth = 2,\n", + " # label = \"noise: std = %5.3f s, mean = %5.3f s\"%(np.std(error_t),np.mean(error_t)))\n", + " hist_cs_dt, _, _ = ax3.hist(error_cs_dt,bins=bins,alpha = 0.5, color = \"blue\",\n", + " label = \"noise: std = %5.3f s, mean = %5.3f s\"%(np.std(error_cs_dt),np.mean(error_cs_dt)))\n", + "\n", + " ax3.legend(fontsize=14)\n", + " ax3.set_xlim(range_l - abs(range_l)*0.1,range_r + abs(range_r)*0.1)\n", + " try:\n", + " ax3.set_ylim(0,1.3*max(hist_cs_dt))\n", + " except:\n", + " ax3.set_ylim(0,1.0)\n", + " ax3.tick_params(axis='x',labelsize=18)\n", + " ax3.tick_params(axis='y',labelsize=18)\n", + " ax3.set_ylabel('Number of data',fontsize=18)\n", + " ax3.set_xlabel('Noise (s)',fontsize=18)\n", + " ax3.set_title(\"Noise of differential traveltime\",fontsize=18)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/utils/functions_for_data.py b/examples/utils/functions_for_data.py new file mode 100644 index 0000000..c21864e --- /dev/null +++ b/examples/utils/functions_for_data.py @@ -0,0 +1,2414 @@ +# %% +# Initialization, class definition, and declaration. + +import os +import math +from obspy import UTCDateTime +import numpy as np +import copy + +class Event(): # class of earthquake + def __init__(self): + self.name = "nan" # evname1 Earthquake name, recommended as "earthquake". + self.id = -1 + self.lat = 0.0 + self.lon = 0.0 + self.dep = 0.0 + self.mag = 0.0 + self.ortime = UTCDateTime(1999,1,1,0,0,0) + self.Nt = 0 # Number of the absolute traveltime of earthquake + self.Ncs_dt = 0 # Number of the commmon source differential traveltime of earthquake + self.Ncr_dt = 0 # Number of the commmon receiver differential traveltime of earthquake + self.t = {} # stname1+phase -> (stname1, phase, time, data_weight) + self.cs_dt = {} # stname1 + stname2 + phase -> (stname1, stname2, phase, dif_time, data_weight) + self.cr_dt = {} # stname1 + evname2 + phase -> (stname1, evname2, phase, dif_time, data_weight) + self.azi_gap = 360.0 # the max azimuthal gap of each earthquake + self.misfit = {} # traveltime residual of the data, the difference between real data and synthetic data, used for evaluation. stname or stname1+stname2 or stname1+evname2 -> residual + self.tag = {} # additional tags for the earthquake, e.g., azi_gap, weight. (azimuthal gap, weight of the earthquake) + +class Station(): + def __init__(self): + self.name = "nan" # stname1, recommend: network.stname + self.id = -1 + self.lat = 0.0 + self.lon = 0.0 + self.ele = 0.0 + self.tag = {} # additional tags for the station, e.g., wright + + + + +# %% [markdown] +# Functions: some basic auxiliary functions for processing data + +# %% +# function: cal_dis(lat1, lon1,lat2, lon2) (in kilometers), cal_azimuth(lat1, lon1, lat2, lon2) (degree) calculate epicentral distance (km) and azimuth (degree) + +def cal_dis(lat1, lon1,lat2, lon2, R = 6371): + latitude1 = (math.pi/180)*lat1 + latitude2 = (math.pi/180)*lat2 + longitude1 = (math.pi/180)*lon1 + longitude2= (math.pi/180)*lon2 + # Therefore, the spherical distance between points A and B is:{arccos[sinb*siny+cosb*cosy*cos(a-x)]}*R + # Radius of the earth + if((lat1-lat2)**2+(lon1-lon2)**2<0.000001): + return 0 + + d = math.acos(math.sin(latitude1)*math.sin(latitude2)+ math.cos(latitude1)*math.cos(latitude2)*math.cos(longitude2-longitude1))/math.pi*180 + return d * 2 * math.pi * R / 360 + +def cal_azimuth(lat1, lon1, lat2, lon2): + lat1_rad = lat1 * math.pi / 180 + lon1_rad = lon1 * math.pi / 180 + lat2_rad = lat2 * math.pi / 180 + lon2_rad = lon2 * math.pi / 180 + + y = math.sin(lon2_rad - lon1_rad) * math.cos(lat2_rad) + x = math.cos(lat1_rad) * math.sin(lat2_rad) - math.sin(lat1_rad) * math.cos(lat2_rad) * math.cos(lon2_rad - lon1_rad) + brng = math.atan2(y, x) * 180 / math.pi + if((lat1-lat2)**2+(lon1-lon2)**2<0.0001): + return 0 + return float((brng + 360.0) % 360.0) + + +# %% +# Function: Coordinate rotation rotate_src_rec(ev_info, st_info, theta0, phi0, psi): rotate to the new coordinate system, satisfying the center point transformation r0, t0, p0 -> r0, 0, 0 and an anticlockwise rotation angle psi. +# Satisfying the center point transformation r0, t0, p0 -> r0, 0, 0 and an anticlockwise rotation angle psi. + +import numpy as np + +RAD2DEG = 180/np.pi +DEG2RAD = np.pi/180 +R_earth = 6371.0 + +# Spherical coordinates to Cartesian coordinate +def rtp2xyz(r,theta,phi): + x = r * np.cos(theta*DEG2RAD) * np.cos(phi*DEG2RAD) + y = r * np.cos(theta*DEG2RAD) * np.sin(phi*DEG2RAD) + z = r * np.sin(theta*DEG2RAD) + return (x,y,z) + +# Cartesian coordinates to Spherical coordinate +def xyz2rtp(x,y,z): + # theta: -90~90; phi: -180~180 + r = np.sqrt(x**2+y**2+z**2) + theta = np.arcsin(z/r) + phi = np.arcsin(y/r/np.cos(theta)) + + + idx = np.where((phi > 0) & (x*y < 0)) + phi[idx] = np.pi - phi[idx] + idx = np.where((phi < 0) & (x*y > 0)) + phi[idx] = -np.pi - phi[idx] + + + # for i in range(phi.size): + # if(phi[i] > 0 and x[i]*y[i] < 0): + # phi[i] = np.pi - phi[i] + # if(phi[i] < 0 and x[i]*y[i] > 0): + # phi[i] = -np.pi - phi[i] + + return (r,theta*RAD2DEG,phi*RAD2DEG) + +# anti-clockwise rotation along x-axis +def rotate_x(x,y,z,theta): + new_x = x + new_y = y * np.cos(theta*DEG2RAD) + z * -np.sin(theta*DEG2RAD) + new_z = y * np.sin(theta*DEG2RAD) + z * np.cos(theta*DEG2RAD) + return (new_x,new_y,new_z) + +# anti-clockwise rotation along y-axis +def rotate_y(x,y,z,theta): + new_x = x * np.cos(theta*DEG2RAD) + z * np.sin(theta*DEG2RAD) + new_y = y + new_z = x * -np.sin(theta*DEG2RAD) + z * np.cos(theta*DEG2RAD) + return (new_x,new_y,new_z) + +# anti-clockwise rotation along z-axis +def rotate_z(x,y,z,theta): + new_x = x * np.cos(theta*DEG2RAD) + y * -np.sin(theta*DEG2RAD) + new_y = x * np.sin(theta*DEG2RAD) + y * np.cos(theta*DEG2RAD) + new_z = z + return (new_x,new_y,new_z) + +# spherical Rotation + +# rotate to the new coordinate, satisfying the center r0,t0,p0 -> r0,0,0 and a anticlockwise angle psi +def rtp_rotation(t,p,theta0,phi0,psi): + # step 1: r,t,p -> x,y,z + (x,y,z) = rtp2xyz(1.0,t,p) + + # step 2: anti-clockwise rotation with -phi0 along z-axis: r0,t0,p0 -> r0,t0,0 + (x,y,z) = rotate_z(x,y,z,-phi0) + + # step 3: anti-clockwise rotation with theta0 along y-axis: r0,t0,0 -> r0,0,0 + (x,y,z) = rotate_y(x,y,z,theta0) + + # # step 4: anti-clockwise rotation with psi along x-axis + (x,y,z) = rotate_x(x,y,z,psi) + + # step 5: x,y,z -> r,t,p + (new_r,new_t,new_p) = xyz2rtp(x,y,z) + + return (new_t,new_p) + + +def rtp_rotation_reverse(new_t,new_p,theta0,phi0,psi): + # step 1: r,t,p -> x,y,z + (x,y,z) = rtp2xyz(1.0,new_t,new_p) + + # step 2: anti-clockwise rotation with -psi along x-axis + (x,y,z) = rotate_x(x,y,z,-psi) + + # step 3: anti-clockwise rotation with -theta0 along y-axis: r0,0,0 -> r0,t0,0 + (x,y,z) = rotate_y(x,y,z,-theta0) + + # step 4: anti-clockwise rotation with phi0 along z-axis: r0,t0,0 -> r0,t0,p0 + (x,y,z) = rotate_z(x,y,z,phi0) + + # step 5: x,y,z -> r,t,p + (r,t,p) = xyz2rtp(x,y,z) + + return (t,p) + +def rotate_src_rec(ev_info,st_info,theta0,phi0,psi): + ev_info_rotate = {} + st_info_rotate = {} + + # rotate earthquakes + for key_ev in ev_info: + ev = ev_info[key_ev] + ev_lat = np.array([ev.lat]); ev_lon = np.array([ev.lon]) + (ev_lat,ev_lon,) = rtp_rotation(ev_lat,ev_lon,theta0,phi0,psi) + ev.lat = ev_lat[0]; ev.lon = ev_lon[0] + ev_info_rotate[key_ev] = ev + + # rotate stations + for key_st in st_info: + st = st_info[key_st] + st_lat = np.array([st.lat]); st_lon = np.array([st.lon]) + (st_lat,st_lon) = rtp_rotation(st_lat,st_lon,theta0,phi0,psi) + st.lat = st_lat[0]; st.lon = st_lon[0] + st_info_rotate[key_st] = st + + return (ev_info_rotate,st_info_rotate) + +def rotate_src_rec_reverse(ev_info_rotate,st_info_rotate,theta0,phi0,psi): + ev_info = {} + st_info = {} + + # rotate earthquakes + for key_ev in ev_info_rotate: + ev = ev_info_rotate[key_ev] + ev_lat = np.array([ev.lat]); ev_lon = np.array([ev.lon]) + (ev_lat,ev_lon,) = rtp_rotation_reverse(ev_lat,ev_lon,theta0,phi0,psi) + ev.lat = ev_lat[0]; ev.lon = ev_lon[0] + ev_info[key_ev] = ev + + # rotate stations + for key_st in st_info_rotate: + st = st_info_rotate[key_st] + st_lat = np.array([st.lat]); st_lon = np.array([st.lon]) + (st_lat,st_lon) = rtp_rotation_reverse(st_lat,st_lon,theta0,phi0,psi) + st.lat = st_lat[0]; st.lon = st_lon[0] + st_info[key_st] = st + + return (ev_info,st_info) + +# %% +# # Function: Coordinate rotation rotate_src_rec(ev_info, st_info, theta0, phi0, psi): rotate to the new coordinate system, satisfying the center point transformation r0, t0, p0 -> r0, 0, 0 and an anticlockwise rotation angle psi. +# # Satisfying the center point transformation r0, t0, p0 -> r0, 0, 0 and an anticlockwise rotation angle psi. + +# import numpy as np + +# RAD2DEG = 180/np.pi +# DEG2RAD = np.pi/180 +# R_earth = 6371.0 + +# # Spherical coordinates to Cartesian coordinate +# def rtp2xyz(r,theta,phi): +# x = r * np.cos(theta*DEG2RAD) * np.cos(phi*DEG2RAD) +# y = r * np.cos(theta*DEG2RAD) * np.sin(phi*DEG2RAD) +# z = r * np.sin(theta*DEG2RAD) +# return (x,y,z) + +# # Cartesian coordinates to Spherical coordinate +# def xyz2rtp(x,y,z): +# # theta: -90~90; phi: -180~180 +# r = np.sqrt(x**2+y**2+z**2) +# theta = np.arcsin(z/r) +# phi = np.arcsin(y/r/np.cos(theta)) + + +# if(phi > 0 and x*y < 0): +# phi = np.pi - phi +# if(phi < 0 and x*y > 0): +# phi = -np.pi - phi + +# return (r,theta*RAD2DEG,phi*RAD2DEG) + +# # anti-clockwise rotation along x-axis +# def rotate_x(x,y,z,theta): +# new_x = x +# new_y = y * np.cos(theta*DEG2RAD) + z * -np.sin(theta*DEG2RAD) +# new_z = y * np.sin(theta*DEG2RAD) + z * np.cos(theta*DEG2RAD) +# return (new_x,new_y,new_z) + +# # anti-clockwise rotation along y-axis +# def rotate_y(x,y,z,theta): +# new_x = x * np.cos(theta*DEG2RAD) + z * np.sin(theta*DEG2RAD) +# new_y = y +# new_z = x * -np.sin(theta*DEG2RAD) + z * np.cos(theta*DEG2RAD) +# return (new_x,new_y,new_z) + +# # anti-clockwise rotation along z-axis +# def rotate_z(x,y,z,theta): +# new_x = x * np.cos(theta*DEG2RAD) + y * -np.sin(theta*DEG2RAD) +# new_y = x * np.sin(theta*DEG2RAD) + y * np.cos(theta*DEG2RAD) +# new_z = z +# return (new_x,new_y,new_z) + +# # spherical Rotation + +# # rotate to the new coordinate, satisfying the center r0,t0,p0 -> r0,0,0 and a anticlockwise angle psi +# def rtp_rotation(t,p,theta0,phi0,psi): +# # step 1: r,t,p -> x,y,z +# (x,y,z) = rtp2xyz(1.0,t,p) + +# # step 2: anti-clockwise rotation with -phi0 along z-axis: r0,t0,p0 -> r0,t0,0 +# (x,y,z) = rotate_z(x,y,z,-phi0) + +# # step 3: anti-clockwise rotation with theta0 along y-axis: r0,t0,0 -> r0,0,0 +# (x,y,z) = rotate_y(x,y,z,theta0) + +# # # step 4: anti-clockwise rotation with psi along x-axis +# (x,y,z) = rotate_x(x,y,z,psi) + +# # step 5: x,y,z -> r,t,p +# (new_r,new_t,new_p) = xyz2rtp(x,y,z) + +# return (new_t,new_p) + + +# def rtp_rotation_reverse(new_t,new_p,theta0,phi0,psi): +# # step 1: r,t,p -> x,y,z +# (x,y,z) = rtp2xyz(1.0,new_t,new_p) + +# # step 2: anti-clockwise rotation with -psi along x-axis +# (x,y,z) = rotate_x(x,y,z,-psi) + +# # step 3: anti-clockwise rotation with -theta0 along y-axis: r0,0,0 -> r0,t0,0 +# (x,y,z) = rotate_y(x,y,z,-theta0) + +# # step 4: anti-clockwise rotation with phi0 along z-axis: r0,t0,0 -> r0,t0,p0 +# (x,y,z) = rotate_z(x,y,z,phi0) + +# # step 5: x,y,z -> r,t,p +# (r,t,p) = xyz2rtp(x,y,z) + +# return (t,p) + +# def rotate_src_rec(ev_info,st_info,theta0,phi0,psi): +# ev_info_rotate = {} +# st_info_rotate = {} + +# # rotate earthquakes +# for key_ev in ev_info: +# ev = ev_info[key_ev] +# (ev.lat,ev.lon,) = rtp_rotation(ev.lat,ev.lon,theta0,phi0,psi) +# ev_info_rotate[key_ev] = ev + +# # rotate stations +# for key_st in st_info: +# st = st_info[key_st] +# (st.lat,st.lon) = rtp_rotation(st.lat,st.lon,theta0,phi0,psi) +# st_info_rotate[key_st] = st + +# return (ev_info_rotate,st_info_rotate) + +# def rotate_src_rec_reverse(ev_info_rotate,st_info_rotate,theta0,phi0,psi): +# ev_info = {} +# st_info = {} + +# # rotate earthquakes +# for key_ev in ev_info_rotate: +# ev = ev_info_rotate[key_ev] +# (ev.lat,ev.lon) = rtp_rotation_reverse(ev.lat,ev.lon,theta0,phi0,psi) +# ev_info[key_ev] = ev + +# # rotate stations +# for key_st in st_info_rotate: +# st = st_info_rotate[key_st] +# (st.lat,st.lon) = rtp_rotation_reverse(st.lat,st.lon,theta0,phi0,psi) +# st_info[key_st] = st + +# return (ev_info,st_info) + +# %% +# linear_regression(X,Y) +def linear_regression(X,Y): + slope,intercept = np.polyfit(X,Y,deg=1) + fitted_values = slope * X + intercept + residual = Y - fitted_values + SEE = np.std(residual) + return (slope,intercept,SEE) + +# %% [markdown] +# +# Functions: obtain target information from ev_info and st_info + +# %% +# function: output the [lon,lat,dep,weight] of the earthquake +def data_lon_lat_dep_wt_ev(ev_info): + lat = [] + lon = [] + dep = [] + weight = [] + for key in ev_info: + lat.append(ev_info[key].lat) + lon.append(ev_info[key].lon) + dep.append(ev_info[key].dep) + try: + weight.append(ev_info[key].tag["weight"]) + except: + weight.append(1.0) + return [np.array(lon),np.array(lat),np.array(dep),np.array(weight)] + +# %% +# function: output the [lon, lat, dep, ortime] of the earthquake +def data_ev_loc(ev_info): + lat = [] + lon = [] + dep = [] + ortime = [] + for key in ev_info: + lat.append(ev_info[key].lat) + lon.append(ev_info[key].lon) + dep.append(ev_info[key].dep) + ortime.append(ev_info[key].ortime.timestamp) + return [np.array(lon),np.array(lat),np.array(dep),np.array(ortime)] + +# %% +# function: output the [lon,lat,dep,weight] of the station +def data_lon_lat_ele_wt_st(ev_info,st_info): + names = {} + lat = [] + lon = [] + ele = [] + weight = [] + for key_ev in ev_info: + for key_t in ev_info[key_ev].t: # absolute traveltime data + name_st = ev_info[key_ev].t[key_t][0] + names[name_st] = name_st + + for key_t in ev_info[key_ev].cs_dt: # common source differential traveltime data + name_st = ev_info[key_ev].cs_dt[key_t][0] + names[name_st] = name_st + name_st = ev_info[key_ev].cs_dt[key_t][1] + names[name_st] = name_st + + for key_t in ev_info[key_ev].cr_dt: # common receiver differential traveltime data + name_st = ev_info[key_ev].cr_dt[key_t][0] + names[name_st] = name_st + + for name in names: # only output the station which has data + lat.append(st_info[name].lat) + lon.append(st_info[name].lon) + ele.append(st_info[name].ele) + try: + weight.append(st_info[name].tag["weight"]) + except: + weight.append(1.0) + return [np.array(lon),np.array(lat),np.array(ele),np.array(weight)] + +# %% +# function: output the [dis,time] of all data +def data_dis_time(ev_info,st_info): + all_dis = [] + all_time = [] + for key_ev in ev_info: + lat_ev = ev_info[key_ev].lat + lon_ev = ev_info[key_ev].lon + dep_ev = ev_info[key_ev].dep + for key_t in ev_info[key_ev].t: + all_time.append(ev_info[key_ev].t[key_t][2]) + lat_st = st_info[ev_info[key_ev].t[key_t][0]].lat + lon_st = st_info[ev_info[key_ev].t[key_t][0]].lon + ele_st = st_info[ev_info[key_ev].t[key_t][0]].ele + dis = math.sqrt(cal_dis(lat_ev,lon_ev,lat_st,lon_st)**2 + (dep_ev+ele_st/1000)**2) + all_dis.append(dis) + + return [np.array(all_dis),np.array(all_time)] + +# %% +# function: output the [epidis,time] of all data +def data_epidis_time(ev_info,st_info): + all_dis = [] + all_time = [] + for key_ev in ev_info: + lat_ev = ev_info[key_ev].lat + lon_ev = ev_info[key_ev].lon + for key_t in ev_info[key_ev].t: + all_time.append(ev_info[key_ev].t[key_t][2]) + lat_st = st_info[ev_info[key_ev].t[key_t][0]].lat + lon_st = st_info[ev_info[key_ev].t[key_t][0]].lon + dis = cal_dis(lat_ev,lon_ev,lat_st,lon_st)**2 + all_dis.append(dis) + + return [np.array(all_dis),np.array(all_time)] + +# %% +# function: output the [cs_dt] of all data +def data_cs_dt(ev_info): + all_time = [] + for key_ev in ev_info: + for key_dt in ev_info[key_ev].cs_dt: + all_time.append(ev_info[key_ev].cs_dt[key_dt][3]) + + return np.array(all_time) + +# %% +# Function: data_dis_time_phase(ev_info, st_info, phase_list) Given a list of seismic phases, output the [epicentral distance, arrival time] for each phase. +def data_dis_time_phase(ev_info,st_info,phase_list): + all_dis = {} + all_time = {} + for phase in phase_list: + all_dis[phase] = [] + all_time[phase] = [] + + for key_ev in ev_info: + lat_ev = ev_info[key_ev].lat + lon_ev = ev_info[key_ev].lon + dep_ev = ev_info[key_ev].dep + for key_t in ev_info[key_ev].t: + phase = key_t.split("+")[1] + if (not phase in phase_list): + continue + + all_time[phase].append(ev_info[key_ev].t[key_t][2]) + lat_st = st_info[ev_info[key_ev].t[key_t][0]].lat + lon_st = st_info[ev_info[key_ev].t[key_t][0]].lon + ele_st = st_info[ev_info[key_ev].t[key_t][0]].ele + + dis = math.sqrt(cal_dis(lat_ev,lon_ev,lat_st,lon_st)**2 + (dep_ev+ele_st/1000)**2) + all_dis[phase].append(dis) + + for phase in phase_list: + all_dis[phase] = np.array(all_dis[phase]) + all_time[phase] = np.array(all_time[phase]) + + return [all_dis,all_time] + +# %% +# Function: data_lon_lat_dep_wt_ev(ev_info) Outputs the lines connecting station and earthquake for traveltime data as [line_x, line_y]. + +def data_line(ev_info,st_info): + line_x = [] + line_y = [] + + for key_ev in ev_info: + lat_ev = ev_info[key_ev].lat + lon_ev = ev_info[key_ev].lon + for key_t in ev_info[key_ev].t: + lat_st = st_info[ev_info[key_ev].t[key_t][0]].lat + lon_st = st_info[ev_info[key_ev].t[key_t][0]].lon + + line_x.append([lon_ev,lon_st]) + line_y.append([lat_ev,lat_st]) + + return [line_x,line_y] + +# %% [markdown] +# Functions: discard some data in ev_info and st_info based on selection criteria + +# %% +# Function: limit_ev_region(ev_info, lat1, lat2, lon1, lon2, dep1, dep2) Delete the earthquakes that are out of the specified region. + +def limit_ev_region(ev_info,lat_min,lat_max,lon_min,lon_max,dep_min,dep_max): + count_delete = 0 + + del_key_ev = [] + for key_ev in ev_info: + ev = ev_info[key_ev] + lat = ev.lat + lon = ev.lon + dep = ev.dep + + if (lat < min(lat_min,lat_max) or lat > max(lat_min,lat_max) \ + or lon < min(lon_min,lon_max) or lon > max(lon_min,lon_max) \ + or dep < min(dep_min,dep_max) or dep > max(dep_min,dep_max)): + del_key_ev.append(key_ev) + count_delete += 1 + + del_key_t = [] + for key_t in ev_info[key_ev].cr_dt: + name_ev2 = ev_info[key_ev].cr_dt[key_t][1] + lat2 = ev_info[name_ev2].lat + lon2 = ev_info[name_ev2].lon + dep2 = ev_info[name_ev2].dep + if (lat2 < min(lat_min,lat_max) or lat2 > max(lat_min,lat_max) \ + or lon2 < min(lon_min,lon_max) or lon2 > max(lon_min,lon_max) \ + or dep2 < min(dep_min,dep_max) or dep2 > max(dep_min,dep_max)): + + del_key_t.append(key_t) + + for key_t in del_key_t: + del ev_info[key_ev].cr_dt[key_t] + + ev_info[key_ev].Ncr_dt = len(ev_info[key_ev].cr_dt) + + for key_ev in del_key_ev: + del ev_info[key_ev] + + print("delete %d events out of the region, now %d earthquakes are retained within the study region"%(count_delete,len(ev_info))) + return ev_info + +# %% +# Function: limit_st_region(ev_info, st_info, lat1, lat2, lon1, lon2) Delete the stations that are out of the specified region. + +def limit_st_region(ev_info,st_info,lat1,lat2,lon1,lon2): + + for key_ev in ev_info: + # delete the station out of the region in the absolute traveltime data + del_key_t = [] + for key_t in ev_info[key_ev].t: + name_st = ev_info[key_ev].t[key_t][0] + lat_st = st_info[name_st].lat + lon_st = st_info[name_st].lon + if(lat_st < min(lat1,lat2) or lat_st > max(lat1,lat2) or lon_st < min(lon1,lon2) or lon_st > max(lon1,lon2)): + del_key_t.append(key_t) + + for key_t in del_key_t: + del ev_info[key_ev].t[key_t] + ev_info[key_ev].Nt = len(ev_info[key_ev].t) + + # delete the station out of the region in the common source differential traveltime data + del_key_t = [] + for key_t in ev_info[key_ev].cs_dt: + name_st1 = ev_info[key_ev].cs_dt[key_t][0] + lat_st1 = st_info[name_st1].lat + lon_st1 = st_info[name_st1].lon + + name_st2 = ev_info[key_ev].cs_dt[key_t][1] + lat_st2 = st_info[name_st2].lat + lon_st2 = st_info[name_st2].lon + if(lat_st1 < min(lat1,lat2) or lat_st1 > max(lat1,lat2) or lon_st1 < min(lon1,lon2) or lon_st1 > max(lon1,lon2) \ + or lat_st2 < min(lat1,lat2) or lat_st2 > max(lat1,lat2) or lon_st2 < min(lon1,lon2) or lon_st2 > max(lon1,lon2)): + del_key_t.append(key_t) + + for key_t in del_key_t: + del ev_info[key_ev].cs_dt[key_t] + ev_info[key_ev].Ncs_dt = len(ev_info[key_ev].cs_dt) + + # delete the station out of the region in the common receiver differential traveltime data + del_key_st = [] + for key_t in ev_info[key_ev].cr_dt: + name_st = ev_info[key_ev].cr_dt[key_t][0] + lat_st = st_info[name_st].lat + lon_st = st_info[name_st].lon + if(lat_st < min(lat1,lat2) or lat_st > max(lat1,lat2) or lon_st < min(lon1,lon2) or lon_st > max(lon1,lon2)): + del_key_st.append(key_t) + + for key_t in del_key_st: + del ev_info[key_ev].cr_dt[key_t] + ev_info[key_ev].Ncr_dt = len(ev_info[key_ev].cr_dt) + + return ev_info + + + +# %% +# Function: limit_epi_dis(ev_info, st_info, epi_dis1, epi_dis2) Delete the stations with epicentral distance in the range from epi_dis1 to epi_dis2. + +def limit_epi_dis(ev_info,st_info,epi_dis1,epi_dis2): + + for key_ev in ev_info: + ev = ev_info[key_ev] + + lat_ev = ev.lat + lon_ev = ev.lon + + # delete the absolute traveltime data + del_key_t = [] + for key_t in ev.t: + stname = ev.t[key_t][0] + lat_st = st_info[stname].lat + lon_st = st_info[stname].lon + dis = cal_dis(lat_ev, lon_ev, lat_st, lon_st) + if (dis > epi_dis1 and dis < epi_dis2): + del_key_t.append(key_t) + for key_t in del_key_t: + del ev.t[key_t] + ev.Nt = len(ev.t) + + # delete the common source differential traveltime data + del_key_t = [] + for key_t in ev.cs_dt: + for i in range(2): + stname = ev.t[key_t][i] + lat_st = st_info[stname].lat + lon_st = st_info[stname].lon + dis = cal_dis(lat_ev, lon_ev, lat_st, lon_st) + + if (dis > epi_dis1 and dis < epi_dis2): + del_key_t.append(key_t) + break + for key_t in del_key_t: + del ev.cs_dt[key_t] + ev.Ncs_dt = len(ev.cs_dt) + + # delete the common receiver differential traveltime data + del_key_t = [] + for key_t in ev.cr_dt: + stname = ev.cr_dt[key_t][0] + lat_st = st_info[stname].lat + lon_st = st_info[stname].lon + dis = cal_dis(lat_ev, lon_ev, lat_st, lon_st) + if (dis > epi_dis1 and dis < epi_dis2): + del_key_t.append(key_t) + + lat_ev2 = ev_info[ev.cr_dt[key_t][1]].lat + lon_ev2 = ev_info[ev.cr_dt[key_t][1]].lon + dis = cal_dis(lat_ev2, lon_ev2, lat_st, lon_st) + if (dis > epi_dis1 and dis < epi_dis2): + del_key_t.append(key_t) + + for key_t in del_key_t: + del ev.cr_dt[key_t] + ev.Ncr_dt = len(ev.cr_dt) + + + ev_info[key_ev] = ev + + return ev_info + +# %% +# Function: limit_data_residual(ev_info, st_info, slope, intercept, up, down) Limit the data within the range defined by the line time = dis * slope + intercept and the bounds up and down. + +# remove outliers, only retain data satisfying: slope * dis + intercept + down < time < slope * dis + intercept + up +def limit_data_residual(ev_info,st_info,slope,intercept,up,down): + for key_ev in ev_info: + lat_ev = ev_info[key_ev].lat + lon_ev = ev_info[key_ev].lon + dep_ev = ev_info[key_ev].dep + del_key_t = [] + for key_t in ev_info[key_ev].t: + name_st = ev_info[key_ev].t[key_t][0] + lat_st = st_info[name_st].lat + lon_st = st_info[name_st].lon + ele_st = st_info[name_st].ele + dis = math.sqrt(cal_dis(lat_ev,lon_ev,lat_st,lon_st)**2 + (dep_ev+ele_st/1000)**2) + residual = ev_info[key_ev].t[key_t][2] - (slope*dis+intercept) + + if (residual < down or residual > up): + del_key_t.append(key_t) + + for key_t in del_key_t: + del ev_info[key_ev].t[key_t] + + for key_ev in ev_info: + ev_info[key_ev].Nt = len(ev_info[key_ev].t) + + return ev_info + + + +# %% +# Function: limit_data_phase(ev_info, phase_list) Retain only the specified seismic phases. + +def limit_data_phase(ev_info,phase_list): + for key_ev in ev_info: + # process the absolute traveltime data + new_t = {} + for key_t in ev_info[key_ev].t: + phase = ev_info[key_ev].t[key_t][1] + if phase in phase_list: + new_t[key_t] = ev_info[key_ev].t[key_t] + + ev_info[key_ev].t = new_t + ev_info[key_ev].Nt = len(ev_info[key_ev].t) + + # process the common source differential traveltime data + new_t = {} + for key_t in ev_info[key_ev].cs_dt: + phase = ev_info[key_ev].cs_dt[key_t][2] + phase = phase.split(",")[0] + if phase in phase_list: + new_t[key_t] = ev_info[key_ev].cs_dt[key_t] + + ev_info[key_ev].cs_dt = new_t + ev_info[key_ev].Ncs_dt = len(ev_info[key_ev].cs_dt) + + # process the common receiver differential traveltime data + new_t = {} + for key_t in ev_info[key_ev].cr_dt: + phase = ev_info[key_ev].cr_dt[key_t][2] + phase = phase.split(",")[0] + if phase in phase_list: + new_t[key_t] = ev_info[key_ev].cr_dt[key_t] + + ev_info[key_ev].cr_dt = new_t + ev_info[key_ev].Ncr_dt = len(ev_info[key_ev].cr_dt) + + return ev_info + +# %% +# Function: limit_min_Nt(min_Nt_thd, ev_info) Delete the earthquakes with the number of data less than min_Nt_thd. + +def limit_min_Nt(min_Nt_thd, ev_info): + Nev = len(ev_info) + + del_key_ev = [] + for key_ev in ev_info: + if(ev_info[key_ev].Nt < min_Nt_thd): + del_key_ev.append(key_ev) + + for key_ev in del_key_ev: + del ev_info[key_ev] + + print("Original data set has %d earthquakes, %d earthquakes are deleted, %d earthquakes are retained"%(Nev,len(del_key_ev),len(ev_info))) + + return ev_info + +# %% +# Function: limit_azi_gap(gap_thd) Calculate the azimuthal gap for all events and delete events with a gap greater than gap_thd. +def limit_azi_gap(gap_thd,ev_info,st_info): + Nev = len(ev_info) + + del_key_ev = [] + for key_ev in ev_info: + ev = ev_info[key_ev] + gap = cal_azi_gap(ev,st_info) + if (gap > gap_thd): + del_key_ev.append(key_ev) + else: + ev_info[key_ev].tag["azi_gap"] = gap + for key_ev in del_key_ev: + del ev_info[key_ev] + + print("Original data set has %d earthquakes, %d earthquakes are deleted, %d earthquakes are retained"%(Nev,len(del_key_ev),len(ev_info))) + + return ev_info + +# Function: cal_azi_gap(ev, st_info) Calculate the azimuthal gap of a single earthquake. +def cal_azi_gap(ev,st_info): + azi_all = [] + lat_ev = ev.lat + lon_ev = ev.lon + stlist = {} + for key in ev.t: + stname = ev.t[key][0] + if (not stname in stlist): + lat_st = st_info[stname].lat + lon_st = st_info[stname].lon + azi = cal_azimuth(lat_ev, lon_ev, lat_st, lon_st) + azi_all.append(azi) + stlist[stname] = 1 + + azi_all.sort() + if(len(azi_all) < 2): + return 360.0 + else: + gap = 0.0 + for i in range(len(azi_all)-1): + gap = max(gap,azi_all[i+1] - azi_all[i]) + gap = max(gap,azi_all[0] + 360 - azi_all[-1]) + return gap + + + +# %% +# Function: limit_earthquake_decluster_Nt(ev_info, dlat, dlon, ddep, Top_N) Divide the region into several subdomains, sort by the number of arrival times, and retain only the top Top_N earthquakes with the most arrival times in each box. +# option 3, declustering. Divide the region into several subdomains, retain the Top N earthquakes in terms of the number of arrival times in each subdomain. +def limit_earthquake_decluster_Nt(ev_info,dlat,dlon,ddep,Top_N): + # subdivide earthquakes into different subdomains + [ev_info,tag2name] = tag_event_cluster(dlat,dlon,ddep,ev_info) + + # sort earthquakes in the same subdomain + # Sort the quality of earthquakes within each tag based on the number of arrivals. + tag2name = sort_cluster_Nt(ev_info, tag2name) + + # only retain Top_N earthquakes in each subdomain + # Within each tag, prioritize selecting the top Top_N earthquakes. + [ev_info,tag2name] = limit_decluster(ev_info, tag2name,Top_N) + + return ev_info + + + +# Function: tag_event_cluster(size_lat, size_lon, size_dep, ev_info) Subdivide the study area, assign each earthquake to a subregion, and place it in a tag. +def tag_event_cluster(size_lat,size_lon,size_dep,ev_info): + tag2name = {} + for key_ev in ev_info: + name = ev_info[key_ev].name + lat = ev_info[key_ev].lat + lon = ev_info[key_ev].lon + dep = ev_info[key_ev].dep + tag = "%d_%d_%d"%(math.floor(lon/size_lon),math.floor(lat/size_lat),math.floor(dep/size_dep)) + ev_info[key_ev].tag["cluster"] = tag + + if (tag in tag2name): + tag2name[tag].append(name) + else: + tag2name[tag] = [] + tag2name[tag].append(name) + + return [ev_info,tag2name] + +# Function: sort_cluster_Nt(ev_info, tag2name) Sort the quality of earthquakes within each tag based on the number of arrivals. +def sort_cluster_Nt(ev_info, tag2name): + for key_tag in tag2name: + names_ev = tag2name[key_tag] + Nt = [] + for key_ev in names_ev: + Nt.append(len(ev_info[key_ev].t)) + + # Sort the earthquakes within each tag based on the number of arrivals. + sorted_Nt = sorted(enumerate(Nt), key=lambda x: x[1], reverse=True) + tag2name[key_tag] = [] + for index, Nt in sorted_Nt: + tag2name[key_tag].append(names_ev[index]) + + return tag2name + +# Function: limit_cluster(ev_info, tag2name, Max) Prioritize selecting the top Max earthquakes within each tag. +def limit_decluster(ev_info, tag2name, Max): + del_key_ev = [] + for key_tag in tag2name: + names_ev = tag2name[key_tag] + + if(len(names_ev) > Max): + tag2name[key_tag] = names_ev[0:Max] + for i in range(Max,len(names_ev)): # Delete earthquakes that exceed the threshold in the sorted list. + del_key_ev.append(names_ev[i]) + + for key_ev in del_key_ev: + del ev_info[key_ev] + + return [ev_info,tag2name] + + + +# %% [markdown] +# Functions: assign weights to earthquakes, stations, and data + +# %% +# Function: box_weighting_ev(ev_info, dlat, dlon, ddep) Assign box-weight to the earthquakes. +def box_weighting_ev(ev_info,dlon,dlat,ddep): + + # categorization + distribute = {} + all_tag_wt = {} + + for key_ev in ev_info: + lat_id = math.floor((ev_info[key_ev].lat) / dlat) + lon_id = math.floor((ev_info[key_ev].lon) / dlon) + dep_id = math.floor((ev_info[key_ev].dep) / ddep) + + tag = '%d_%d_%d'%(lat_id,lon_id,dep_id) + if (tag in distribute): + distribute[tag] += 1 + else: + distribute[tag] = 1 + + max_weight = 0 + for tag in distribute: + all_tag_wt[tag] = 1.0/math.sqrt(distribute[tag]) + max_weight = max(max_weight,all_tag_wt[tag]) + + for key_ev in ev_info: + lat_id = math.floor((ev_info[key_ev].lat) / dlat) + lon_id = math.floor((ev_info[key_ev].lon) / dlon) + dep_id = math.floor((ev_info[key_ev].dep) / ddep) + + tag = '%d_%d_%d'%(lat_id,lon_id,dep_id) + + ev_info[key_ev].tag["weight"] = all_tag_wt[tag]/max_weight + + return ev_info + +# %% +# Function: geographical_weighting_ev_rough(ev_info, dlat, dlon, ddep) Assign geographical weighting to the earthquakes roughly. +def geographical_weighting_ev_rough(ev_info,dlat,dlon,ddep,coefficient = 0.5): + + # categorization + distribute = {} + all_tag_wt = {} + + for key_ev in ev_info: + lat_id = int(ev_info[key_ev].lat/dlat) + lon_id = int(ev_info[key_ev].lon/dlat) + dep_id = int(ev_info[key_ev].dep/ddep) + + + tag = '%d_%d_%d'%(lat_id,lon_id,dep_id) + if (tag in distribute): + distribute[tag] += 1 + else: + distribute[tag] = 1 + + # Calculate the weight of each category. + delta0 = 0 + for tag1 in distribute: + tmp1 = tag1.split('_') + # evlat1 = float(tmp1[0])*dlat; evlon1 = float(tmp1[1])*dlon; evdep1 = float(tmp1[2])*ddep + + for tag2 in distribute: + tmp2 = tag2.split('_') + # evlat2 = float(tmp2[0])*dlat; evlon2 = float(tmp2[1])*dlon; evdep2 = float(tmp2[2])*ddep + + # distance of id + delta_tp = math.sqrt((int(tmp1[0]) - int(tmp2[0]))**2 + (int(tmp1[1]) - int(tmp2[1]))**2 + (int(tmp1[2]) - int(tmp2[2]))**2) + delta0 = delta0 + distribute[tag1] * distribute[tag2] * delta_tp + + delta0 = delta0/(len(ev_info)**2) * coefficient + + max_weight = 0.0 + for tag1 in distribute: + tmp1 = tag1.split('_') + # evlat1 = float(tmp1[0])*dlat; evlon1 = float(tmp1[1])*dlon; evdep1 = float(tmp1[2])*ddep + + weight = 0 + for tag2 in distribute: + tmp2 = tag2.split('_') + # evlat2 = float(tmp2[0])*dlat; evlon2 = float(tmp2[1])*dlon; evdep2 = float(tmp2[2])*ddep + + delta_tp = math.sqrt((int(tmp1[0]) - int(tmp2[0]))**2 + (int(tmp1[1]) - int(tmp2[1]))**2 + (int(tmp1[2]) - int(tmp2[2]))**2) + weight = weight + math.exp(-(delta_tp/delta0)**2) * distribute[tag2] + + all_tag_wt[tag1] = (1.0/weight) + max_weight = max(max_weight,1.0/weight) + + # Assign weights to each earthquake based on its tag. + for key_ev in ev_info: + lat_id = int(ev_info[key_ev].lat/dlat) + lon_id = int(ev_info[key_ev].lon/dlon) + dep_id = int(ev_info[key_ev].dep/ddep) + + tag = '%d_%d_%d'%(lat_id,lon_id,dep_id) + + ev_info[key_ev].tag["weight"] = all_tag_wt[tag]/max_weight + return ev_info + + +# %% +# Function: box_weighting_st(ev_info, st_info, dlat, dlon) Assign geographical weighting to the stations roughly. +def box_weighting_st(ev_info,st_info,dlon,dlat): + + [lon_ev,lat_ev,dep_ev,wt_ev] = data_lon_lat_dep_wt_ev(ev_info) + + # Integrate all involved stations. + wt_st = {} + name_st = {} + for key_ev in ev_info: + for key_t in ev_info[key_ev].t: + name_rec = ev_info[key_ev].t[key_t][0] + wt_st[name_rec] = -1.0 + name_st[name_rec] = 1 + + # categorization + distribute = {} + all_tag_wt = {} + + # Count the number of stations in each subdomain. + for key_st in name_st: + lat_id = math.floor((st_info[key_st].lat) / dlat) + lon_id = math.floor((st_info[key_st].lon) / dlon) + + tag = '%d_%d'%(lat_id,lon_id) + if (tag in distribute): + distribute[tag] += 1 + else: + distribute[tag] = 1 + + max_weight = 0 + for tag in distribute: + all_tag_wt[tag] = 1.0/math.sqrt(distribute[tag]) + max_weight = max(max_weight,all_tag_wt[tag]) + + # Assign weights to each station based on its tag. + for key_st in name_st: + lat_id = math.floor((st_info[key_st].lat) / dlat) + lon_id = math.floor((st_info[key_st].lon) / dlon) + tag = '%d_%d'%(lat_id,lon_id) + wt_st[key_st] = all_tag_wt[tag]/max_weight + + # modify weight tag in st_info + for key_t in wt_st: + st_info[key_t].tag["weight"] = wt_st[key_t] + + # modify weight of abs data ev_info + for key_ev in ev_info: + for key_t in ev_info[key_ev].t: + name_rec = ev_info[key_ev].t[key_t][0] + ev_info[key_ev].t[key_t][3] = wt_st[name_rec] + + return [ev_info,st_info] + + +# %% +# Function: geographical_weighting_st(ev_info,st_info) Assign geographical weighting to the stations roughly. +def geographical_weighting_st(ev_info,st_info,coefficient = 0.5): + + # Integrate all involved stations. + wt_st = {} + name_st = {} + for key_ev in ev_info: + for key_t in ev_info[key_ev].t: + name_rec = ev_info[key_ev].t[key_t][0] + wt_st[name_rec] = -1.0 + name_st[name_rec] = 1 + + # Calculate the weight of each station. + delta0 = 0 + for key_st1 in name_st: + stlat1 = st_info[key_st1].lat + stlon1 = st_info[key_st1].lon + + for key_st2 in name_st: + stlat2 = st_info[key_st2].lat + stlon2 = st_info[key_st2].lon + + delta_tp = cal_dis(stlat1,stlon1,stlat2,stlon2) + delta0 = delta0 + delta_tp + + delta0 = delta0/(len(wt_st)**2)*coefficient + + max_weight = 0.0 + for key_st1 in name_st: + stlat1 = st_info[key_st1].lat + stlon1 = st_info[key_st1].lon + + weight = 0 + for key_st2 in name_st: + stlat2 = st_info[key_st2].lat + stlon2 = st_info[key_st2].lon + + delta_tp = cal_dis(stlat1,stlon1,stlat2,stlon2) + weight = weight + math.exp(-(delta_tp/delta0)**2) + + wt_st[key_st1] = (1.0/weight) + max_weight = max(max_weight,1.0/weight) + + for key_st1 in wt_st: + wt_st[key_st1] = wt_st[key_st1]/max_weight + + # Add weight to each data point in the earthquakes. + for key_ev in ev_info: + for key_t in ev_info[key_ev].t: + name_rec = ev_info[key_ev].t[key_t][0] + if (not name_rec in wt_st): + ValueError("The station of the data is not in the calculation list") + + if (len(ev_info[key_ev].t[key_t])==3): + ev_info[key_ev].t[key_t].append(wt_st[name_rec]) + elif (len(ev_info[key_ev].t[key_t])==4): + ev_info[key_ev].t[key_t][3] = wt_st[name_rec] + else: + ValueError("Error in the weight information of the absolute traveltime data") + + # modify weight tag in st_info + for key_t in wt_st: + st_info[key_t].tag["weight"] = wt_st[key_t] + + # modify weight of abs data ev_info + for key_ev in ev_info: + for key_t in ev_info[key_ev].t: + name_rec = ev_info[key_ev].t[key_t][0] + ev_info[key_ev].t[key_t][3] = wt_st[name_rec] + + return [ev_info,st_info] + + +# %% [markdown] +# Function: add noise into data + +# %% +# Function:assign_gaussian_noise(): +def assign_gaussian_noise(ev_info,sigma): + + # Record which seismic phases correspond to each station. + st2phase = {} # Station name -> [Keys of absolute arrival time data related to this station] + + + for key_ev in ev_info: + # Absolute arrival time noise + for key_t in ev_info[key_ev].t: + stname = ev_info[key_ev].t[key_t][0] + ev_info[key_ev].t[key_t][2] = ev_info[key_ev].t[key_t][2] + np.random.normal(0,sigma) + if(stname in st2phase): + st2phase[stname].append(key_t) + else: + st2phase[stname] = [key_t] + + for key_ev in ev_info: + # Double-difference arrival time noise + for key_dt in ev_info[key_ev].cs_dt: + stname1 = ev_info[key_ev].cs_dt[key_dt][0] + stname2 = ev_info[key_ev].cs_dt[key_dt][1] + t1 = -999 + t2 = -999 + # Search for the arrival time of the data. + if (stname1 in st2phase): + for key_t in st2phase[stname1]: + if (key_t in ev_info[key_ev].t): + t1 = ev_info[key_ev].t[key_t][2] + break + if (stname2 in st2phase): + for key_t in st2phase[stname2]: + if (key_t in ev_info[key_ev].t): + t2 = ev_info[key_ev].t[key_t][2] + break + + if (t1 == -999 or t2 == -999): + # If there is no absolute arrival time data, the double-difference data residuals increase by a factor of sqrt(2) in noise. + ev_info[key_ev].cs_dt[key_dt][3] = ev_info[key_ev].cs_dt[key_dt][3] + np.random.normal(0,sigma*np.sqrt(2)) + print('no data: ', key_ev, key_dt) + else: + # If there is absolute arrival time data, the double-difference data is obtained by subtraction. + ev_info[key_ev].cs_dt[key_dt][3] = t1 - t2 + + # Common station double-difference arrival time + for key_dt in ev_info[key_ev].cr_dt: + stname = ev_info[key_ev].cr_dt[key_dt][0] + key_ev2 = ev_info[key_ev].cr_dt[key_dt][1] + + t1 = -999 + t2 = -999 + # Search for the arrival time of the data. + if (stname in st2phase): + for key_t in st2phase[stname]: + if (key_t in ev_info[key_ev].t): + t1 = ev_info[key_ev].t[key_t][2] + break + else: + print('not found 1: ', key_ev, key_t) + + for key_t in st2phase[stname]: + if (key_t in ev_info[key_ev2].t): + t2 = ev_info[key_ev2].t[key_t][2] + break + else: + print('not found 2: ', key_ev, key_t) + + if (t1 == -999 or t2 == -999): + # If there is no absolute arrival time data, the double-difference data residuals increase by a factor of sqrt(2) in noise. + ev_info[key_ev].cr_dt[key_dt][3] = ev_info[key_ev].cr_dt[key_dt][3] + np.random.normal(0,sigma*np.sqrt(2)) + print('no data: ', key_ev, key_dt) + else: + # If there is absolute arrival time data, the double-difference data is obtained by subtraction. + ev_info[key_ev].cr_dt[key_dt][3] = t1 - t2 + + return ev_info + +# %% +# Function:assign_uniform_noise_to_ev(): +def assign_uniform_noise_to_ev(ev_info, range_lat, range_lon, range_dep, range_time): + + # Loop through all earthquakes and assign noise to them. + ev_noise = {} # Name of the earthquake -> noise of [lat,lon,dep,ortime] + # loop list of earthquakes + for key_ev in ev_info: + evname = key_ev + if (evname in ev_noise): + print("error: repeated earthquake name") + exit() + else: + # generate noise + ev_noise[evname] = np.random.uniform(-1,1,4) * np.array([range_lat,range_lon,range_dep,range_time]) + + # Add noise to each data point. + for key_ev in ev_info: + + # Absolute arrival time noise + for key_t in ev_info[key_ev].t: + + ev_info[key_ev].t[key_t][2] = ev_info[key_ev].t[key_t][2] - ev_noise[key_ev][3] + + + # Double-difference arrival time noise (double-difference arrival time remains unchanged) + + # Common station double-difference arrival time + for key_dt in ev_info[key_ev].cr_dt: + key_ev2 = ev_info[key_ev].cr_dt[key_dt][1] + + if (key_ev2 in ev_noise): + ev_info[key_ev].cr_dt[key_dt][3] = ev_info[key_ev].cr_dt[key_dt][3] - ev_noise[key_ev][3] + ev_noise[key_ev2][3] + else: + print("earthquake %s is not included in ev_list"%(key_ev2)) + ev_noise[key_ev2] = np.random.uniform(-1,1,4) * np.array([range_lat,range_lon,range_dep,range_time]) + ev_info[key_ev].cr_dt[key_dt][3] = ev_info[key_ev].cr_dt[key_dt][3] - ev_noise[key_ev][3] + ev_noise[key_ev2][3] + + + # Add noise to each earthquake. + for key_ev in ev_noise: + ev_info[key_ev].lat = ev_info[key_ev].lat + ev_noise[key_ev][0] + ev_info[key_ev].lon = ev_info[key_ev].lon + ev_noise[key_ev][1] + ev_info[key_ev].dep = abs(ev_info[key_ev].dep + ev_noise[key_ev][2]) + ev_info[key_ev].ortime = ev_info[key_ev].ortime + ev_noise[key_ev][3] + + + return ev_info + +# %% [markdown] +# Functions: generate differential traveltime + +# %% +# Function: generate_cs_dif(ev_info, st_info, dis_thd, azi_thd) Generate double-difference arrival times from absolute arrival times, with inter-station distance less than dis_thd and azimuthal difference less than azi_thd. +# function: generate common source differential traveltime data from absolute traveltime data, the stations separation is less than dis_thd, the azimuth difference is less than azi_thd +def generate_cs_dif(ev_info,st_info,dis_thd,azi_thd): + count_t = 0 + count_cs_dt = 0 + + for key_ev in ev_info: + ev = ev_info[key_ev] + + lat_ev = ev.lat + lon_ev = ev.lon + + # traverse all arrival times + name_st_list = [] # names of stations + t_list = [] # traveltime + wt_list = [] # weight + for key_t in ev.t: + name_st_list.append(ev.t[key_t][0]) + t_list.append(ev.t[key_t][2]) + wt_list.append(ev.t[key_t][3]) + count_t += 1 + + # search for possible double-difference arrival times + for id_st1 in range(len(name_st_list)-1): + name_st1 = name_st_list[id_st1] + lat_st1 = st_info[name_st1].lat + lon_st1 = st_info[name_st1].lon + t_st1 = t_list[id_st1] + wt_st1 = wt_list[id_st1] + + for id_st2 in range(id_st1+1,len(name_st_list)): + name_st2 = name_st_list[id_st2] + lat_st2 = st_info[name_st2].lat + lon_st2 = st_info[name_st2].lon + t_st2 = t_list[id_st2] + wt_st2 = wt_list[id_st2] + + dis = cal_dis(lat_st1,lon_st1,lat_st2,lon_st2) + azi_st1 = cal_azimuth(lat_ev,lon_ev,lat_st1,lon_st1) + azi_st2 = cal_azimuth(lat_ev,lon_ev,lat_st2,lon_st2) + + azi_dif = abs(azi_st1 - azi_st2) + + if(dis < dis_thd and (azi_dif < azi_thd or (360-azi_dif) < azi_thd )): + ev.cs_dt["%s+%s+%s"%(name_st1,name_st2,"P,cs")] = [name_st1,name_st2,"P,cs",t_st1-t_st2,(wt_st1+wt_st2)/2] + count_cs_dt += 1 + + ev_info[key_ev].Ncs_dt = len(ev.cs_dt) + + print('we generate %d common source differential traveltimes from %s absolute traveltimes'%(count_cs_dt,count_t)) + return ev_info + + +# %% +# Function: generate_cr_dif(ev_info, st_info, dis_thd) Generate common station double-difference arrival times from absolute arrival times, with inter-event distance less than dis_thd. +# Function: generate common receiver differential traveltime data from absolute traveltime data, the earthquake separation is less than dis_thd +def generate_cr_dif(ev_info,st_info,dis_thd,azi_thd): + + # Construct mapping:rec2src[name_ev] -> {name_st: [name_ev, name_st, t, wt]; name_st: [name_ev, name_st, t, wt]; ...} + rec2src = build_rec_src_map(ev_info,dis_thd) + print("rec to src map generation finished") + + # Construct double-difference data association mapping:rec2src_pair[key_t] + rec2src_pair = build_rec_src_pair_map(rec2src) + print("rec to src_pair map generation finished") + + for key_t in rec2src_pair: + name_st = key_t.split('+')[0] + lat_st = st_info[name_st].lat + lon_st = st_info[name_st].lon + + for ev_tag in rec2src_pair[key_t]: + name_ev1 = rec2src_pair[key_t][ev_tag][0] + lat_ev1 = ev_info[name_ev1].lat + lon_ev1 = ev_info[name_ev1].lon + dep_ev1 = ev_info[name_ev1].dep + + name_ev2 = rec2src_pair[key_t][ev_tag][1] + lat_ev2 = ev_info[name_ev2].lat + lon_ev2 = ev_info[name_ev2].lon + dep_ev2 = ev_info[name_ev2].dep + + dis_xy = cal_dis(lat_ev1,lon_ev1,lat_ev2,lon_ev2) + dis_z = abs(dep_ev1 - dep_ev2) + dis = math.sqrt(dis_xy**2 + dis_z**2) + if(dis > dis_thd): # limit of the distance between two earthquakes + continue + + azi1 = cal_azimuth(lat_ev1,lon_ev1,lat_st,lon_st) + azi2 = cal_azimuth(lat_ev2,lon_ev2,lat_st,lon_st) + azi_dif = abs(azi1 - azi2) + + if(azi_dif > azi_thd and (360-azi_dif) > azi_thd): # limit of the azimuth difference between two earthquakes + continue + + t_ev1 = ev_info[name_ev1].t[key_t][2] + t_ev2 = ev_info[name_ev2].t[key_t][2] + wt_ev1 = ev_info[name_ev1].t[key_t][3] * ev_info[name_ev1].tag["weight"] + wt_ev2 = ev_info[name_ev2].t[key_t][3] * ev_info[name_ev2].tag["weight"] + # The actual data weight is wt_ev1 + wt_ev2, but in TomoATT calculations, we need to divide it by ev_info[name_ev1].tag["weight"]. + wt = (wt_ev1 + wt_ev2)/2/ev_info[name_ev1].tag["weight"] + + ev_info[name_ev1].cr_dt["%s+%s+%s"%(name_st,name_ev2,"P,cr")] = [name_st,name_ev2,"P,cr",t_ev1-t_ev2,wt] + + # Count the number of double-difference data points. + count_cr_dt = 0 + count_t = 0 + for key_ev in ev_info: + ev_info[key_ev].Ncr_dt = len(ev_info[key_ev].cr_dt) + count_cr_dt += ev_info[key_ev].Ncr_dt + count_t += ev_info[key_ev].Nt + + print('we generate %d common receiver differential traveltimes from %s absolute traveltimes'%(count_cr_dt,count_t)) + + return ev_info + +# Construct mapping: rec2src = {key_t: dict_tag; key_t: dict_tag; ...} +# dict_tag = {tag: list_name_ev; tag: list_name_ev; ...} +# list_name_ev = [name_ev1, name_ev2, ...] +# Assign earthquakes to different subregions based on their locations. The subregion size is dlat * dlon * ddep. When performing common station double-difference calculations, only earthquake pairs within the same subregion or adjacent subregions will be considered. +def build_rec_src_map(ev_info,dis_thd): + rec2src = {} + for key_ev in ev_info: + name_ev = ev_info[key_ev].name + lat = ev_info[key_ev].lat + lon = ev_info[key_ev].lon + dep = ev_info[key_ev].dep + tag_dep = math.floor(dep/dis_thd) + tag_lat = math.floor(lat/180*math.pi*R_earth/dis_thd) + tag_lon = math.floor(lon/180*math.pi*R_earth*math.cos(lat)/dis_thd) + tag = "%d_%d_%d"%(tag_lon,tag_lat,tag_dep) + + + for key_t in ev_info[key_ev].t: + + # create dictionary + if (not key_t in rec2src): + rec2src[key_t] = {tag:[]} + elif (not tag in rec2src[key_t]): + rec2src[key_t][tag] = [] + + # Add data + rec2src[key_t][tag].append(name_ev) + + return rec2src + +# Function: generate_adjacent_tag(tag) Generate tags surrounding the given tag. +def generate_adjacent_tag(tag): # Excluding the tag itself. + adjacent_tag_list = [] + tmp = tag.split('_') + tag_lon = int(tmp[0]) + tag_lat = int(tmp[1]) + tag_dep = int(tmp[2]) + + for i in range(-1,2): + for j in range(-1,2): + for k in range(-1,2): + if(i == 0 and j == 0 and k == 0): + continue + adjacent_tag_list.append("%d_%d_%d"%(tag_lon+i,tag_lat+j,tag_dep+k)) + + return adjacent_tag_list + + +# construct mapping:rec2src_pair +def build_rec_src_pair_map(rec2src): + rec2src_pair = {} + + for key_t in rec2src: + rec2src_pair[key_t] = {} + + for tag in rec2src[key_t]: + name_ev_list1 = rec2src[key_t][tag] + + name_ev_list2 = rec2src[key_t][tag] + adjacent_tag_list = generate_adjacent_tag(tag) + for adjacent_tag in adjacent_tag_list: + if (adjacent_tag in rec2src[key_t]): # If the surrounding tag's region has earthquakes, add them to the earthquake list. + name_ev_list2 = name_ev_list2 + rec2src[key_t][adjacent_tag] + + # Find possible earthquake pairs. + for id_ev1 in range(len(name_ev_list1)-1): + name_ev1 = name_ev_list1[id_ev1] + + for id_ev2 in range(id_ev1+1,len(name_ev_list2)): # Starting from id_ev1 + 1 already excludes duplicate earthquakes within the tag. + name_ev2 = name_ev_list2[id_ev2] + + ev_tag1 = "%s+%s"%(name_ev1,name_ev2) + ev_tag2 = "%s+%s"%(name_ev2,name_ev1) + + if(ev_tag1 in rec2src_pair[key_t] or ev_tag2 in rec2src_pair[key_t]): + continue + + rec2src_pair[key_t][ev_tag1] = [name_ev1,name_ev2] + + + return rec2src_pair + +# %% [markdown] +# Functions: read and write src_rec.dat file + +# %% +# Function: reorder_src(ev) Reorder the earthquake IDs. If the earthquake has no data, the ID is -999. +def reorder_src(ev_info): + + ev_id = 0 + for key_ev in ev_info: + ev = ev_info[key_ev] + + if(ev.Nt + ev.Ncs_dt + ev.Ncr_dt == 0): + ev.id = -999 + else: + ev_info[key_ev].id = ev_id + ev_id += 1 + + return ev_info + + +# %% +# Function: read_src_rec_file(fname) Read the src_rec.dat file. +# +def read_src_rec_file(fname): + ev_info = {} + st_info = {} + + tmp_ev_info = {} + + doc = open(fname,'r') + doc_input = doc.readlines() + doc.close() + + cc = 0 + for info in doc_input: + tmp=info.split() + if (cc == 0): # event line + ev = Event() + # 1 2000 1 2 20 28 37.270 38.2843 39.0241 11.00 3.60 8 1725385 + # id_ev = int(tmp[0]) + ev.id = int(tmp[0]) + year = int(tmp[1]) + month = int(tmp[2]) + day = int(tmp[3]) + hour = int(tmp[4]) + minute = int(tmp[5]) + second = float(tmp[6]) + ev.ortime = UTCDateTime(year,month,day,hour,minute,0) + second + ev.lat = float(tmp[7]) + ev.lon = float(tmp[8]) + ev.dep = float(tmp[9]) + ev.mag = float(tmp[10]) + ev.Nt = 0 + ev.Ncs_dt = 0 + ev.Ncr_dt = 0 + ev.t = {} + ev.cs_dt = {} + ev.cr_dt = {} + ndata = int(tmp[11]) + name_ev = tmp[12] + ev.name = name_ev + cc += 1 + try: + ev.tag["weight"] = float(tmp[13]) + except: + pass + + if (ndata == 0): + cc = 0 + ev_info[name_ev] = ev + + else: # data line + # 1 1 MYA 38.3261 38.4253 1050.0000 P 52.46 6.630 weight + if(len(tmp) < 10): # absolue traveltime data + name_st = tmp[2] + phase = tmp[6] + if (phase == "PG"): + phase = "Pg" + if (phase == "PB"): + phase = "Pb" + if (phase == "PN"): + phase = "Pn" + + if (not name_st in st_info): + st = Station() + st.name = name_st + st.id = float(tmp[1]) + st.lat = float(tmp[3]) + st.lon = float(tmp[4]) + st.ele = float(tmp[5]) + st_info[name_st] = st + + time = float(tmp[7]) + if(len(tmp) == 9): + weight = float(tmp[8]) + else: + weight = 1.0 + ev.t["%s+%s"%(name_st,phase)] = [name_st,phase,time,weight] + ev.Nt += 1 + + else: # differential traveltime data + phase = tmp[11] + if (phase.__contains__("cr")): # common receiver differential traveltime + # evid stid1 stname1 lat1 lon1 eve1 evid2 evname2 lat2 lon2 dep2 phase,cr diftime weight + + name_st1 = tmp[2] + if (not name_st1 in st_info): # add station to the station list + st = Station() + st.name = name_st1 + st.id = float(tmp[1]) + st.lat = float(tmp[3]) + st.lon = float(tmp[4]) + st.ele = float(tmp[5]) + st_info[name_st1] = st + + name_ev2 = tmp[7] + # add earthquake to the temp earthquake list + ev2 = Event() + ev2.name = name_ev2 + ev2.id = float(tmp[6]) + ev2.lat = float(tmp[8]) + ev2.lon = float(tmp[9]) + ev2.dep = float(tmp[10]) + tmp_ev_info[name_ev2] = ev2 + + + dif_time = float(tmp[12]) + if(len(tmp) == 14): + weight = float(tmp[13]) + else: + weight = 1.0 + ev.cr_dt["%s+%s+%s"%(name_st1,name_ev2,phase)] = [name_st1,name_ev2,phase,dif_time,weight] + ev.Ncr_dt += 1 + + else: # common source differential traveltime + # evid stid1 stname1 lat1 lon1 eve1 stid2 stname2 lat2 lon2 ele2 phase,cs diftime weight + + name_st1 = tmp[2] + if (not name_st1 in st_info): + st = Station() + st.name = name_st1 + st.id = len(st_info) + st.lat = float(tmp[3]) + st.lon = float(tmp[4]) + st.ele = float(tmp[5]) + st_info[name_st1] = st + + name_st2 = tmp[7] + if (not name_st2 in st_info): + st = Station() + st.name = name_st2 + st.id = float(tmp[6]) + st.lat = float(tmp[8]) + st.lon = float(tmp[9]) + st.ele = float(tmp[10]) + st_info[name_st2] = st + + dif_time = float(tmp[12]) + if(len(tmp) == 14): + weight = float(tmp[13]) + else: + weight = 1.0 + ev.cs_dt["%s+%s+%s"%(name_st1,name_st2,phase)] = [name_st1,name_st2,phase,dif_time,weight] + ev.Ncs_dt += 1 + + if (cc == ndata): # end of the event data + cc = 0 + ev_info[name_ev] = ev + else: + cc += 1 + + # Add earthquakes from the temporary earthquake list to the main earthquake list. + for key_ev in tmp_ev_info: + if (not key_ev in ev_info): + ev_info[key_ev] = tmp_ev_info[key_ev] + + return [ev_info,st_info] + +# %% +# Function: write_src_rec_file(fname, ev_info, st_info) Output the src_rec.dat file. +def write_src_rec_file(fname,ev_info,st_info): + ev_info = reorder_src(ev_info) + doc_src_rec = open(fname,'w') + + min_lat = 9999 + max_lat = -9999 + min_lon = 9999 + max_lon = -9999 + min_dep = 9999 + max_dep = -9999 + + record_ev = {} + record_st = {} + Nt_total = 0 + Ncs_dt_total = 0 + Ncr_dt_total = 0 + + for key_ev in ev_info: + ev = ev_info[key_ev] + evid = ev.id + year = ev.ortime.year + month = ev.ortime.month + day = ev.ortime.day + hour = ev.ortime.hour + minute = ev.ortime.minute + second = ev.ortime.second + msec = ev.ortime.microsecond + lat_ev = ev.lat + lon_ev = ev.lon + dep_ev = ev.dep + mag = ev.mag + ndata = ev.Nt + ev.Ncs_dt + ev.Ncr_dt + name_ev = ev.name + try: + weight_ev = ev.tag["weight"] + except: + weight_ev = 1.0 + + if(ndata == 0): # if the earthquake has no data, do not output it + continue + + doc_src_rec.write('%7d %6d %2d %2d %2d %2d %5.2f %9.4f %9.4f %9.4f %5.2f %7d %s %7.3f\n'%(\ + evid,year,month,day,hour,minute,second+msec/1000000,lat_ev,lon_ev,dep_ev,mag,ndata,name_ev,weight_ev)) + + min_lat = min(min_lat, lat_ev) + max_lat = max(max_lat, lat_ev) + min_lon = min(min_lon, lon_ev) + max_lon = max(max_lon, lon_ev) + min_dep = min(min_dep, dep_ev) + max_dep = max(max_dep, dep_ev) + + record_ev[name_ev] = 1 # record this earthquake + Nt_total += ev.Nt + Ncs_dt_total += ev.Ncs_dt + Ncr_dt_total += ev.Ncr_dt + + for key_t in ev.t: + data = ev.t[key_t] + st = st_info[data[0]] + stid = st.id + name_st = st.name + lat_st = st.lat + lon_st = st.lon + ele_st = st.ele + phase = data[1] + time = data[2] + try: + weight_data = data[3] + except: + weight_data = 1.0 + doc_src_rec.write('%7d %7d %6s %9.4f %9.4f %9.4f %s %8.4f %7.3f \n'%(evid,stid,name_st,lat_st,lon_st,ele_st,phase,time,weight_data)) + + min_lat = min(min_lat, lat_st) + max_lat = max(max_lat, lat_st) + min_lon = min(min_lon, lon_st) + max_lon = max(max_lon, lon_st) + min_dep = min(min_dep, -ele_st/1000) + max_dep = max(max_dep, -ele_st/1000) + + record_st[name_st] = 1 # record this station + + for key_t in ev.cs_dt: + data = ev.cs_dt[key_t] + st1 = st_info[data[0]] + stid1 = st1.id + name_st1= st1.name + lat_st1 = st1.lat + lon_st1 = st1.lon + ele_st1 = st1.ele + st2 = st_info[data[1]] + stid2 = st2.id + name_st2= st2.name + lat_st2 = st2.lat + lon_st2 = st2.lon + ele_st2 = st2.ele + phase = data[2] + time = data[3] + try: + weight_data = data[4] + except: + weight_data = 1.0 + doc_src_rec.write('%7d %7d %6s %9.4f %9.4f %9.4f %7d %6s %9.4f %9.4f %9.4f %s %8.4f %7.3f \n'%(\ + evid,stid1,name_st1,lat_st1,lon_st1,ele_st1,stid2,name_st2,lat_st2,lon_st2,ele_st2,phase,time,weight_data)) + + min_lat = min(min_lat, lat_st1) + max_lat = max(max_lat, lat_st1) + min_lon = min(min_lon, lon_st1) + max_lon = max(max_lon, lon_st1) + min_dep = min(min_dep, -ele_st1/1000) + max_dep = max(max_dep, -ele_st1/1000) + + min_lat = min(min_lat, lat_st2) + max_lat = max(max_lat, lat_st2) + min_lon = min(min_lon, lon_st2) + max_lon = max(max_lon, lon_st2) + min_dep = min(min_dep, -ele_st2/1000) + max_dep = max(max_dep, -ele_st2/1000) + + record_st[name_st1] = 1 # record this station + record_st[name_st2] = 1 # record this station + + for key_t in ev.cr_dt: + data = ev.cr_dt[key_t] + st = st_info[data[0]] + stid = st.id + name_st = st.name + lat_st = st.lat + lon_st = st.lon + ele_st = st.ele + ev2 = ev_info[data[1]] + evid2 = ev2.id + name_ev2= ev2.name + lat_ev2 = ev2.lat + lon_ev2 = ev2.lon + dep_ev2 = ev2.dep + phase = data[2] + time = data[3] + try: + weight_data = data[4] + except: + weight_data = 1.0 + doc_src_rec.write('%7d %7d %6s %9.4f %9.4f %9.4f %7d %6s %9.4f %9.4f %9.4f %s %8.4f %7.3f \n'%(\ + evid,stid,name_st,lat_st,lon_st,ele_st,evid2,name_ev2,lat_ev2,lon_ev2,dep_ev2,phase,time,weight_data)) + + min_lat = min(min_lat, lat_st) + max_lat = max(max_lat, lat_st) + min_lon = min(min_lon, lon_st) + max_lon = max(max_lon, lon_st) + min_dep = min(min_dep, -ele_st/1000) + max_dep = max(max_dep, -ele_st/1000) + + min_lat = min(min_lat, lat_ev2) + max_lat = max(max_lat, lat_ev2) + min_lon = min(min_lon, lon_ev2) + max_lon = max(max_lon, lon_ev2) + min_dep = min(min_dep, dep_ev2) + max_dep = max(max_dep, dep_ev2) + + record_ev[name_ev2] = 1 # record this station + record_st[name_st] = 1 # record this station + + doc_src_rec.close() + + print("src_rec.dat has been outputed: %d events, %d stations, %d abs traveltime, %d cs_dif traveltime, %d cr_dif traveltime. " \ + %(len(record_ev),len(record_st),Nt_total,Ncs_dt_total,Ncr_dt_total)) + print("earthquake and station region, lat: %6.1f - %6.1f, lon: %6.1f - %6.1f, dep: %6.1f - %6.1f"%(min_lat,max_lat,min_lon,max_lon,min_dep,max_dep) ) + + +# %% +# Function: write_src_list_file(fname, ev_info) Output the event list file. +def write_src_list_file(fname,ev_info): + doc_ev_list = open(fname,'w') + + for key_ev in ev_info: + ev = ev_info[key_ev] + evid = ev.id + lat_ev = ev.lat + lon_ev = ev.lon + dep_ev = ev.dep + mag = ev.mag + name_ev = ev.name + if (ev.id == -999): # if the earthquake has no data, do not output it + continue + doc_ev_list.write("%7d %s %s %9.4f %9.4f %9.4f %5.2f \n"%(evid,name_ev,ev.ortime,lat_ev,lon_ev,dep_ev,mag)) + doc_ev_list.close() + +# %% +# Function: write_rec_list_file(fname, ev_info, st_info) Output the station list file. +def write_rec_list_file(fname,ev_info,st_info): + doc_st_list = open(fname,'w') + + st_list = {} + for key_ev in ev_info: + ev = ev_info[key_ev] + + for key_t in ev.t: + data = ev.t[key_t] + st = st_info[data[0]] + name_st = st.name + lat_st = st.lat + lon_st = st.lon + ele_st = st.ele + if(not name_st in st_list): + doc_st_list.write("%6s %9.4f %9.4f %10.4f \n"%(name_st,lat_st,lon_st,ele_st)) + st_list[name_st] = 1 + + for key_t in ev.cs_dt: + data = ev.cs_dt[key_t] + st1 = st_info[data[0]] + name_st1= st1.name + lat_st1 = st1.lat + lon_st1 = st1.lon + ele_st1 = st1.ele + st2 = st_info[data[0]] + name_st2= st2.name + lat_st2 = st2.lat + lon_st2 = st2.lon + ele_st2 = st2.ele + if(not name_st1 in st_list): + doc_st_list.write("%6s %9.4f %9.4f %10.4f \n"%(name_st1,lat_st1,lon_st1,ele_st1)) + st_list[name_st1] = 1 + if(not name_st2 in st_list): + doc_st_list.write("%6s %9.4f %9.4f %10.4f \n"%(name_st2,lat_st2,lon_st2,ele_st2)) + st_list[name_st2] = 1 + + for key_t in ev.cr_dt: + data = ev.cr_dt[key_t] + st = st_info[data[0]] + name_st = st.name + lat_st = st.lat + lon_st = st.lon + ele_st = st.ele + if(not name_st in st_list): + doc_st_list.write("%6s %9.4f %9.4f %10.4f \n"%(name_st,lat_st,lon_st,ele_st)) + st_list[name_st] = 1 + + doc_st_list.close() + +# %% [markdown] +# Functions: read objective function file + +# %% +# Function: read_objective_function_file(path) +def read_objective_function_file(path): + + full_curve = [] + location_curve = [] + model_curve = [] + + with open('%s/objective_function.txt'%(path)) as f: + for i,line in enumerate(f): + tmp = line.split(',') + if (tmp[0].__contains__("#")): + continue # skip the comment line + + iter = int(tmp[0]) + tag = tmp[1] + obj = float(tmp[2]) + obj_abs = float(tmp[3]) + obj_cs = float(tmp[4]) + obj_cr = float(tmp[5]) + obj_tele = float(tmp[6]) + tmp2 = tmp[7].split('/') + mean = float(tmp2[0]) + std = float(tmp2[1]) + tmp2 = tmp[8].split('/') + mean_abs = float(tmp2[0]) + std_abs = float(tmp2[1]) + tmp2 = tmp[9].split('/') + mean_cs = float(tmp2[0]) + std_cs = float(tmp2[1]) + tmp2 = tmp[10].split('/') + mean_cr = float(tmp2[0]) + std_cr = float(tmp2[1]) + tmp2 = tmp[11].split('/') + mean_tele = float(tmp2[0]) + std_tele = float(tmp2[1]) + + full_curve.append([obj,obj_abs,obj_cs,obj_cr,obj_tele,mean,std,mean_abs,std_abs,mean_cs,std_cs,mean_cr,std_cr,mean_tele,std_tele]) + if tag.__contains__("relocation"): + location_curve.append([obj,obj_abs,obj_cs,obj_cr,obj_tele,mean,std,mean_abs,std_abs,mean_cs,std_cs,mean_cr,std_cr,mean_tele,std_tele]) + if tag.__contains__("model"): + model_curve.append([obj,obj_abs,obj_cs,obj_cr,obj_tele,mean,std,mean_abs,std_abs,mean_cs,std_cs,mean_cr,std_cr,mean_tele,std_tele]) + + return np.array(full_curve),np.array(location_curve),np.array(model_curve) + +# %% [markdown] +# Functions: read inversion grid file + +# %% +# Function: read the inversion grid file +def read_inversion_grid_file(path): + + inv_grid_vel = [] + inv_grid_ani = [] + + switch = False + igrid = -1 + with open('%s/inversion_grid.txt'%(path)) as f: + tmp_inv_grid = [] + for i,line in enumerate(f): + + # read the number of inversion grid in dep, lat, lon directions + if(i==0): + tmp = line.split() + ndep = int(tmp[1]) + nlines = 3*ndep+1 # The number of rows for each inversion grid is 3*ndep+1 + + iline = i % nlines + + if(iline == 0): # info: number of inversion grid + tmp = line.split() + if (int(tmp[0]) > igrid): + igrid = int(tmp[0]) + else: # change from vel to ani + switch = True + igrid = int(tmp[0]) + + else: # info location of inversion grid + iline_sub = (iline-1) % 3 + if(iline_sub == 0): # dep + tmp = line.split() + dep = float(tmp[0]) + if(iline_sub == 1): # list of lat + lat_list = line.split() + if(iline_sub == 2): # list of lon + lon_list = line.split() + + # add inversion grid + for lat in lat_list: + for lon in lon_list: + tmp_inv_grid.append([float(lon), float(lat), dep]) + + if(iline == nlines-1): # the last line of inversion grid + if(switch): + inv_grid_ani.append(tmp_inv_grid) + else: + inv_grid_vel.append(tmp_inv_grid) + tmp_inv_grid = [] + + return [np.array(inv_grid_vel),np.array(inv_grid_ani)] + +# %% [markdown] +# Functions: for plotting + +# %% +# Function: fig_ev_st_distribution_dep(ev_info, st_info) Plot the distribution of the earthquakes and stations, color-coded by earthquake depth. +import matplotlib.pyplot as plt +from matplotlib.gridspec import GridSpec + +def fig_ev_st_distribution_dep(ev_info,st_info): + + [lon_ev,lat_ev,dep_ev,wt_ev] = data_lon_lat_dep_wt_ev(ev_info) + [lon_st,lat_st,ele_st,wt_st] = data_lon_lat_ele_wt_st(ev_info,st_info) + + min_lon = min(min(lon_ev),min(lon_st)) + max_lon = max(max(lon_ev),max(lon_st)) + + min_lat = min(min(lat_ev),min(lat_st)) + max_lat = max(max(lat_ev),max(lat_st)) + + max_dep = max(dep_ev) + + # Insert a value that does not affect the plot to make the colorbar range look better. + lon_ev = np.insert(lon_ev, 0, 9999); lat_ev = np.insert(lat_ev, 0, 9999); dep_ev = np.insert(dep_ev, 0, 0); + + fig = plt.figure(figsize=(12,12)) + gridspace = GridSpec(12,12,figure = fig) + + xrange = max_lon - min_lon + 1.0 + yrange = max_lat - min_lat + 1.0 + + if (xrange > yrange): + fig_x_size = 6 + fig_y_size = round(6*yrange/xrange) + else: + fig_x_size = round(6*xrange/yrange) + fig_y_size = 6 + + + ax1 = fig.add_subplot(gridspace[0:fig_y_size,0:fig_x_size]) + + bar_ev = ax1.scatter(lon_ev,lat_ev,c=dep_ev,cmap="jet",label = "src",s = 3) + # ax1.plot(lon_st,lat_st,'rv',label = "rec",markersize = 6) + bar_st = ax1.scatter(lon_st,lat_st,c="red",label = "rec",s = 100,marker='v',edgecolors='white') + + ax1.legend(fontsize = 14) + ax1.tick_params(axis='x',labelsize=18) + ax1.tick_params(axis='y',labelsize=18) + ax1.set_xlabel('Lon',fontsize=18) + ax1.set_ylabel('Lat',fontsize=18) + ax1.set_xlim((min_lon - (max_lon - min_lon)*0.1,max_lon + (max_lon - min_lon)*0.1)) + ax1.set_ylim((min_lat - (max_lat - min_lat)*0.1,max_lat + (max_lat - min_lat)*0.1)) + + + ax2 = fig.add_subplot(gridspace[0:fig_y_size, fig_x_size+1 : fig_x_size+3]) + + ax2.scatter(dep_ev,lat_ev,c=dep_ev,cmap="jet",label = "src",s = 3) + + ax2.tick_params(axis='x',labelsize=18) + ax2.tick_params(axis='y',labelsize=18) + ax2.set_xlabel('Dep',fontsize=18) + ax2.set_ylabel('Lat',fontsize=18) + ax2.set_xlim((-max_dep*0.05,max_dep*1.1)) + ax2.set_ylim((min_lat - (max_lat - min_lat)*0.1,max_lat + (max_lat - min_lat)*0.1)) + + + ax3 = fig.add_subplot(gridspace[fig_y_size+1:fig_y_size+3,0:fig_x_size]) + + ax3.scatter(lon_ev,dep_ev,c=dep_ev,cmap="jet",label = "src",s = 3) + + ax3.tick_params(axis='x',labelsize=18) + ax3.tick_params(axis='y',labelsize=18) + ax3.set_xlabel('Lon',fontsize=18) + ax3.set_ylabel('Dep',fontsize=18) + ax3.set_xlim((min_lon - (max_lon - min_lon)*0.1,max_lon + (max_lon - min_lon)*0.1)) + ax3.set_ylim((-max_dep*0.05,max_dep*1.1)) + ax3.invert_yaxis() + + # Place the colorbar on a new axis. + ax4 = fig.add_subplot(gridspace[fig_y_size+2:fig_y_size+3,fig_x_size+1:fig_x_size+3]) + cbar1 = plt.colorbar(bar_ev, ax=ax4,orientation='horizontal') + cbar1.set_label('Depth of earthquakes',fontsize=16) + cbar1.ax.tick_params(axis='x', labelsize=16) # Colorbar font size. + + # Hide the borders of the axes. + ax4.spines['top'].set_visible(False) + ax4.spines['right'].set_visible(False) + ax4.spines['bottom'].set_visible(False) + ax4.spines['left'].set_visible(False) + + # Hide the tick values of the axes. + ax4.set_xticks([]) + ax4.set_yticks([]) + + +# %% +# Function: fig_ev_st_distribution_wt(ev_info, st_info) Plot the distribution of the earthquakes and stations, color-coded by weight. +import matplotlib.pyplot as plt +from matplotlib.gridspec import GridSpec +from matplotlib.colors import ListedColormap +from mpl_toolkits.axes_grid1 import make_axes_locatable +import math + +def fig_ev_st_distribution_wt(ev_info,st_info): + + + [lon_ev,lat_ev,dep_ev,wt_ev] = data_lon_lat_dep_wt_ev(ev_info) + [lon_st,lat_st,ele_st,wt_st] = data_lon_lat_ele_wt_st(ev_info,st_info) + + # Insert a value that does not affect the plot to make the colorbar range look better. + lon_ev = np.insert(lon_ev, 0, lon_ev[0]); lat_ev = np.insert(lat_ev, 0, lat_ev[0]); dep_ev = np.insert(dep_ev, 0, dep_ev[0]); wt_ev = np.insert(wt_ev, 0, 0.0) + lon_ev = np.insert(lon_ev, 0, lon_ev[0]); lat_ev = np.insert(lat_ev, 0, lat_ev[0]); dep_ev = np.insert(dep_ev, 0, dep_ev[0]); wt_ev = np.insert(wt_ev, 0, 1.0) + lon_st = np.insert(lon_st, 0, lon_st[0]); lat_st = np.insert(lat_st, 0, lat_st[0]); ele_st = np.insert(ele_st, 0, ele_st[0]); wt_st = np.insert(wt_st, 0, 0.0) + lon_st = np.insert(lon_st, 0, lon_st[0]); lat_st = np.insert(lat_st, 0, lat_st[0]); ele_st = np.insert(ele_st, 0, ele_st[0]); wt_st = np.insert(wt_st, 0, 1.0) + + min_lon = min(min(lon_ev),min(lon_st)) + max_lon = max(max(lon_ev),max(lon_st)) + + min_lat = min(min(lat_ev),min(lat_st)) + max_lat = max(max(lat_ev),max(lat_st)) + + max_dep = max(dep_ev) + + fig = plt.figure(figsize=(12,12)) + gridspace = GridSpec(12,12,figure = fig) + + xrange = max_lon - min_lon + 1.0 + yrange = max_lat - min_lat + 1.0 + + if (xrange > yrange): + fig_x_size = 6 + fig_y_size = round(6*yrange/xrange) + else: + fig_x_size = round(6*xrange/yrange) + fig_y_size = 6 + + + ax1 = fig.add_subplot(gridspace[0:fig_y_size,0:fig_x_size]) + + bar_ev = ax1.scatter(lon_ev,lat_ev,c=wt_ev,cmap="jet",label = "src",s = 3) + bar_st = ax1.scatter(lon_st,lat_st,c=wt_st,cmap="jet",label = "rec",s = 100,marker='^',edgecolors='white') + + ax1.legend(fontsize = 14) + ax1.tick_params(axis='x',labelsize=18) + ax1.tick_params(axis='y',labelsize=18) + ax1.set_xlabel('Lon',fontsize=18) + ax1.set_ylabel('Lat',fontsize=18) + ax1.set_xlim((min_lon - (max_lon - min_lon)*0.1,max_lon + (max_lon - min_lon)*0.1)) + ax1.set_ylim((min_lat - (max_lat - min_lat)*0.1,max_lat + (max_lat - min_lat)*0.1)) + + + ax2 = fig.add_subplot(gridspace[0:fig_y_size, fig_x_size+1 : fig_x_size+3]) + + ax2.scatter(dep_ev,lat_ev,c=wt_ev,cmap="jet",label = "src",s = 3) + + ax2.tick_params(axis='x',labelsize=18) + ax2.tick_params(axis='y',labelsize=18) + ax2.set_xlabel('Dep',fontsize=18) + ax2.set_ylabel('Lat',fontsize=18) + ax2.set_xlim((-max_dep*0.05,max_dep*1.1)) + ax2.set_ylim((min_lat - (max_lat - min_lat)*0.1,max_lat + (max_lat - min_lat)*0.1)) + + + ax3 = fig.add_subplot(gridspace[fig_y_size+1:fig_y_size+3,0:fig_x_size]) + + ax3.scatter(lon_ev,dep_ev,c=wt_ev,cmap="jet",label = "src",s = 3) + + ax3.tick_params(axis='x',labelsize=18) + ax3.tick_params(axis='y',labelsize=18) + ax3.set_xlabel('Lon',fontsize=18) + ax3.set_ylabel('Dep',fontsize=18) + ax3.set_xlim((min_lon - (max_lon - min_lon)*0.1,max_lon + (max_lon - min_lon)*0.1)) + ax3.set_ylim((-max_dep*0.05,max_dep*1.1)) + ax3.invert_yaxis() + + # Place the colorbar on a new axis. + ax4 = fig.add_subplot(gridspace[fig_y_size+2:fig_y_size+3,fig_x_size+1:fig_x_size+3]) + cbar1 = plt.colorbar(bar_st, ax=ax4,orientation='horizontal') + cbar1.set_label('Weight of stations',fontsize=16) + cbar1.ax.tick_params(axis='x', labelsize=16) # colorbar font size. + # Hide the borders of the axes. + ax4.spines['top'].set_visible(False) + ax4.spines['right'].set_visible(False) + ax4.spines['bottom'].set_visible(False) + ax4.spines['left'].set_visible(False) + + # Hide the tick values of the axes. + ax4.set_xticks([]) + ax4.set_yticks([]) + + # Place the colorbar on a new axis. + ax5 = fig.add_subplot(gridspace[fig_y_size+1:fig_y_size+2,fig_x_size+1:fig_x_size+3]) + cbar1 = plt.colorbar(bar_ev, ax=ax5,orientation='horizontal') + cbar1.set_label('Weight of earthquakes',fontsize=16) + cbar1.ax.tick_params(axis='x', labelsize=16) # colorbar font size. + # Hide the borders of the axes. + ax5.spines['top'].set_visible(False) + ax5.spines['right'].set_visible(False) + ax5.spines['bottom'].set_visible(False) + ax5.spines['left'].set_visible(False) + + # Hide the tick values of the axes. + ax5.set_xticks([]) + ax5.set_yticks([]) + + +# %% +# Plot and function: plot the distance-time scatter plot, remove the outliers. +# Limit the data within the range defined by the line time = dis * slope + intercept and the bounds up and down. +# Remove outliers, only retain data satisfying: slope * dis + intercept + down < time < slope * dis + intercept + up. + +def fig_data_plot_remove_outliers(ev_info,st_info,slope,intercept,up,down,dis_min,dis_max): + + fig = plt.figure(figsize=(10,10)) + gridspace = GridSpec(6,6,figure = fig) + ax2 = fig.add_subplot(gridspace[0:6, 0:6]) + + # plot original data + [dis_obs,time_obs] = data_dis_time(ev_info,st_info) + ax2.plot(dis_obs,time_obs,'r.',markersize=1.5,label = "discarded") + + # remove outliers, only retain data satisfying: slope * dis + intercept + down < time < slope * dis + intercept + up + ev_info = limit_data_residual(ev_info,st_info,slope,intercept,up,down) + + [dis_obs,time_obs] = data_dis_time(ev_info,st_info) + ax2.plot(dis_obs,time_obs,'b.',markersize=1.5,label = "retained") + + ax2.plot([dis_min,dis_max],[slope*dis_min+intercept+up,slope*dis_max+intercept+up],'b-',linewidth=2) + ax2.plot([dis_min,dis_max],[slope*dis_min+intercept+down,slope*dis_max+intercept+down],'b-',linewidth=2) + ax2.plot([dis_min,dis_max],[slope*dis_min+intercept,slope*dis_max+intercept],'k-',linewidth=2) + + ax2.legend(fontsize = 14) + ax2.tick_params(axis='x',labelsize=18) + ax2.tick_params(axis='y',labelsize=18) + ax2.set_xlabel('Distance (km)',fontsize=18) + ax2.set_ylabel('Traveltime',fontsize=18) + ax2.set_xlim((dis_min,dis_max)) + ax2.set_ylim((intercept+down-5,slope*dis_max+intercept+up+5)) + + return ev_info + +# %% +# Plot: distance-time scatter plot of given phases. + +def fig_data_plot_phase(ev_info,st_info,phase_list,color_list,dis_min,dis_max): + + [dis_obs_phase,time_obs_phase] = data_dis_time_phase(ev_info,st_info,phase_list) + + regression = {} + # Calculate the least squares y = ax+b + for key_phase in phase_list: + X = dis_obs_phase[key_phase] + Y = time_obs_phase[key_phase] + + if(len(X)>20): + regression[key_phase] = linear_regression(X,Y) + else: + print("No enough data: %d, for %s"%(len(X),key_phase)) + regression[key_phase] = [0,0,0] + + + # draw + fig = plt.figure(figsize=(10,10)) + gridspace = GridSpec(6,6,figure = fig) + ax2 = fig.add_subplot(gridspace[0:6, 0:6]) + y1 = 99999; y2 = -99999 + + # scatter plot + for iphase in range(len(phase_list)): + phase = phase_list[iphase] + color = color_list[iphase] + ax2.plot(dis_obs_phase[phase],time_obs_phase[phase],'%s.'%(color),markersize=1) + + # linear regression plot + for iphase in range(len(phase_list)): + phase = phase_list[iphase] + color = color_list[iphase] + (slope,intercept,SEE)= regression[phase] + ax2.plot([dis_min,dis_max],[dis_min*slope+intercept,dis_max*slope+intercept],'%s-'%(color),linewidth=2,label = "%s: a,b,SEE=%5.2f,%5.2f,%5.2f"%(phase,slope,intercept,SEE)) + y1 = min(y1,intercept-5) + y2 = max(y2,dis_max*slope+intercept+5) + + ax2.legend(fontsize = 14) + ax2.tick_params(axis='x',labelsize=18) + ax2.tick_params(axis='y',labelsize=18) + ax2.set_xlabel('Distance (km)',fontsize=18) + ax2.set_ylabel('Traveltime (s)',fontsize=18) + ax2.set_xlim((dis_min,dis_max)) + + + for iphase in range(len(phase_list)): + try: + y1 = min(y1,min(time_obs_phase[phase])) + y2 = max(y2,max(time_obs_phase[phase])) + except: + pass + ax2.set_ylim((y1,y2)) + + title = "" + for phase in dis_obs_phase: + title = title + "%s(%d) "%(phase,len(dis_obs_phase[phase])) + + ax2.set_title(title) + + print("a is slope, b is intercept, SEE is standard error of estimate") + +# %% [markdown] +# Functions: results analysis and evaluation + +# %% +# plot: plot the residual histogram of the initial and final model +def fig_residual_histogram(fn_syn_init,fn_syn_final,fn_obs,range_l,range_r,Nbar,tag1 = "initial",tag2 = "final"): + + # read synthetic traveltime data in the initial model + [ev_info_syn_init, st_info_syn_init] = read_src_rec_file(fn_syn_init) + time_syn_init = data_dis_time(ev_info_syn_init,st_info_syn_init)[1] + + # read synthetic traveltime data in the final model + [ev_info_syn_final, st_info_syn_final] = read_src_rec_file(fn_syn_final) + time_syn_final = data_dis_time(ev_info_syn_final,st_info_syn_final)[1] + + # read observed traveltime data + [ev_info_obs, st_info_obs] = read_src_rec_file(fn_obs) + time_obs = data_dis_time(ev_info_obs,st_info_obs)[1] + + fig = plt.figure(figsize=(6,6)) + gridspace = GridSpec(6,6,figure = fig) + + ax2 = fig.add_subplot(gridspace[0:6, 0:6]) + + bins=np.linspace(range_l,range_r,Nbar) + error_init = time_syn_init - time_obs + error_final = time_syn_final - time_obs + + hist_init, _, _ = ax2.hist(error_init,bins=bins,histtype='step', edgecolor = "red", linewidth = 2, + label = "%s: std = %5.3f s, mean = %5.3f s"%(tag1,np.std(error_init),np.mean(error_init))) + + hist_final, _, _ = ax2.hist(error_final,bins=bins,alpha = 0.5, color = "blue", + label = "%s: std = %5.3f s, mean = %5.3f s"%(tag2,np.std(error_final),np.mean(error_final))) + + print("residual for ",tag1," model is: ","mean: ",np.mean(error_init),"sd: ",np.std(error_init)) + print("residual for ",tag2," model is: ","mean: ",np.mean(error_final),"sd: ",np.std(error_final)) + ax2.legend(fontsize=14) + + ax2.set_xlim(range_l - abs(range_l)*0.1,range_r + abs(range_r)*0.1) + ax2.set_ylim(0,1.3*max(max(hist_init),max(hist_final))) + + ax2.tick_params(axis='x',labelsize=18) + ax2.tick_params(axis='y',labelsize=18) + ax2.set_ylabel('Number of data',fontsize=18) + ax2.set_xlabel('Traveltime residuals (s)',fontsize=18) + ax2.set_title("$t_{syn} - t_{obs}$",fontsize=18) + ax2.grid() + + +# %% +# plot: plot the residual histogram of the initial and final model +def fig_data_difference_histogram(fn_A,fn_B,range_l,range_r,Nbar): + + # read data A + [ev_info_A, st_info_A] = read_src_rec_file(fn_A) + + # read data B + [ev_info_B, st_info_B] = read_src_rec_file(fn_B) + + # absolute traveltime residual + error_t = [] + for key_ev in ev_info_A: + for key_t in ev_info_A[key_ev].t: + data_A = ev_info_A[key_ev].t[key_t] + if (key_ev in ev_info_B and key_t in ev_info_B[key_ev].t): + data_B = ev_info_B[key_ev].t[key_t] + error_t.append(data_A[2] - data_B[2]) + + # common-source differential traveltime residual + error_cs_dt = [] + for key_ev in ev_info_A: + for key_dt in ev_info_A[key_ev].cs_dt: + data_A = ev_info_A[key_ev].cs_dt[key_dt] + if (key_ev in ev_info_B and key_dt in ev_info_B[key_ev].cs_dt): + data_B = ev_info_B[key_ev].cs_dt[key_dt] + error_cs_dt.append(data_A[3] - data_B[3]) + else: + print(key_ev,key_dt) + + # common-receiver differential traveltime residual + error_cr_dt = [] + for key_ev in ev_info_A: + for key_dt in ev_info_A[key_ev].cr_dt: + data_A = ev_info_A[key_ev].cr_dt[key_dt] + if (key_ev in ev_info_B and key_dt in ev_info_B[key_ev].cr_dt): + data_B = ev_info_B[key_ev].cr_dt[key_dt] + error_cr_dt.append(data_A[3] - data_B[3]) + + # plot + fig = plt.figure(figsize=(14,6)) + gridspace = GridSpec(6,14,figure = fig) + + + ax2 = fig.add_subplot(gridspace[0:6, 0:6]) + bins=np.linspace(range_l,range_r,Nbar) + # hist_t, _, _ = ax2.hist(error_t,bins=bins,histtype='step', edgecolor = "red", linewidth = 2, + # label = "noise: std = %5.3f s, mean = %5.3f s"%(np.std(error_t),np.mean(error_t))) + hist_t, _, _ = ax2.hist(error_t,bins=bins,alpha = 0.5, color = "blue", + label = "noise: std = %5.3f s, mean = %5.3f s"%(np.std(error_t),np.mean(error_t))) + + ax2.legend(fontsize=14) + ax2.set_xlim(range_l - abs(range_l)*0.1,range_r + abs(range_r)*0.1) + try: + ax2.set_ylim(0,1.3*max(hist_t)) + except: + ax2.set_ylim(0,1.0) + ax2.tick_params(axis='x',labelsize=18) + ax2.tick_params(axis='y',labelsize=18) + ax2.set_ylabel('Number of data',fontsize=18) + ax2.set_xlabel('Noise (s)',fontsize=18) + ax2.set_title("Noise of traveltime",fontsize=18) + + + ax3 = fig.add_subplot(gridspace[0:6,8:14]) + bins=np.linspace(range_l,range_r,Nbar) + # hist_t, _, _ = ax3.hist(error_t,bins=bins,histtype='step', edgecolor = "red", linewidth = 2, + # label = "noise: std = %5.3f s, mean = %5.3f s"%(np.std(error_t),np.mean(error_t))) + hist_cs_dt, _, _ = ax3.hist(error_cs_dt,bins=bins,alpha = 0.5, color = "blue", + label = "noise: std = %5.3f s, mean = %5.3f s"%(np.std(error_cs_dt),np.mean(error_cs_dt))) + + ax3.legend(fontsize=14) + ax3.set_xlim(range_l - abs(range_l)*0.1,range_r + abs(range_r)*0.1) + try: + ax3.set_ylim(0,1.3*max(hist_cs_dt)) + except: + ax3.set_ylim(0,1.0) + ax3.tick_params(axis='x',labelsize=18) + ax3.tick_params(axis='y',labelsize=18) + ax3.set_ylabel('Number of data',fontsize=18) + ax3.set_xlabel('Noise (s)',fontsize=18) + ax3.set_title("Noise of differential traveltime",fontsize=18) + + diff --git a/examples/utils/svel13_chen.cpt b/examples/utils/svel13_chen.cpt new file mode 100644 index 0000000..a985d6f --- /dev/null +++ b/examples/utils/svel13_chen.cpt @@ -0,0 +1,15 @@ + -0.7000E+01 166 0 0 -0.6000E+01 225 0 0 + -0.6000E+01 225 0 0 -0.5000E+01 255 75 0 + -0.5000E+01 255 75 0 -0.4000E+01 255 132 0 + -0.4000E+01 255 132 0 -0.3000E+01 255 198 0 + -0.3000E+01 255 198 0 -0.2000E+01 255 255 0 + -0.2000E+01 255 255 0 -0.1000E+00 255 255 255 + -0.1000E+00 255 255 255 0.1000E+00 255 255 255 + 0.1000E+00 255 255 255 0.2000E+01 0 255 255 + 0.2000E+01 0 255 255 0.3000E+01 90 205 255 + 0.3000E+01 90 205 255 0.4000E+01 26 160 255 + 0.4000E+01 26 160 255 0.5000E+01 0 100 255 + 0.5000E+01 0 100 255 0.6000E+01 0 50 200 + 0.6000E+01 0 50 200 0.7000E+01 0 10 160 +B 166 0 0 +F 0 10 160 diff --git a/external_libs/.DS_Store b/external_libs/.DS_Store new file mode 100644 index 0000000..18c1457 Binary files /dev/null and b/external_libs/.DS_Store differ diff --git a/external_libs/CMakeLists.txt b/external_libs/CMakeLists.txt new file mode 100644 index 0000000..72ce202 --- /dev/null +++ b/external_libs/CMakeLists.txt @@ -0,0 +1,60 @@ +function(initialize_submodule DIRECTORY) + if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${DIRECTORY}/.git) + find_package(Git QUIET REQUIRED) + message(STATUS "${CMAKE_CURRENT_SOURCE_DIR}/${DIRECTORY}/.git does not exist. Initializing ${DIRECTORY} submodule ...") + execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init ${DIRECTORY} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + RESULT_VARIABLE GIT_EXIT_CODE) + if(NOT GIT_EXIT_CODE EQUAL "0") + message(FATAL_ERROR "${GIT_EXECUTABLE} submodule update --init dependencies/${DIRECTORY} failed with exit code ${GIT_EXIT_CODE}, please checkout submodules") + endif() + endif() +endfunction(initialize_submodule) + + +initialize_submodule(yaml-cpp) + +# Apply patch to yaml-cpp to fix missing cstdint include +set(PATCH_FILE "${CMAKE_CURRENT_SOURCE_DIR}/yaml-cpp-cstdint.patch") +set(TARGET_FILE "${CMAKE_CURRENT_SOURCE_DIR}/yaml-cpp/src/emitterutils.cpp") + +if(EXISTS ${PATCH_FILE} AND EXISTS ${TARGET_FILE}) + # Check if the patch has already been applied by looking for cstdint include + file(READ ${TARGET_FILE} FILE_CONTENTS) + string(FIND "${FILE_CONTENTS}" "#include " CSTDINT_FOUND) + + if(CSTDINT_FOUND EQUAL -1) + message(STATUS "Applying yaml-cpp cstdint patch...") + find_program(PATCH_PROGRAM patch) + if(PATCH_PROGRAM) + execute_process( + COMMAND ${PATCH_PROGRAM} -p1 -i ${PATCH_FILE} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/yaml-cpp + RESULT_VARIABLE PATCH_RESULT + OUTPUT_QUIET + ERROR_QUIET + ) + if(PATCH_RESULT EQUAL 0) + message(STATUS "yaml-cpp patch applied successfully") + else() + message(WARNING "Failed to apply yaml-cpp patch, trying manual fix...") + # Fallback: manual insertion + file(READ ${TARGET_FILE} ORIGINAL_CONTENT) + string(REPLACE "#include \n" "#include \n#include \n" PATCHED_CONTENT "${ORIGINAL_CONTENT}") + file(WRITE ${TARGET_FILE} "${PATCHED_CONTENT}") + message(STATUS "Manual yaml-cpp fix applied") + endif() + else() + message(STATUS "patch command not found, applying manual fix...") + # Manual insertion if patch command is not available + file(READ ${TARGET_FILE} ORIGINAL_CONTENT) + string(REPLACE "#include \n" "#include \n#include \n" PATCHED_CONTENT "${ORIGINAL_CONTENT}") + file(WRITE ${TARGET_FILE} "${PATCHED_CONTENT}") + message(STATUS "Manual yaml-cpp fix applied") + endif() + else() + message(STATUS "yaml-cpp cstdint patch already applied") + endif() +endif() + +add_subdirectory(yaml-cpp EXCLUDE_FROM_ALL) diff --git a/external_libs/tinyxml2/tinyxml2.cpp b/external_libs/tinyxml2/tinyxml2.cpp new file mode 100644 index 0000000..d32b2b3 --- /dev/null +++ b/external_libs/tinyxml2/tinyxml2.cpp @@ -0,0 +1,2987 @@ +/* +Original code by Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#include "tinyxml2.h" + +#include // yes, this one new style header, is in the Android SDK. +#if defined(ANDROID_NDK) || defined(__BORLANDC__) || defined(__QNXNTO__) +# include +# include +#else +# include +# include +#endif + +#if defined(_MSC_VER) && (_MSC_VER >= 1400 ) && (!defined WINCE) + // Microsoft Visual Studio, version 2005 and higher. Not WinCE. + /*int _snprintf_s( + char *buffer, + size_t sizeOfBuffer, + size_t count, + const char *format [, + argument] ... + );*/ + static inline int TIXML_SNPRINTF( char* buffer, size_t size, const char* format, ... ) + { + va_list va; + va_start( va, format ); + const int result = vsnprintf_s( buffer, size, _TRUNCATE, format, va ); + va_end( va ); + return result; + } + + static inline int TIXML_VSNPRINTF( char* buffer, size_t size, const char* format, va_list va ) + { + const int result = vsnprintf_s( buffer, size, _TRUNCATE, format, va ); + return result; + } + + #define TIXML_VSCPRINTF _vscprintf + #define TIXML_SSCANF sscanf_s +#elif defined _MSC_VER + // Microsoft Visual Studio 2003 and earlier or WinCE + #define TIXML_SNPRINTF _snprintf + #define TIXML_VSNPRINTF _vsnprintf + #define TIXML_SSCANF sscanf + #if (_MSC_VER < 1400 ) && (!defined WINCE) + // Microsoft Visual Studio 2003 and not WinCE. + #define TIXML_VSCPRINTF _vscprintf // VS2003's C runtime has this, but VC6 C runtime or WinCE SDK doesn't have. + #else + // Microsoft Visual Studio 2003 and earlier or WinCE. + static inline int TIXML_VSCPRINTF( const char* format, va_list va ) + { + int len = 512; + for (;;) { + len = len*2; + char* str = new char[len](); + const int required = _vsnprintf(str, len, format, va); + delete[] str; + if ( required != -1 ) { + TIXMLASSERT( required >= 0 ); + len = required; + break; + } + } + TIXMLASSERT( len >= 0 ); + return len; + } + #endif +#else + // GCC version 3 and higher + //#warning( "Using sn* functions." ) + #define TIXML_SNPRINTF snprintf + #define TIXML_VSNPRINTF vsnprintf + static inline int TIXML_VSCPRINTF( const char* format, va_list va ) + { + int len = vsnprintf( 0, 0, format, va ); + TIXMLASSERT( len >= 0 ); + return len; + } + #define TIXML_SSCANF sscanf +#endif + +#if defined(_WIN64) + #define TIXML_FSEEK _fseeki64 + #define TIXML_FTELL _ftelli64 +#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) \ + || defined(__NetBSD__) || defined(__DragonFly__) || defined(__ANDROID__) + #define TIXML_FSEEK fseeko + #define TIXML_FTELL ftello +#elif defined(__unix__) && defined(__x86_64__) + #define TIXML_FSEEK fseeko64 + #define TIXML_FTELL ftello64 +#else + #define TIXML_FSEEK fseek + #define TIXML_FTELL ftell +#endif + + +static const char LINE_FEED = static_cast(0x0a); // all line endings are normalized to LF +static const char LF = LINE_FEED; +static const char CARRIAGE_RETURN = static_cast(0x0d); // CR gets filtered out +static const char CR = CARRIAGE_RETURN; +static const char SINGLE_QUOTE = '\''; +static const char DOUBLE_QUOTE = '\"'; + +// Bunch of unicode info at: +// http://www.unicode.org/faq/utf_bom.html +// ef bb bf (Microsoft "lead bytes") - designates UTF-8 + +static const unsigned char TIXML_UTF_LEAD_0 = 0xefU; +static const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; +static const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; + +namespace tinyxml2 +{ + +struct Entity { + const char* pattern; + int length; + char value; +}; + +static const int NUM_ENTITIES = 5; +static const Entity entities[NUM_ENTITIES] = { + { "quot", 4, DOUBLE_QUOTE }, + { "amp", 3, '&' }, + { "apos", 4, SINGLE_QUOTE }, + { "lt", 2, '<' }, + { "gt", 2, '>' } +}; + + +StrPair::~StrPair() +{ + Reset(); +} + + +void StrPair::TransferTo( StrPair* other ) +{ + if ( this == other ) { + return; + } + // This in effect implements the assignment operator by "moving" + // ownership (as in auto_ptr). + + TIXMLASSERT( other != 0 ); + TIXMLASSERT( other->_flags == 0 ); + TIXMLASSERT( other->_start == 0 ); + TIXMLASSERT( other->_end == 0 ); + + other->Reset(); + + other->_flags = _flags; + other->_start = _start; + other->_end = _end; + + _flags = 0; + _start = 0; + _end = 0; +} + + +void StrPair::Reset() +{ + if ( _flags & NEEDS_DELETE ) { + delete [] _start; + } + _flags = 0; + _start = 0; + _end = 0; +} + + +void StrPair::SetStr( const char* str, int flags ) +{ + TIXMLASSERT( str ); + Reset(); + size_t len = strlen( str ); + TIXMLASSERT( _start == 0 ); + _start = new char[ len+1 ]; + memcpy( _start, str, len+1 ); + _end = _start + len; + _flags = flags | NEEDS_DELETE; +} + + +char* StrPair::ParseText( char* p, const char* endTag, int strFlags, int* curLineNumPtr ) +{ + TIXMLASSERT( p ); + TIXMLASSERT( endTag && *endTag ); + TIXMLASSERT(curLineNumPtr); + + char* start = p; + const char endChar = *endTag; + size_t length = strlen( endTag ); + + // Inner loop of text parsing. + while ( *p ) { + if ( *p == endChar && strncmp( p, endTag, length ) == 0 ) { + Set( start, p, strFlags ); + return p + length; + } else if (*p == '\n') { + ++(*curLineNumPtr); + } + ++p; + TIXMLASSERT( p ); + } + return 0; +} + + +char* StrPair::ParseName( char* p ) +{ + if ( !p || !(*p) ) { + return 0; + } + if ( !XMLUtil::IsNameStartChar( (unsigned char) *p ) ) { + return 0; + } + + char* const start = p; + ++p; + while ( *p && XMLUtil::IsNameChar( (unsigned char) *p ) ) { + ++p; + } + + Set( start, p, 0 ); + return p; +} + + +void StrPair::CollapseWhitespace() +{ + // Adjusting _start would cause undefined behavior on delete[] + TIXMLASSERT( ( _flags & NEEDS_DELETE ) == 0 ); + // Trim leading space. + _start = XMLUtil::SkipWhiteSpace( _start, 0 ); + + if ( *_start ) { + const char* p = _start; // the read pointer + char* q = _start; // the write pointer + + while( *p ) { + if ( XMLUtil::IsWhiteSpace( *p )) { + p = XMLUtil::SkipWhiteSpace( p, 0 ); + if ( *p == 0 ) { + break; // don't write to q; this trims the trailing space. + } + *q = ' '; + ++q; + } + *q = *p; + ++q; + ++p; + } + *q = 0; + } +} + + +const char* StrPair::GetStr() +{ + TIXMLASSERT( _start ); + TIXMLASSERT( _end ); + if ( _flags & NEEDS_FLUSH ) { + *_end = 0; + _flags ^= NEEDS_FLUSH; + + if ( _flags ) { + const char* p = _start; // the read pointer + char* q = _start; // the write pointer + + while( p < _end ) { + if ( (_flags & NEEDS_NEWLINE_NORMALIZATION) && *p == CR ) { + // CR-LF pair becomes LF + // CR alone becomes LF + // LF-CR becomes LF + if ( *(p+1) == LF ) { + p += 2; + } + else { + ++p; + } + *q = LF; + ++q; + } + else if ( (_flags & NEEDS_NEWLINE_NORMALIZATION) && *p == LF ) { + if ( *(p+1) == CR ) { + p += 2; + } + else { + ++p; + } + *q = LF; + ++q; + } + else if ( (_flags & NEEDS_ENTITY_PROCESSING) && *p == '&' ) { + // Entities handled by tinyXML2: + // - special entities in the entity table [in/out] + // - numeric character reference [in] + // 中 or 中 + + if ( *(p+1) == '#' ) { + const int buflen = 10; + char buf[buflen] = { 0 }; + int len = 0; + const char* adjusted = const_cast( XMLUtil::GetCharacterRef( p, buf, &len ) ); + if ( adjusted == 0 ) { + *q = *p; + ++p; + ++q; + } + else { + TIXMLASSERT( 0 <= len && len <= buflen ); + TIXMLASSERT( q + len <= adjusted ); + p = adjusted; + memcpy( q, buf, len ); + q += len; + } + } + else { + bool entityFound = false; + for( int i = 0; i < NUM_ENTITIES; ++i ) { + const Entity& entity = entities[i]; + if ( strncmp( p + 1, entity.pattern, entity.length ) == 0 + && *( p + entity.length + 1 ) == ';' ) { + // Found an entity - convert. + *q = entity.value; + ++q; + p += entity.length + 2; + entityFound = true; + break; + } + } + if ( !entityFound ) { + // fixme: treat as error? + ++p; + ++q; + } + } + } + else { + *q = *p; + ++p; + ++q; + } + } + *q = 0; + } + // The loop below has plenty going on, and this + // is a less useful mode. Break it out. + if ( _flags & NEEDS_WHITESPACE_COLLAPSING ) { + CollapseWhitespace(); + } + _flags = (_flags & NEEDS_DELETE); + } + TIXMLASSERT( _start ); + return _start; +} + + + + +// --------- XMLUtil ----------- // + +const char* XMLUtil::writeBoolTrue = "true"; +const char* XMLUtil::writeBoolFalse = "false"; + +void XMLUtil::SetBoolSerialization(const char* writeTrue, const char* writeFalse) +{ + static const char* defTrue = "true"; + static const char* defFalse = "false"; + + writeBoolTrue = (writeTrue) ? writeTrue : defTrue; + writeBoolFalse = (writeFalse) ? writeFalse : defFalse; +} + + +const char* XMLUtil::ReadBOM( const char* p, bool* bom ) +{ + TIXMLASSERT( p ); + TIXMLASSERT( bom ); + *bom = false; + const unsigned char* pu = reinterpret_cast(p); + // Check for BOM: + if ( *(pu+0) == TIXML_UTF_LEAD_0 + && *(pu+1) == TIXML_UTF_LEAD_1 + && *(pu+2) == TIXML_UTF_LEAD_2 ) { + *bom = true; + p += 3; + } + TIXMLASSERT( p ); + return p; +} + + +void XMLUtil::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ) +{ + const unsigned long BYTE_MASK = 0xBF; + const unsigned long BYTE_MARK = 0x80; + const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + + if (input < 0x80) { + *length = 1; + } + else if ( input < 0x800 ) { + *length = 2; + } + else if ( input < 0x10000 ) { + *length = 3; + } + else if ( input < 0x200000 ) { + *length = 4; + } + else { + *length = 0; // This code won't convert this correctly anyway. + return; + } + + output += *length; + + // Scary scary fall throughs are annotated with carefully designed comments + // to suppress compiler warnings such as -Wimplicit-fallthrough in gcc + switch (*length) { + case 4: + --output; + *output = static_cast((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + //fall through + case 3: + --output; + *output = static_cast((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + //fall through + case 2: + --output; + *output = static_cast((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + //fall through + case 1: + --output; + *output = static_cast(input | FIRST_BYTE_MARK[*length]); + break; + default: + TIXMLASSERT( false ); + } +} + + +const char* XMLUtil::GetCharacterRef( const char* p, char* value, int* length ) +{ + // Presume an entity, and pull it out. + *length = 0; + + if ( *(p+1) == '#' && *(p+2) ) { + unsigned long ucs = 0; + TIXMLASSERT( sizeof( ucs ) >= 4 ); + ptrdiff_t delta = 0; + unsigned mult = 1; + static const char SEMICOLON = ';'; + + if ( *(p+2) == 'x' ) { + // Hexadecimal. + const char* q = p+3; + if ( !(*q) ) { + return 0; + } + + q = strchr( q, SEMICOLON ); + + if ( !q ) { + return 0; + } + TIXMLASSERT( *q == SEMICOLON ); + + delta = q-p; + --q; + + while ( *q != 'x' ) { + unsigned int digit = 0; + + if ( *q >= '0' && *q <= '9' ) { + digit = *q - '0'; + } + else if ( *q >= 'a' && *q <= 'f' ) { + digit = *q - 'a' + 10; + } + else if ( *q >= 'A' && *q <= 'F' ) { + digit = *q - 'A' + 10; + } + else { + return 0; + } + TIXMLASSERT( digit < 16 ); + TIXMLASSERT( digit == 0 || mult <= UINT_MAX / digit ); + const unsigned int digitScaled = mult * digit; + TIXMLASSERT( ucs <= ULONG_MAX - digitScaled ); + ucs += digitScaled; + TIXMLASSERT( mult <= UINT_MAX / 16 ); + mult *= 16; + --q; + } + } + else { + // Decimal. + const char* q = p+2; + if ( !(*q) ) { + return 0; + } + + q = strchr( q, SEMICOLON ); + + if ( !q ) { + return 0; + } + TIXMLASSERT( *q == SEMICOLON ); + + delta = q-p; + --q; + + while ( *q != '#' ) { + if ( *q >= '0' && *q <= '9' ) { + const unsigned int digit = *q - '0'; + TIXMLASSERT( digit < 10 ); + TIXMLASSERT( digit == 0 || mult <= UINT_MAX / digit ); + const unsigned int digitScaled = mult * digit; + TIXMLASSERT( ucs <= ULONG_MAX - digitScaled ); + ucs += digitScaled; + } + else { + return 0; + } + TIXMLASSERT( mult <= UINT_MAX / 10 ); + mult *= 10; + --q; + } + } + // convert the UCS to UTF-8 + ConvertUTF32ToUTF8( ucs, value, length ); + return p + delta + 1; + } + return p+1; +} + + +void XMLUtil::ToStr( int v, char* buffer, int bufferSize ) +{ + TIXML_SNPRINTF( buffer, bufferSize, "%d", v ); +} + + +void XMLUtil::ToStr( unsigned v, char* buffer, int bufferSize ) +{ + TIXML_SNPRINTF( buffer, bufferSize, "%u", v ); +} + + +void XMLUtil::ToStr( bool v, char* buffer, int bufferSize ) +{ + TIXML_SNPRINTF( buffer, bufferSize, "%s", v ? writeBoolTrue : writeBoolFalse); +} + +/* + ToStr() of a number is a very tricky topic. + https://github.com/leethomason/tinyxml2/issues/106 +*/ +void XMLUtil::ToStr( float v, char* buffer, int bufferSize ) +{ + TIXML_SNPRINTF( buffer, bufferSize, "%.8g", v ); +} + + +void XMLUtil::ToStr( double v, char* buffer, int bufferSize ) +{ + TIXML_SNPRINTF( buffer, bufferSize, "%.17g", v ); +} + + +void XMLUtil::ToStr( int64_t v, char* buffer, int bufferSize ) +{ + // horrible syntax trick to make the compiler happy about %lld + TIXML_SNPRINTF(buffer, bufferSize, "%lld", static_cast(v)); +} + +void XMLUtil::ToStr( uint64_t v, char* buffer, int bufferSize ) +{ + // horrible syntax trick to make the compiler happy about %llu + TIXML_SNPRINTF(buffer, bufferSize, "%llu", (long long)v); +} + +bool XMLUtil::ToInt(const char* str, int* value) +{ + if (IsPrefixHex(str)) { + unsigned v; + if (TIXML_SSCANF(str, "%x", &v) == 1) { + *value = static_cast(v); + return true; + } + } + else { + if (TIXML_SSCANF(str, "%d", value) == 1) { + return true; + } + } + return false; +} + +bool XMLUtil::ToUnsigned(const char* str, unsigned* value) +{ + if (TIXML_SSCANF(str, IsPrefixHex(str) ? "%x" : "%u", value) == 1) { + return true; + } + return false; +} + +bool XMLUtil::ToBool( const char* str, bool* value ) +{ + int ival = 0; + if ( ToInt( str, &ival )) { + *value = (ival==0) ? false : true; + return true; + } + static const char* TRUE_VALS[] = { "true", "True", "TRUE", 0 }; + static const char* FALSE_VALS[] = { "false", "False", "FALSE", 0 }; + + for (int i = 0; TRUE_VALS[i]; ++i) { + if (StringEqual(str, TRUE_VALS[i])) { + *value = true; + return true; + } + } + for (int i = 0; FALSE_VALS[i]; ++i) { + if (StringEqual(str, FALSE_VALS[i])) { + *value = false; + return true; + } + } + return false; +} + + +bool XMLUtil::ToFloat( const char* str, float* value ) +{ + if ( TIXML_SSCANF( str, "%f", value ) == 1 ) { + return true; + } + return false; +} + + +bool XMLUtil::ToDouble( const char* str, double* value ) +{ + if ( TIXML_SSCANF( str, "%lf", value ) == 1 ) { + return true; + } + return false; +} + + +bool XMLUtil::ToInt64(const char* str, int64_t* value) +{ + if (IsPrefixHex(str)) { + unsigned long long v = 0; // horrible syntax trick to make the compiler happy about %llx + if (TIXML_SSCANF(str, "%llx", &v) == 1) { + *value = static_cast(v); + return true; + } + } + else { + long long v = 0; // horrible syntax trick to make the compiler happy about %lld + if (TIXML_SSCANF(str, "%lld", &v) == 1) { + *value = static_cast(v); + return true; + } + } + return false; +} + + +bool XMLUtil::ToUnsigned64(const char* str, uint64_t* value) { + unsigned long long v = 0; // horrible syntax trick to make the compiler happy about %llu + if(TIXML_SSCANF(str, IsPrefixHex(str) ? "%llx" : "%llu", &v) == 1) { + *value = (uint64_t)v; + return true; + } + return false; +} + + +char* XMLDocument::Identify( char* p, XMLNode** node ) +{ + TIXMLASSERT( node ); + TIXMLASSERT( p ); + char* const start = p; + int const startLine = _parseCurLineNum; + p = XMLUtil::SkipWhiteSpace( p, &_parseCurLineNum ); + if( !*p ) { + *node = 0; + TIXMLASSERT( p ); + return p; + } + + // These strings define the matching patterns: + static const char* xmlHeader = { "( _commentPool ); + returnNode->_parseLineNum = _parseCurLineNum; + p += xmlHeaderLen; + } + else if ( XMLUtil::StringEqual( p, commentHeader, commentHeaderLen ) ) { + returnNode = CreateUnlinkedNode( _commentPool ); + returnNode->_parseLineNum = _parseCurLineNum; + p += commentHeaderLen; + } + else if ( XMLUtil::StringEqual( p, cdataHeader, cdataHeaderLen ) ) { + XMLText* text = CreateUnlinkedNode( _textPool ); + returnNode = text; + returnNode->_parseLineNum = _parseCurLineNum; + p += cdataHeaderLen; + text->SetCData( true ); + } + else if ( XMLUtil::StringEqual( p, dtdHeader, dtdHeaderLen ) ) { + returnNode = CreateUnlinkedNode( _commentPool ); + returnNode->_parseLineNum = _parseCurLineNum; + p += dtdHeaderLen; + } + else if ( XMLUtil::StringEqual( p, elementHeader, elementHeaderLen ) ) { + returnNode = CreateUnlinkedNode( _elementPool ); + returnNode->_parseLineNum = _parseCurLineNum; + p += elementHeaderLen; + } + else { + returnNode = CreateUnlinkedNode( _textPool ); + returnNode->_parseLineNum = _parseCurLineNum; // Report line of first non-whitespace character + p = start; // Back it up, all the text counts. + _parseCurLineNum = startLine; + } + + TIXMLASSERT( returnNode ); + TIXMLASSERT( p ); + *node = returnNode; + return p; +} + + +bool XMLDocument::Accept( XMLVisitor* visitor ) const +{ + TIXMLASSERT( visitor ); + if ( visitor->VisitEnter( *this ) ) { + for ( const XMLNode* node=FirstChild(); node; node=node->NextSibling() ) { + if ( !node->Accept( visitor ) ) { + break; + } + } + } + return visitor->VisitExit( *this ); +} + + +// --------- XMLNode ----------- // + +XMLNode::XMLNode( XMLDocument* doc ) : + _document( doc ), + _parent( 0 ), + _value(), + _parseLineNum( 0 ), + _firstChild( 0 ), _lastChild( 0 ), + _prev( 0 ), _next( 0 ), + _userData( 0 ), + _memPool( 0 ) +{ +} + + +XMLNode::~XMLNode() +{ + DeleteChildren(); + if ( _parent ) { + _parent->Unlink( this ); + } +} + +const char* XMLNode::Value() const +{ + // Edge case: XMLDocuments don't have a Value. Return null. + if ( this->ToDocument() ) + return 0; + return _value.GetStr(); +} + +void XMLNode::SetValue( const char* str, bool staticMem ) +{ + if ( staticMem ) { + _value.SetInternedStr( str ); + } + else { + _value.SetStr( str ); + } +} + +XMLNode* XMLNode::DeepClone(XMLDocument* target) const +{ + XMLNode* clone = this->ShallowClone(target); + if (!clone) return 0; + + for (const XMLNode* child = this->FirstChild(); child; child = child->NextSibling()) { + XMLNode* childClone = child->DeepClone(target); + TIXMLASSERT(childClone); + clone->InsertEndChild(childClone); + } + return clone; +} + +void XMLNode::DeleteChildren() +{ + while( _firstChild ) { + TIXMLASSERT( _lastChild ); + DeleteChild( _firstChild ); + } + _firstChild = _lastChild = 0; +} + + +void XMLNode::Unlink( XMLNode* child ) +{ + TIXMLASSERT( child ); + TIXMLASSERT( child->_document == _document ); + TIXMLASSERT( child->_parent == this ); + if ( child == _firstChild ) { + _firstChild = _firstChild->_next; + } + if ( child == _lastChild ) { + _lastChild = _lastChild->_prev; + } + + if ( child->_prev ) { + child->_prev->_next = child->_next; + } + if ( child->_next ) { + child->_next->_prev = child->_prev; + } + child->_next = 0; + child->_prev = 0; + child->_parent = 0; +} + + +void XMLNode::DeleteChild( XMLNode* node ) +{ + TIXMLASSERT( node ); + TIXMLASSERT( node->_document == _document ); + TIXMLASSERT( node->_parent == this ); + Unlink( node ); + TIXMLASSERT(node->_prev == 0); + TIXMLASSERT(node->_next == 0); + TIXMLASSERT(node->_parent == 0); + DeleteNode( node ); +} + + +XMLNode* XMLNode::InsertEndChild( XMLNode* addThis ) +{ + TIXMLASSERT( addThis ); + if ( addThis->_document != _document ) { + TIXMLASSERT( false ); + return 0; + } + InsertChildPreamble( addThis ); + + if ( _lastChild ) { + TIXMLASSERT( _firstChild ); + TIXMLASSERT( _lastChild->_next == 0 ); + _lastChild->_next = addThis; + addThis->_prev = _lastChild; + _lastChild = addThis; + + addThis->_next = 0; + } + else { + TIXMLASSERT( _firstChild == 0 ); + _firstChild = _lastChild = addThis; + + addThis->_prev = 0; + addThis->_next = 0; + } + addThis->_parent = this; + return addThis; +} + + +XMLNode* XMLNode::InsertFirstChild( XMLNode* addThis ) +{ + TIXMLASSERT( addThis ); + if ( addThis->_document != _document ) { + TIXMLASSERT( false ); + return 0; + } + InsertChildPreamble( addThis ); + + if ( _firstChild ) { + TIXMLASSERT( _lastChild ); + TIXMLASSERT( _firstChild->_prev == 0 ); + + _firstChild->_prev = addThis; + addThis->_next = _firstChild; + _firstChild = addThis; + + addThis->_prev = 0; + } + else { + TIXMLASSERT( _lastChild == 0 ); + _firstChild = _lastChild = addThis; + + addThis->_prev = 0; + addThis->_next = 0; + } + addThis->_parent = this; + return addThis; +} + + +XMLNode* XMLNode::InsertAfterChild( XMLNode* afterThis, XMLNode* addThis ) +{ + TIXMLASSERT( addThis ); + if ( addThis->_document != _document ) { + TIXMLASSERT( false ); + return 0; + } + + TIXMLASSERT( afterThis ); + + if ( afterThis->_parent != this ) { + TIXMLASSERT( false ); + return 0; + } + if ( afterThis == addThis ) { + // Current state: BeforeThis -> AddThis -> OneAfterAddThis + // Now AddThis must disappear from it's location and then + // reappear between BeforeThis and OneAfterAddThis. + // So just leave it where it is. + return addThis; + } + + if ( afterThis->_next == 0 ) { + // The last node or the only node. + return InsertEndChild( addThis ); + } + InsertChildPreamble( addThis ); + addThis->_prev = afterThis; + addThis->_next = afterThis->_next; + afterThis->_next->_prev = addThis; + afterThis->_next = addThis; + addThis->_parent = this; + return addThis; +} + + + + +const XMLElement* XMLNode::FirstChildElement( const char* name ) const +{ + for( const XMLNode* node = _firstChild; node; node = node->_next ) { + const XMLElement* element = node->ToElementWithName( name ); + if ( element ) { + return element; + } + } + return 0; +} + + +const XMLElement* XMLNode::LastChildElement( const char* name ) const +{ + for( const XMLNode* node = _lastChild; node; node = node->_prev ) { + const XMLElement* element = node->ToElementWithName( name ); + if ( element ) { + return element; + } + } + return 0; +} + + +const XMLElement* XMLNode::NextSiblingElement( const char* name ) const +{ + for( const XMLNode* node = _next; node; node = node->_next ) { + const XMLElement* element = node->ToElementWithName( name ); + if ( element ) { + return element; + } + } + return 0; +} + + +const XMLElement* XMLNode::PreviousSiblingElement( const char* name ) const +{ + for( const XMLNode* node = _prev; node; node = node->_prev ) { + const XMLElement* element = node->ToElementWithName( name ); + if ( element ) { + return element; + } + } + return 0; +} + + +char* XMLNode::ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr ) +{ + // This is a recursive method, but thinking about it "at the current level" + // it is a pretty simple flat list: + // + // + // + // With a special case: + // + // + // + // + // Where the closing element (/foo) *must* be the next thing after the opening + // element, and the names must match. BUT the tricky bit is that the closing + // element will be read by the child. + // + // 'endTag' is the end tag for this node, it is returned by a call to a child. + // 'parentEnd' is the end tag for the parent, which is filled in and returned. + + XMLDocument::DepthTracker tracker(_document); + if (_document->Error()) + return 0; + + while( p && *p ) { + XMLNode* node = 0; + + p = _document->Identify( p, &node ); + TIXMLASSERT( p ); + if ( node == 0 ) { + break; + } + + const int initialLineNum = node->_parseLineNum; + + StrPair endTag; + p = node->ParseDeep( p, &endTag, curLineNumPtr ); + if ( !p ) { + DeleteNode( node ); + if ( !_document->Error() ) { + _document->SetError( XML_ERROR_PARSING, initialLineNum, 0); + } + break; + } + + const XMLDeclaration* const decl = node->ToDeclaration(); + if ( decl ) { + // Declarations are only allowed at document level + // + // Multiple declarations are allowed but all declarations + // must occur before anything else. + // + // Optimized due to a security test case. If the first node is + // a declaration, and the last node is a declaration, then only + // declarations have so far been added. + bool wellLocated = false; + + if (ToDocument()) { + if (FirstChild()) { + wellLocated = + FirstChild() && + FirstChild()->ToDeclaration() && + LastChild() && + LastChild()->ToDeclaration(); + } + else { + wellLocated = true; + } + } + if ( !wellLocated ) { + _document->SetError( XML_ERROR_PARSING_DECLARATION, initialLineNum, "XMLDeclaration value=%s", decl->Value()); + DeleteNode( node ); + break; + } + } + + XMLElement* ele = node->ToElement(); + if ( ele ) { + // We read the end tag. Return it to the parent. + if ( ele->ClosingType() == XMLElement::CLOSING ) { + if ( parentEndTag ) { + ele->_value.TransferTo( parentEndTag ); + } + node->_memPool->SetTracked(); // created and then immediately deleted. + DeleteNode( node ); + return p; + } + + // Handle an end tag returned to this level. + // And handle a bunch of annoying errors. + bool mismatch = false; + if ( endTag.Empty() ) { + if ( ele->ClosingType() == XMLElement::OPEN ) { + mismatch = true; + } + } + else { + if ( ele->ClosingType() != XMLElement::OPEN ) { + mismatch = true; + } + else if ( !XMLUtil::StringEqual( endTag.GetStr(), ele->Name() ) ) { + mismatch = true; + } + } + if ( mismatch ) { + _document->SetError( XML_ERROR_MISMATCHED_ELEMENT, initialLineNum, "XMLElement name=%s", ele->Name()); + DeleteNode( node ); + break; + } + } + InsertEndChild( node ); + } + return 0; +} + +/*static*/ void XMLNode::DeleteNode( XMLNode* node ) +{ + if ( node == 0 ) { + return; + } + TIXMLASSERT(node->_document); + if (!node->ToDocument()) { + node->_document->MarkInUse(node); + } + + MemPool* pool = node->_memPool; + node->~XMLNode(); + pool->Free( node ); +} + +void XMLNode::InsertChildPreamble( XMLNode* insertThis ) const +{ + TIXMLASSERT( insertThis ); + TIXMLASSERT( insertThis->_document == _document ); + + if (insertThis->_parent) { + insertThis->_parent->Unlink( insertThis ); + } + else { + insertThis->_document->MarkInUse(insertThis); + insertThis->_memPool->SetTracked(); + } +} + +const XMLElement* XMLNode::ToElementWithName( const char* name ) const +{ + const XMLElement* element = this->ToElement(); + if ( element == 0 ) { + return 0; + } + if ( name == 0 ) { + return element; + } + if ( XMLUtil::StringEqual( element->Name(), name ) ) { + return element; + } + return 0; +} + +// --------- XMLText ---------- // +char* XMLText::ParseDeep( char* p, StrPair*, int* curLineNumPtr ) +{ + if ( this->CData() ) { + p = _value.ParseText( p, "]]>", StrPair::NEEDS_NEWLINE_NORMALIZATION, curLineNumPtr ); + if ( !p ) { + _document->SetError( XML_ERROR_PARSING_CDATA, _parseLineNum, 0 ); + } + return p; + } + else { + int flags = _document->ProcessEntities() ? StrPair::TEXT_ELEMENT : StrPair::TEXT_ELEMENT_LEAVE_ENTITIES; + if ( _document->WhitespaceMode() == COLLAPSE_WHITESPACE ) { + flags |= StrPair::NEEDS_WHITESPACE_COLLAPSING; + } + + p = _value.ParseText( p, "<", flags, curLineNumPtr ); + if ( p && *p ) { + return p-1; + } + if ( !p ) { + _document->SetError( XML_ERROR_PARSING_TEXT, _parseLineNum, 0 ); + } + } + return 0; +} + + +XMLNode* XMLText::ShallowClone( XMLDocument* doc ) const +{ + if ( !doc ) { + doc = _document; + } + XMLText* text = doc->NewText( Value() ); // fixme: this will always allocate memory. Intern? + text->SetCData( this->CData() ); + return text; +} + + +bool XMLText::ShallowEqual( const XMLNode* compare ) const +{ + TIXMLASSERT( compare ); + const XMLText* text = compare->ToText(); + return ( text && XMLUtil::StringEqual( text->Value(), Value() ) ); +} + + +bool XMLText::Accept( XMLVisitor* visitor ) const +{ + TIXMLASSERT( visitor ); + return visitor->Visit( *this ); +} + + +// --------- XMLComment ---------- // + +XMLComment::XMLComment( XMLDocument* doc ) : XMLNode( doc ) +{ +} + + +XMLComment::~XMLComment() +{ +} + + +char* XMLComment::ParseDeep( char* p, StrPair*, int* curLineNumPtr ) +{ + // Comment parses as text. + p = _value.ParseText( p, "-->", StrPair::COMMENT, curLineNumPtr ); + if ( p == 0 ) { + _document->SetError( XML_ERROR_PARSING_COMMENT, _parseLineNum, 0 ); + } + return p; +} + + +XMLNode* XMLComment::ShallowClone( XMLDocument* doc ) const +{ + if ( !doc ) { + doc = _document; + } + XMLComment* comment = doc->NewComment( Value() ); // fixme: this will always allocate memory. Intern? + return comment; +} + + +bool XMLComment::ShallowEqual( const XMLNode* compare ) const +{ + TIXMLASSERT( compare ); + const XMLComment* comment = compare->ToComment(); + return ( comment && XMLUtil::StringEqual( comment->Value(), Value() )); +} + + +bool XMLComment::Accept( XMLVisitor* visitor ) const +{ + TIXMLASSERT( visitor ); + return visitor->Visit( *this ); +} + + +// --------- XMLDeclaration ---------- // + +XMLDeclaration::XMLDeclaration( XMLDocument* doc ) : XMLNode( doc ) +{ +} + + +XMLDeclaration::~XMLDeclaration() +{ + //printf( "~XMLDeclaration\n" ); +} + + +char* XMLDeclaration::ParseDeep( char* p, StrPair*, int* curLineNumPtr ) +{ + // Declaration parses as text. + p = _value.ParseText( p, "?>", StrPair::NEEDS_NEWLINE_NORMALIZATION, curLineNumPtr ); + if ( p == 0 ) { + _document->SetError( XML_ERROR_PARSING_DECLARATION, _parseLineNum, 0 ); + } + return p; +} + + +XMLNode* XMLDeclaration::ShallowClone( XMLDocument* doc ) const +{ + if ( !doc ) { + doc = _document; + } + XMLDeclaration* dec = doc->NewDeclaration( Value() ); // fixme: this will always allocate memory. Intern? + return dec; +} + + +bool XMLDeclaration::ShallowEqual( const XMLNode* compare ) const +{ + TIXMLASSERT( compare ); + const XMLDeclaration* declaration = compare->ToDeclaration(); + return ( declaration && XMLUtil::StringEqual( declaration->Value(), Value() )); +} + + + +bool XMLDeclaration::Accept( XMLVisitor* visitor ) const +{ + TIXMLASSERT( visitor ); + return visitor->Visit( *this ); +} + +// --------- XMLUnknown ---------- // + +XMLUnknown::XMLUnknown( XMLDocument* doc ) : XMLNode( doc ) +{ +} + + +XMLUnknown::~XMLUnknown() +{ +} + + +char* XMLUnknown::ParseDeep( char* p, StrPair*, int* curLineNumPtr ) +{ + // Unknown parses as text. + p = _value.ParseText( p, ">", StrPair::NEEDS_NEWLINE_NORMALIZATION, curLineNumPtr ); + if ( !p ) { + _document->SetError( XML_ERROR_PARSING_UNKNOWN, _parseLineNum, 0 ); + } + return p; +} + + +XMLNode* XMLUnknown::ShallowClone( XMLDocument* doc ) const +{ + if ( !doc ) { + doc = _document; + } + XMLUnknown* text = doc->NewUnknown( Value() ); // fixme: this will always allocate memory. Intern? + return text; +} + + +bool XMLUnknown::ShallowEqual( const XMLNode* compare ) const +{ + TIXMLASSERT( compare ); + const XMLUnknown* unknown = compare->ToUnknown(); + return ( unknown && XMLUtil::StringEqual( unknown->Value(), Value() )); +} + + +bool XMLUnknown::Accept( XMLVisitor* visitor ) const +{ + TIXMLASSERT( visitor ); + return visitor->Visit( *this ); +} + +// --------- XMLAttribute ---------- // + +const char* XMLAttribute::Name() const +{ + return _name.GetStr(); +} + +const char* XMLAttribute::Value() const +{ + return _value.GetStr(); +} + +char* XMLAttribute::ParseDeep( char* p, bool processEntities, int* curLineNumPtr ) +{ + // Parse using the name rules: bug fix, was using ParseText before + p = _name.ParseName( p ); + if ( !p || !*p ) { + return 0; + } + + // Skip white space before = + p = XMLUtil::SkipWhiteSpace( p, curLineNumPtr ); + if ( *p != '=' ) { + return 0; + } + + ++p; // move up to opening quote + p = XMLUtil::SkipWhiteSpace( p, curLineNumPtr ); + if ( *p != '\"' && *p != '\'' ) { + return 0; + } + + const char endTag[2] = { *p, 0 }; + ++p; // move past opening quote + + p = _value.ParseText( p, endTag, processEntities ? StrPair::ATTRIBUTE_VALUE : StrPair::ATTRIBUTE_VALUE_LEAVE_ENTITIES, curLineNumPtr ); + return p; +} + + +void XMLAttribute::SetName( const char* n ) +{ + _name.SetStr( n ); +} + + +XMLError XMLAttribute::QueryIntValue( int* value ) const +{ + if ( XMLUtil::ToInt( Value(), value )) { + return XML_SUCCESS; + } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryUnsignedValue( unsigned int* value ) const +{ + if ( XMLUtil::ToUnsigned( Value(), value )) { + return XML_SUCCESS; + } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryInt64Value(int64_t* value) const +{ + if (XMLUtil::ToInt64(Value(), value)) { + return XML_SUCCESS; + } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryUnsigned64Value(uint64_t* value) const +{ + if(XMLUtil::ToUnsigned64(Value(), value)) { + return XML_SUCCESS; + } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryBoolValue( bool* value ) const +{ + if ( XMLUtil::ToBool( Value(), value )) { + return XML_SUCCESS; + } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryFloatValue( float* value ) const +{ + if ( XMLUtil::ToFloat( Value(), value )) { + return XML_SUCCESS; + } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryDoubleValue( double* value ) const +{ + if ( XMLUtil::ToDouble( Value(), value )) { + return XML_SUCCESS; + } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +void XMLAttribute::SetAttribute( const char* v ) +{ + _value.SetStr( v ); +} + + +void XMLAttribute::SetAttribute( int v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + _value.SetStr( buf ); +} + + +void XMLAttribute::SetAttribute( unsigned v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + _value.SetStr( buf ); +} + + +void XMLAttribute::SetAttribute(int64_t v) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(v, buf, BUF_SIZE); + _value.SetStr(buf); +} + +void XMLAttribute::SetAttribute(uint64_t v) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(v, buf, BUF_SIZE); + _value.SetStr(buf); +} + + +void XMLAttribute::SetAttribute( bool v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + _value.SetStr( buf ); +} + +void XMLAttribute::SetAttribute( double v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + _value.SetStr( buf ); +} + +void XMLAttribute::SetAttribute( float v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + _value.SetStr( buf ); +} + + +// --------- XMLElement ---------- // +XMLElement::XMLElement( XMLDocument* doc ) : XMLNode( doc ), + _closingType( OPEN ), + _rootAttribute( 0 ) +{ +} + + +XMLElement::~XMLElement() +{ + while( _rootAttribute ) { + XMLAttribute* next = _rootAttribute->_next; + DeleteAttribute( _rootAttribute ); + _rootAttribute = next; + } +} + + +const XMLAttribute* XMLElement::FindAttribute( const char* name ) const +{ + for( XMLAttribute* a = _rootAttribute; a; a = a->_next ) { + if ( XMLUtil::StringEqual( a->Name(), name ) ) { + return a; + } + } + return 0; +} + + +const char* XMLElement::Attribute( const char* name, const char* value ) const +{ + const XMLAttribute* a = FindAttribute( name ); + if ( !a ) { + return 0; + } + if ( !value || XMLUtil::StringEqual( a->Value(), value )) { + return a->Value(); + } + return 0; +} + +int XMLElement::IntAttribute(const char* name, int defaultValue) const +{ + int i = defaultValue; + QueryIntAttribute(name, &i); + return i; +} + +unsigned XMLElement::UnsignedAttribute(const char* name, unsigned defaultValue) const +{ + unsigned i = defaultValue; + QueryUnsignedAttribute(name, &i); + return i; +} + +int64_t XMLElement::Int64Attribute(const char* name, int64_t defaultValue) const +{ + int64_t i = defaultValue; + QueryInt64Attribute(name, &i); + return i; +} + +uint64_t XMLElement::Unsigned64Attribute(const char* name, uint64_t defaultValue) const +{ + uint64_t i = defaultValue; + QueryUnsigned64Attribute(name, &i); + return i; +} + +bool XMLElement::BoolAttribute(const char* name, bool defaultValue) const +{ + bool b = defaultValue; + QueryBoolAttribute(name, &b); + return b; +} + +double XMLElement::DoubleAttribute(const char* name, double defaultValue) const +{ + double d = defaultValue; + QueryDoubleAttribute(name, &d); + return d; +} + +float XMLElement::FloatAttribute(const char* name, float defaultValue) const +{ + float f = defaultValue; + QueryFloatAttribute(name, &f); + return f; +} + +const char* XMLElement::GetText() const +{ + /* skip comment node */ + const XMLNode* node = FirstChild(); + while (node) { + if (node->ToComment()) { + node = node->NextSibling(); + continue; + } + break; + } + + if ( node && node->ToText() ) { + return node->Value(); + } + return 0; +} + + +void XMLElement::SetText( const char* inText ) +{ + if ( FirstChild() && FirstChild()->ToText() ) + FirstChild()->SetValue( inText ); + else { + XMLText* theText = GetDocument()->NewText( inText ); + InsertFirstChild( theText ); + } +} + + +void XMLElement::SetText( int v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + SetText( buf ); +} + + +void XMLElement::SetText( unsigned v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + SetText( buf ); +} + + +void XMLElement::SetText(int64_t v) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(v, buf, BUF_SIZE); + SetText(buf); +} + +void XMLElement::SetText(uint64_t v) { + char buf[BUF_SIZE]; + XMLUtil::ToStr(v, buf, BUF_SIZE); + SetText(buf); +} + + +void XMLElement::SetText( bool v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + SetText( buf ); +} + + +void XMLElement::SetText( float v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + SetText( buf ); +} + + +void XMLElement::SetText( double v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + SetText( buf ); +} + + +XMLError XMLElement::QueryIntText( int* ival ) const +{ + if ( FirstChild() && FirstChild()->ToText() ) { + const char* t = FirstChild()->Value(); + if ( XMLUtil::ToInt( t, ival ) ) { + return XML_SUCCESS; + } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryUnsignedText( unsigned* uval ) const +{ + if ( FirstChild() && FirstChild()->ToText() ) { + const char* t = FirstChild()->Value(); + if ( XMLUtil::ToUnsigned( t, uval ) ) { + return XML_SUCCESS; + } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryInt64Text(int64_t* ival) const +{ + if (FirstChild() && FirstChild()->ToText()) { + const char* t = FirstChild()->Value(); + if (XMLUtil::ToInt64(t, ival)) { + return XML_SUCCESS; + } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryUnsigned64Text(uint64_t* ival) const +{ + if(FirstChild() && FirstChild()->ToText()) { + const char* t = FirstChild()->Value(); + if(XMLUtil::ToUnsigned64(t, ival)) { + return XML_SUCCESS; + } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryBoolText( bool* bval ) const +{ + if ( FirstChild() && FirstChild()->ToText() ) { + const char* t = FirstChild()->Value(); + if ( XMLUtil::ToBool( t, bval ) ) { + return XML_SUCCESS; + } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryDoubleText( double* dval ) const +{ + if ( FirstChild() && FirstChild()->ToText() ) { + const char* t = FirstChild()->Value(); + if ( XMLUtil::ToDouble( t, dval ) ) { + return XML_SUCCESS; + } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryFloatText( float* fval ) const +{ + if ( FirstChild() && FirstChild()->ToText() ) { + const char* t = FirstChild()->Value(); + if ( XMLUtil::ToFloat( t, fval ) ) { + return XML_SUCCESS; + } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + +int XMLElement::IntText(int defaultValue) const +{ + int i = defaultValue; + QueryIntText(&i); + return i; +} + +unsigned XMLElement::UnsignedText(unsigned defaultValue) const +{ + unsigned i = defaultValue; + QueryUnsignedText(&i); + return i; +} + +int64_t XMLElement::Int64Text(int64_t defaultValue) const +{ + int64_t i = defaultValue; + QueryInt64Text(&i); + return i; +} + +uint64_t XMLElement::Unsigned64Text(uint64_t defaultValue) const +{ + uint64_t i = defaultValue; + QueryUnsigned64Text(&i); + return i; +} + +bool XMLElement::BoolText(bool defaultValue) const +{ + bool b = defaultValue; + QueryBoolText(&b); + return b; +} + +double XMLElement::DoubleText(double defaultValue) const +{ + double d = defaultValue; + QueryDoubleText(&d); + return d; +} + +float XMLElement::FloatText(float defaultValue) const +{ + float f = defaultValue; + QueryFloatText(&f); + return f; +} + + +XMLAttribute* XMLElement::FindOrCreateAttribute( const char* name ) +{ + XMLAttribute* last = 0; + XMLAttribute* attrib = 0; + for( attrib = _rootAttribute; + attrib; + last = attrib, attrib = attrib->_next ) { + if ( XMLUtil::StringEqual( attrib->Name(), name ) ) { + break; + } + } + if ( !attrib ) { + attrib = CreateAttribute(); + TIXMLASSERT( attrib ); + if ( last ) { + TIXMLASSERT( last->_next == 0 ); + last->_next = attrib; + } + else { + TIXMLASSERT( _rootAttribute == 0 ); + _rootAttribute = attrib; + } + attrib->SetName( name ); + } + return attrib; +} + + +void XMLElement::DeleteAttribute( const char* name ) +{ + XMLAttribute* prev = 0; + for( XMLAttribute* a=_rootAttribute; a; a=a->_next ) { + if ( XMLUtil::StringEqual( name, a->Name() ) ) { + if ( prev ) { + prev->_next = a->_next; + } + else { + _rootAttribute = a->_next; + } + DeleteAttribute( a ); + break; + } + prev = a; + } +} + + +char* XMLElement::ParseAttributes( char* p, int* curLineNumPtr ) +{ + XMLAttribute* prevAttribute = 0; + + // Read the attributes. + while( p ) { + p = XMLUtil::SkipWhiteSpace( p, curLineNumPtr ); + if ( !(*p) ) { + _document->SetError( XML_ERROR_PARSING_ELEMENT, _parseLineNum, "XMLElement name=%s", Name() ); + return 0; + } + + // attribute. + if (XMLUtil::IsNameStartChar( (unsigned char) *p ) ) { + XMLAttribute* attrib = CreateAttribute(); + TIXMLASSERT( attrib ); + attrib->_parseLineNum = _document->_parseCurLineNum; + + const int attrLineNum = attrib->_parseLineNum; + + p = attrib->ParseDeep( p, _document->ProcessEntities(), curLineNumPtr ); + if ( !p || Attribute( attrib->Name() ) ) { + DeleteAttribute( attrib ); + _document->SetError( XML_ERROR_PARSING_ATTRIBUTE, attrLineNum, "XMLElement name=%s", Name() ); + return 0; + } + // There is a minor bug here: if the attribute in the source xml + // document is duplicated, it will not be detected and the + // attribute will be doubly added. However, tracking the 'prevAttribute' + // avoids re-scanning the attribute list. Preferring performance for + // now, may reconsider in the future. + if ( prevAttribute ) { + TIXMLASSERT( prevAttribute->_next == 0 ); + prevAttribute->_next = attrib; + } + else { + TIXMLASSERT( _rootAttribute == 0 ); + _rootAttribute = attrib; + } + prevAttribute = attrib; + } + // end of the tag + else if ( *p == '>' ) { + ++p; + break; + } + // end of the tag + else if ( *p == '/' && *(p+1) == '>' ) { + _closingType = CLOSED; + return p+2; // done; sealed element. + } + else { + _document->SetError( XML_ERROR_PARSING_ELEMENT, _parseLineNum, 0 ); + return 0; + } + } + return p; +} + +void XMLElement::DeleteAttribute( XMLAttribute* attribute ) +{ + if ( attribute == 0 ) { + return; + } + MemPool* pool = attribute->_memPool; + attribute->~XMLAttribute(); + pool->Free( attribute ); +} + +XMLAttribute* XMLElement::CreateAttribute() +{ + TIXMLASSERT( sizeof( XMLAttribute ) == _document->_attributePool.ItemSize() ); + XMLAttribute* attrib = new (_document->_attributePool.Alloc() ) XMLAttribute(); + TIXMLASSERT( attrib ); + attrib->_memPool = &_document->_attributePool; + attrib->_memPool->SetTracked(); + return attrib; +} + + +XMLElement* XMLElement::InsertNewChildElement(const char* name) +{ + XMLElement* node = _document->NewElement(name); + return InsertEndChild(node) ? node : 0; +} + +XMLComment* XMLElement::InsertNewComment(const char* comment) +{ + XMLComment* node = _document->NewComment(comment); + return InsertEndChild(node) ? node : 0; +} + +XMLText* XMLElement::InsertNewText(const char* text) +{ + XMLText* node = _document->NewText(text); + return InsertEndChild(node) ? node : 0; +} + +XMLDeclaration* XMLElement::InsertNewDeclaration(const char* text) +{ + XMLDeclaration* node = _document->NewDeclaration(text); + return InsertEndChild(node) ? node : 0; +} + +XMLUnknown* XMLElement::InsertNewUnknown(const char* text) +{ + XMLUnknown* node = _document->NewUnknown(text); + return InsertEndChild(node) ? node : 0; +} + + + +// +// +// foobar +// +char* XMLElement::ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr ) +{ + // Read the element name. + p = XMLUtil::SkipWhiteSpace( p, curLineNumPtr ); + + // The closing element is the form. It is + // parsed just like a regular element then deleted from + // the DOM. + if ( *p == '/' ) { + _closingType = CLOSING; + ++p; + } + + p = _value.ParseName( p ); + if ( _value.Empty() ) { + return 0; + } + + p = ParseAttributes( p, curLineNumPtr ); + if ( !p || !*p || _closingType != OPEN ) { + return p; + } + + p = XMLNode::ParseDeep( p, parentEndTag, curLineNumPtr ); + return p; +} + + + +XMLNode* XMLElement::ShallowClone( XMLDocument* doc ) const +{ + if ( !doc ) { + doc = _document; + } + XMLElement* element = doc->NewElement( Value() ); // fixme: this will always allocate memory. Intern? + for( const XMLAttribute* a=FirstAttribute(); a; a=a->Next() ) { + element->SetAttribute( a->Name(), a->Value() ); // fixme: this will always allocate memory. Intern? + } + return element; +} + + +bool XMLElement::ShallowEqual( const XMLNode* compare ) const +{ + TIXMLASSERT( compare ); + const XMLElement* other = compare->ToElement(); + if ( other && XMLUtil::StringEqual( other->Name(), Name() )) { + + const XMLAttribute* a=FirstAttribute(); + const XMLAttribute* b=other->FirstAttribute(); + + while ( a && b ) { + if ( !XMLUtil::StringEqual( a->Value(), b->Value() ) ) { + return false; + } + a = a->Next(); + b = b->Next(); + } + if ( a || b ) { + // different count + return false; + } + return true; + } + return false; +} + + +bool XMLElement::Accept( XMLVisitor* visitor ) const +{ + TIXMLASSERT( visitor ); + if ( visitor->VisitEnter( *this, _rootAttribute ) ) { + for ( const XMLNode* node=FirstChild(); node; node=node->NextSibling() ) { + if ( !node->Accept( visitor ) ) { + break; + } + } + } + return visitor->VisitExit( *this ); +} + + +// --------- XMLDocument ----------- // + +// Warning: List must match 'enum XMLError' +const char* XMLDocument::_errorNames[XML_ERROR_COUNT] = { + "XML_SUCCESS", + "XML_NO_ATTRIBUTE", + "XML_WRONG_ATTRIBUTE_TYPE", + "XML_ERROR_FILE_NOT_FOUND", + "XML_ERROR_FILE_COULD_NOT_BE_OPENED", + "XML_ERROR_FILE_READ_ERROR", + "XML_ERROR_PARSING_ELEMENT", + "XML_ERROR_PARSING_ATTRIBUTE", + "XML_ERROR_PARSING_TEXT", + "XML_ERROR_PARSING_CDATA", + "XML_ERROR_PARSING_COMMENT", + "XML_ERROR_PARSING_DECLARATION", + "XML_ERROR_PARSING_UNKNOWN", + "XML_ERROR_EMPTY_DOCUMENT", + "XML_ERROR_MISMATCHED_ELEMENT", + "XML_ERROR_PARSING", + "XML_CAN_NOT_CONVERT_TEXT", + "XML_NO_TEXT_NODE", + "XML_ELEMENT_DEPTH_EXCEEDED" +}; + + +XMLDocument::XMLDocument( bool processEntities, Whitespace whitespaceMode ) : + XMLNode( 0 ), + _writeBOM( false ), + _processEntities( processEntities ), + _errorID(XML_SUCCESS), + _whitespaceMode( whitespaceMode ), + _errorStr(), + _errorLineNum( 0 ), + _charBuffer( 0 ), + _parseCurLineNum( 0 ), + _parsingDepth(0), + _unlinked(), + _elementPool(), + _attributePool(), + _textPool(), + _commentPool() +{ + // avoid VC++ C4355 warning about 'this' in initializer list (C4355 is off by default in VS2012+) + _document = this; +} + + +XMLDocument::~XMLDocument() +{ + Clear(); +} + + +void XMLDocument::MarkInUse(const XMLNode* const node) +{ + TIXMLASSERT(node); + TIXMLASSERT(node->_parent == 0); + + for (int i = 0; i < _unlinked.Size(); ++i) { + if (node == _unlinked[i]) { + _unlinked.SwapRemove(i); + break; + } + } +} + +void XMLDocument::Clear() +{ + DeleteChildren(); + while( _unlinked.Size()) { + DeleteNode(_unlinked[0]); // Will remove from _unlinked as part of delete. + } + +#ifdef TINYXML2_DEBUG + const bool hadError = Error(); +#endif + ClearError(); + + delete [] _charBuffer; + _charBuffer = 0; + _parsingDepth = 0; + +#if 0 + _textPool.Trace( "text" ); + _elementPool.Trace( "element" ); + _commentPool.Trace( "comment" ); + _attributePool.Trace( "attribute" ); +#endif + +#ifdef TINYXML2_DEBUG + if ( !hadError ) { + TIXMLASSERT( _elementPool.CurrentAllocs() == _elementPool.Untracked() ); + TIXMLASSERT( _attributePool.CurrentAllocs() == _attributePool.Untracked() ); + TIXMLASSERT( _textPool.CurrentAllocs() == _textPool.Untracked() ); + TIXMLASSERT( _commentPool.CurrentAllocs() == _commentPool.Untracked() ); + } +#endif +} + + +void XMLDocument::DeepCopy(XMLDocument* target) const +{ + TIXMLASSERT(target); + if (target == this) { + return; // technically success - a no-op. + } + + target->Clear(); + for (const XMLNode* node = this->FirstChild(); node; node = node->NextSibling()) { + target->InsertEndChild(node->DeepClone(target)); + } +} + +XMLElement* XMLDocument::NewElement( const char* name ) +{ + XMLElement* ele = CreateUnlinkedNode( _elementPool ); + ele->SetName( name ); + return ele; +} + + +XMLComment* XMLDocument::NewComment( const char* str ) +{ + XMLComment* comment = CreateUnlinkedNode( _commentPool ); + comment->SetValue( str ); + return comment; +} + + +XMLText* XMLDocument::NewText( const char* str ) +{ + XMLText* text = CreateUnlinkedNode( _textPool ); + text->SetValue( str ); + return text; +} + + +XMLDeclaration* XMLDocument::NewDeclaration( const char* str ) +{ + XMLDeclaration* dec = CreateUnlinkedNode( _commentPool ); + dec->SetValue( str ? str : "xml version=\"1.0\" encoding=\"UTF-8\"" ); + return dec; +} + + +XMLUnknown* XMLDocument::NewUnknown( const char* str ) +{ + XMLUnknown* unk = CreateUnlinkedNode( _commentPool ); + unk->SetValue( str ); + return unk; +} + +static FILE* callfopen( const char* filepath, const char* mode ) +{ + TIXMLASSERT( filepath ); + TIXMLASSERT( mode ); +#if defined(_MSC_VER) && (_MSC_VER >= 1400 ) && (!defined WINCE) + FILE* fp = 0; + const errno_t err = fopen_s( &fp, filepath, mode ); + if ( err ) { + return 0; + } +#else + FILE* fp = fopen( filepath, mode ); +#endif + return fp; +} + +void XMLDocument::DeleteNode( XMLNode* node ) { + TIXMLASSERT( node ); + TIXMLASSERT(node->_document == this ); + if (node->_parent) { + node->_parent->DeleteChild( node ); + } + else { + // Isn't in the tree. + // Use the parent delete. + // Also, we need to mark it tracked: we 'know' + // it was never used. + node->_memPool->SetTracked(); + // Call the static XMLNode version: + XMLNode::DeleteNode(node); + } +} + + +XMLError XMLDocument::LoadFile( const char* filename ) +{ + if ( !filename ) { + TIXMLASSERT( false ); + SetError( XML_ERROR_FILE_COULD_NOT_BE_OPENED, 0, "filename=" ); + return _errorID; + } + + Clear(); + FILE* fp = callfopen( filename, "rb" ); + if ( !fp ) { + SetError( XML_ERROR_FILE_NOT_FOUND, 0, "filename=%s", filename ); + return _errorID; + } + LoadFile( fp ); + fclose( fp ); + return _errorID; +} + +XMLError XMLDocument::LoadFile( FILE* fp ) +{ + Clear(); + + TIXML_FSEEK( fp, 0, SEEK_SET ); + if ( fgetc( fp ) == EOF && ferror( fp ) != 0 ) { + SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 ); + return _errorID; + } + + TIXML_FSEEK( fp, 0, SEEK_END ); + + unsigned long long filelength; + { + const long long fileLengthSigned = TIXML_FTELL( fp ); + TIXML_FSEEK( fp, 0, SEEK_SET ); + if ( fileLengthSigned == -1L ) { + SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 ); + return _errorID; + } + TIXMLASSERT( fileLengthSigned >= 0 ); + filelength = static_cast(fileLengthSigned); + } + + const size_t maxSizeT = static_cast(-1); + // We'll do the comparison as an unsigned long long, because that's guaranteed to be at + // least 8 bytes, even on a 32-bit platform. + if ( filelength >= static_cast(maxSizeT) ) { + // Cannot handle files which won't fit in buffer together with null terminator + SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 ); + return _errorID; + } + + if ( filelength == 0 ) { + SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); + return _errorID; + } + + const size_t size = static_cast(filelength); + TIXMLASSERT( _charBuffer == 0 ); + _charBuffer = new char[size+1]; + const size_t read = fread( _charBuffer, 1, size, fp ); + if ( read != size ) { + SetError( XML_ERROR_FILE_READ_ERROR, 0, 0 ); + return _errorID; + } + + _charBuffer[size] = 0; + + Parse(); + return _errorID; +} + + +XMLError XMLDocument::SaveFile( const char* filename, bool compact ) +{ + if ( !filename ) { + TIXMLASSERT( false ); + SetError( XML_ERROR_FILE_COULD_NOT_BE_OPENED, 0, "filename=" ); + return _errorID; + } + + FILE* fp = callfopen( filename, "w" ); + if ( !fp ) { + SetError( XML_ERROR_FILE_COULD_NOT_BE_OPENED, 0, "filename=%s", filename ); + return _errorID; + } + SaveFile(fp, compact); + fclose( fp ); + return _errorID; +} + + +XMLError XMLDocument::SaveFile( FILE* fp, bool compact ) +{ + // Clear any error from the last save, otherwise it will get reported + // for *this* call. + ClearError(); + XMLPrinter stream( fp, compact ); + Print( &stream ); + return _errorID; +} + + +XMLError XMLDocument::Parse( const char* p, size_t len ) +{ + Clear(); + + if ( len == 0 || !p || !*p ) { + SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); + return _errorID; + } + if ( len == static_cast(-1) ) { + len = strlen( p ); + } + TIXMLASSERT( _charBuffer == 0 ); + _charBuffer = new char[ len+1 ]; + memcpy( _charBuffer, p, len ); + _charBuffer[len] = 0; + + Parse(); + if ( Error() ) { + // clean up now essentially dangling memory. + // and the parse fail can put objects in the + // pools that are dead and inaccessible. + DeleteChildren(); + _elementPool.Clear(); + _attributePool.Clear(); + _textPool.Clear(); + _commentPool.Clear(); + } + return _errorID; +} + + +void XMLDocument::Print( XMLPrinter* streamer ) const +{ + if ( streamer ) { + Accept( streamer ); + } + else { + XMLPrinter stdoutStreamer( stdout ); + Accept( &stdoutStreamer ); + } +} + + +void XMLDocument::ClearError() { + _errorID = XML_SUCCESS; + _errorLineNum = 0; + _errorStr.Reset(); +} + + +void XMLDocument::SetError( XMLError error, int lineNum, const char* format, ... ) +{ + TIXMLASSERT( error >= 0 && error < XML_ERROR_COUNT ); + _errorID = error; + _errorLineNum = lineNum; + _errorStr.Reset(); + + const size_t BUFFER_SIZE = 1000; + char* buffer = new char[BUFFER_SIZE]; + + TIXMLASSERT(sizeof(error) <= sizeof(int)); + TIXML_SNPRINTF(buffer, BUFFER_SIZE, "Error=%s ErrorID=%d (0x%x) Line number=%d", ErrorIDToName(error), int(error), int(error), lineNum); + + if (format) { + size_t len = strlen(buffer); + TIXML_SNPRINTF(buffer + len, BUFFER_SIZE - len, ": "); + len = strlen(buffer); + + va_list va; + va_start(va, format); + TIXML_VSNPRINTF(buffer + len, BUFFER_SIZE - len, format, va); + va_end(va); + } + _errorStr.SetStr(buffer); + delete[] buffer; +} + + +/*static*/ const char* XMLDocument::ErrorIDToName(XMLError errorID) +{ + TIXMLASSERT( errorID >= 0 && errorID < XML_ERROR_COUNT ); + const char* errorName = _errorNames[errorID]; + TIXMLASSERT( errorName && errorName[0] ); + return errorName; +} + +const char* XMLDocument::ErrorStr() const +{ + return _errorStr.Empty() ? "" : _errorStr.GetStr(); +} + + +void XMLDocument::PrintError() const +{ + printf("%s\n", ErrorStr()); +} + +const char* XMLDocument::ErrorName() const +{ + return ErrorIDToName(_errorID); +} + +void XMLDocument::Parse() +{ + TIXMLASSERT( NoChildren() ); // Clear() must have been called previously + TIXMLASSERT( _charBuffer ); + _parseCurLineNum = 1; + _parseLineNum = 1; + char* p = _charBuffer; + p = XMLUtil::SkipWhiteSpace( p, &_parseCurLineNum ); + p = const_cast( XMLUtil::ReadBOM( p, &_writeBOM ) ); + if ( !*p ) { + SetError( XML_ERROR_EMPTY_DOCUMENT, 0, 0 ); + return; + } + ParseDeep(p, 0, &_parseCurLineNum ); +} + +void XMLDocument::PushDepth() +{ + _parsingDepth++; + if (_parsingDepth == TINYXML2_MAX_ELEMENT_DEPTH) { + SetError(XML_ELEMENT_DEPTH_EXCEEDED, _parseCurLineNum, "Element nesting is too deep." ); + } +} + +void XMLDocument::PopDepth() +{ + TIXMLASSERT(_parsingDepth > 0); + --_parsingDepth; +} + +XMLPrinter::XMLPrinter( FILE* file, bool compact, int depth ) : + _elementJustOpened( false ), + _stack(), + _firstElement( true ), + _fp( file ), + _depth( depth ), + _textDepth( -1 ), + _processEntities( true ), + _compactMode( compact ), + _buffer() +{ + for( int i=0; i(entityValue); + TIXMLASSERT( flagIndex < ENTITY_RANGE ); + _entityFlag[flagIndex] = true; + } + _restrictedEntityFlag[static_cast('&')] = true; + _restrictedEntityFlag[static_cast('<')] = true; + _restrictedEntityFlag[static_cast('>')] = true; // not required, but consistency is nice + _buffer.Push( 0 ); +} + + +void XMLPrinter::Print( const char* format, ... ) +{ + va_list va; + va_start( va, format ); + + if ( _fp ) { + vfprintf( _fp, format, va ); + } + else { + const int len = TIXML_VSCPRINTF( format, va ); + // Close out and re-start the va-args + va_end( va ); + TIXMLASSERT( len >= 0 ); + va_start( va, format ); + TIXMLASSERT( _buffer.Size() > 0 && _buffer[_buffer.Size() - 1] == 0 ); + char* p = _buffer.PushArr( len ) - 1; // back up over the null terminator. + TIXML_VSNPRINTF( p, len+1, format, va ); + } + va_end( va ); +} + + +void XMLPrinter::Write( const char* data, size_t size ) +{ + if ( _fp ) { + fwrite ( data , sizeof(char), size, _fp); + } + else { + char* p = _buffer.PushArr( static_cast(size) ) - 1; // back up over the null terminator. + memcpy( p, data, size ); + p[size] = 0; + } +} + + +void XMLPrinter::Putc( char ch ) +{ + if ( _fp ) { + fputc ( ch, _fp); + } + else { + char* p = _buffer.PushArr( sizeof(char) ) - 1; // back up over the null terminator. + p[0] = ch; + p[1] = 0; + } +} + + +void XMLPrinter::PrintSpace( int depth ) +{ + for( int i=0; i 0 && *q < ENTITY_RANGE ) { + // Check for entities. If one is found, flush + // the stream up until the entity, write the + // entity, and keep looking. + if ( flag[static_cast(*q)] ) { + while ( p < q ) { + const size_t delta = q - p; + const int toPrint = ( INT_MAX < delta ) ? INT_MAX : static_cast(delta); + Write( p, toPrint ); + p += toPrint; + } + bool entityPatternPrinted = false; + for( int i=0; i(delta); + Write( p, toPrint ); + } + } + else { + Write( p ); + } +} + + +void XMLPrinter::PushHeader( bool writeBOM, bool writeDec ) +{ + if ( writeBOM ) { + static const unsigned char bom[] = { TIXML_UTF_LEAD_0, TIXML_UTF_LEAD_1, TIXML_UTF_LEAD_2, 0 }; + Write( reinterpret_cast< const char* >( bom ) ); + } + if ( writeDec ) { + PushDeclaration( "xml version=\"1.0\"" ); + } +} + +void XMLPrinter::PrepareForNewNode( bool compactMode ) +{ + SealElementIfJustOpened(); + + if ( compactMode ) { + return; + } + + if ( _firstElement ) { + PrintSpace (_depth); + } else if ( _textDepth < 0) { + Putc( '\n' ); + PrintSpace( _depth ); + } + + _firstElement = false; +} + +void XMLPrinter::OpenElement( const char* name, bool compactMode ) +{ + PrepareForNewNode( compactMode ); + _stack.Push( name ); + + Write ( "<" ); + Write ( name ); + + _elementJustOpened = true; + ++_depth; +} + + +void XMLPrinter::PushAttribute( const char* name, const char* value ) +{ + TIXMLASSERT( _elementJustOpened ); + Putc ( ' ' ); + Write( name ); + Write( "=\"" ); + PrintString( value, false ); + Putc ( '\"' ); +} + + +void XMLPrinter::PushAttribute( const char* name, int v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + PushAttribute( name, buf ); +} + + +void XMLPrinter::PushAttribute( const char* name, unsigned v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + PushAttribute( name, buf ); +} + + +void XMLPrinter::PushAttribute(const char* name, int64_t v) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(v, buf, BUF_SIZE); + PushAttribute(name, buf); +} + + +void XMLPrinter::PushAttribute(const char* name, uint64_t v) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(v, buf, BUF_SIZE); + PushAttribute(name, buf); +} + + +void XMLPrinter::PushAttribute( const char* name, bool v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + PushAttribute( name, buf ); +} + + +void XMLPrinter::PushAttribute( const char* name, double v ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( v, buf, BUF_SIZE ); + PushAttribute( name, buf ); +} + + +void XMLPrinter::CloseElement( bool compactMode ) +{ + --_depth; + const char* name = _stack.Pop(); + + if ( _elementJustOpened ) { + Write( "/>" ); + } + else { + if ( _textDepth < 0 && !compactMode) { + Putc( '\n' ); + PrintSpace( _depth ); + } + Write ( "" ); + } + + if ( _textDepth == _depth ) { + _textDepth = -1; + } + if ( _depth == 0 && !compactMode) { + Putc( '\n' ); + } + _elementJustOpened = false; +} + + +void XMLPrinter::SealElementIfJustOpened() +{ + if ( !_elementJustOpened ) { + return; + } + _elementJustOpened = false; + Putc( '>' ); +} + + +void XMLPrinter::PushText( const char* text, bool cdata ) +{ + _textDepth = _depth-1; + + SealElementIfJustOpened(); + if ( cdata ) { + Write( "" ); + } + else { + PrintString( text, true ); + } +} + + +void XMLPrinter::PushText( int64_t value ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( value, buf, BUF_SIZE ); + PushText( buf, false ); +} + + +void XMLPrinter::PushText( uint64_t value ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushText(buf, false); +} + + +void XMLPrinter::PushText( int value ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( value, buf, BUF_SIZE ); + PushText( buf, false ); +} + + +void XMLPrinter::PushText( unsigned value ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( value, buf, BUF_SIZE ); + PushText( buf, false ); +} + + +void XMLPrinter::PushText( bool value ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( value, buf, BUF_SIZE ); + PushText( buf, false ); +} + + +void XMLPrinter::PushText( float value ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( value, buf, BUF_SIZE ); + PushText( buf, false ); +} + + +void XMLPrinter::PushText( double value ) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr( value, buf, BUF_SIZE ); + PushText( buf, false ); +} + + +void XMLPrinter::PushComment( const char* comment ) +{ + PrepareForNewNode( _compactMode ); + + Write( "" ); +} + + +void XMLPrinter::PushDeclaration( const char* value ) +{ + PrepareForNewNode( _compactMode ); + + Write( "" ); +} + + +void XMLPrinter::PushUnknown( const char* value ) +{ + PrepareForNewNode( _compactMode ); + + Write( "' ); +} + + +bool XMLPrinter::VisitEnter( const XMLDocument& doc ) +{ + _processEntities = doc.ProcessEntities(); + if ( doc.HasBOM() ) { + PushHeader( true, false ); + } + return true; +} + + +bool XMLPrinter::VisitEnter( const XMLElement& element, const XMLAttribute* attribute ) +{ + const XMLElement* parentElem = 0; + if ( element.Parent() ) { + parentElem = element.Parent()->ToElement(); + } + const bool compactMode = parentElem ? CompactMode( *parentElem ) : _compactMode; + OpenElement( element.Name(), compactMode ); + while ( attribute ) { + PushAttribute( attribute->Name(), attribute->Value() ); + attribute = attribute->Next(); + } + return true; +} + + +bool XMLPrinter::VisitExit( const XMLElement& element ) +{ + CloseElement( CompactMode(element) ); + return true; +} + + +bool XMLPrinter::Visit( const XMLText& text ) +{ + PushText( text.Value(), text.CData() ); + return true; +} + + +bool XMLPrinter::Visit( const XMLComment& comment ) +{ + PushComment( comment.Value() ); + return true; +} + +bool XMLPrinter::Visit( const XMLDeclaration& declaration ) +{ + PushDeclaration( declaration.Value() ); + return true; +} + + +bool XMLPrinter::Visit( const XMLUnknown& unknown ) +{ + PushUnknown( unknown.Value() ); + return true; +} + +} // namespace tinyxml2 diff --git a/external_libs/tinyxml2/tinyxml2.h b/external_libs/tinyxml2/tinyxml2.h new file mode 100644 index 0000000..452ae95 --- /dev/null +++ b/external_libs/tinyxml2/tinyxml2.h @@ -0,0 +1,2380 @@ +/* +Original code by Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#ifndef TINYXML2_INCLUDED +#define TINYXML2_INCLUDED + +#if defined(ANDROID_NDK) || defined(__BORLANDC__) || defined(__QNXNTO__) +# include +# include +# include +# include +# include +# if defined(__PS3__) +# include +# endif +#else +# include +# include +# include +# include +# include +#endif +#include + +/* + TODO: intern strings instead of allocation. +*/ +/* + gcc: + g++ -Wall -DTINYXML2_DEBUG tinyxml2.cpp xmltest.cpp -o gccxmltest.exe + + Formatting, Artistic Style: + AStyle.exe --style=1tbs --indent-switches --break-closing-brackets --indent-preprocessor tinyxml2.cpp tinyxml2.h +*/ + +#if defined( _DEBUG ) || defined (__DEBUG__) +# ifndef TINYXML2_DEBUG +# define TINYXML2_DEBUG +# endif +#endif + +#ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable: 4251) +#endif + +#ifdef _WIN32 +# ifdef TINYXML2_EXPORT +# define TINYXML2_LIB __declspec(dllexport) +# elif defined(TINYXML2_IMPORT) +# define TINYXML2_LIB __declspec(dllimport) +# else +# define TINYXML2_LIB +# endif +#elif __GNUC__ >= 4 +# define TINYXML2_LIB __attribute__((visibility("default"))) +#else +# define TINYXML2_LIB +#endif + + +#if !defined(TIXMLASSERT) +#if defined(TINYXML2_DEBUG) +# if defined(_MSC_VER) +# // "(void)0," is for suppressing C4127 warning in "assert(false)", "assert(true)" and the like +# define TIXMLASSERT( x ) if ( !((void)0,(x))) { __debugbreak(); } +# elif defined (ANDROID_NDK) +# include +# define TIXMLASSERT( x ) if ( !(x)) { __android_log_assert( "assert", "grinliz", "ASSERT in '%s' at %d.", __FILE__, __LINE__ ); } +# else +# include +# define TIXMLASSERT assert +# endif +#else +# define TIXMLASSERT( x ) {} +#endif +#endif + +/* Versioning, past 1.0.14: + http://semver.org/ +*/ +static const int TIXML2_MAJOR_VERSION = 9; +static const int TIXML2_MINOR_VERSION = 0; +static const int TIXML2_PATCH_VERSION = 0; + +#define TINYXML2_MAJOR_VERSION 9 +#define TINYXML2_MINOR_VERSION 0 +#define TINYXML2_PATCH_VERSION 0 + +// A fixed element depth limit is problematic. There needs to be a +// limit to avoid a stack overflow. However, that limit varies per +// system, and the capacity of the stack. On the other hand, it's a trivial +// attack that can result from ill, malicious, or even correctly formed XML, +// so there needs to be a limit in place. +static const int TINYXML2_MAX_ELEMENT_DEPTH = 100; + +namespace tinyxml2 +{ +class XMLDocument; +class XMLElement; +class XMLAttribute; +class XMLComment; +class XMLText; +class XMLDeclaration; +class XMLUnknown; +class XMLPrinter; + +/* + A class that wraps strings. Normally stores the start and end + pointers into the XML file itself, and will apply normalization + and entity translation if actually read. Can also store (and memory + manage) a traditional char[] + + Isn't clear why TINYXML2_LIB is needed; but seems to fix #719 +*/ +class TINYXML2_LIB StrPair +{ +public: + enum Mode { + NEEDS_ENTITY_PROCESSING = 0x01, + NEEDS_NEWLINE_NORMALIZATION = 0x02, + NEEDS_WHITESPACE_COLLAPSING = 0x04, + + TEXT_ELEMENT = NEEDS_ENTITY_PROCESSING | NEEDS_NEWLINE_NORMALIZATION, + TEXT_ELEMENT_LEAVE_ENTITIES = NEEDS_NEWLINE_NORMALIZATION, + ATTRIBUTE_NAME = 0, + ATTRIBUTE_VALUE = NEEDS_ENTITY_PROCESSING | NEEDS_NEWLINE_NORMALIZATION, + ATTRIBUTE_VALUE_LEAVE_ENTITIES = NEEDS_NEWLINE_NORMALIZATION, + COMMENT = NEEDS_NEWLINE_NORMALIZATION + }; + + StrPair() : _flags( 0 ), _start( 0 ), _end( 0 ) {} + ~StrPair(); + + void Set( char* start, char* end, int flags ) { + TIXMLASSERT( start ); + TIXMLASSERT( end ); + Reset(); + _start = start; + _end = end; + _flags = flags | NEEDS_FLUSH; + } + + const char* GetStr(); + + bool Empty() const { + return _start == _end; + } + + void SetInternedStr( const char* str ) { + Reset(); + _start = const_cast(str); + } + + void SetStr( const char* str, int flags=0 ); + + char* ParseText( char* in, const char* endTag, int strFlags, int* curLineNumPtr ); + char* ParseName( char* in ); + + void TransferTo( StrPair* other ); + void Reset(); + +private: + void CollapseWhitespace(); + + enum { + NEEDS_FLUSH = 0x100, + NEEDS_DELETE = 0x200 + }; + + int _flags; + char* _start; + char* _end; + + StrPair( const StrPair& other ); // not supported + void operator=( const StrPair& other ); // not supported, use TransferTo() +}; + + +/* + A dynamic array of Plain Old Data. Doesn't support constructors, etc. + Has a small initial memory pool, so that low or no usage will not + cause a call to new/delete +*/ +template +class DynArray +{ +public: + DynArray() : + _mem( _pool ), + _allocated( INITIAL_SIZE ), + _size( 0 ) + { + } + + ~DynArray() { + if ( _mem != _pool ) { + delete [] _mem; + } + } + + void Clear() { + _size = 0; + } + + void Push( T t ) { + TIXMLASSERT( _size < INT_MAX ); + EnsureCapacity( _size+1 ); + _mem[_size] = t; + ++_size; + } + + T* PushArr( int count ) { + TIXMLASSERT( count >= 0 ); + TIXMLASSERT( _size <= INT_MAX - count ); + EnsureCapacity( _size+count ); + T* ret = &_mem[_size]; + _size += count; + return ret; + } + + T Pop() { + TIXMLASSERT( _size > 0 ); + --_size; + return _mem[_size]; + } + + void PopArr( int count ) { + TIXMLASSERT( _size >= count ); + _size -= count; + } + + bool Empty() const { + return _size == 0; + } + + T& operator[](int i) { + TIXMLASSERT( i>= 0 && i < _size ); + return _mem[i]; + } + + const T& operator[](int i) const { + TIXMLASSERT( i>= 0 && i < _size ); + return _mem[i]; + } + + const T& PeekTop() const { + TIXMLASSERT( _size > 0 ); + return _mem[ _size - 1]; + } + + int Size() const { + TIXMLASSERT( _size >= 0 ); + return _size; + } + + int Capacity() const { + TIXMLASSERT( _allocated >= INITIAL_SIZE ); + return _allocated; + } + + void SwapRemove(int i) { + TIXMLASSERT(i >= 0 && i < _size); + TIXMLASSERT(_size > 0); + _mem[i] = _mem[_size - 1]; + --_size; + } + + const T* Mem() const { + TIXMLASSERT( _mem ); + return _mem; + } + + T* Mem() { + TIXMLASSERT( _mem ); + return _mem; + } + +private: + DynArray( const DynArray& ); // not supported + void operator=( const DynArray& ); // not supported + + void EnsureCapacity( int cap ) { + TIXMLASSERT( cap > 0 ); + if ( cap > _allocated ) { + TIXMLASSERT( cap <= INT_MAX / 2 ); + const int newAllocated = cap * 2; + T* newMem = new T[newAllocated]; + TIXMLASSERT( newAllocated >= _size ); + memcpy( newMem, _mem, sizeof(T)*_size ); // warning: not using constructors, only works for PODs + if ( _mem != _pool ) { + delete [] _mem; + } + _mem = newMem; + _allocated = newAllocated; + } + } + + T* _mem; + T _pool[INITIAL_SIZE]; + int _allocated; // objects allocated + int _size; // number objects in use +}; + + +/* + Parent virtual class of a pool for fast allocation + and deallocation of objects. +*/ +class MemPool +{ +public: + MemPool() {} + virtual ~MemPool() {} + + virtual int ItemSize() const = 0; + virtual void* Alloc() = 0; + virtual void Free( void* ) = 0; + virtual void SetTracked() = 0; +}; + + +/* + Template child class to create pools of the correct type. +*/ +template< int ITEM_SIZE > +class MemPoolT : public MemPool +{ +public: + MemPoolT() : _blockPtrs(), _root(0), _currentAllocs(0), _nAllocs(0), _maxAllocs(0), _nUntracked(0) {} + ~MemPoolT() { + MemPoolT< ITEM_SIZE >::Clear(); + } + + void Clear() { + // Delete the blocks. + while( !_blockPtrs.Empty()) { + Block* lastBlock = _blockPtrs.Pop(); + delete lastBlock; + } + _root = 0; + _currentAllocs = 0; + _nAllocs = 0; + _maxAllocs = 0; + _nUntracked = 0; + } + + virtual int ItemSize() const { + return ITEM_SIZE; + } + int CurrentAllocs() const { + return _currentAllocs; + } + + virtual void* Alloc() { + if ( !_root ) { + // Need a new block. + Block* block = new Block(); + _blockPtrs.Push( block ); + + Item* blockItems = block->items; + for( int i = 0; i < ITEMS_PER_BLOCK - 1; ++i ) { + blockItems[i].next = &(blockItems[i + 1]); + } + blockItems[ITEMS_PER_BLOCK - 1].next = 0; + _root = blockItems; + } + Item* const result = _root; + TIXMLASSERT( result != 0 ); + _root = _root->next; + + ++_currentAllocs; + if ( _currentAllocs > _maxAllocs ) { + _maxAllocs = _currentAllocs; + } + ++_nAllocs; + ++_nUntracked; + return result; + } + + virtual void Free( void* mem ) { + if ( !mem ) { + return; + } + --_currentAllocs; + Item* item = static_cast( mem ); +#ifdef TINYXML2_DEBUG + memset( item, 0xfe, sizeof( *item ) ); +#endif + item->next = _root; + _root = item; + } + void Trace( const char* name ) { + printf( "Mempool %s watermark=%d [%dk] current=%d size=%d nAlloc=%d blocks=%d\n", + name, _maxAllocs, _maxAllocs * ITEM_SIZE / 1024, _currentAllocs, + ITEM_SIZE, _nAllocs, _blockPtrs.Size() ); + } + + void SetTracked() { + --_nUntracked; + } + + int Untracked() const { + return _nUntracked; + } + + // This number is perf sensitive. 4k seems like a good tradeoff on my machine. + // The test file is large, 170k. + // Release: VS2010 gcc(no opt) + // 1k: 4000 + // 2k: 4000 + // 4k: 3900 21000 + // 16k: 5200 + // 32k: 4300 + // 64k: 4000 21000 + // Declared public because some compilers do not accept to use ITEMS_PER_BLOCK + // in private part if ITEMS_PER_BLOCK is private + enum { ITEMS_PER_BLOCK = (4 * 1024) / ITEM_SIZE }; + +private: + MemPoolT( const MemPoolT& ); // not supported + void operator=( const MemPoolT& ); // not supported + + union Item { + Item* next; + char itemData[ITEM_SIZE]; + }; + struct Block { + Item items[ITEMS_PER_BLOCK]; + }; + DynArray< Block*, 10 > _blockPtrs; + Item* _root; + + int _currentAllocs; + int _nAllocs; + int _maxAllocs; + int _nUntracked; +}; + + + +/** + Implements the interface to the "Visitor pattern" (see the Accept() method.) + If you call the Accept() method, it requires being passed a XMLVisitor + class to handle callbacks. For nodes that contain other nodes (Document, Element) + you will get called with a VisitEnter/VisitExit pair. Nodes that are always leafs + are simply called with Visit(). + + If you return 'true' from a Visit method, recursive parsing will continue. If you return + false, no children of this node or its siblings will be visited. + + All flavors of Visit methods have a default implementation that returns 'true' (continue + visiting). You need to only override methods that are interesting to you. + + Generally Accept() is called on the XMLDocument, although all nodes support visiting. + + You should never change the document from a callback. + + @sa XMLNode::Accept() +*/ +class TINYXML2_LIB XMLVisitor +{ +public: + virtual ~XMLVisitor() {} + + /// Visit a document. + virtual bool VisitEnter( const XMLDocument& /*doc*/ ) { + return true; + } + /// Visit a document. + virtual bool VisitExit( const XMLDocument& /*doc*/ ) { + return true; + } + + /// Visit an element. + virtual bool VisitEnter( const XMLElement& /*element*/, const XMLAttribute* /*firstAttribute*/ ) { + return true; + } + /// Visit an element. + virtual bool VisitExit( const XMLElement& /*element*/ ) { + return true; + } + + /// Visit a declaration. + virtual bool Visit( const XMLDeclaration& /*declaration*/ ) { + return true; + } + /// Visit a text node. + virtual bool Visit( const XMLText& /*text*/ ) { + return true; + } + /// Visit a comment node. + virtual bool Visit( const XMLComment& /*comment*/ ) { + return true; + } + /// Visit an unknown node. + virtual bool Visit( const XMLUnknown& /*unknown*/ ) { + return true; + } +}; + +// WARNING: must match XMLDocument::_errorNames[] +enum XMLError { + XML_SUCCESS = 0, + XML_NO_ATTRIBUTE, + XML_WRONG_ATTRIBUTE_TYPE, + XML_ERROR_FILE_NOT_FOUND, + XML_ERROR_FILE_COULD_NOT_BE_OPENED, + XML_ERROR_FILE_READ_ERROR, + XML_ERROR_PARSING_ELEMENT, + XML_ERROR_PARSING_ATTRIBUTE, + XML_ERROR_PARSING_TEXT, + XML_ERROR_PARSING_CDATA, + XML_ERROR_PARSING_COMMENT, + XML_ERROR_PARSING_DECLARATION, + XML_ERROR_PARSING_UNKNOWN, + XML_ERROR_EMPTY_DOCUMENT, + XML_ERROR_MISMATCHED_ELEMENT, + XML_ERROR_PARSING, + XML_CAN_NOT_CONVERT_TEXT, + XML_NO_TEXT_NODE, + XML_ELEMENT_DEPTH_EXCEEDED, + + XML_ERROR_COUNT +}; + + +/* + Utility functionality. +*/ +class TINYXML2_LIB XMLUtil +{ +public: + static const char* SkipWhiteSpace( const char* p, int* curLineNumPtr ) { + TIXMLASSERT( p ); + + while( IsWhiteSpace(*p) ) { + if (curLineNumPtr && *p == '\n') { + ++(*curLineNumPtr); + } + ++p; + } + TIXMLASSERT( p ); + return p; + } + static char* SkipWhiteSpace( char* const p, int* curLineNumPtr ) { + return const_cast( SkipWhiteSpace( const_cast(p), curLineNumPtr ) ); + } + + // Anything in the high order range of UTF-8 is assumed to not be whitespace. This isn't + // correct, but simple, and usually works. + static bool IsWhiteSpace( char p ) { + return !IsUTF8Continuation(p) && isspace( static_cast(p) ); + } + + inline static bool IsNameStartChar( unsigned char ch ) { + if ( ch >= 128 ) { + // This is a heuristic guess in attempt to not implement Unicode-aware isalpha() + return true; + } + if ( isalpha( ch ) ) { + return true; + } + return ch == ':' || ch == '_'; + } + + inline static bool IsNameChar( unsigned char ch ) { + return IsNameStartChar( ch ) + || isdigit( ch ) + || ch == '.' + || ch == '-'; + } + + inline static bool IsPrefixHex( const char* p) { + p = SkipWhiteSpace(p, 0); + return p && *p == '0' && ( *(p + 1) == 'x' || *(p + 1) == 'X'); + } + + inline static bool StringEqual( const char* p, const char* q, int nChar=INT_MAX ) { + if ( p == q ) { + return true; + } + TIXMLASSERT( p ); + TIXMLASSERT( q ); + TIXMLASSERT( nChar >= 0 ); + return strncmp( p, q, nChar ) == 0; + } + + inline static bool IsUTF8Continuation( const char p ) { + return ( p & 0x80 ) != 0; + } + + static const char* ReadBOM( const char* p, bool* hasBOM ); + // p is the starting location, + // the UTF-8 value of the entity will be placed in value, and length filled in. + static const char* GetCharacterRef( const char* p, char* value, int* length ); + static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); + + // converts primitive types to strings + static void ToStr( int v, char* buffer, int bufferSize ); + static void ToStr( unsigned v, char* buffer, int bufferSize ); + static void ToStr( bool v, char* buffer, int bufferSize ); + static void ToStr( float v, char* buffer, int bufferSize ); + static void ToStr( double v, char* buffer, int bufferSize ); + static void ToStr(int64_t v, char* buffer, int bufferSize); + static void ToStr(uint64_t v, char* buffer, int bufferSize); + + // converts strings to primitive types + static bool ToInt( const char* str, int* value ); + static bool ToUnsigned( const char* str, unsigned* value ); + static bool ToBool( const char* str, bool* value ); + static bool ToFloat( const char* str, float* value ); + static bool ToDouble( const char* str, double* value ); + static bool ToInt64(const char* str, int64_t* value); + static bool ToUnsigned64(const char* str, uint64_t* value); + // Changes what is serialized for a boolean value. + // Default to "true" and "false". Shouldn't be changed + // unless you have a special testing or compatibility need. + // Be careful: static, global, & not thread safe. + // Be sure to set static const memory as parameters. + static void SetBoolSerialization(const char* writeTrue, const char* writeFalse); + +private: + static const char* writeBoolTrue; + static const char* writeBoolFalse; +}; + + +/** XMLNode is a base class for every object that is in the + XML Document Object Model (DOM), except XMLAttributes. + Nodes have siblings, a parent, and children which can + be navigated. A node is always in a XMLDocument. + The type of a XMLNode can be queried, and it can + be cast to its more defined type. + + A XMLDocument allocates memory for all its Nodes. + When the XMLDocument gets deleted, all its Nodes + will also be deleted. + + @verbatim + A Document can contain: Element (container or leaf) + Comment (leaf) + Unknown (leaf) + Declaration( leaf ) + + An Element can contain: Element (container or leaf) + Text (leaf) + Attributes (not on tree) + Comment (leaf) + Unknown (leaf) + + @endverbatim +*/ +class TINYXML2_LIB XMLNode +{ + friend class XMLDocument; + friend class XMLElement; +public: + + /// Get the XMLDocument that owns this XMLNode. + const XMLDocument* GetDocument() const { + TIXMLASSERT( _document ); + return _document; + } + /// Get the XMLDocument that owns this XMLNode. + XMLDocument* GetDocument() { + TIXMLASSERT( _document ); + return _document; + } + + /// Safely cast to an Element, or null. + virtual XMLElement* ToElement() { + return 0; + } + /// Safely cast to Text, or null. + virtual XMLText* ToText() { + return 0; + } + /// Safely cast to a Comment, or null. + virtual XMLComment* ToComment() { + return 0; + } + /// Safely cast to a Document, or null. + virtual XMLDocument* ToDocument() { + return 0; + } + /// Safely cast to a Declaration, or null. + virtual XMLDeclaration* ToDeclaration() { + return 0; + } + /// Safely cast to an Unknown, or null. + virtual XMLUnknown* ToUnknown() { + return 0; + } + + virtual const XMLElement* ToElement() const { + return 0; + } + virtual const XMLText* ToText() const { + return 0; + } + virtual const XMLComment* ToComment() const { + return 0; + } + virtual const XMLDocument* ToDocument() const { + return 0; + } + virtual const XMLDeclaration* ToDeclaration() const { + return 0; + } + virtual const XMLUnknown* ToUnknown() const { + return 0; + } + + /** The meaning of 'value' changes for the specific type. + @verbatim + Document: empty (NULL is returned, not an empty string) + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text string + @endverbatim + */ + const char* Value() const; + + /** Set the Value of an XML node. + @sa Value() + */ + void SetValue( const char* val, bool staticMem=false ); + + /// Gets the line number the node is in, if the document was parsed from a file. + int GetLineNum() const { return _parseLineNum; } + + /// Get the parent of this node on the DOM. + const XMLNode* Parent() const { + return _parent; + } + + XMLNode* Parent() { + return _parent; + } + + /// Returns true if this node has no children. + bool NoChildren() const { + return !_firstChild; + } + + /// Get the first child node, or null if none exists. + const XMLNode* FirstChild() const { + return _firstChild; + } + + XMLNode* FirstChild() { + return _firstChild; + } + + /** Get the first child element, or optionally the first child + element with the specified name. + */ + const XMLElement* FirstChildElement( const char* name = 0 ) const; + + XMLElement* FirstChildElement( const char* name = 0 ) { + return const_cast(const_cast(this)->FirstChildElement( name )); + } + + /// Get the last child node, or null if none exists. + const XMLNode* LastChild() const { + return _lastChild; + } + + XMLNode* LastChild() { + return _lastChild; + } + + /** Get the last child element or optionally the last child + element with the specified name. + */ + const XMLElement* LastChildElement( const char* name = 0 ) const; + + XMLElement* LastChildElement( const char* name = 0 ) { + return const_cast(const_cast(this)->LastChildElement(name) ); + } + + /// Get the previous (left) sibling node of this node. + const XMLNode* PreviousSibling() const { + return _prev; + } + + XMLNode* PreviousSibling() { + return _prev; + } + + /// Get the previous (left) sibling element of this node, with an optionally supplied name. + const XMLElement* PreviousSiblingElement( const char* name = 0 ) const ; + + XMLElement* PreviousSiblingElement( const char* name = 0 ) { + return const_cast(const_cast(this)->PreviousSiblingElement( name ) ); + } + + /// Get the next (right) sibling node of this node. + const XMLNode* NextSibling() const { + return _next; + } + + XMLNode* NextSibling() { + return _next; + } + + /// Get the next (right) sibling element of this node, with an optionally supplied name. + const XMLElement* NextSiblingElement( const char* name = 0 ) const; + + XMLElement* NextSiblingElement( const char* name = 0 ) { + return const_cast(const_cast(this)->NextSiblingElement( name ) ); + } + + /** + Add a child node as the last (right) child. + If the child node is already part of the document, + it is moved from its old location to the new location. + Returns the addThis argument or 0 if the node does not + belong to the same document. + */ + XMLNode* InsertEndChild( XMLNode* addThis ); + + XMLNode* LinkEndChild( XMLNode* addThis ) { + return InsertEndChild( addThis ); + } + /** + Add a child node as the first (left) child. + If the child node is already part of the document, + it is moved from its old location to the new location. + Returns the addThis argument or 0 if the node does not + belong to the same document. + */ + XMLNode* InsertFirstChild( XMLNode* addThis ); + /** + Add a node after the specified child node. + If the child node is already part of the document, + it is moved from its old location to the new location. + Returns the addThis argument or 0 if the afterThis node + is not a child of this node, or if the node does not + belong to the same document. + */ + XMLNode* InsertAfterChild( XMLNode* afterThis, XMLNode* addThis ); + + /** + Delete all the children of this node. + */ + void DeleteChildren(); + + /** + Delete a child of this node. + */ + void DeleteChild( XMLNode* node ); + + /** + Make a copy of this node, but not its children. + You may pass in a Document pointer that will be + the owner of the new Node. If the 'document' is + null, then the node returned will be allocated + from the current Document. (this->GetDocument()) + + Note: if called on a XMLDocument, this will return null. + */ + virtual XMLNode* ShallowClone( XMLDocument* document ) const = 0; + + /** + Make a copy of this node and all its children. + + If the 'target' is null, then the nodes will + be allocated in the current document. If 'target' + is specified, the memory will be allocated is the + specified XMLDocument. + + NOTE: This is probably not the correct tool to + copy a document, since XMLDocuments can have multiple + top level XMLNodes. You probably want to use + XMLDocument::DeepCopy() + */ + XMLNode* DeepClone( XMLDocument* target ) const; + + /** + Test if 2 nodes are the same, but don't test children. + The 2 nodes do not need to be in the same Document. + + Note: if called on a XMLDocument, this will return false. + */ + virtual bool ShallowEqual( const XMLNode* compare ) const = 0; + + /** Accept a hierarchical visit of the nodes in the TinyXML-2 DOM. Every node in the + XML tree will be conditionally visited and the host will be called back + via the XMLVisitor interface. + + This is essentially a SAX interface for TinyXML-2. (Note however it doesn't re-parse + the XML for the callbacks, so the performance of TinyXML-2 is unchanged by using this + interface versus any other.) + + The interface has been based on ideas from: + + - http://www.saxproject.org/ + - http://c2.com/cgi/wiki?HierarchicalVisitorPattern + + Which are both good references for "visiting". + + An example of using Accept(): + @verbatim + XMLPrinter printer; + tinyxmlDoc.Accept( &printer ); + const char* xmlcstr = printer.CStr(); + @endverbatim + */ + virtual bool Accept( XMLVisitor* visitor ) const = 0; + + /** + Set user data into the XMLNode. TinyXML-2 in + no way processes or interprets user data. + It is initially 0. + */ + void SetUserData(void* userData) { _userData = userData; } + + /** + Get user data set into the XMLNode. TinyXML-2 in + no way processes or interprets user data. + It is initially 0. + */ + void* GetUserData() const { return _userData; } + +protected: + explicit XMLNode( XMLDocument* ); + virtual ~XMLNode(); + + virtual char* ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr); + + XMLDocument* _document; + XMLNode* _parent; + mutable StrPair _value; + int _parseLineNum; + + XMLNode* _firstChild; + XMLNode* _lastChild; + + XMLNode* _prev; + XMLNode* _next; + + void* _userData; + +private: + MemPool* _memPool; + void Unlink( XMLNode* child ); + static void DeleteNode( XMLNode* node ); + void InsertChildPreamble( XMLNode* insertThis ) const; + const XMLElement* ToElementWithName( const char* name ) const; + + XMLNode( const XMLNode& ); // not supported + XMLNode& operator=( const XMLNode& ); // not supported +}; + + +/** XML text. + + Note that a text node can have child element nodes, for example: + @verbatim + This is bold + @endverbatim + + A text node can have 2 ways to output the next. "normal" output + and CDATA. It will default to the mode it was parsed from the XML file and + you generally want to leave it alone, but you can change the output mode with + SetCData() and query it with CData(). +*/ +class TINYXML2_LIB XMLText : public XMLNode +{ + friend class XMLDocument; +public: + virtual bool Accept( XMLVisitor* visitor ) const; + + virtual XMLText* ToText() { + return this; + } + virtual const XMLText* ToText() const { + return this; + } + + /// Declare whether this should be CDATA or standard text. + void SetCData( bool isCData ) { + _isCData = isCData; + } + /// Returns true if this is a CDATA text element. + bool CData() const { + return _isCData; + } + + virtual XMLNode* ShallowClone( XMLDocument* document ) const; + virtual bool ShallowEqual( const XMLNode* compare ) const; + +protected: + explicit XMLText( XMLDocument* doc ) : XMLNode( doc ), _isCData( false ) {} + virtual ~XMLText() {} + + char* ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr ); + +private: + bool _isCData; + + XMLText( const XMLText& ); // not supported + XMLText& operator=( const XMLText& ); // not supported +}; + + +/** An XML Comment. */ +class TINYXML2_LIB XMLComment : public XMLNode +{ + friend class XMLDocument; +public: + virtual XMLComment* ToComment() { + return this; + } + virtual const XMLComment* ToComment() const { + return this; + } + + virtual bool Accept( XMLVisitor* visitor ) const; + + virtual XMLNode* ShallowClone( XMLDocument* document ) const; + virtual bool ShallowEqual( const XMLNode* compare ) const; + +protected: + explicit XMLComment( XMLDocument* doc ); + virtual ~XMLComment(); + + char* ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr); + +private: + XMLComment( const XMLComment& ); // not supported + XMLComment& operator=( const XMLComment& ); // not supported +}; + + +/** In correct XML the declaration is the first entry in the file. + @verbatim + + @endverbatim + + TinyXML-2 will happily read or write files without a declaration, + however. + + The text of the declaration isn't interpreted. It is parsed + and written as a string. +*/ +class TINYXML2_LIB XMLDeclaration : public XMLNode +{ + friend class XMLDocument; +public: + virtual XMLDeclaration* ToDeclaration() { + return this; + } + virtual const XMLDeclaration* ToDeclaration() const { + return this; + } + + virtual bool Accept( XMLVisitor* visitor ) const; + + virtual XMLNode* ShallowClone( XMLDocument* document ) const; + virtual bool ShallowEqual( const XMLNode* compare ) const; + +protected: + explicit XMLDeclaration( XMLDocument* doc ); + virtual ~XMLDeclaration(); + + char* ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr ); + +private: + XMLDeclaration( const XMLDeclaration& ); // not supported + XMLDeclaration& operator=( const XMLDeclaration& ); // not supported +}; + + +/** Any tag that TinyXML-2 doesn't recognize is saved as an + unknown. It is a tag of text, but should not be modified. + It will be written back to the XML, unchanged, when the file + is saved. + + DTD tags get thrown into XMLUnknowns. +*/ +class TINYXML2_LIB XMLUnknown : public XMLNode +{ + friend class XMLDocument; +public: + virtual XMLUnknown* ToUnknown() { + return this; + } + virtual const XMLUnknown* ToUnknown() const { + return this; + } + + virtual bool Accept( XMLVisitor* visitor ) const; + + virtual XMLNode* ShallowClone( XMLDocument* document ) const; + virtual bool ShallowEqual( const XMLNode* compare ) const; + +protected: + explicit XMLUnknown( XMLDocument* doc ); + virtual ~XMLUnknown(); + + char* ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr ); + +private: + XMLUnknown( const XMLUnknown& ); // not supported + XMLUnknown& operator=( const XMLUnknown& ); // not supported +}; + + + +/** An attribute is a name-value pair. Elements have an arbitrary + number of attributes, each with a unique name. + + @note The attributes are not XMLNodes. You may only query the + Next() attribute in a list. +*/ +class TINYXML2_LIB XMLAttribute +{ + friend class XMLElement; +public: + /// The name of the attribute. + const char* Name() const; + + /// The value of the attribute. + const char* Value() const; + + /// Gets the line number the attribute is in, if the document was parsed from a file. + int GetLineNum() const { return _parseLineNum; } + + /// The next attribute in the list. + const XMLAttribute* Next() const { + return _next; + } + + /** IntValue interprets the attribute as an integer, and returns the value. + If the value isn't an integer, 0 will be returned. There is no error checking; + use QueryIntValue() if you need error checking. + */ + int IntValue() const { + int i = 0; + QueryIntValue(&i); + return i; + } + + int64_t Int64Value() const { + int64_t i = 0; + QueryInt64Value(&i); + return i; + } + + uint64_t Unsigned64Value() const { + uint64_t i = 0; + QueryUnsigned64Value(&i); + return i; + } + + /// Query as an unsigned integer. See IntValue() + unsigned UnsignedValue() const { + unsigned i=0; + QueryUnsignedValue( &i ); + return i; + } + /// Query as a boolean. See IntValue() + bool BoolValue() const { + bool b=false; + QueryBoolValue( &b ); + return b; + } + /// Query as a double. See IntValue() + double DoubleValue() const { + double d=0; + QueryDoubleValue( &d ); + return d; + } + /// Query as a float. See IntValue() + float FloatValue() const { + float f=0; + QueryFloatValue( &f ); + return f; + } + + /** QueryIntValue interprets the attribute as an integer, and returns the value + in the provided parameter. The function will return XML_SUCCESS on success, + and XML_WRONG_ATTRIBUTE_TYPE if the conversion is not successful. + */ + XMLError QueryIntValue( int* value ) const; + /// See QueryIntValue + XMLError QueryUnsignedValue( unsigned int* value ) const; + /// See QueryIntValue + XMLError QueryInt64Value(int64_t* value) const; + /// See QueryIntValue + XMLError QueryUnsigned64Value(uint64_t* value) const; + /// See QueryIntValue + XMLError QueryBoolValue( bool* value ) const; + /// See QueryIntValue + XMLError QueryDoubleValue( double* value ) const; + /// See QueryIntValue + XMLError QueryFloatValue( float* value ) const; + + /// Set the attribute to a string value. + void SetAttribute( const char* value ); + /// Set the attribute to value. + void SetAttribute( int value ); + /// Set the attribute to value. + void SetAttribute( unsigned value ); + /// Set the attribute to value. + void SetAttribute(int64_t value); + /// Set the attribute to value. + void SetAttribute(uint64_t value); + /// Set the attribute to value. + void SetAttribute( bool value ); + /// Set the attribute to value. + void SetAttribute( double value ); + /// Set the attribute to value. + void SetAttribute( float value ); + +private: + enum { BUF_SIZE = 200 }; + + XMLAttribute() : _name(), _value(),_parseLineNum( 0 ), _next( 0 ), _memPool( 0 ) {} + virtual ~XMLAttribute() {} + + XMLAttribute( const XMLAttribute& ); // not supported + void operator=( const XMLAttribute& ); // not supported + void SetName( const char* name ); + + char* ParseDeep( char* p, bool processEntities, int* curLineNumPtr ); + + mutable StrPair _name; + mutable StrPair _value; + int _parseLineNum; + XMLAttribute* _next; + MemPool* _memPool; +}; + + +/** The element is a container class. It has a value, the element name, + and can contain other elements, text, comments, and unknowns. + Elements also contain an arbitrary number of attributes. +*/ +class TINYXML2_LIB XMLElement : public XMLNode +{ + friend class XMLDocument; +public: + /// Get the name of an element (which is the Value() of the node.) + const char* Name() const { + return Value(); + } + /// Set the name of the element. + void SetName( const char* str, bool staticMem=false ) { + SetValue( str, staticMem ); + } + + virtual XMLElement* ToElement() { + return this; + } + virtual const XMLElement* ToElement() const { + return this; + } + virtual bool Accept( XMLVisitor* visitor ) const; + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none + exists. For example: + + @verbatim + const char* value = ele->Attribute( "foo" ); + @endverbatim + + The 'value' parameter is normally null. However, if specified, + the attribute will only be returned if the 'name' and 'value' + match. This allow you to write code: + + @verbatim + if ( ele->Attribute( "foo", "bar" ) ) callFooIsBar(); + @endverbatim + + rather than: + @verbatim + if ( ele->Attribute( "foo" ) ) { + if ( strcmp( ele->Attribute( "foo" ), "bar" ) == 0 ) callFooIsBar(); + } + @endverbatim + */ + const char* Attribute( const char* name, const char* value=0 ) const; + + /** Given an attribute name, IntAttribute() returns the value + of the attribute interpreted as an integer. The default + value will be returned if the attribute isn't present, + or if there is an error. (For a method with error + checking, see QueryIntAttribute()). + */ + int IntAttribute(const char* name, int defaultValue = 0) const; + /// See IntAttribute() + unsigned UnsignedAttribute(const char* name, unsigned defaultValue = 0) const; + /// See IntAttribute() + int64_t Int64Attribute(const char* name, int64_t defaultValue = 0) const; + /// See IntAttribute() + uint64_t Unsigned64Attribute(const char* name, uint64_t defaultValue = 0) const; + /// See IntAttribute() + bool BoolAttribute(const char* name, bool defaultValue = false) const; + /// See IntAttribute() + double DoubleAttribute(const char* name, double defaultValue = 0) const; + /// See IntAttribute() + float FloatAttribute(const char* name, float defaultValue = 0) const; + + /** Given an attribute name, QueryIntAttribute() returns + XML_SUCCESS, XML_WRONG_ATTRIBUTE_TYPE if the conversion + can't be performed, or XML_NO_ATTRIBUTE if the attribute + doesn't exist. If successful, the result of the conversion + will be written to 'value'. If not successful, nothing will + be written to 'value'. This allows you to provide default + value: + + @verbatim + int value = 10; + QueryIntAttribute( "foo", &value ); // if "foo" isn't found, value will still be 10 + @endverbatim + */ + XMLError QueryIntAttribute( const char* name, int* value ) const { + const XMLAttribute* a = FindAttribute( name ); + if ( !a ) { + return XML_NO_ATTRIBUTE; + } + return a->QueryIntValue( value ); + } + + /// See QueryIntAttribute() + XMLError QueryUnsignedAttribute( const char* name, unsigned int* value ) const { + const XMLAttribute* a = FindAttribute( name ); + if ( !a ) { + return XML_NO_ATTRIBUTE; + } + return a->QueryUnsignedValue( value ); + } + + /// See QueryIntAttribute() + XMLError QueryInt64Attribute(const char* name, int64_t* value) const { + const XMLAttribute* a = FindAttribute(name); + if (!a) { + return XML_NO_ATTRIBUTE; + } + return a->QueryInt64Value(value); + } + + /// See QueryIntAttribute() + XMLError QueryUnsigned64Attribute(const char* name, uint64_t* value) const { + const XMLAttribute* a = FindAttribute(name); + if(!a) { + return XML_NO_ATTRIBUTE; + } + return a->QueryUnsigned64Value(value); + } + + /// See QueryIntAttribute() + XMLError QueryBoolAttribute( const char* name, bool* value ) const { + const XMLAttribute* a = FindAttribute( name ); + if ( !a ) { + return XML_NO_ATTRIBUTE; + } + return a->QueryBoolValue( value ); + } + /// See QueryIntAttribute() + XMLError QueryDoubleAttribute( const char* name, double* value ) const { + const XMLAttribute* a = FindAttribute( name ); + if ( !a ) { + return XML_NO_ATTRIBUTE; + } + return a->QueryDoubleValue( value ); + } + /// See QueryIntAttribute() + XMLError QueryFloatAttribute( const char* name, float* value ) const { + const XMLAttribute* a = FindAttribute( name ); + if ( !a ) { + return XML_NO_ATTRIBUTE; + } + return a->QueryFloatValue( value ); + } + + /// See QueryIntAttribute() + XMLError QueryStringAttribute(const char* name, const char** value) const { + const XMLAttribute* a = FindAttribute(name); + if (!a) { + return XML_NO_ATTRIBUTE; + } + *value = a->Value(); + return XML_SUCCESS; + } + + + + /** Given an attribute name, QueryAttribute() returns + XML_SUCCESS, XML_WRONG_ATTRIBUTE_TYPE if the conversion + can't be performed, or XML_NO_ATTRIBUTE if the attribute + doesn't exist. It is overloaded for the primitive types, + and is a generally more convenient replacement of + QueryIntAttribute() and related functions. + + If successful, the result of the conversion + will be written to 'value'. If not successful, nothing will + be written to 'value'. This allows you to provide default + value: + + @verbatim + int value = 10; + QueryAttribute( "foo", &value ); // if "foo" isn't found, value will still be 10 + @endverbatim + */ + XMLError QueryAttribute( const char* name, int* value ) const { + return QueryIntAttribute( name, value ); + } + + XMLError QueryAttribute( const char* name, unsigned int* value ) const { + return QueryUnsignedAttribute( name, value ); + } + + XMLError QueryAttribute(const char* name, int64_t* value) const { + return QueryInt64Attribute(name, value); + } + + XMLError QueryAttribute(const char* name, uint64_t* value) const { + return QueryUnsigned64Attribute(name, value); + } + + XMLError QueryAttribute( const char* name, bool* value ) const { + return QueryBoolAttribute( name, value ); + } + + XMLError QueryAttribute( const char* name, double* value ) const { + return QueryDoubleAttribute( name, value ); + } + + XMLError QueryAttribute( const char* name, float* value ) const { + return QueryFloatAttribute( name, value ); + } + + XMLError QueryAttribute(const char* name, const char** value) const { + return QueryStringAttribute(name, value); + } + + /// Sets the named attribute to value. + void SetAttribute( const char* name, const char* value ) { + XMLAttribute* a = FindOrCreateAttribute( name ); + a->SetAttribute( value ); + } + /// Sets the named attribute to value. + void SetAttribute( const char* name, int value ) { + XMLAttribute* a = FindOrCreateAttribute( name ); + a->SetAttribute( value ); + } + /// Sets the named attribute to value. + void SetAttribute( const char* name, unsigned value ) { + XMLAttribute* a = FindOrCreateAttribute( name ); + a->SetAttribute( value ); + } + + /// Sets the named attribute to value. + void SetAttribute(const char* name, int64_t value) { + XMLAttribute* a = FindOrCreateAttribute(name); + a->SetAttribute(value); + } + + /// Sets the named attribute to value. + void SetAttribute(const char* name, uint64_t value) { + XMLAttribute* a = FindOrCreateAttribute(name); + a->SetAttribute(value); + } + + /// Sets the named attribute to value. + void SetAttribute( const char* name, bool value ) { + XMLAttribute* a = FindOrCreateAttribute( name ); + a->SetAttribute( value ); + } + /// Sets the named attribute to value. + void SetAttribute( const char* name, double value ) { + XMLAttribute* a = FindOrCreateAttribute( name ); + a->SetAttribute( value ); + } + /// Sets the named attribute to value. + void SetAttribute( const char* name, float value ) { + XMLAttribute* a = FindOrCreateAttribute( name ); + a->SetAttribute( value ); + } + + /** + Delete an attribute. + */ + void DeleteAttribute( const char* name ); + + /// Return the first attribute in the list. + const XMLAttribute* FirstAttribute() const { + return _rootAttribute; + } + /// Query a specific attribute in the list. + const XMLAttribute* FindAttribute( const char* name ) const; + + /** Convenience function for easy access to the text inside an element. Although easy + and concise, GetText() is limited compared to getting the XMLText child + and accessing it directly. + + If the first child of 'this' is a XMLText, the GetText() + returns the character string of the Text node, else null is returned. + + This is a convenient method for getting the text of simple contained text: + @verbatim + This is text + const char* str = fooElement->GetText(); + @endverbatim + + 'str' will be a pointer to "This is text". + + Note that this function can be misleading. If the element foo was created from + this XML: + @verbatim + This is text + @endverbatim + + then the value of str would be null. The first child node isn't a text node, it is + another element. From this XML: + @verbatim + This is text + @endverbatim + GetText() will return "This is ". + */ + const char* GetText() const; + + /** Convenience function for easy access to the text inside an element. Although easy + and concise, SetText() is limited compared to creating an XMLText child + and mutating it directly. + + If the first child of 'this' is a XMLText, SetText() sets its value to + the given string, otherwise it will create a first child that is an XMLText. + + This is a convenient method for setting the text of simple contained text: + @verbatim + This is text + fooElement->SetText( "Hullaballoo!" ); + Hullaballoo! + @endverbatim + + Note that this function can be misleading. If the element foo was created from + this XML: + @verbatim + This is text + @endverbatim + + then it will not change "This is text", but rather prefix it with a text element: + @verbatim + Hullaballoo!This is text + @endverbatim + + For this XML: + @verbatim + + @endverbatim + SetText() will generate + @verbatim + Hullaballoo! + @endverbatim + */ + void SetText( const char* inText ); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText( int value ); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText( unsigned value ); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText(int64_t value); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText(uint64_t value); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText( bool value ); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText( double value ); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText( float value ); + + /** + Convenience method to query the value of a child text node. This is probably best + shown by example. Given you have a document is this form: + @verbatim + + 1 + 1.4 + + @endverbatim + + The QueryIntText() and similar functions provide a safe and easier way to get to the + "value" of x and y. + + @verbatim + int x = 0; + float y = 0; // types of x and y are contrived for example + const XMLElement* xElement = pointElement->FirstChildElement( "x" ); + const XMLElement* yElement = pointElement->FirstChildElement( "y" ); + xElement->QueryIntText( &x ); + yElement->QueryFloatText( &y ); + @endverbatim + + @returns XML_SUCCESS (0) on success, XML_CAN_NOT_CONVERT_TEXT if the text cannot be converted + to the requested type, and XML_NO_TEXT_NODE if there is no child text to query. + + */ + XMLError QueryIntText( int* ival ) const; + /// See QueryIntText() + XMLError QueryUnsignedText( unsigned* uval ) const; + /// See QueryIntText() + XMLError QueryInt64Text(int64_t* uval) const; + /// See QueryIntText() + XMLError QueryUnsigned64Text(uint64_t* uval) const; + /// See QueryIntText() + XMLError QueryBoolText( bool* bval ) const; + /// See QueryIntText() + XMLError QueryDoubleText( double* dval ) const; + /// See QueryIntText() + XMLError QueryFloatText( float* fval ) const; + + int IntText(int defaultValue = 0) const; + + /// See QueryIntText() + unsigned UnsignedText(unsigned defaultValue = 0) const; + /// See QueryIntText() + int64_t Int64Text(int64_t defaultValue = 0) const; + /// See QueryIntText() + uint64_t Unsigned64Text(uint64_t defaultValue = 0) const; + /// See QueryIntText() + bool BoolText(bool defaultValue = false) const; + /// See QueryIntText() + double DoubleText(double defaultValue = 0) const; + /// See QueryIntText() + float FloatText(float defaultValue = 0) const; + + /** + Convenience method to create a new XMLElement and add it as last (right) + child of this node. Returns the created and inserted element. + */ + XMLElement* InsertNewChildElement(const char* name); + /// See InsertNewChildElement() + XMLComment* InsertNewComment(const char* comment); + /// See InsertNewChildElement() + XMLText* InsertNewText(const char* text); + /// See InsertNewChildElement() + XMLDeclaration* InsertNewDeclaration(const char* text); + /// See InsertNewChildElement() + XMLUnknown* InsertNewUnknown(const char* text); + + + // internal: + enum ElementClosingType { + OPEN, // + CLOSED, // + CLOSING // + }; + ElementClosingType ClosingType() const { + return _closingType; + } + virtual XMLNode* ShallowClone( XMLDocument* document ) const; + virtual bool ShallowEqual( const XMLNode* compare ) const; + +protected: + char* ParseDeep( char* p, StrPair* parentEndTag, int* curLineNumPtr ); + +private: + XMLElement( XMLDocument* doc ); + virtual ~XMLElement(); + XMLElement( const XMLElement& ); // not supported + void operator=( const XMLElement& ); // not supported + + XMLAttribute* FindOrCreateAttribute( const char* name ); + char* ParseAttributes( char* p, int* curLineNumPtr ); + static void DeleteAttribute( XMLAttribute* attribute ); + XMLAttribute* CreateAttribute(); + + enum { BUF_SIZE = 200 }; + ElementClosingType _closingType; + // The attribute list is ordered; there is no 'lastAttribute' + // because the list needs to be scanned for dupes before adding + // a new attribute. + XMLAttribute* _rootAttribute; +}; + + +enum Whitespace { + PRESERVE_WHITESPACE, + COLLAPSE_WHITESPACE +}; + + +/** A Document binds together all the functionality. + It can be saved, loaded, and printed to the screen. + All Nodes are connected and allocated to a Document. + If the Document is deleted, all its Nodes are also deleted. +*/ +class TINYXML2_LIB XMLDocument : public XMLNode +{ + friend class XMLElement; + // Gives access to SetError and Push/PopDepth, but over-access for everything else. + // Wishing C++ had "internal" scope. + friend class XMLNode; + friend class XMLText; + friend class XMLComment; + friend class XMLDeclaration; + friend class XMLUnknown; +public: + /// constructor + XMLDocument( bool processEntities = true, Whitespace whitespaceMode = PRESERVE_WHITESPACE ); + ~XMLDocument(); + + virtual XMLDocument* ToDocument() { + TIXMLASSERT( this == _document ); + return this; + } + virtual const XMLDocument* ToDocument() const { + TIXMLASSERT( this == _document ); + return this; + } + + /** + Parse an XML file from a character string. + Returns XML_SUCCESS (0) on success, or + an errorID. + + You may optionally pass in the 'nBytes', which is + the number of bytes which will be parsed. If not + specified, TinyXML-2 will assume 'xml' points to a + null terminated string. + */ + XMLError Parse( const char* xml, size_t nBytes=static_cast(-1) ); + + /** + Load an XML file from disk. + Returns XML_SUCCESS (0) on success, or + an errorID. + */ + XMLError LoadFile( const char* filename ); + + /** + Load an XML file from disk. You are responsible + for providing and closing the FILE*. + + NOTE: The file should be opened as binary ("rb") + not text in order for TinyXML-2 to correctly + do newline normalization. + + Returns XML_SUCCESS (0) on success, or + an errorID. + */ + XMLError LoadFile( FILE* ); + + /** + Save the XML file to disk. + Returns XML_SUCCESS (0) on success, or + an errorID. + */ + XMLError SaveFile( const char* filename, bool compact = false ); + + /** + Save the XML file to disk. You are responsible + for providing and closing the FILE*. + + Returns XML_SUCCESS (0) on success, or + an errorID. + */ + XMLError SaveFile( FILE* fp, bool compact = false ); + + bool ProcessEntities() const { + return _processEntities; + } + Whitespace WhitespaceMode() const { + return _whitespaceMode; + } + + /** + Returns true if this document has a leading Byte Order Mark of UTF8. + */ + bool HasBOM() const { + return _writeBOM; + } + /** Sets whether to write the BOM when writing the file. + */ + void SetBOM( bool useBOM ) { + _writeBOM = useBOM; + } + + /** Return the root element of DOM. Equivalent to FirstChildElement(). + To get the first node, use FirstChild(). + */ + XMLElement* RootElement() { + return FirstChildElement(); + } + const XMLElement* RootElement() const { + return FirstChildElement(); + } + + /** Print the Document. If the Printer is not provided, it will + print to stdout. If you provide Printer, this can print to a file: + @verbatim + XMLPrinter printer( fp ); + doc.Print( &printer ); + @endverbatim + + Or you can use a printer to print to memory: + @verbatim + XMLPrinter printer; + doc.Print( &printer ); + // printer.CStr() has a const char* to the XML + @endverbatim + */ + void Print( XMLPrinter* streamer=0 ) const; + virtual bool Accept( XMLVisitor* visitor ) const; + + /** + Create a new Element associated with + this Document. The memory for the Element + is managed by the Document. + */ + XMLElement* NewElement( const char* name ); + /** + Create a new Comment associated with + this Document. The memory for the Comment + is managed by the Document. + */ + XMLComment* NewComment( const char* comment ); + /** + Create a new Text associated with + this Document. The memory for the Text + is managed by the Document. + */ + XMLText* NewText( const char* text ); + /** + Create a new Declaration associated with + this Document. The memory for the object + is managed by the Document. + + If the 'text' param is null, the standard + declaration is used.: + @verbatim + + @endverbatim + */ + XMLDeclaration* NewDeclaration( const char* text=0 ); + /** + Create a new Unknown associated with + this Document. The memory for the object + is managed by the Document. + */ + XMLUnknown* NewUnknown( const char* text ); + + /** + Delete a node associated with this document. + It will be unlinked from the DOM. + */ + void DeleteNode( XMLNode* node ); + + /// Clears the error flags. + void ClearError(); + + /// Return true if there was an error parsing the document. + bool Error() const { + return _errorID != XML_SUCCESS; + } + /// Return the errorID. + XMLError ErrorID() const { + return _errorID; + } + const char* ErrorName() const; + static const char* ErrorIDToName(XMLError errorID); + + /** Returns a "long form" error description. A hopefully helpful + diagnostic with location, line number, and/or additional info. + */ + const char* ErrorStr() const; + + /// A (trivial) utility function that prints the ErrorStr() to stdout. + void PrintError() const; + + /// Return the line where the error occurred, or zero if unknown. + int ErrorLineNum() const + { + return _errorLineNum; + } + + /// Clear the document, resetting it to the initial state. + void Clear(); + + /** + Copies this document to a target document. + The target will be completely cleared before the copy. + If you want to copy a sub-tree, see XMLNode::DeepClone(). + + NOTE: that the 'target' must be non-null. + */ + void DeepCopy(XMLDocument* target) const; + + // internal + char* Identify( char* p, XMLNode** node ); + + // internal + void MarkInUse(const XMLNode* const); + + virtual XMLNode* ShallowClone( XMLDocument* /*document*/ ) const { + return 0; + } + virtual bool ShallowEqual( const XMLNode* /*compare*/ ) const { + return false; + } + +private: + XMLDocument( const XMLDocument& ); // not supported + void operator=( const XMLDocument& ); // not supported + + bool _writeBOM; + bool _processEntities; + XMLError _errorID; + Whitespace _whitespaceMode; + mutable StrPair _errorStr; + int _errorLineNum; + char* _charBuffer; + int _parseCurLineNum; + int _parsingDepth; + // Memory tracking does add some overhead. + // However, the code assumes that you don't + // have a bunch of unlinked nodes around. + // Therefore it takes less memory to track + // in the document vs. a linked list in the XMLNode, + // and the performance is the same. + DynArray _unlinked; + + MemPoolT< sizeof(XMLElement) > _elementPool; + MemPoolT< sizeof(XMLAttribute) > _attributePool; + MemPoolT< sizeof(XMLText) > _textPool; + MemPoolT< sizeof(XMLComment) > _commentPool; + + static const char* _errorNames[XML_ERROR_COUNT]; + + void Parse(); + + void SetError( XMLError error, int lineNum, const char* format, ... ); + + // Something of an obvious security hole, once it was discovered. + // Either an ill-formed XML or an excessively deep one can overflow + // the stack. Track stack depth, and error out if needed. + class DepthTracker { + public: + explicit DepthTracker(XMLDocument * document) { + this->_document = document; + document->PushDepth(); + } + ~DepthTracker() { + _document->PopDepth(); + } + private: + XMLDocument * _document; + }; + void PushDepth(); + void PopDepth(); + + template + NodeType* CreateUnlinkedNode( MemPoolT& pool ); +}; + +template +inline NodeType* XMLDocument::CreateUnlinkedNode( MemPoolT& pool ) +{ + TIXMLASSERT( sizeof( NodeType ) == PoolElementSize ); + TIXMLASSERT( sizeof( NodeType ) == pool.ItemSize() ); + NodeType* returnNode = new (pool.Alloc()) NodeType( this ); + TIXMLASSERT( returnNode ); + returnNode->_memPool = &pool; + + _unlinked.Push(returnNode); + return returnNode; +} + +/** + A XMLHandle is a class that wraps a node pointer with null checks; this is + an incredibly useful thing. Note that XMLHandle is not part of the TinyXML-2 + DOM structure. It is a separate utility class. + + Take an example: + @verbatim + + + + + + + @endverbatim + + Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very + easy to write a *lot* of code that looks like: + + @verbatim + XMLElement* root = document.FirstChildElement( "Document" ); + if ( root ) + { + XMLElement* element = root->FirstChildElement( "Element" ); + if ( element ) + { + XMLElement* child = element->FirstChildElement( "Child" ); + if ( child ) + { + XMLElement* child2 = child->NextSiblingElement( "Child" ); + if ( child2 ) + { + // Finally do something useful. + @endverbatim + + And that doesn't even cover "else" cases. XMLHandle addresses the verbosity + of such code. A XMLHandle checks for null pointers so it is perfectly safe + and correct to use: + + @verbatim + XMLHandle docHandle( &document ); + XMLElement* child2 = docHandle.FirstChildElement( "Document" ).FirstChildElement( "Element" ).FirstChildElement().NextSiblingElement(); + if ( child2 ) + { + // do something useful + @endverbatim + + Which is MUCH more concise and useful. + + It is also safe to copy handles - internally they are nothing more than node pointers. + @verbatim + XMLHandle handleCopy = handle; + @endverbatim + + See also XMLConstHandle, which is the same as XMLHandle, but operates on const objects. +*/ +class TINYXML2_LIB XMLHandle +{ +public: + /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. + explicit XMLHandle( XMLNode* node ) : _node( node ) { + } + /// Create a handle from a node. + explicit XMLHandle( XMLNode& node ) : _node( &node ) { + } + /// Copy constructor + XMLHandle( const XMLHandle& ref ) : _node( ref._node ) { + } + /// Assignment + XMLHandle& operator=( const XMLHandle& ref ) { + _node = ref._node; + return *this; + } + + /// Get the first child of this handle. + XMLHandle FirstChild() { + return XMLHandle( _node ? _node->FirstChild() : 0 ); + } + /// Get the first child element of this handle. + XMLHandle FirstChildElement( const char* name = 0 ) { + return XMLHandle( _node ? _node->FirstChildElement( name ) : 0 ); + } + /// Get the last child of this handle. + XMLHandle LastChild() { + return XMLHandle( _node ? _node->LastChild() : 0 ); + } + /// Get the last child element of this handle. + XMLHandle LastChildElement( const char* name = 0 ) { + return XMLHandle( _node ? _node->LastChildElement( name ) : 0 ); + } + /// Get the previous sibling of this handle. + XMLHandle PreviousSibling() { + return XMLHandle( _node ? _node->PreviousSibling() : 0 ); + } + /// Get the previous sibling element of this handle. + XMLHandle PreviousSiblingElement( const char* name = 0 ) { + return XMLHandle( _node ? _node->PreviousSiblingElement( name ) : 0 ); + } + /// Get the next sibling of this handle. + XMLHandle NextSibling() { + return XMLHandle( _node ? _node->NextSibling() : 0 ); + } + /// Get the next sibling element of this handle. + XMLHandle NextSiblingElement( const char* name = 0 ) { + return XMLHandle( _node ? _node->NextSiblingElement( name ) : 0 ); + } + + /// Safe cast to XMLNode. This can return null. + XMLNode* ToNode() { + return _node; + } + /// Safe cast to XMLElement. This can return null. + XMLElement* ToElement() { + return ( _node ? _node->ToElement() : 0 ); + } + /// Safe cast to XMLText. This can return null. + XMLText* ToText() { + return ( _node ? _node->ToText() : 0 ); + } + /// Safe cast to XMLUnknown. This can return null. + XMLUnknown* ToUnknown() { + return ( _node ? _node->ToUnknown() : 0 ); + } + /// Safe cast to XMLDeclaration. This can return null. + XMLDeclaration* ToDeclaration() { + return ( _node ? _node->ToDeclaration() : 0 ); + } + +private: + XMLNode* _node; +}; + + +/** + A variant of the XMLHandle class for working with const XMLNodes and Documents. It is the + same in all regards, except for the 'const' qualifiers. See XMLHandle for API. +*/ +class TINYXML2_LIB XMLConstHandle +{ +public: + explicit XMLConstHandle( const XMLNode* node ) : _node( node ) { + } + explicit XMLConstHandle( const XMLNode& node ) : _node( &node ) { + } + XMLConstHandle( const XMLConstHandle& ref ) : _node( ref._node ) { + } + + XMLConstHandle& operator=( const XMLConstHandle& ref ) { + _node = ref._node; + return *this; + } + + const XMLConstHandle FirstChild() const { + return XMLConstHandle( _node ? _node->FirstChild() : 0 ); + } + const XMLConstHandle FirstChildElement( const char* name = 0 ) const { + return XMLConstHandle( _node ? _node->FirstChildElement( name ) : 0 ); + } + const XMLConstHandle LastChild() const { + return XMLConstHandle( _node ? _node->LastChild() : 0 ); + } + const XMLConstHandle LastChildElement( const char* name = 0 ) const { + return XMLConstHandle( _node ? _node->LastChildElement( name ) : 0 ); + } + const XMLConstHandle PreviousSibling() const { + return XMLConstHandle( _node ? _node->PreviousSibling() : 0 ); + } + const XMLConstHandle PreviousSiblingElement( const char* name = 0 ) const { + return XMLConstHandle( _node ? _node->PreviousSiblingElement( name ) : 0 ); + } + const XMLConstHandle NextSibling() const { + return XMLConstHandle( _node ? _node->NextSibling() : 0 ); + } + const XMLConstHandle NextSiblingElement( const char* name = 0 ) const { + return XMLConstHandle( _node ? _node->NextSiblingElement( name ) : 0 ); + } + + + const XMLNode* ToNode() const { + return _node; + } + const XMLElement* ToElement() const { + return ( _node ? _node->ToElement() : 0 ); + } + const XMLText* ToText() const { + return ( _node ? _node->ToText() : 0 ); + } + const XMLUnknown* ToUnknown() const { + return ( _node ? _node->ToUnknown() : 0 ); + } + const XMLDeclaration* ToDeclaration() const { + return ( _node ? _node->ToDeclaration() : 0 ); + } + +private: + const XMLNode* _node; +}; + + +/** + Printing functionality. The XMLPrinter gives you more + options than the XMLDocument::Print() method. + + It can: + -# Print to memory. + -# Print to a file you provide. + -# Print XML without a XMLDocument. + + Print to Memory + + @verbatim + XMLPrinter printer; + doc.Print( &printer ); + SomeFunction( printer.CStr() ); + @endverbatim + + Print to a File + + You provide the file pointer. + @verbatim + XMLPrinter printer( fp ); + doc.Print( &printer ); + @endverbatim + + Print without a XMLDocument + + When loading, an XML parser is very useful. However, sometimes + when saving, it just gets in the way. The code is often set up + for streaming, and constructing the DOM is just overhead. + + The Printer supports the streaming case. The following code + prints out a trivially simple XML file without ever creating + an XML document. + + @verbatim + XMLPrinter printer( fp ); + printer.OpenElement( "foo" ); + printer.PushAttribute( "foo", "bar" ); + printer.CloseElement(); + @endverbatim +*/ +class TINYXML2_LIB XMLPrinter : public XMLVisitor +{ +public: + /** Construct the printer. If the FILE* is specified, + this will print to the FILE. Else it will print + to memory, and the result is available in CStr(). + If 'compact' is set to true, then output is created + with only required whitespace and newlines. + */ + XMLPrinter( FILE* file=0, bool compact = false, int depth = 0 ); + virtual ~XMLPrinter() {} + + /** If streaming, write the BOM and declaration. */ + void PushHeader( bool writeBOM, bool writeDeclaration ); + /** If streaming, start writing an element. + The element must be closed with CloseElement() + */ + void OpenElement( const char* name, bool compactMode=false ); + /// If streaming, add an attribute to an open element. + void PushAttribute( const char* name, const char* value ); + void PushAttribute( const char* name, int value ); + void PushAttribute( const char* name, unsigned value ); + void PushAttribute( const char* name, int64_t value ); + void PushAttribute( const char* name, uint64_t value ); + void PushAttribute( const char* name, bool value ); + void PushAttribute( const char* name, double value ); + /// If streaming, close the Element. + virtual void CloseElement( bool compactMode=false ); + + /// Add a text node. + void PushText( const char* text, bool cdata=false ); + /// Add a text node from an integer. + void PushText( int value ); + /// Add a text node from an unsigned. + void PushText( unsigned value ); + /// Add a text node from a signed 64bit integer. + void PushText( int64_t value ); + /// Add a text node from an unsigned 64bit integer. + void PushText( uint64_t value ); + /// Add a text node from a bool. + void PushText( bool value ); + /// Add a text node from a float. + void PushText( float value ); + /// Add a text node from a double. + void PushText( double value ); + + /// Add a comment + void PushComment( const char* comment ); + + void PushDeclaration( const char* value ); + void PushUnknown( const char* value ); + + virtual bool VisitEnter( const XMLDocument& /*doc*/ ); + virtual bool VisitExit( const XMLDocument& /*doc*/ ) { + return true; + } + + virtual bool VisitEnter( const XMLElement& element, const XMLAttribute* attribute ); + virtual bool VisitExit( const XMLElement& element ); + + virtual bool Visit( const XMLText& text ); + virtual bool Visit( const XMLComment& comment ); + virtual bool Visit( const XMLDeclaration& declaration ); + virtual bool Visit( const XMLUnknown& unknown ); + + /** + If in print to memory mode, return a pointer to + the XML file in memory. + */ + const char* CStr() const { + return _buffer.Mem(); + } + /** + If in print to memory mode, return the size + of the XML file in memory. (Note the size returned + includes the terminating null.) + */ + int CStrSize() const { + return _buffer.Size(); + } + /** + If in print to memory mode, reset the buffer to the + beginning. + */ + void ClearBuffer( bool resetToFirstElement = true ) { + _buffer.Clear(); + _buffer.Push(0); + _firstElement = resetToFirstElement; + } + +protected: + virtual bool CompactMode( const XMLElement& ) { return _compactMode; } + + /** Prints out the space before an element. You may override to change + the space and tabs used. A PrintSpace() override should call Print(). + */ + virtual void PrintSpace( int depth ); + virtual void Print( const char* format, ... ); + virtual void Write( const char* data, size_t size ); + virtual void Putc( char ch ); + + inline void Write(const char* data) { Write(data, strlen(data)); } + + void SealElementIfJustOpened(); + bool _elementJustOpened; + DynArray< const char*, 10 > _stack; + +private: + /** + Prepares to write a new node. This includes sealing an element that was + just opened, and writing any whitespace necessary if not in compact mode. + */ + void PrepareForNewNode( bool compactMode ); + void PrintString( const char*, bool restrictedEntitySet ); // prints out, after detecting entities. + + bool _firstElement; + FILE* _fp; + int _depth; + int _textDepth; + bool _processEntities; + bool _compactMode; + + enum { + ENTITY_RANGE = 64, + BUF_SIZE = 200 + }; + bool _entityFlag[ENTITY_RANGE]; + bool _restrictedEntityFlag[ENTITY_RANGE]; + + DynArray< char, 20 > _buffer; + + // Prohibit cloning, intentionally not implemented + XMLPrinter( const XMLPrinter& ); + XMLPrinter& operator=( const XMLPrinter& ); +}; + + +} // tinyxml2 + +#if defined(_MSC_VER) +# pragma warning(pop) +#endif + +#endif // TINYXML2_INCLUDED diff --git a/external_libs/yaml-cpp-cstdint.patch b/external_libs/yaml-cpp-cstdint.patch new file mode 100644 index 0000000..ed183d5 --- /dev/null +++ b/external_libs/yaml-cpp-cstdint.patch @@ -0,0 +1,10 @@ +--- a/src/emitterutils.cpp ++++ b/src/emitterutils.cpp +@@ -1,6 +1,7 @@ + #include + #include + #include ++#include + + #include "emitterutils.h" + #include "exp.h" diff --git a/include/1d_models.h b/include/1d_models.h new file mode 100644 index 0000000..2ce8b93 --- /dev/null +++ b/include/1d_models.h @@ -0,0 +1,397 @@ +#ifndef ONE_D_MODELS_H +#define ONE_D_MODELS_H + +#include +#include "config.h" + + +// ak135 http://rses.anu.edu.au/seismology/ak135/ak135t.html +// depth(km), P velocity(km/s) +inline const std::vector> model_1d_ak135 \ + {{ 0.000, 5.8000}, + { 20.000, 5.8000}, + { 20.000, 6.5000}, + { 35.000, 6.5000}, + { 35.000, 8.0400}, + { 77.500, 8.0450}, + { 120.000, 8.0500}, + { 165.000, 8.1750}, + { 210.000, 8.3000}, + { 210.000, 8.3000}, + { 260.000, 8.4825}, + { 310.000, 8.6650}, + { 360.000, 8.8475}, + { 410.000, 9.0300}, + { 410.000, 9.3600}, + { 460.000, 9.5280}, + { 510.000, 9.6960}, + { 560.000, 9.8640}, + { 610.000, 10.0320}, + { 660.000, 10.2000}, + { 660.000, 10.7900}, + { 710.000, 10.9229}, + { 760.000, 11.0558}, + { 809.500, 11.1353}, + { 859.000, 11.2221}, + { 908.500, 11.3068}, + { 958.000, 11.3896}, + { 1007.500, 11.4705}, + { 1057.000, 11.5495}, + { 1106.500, 11.6269}, + { 1156.000, 11.7026}, + { 1205.500, 11.7766}, + { 1255.000, 11.8491}, + { 1304.500, 11.9200}, + { 1354.000, 11.9895}, + { 1403.500, 12.0577}, + { 1453.000, 12.1245}, + { 1502.500, 12.1912}, + { 1552.000, 12.2550}, + { 1601.500, 12.3185}, + { 1651.000, 12.3819}, + { 1700.500, 12.4426}, + { 1750.000, 12.5031}, + { 1799.500, 12.5631}, + { 1849.000, 12.6221}, + { 1898.500, 12.6804}, + { 1948.000, 12.7382}, + { 1997.500, 12.7956}, + { 2047.000, 12.8526}, + { 2096.500, 12.9096}, + { 2146.000, 12.9668}, + { 2195.500, 13.0222}, + { 2245.000, 13.0783}, + { 2294.500, 13.1336}, + { 2344.000, 13.1894}, + { 2393.500, 13.2465}, + { 2443.000, 13.3018}, + { 2492.500, 13.3585}, + { 2542.000, 13.4156}, + { 2591.500, 13.4741}, + { 2640.000, 13.5312}, + { 2690.000, 13.5900}, + { 2740.000, 13.6494}, + { 2740.000, 13.6494}, + { 2789.670, 13.6530}, + { 2839.330, 13.6566}, + { 2891.500, 13.6602}, + { 2891.500, 8.0000}, + { 2939.330, 8.0382}, + { 2989.660, 8.1283}, + { 3039.990, 8.2213}, + { 3090.320, 8.3122}, + { 3140.660, 8.4001}, + { 3190.990, 8.4861}, + { 3241.320, 8.5692}, + { 3291.650, 8.6496}, + { 3341.980, 8.7283}, + { 3392.310, 8.8036}, + { 3442.640, 8.8761}, + { 3492.970, 8.9461}, + { 3543.300, 9.0138}, + { 3593.640, 9.0792}, + { 3643.970, 9.1426}, + { 3694.300, 9.2042}, + { 3744.630, 9.2634}, + { 3794.960, 9.3205}, + { 3845.290, 9.3760}, + { 3895.620, 9.4297}, + { 3945.950, 9.4814}, + { 3996.280, 9.5306}, + { 4046.620, 9.5777}, + { 4096.950, 9.6232}, + { 4147.280, 9.6673}, + { 4197.610, 9.7100}, + { 4247.940, 9.7513}, + { 4298.270, 9.7914}, + { 4348.600, 9.8304}, + { 4398.930, 9.8682}, + { 4449.260, 9.9051}, + { 4499.600, 9.9410}, + { 4549.930, 9.9761}, + { 4600.260, 10.0103}, + { 4650.590, 10.0439}, + { 4700.920, 10.0768}, + { 4801.580, 10.1415}, + { 4851.910, 10.1739}, + { 4902.240, 10.2049}, + { 4952.580, 10.2329}, + { 5002.910, 10.2565}, + { 5053.240, 10.2745}, + { 5103.570, 10.2854}, + { 5153.500, 10.2890}, + { 5153.500, 11.0427}, + { 5204.610, 11.0585}, + { 5255.320, 11.0718}, + { 5306.040, 11.0850}, + { 5356.750, 11.0983}, + { 5407.460, 11.1166}, + { 5458.170, 11.1316}, + { 5508.890, 11.1457}, + { 5559.600, 11.1590}, + { 5610.310, 11.1715}, + { 5661.020, 11.1832}, + { 5711.740, 11.1941}, + { 5813.160, 11.2134}, + { 5863.870, 11.2219}, + { 5914.590, 11.2295}, + { 5965.300, 11.2364}, + { 6016.010, 11.2424}, + { 6066.720, 11.2477}, + { 6117.440, 11.2521}, + { 6168.150, 11.2557}, + { 6218.860, 11.2586}, + { 6269.570, 11.2606}, + { 6320.290, 11.2618}, + { 6371.000, 11.2622}}; + + +// iasp91 model from http://ds.iris.edu/spud/earthmodel/9991809 +inline const std::vector> model_1d_iasp91 \ + {{0.00, 5.8000}, + {1.00, 5.8000}, + {2.00, 5.8000}, + {3.00, 5.8000}, + {4.00, 5.8000}, + {5.00, 5.8000}, + {6.00, 5.8000}, + {7.00, 5.8000}, + {8.00, 5.8000}, + {9.00, 5.8000}, + {10.00, 5.8000}, + {11.00, 5.8000}, + {12.00, 5.8000}, + {13.00, 5.8000}, + {14.00, 5.8000}, + {15.00, 5.8000}, + {16.00, 5.8000}, + {17.00, 5.8000}, + {18.00, 5.8000}, + {19.00, 5.8000}, + {20.00, 5.8000}, + {20.00, 6.5000}, + {21.00, 6.5000}, + {22.00, 6.5000}, + {23.00, 6.5000}, + {24.00, 6.5000}, + {25.00, 6.5000}, + {26.00, 6.5000}, + {27.00, 6.5000}, + {28.00, 6.5000}, + {29.00, 6.5000}, + {30.00, 6.5000}, + {31.00, 6.5000}, + {32.00, 6.5000}, + {33.00, 6.5000}, + {34.00, 6.5000}, + {35.00, 6.5000}, + {35.00, 8.0400}, + {40.00, 8.0406}, + {45.00, 8.0412}, + {50.00, 8.0418}, + {60.00, 8.0429}, + {70.00, 8.0441}, + {80.00, 8.0453}, + {90.00, 8.0465}, + {100.00, 8.0476}, + {110.00, 8.0488}, + {120.00, 8.0500}, + {120.00, 8.0500}, + {130.00, 8.0778}, + {140.00, 8.1056}, + {150.00, 8.1333}, + {160.00, 8.1611}, + {170.00, 8.1889}, + {180.00, 8.2167}, + {190.00, 8.2444}, + {200.00, 8.2722}, + {210.00, 8.3000}, + {210.00, 8.3000}, + {220.00, 8.3365}, + {230.00, 8.3730}, + {240.00, 8.4095}, + {250.00, 8.4460}, + {260.00, 8.4825}, + {270.00, 8.5190}, + {280.00, 8.5555}, + {290.00, 8.5920}, + {300.00, 8.6285}, + {310.00, 8.6650}, + {320.00, 8.7015}, + {330.00, 8.7380}, + {340.00, 8.7745}, + {350.00, 8.8110}, + {360.00, 8.8475}, + {370.00, 8.8840}, + {380.00, 8.9205}, + {390.00, 8.9570}, + {400.00, 8.9935}, + {410.00, 9.0300}, + {410.00, 9.3600}, + {420.00, 9.3936}, + {430.00, 9.4272}, + {440.00, 9.4608}, + {450.00, 9.4944}, + {460.00, 9.5280}, + {470.00, 9.5616}, + {480.00, 9.5952}, + {490.00, 9.6288}, + {500.00, 9.6624}, + {510.00, 9.6960}, + {520.00, 9.7296}, + {530.00, 9.7632}, + {540.00, 9.7968}, + {550.00, 9.8304}, + {560.00, 9.8640}, + {570.00, 9.8976}, + {580.00, 9.9312}, + {590.00, 9.9648}, + {600.00, 9.9984}, + {610.00, 10.0320}, + {620.00, 10.0656}, + {630.00, 10.0992}, + {640.00, 10.1328}, + {650.00, 10.1664}, + {660.00, 10.2000}, + {660.00, 10.7900}, + {670.00, 10.8166}, + {680.00, 10.8432}, + {690.00, 10.8697}, + {700.00, 10.8963}, + {710.00, 10.9229}, + {720.00, 10.9495}, + {730.00, 10.9761}, + {740.00, 11.0026}, + {750.00, 11.0292}, + {760.00, 11.0558}, + {760.00, 11.0558}, + {770.00, 11.0738}, + {780.00, 11.0917}, + {790.00, 11.1095}, + {800.00, 11.1272}, + {900.00, 11.2997}, + {1000.00, 11.4640}, + {1100.00, 11.6208}, + {1200.00, 11.7707}, + {1300.00, 11.9142}, + {1400.00, 12.0521}, + {1500.00, 12.1849}, + {2000.00, 12.7944}, + {2500.00, 13.3697}, + {2700.00, 13.6076}, + {2740.00, 13.6564}, + {2740.00, 13.6564}, + {2750.00, 13.6587}, + {2800.00, 13.6703}, + {2850.00, 13.6818}, + {2889.00, 13.6908}, + {2889.00, 8.0088}, + {2900.00, 8.0280}, + {3000.00, 8.1995}, + {3100.00, 8.3642}, + {3200.00, 8.5222}, + {3300.00, 8.6735}, + {3400.00, 8.8180}, + {3500.00, 8.9558}, + {4000.00, 9.5437}, + {4500.00, 9.9633}, + {5153.90, 10.2578}, + {5153.90, 11.0914}, + {5500.00, 11.1644}, + {6000.00, 11.2270}, + {6371.00, 11.2409}}; + + +// fortran test model +inline const std::vector> model_1d_prem \ + = {{ 0.00, 5.80000}, + { 15.00, 5.80000}, + { 15.00, 6.80000}, + { 24.40, 6.80000}, + { 24.40, 8.11061}, + { 40.00, 8.10119}, + { 60.00, 8.08907}, + { 80.00, 8.07688}, + { 115.00, 8.05540}, + { 150.00, 8.03370}, + { 185.00, 8.01180}, + { 220.00, 7.98970}, + { 220.00, 8.55896}, + { 265.00, 8.64552}, + { 310.00, 8.73209}, + { 355.00, 8.81867}, + { 400.00, 8.90522}, + { 400.00, 9.13397}, + { 450.00, 9.38990}, + { 500.00, 9.64588}, + { 550.00, 9.90185}, + { 600.00, 10.15782}, + { 635.00, 10.21203}, + { 670.00, 10.26622}, + { 670.00, 10.75131}, + { 721.00, 10.91005}, + { 771.00, 11.06557}, + { 871.00, 11.24490}, + { 971.00, 11.41560}, + { 1071.00, 11.57828}, + { 1171.00, 11.73357}, + { 1271.00, 11.88209}, + { 1371.00, 12.02445}, + { 1471.00, 12.16126}, + { 1571.00, 12.29316}, + { 1671.00, 12.42075}, + { 1771.00, 12.54466}, + { 1871.00, 12.66550}, + { 1971.00, 12.78389}, + { 2071.00, 12.90045}, + { 2171.00, 13.01579}, + { 2271.00, 13.13055}, + { 2371.00, 13.24532}, + { 2471.00, 13.36074}, + { 2571.00, 13.47742}, + { 2671.00, 13.59597}, + { 2741.00, 13.68041}, + { 2771.00, 13.68753}, + { 2871.00, 13.71168}, + { 2891.00, 13.71660}, + { 2891.00, 8.06482}, + { 2971.00, 8.19939}, + { 3071.00, 8.36019}, + { 3171.00, 8.51298}, + { 3271.00, 8.65805}, + { 3371.00, 8.79573}, + { 3471.00, 8.92632}, + { 3571.00, 9.05015}, + { 3671.00, 9.16752}, + { 3771.00, 9.27867}, + { 3871.00, 9.38418}, + { 3971.00, 9.48409}, + { 4071.00, 9.57881}, + { 4171.00, 9.66865}, + { 4271.00, 9.75393}, + { 4371.00, 9.83496}, + { 4471.00, 9.91206}, + { 4571.00, 9.98554}, + { 4671.00, 10.05572}, + { 4771.00, 10.12291}, + { 4871.00, 10.18743}, + { 4971.00, 10.24959}, + { 5071.00, 10.30971}, + { 5149.50, 10.35568}, + { 5149.50, 11.02827}, + { 5171.00, 11.03643}, + { 5271.00, 11.07249}, + { 5371.00, 11.10542}, + { 5471.00, 11.13521}, + { 5571.00, 11.16186}, + { 5671.00, 11.18538}, + { 5771.00, 11.20576}, + { 5871.00, 11.22301}, + { 5971.00, 11.23712}, + { 6071.00, 11.24809}, + { 6171.00, 11.25593}, + { 6271.00, 11.26064}, + { 6371.00, 11.26220}}; + + +#endif \ No newline at end of file diff --git a/include/config.h b/include/config.h new file mode 100644 index 0000000..1493242 --- /dev/null +++ b/include/config.h @@ -0,0 +1,332 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#include +#include +#include +#include +#include +#include +#include "version.h" + +// custom floating point accuracy +#ifdef SINGLE_PRECISION +#define CUSTOMREAL float +#define MPI_CR MPI_FLOAT +#else +#define CUSTOMREAL double +#define MPI_CR MPI_DOUBLE +#endif + + +#define MPI_DUMMY_TAG 1000 + +// version +inline const std::string TOMOATT_VERSION = std::to_string(PROJECT_VERSION_MAJOR) + + "." + std::to_string(PROJECT_VERSION_MINOR) + + "." + std::to_string(PROJECT_VERSION_PATCH); + +inline int loc_I, loc_J, loc_K; +inline int loc_I_vis, loc_J_vis, loc_K_vis; +inline int loc_I_excl_ghost, loc_J_excl_ghost, loc_K_excl_ghost; +inline int n_inv_grids; +inline int n_inv_I_loc, n_inv_J_loc, n_inv_K_loc; +inline int n_inv_I_loc_ani, n_inv_J_loc_ani, n_inv_K_loc_ani; + +// 3d indices to 1d index +#define I2V(A,B,C) ((C)*loc_I*loc_J + (B)*loc_I + A) +inline void V2I(const int& ijk, int& i, int& j, int& k) { + k = ijk / (loc_I * loc_J); + j = (ijk - k * loc_I * loc_J) / loc_I; + i = ijk - k * loc_I * loc_J - j * loc_I; +} + +#define I2V_INV_GRIDS(A,B,C,D) ((D)*n_inv_I_loc*n_inv_J_loc*n_inv_K_loc + (C)*n_inv_I_loc*n_inv_J_loc + (B)*n_inv_I_loc + A) +#define I2V_INV_KNL(A,B,C) ((C)*n_inv_I_loc*n_inv_J_loc + (B)*n_inv_I_loc + A) +#define I2V_INV_GRIDS_1DK(A,B) ((B)*n_inv_K_loc + (A)) +#define I2V_INV_GRIDS_2DJ(A,B,C) ((C)*n_inv_J_loc*n_inv_K_loc + (B)*n_inv_J_loc + (A)) +#define I2V_INV_GRIDS_2DI(A,B,C) ((C)*n_inv_I_loc*n_inv_K_loc + (B)*n_inv_I_loc + (A)) + +#define I2V_INV_ANI_GRIDS(A,B,C,D) ((D)*n_inv_I_loc_ani*n_inv_J_loc_ani*n_inv_K_loc_ani + (C)*n_inv_I_loc_ani*n_inv_J_loc_ani + (B)*n_inv_I_loc_ani + A) +#define I2V_INV_ANI_KNL(A,B,C) ((C)*n_inv_I_loc_ani*n_inv_J_loc_ani + (B)*n_inv_I_loc_ani + A) +#define I2V_INV_ANI_GRIDS_1DK(A,B) ((B)*n_inv_K_loc_ani + (A)) +#define I2V_INV_ANI_GRIDS_1DJ(A,B,C) ((C)*n_inv_J_loc_ani*n_inv_K_loc_ani + (B)*n_inv_J_loc_ani + (A)) +#define I2V_INV_ANI_GRIDS_1DI(A,B,C) ((C)*n_inv_I_loc_ani*n_inv_K_loc_ani + (B)*n_inv_I_loc_ani + (A)) + +#define I2V_INV_GRIDS_1D_GENERIC(A,B,C_ninv) ((B)*C_ninv + (A)) +#define I2V_INV_GRIDS_2D_GENERIC(A,B,C,D_ninv,E_inv) ((C)*D_ninv*E_inv + (B)*D_ninv + (A)) + +#define I2V_EXCL_GHOST(A,B,C) ((C)* loc_I_excl_ghost * loc_J_excl_ghost + (B)* loc_I_excl_ghost + A) +#define I2V_VIS(A,B,C) ((C)* loc_I_vis * loc_J_vis + (B)* loc_I_vis + A) +#define I2V_3D(A,B,C) ((C)* loc_I_excl_ghost*loc_J_excl_ghost + (B)* loc_I_excl_ghost + A) +#define I2V_ELM_CONN(A,B,C) ((C)*(loc_I_vis-1)*(loc_J_vis-1) + (B)*(loc_I_vis-1) + A) +#define I2VLBFGS(A,B,C,D) ((A)*loc_I*loc_J*loc_K + (D)*loc_I*loc_J + (C)*loc_I + B) + +// 2d indices to 1d index +#define IJ2V(A,B,C) (C*loc_I*loc_J + (B)*loc_I + A) +#define JK2V(A,B,C) (C*loc_J*loc_K + (B)*loc_J + A) +#define IK2V(A,B,C) (C*loc_I*loc_K + (B)*loc_I + A) + +inline const CUSTOMREAL eps = 1e-12; +inline const CUSTOMREAL epsAdj = 1e-6; + +inline bool isZero(CUSTOMREAL x) { + return fabs(x) < eps; +} + +inline bool isNegative(CUSTOMREAL x) { + return (x) < -eps; +} + +inline bool isPositive(CUSTOMREAL x) { + return (x) > eps; +} + +inline bool isZeroAdj(CUSTOMREAL x) { + return fabs(x) < epsAdj; +} + +// constants +inline const CUSTOMREAL PI = 3.14159265358979323846264338327950288; +inline const CUSTOMREAL DEG2RAD = PI/180.0; +inline const CUSTOMREAL RAD2DEG = 180.0/PI; +inline const CUSTOMREAL M2KM = 0.001; +inline const CUSTOMREAL _0_CR = 0.0; +inline const CUSTOMREAL _0_5_CR = 0.5; +inline const CUSTOMREAL _1_CR = 1.0; +inline const CUSTOMREAL _1_5_CR = 1.5; +inline const CUSTOMREAL _2_CR = 2.0; +inline const CUSTOMREAL _3_CR = 3.0; +inline const CUSTOMREAL _4_CR = 4.0; +inline const CUSTOMREAL _8_CR = 8.0; +inline const CUSTOMREAL TAU_INITIAL_VAL = 1.0; +inline const CUSTOMREAL TAU_INF_VAL = 20.0; +inline const int SWEEPING_COEFF = 1.0; // coefficient for calculationg sigr/sigt/sigp for cpu + +// ASCII output precision +typedef std::numeric_limits< CUSTOMREAL > dbl; +inline const int ASCII_OUTPUT_PRECISION = dbl::max_digits10; + +// radious of the earth in km +//inline CUSTOMREAL R_earth = 6378.1370; +inline CUSTOMREAL R_earth = 6371.0; // for compatibility with fortran code +inline const CUSTOMREAL GAMMA = 0.0; +inline const CUSTOMREAL r_kermel_mask = 40.0; +inline CUSTOMREAL step_length_init = 0.01; // update step size limit +inline CUSTOMREAL step_length_init_sc = 0.001; // update step size limit (for station correction) +inline CUSTOMREAL step_length_decay = 0.9; +inline CUSTOMREAL step_length_down = 0.5; +inline CUSTOMREAL step_length_up = 1.2; +inline CUSTOMREAL step_length_lbfgs; +inline int step_method = 1; // 0:modulate according to obj, 1: modulate according to gradient direction. +inline CUSTOMREAL step_length_gradient_angle = 120.0; +inline const int OBJ_DEFINED = 0; +inline const int GRADIENT_DEFINED = 1; + +// halve steping params +inline const CUSTOMREAL HALVE_STEP_RATIO = 0.7; +inline const CUSTOMREAL MAX_DIFF_RATIO_VOBJ = 0.8; // maximum difference ratio between vobj_t+1 and vobj_t +inline const CUSTOMREAL HALVE_STEP_RESTORAION_RATIO = 0.7; // no restoration if == HALVE_STEP_RATIO + +// RUN MODE TYPE FLAG +inline const int ONLY_FORWARD = 0; +inline const int DO_INVERSION = 1; +inline const int SRC_RELOCATION = 2; +inline const int INV_RELOC = 3; +inline const int ONED_INVERSION = 4; +inline const int TELESEIS_PREPROCESS = -1; // hiden function + +// SWEEPING TYPE FLAG +inline const int SWEEP_TYPE_LEGACY = 0; +inline const int SWEEP_TYPE_LEVEL = 1; +inline bool hybrid_stencil_order = false; // if true, code at first run 1st order, then change to 3rd order (Dong Cui 2020) + +// STENCIL TYPE +inline const int NON_UPWIND = 0; +inline const int UPWIND = 1; + +// convert depth <-> radius +inline CUSTOMREAL depth2radius(CUSTOMREAL depth) { + return R_earth - depth; +} +inline CUSTOMREAL radius2depth(CUSTOMREAL radius) { + return R_earth - radius; +} + +// parallel calculation parameters +// here we use so called "inline variables" for defining global variables +inline int ngrid_i = 0; // number of grid points in i direction +inline int ngrid_j = 0; // number of grid points in j direction +inline int ngrid_k = 0; // number of grid points in k direction +//inline int ngrid_i_inv = 0; // number of inversion grid points in i direction # DUPLICATED with n_inv_I_loc as all the subdomains have the same number of inversion grid points +//inline int ngrid_j_inv = 0; // number of inversion grid points in j direction # DUPLICATED with n_inv_J_loc +//inline int ngrid_k_inv = 0; // number of inversion grid points in k direction # DUPLICATED with n_inv_K_loc +//inline int ngrid_i_inv_ani = 0; // number of inversion grid points in i direction for anisotropy # DUPLICATED with n_inv_I_loc_ani +//inline int ngrid_j_inv_ani = 0; // number of inversion grid points in j direction for anisotropy # DUPLICATED with n_inv_J_loc_ani +//inline int ngrid_k_inv_ani = 0; // number of inversion grid points in k direction for anisotropy # DUPLICATED with n_inv_K_loc_ani + +// inversion grid type flags +#define INV_GRID_REGULAR 0 +#define INV_GRID_FLEX 1 +#define INV_GRID_TRAPE 2 + +// mpi parameters +inline int world_nprocs; // total number of processes (all groups) +inline int world_rank; // mpi rank of this process (all groups) +inline int sim_nprocs; // number of processes in this simulation group +inline int sim_rank; // mpi rank of this process in this simulation group +inline int inter_sim_rank; +inline int sub_nprocs; // total number of processes +inline int sub_rank; // mpi rank of this process +inline int inter_sub_rank; // mpi rank of this process in the inter-subdomain communicator +inline int inter_sub_nprocs; // number of processes in the inter-subdomain communicator +inline int nprocs; // = n subdomains +inline int myrank; // = id subdomain +inline MPI_Comm sim_comm, inter_sim_comm, sub_comm, inter_sub_comm; // mpi communicator for simulation, inter-simulation, subdomain, and inter subdomains +inline int n_sims = 1; // number of mpi groups for simultaneous runs +inline int n_procs_each_sim = 1; // number of processes in each simulation group +inline int n_subdomains = 1; // number of subdomains +inline int n_subprocs = 1; // number of sub processes in each subdomain +inline int ndiv_i = 1; // number of divisions in x direction +inline int ndiv_j = 1; // number of divisions in y direction +inline int ndiv_k = 1; // number of divisions in z direction +inline int id_sim = 0; // simultaneous run id (not equal to src id) (parallel level 1) +inline int id_subdomain = 0; // subdomain id (parallel level 2) +inline bool subdom_main = false; // true if this process is main process in subdomain (parallel level 3) + +// flags for explaining the process's role +inline bool proc_read_srcrec = false; // true if this process is reading source file +inline bool proc_store_srcrec = false; // true if this process is storing srcrec file + +// MNMN stop using these global variable for avoiding misleadings during the sources' iteration loop +//inline int id_sim_src = 0; // id of current target source +//inline std::string name_sim_src = "unknown"; //name of current target source + +// rule to distribute source to simultaneous group +inline int select_id_sim_for_src(const int& i_src, const int& n_sims){ + return i_src % n_sims; +} + +// read input yaml file +inline std::string input_file="input_params.yaml"; +// output directory name +inline std::string output_dir="./OUTPUT_FILES/"; +// output file format +#define OUTPUT_FORMAT_HDF5 11111 +#define OUTPUT_FORMAT_ASCII 22222 +//#define OUTPUT_FORMAT_BINARY 33333 //#TODO: add +inline int output_format = OUTPUT_FORMAT_HDF5; // 0 - ascii, 1 - hdf5, 2 - binary + +// HDF5 io mode (independent or collective) +#ifdef USE_HDF5_IO_COLLECTIVE +#define HDF5_IO_MODE H5FD_MPIO_COLLECTIVE +#else +#define HDF5_IO_MODE H5FD_MPIO_INDEPENDENT +#endif + +// smooth parameters +inline int smooth_method = 0; // 0: multi grid parametrization, 1: laplacian smoothing +inline CUSTOMREAL smooth_lp = 1.0; +inline CUSTOMREAL smooth_lt = 1.0; +inline CUSTOMREAL smooth_lr = 1.0; +inline CUSTOMREAL regul_lp = 1.0; +inline CUSTOMREAL regul_lt = 1.0; +inline CUSTOMREAL regul_lr = 1.0; +inline const int GRADIENT_DESCENT = 0; +inline const int HALVE_STEPPING_MODE = 1; +inline const int LBFGS_MODE = 2; +inline int optim_method = 0; // 0: gradient descent, 1: halve_stepping, 2: LBFGS +inline const CUSTOMREAL wolfe_c1 = 1e-4; +inline const CUSTOMREAL wolfe_c2 = 0.9; +inline const int Mbfgs = 5; // number of gradients/models stored in memory +inline CUSTOMREAL regularization_weight = 0.5; // regularization weight +inline int max_sub_iterations = 20; // maximum number of sub-iterations +inline const CUSTOMREAL LBFGS_RELATIVE_step_length = 3.0; // relative step size for the second and later iteration +inline CUSTOMREAL Kdensity_coe = 0.0; // a preconditioner \in [0,1], kernel -> kernel / pow(kernel density, Kdensity_coe) +// variables for test +inline bool if_test = false; + +// verboose mode +inline bool if_verbose = false; +//inline bool if_verbose = true; + +// if use gpu +inline bool use_gpu; + +// total number of sources in the srcrec file +inline int nsrc_total = 0; + +// flag if common receiver double difference data is used +inline bool src_pair_exists = false; + + +// weight of different typs of data +inline CUSTOMREAL abs_time_local_weight = 1.0; // weight of absolute traveltime data for local earthquake, default: 1.0 +inline CUSTOMREAL cr_dif_time_local_weight = 1.0; // weight of common receiver differential traveltime data for local earthquake, default: 1.0 +inline CUSTOMREAL cs_dif_time_local_weight = 1.0; // weight of common source differential traveltime data for local earthquake, default: 1.0 (not ready) +inline CUSTOMREAL teleseismic_weight = 1.0; // weight of teleseismic data default: 1.0 (not ready) +inline CUSTOMREAL abs_time_local_weight_reloc = 1.0; // weight of absolute traveltime data for local earthquake, default: 1.0 +inline CUSTOMREAL cs_dif_time_local_weight_reloc = 1.0; // weight of common source differential traveltime data for local earthquake, default: 1.0 +inline CUSTOMREAL cr_dif_time_local_weight_reloc = 1.0; // weight of common receiver differential traveltime data for local earthquake, default: 1.0 +inline CUSTOMREAL teleseismic_weight_reloc = 1.0; // weight of teleseismic data default: 1.0 (not ready) + +// misfit balance +inline bool balance_data_weight = false; // add the weight to normalize the initial objective function of different types of data. 1 for yes and 0 for no +inline CUSTOMREAL total_abs_local_data_weight = 0.0; +inline CUSTOMREAL total_cr_dif_local_data_weight = 0.0; +inline CUSTOMREAL total_cs_dif_local_data_weight = 0.0; +inline CUSTOMREAL total_teleseismic_data_weight = 0.0; +inline bool balance_data_weight_reloc = false; // add the weight to normalize the initial objective function of different types of data for relocation. 1 for yes and 0 for no +inline CUSTOMREAL total_abs_local_data_weight_reloc = 0.0; +inline CUSTOMREAL total_cr_dif_local_data_weight_reloc = 0.0; +inline CUSTOMREAL total_cs_dif_local_data_weight_reloc = 0.0; +inline CUSTOMREAL total_teleseismic_data_weight_reloc = 0.0; + +// 2d solver parameters for teleseismic data +// use fixed domain size for all 2d simulations in teleseismic data +inline CUSTOMREAL rmin_2d = 3370.5; +inline CUSTOMREAL rmax_2d = 6471.5; +inline CUSTOMREAL tmin_2d = -5.0/180.0*PI; +inline CUSTOMREAL tmax_2d = 120.0/180.0*PI; +inline CUSTOMREAL dr_2d = 2.0; +inline CUSTOMREAL dt_2d = PI/1000.0; +inline const CUSTOMREAL TOL_2D_SOLVER = 1e-5; +inline const CUSTOMREAL MAX_ITER_2D_SOLVER = 4000; +inline const CUSTOMREAL SWEEPING_COEFF_TELE = 1.05; // coefficient for calculationg sigr/sigt/sigp +inline const int N_LAYER_SRC_BOUND = 1; // number of layers for source boundary +inline CUSTOMREAL DIST_SRC_DDT = 2.5*DEG2RAD; // distance threshold of two stations +inline const std::string OUTPUT_DIR_2D = "/2D_TRAVEL_TIME_FIELD/"; // output directory for 2d solver + +// earthquake relocation +inline CUSTOMREAL step_length_src_reloc = 0.01; // step length for source relocation +inline CUSTOMREAL step_length_decay_src_reloc = 0.9; +inline int N_ITER_MAX_SRC_RELOC = 501; // max iteration for source location +inline CUSTOMREAL TOL_SRC_RELOC = 1e-3; // threshold of the norm of gradient for stopping single earthquake location +inline const CUSTOMREAL TOL_step_length = 1e-4; // threshold of the max step size for stopping single earthquake location +inline CUSTOMREAL rescaling_dep = 10.0; +inline CUSTOMREAL rescaling_lat = 5.0; +inline CUSTOMREAL rescaling_lon = 5.0; +inline CUSTOMREAL rescaling_ortime = 0.5; +inline CUSTOMREAL max_change_dep = 10.0; // default: max change is 10 km +inline CUSTOMREAL max_change_lat = 5.0; // default: max change is 5 km +inline CUSTOMREAL max_change_lon = 5.0; // default: max change is 5 km +inline CUSTOMREAL max_change_ortime = 0.5; // default: max change is 0.5 s +inline bool ortime_local_search = true; +inline int min_Ndata_reloc = 4; // if an earthquake is recorded by less than times, relocation is not allowed. + +// inversion strategy parameters +inline int inv_mode = 1; +inline int model_update_N_iter = 1; +inline int relocation_N_iter = 1; +inline int max_loop_mode0 = 10; +inline int max_loop_mode1 = 10; + +// INV MODE TYPE FLAG +inline const int ITERATIVE = 0; +inline const int SIMULTANEOUS = 1; + +// source receiver weight calculation +inline CUSTOMREAL ref_value = 1.0; // reference value for source receiver weight calculation +inline std::string output_file_weight = "srcrec_weight.txt"; // output file name for source receiver weight calculation + +#endif // CONFIG_H \ No newline at end of file diff --git a/include/eikonal_solver_2d.h b/include/eikonal_solver_2d.h new file mode 100644 index 0000000..940078f --- /dev/null +++ b/include/eikonal_solver_2d.h @@ -0,0 +1,79 @@ +#ifndef EIKONAL_SOLVER_2D_H +#define EIKONAL_SOLVER_2D_H + +#include +#include +#include + +#include "utils.h" +#include "input_params.h" +#include "grid.h" +#include "1d_models.h" +#include "mpi_funcs.h" +#include "io.h" + + +class PlainGrid { + +public: + PlainGrid(Source& src, InputParams& IP); + ~PlainGrid(); + + void run_iteration(InputParams& IP); + void run_iteration_upwind(InputParams& IP); + +//private: + // grid parameters + CUSTOMREAL src_r, src_t, src_p; + CUSTOMREAL src_t_dummy; + CUSTOMREAL rmin_3d, rmax_3d, tmin_3d, tmax_3d, pmin_3d, pmax_3d; + CUSTOMREAL max_degree; + int nr_2d, nt_2d; + + // for eikonal solver + int count_cand; + int ii,ii_nr,ii_n2r,ii_pr,ii_p2r,ii_nt,ii_n2t,ii_pt,ii_p2t; + CUSTOMREAL ar,br,at,bt,ar1,ar2,at1,at2,br1,br2,bt1,bt2; + CUSTOMREAL eqn_a, eqn_b, eqn_c, eqn_Delta; + CUSTOMREAL tmp_tau, T_r, T_t, charact_r, charact_t; + bool is_causality; + std::vector canditate = std::vector(60); + + // arrays + // azimuth + CUSTOMREAL *azimuth_2d; + // epicentral distance + CUSTOMREAL *epicentral_distance_2d; + // activated boundaries + //bool *activated_boundaries; + // grid + CUSTOMREAL *r_2d, *t_2d; // coordinates + CUSTOMREAL *fun_2d, *fac_a_2d, *fac_b_2d, *u_2d, *T_2d; // functions + CUSTOMREAL *T0v_2d, *T0r_2d, *T0t_2d, *tau_2d, *tau_old_2d; + bool *is_changed_2d; + + // member functions + void allocate_arrays(); + void deallocate_arrays(); + void load_1d_model(std::string); + void select_1d_model(std::string); + void calculate_stencil_2d(int&, int&); + void calculate_stencil_upwind_2d(int&, int&); + CUSTOMREAL eps_2d = 1e-12; + +private: + + // # TODO: make id model type selectable by input file + // 1D model used for 2D solver + std::vector> model_1d_ref = model_1d_prem; + + +}; + +void prepare_teleseismic_boundary_conditions(InputParams&, Grid&, IO_utils&); +void run_2d_solver(InputParams&, Source&, IO_utils&); +void interp2d(PlainGrid&, CUSTOMREAL, CUSTOMREAL, CUSTOMREAL&); +void load_2d_traveltime(InputParams&, Source&, Grid&, IO_utils&); +std::string get_2d_tt_filename(const std::string&, Source&); + +#endif // EIKONAL_SOLVER_2D_H \ No newline at end of file diff --git a/include/grid.fwd.h b/include/grid.fwd.h new file mode 100644 index 0000000..b5d30f0 --- /dev/null +++ b/include/grid.fwd.h @@ -0,0 +1,2 @@ +#pragma once +class Grid; \ No newline at end of file diff --git a/include/grid.h b/include/grid.h new file mode 100644 index 0000000..f203d52 --- /dev/null +++ b/include/grid.h @@ -0,0 +1,445 @@ +#ifndef GRID_H +#define GRID_H + +// to handle circular dependency +#pragma once +#include "grid.fwd.h" +#include "source.fwd.h" +#include "io.fwd.h" + +#include +#include +#include +#include +#include + +#include "utils.h" +#include "config.h" +#include "mpi_funcs.h" +#include "input_params.h" +#include "source.h" +#include "io.h" +#include "inv_grid.h" + +#ifdef USE_CUDA +#include +#include +#endif + +class Grid { +public: + Grid(InputParams&, IO_utils&); + ~Grid(); + // + // setter + // + // set physical parameters + void setup_grid_params(InputParams&, IO_utils&); // setup grid parameters + // set factors + void setup_factors(Source &); + // calculate initial fields T0 T0r T0t T0p and initialize tau + void initialize_fields(Source &, InputParams&); + // calculate initial fields T0 T0r T0t T0p and initialize tau for teleseismic source + void initialize_fields_teleseismic(); + // calculate L1 and Linf diff (sum of value change on the nodes) + void calc_L1_and_Linf_diff(CUSTOMREAL&, CUSTOMREAL&); + // calculate L1 and Linf diff for teleseismic source (sum of value change on the nodes) + void calc_L1_and_Linf_diff_tele(CUSTOMREAL&, CUSTOMREAL&); + // FOR TEST: calculate L1 and Linf error between analytic solution and current T + void calc_L1_and_Linf_error(CUSTOMREAL&, CUSTOMREAL&); + // calculate L1 and Linf diff for adjoint field + void calc_L1_and_Linf_diff_adj(CUSTOMREAL&, CUSTOMREAL&); + // calculate L1 and Linf diff for density of adjoint field + void calc_L1_and_Linf_diff_adj_density(CUSTOMREAL&, CUSTOMREAL&); + + // send and receive data to/from other subdomains + void send_recev_boundary_data(CUSTOMREAL*); + void prepare_boundary_data_to_send(CUSTOMREAL*); + void assign_received_data_to_ghost(CUSTOMREAL*); + void send_recev_boundary_data_av(CUSTOMREAL*); + void assign_received_data_to_ghost_av(CUSTOMREAL*); + // send and receive data to/from the neighbor subdomains which contact on a line or point + void send_recev_boundary_data_kosumi(CUSTOMREAL*); + void prepare_boundary_data_to_send_kosumi(CUSTOMREAL*); + void assign_received_data_to_ghost_kosumi(CUSTOMREAL*); + + // inversion methods + InvGrid* inv_grid; // inversion grid definitions + + // check model discontinuity + void check_velocity_discontinuity(); + + void reinitialize_abcf(); // reinitialize factors + void rejuvenate_abcf(); // reinitialize factors for earthquake relocation + void initialize_kernels(); // fill 0 to kernels + + // + // getters + // + + int get_ngrid_total_excl_ghost(){return loc_nnodes;}; + int get_nelms_total_excl_ghost(){return loc_nelms;}; + int get_offset_nnodes() {return offset_nnodes;}; + int get_offset_elms() {return offset_nelms;}; + void get_offsets_3d(int* arr) { + arr[0] = offset_k; + arr[1] = offset_j; + arr[2] = offset_i; + }; + + int get_ngrid_total_vis() {return loc_nnodes_vis;}; + int get_nelms_total_vis() {return loc_nelms_vis;}; + int get_offset_nnodes_vis(){return offset_nnodes_vis;}; + int get_offset_elms_vis() {return offset_nelms_vis;}; + + // return dimensions of node coordinates arra and connectivity array + std::array get_dim_nodes_coords() {return {offset_nnodes,3};}; + std::array get_dim_elms_conn() {return {offset_nelms,9};}; + + // return node coordinates array and connectivity array + int* get_elms_conn() {return elms_conn;}; + CUSTOMREAL* get_nodes_coords_x(){return x_loc_3d;}; // lon + CUSTOMREAL* get_nodes_coords_y(){return y_loc_3d;}; // lat + CUSTOMREAL* get_nodes_coords_z(){return z_loc_3d;}; // r + CUSTOMREAL* get_nodes_coords_p(){return p_loc_3d;}; // lon + CUSTOMREAL* get_nodes_coords_t(){return t_loc_3d;}; // lat + CUSTOMREAL* get_nodes_coords_r(){return r_loc_3d;}; // r + int* get_proc_dump() {return my_proc_dump;}; // array storing the process ids + + CUSTOMREAL* get_true_solution(){return get_array_for_vis(u_loc, false);}; // true solution + CUSTOMREAL* get_fun() {return get_array_for_vis(fun_loc, false);}; // + CUSTOMREAL* get_xi() {return get_array_for_vis(xi_loc, false);}; // + CUSTOMREAL* get_eta() {return get_array_for_vis(eta_loc, false);}; // + CUSTOMREAL* get_a() {return get_array_for_vis(fac_a_loc, false);}; // + CUSTOMREAL* get_b() {return get_array_for_vis(fac_b_loc, false);}; // + CUSTOMREAL* get_c() {return get_array_for_vis(fac_c_loc, false);}; // + CUSTOMREAL* get_f() {return get_array_for_vis(fac_f_loc, false);}; // + CUSTOMREAL* get_vel() {return get_array_for_vis(fun_loc, true);}; // true velocity field + CUSTOMREAL* get_T0v() {return get_array_for_vis(T0v_loc, false);}; // initial T0 + CUSTOMREAL* get_u() {return get_array_for_vis(u_loc, false);}; // current solution + CUSTOMREAL* get_tau() {return get_array_for_vis(tau_loc, false);}; // current tau + CUSTOMREAL* get_T() {return get_array_for_vis(T_loc, false);}; + CUSTOMREAL* get_residual() { calc_residual(); + return get_array_for_vis(u_loc, false);}; // calculate residual (T_loc over written!!) + CUSTOMREAL* get_Tadj() {return get_array_for_vis(Tadj_loc, false);}; // adjoint solution + CUSTOMREAL* get_Ks() {return get_array_for_vis(Ks_loc, false);}; // Ks + CUSTOMREAL* get_Kxi() {return get_array_for_vis(Kxi_loc, false);}; // Kxi + CUSTOMREAL* get_Keta() {return get_array_for_vis(Keta_loc, false);}; // Keta + CUSTOMREAL* get_Ks_density() {return get_array_for_vis(Ks_density_loc, false);}; // Ks_density + CUSTOMREAL* get_Kxi_density() {return get_array_for_vis(Kxi_density_loc, false);}; // Kxi_density + CUSTOMREAL* get_Keta_density() {return get_array_for_vis(Keta_density_loc, false);}; // Keta_density + CUSTOMREAL* get_Ks_update() {return get_array_for_vis(Ks_update_loc, false);}; // Ks_update + CUSTOMREAL* get_Kxi_update() {return get_array_for_vis(Kxi_update_loc, false);}; // Kxi_update + CUSTOMREAL* get_Keta_update() {return get_array_for_vis(Keta_update_loc, false);}; // Keta_update + CUSTOMREAL* get_Ks_density_update() {return get_array_for_vis(Ks_density_update_loc,false);}; // Ks_density_update + CUSTOMREAL* get_Kxi_density_update() {return get_array_for_vis(Kxi_density_update_loc,false);}; // Kxi_density_update + CUSTOMREAL* get_Keta_density_update() {return get_array_for_vis(Keta_density_update_loc,false);}; // Keta_density_update + + CUSTOMREAL* get_Ks_descent_dir() {return get_array_for_vis(Ks_descent_dir_loc, false);}; // Ks_descent_dir + CUSTOMREAL* get_Kxi_descent_dir(){return get_array_for_vis(Kxi_descent_dir_loc,false);}; // Kxi_descent_dir + CUSTOMREAL* get_Keta_descent_dir(){return get_array_for_vis(Keta_descent_dir_loc,false);}; // Keta_descent_dir + + // get physical parameters + CUSTOMREAL get_r_min() {return r_min;}; + CUSTOMREAL get_r_max() {return r_max;}; + CUSTOMREAL get_lat_min() {return lat_min;}; + CUSTOMREAL get_lat_max() {return lat_max;}; + CUSTOMREAL get_lon_min() {return lon_min;}; + CUSTOMREAL get_lon_max() {return lon_max;}; + CUSTOMREAL get_delta_lon() {return dlon;}; + CUSTOMREAL get_delta_lat() {return dlat;}; + CUSTOMREAL get_delta_r() {return dr;}; + CUSTOMREAL get_r_min_loc_excl_gl() {return r_loc_1d[k_start_loc];}; + CUSTOMREAL get_r_max_loc_excl_gl() {return r_loc_1d[k_end_loc];}; + CUSTOMREAL get_lat_min_loc_excl_gl() {return t_loc_1d[j_start_loc];}; + CUSTOMREAL get_lat_max_loc_excl_gl() {return t_loc_1d[j_end_loc];}; + CUSTOMREAL get_lon_min_loc_excl_gl() {return p_loc_1d[i_start_loc];}; + CUSTOMREAL get_lon_max_loc_excl_gl() {return p_loc_1d[i_end_loc];}; + CUSTOMREAL get_r_min_loc() {return r_loc_1d[0];}; + CUSTOMREAL get_r_max_loc() {return r_loc_1d[loc_K-1];}; + CUSTOMREAL get_lat_min_loc() {return t_loc_1d[0];}; + CUSTOMREAL get_lat_max_loc() {return t_loc_1d[loc_J-1];}; + CUSTOMREAL get_lon_min_loc() {return p_loc_1d[0];}; + CUSTOMREAL get_lon_max_loc() {return p_loc_1d[loc_I-1];}; + CUSTOMREAL get_r_by_index(int i) {return r_loc_1d[i];}; + CUSTOMREAL get_lat_by_index(int j) {return t_loc_1d[j];}; + CUSTOMREAL get_lon_by_index(int i) {return p_loc_1d[i];}; + + int get_offset_i() {return offset_i-i_start_loc;}; // return offset index (global index of the first node) + int get_offset_j() {return offset_j-j_start_loc;}; + int get_offset_k() {return offset_k-k_start_loc;}; + int get_offset_i_excl_gl() {return offset_i;}; // return offset index + int get_offset_j_excl_gl() {return offset_j;}; + int get_offset_k_excl_gl() {return offset_k;}; + + // return index of the first node excluding ghost layer + int get_k_start_loc() {return k_start_loc;}; + int get_k_end_loc() {return k_end_loc;}; + int get_j_start_loc() {return j_start_loc;}; + int get_j_end_loc() {return j_end_loc;}; + int get_i_start_loc() {return i_start_loc;}; + int get_i_end_loc() {return i_end_loc;}; + + // copy tau to tau old + void tau2tau_old(); + // copy T to tau old + void T2tau_old(); + // copy tau to Tadj + void update_Tadj(); + // copy tau to Tadj + void update_Tadj_density(); + // back up fun xi eta + void back_up_fun_xi_eta_bcf(); + // restore fun xi eta + void restore_fun_xi_eta_bcf(); + + // write out inversion grid file + void write_inversion_grid_file(); + +private: + + // + // member variables + // + // i: longitude, phi, + // j: latitude, theta, + // k: radius, r + + // starting node id for each direction expect the boundary + int i_start_loc=0, j_start_loc=0, k_start_loc=0; + // end node id for each direction expect the boundary + int i_end_loc=0, j_end_loc=0, k_end_loc=0; + + // neighbors domain_id (-1 if no neighbor) + // order of directions: -i,+i,-j,+j,-k,+k + std::vector neighbors_id{-1,-1,-1,-1,-1,-1}; + // neighbors domain_id line and point contact + // ij plane nn, np, pn, pp + std::vector neighbors_id_ij{-1,-1,-1,-1}; + // jk plane nn, np, pn, pp + std::vector neighbors_id_jk{-1,-1,-1,-1}; + // ik plane nn, np, pn, pp + std::vector neighbors_id_ik{-1,-1,-1,-1}; + // ijk plane nnn, nnp, npn, npp, pnn, pnp, ppn, ppp + std::vector neighbors_id_ijk{-1,-1,-1,-1,-1,-1,-1,-1}; + + // layer id of this domain + int domain_i, domain_j, domain_k; + + // number of points on each boundary surface + int n_grid_bound_i, n_grid_bound_j, n_grid_bound_k; + + // mpi parameters + int offset_nnodes=0, offset_nelms=0; + int offset_i=0, offset_j=0, offset_k=0; // offset of this domain in the global grid + + // number of nodes and elements on each subdomain + int loc_nnodes, loc_nelms; + int *nnodes, *nelms; + + // arrays for visualization + //int loc_I_vis, loc_J_vis, loc_K_vis; + int i_start_vis, j_start_vis, k_start_vis; + int i_end_vis, j_end_vis, k_end_vis; + int loc_nnodes_vis, loc_nelms_vis; + int *nnodes_vis, *nelms_vis; + int offset_nnodes_vis=0, offset_nelms_vis=0; + +public: + // 3d arrays + CUSTOMREAL *xi_loc; // local xi + CUSTOMREAL *eta_loc; // local eta + CUSTOMREAL *zeta_loc; // local zeta + CUSTOMREAL *fac_a_loc; // factor a + CUSTOMREAL *fac_b_loc; // factor b + CUSTOMREAL *fac_c_loc; // factor c + CUSTOMREAL *fac_f_loc; // factor f + CUSTOMREAL *fun_loc; + CUSTOMREAL *T_loc; + CUSTOMREAL *T0v_loc, *T0r_loc, *T0p_loc, *T0t_loc; + CUSTOMREAL *tau_loc; + CUSTOMREAL *tau_old_loc; + bool *is_changed; + // for inversion backup + CUSTOMREAL *fun_loc_back; + CUSTOMREAL *xi_loc_back; + CUSTOMREAL *eta_loc_back; + CUSTOMREAL *fac_b_loc_back; + CUSTOMREAL *fac_c_loc_back; + CUSTOMREAL *fac_f_loc_back; + // for lbfgs + CUSTOMREAL *Ks_grad_store_loc, *Keta_grad_store_loc, *Kxi_grad_store_loc; + CUSTOMREAL *Ks_model_store_loc, *Keta_model_store_loc, *Kxi_model_store_loc; + CUSTOMREAL *Ks_descent_dir_loc, *Keta_descent_dir_loc, *Kxi_descent_dir_loc; + CUSTOMREAL *fun_regularization_penalty_loc, *eta_regularization_penalty_loc, *xi_regularization_penalty_loc; + CUSTOMREAL *fun_gradient_regularization_penalty_loc, *eta_gradient_regularization_penalty_loc, *xi_gradient_regularization_penalty_loc; + CUSTOMREAL *fun_prior_loc, *eta_prior_loc, *xi_prior_loc; // *zeta_prior_loc; TODO + // tmp array for file IO + CUSTOMREAL *vis_data; + +private: + // windows for shm arrays + MPI_Win win_fac_a_loc, win_fac_b_loc, win_fac_c_loc, win_fac_f_loc; + MPI_Win win_T0r_loc, win_T0p_loc, win_T0t_loc, win_T0v_loc; + MPI_Win win_tau_loc, win_fun_loc; + MPI_Win win_is_changed; + MPI_Win win_T_loc, win_tau_old_loc; + MPI_Win win_xi_loc, win_eta_loc, win_zeta_loc; + MPI_Win win_r_loc_1d, win_t_loc_1d, win_p_loc_1d; + + CUSTOMREAL *x_loc_3d; // local (lon) x (global position) + CUSTOMREAL *y_loc_3d; // local (lat) y (global position) + CUSTOMREAL *z_loc_3d; // local (r ) z (global position) + CUSTOMREAL *p_loc_3d; // local lon (x) (global position) + CUSTOMREAL *t_loc_3d; // local lat (y) (global position) + CUSTOMREAL *r_loc_3d; // local r (z) (global position) + int *elms_conn; // connectivity array + int *my_proc_dump; // dump process id for each node DEBUG +public: + // 1d arrays for coordinates, storing only subdomain's local coordinates + CUSTOMREAL *r_loc_1d; // radius z in kilo meter + CUSTOMREAL *t_loc_1d; // theta lat y in radian + CUSTOMREAL *p_loc_1d; // phi lon x in radian +private: + // arrays for inversion + // TODO: check if those arrays can use shm + bool inverse_flag = false; + //int n_inv_grids; // in config.h + //int n_inv_I_loc, n_inv_J_loc, n_inv_K_loc; // in config.h +public: + CUSTOMREAL *Ks_loc; + CUSTOMREAL *Kxi_loc; + CUSTOMREAL *Keta_loc; + CUSTOMREAL *Ks_density_loc; + CUSTOMREAL *Kxi_density_loc; + CUSTOMREAL *Keta_density_loc; + CUSTOMREAL *Tadj_loc; // timetable for adjoint source + CUSTOMREAL *Tadj_density_loc; // timetable for density of adjoint source + CUSTOMREAL *Ks_inv_loc; + CUSTOMREAL *Kxi_inv_loc; + CUSTOMREAL *Keta_inv_loc; + CUSTOMREAL *Ks_density_inv_loc; + CUSTOMREAL *Kxi_density_inv_loc; + CUSTOMREAL *Keta_density_inv_loc; + // model update para + CUSTOMREAL *Ks_update_loc; + CUSTOMREAL *Kxi_update_loc; + CUSTOMREAL *Keta_update_loc; + CUSTOMREAL *Ks_density_update_loc; + CUSTOMREAL *Kxi_density_update_loc; + CUSTOMREAL *Keta_density_update_loc; + // model update para of the previous step + CUSTOMREAL *Ks_update_loc_previous; + CUSTOMREAL *Kxi_update_loc_previous; + CUSTOMREAL *Keta_update_loc_previous; +private: + MPI_Win win_Tadj_loc; + MPI_Win win_Tadj_density_loc; + // boundary layer for mpi communication + // storing not the value but the pointers for the elements of arrays + // to send + CUSTOMREAL *bin_s; // boundary i axis negative + CUSTOMREAL *bip_s; // boundary i axis positive + CUSTOMREAL *bjn_s; // boundary j axis negative + CUSTOMREAL *bjp_s; // boundary j axis positive + CUSTOMREAL *bkn_s; // boundary k axis negative + CUSTOMREAL *bkp_s; // boundary k axis positive + // to receive + CUSTOMREAL *bin_r; // boundary i axis negative + CUSTOMREAL *bip_r; // boundary i axis positive + CUSTOMREAL *bjn_r; // boundary j axis negative + CUSTOMREAL *bjp_r; // boundary j axis positive + CUSTOMREAL *bkn_r; // boundary k axis negative + CUSTOMREAL *bkp_r; // boundary k axis positive + + // kosumi boundaries (touching on lines and points) + CUSTOMREAL *bij_pp_s, *bij_pp_r; + CUSTOMREAL *bij_pn_s, *bij_pn_r; + CUSTOMREAL *bij_np_s, *bij_np_r; + CUSTOMREAL *bij_nn_s, *bij_nn_r; + CUSTOMREAL *bjk_pp_s, *bjk_pp_r; + CUSTOMREAL *bjk_pn_s, *bjk_pn_r; + CUSTOMREAL *bjk_np_s, *bjk_np_r; + CUSTOMREAL *bjk_nn_s, *bjk_nn_r; + CUSTOMREAL *bik_pp_s, *bik_pp_r; + CUSTOMREAL *bik_pn_s, *bik_pn_r; + CUSTOMREAL *bik_np_s, *bik_np_r; + CUSTOMREAL *bik_nn_s, *bik_nn_r; + CUSTOMREAL *bijk_ppp_s,*bijk_ppp_r; + CUSTOMREAL *bijk_ppn_s,*bijk_ppn_r; + CUSTOMREAL *bijk_pnn_s,*bijk_pnn_r; + CUSTOMREAL *bijk_npp_s,*bijk_npp_r; + CUSTOMREAL *bijk_npn_s,*bijk_npn_r; + CUSTOMREAL *bijk_nnp_s,*bijk_nnp_r; + CUSTOMREAL *bijk_nnn_s,*bijk_nnn_r; + CUSTOMREAL *bijk_pnp_s,*bijk_pnp_r; + + // store MPI_Request for sending and receiving + MPI_Request *mpi_send_reqs; + MPI_Request *mpi_recv_reqs; + MPI_Request *mpi_send_reqs_kosumi; + MPI_Request *mpi_recv_reqs_kosumi; + // + // domain definition + // + CUSTOMREAL r_min; // minimum radius of global domain + CUSTOMREAL r_max; // maximum radius of global domain + CUSTOMREAL lat_min; // minimum latitude of global domain + CUSTOMREAL lat_max; // maximum latitude of global domain + CUSTOMREAL lon_min; // minimum longitude of global domain + CUSTOMREAL lon_max; // maximum longitude of global domain +public: + CUSTOMREAL dr ; + CUSTOMREAL dlat,dt; + CUSTOMREAL dlon,dp; +private: + + // + // members for test + // + CUSTOMREAL *u_loc; // true solution # TODO: erase for no testing + //CUSTOMREAL *velo_loc; // velocity field, # TODO: use this for storing an intial model + // anisotropic factors + CUSTOMREAL a0, b0, c0, f0, fun0; + + CUSTOMREAL source_width; + // + // member functions + // + void init_decomposition(InputParams&); // initialize domain decomposition + void memory_allocation(); // allocate memory for arrays + void memory_deallocation(); // deallocate memory from arrays + void shm_memory_allocation(); // allocate memory for shared memory + void shm_memory_deallocation(); // deallocate memory from shared memory + + CUSTOMREAL *get_array_for_vis(CUSTOMREAL *arr, bool); // get array for visualization +public: + void get_array_for_3d_output(const CUSTOMREAL *arr_in, CUSTOMREAL* arr_out, bool inverse_field); // get array for 3d output + void set_array_from_vis(CUSTOMREAL *arr); // set vis array to local array + + // finalize the Time table + void calc_T_plus_tau(); +private: + // check difference between true solution and computed solution + void calc_residual(); + + // + // utilities + // +public: + bool i_first(){ return neighbors_id[0] == -1;} + bool j_first(){ return neighbors_id[2] == -1;} + bool k_first(){ return neighbors_id[4] == -1;} + bool i_last(){ return neighbors_id[1] == -1;} + bool j_last(){ return neighbors_id[3] == -1;} + bool k_last(){ return neighbors_id[5] == -1;} +private: + // number of the layers for ghost nodes + const int n_ghost_layers = 1; + // vtk format cell type + const int cell_type = 9; + + +}; + +#endif // GRID_H \ No newline at end of file diff --git a/include/input_params.h b/include/input_params.h new file mode 100644 index 0000000..56cd105 --- /dev/null +++ b/include/input_params.h @@ -0,0 +1,574 @@ +#ifndef INPUT_PARAMS_H +#define INPUT_PARAMS_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "config.h" +#include "yaml-cpp/yaml.h" +#include "utils.h" +#include "mpi_funcs.h" +#include "timer.h" +#include "src_rec.h" + + +// InputParams class for reading/storing and outputing input parameters and src_rec information +class InputParams { + +public: + InputParams(std::string&); + ~InputParams(); + + // write parameters to output file + void write_params_to_file(); + + // + // getter/setter + // + + // + // bondary information + // + CUSTOMREAL get_min_dep(){return min_dep;}; + CUSTOMREAL get_max_dep(){return max_dep;}; + CUSTOMREAL get_min_lat(){return min_lat*DEG2RAD;}; + CUSTOMREAL get_max_lat(){return max_lat*DEG2RAD;}; + CUSTOMREAL get_min_lon(){return min_lon*DEG2RAD;}; + CUSTOMREAL get_max_lon(){return max_lon*DEG2RAD;}; + + // + // source receiver data + // + + // source receiver information for processes which stores source receiver information + std::string get_src_rec_file() {return src_rec_file;}; + bool get_src_rec_file_exist(){return src_rec_file_exist;}; + SrcRecInfo& get_src_point(const std::string&); // return SrcRec object + SrcRecInfo& get_rec_point(const std::string&); // return receivers for the current source + + // source receiver information with broadcast to all subdom_main processes + SrcRecInfo get_src_point_bcast(const std::string&); // return SrcRec object + SrcRecInfo get_rec_point_bcast(const std::string&); // return receivers for the current source + CUSTOMREAL get_src_radius( const std::string&); + CUSTOMREAL get_src_lat( const std::string&); + CUSTOMREAL get_src_lon( const std::string&); + SrcRecInfo get_src_point_bcast_2d(const std::string&); // return SrcRec object + CUSTOMREAL get_src_radius_2d(const std::string&); + CUSTOMREAL get_src_lat_2d( const std::string&); + CUSTOMREAL get_src_lon_2d( const std::string&); + std::string get_src_name(const int&); // return source name from in-sim_group id + std::string get_rec_name(const int&); // return receiver name from in-sim_group id + std::string get_src_name_comm(const int&); // return source name in common receiver list + int get_src_id(const std::string&); // return src global id from src name + bool get_if_src_teleseismic(const std::string&); // return true if the source is teleseismic + + // + // others + // + CUSTOMREAL get_conv_tol() {return conv_tol;}; + void set_conv_tol(CUSTOMREAL conv_tol_){conv_tol = conv_tol_;}; + CUSTOMREAL get_max_iter() {return max_iter;}; + + int get_stencil_order() {return stencil_order;}; + void set_stencil_order(int stencil_order_){stencil_order = stencil_order_;}; + int get_stencil_type() {return stencil_type;}; + int get_sweep_type() {return sweep_type;}; + + std::string get_init_model_path(){return init_model_path;}; + std::string get_model_1d_name() {return model_1d_name;}; + + int get_run_mode() {return run_mode;}; + + // invgrid for vel + int get_n_inversion_grid(){return n_inversion_grid;}; + + int get_n_inv_r() {return n_inv_r;}; + int get_n_inv_t() {return n_inv_t;}; + int get_n_inv_p() {return n_inv_p;}; + int get_n_inv_r_ani(){return n_inv_r_ani;}; + int get_n_inv_t_ani(){return n_inv_t_ani;}; + int get_n_inv_p_ani(){return n_inv_p_ani;}; + CUSTOMREAL get_min_dep_inv(){return min_dep_inv;}; + CUSTOMREAL get_max_dep_inv(){return max_dep_inv;}; + CUSTOMREAL get_min_lat_inv(){return min_lat_inv*DEG2RAD;}; + CUSTOMREAL get_max_lat_inv(){return max_lat_inv*DEG2RAD;}; + CUSTOMREAL get_min_lon_inv(){return min_lon_inv*DEG2RAD;}; + CUSTOMREAL get_max_lon_inv(){return max_lon_inv*DEG2RAD;}; + CUSTOMREAL get_min_dep_inv_ani(){return min_dep_inv_ani;}; + CUSTOMREAL get_max_dep_inv_ani(){return max_dep_inv_ani;}; + CUSTOMREAL get_min_lat_inv_ani(){return min_lat_inv_ani*DEG2RAD;}; + CUSTOMREAL get_max_lat_inv_ani(){return max_lat_inv_ani*DEG2RAD;}; + CUSTOMREAL get_min_lon_inv_ani(){return min_lon_inv_ani*DEG2RAD;}; + CUSTOMREAL get_max_lon_inv_ani(){return max_lon_inv_ani*DEG2RAD;}; + + int get_n_inv_r_flex(){return n_inv_r_flex;}; + int get_n_inv_t_flex(){return n_inv_t_flex;}; + int get_n_inv_p_flex(){return n_inv_p_flex;}; + CUSTOMREAL* get_dep_inv() {return dep_inv;}; + CUSTOMREAL* get_lat_inv() {return lat_inv;}; + CUSTOMREAL* get_lon_inv() {return lon_inv;}; + CUSTOMREAL* get_trapezoid() {return trapezoid;}; + + bool get_ignore_velocity_discontinuity(){return ignore_velocity_discontinuity;}; + + // invgrid for ani + bool get_invgrid_ani() {return invgrid_ani;}; + + int get_n_inv_r_flex_ani(){return n_inv_r_flex_ani;}; + int get_n_inv_t_flex_ani(){return n_inv_t_flex_ani;}; + int get_n_inv_p_flex_ani(){return n_inv_p_flex_ani;}; + CUSTOMREAL* get_dep_inv_ani() {return dep_inv_ani;}; + CUSTOMREAL* get_lat_inv_ani() {return lat_inv_ani;}; + CUSTOMREAL* get_lon_inv_ani() {return lon_inv_ani;}; + CUSTOMREAL* get_trapezoid_ani() {return trapezoid_ani;}; + + // + void check_inv_grid(); +private: + void check_increasing(CUSTOMREAL*, int, std::string); + void check_lower_bound(CUSTOMREAL*&, int&, CUSTOMREAL, std::string); + void check_upper_bound(CUSTOMREAL*&, int&, CUSTOMREAL, std::string); + +public: + // void check_dep_inv(); + // void check_lat_inv(); + // void check_lon_inv(); + // void check_dep_inv_ani(); + // void check_lat_inv_ani(); + // void check_lon_inv_ani(); + + // // adjust inv grid + // void insertAtFront(CUSTOMREAL*&, int&, CUSTOMREAL); + // void insertAtBack(CUSTOMREAL*&, int&, CUSTOMREAL); + + // bool get_invgrid_volume_rescale(){return invgrid_volume_rescale;} + + int get_max_iter_inv() {return max_iter_inv;}; + + int get_model_update_N_iter(){return model_update_N_iter;}; + int get_relocation_N_iter() {return relocation_N_iter;}; + int get_max_loop_mode0() {return max_loop_mode0;}; + int get_max_loop_mode1() {return max_loop_mode1;}; + + bool get_is_srcrec_swap() {return swap_src_rec;}; + + bool get_if_output_source_field() {return output_source_field;}; + bool get_if_output_kernel() {return output_kernel;}; + bool get_if_output_final_model() {return output_final_model;}; + bool get_if_output_middle_model() {return output_middle_model;}; + bool get_if_output_in_process() {return output_in_process;}; + bool get_if_output_in_process_data() {return output_in_process_data;}; + bool get_if_single_precision_output(){return single_precision_output;}; + int get_verbose_output_level() {return verbose_output_level;}; // #TODO: modify codes for verbose_output_level > 1 + + bool get_update_slowness() {return update_slowness;}; + bool get_update_azi_ani() {return update_azi_ani;}; + bool get_update_rad_ani() {return update_rad_ani;}; + CUSTOMREAL * get_depth_taper() {return depth_taper;}; + + bool get_have_tele_data() {return have_tele_data;}; + + bool get_use_abs() {return use_abs;}; + bool get_use_cs() {return use_cs;}; + bool get_use_cr() {return use_cr;}; + + bool get_use_abs_reloc() {return use_abs_reloc;}; + bool get_use_cs_reloc() {return use_cs_reloc;}; + bool get_use_cr_reloc() {return use_cr_reloc;}; + + CUSTOMREAL* get_residual_weight_abs() {return residual_weight_abs;}; + CUSTOMREAL* get_distance_weight_abs() {return distance_weight_abs;}; + CUSTOMREAL* get_residual_weight_cs() {return residual_weight_cs;}; + CUSTOMREAL* get_azimuthal_weight_cs() {return azimuthal_weight_cs;}; + CUSTOMREAL* get_residual_weight_cr() {return residual_weight_cr;}; + CUSTOMREAL* get_azimuthal_weight_cr() {return azimuthal_weight_cr;}; + + + CUSTOMREAL* get_residual_weight_abs_reloc() {return residual_weight_abs_reloc;}; + CUSTOMREAL* get_distance_weight_abs_reloc() {return distance_weight_abs_reloc;}; + CUSTOMREAL* get_residual_weight_cs_reloc() {return residual_weight_cs_reloc;}; + CUSTOMREAL* get_azimuthal_weight_cs_reloc() {return azimuthal_weight_cs_reloc;}; + CUSTOMREAL* get_residual_weight_cr_reloc() {return residual_weight_cr_reloc;}; + CUSTOMREAL* get_azimuthal_weight_cr_reloc() {return azimuthal_weight_cr_reloc;}; + + // get if the T field is written into the file + bool get_is_T_written_into_file(const std::string&); + + // prepare source list for this simulation group + void prepare_src_map(); + + // (relocation) modify (swapped source) receiver's location and time + void modify_swapped_source_location(); + + // write out src_rec_file + void write_src_rec_file(int,int); + + // write out station_correction_file + void write_station_correction_file(int); + + // station correction + void station_correction_update( CUSTOMREAL ); + + int n_src_this_sim_group = 0; // number of sources in this simultaneous group + int n_src_comm_rec_this_sim_group = 0; // number of sources with common receiver in this simultaneous group + int n_src_2d_this_sim_group = 0; // number of sources assigned for 2d solver in this simultaneous group + int n_rec_this_sim_group = 0; // number of receivers in this simultaneous group + + std::map src_map_all; // map of all sources (full information is only stored by the main process) + std::map src_map; // map of sources belonging to this simultaneous group + std::map src_map_comm_rec; // map of sources with common receiver + std::map src_map_2d; // map of sources assigned for 2d solver + std::map src_map_tele; // source list for teleseismic + + std::map rec_map_all; // map of all receivers (full information is only stored by the main process) + std::map rec_map; // map of receivers belonging to this simultaneous group + std::map rec_map_tele; // rec list for teleseismic + + // datainfo-vector maps + std::map< std::string, std::map>> data_map_all; // data list for all data (full information is only stored by the main process) + std::map< std::string, std::map>> data_map; // data list for this simultaneous group + std::map< std::string, std::map>> data_map_tele; // data list for teleseismic + + std::vector name_for_reloc; // name list of receivers (swarpped sources) for location + + // src id <-> src name relations + std::vector src_id2name; // name list of sources belonging to this simultaneous group + std::vector rec_id2name; // name list of receivers belongig to this simultaneous group + std::vector src_id2name_comm_rec; // name list of sources with common receiver + std::vector src_id2name_2d; // name list of sources assigned for 2d solver. + std::vector src_id2name_all; // name list of all sources (store the order of sources in src_rec file) + std::vector src_id2name_back; // back up of name list of all sources (this will not be swapped) + std::vector>> rec_id2name_back; // back up of the name list of all receivers for each source (this will not be swapped) + + // backups used when outputing the data + std::map src_map_back; + std::map rec_map_back; + std::map>> data_map_back; + + // the number of data + int N_abs_local_data = 0; + int N_cr_dif_local_data = 0; + int N_cs_dif_local_data = 0; + int N_teleseismic_data = 0; + int N_data = 0; + // the number of the types of data + int N_data_type = 0; + std::map data_type; // element: "abs", "cs_dif", "cr_dif", "tele" + + // initialize_adjoint_source + void initialize_adjoint_source(); + // set adjoint source && adjoint source density + void set_adjoint_source(std::string, CUSTOMREAL); + void set_adjoint_source_density(std::string, CUSTOMREAL); + + // gather traveltimes and calculate differences of synthetic data + void gather_traveltimes_and_calc_syn_diff(); + + // reduce necessary data in rec_map, which has differed elements in each sim group. + template + void allreduce_rec_map_var(T&); + + void allreduce_rec_map_vobj_src_reloc(); + void allreduce_rec_map_grad_src(); + +private: + // boundary information + CUSTOMREAL min_dep; // minimum depth in km + CUSTOMREAL max_dep; // maximum depth in km + CUSTOMREAL min_lat; // minimum latitude in degree + CUSTOMREAL max_lat; // maximum latitude in degree + CUSTOMREAL min_lon; // minimum longitude in degree + CUSTOMREAL max_lon; // maximum longitude in degree + + // source information + CUSTOMREAL src_dep; // source depth in km + CUSTOMREAL src_lat; // source latitude in degrees + CUSTOMREAL src_lon; // source longitude in degrees + std::string src_rec_file; // source receiver file + std::string src_rec_file_out; // source receiver file to be output + std::string sta_correction_file; // station correction file to be input + std::string station_correction_file_out; // station correction file to be output + bool src_rec_file_exist = false; // source receiver file exist + bool sta_correction_file_exist = false; // station correction file exist + bool swap_src_rec = false; // whether the src/rec are swapped or not + + // model input files + std::string init_model_path; // model file path init + std::string model_1d_name; // name of 1d model for teleseismic tomography + + // inversion + int run_mode=0; // do inversion or not (0: no, 1: yes) + int n_inversion_grid=1; // number of inversion grid + + // inversion grid setting + static const int n_trapezoid = 3; + CUSTOMREAL trapezoid[n_trapezoid] = {1.0, 0.0, 50.0}; + CUSTOMREAL trapezoid_ani[n_trapezoid] = {1.0, 0.0, 50.0}; + + + // uniform or flexible inversion grid (0: uniform, 1: flexible, 2: trapezoid) + // int type_invgrid_dep=0; + // int type_invgrid_lat=0; + // int type_invgrid_lon=0; + // uniform or flexible anisotropic inversion grid (0: uniform, 1: flexible, 2: trapezoid) + // int type_invgrid_dep_ani=0; + // int type_invgrid_lat_ani=0; + // int type_invgrid_lon_ani=0; + + // + // variables for type = 0: uniform inversion grid + // + + bool uniform_inv_grid_dep = false; // automatically generate inversion grid for dep or not + bool uniform_inv_grid_lat = false; // automatically generate inversion grid for lat or not + bool uniform_inv_grid_lon = false; // automatically generate inversion grid for lon or not + // number of uniform inversion grid nodes in r, t, p direction + int n_inv_r=0; + int n_inv_t=0; + int n_inv_p=0; + // number of uniform anisotropic inversion grid nodes in r, t, p direction + int n_inv_r_ani=0; + int n_inv_t_ani=0; + int n_inv_p_ani=0; + + // type = 0: uniform inversion grid + // inversion grid + CUSTOMREAL min_dep_inv=-99999; // minimum depth in km + CUSTOMREAL max_dep_inv=-99999; // maximum depth in km + CUSTOMREAL min_lat_inv=-99999; // minimum latitude + CUSTOMREAL max_lat_inv=-99999; // maximum latitude + CUSTOMREAL min_lon_inv=-99999; // minimum longitude + CUSTOMREAL max_lon_inv=-99999; // maximum longitude + + // inversion grid for anisotropic parameters + CUSTOMREAL min_dep_inv_ani=-99999; // minimum depth in km + CUSTOMREAL max_dep_inv_ani=-99999; // maximum depth in km + CUSTOMREAL min_lat_inv_ani=-99999; // minimum latitude + CUSTOMREAL max_lat_inv_ani=-99999; // maximum latitude + CUSTOMREAL min_lon_inv_ani=-99999; // minimum longitude + CUSTOMREAL max_lon_inv_ani=-99999; // maximum longitude + void setup_uniform_inv_grid(); + + // + // variables fo type = 1: flexible inversion grid + // + + CUSTOMREAL *dep_inv = nullptr; // array for storing inversion grid points in depth + CUSTOMREAL *lat_inv = nullptr; // array for storing inversion grid points in latitude + CUSTOMREAL *lon_inv = nullptr; // array for storing inversion grid points in longitude + CUSTOMREAL *dep_inv_ani = nullptr; // array for storing inversion grid points in depth for anisotropy + CUSTOMREAL *lat_inv_ani = nullptr; // array for storing inversion grid points in latitude for anisotropy + CUSTOMREAL *lon_inv_ani = nullptr; // array for storing inversion grid points in longitude for anisotropy + + // number of flexibly designed inversion grid in r, t, p direction + int n_inv_r_flex=0; + int n_inv_t_flex=0; + int n_inv_p_flex=0; + // number of flexibly designed inversion grid in r, t, p direction + int n_inv_r_flex_ani=0; + int n_inv_t_flex_ani=0; + int n_inv_p_flex_ani=0; + + // if true, use defined inversion grid for anisotropy. Otherwise, use the same inversion grid of velocity for anisotropy + bool invgrid_ani = false; + + // inversion grid volume rescale (kernel -> kernel / volume of inversion grid mesh) + // bool invgrid_volume_rescale = false; + + // date usage setting and weights + bool use_abs = false; // use absolute travel time or not + bool use_cs = false; // use common source double difference or not + bool use_cr = false; // use common receiver double difference or not + static const int n_weight = 4; + CUSTOMREAL residual_weight_abs[n_weight] = { 1.0, 3.0, 1.0, 1.0}; + CUSTOMREAL residual_weight_cs[n_weight] = { 1.0, 3.0, 1.0, 1.0}; + CUSTOMREAL residual_weight_cr[n_weight] = { 1.0, 3.0, 1.0, 1.0}; + CUSTOMREAL distance_weight_abs[n_weight] = { 100.0, 200.0, 1.0, 1.0}; + CUSTOMREAL azimuthal_weight_cs[n_weight] = { 15.0, 30.0, 1.0, 1.0}; + CUSTOMREAL azimuthal_weight_cr[n_weight] = { 15.0, 30.0, 1.0, 1.0}; + + // for relocation + bool use_abs_reloc = false; // use absolute travel time or not + bool use_cs_reloc = false; // use common source double difference or not + bool use_cr_reloc = false; // use common source double difference or not + CUSTOMREAL residual_weight_abs_reloc[n_weight] = { 1.0, 3.0, 1.0, 1.0}; + CUSTOMREAL distance_weight_abs_reloc[n_weight] = { 1.0, 3.0, 1.0, 1.0}; + CUSTOMREAL residual_weight_cs_reloc[n_weight] = { 1.0, 3.0, 1.0, 1.0}; + CUSTOMREAL azimuthal_weight_cs_reloc[n_weight] = { 100.0, 200.0, 1.0, 1.0}; + CUSTOMREAL residual_weight_cr_reloc[n_weight] = { 15.0, 30.0, 1.0, 1.0}; + CUSTOMREAL azimuthal_weight_cr_reloc[n_weight] = { 15.0, 30.0, 1.0, 1.0}; + + // convergence setting + CUSTOMREAL conv_tol = 1e-05; // convergence tolerance + int max_iter = 500; // maximum number of iterations + int max_iter_inv=1; // maximum number of iterations for inversion + + // calculation method + int stencil_order = 1; // stencil order + int stencil_type = 1; // stencil type (0: non upwind; 1: upwind) + int sweep_type = 0; // sweep type (0: legacy, 1: cuthil-mckee with shm parallelization) + + // gather all arrival times to a main process + void gather_all_arrival_times_to_main(); + // gather rec info to main process + void gather_rec_info_to_main(); + + // generate a map of sources which include common receiver double difference data + void generate_src_map_with_common_receiver(std::map>>&, + std::map&, + std::vector&); + + bool i_first=false, i_last=false, \ + j_first=false, j_last=false, \ + k_first=false; // store info if this subdomain has outer boundary + + // check contradictions in input parameters + void check_contradictions(); + + // output setting + bool output_source_field = false; // output out_data_sim_X.h or not. + bool output_kernel = false; // output kernel or not. + bool output_final_model = true; // output merged final model or not. + bool output_middle_model = false; // output merged model at each inv iteration or not. + bool output_in_process = true; // True: output at each inv iteration, otherwise, only output step 0, Niter-1, Niter. Default: true. File: "out_data_sim_group_0". Keys: "Kdensity_update_inv_XXXX", "vel_inv_0000", "xi_inv_0000", "eta_inv_0000" + bool output_in_process_data = true; // output src_rec_file at each inv iteration or not. + int verbose_output_level = 0; // output verbose information or not. + + // inversion setting + bool update_slowness = true; // update slowness (velocity) or not. + bool update_azi_ani = false; // update azimuthal anisotropy (xi, eta) or not. + bool update_rad_ani = false; // update radial anisotropy (in future) or not. + + // have have_tele_data or not? + bool have_tele_data = false; // default is false. Error will occur if teleseismic data is include but false. + + // ignore velocity discontinuity + bool ignore_velocity_discontinuity = false; // default is false. Error will occur if model velocity has discontinuity ( v[i+1] > v[i] * 1.2 or v[i+1] < v[i] * 0.8). + + CUSTOMREAL depth_taper[2] = {-9999999, -9999998}; // kernel weight: 0: -inf ~ taper[0]; 0 ~ 1 : taper[0] ~ taper[1]; 1 : taper[1] ~ inf + bool use_sta_correction = false; // apply station correction or not. + + // single precision (float) output mode + bool single_precision_output = false; + + +}; + + +// +// utils +// +inline DataInfo& get_data_src_rec(std::vector& v){ + // return the first element in the vector with is_rec_pair = true + for (auto it = v.begin(); it != v.end(); it++){ + if (it->is_src_rec) + return *it; + } + + // error if no rec pair is found + std::cerr << "Error: no src/rec is found in get_data_src_rec" << std::endl; + exit(1); + + // return the first element in the vector as a dummy + return v[0]; +} + + +inline DataInfo& get_data_rec_pair(std::map>>& v, + const std::string& name_src, + const std::string& name_rec1, + const std::string& name_rec2){ + // return the first element in the vector with is_rec_pair = true + auto& map1 = v[name_src][name_rec1]; + auto& map2 = v[name_src][name_rec2]; + + for (auto it = map1.begin(); it != map1.end(); it++){ + if (it->is_rec_pair && it->name_rec_pair[0] == name_rec1 && it->name_rec_pair[1] == name_rec2) + return *it; + } + + for (auto it = map2.begin(); it != map2.end(); it++){ + if (it->is_rec_pair && it->name_rec_pair[0] == name_rec1 && it->name_rec_pair[1] == name_rec2) + return *it; + } + + // error if no rec pair is found + std::cerr << "Error: no rec pair is found in get_data_rec_pair" << std::endl; + exit(1); + + // return the first element in the vector as a dummy + return v[name_src][name_rec1][0]; +} + + +inline DataInfo& get_data_src_pair(std::map>>& v, + const std::string& name_src1, + const std::string& name_src2, + const std::string& name_rec){ + + // return the first element in the vector with is_rec_pair = true + auto& map1 = v[name_src1][name_rec]; + auto& map2 = v[name_src2][name_rec]; + + for (auto it = map1.begin(); it != map1.end(); it++){ + if (it->is_src_pair && it->name_src_pair[0] == name_src1 && it->name_src_pair[1] == name_src2) + return *it; + } + + for (auto it = map2.begin(); it != map2.end(); it++){ + if (it->is_src_pair && it->name_src_pair[0] == name_src2 && it->name_src_pair[1] == name_src1) + return *it; + } + + // error if no src pair is found + std::cerr << "Error: no src pair is found in get_data_src_pair" << std::endl; + exit(1); + + // return the first element in the vector as a dummy + return v[name_src1][name_rec][0]; +} + + +inline void set_cr_dif_to_src_pair(std::map>>& v, + std::string& name_src1, + std::string& name_src2, + std::string& name_rec, + CUSTOMREAL& cr_dif){ + // return the first element in the vector with is_rec_pair = true + + std::vector& vdata = v[name_src1][name_rec]; + + for (auto it = vdata.begin(); it != vdata.end(); it++){ + if (it->is_src_pair + && ( (it->name_src_pair[0] == name_src1 && it->name_src_pair[1] == name_src2) + || (it->name_src_pair[0] == name_src2 && it->name_src_pair[1] == name_src1) )) { + it->cr_dif_travel_time = cr_dif; + } + } +} + + +inline bool get_if_any_src_pair(std::vector& v){ + // return the first element in the vector with is_rec_pair = true + for (auto it = v.begin(); it != v.end(); it++){ + if (it->is_src_pair) + return true; + } + + // or maybe this will be enough + //return v.size() > 1; + + // return false if no rec pair is found + return false; +} + + +#endif \ No newline at end of file diff --git a/include/inv_grid.h b/include/inv_grid.h new file mode 100644 index 0000000..ecb3389 --- /dev/null +++ b/include/inv_grid.h @@ -0,0 +1,75 @@ +#ifndef INV_GRID_H +#define INV_GRID_H + +#include + +#include "config.h" +#include "input_params.h" + + +// Base class for 1D inversion grid () +class InvGrid1dBase { +public: + InvGrid1dBase(){}; + virtual ~InvGrid1dBase(){ + delete[] arr; + }; + + // copy constructor + InvGrid1dBase(const InvGrid1dBase& other){ + n = other.n; + dinv = other.dinv; + dinv_l = other.dinv_l; + arr = new CUSTOMREAL[n]; + std::copy(other.arr, other.arr+n, arr); + } + + // assignment operator + InvGrid1dBase& operator=(const InvGrid1dBase& other){ + if (this != &other){ + n = other.n; + dinv = other.dinv; + dinv_l = other.dinv_l; + arr = new CUSTOMREAL[n]; + std::copy(other.arr, other.arr+n, arr); + } + return *this; + } + + CUSTOMREAL* arr = nullptr; // 1d or 2d array storing the grid coordinates + int n; // number of grid points + CUSTOMREAL dinv; // grid spacing + CUSTOMREAL dinv_l; // amount of shift for each inversion grid +}; + +// Derived class for 1D inversion grid +class InvGrid1d : public InvGrid1dBase { +public: + InvGrid1d(InputParams&, const int, const CUSTOMREAL*); // for r grid + InvGrid1d(InputParams&, const int, const CUSTOMREAL*, const CUSTOMREAL*, const int, const CUSTOMREAL*); // function overload for t and p grids + ~InvGrid1d() override {}; +}; + + +// Base class for 3D inversion grid +class InvGrid { +public: + InvGrid(InputParams&); + ~InvGrid(); + + void write_inversion_grid_to_file(); + + InvGrid1dBase r; + InvGrid1dBase t; + InvGrid1dBase p; + InvGrid1dBase r_ani; + InvGrid1dBase t_ani; + InvGrid1dBase p_ani; + +private: + void get_inv_grid_params(InputParams&); +}; + + + +#endif // INV_GRID_H diff --git a/include/io.fwd.h b/include/io.fwd.h new file mode 100644 index 0000000..57a9bf0 --- /dev/null +++ b/include/io.fwd.h @@ -0,0 +1,2 @@ +#pragma once +class IO_utils; \ No newline at end of file diff --git a/include/io.h b/include/io.h new file mode 100644 index 0000000..ef4c915 --- /dev/null +++ b/include/io.h @@ -0,0 +1,284 @@ +#ifndef IO_H +#define IO_H + +#include +#include +#if USE_HDF5 + #include "hdf5.h" +#endif +#include "tinyxml2.h" + +// to handle circular dependency +#pragma once +#include "grid.fwd.h" +//#include "source.fwd.h" +#include "io.fwd.h" + +#include "utils.h" +#include "mpi_funcs.h" +#include "grid.h" +#include "config.h" +#include "input_params.h" +#include "eikonal_solver_2d.h" + + +class IO_utils { + +public: + IO_utils(InputParams&); + ~IO_utils(); + + // initialize data output file + void init_data_output_file(); + // finalize data/grid outpiut file (xdmf) + void finalize_data_output_file(); + // change the output file name and xdmf objects + void change_xdmf_obj(int); + // output for updating xdmf file + void update_xdmf_file(); + + // change group name for source + void reset_source_info(const int&, const std::string&); + // change group name for model + void change_group_name_for_model(); + // prepare grid for each inversion iteration + void prepare_grid_inv_xdmf(int); + + // set id_sim + void set_id_src(const int& id_src_){id_sim_src = id_src_;}; + // set source name + void set_name_src(const std::string& name_src_){name_sim_src = name_src_;}; + + + // + // write functions + // + + // xdmf write out for grid data + void write_xdmf_file_grid(); + + // write grid data to output file + void write_grid(Grid&); + // general function for write out data in hdf5 + void write_data_h5(Grid&, std::string&, std::string&, CUSTOMREAL*, int, bool, bool for_tmp_db=false); + // general function for write out data in hdf5 with merging subdomains + void write_data_merged_h5(Grid&, std::string&, std::string&, std::string&, CUSTOMREAL*, bool, bool no_group=true); + // general function for write out data in ascii + void write_data_ascii(Grid&, std::string&, CUSTOMREAL*); + // general function for write out data in ascii with merging subdomains + void write_data_merged_ascii(Grid&, std::string&); + // write true solution + void write_true_solution(Grid&); + // write velocity model + void write_vel(Grid&, int); + // write T0v + void write_T0v(Grid&, int); + // write u + void write_u(Grid&); + // write tau + void write_tau(Grid&, int); + // write temporal tau fields + //void write_tmp_tau(Grid&, int); + // write result timetable T + void write_T(Grid&, int); + // write temporal timetable T in a separated file + void write_T_tmp(Grid&); + // write residual (resudual = true_solution - result) + void write_residual(Grid&); + // write adjoint field + void write_adjoint_field(Grid&, int); + // write fun_loc + void write_fun(Grid&, int); + // write xi + void write_xi(Grid&, int); + // write eta + void write_eta(Grid&, int); + // write a + void write_a(Grid&, int); + // write b + void write_b(Grid&, int); + // write c + void write_c(Grid&, int); + // write f + void write_f(Grid&, int); + // Ks + void write_Ks(Grid&, int); + // Kxi + void write_Kxi(Grid&, int); + // Keta + void write_Keta(Grid&, int); + // Ks_density + void write_Ks_density(Grid&, int); + // Kxi_density + void write_Kxi_density(Grid&, int); + // Keta_density + void write_Keta_density(Grid&, int); + // Ks_over_Kden + void write_Ks_over_Kden(Grid&, int); + // Kxi_over_Kden + void write_Kxi_over_Kden(Grid&, int); + // Keta_over_Kden + void write_Keta_over_Kden(Grid&, int); + // Ks_update + void write_Ks_update(Grid&, int); + // Kxi_update + void write_Kxi_update(Grid&, int); + // Keta_update + void write_Keta_update(Grid&, int); + // Ks_density_update + void write_Ks_density_update(Grid&, int); + // Kxi_density_update + void write_Kxi_density_update(Grid&, int); + // Keta_density_update + void write_Keta_density_update(Grid&, int); + // Ks_descent_dir_loc + void write_Ks_descent_dir(Grid&, int); + // Kxi_descent_dir_loc + void write_Kxi_descent_dir(Grid&, int); + // Keta_descent_dir_loc + void write_Keta_descent_dir(Grid&, int); + + // write all concerning parameters + std::vector get_grid_data(CUSTOMREAL * data); + // void write_concerning_parameters(Grid&, int, InputParams&); + + // 2d traveltime field for teleseismic source + void write_2d_travel_time_field(CUSTOMREAL*, CUSTOMREAL*, CUSTOMREAL*, int, int, CUSTOMREAL); + void h5_create_and_write_dataset_2d(std::string&, int, int*, int, CUSTOMREAL*); + void read_2d_travel_time_field(std::string&, CUSTOMREAL*, int, int); + + // 2d field for 1dinv + void write_1dinv_field(CUSTOMREAL*, CUSTOMREAL*, CUSTOMREAL*, int, int, std::string&); + + // merged model + void write_T_merged(Grid&, InputParams&, int); + void write_merged_model(Grid&, InputParams&, std::string); + bool node_of_this_subdomain(int*, const int&, const int&, const int&); + + // + // read functions + // + + // read model data + void read_model(std::string&, const char*, CUSTOMREAL*, int, int, int); + // read Travel time from file for earthquake relocation and common receiver double-difference + void read_T(Grid&); + // read Travel time from a temporal file for earthquake relocation and common receiver double-difference + void read_T_tmp(Grid&); + + void read_data_ascii(Grid&, std::string&); + + // + // delete functions + // + // Any deletion of data should be done on a created hdf5. Because the design of hdf5 is that + // it is not possible to delete data from an existing hdf5 file. The only way to do so is to + // create a new hdf5 file and copy the necessary data from the old one to the new one. + // Therefore, the deletion of data is not implemented in this class. + // Reference : https://stackoverflow.com/questions/1124994/removing-data-from-a-hdf5-file + +private: + // member variables + std::string h5_output_grid_fname = "out_data_grid.h5"; // output file name + std::string h5_output_fname = "out_data.h5"; // output file name + std::string h5_output_fname_tmp = "out_data_tmp.h5"; // output file name + std::string xdmf_output_fname = "out_data.xmf"; // output file name + std::string h5_group_name_grid = "Mesh"; // group name for grid data + std::string h5_group_name_event = "Event"; // group name for event data + std::string h5_group_name_data = "Data"; // group name for event data + + std::string h5_dset_name_node_coords_x = "node_coords_x"; // dataset name for node coordinates + std::string h5_dset_name_node_coords_y = "node_coords_y"; // dataset name for node coordinates + std::string h5_dset_name_node_coords_z = "node_coords_z"; // dataset name for node coordinates + std::string h5_dset_name_node_coords_p = "node_coords_p"; // dataset name for node coordinates + std::string h5_dset_name_node_coords_t = "node_coords_t"; // dataset name for node coordinates + std::string h5_dset_name_node_coords_r = "node_coords_r"; // dataset name for node coordinates + std::string h5_dset_name_elem_conn = "elem_conn"; // dataset name for element connectivity + std::string h5_dset_name_procid = "procid"; // dataset name for my_procs + + std::string h5_file_and_group = h5_output_grid_fname + ":/" + h5_group_name_grid; + std::string h5_whole_name_conn = h5_file_and_group + "/" + h5_dset_name_elem_conn; + std::string h5_whole_name_x = h5_file_and_group + "/" + h5_dset_name_node_coords_x; + std::string h5_whole_name_y = h5_file_and_group + "/" + h5_dset_name_node_coords_y; + std::string h5_whole_name_z = h5_file_and_group + "/" + h5_dset_name_node_coords_z; + std::string h5_whole_name_proc = h5_file_and_group + "/" + h5_dset_name_procid; + + // index of current simulation used for naming output files and datasets + int id_sim_src; + // name of current simulation used for naming output files and datasets + std::string name_sim_src; + + int nnodes_glob = 0; + int nelms_glob = 0; + + int array_rank_default = 2; // default array rank + + int custom_real_flag; // custom real type + + // custom data type for real + std::string type_name = "Float"; + std::string type_size = "4"; + + // helper for xdmf/xml file io + tinyxml2::XMLDocument* doc; + tinyxml2::XMLNode* xdmf, *domain, *grid; + tinyxml2::XMLNode* inversions, *inv_grid; + void init_xdmf_file(); + void write_xdmf_file(); + void finalize_xdmf_file(); + void insert_data_xdmf(std::string&, std::string&, std::string&); + +#ifdef USE_HDF5 + // h5 variables + hid_t file_id; + hid_t group_id; + hid_t space_id; + hid_t dset_id; + hid_t plist_id, plist_id_dset; + hid_t file_dspace_id, mem_dspace_id; + herr_t status; + hid_t plist_id_2d; + hid_t file_id_2d; + + // h5 low level utilities + void h5_create_file_by_group_main(std::string&); + void h5_open_file_by_group_main(std::string&); + void h5_open_file_collective(std::string&); + void h5_open_file_collective_input(std::string&); + void h5_close_file_by_group_main(); + void h5_close_file_collective(); + + void h5_create_group_by_group_main(std::string& ); + void h5_open_group_by_group_main(std::string& ); + void h5_open_group_collective(std::string& ); + void h5_close_group_by_group_main(); + void h5_close_group_collective(); + + void h5_create_dataset(std::string&, int, int*, int, bool no_group = false); + void h5_open_dataset(std::string&); + void h5_open_dataset_no_group(std::string&); + void h5_close_dataset(); + + template + void h5_write_array(std::string&, int, int*, T*, int offset_one, int offset_two=0, int offset_three=0, bool no_group=false); + + template + void h5_read_array(std::string&, int, int*, T*, int*, bool); + + template + void h5_read_array_simple(std::string&, T*); + + void read_data_h5(Grid&, CUSTOMREAL*, std::string, std::string); +#endif // HDF_HDF5 + + // utilities + std::string create_fname_ascii(std::string&); + std::string create_fname_ascii_model(std::string&); + + // flag for data type + const bool model_data = true; + const bool src_data = false; + +}; + +#endif // IO_H \ No newline at end of file diff --git a/include/iterator.h b/include/iterator.h new file mode 100644 index 0000000..3e522f6 --- /dev/null +++ b/include/iterator.h @@ -0,0 +1,161 @@ +#ifndef ITERATOR_H +#define ITERATOR_H + +#include +#include +#include +#include +#include "grid.h" +#include "input_params.h" +#include "utils.h" +#include "source.h" +#include "io.h" +#include "timer.h" +#include "eikonal_solver_2d.h" + +#ifdef USE_CUDA +#include "grid_wrapper.cuh" +#include "iterator_wrapper.cuh" +#endif + +//#ifdef USE_SIMD +#include "simd_conf.h" +//#endif + +class Iterator { +public: + Iterator(InputParams&, Grid&, Source&, IO_utils&, const std::string&, bool, bool, bool); + virtual ~Iterator(); + // regional source + void run_iteration_forward(InputParams&, Grid&, IO_utils&, bool&); // run forward iteration till convergence + void run_iteration_adjoint(InputParams&, Grid&, IO_utils&, int); // run adjoint iteration till convergence + + void initialize_arrays(InputParams&, IO_utils&, Grid&, Source&, const std::string&); // initialize factors etc. + +protected: + void assign_processes_for_levels(Grid&, InputParams&); // assign intra-node processes for each sweeping level + void set_sweep_direction(int); // set sweep direction + // regional source + virtual void do_sweep(int, Grid&, InputParams&){}; // do sweeping with ordinal method + void calculate_stencil_1st_order(Grid&, int&, int&, int&); // calculate stencil for 1st order + void calculate_stencil_3rd_order(Grid&, int&, int&, int&); // calculate stencil for 3rd order + void calculate_stencil_1st_order_upwind(Grid&, int&, int&, int&); // calculate stencil for 1st order in upwind form + void calculate_boundary_nodes(Grid&); // calculate boundary values + // teleseismic source + void calculate_stencil_1st_order_tele(Grid&, int&, int&, int&); // calculate stencil for 1st order + void calculate_stencil_3rd_order_tele(Grid&, int&, int&, int&); // calculate stencil for 3rd order + void calculate_stencil_1st_order_upwind_tele(Grid&, int&, int&, int&); // calculate stencil for 1st order in upwind form + void calculate_boundary_nodes_tele(Grid&, int&, int&, int&); // calculate boundary values for teleseismic source + + void calculate_boundary_nodes_adj(Grid&, int&, int&, int&); // calculate boundary values for adjoint source (all zeros) + + // Hamiltonian calculation + inline CUSTOMREAL calc_LF_Hamiltonian(Grid&, CUSTOMREAL& ,CUSTOMREAL& , \ + CUSTOMREAL& ,CUSTOMREAL& , \ + CUSTOMREAL& ,CUSTOMREAL&, \ + int&, int&, int& ); + inline CUSTOMREAL calc_LF_Hamiltonian_tele(Grid&, CUSTOMREAL& ,CUSTOMREAL& , \ + CUSTOMREAL& ,CUSTOMREAL& , \ + CUSTOMREAL& ,CUSTOMREAL&, \ + int&, int&, int& ); + + // methods for adjoint field calculation + void init_delta_and_Tadj(Grid&, InputParams&); // initialize delta and Tadj + void init_delta_and_Tadj_density(Grid&, InputParams&); // initialize delta and Tadj_density + void fix_boundary_Tadj(Grid&); // fix boundary values for Tadj + virtual void do_sweep_adj(int, Grid&, InputParams&){}; // do sweeping with ordinal method for adjoint field + void calculate_stencil_adj(Grid&, int&, int&, int&); // calculate stencil for 1st order for adjoint field + + // grid point information + int* _nr, *_nt, *_np; // number of grid points on the direction r, theta, phi + CUSTOMREAL* _dr, *_dt, *_dp; // grid spacing on the direction r, theta, phi + int nr, nt, np; // number of grid points on the direction r, theta, phi + CUSTOMREAL dr, dt, dp; // grid spacing on the direction r, theta, phi + int st_level; // start level for sweeping + int ed_level; // end level for sweeping + std::vector< std::vector > ijk_for_this_subproc; // ijk=I2V(i,j,k) for this process (level, ijk) + int max_n_nodes_plane; // maximum number of nodes on a plane + + +#if defined USE_SIMD || defined USE_CUDA + // stencil dumps + // first orders + CUSTOMREAL *dump_c__;// center of C + // all grid data expect tau pre-load strategy (iswap, ilevel, inodes) +#if USE_AVX512 || USE_AVX || USE_NEON || defined USE_CUDA + std::vector> vv_i__j__k__, vv_ip1j__k__, vv_im1j__k__, vv_i__jp1k__, vv_i__jm1k__, vv_i__j__kp1, vv_i__j__km1; + std::vector> vv_ip2j__k__, vv_im2j__k__, vv_i__jp2k__, vv_i__jm2k__, vv_i__j__kp2, vv_i__j__km2; +#elif USE_ARM_SVE + std::vector> vv_i__j__k__, vv_ip1j__k__, vv_im1j__k__, vv_i__jp1k__, vv_i__jm1k__, vv_i__j__kp1, vv_i__j__km1; + std::vector> vv_ip2j__k__, vv_im2j__k__, vv_i__jp2k__, vv_i__jm2k__, vv_i__j__kp2, vv_i__j__km2; +#endif + std::vector> vv_iip, vv_jjt, vv_kkr; + + std::vector> vv_fac_a, vv_fac_b, vv_fac_c, vv_fac_f, vv_T0v, vv_T0r, vv_T0t, vv_T0p, vv_fun; + std::vector>vv_change; + std::vector>vv_change_bl; + + template + void preload_indices(std::vector> &vi, std::vector> &, std::vector> &, int, int, int); + template + void preload_indices_1d(std::vector> &, int, int, int); + template + std::vector> preload_array(T* a); + std::vector> preload_array_bl(bool* a); + template + void free_preloaded_array(std::vector> &vvv){ + for (int iswap = 0; iswap < 8; iswap++){ + for (auto& vv : vvv.at(iswap)) free(vv); + } + } + // flag for deallocation + bool simd_allocated = false; + bool simd_allocated_3rd = false; + +#endif // USE_SIMD || USE_CUDA + +#ifdef USE_CUDA + Grid_on_device *gpu_grid; +#endif + + + const int nswp = 8; // number of sweeping directions + int r_dirc, t_dirc, p_dirc; // sweeping directions + CUSTOMREAL sigr, sigt, sigp; // + CUSTOMREAL coe; + CUSTOMREAL wp1, pp1, wp2, pp2; + CUSTOMREAL wt1, pt1, wt2, pt2; + CUSTOMREAL wr1, pr1, wr2, pr2; + CUSTOMREAL Htau, tpT; + + CUSTOMREAL ap1, bp1, ap2, bp2, ap, bp; + CUSTOMREAL at1, bt1, at2, bt2, at, bt; + CUSTOMREAL ar1, br1, ar2, br2, ar, br; + + CUSTOMREAL bc_f2, eqn_a, eqn_b, eqn_c, eqn_Delta; + CUSTOMREAL tmp_tau, tmp_T; + CUSTOMREAL T_r, T_t, T_p, charact_r, charact_t, charact_p; + bool is_causality; + int count_cand; + std::vector canditate = std::vector(60); + + + // iteration control + int iter_count = 0; + CUSTOMREAL ini_diff_L1 = HUGE_VAL, ini_diff_Linf = HUGE_VAL; + CUSTOMREAL ini_err_L1 = HUGE_VAL, ini_err_Linf = HUGE_VAL; + CUSTOMREAL cur_diff_L1 = HUGE_VAL, cur_diff_Linf = HUGE_VAL; + CUSTOMREAL cur_err_L1 = HUGE_VAL, cur_err_Linf = HUGE_VAL; + + // teleseismic flag + bool is_teleseismic = false; + + // second run for hybrid order method + bool is_second_run = false; + +}; + +// define derived classes for each iteration scheme + + +#endif // ITERATOR_H \ No newline at end of file diff --git a/include/iterator_legacy.h b/include/iterator_legacy.h new file mode 100644 index 0000000..be4c72d --- /dev/null +++ b/include/iterator_legacy.h @@ -0,0 +1,82 @@ +#ifndef ITERATOR_legacy_H +#define ITERATOR_legacy_H + +#include "iterator.h" + + +class Iterator_legacy : public Iterator { +public: + Iterator_legacy(InputParams&, Grid&, Source&, IO_utils&, const std::string&, bool, bool, bool); +protected: + void do_sweep_adj(int, Grid&, InputParams&) override ; // do sweeping for adjoint routine + virtual void do_sweep(int, Grid&, InputParams&) {}; // do sweeping +}; + + +class Iterator_legacy_tele : public Iterator { +public: + Iterator_legacy_tele(InputParams& , Grid&, Source&, IO_utils&, const std::string&, bool, bool, bool); +protected: + void do_sweep_adj(int, Grid&, InputParams&) override ; // do sweeping for adjoint routine + virtual void do_sweep(int, Grid&, InputParams&) {}; // do sweeping +}; + + +class Iterator_legacy_1st_order : public Iterator_legacy { + +public: + Iterator_legacy_1st_order(InputParams&, Grid&, Source&, IO_utils&, const std::string&, bool, bool, bool); +private: + void do_sweep(int, Grid&, InputParams&) override ; // do sweeping + +}; + +class Iterator_legacy_3rd_order : public Iterator_legacy { + +public: + Iterator_legacy_3rd_order(InputParams&, Grid&, Source&, IO_utils&, const std::string&, bool, bool, bool); + //void run_iteration_forward(InputParams&, Grid&, IO_utils&, bool&); +private: + void do_sweep(int, Grid&, InputParams&) override ; // do sweeping + +}; + +class Iterator_legacy_1st_order_upwind : public Iterator_legacy { + +public: + Iterator_legacy_1st_order_upwind(InputParams&, Grid&, Source&, IO_utils&, const std::string&, bool, bool, bool); +private: + void do_sweep(int, Grid&, InputParams&) override ; // do sweeping +}; + +class Iterator_legacy_1st_order_tele : public Iterator_legacy_tele { + +public: + Iterator_legacy_1st_order_tele(InputParams&, Grid&, Source&, IO_utils&, const std::string&, bool, bool, bool); + //void run_iteration_forward(InputParams&, Grid&, IO_utils&, bool&); +private: + void do_sweep(int, Grid&, InputParams&) override ; // do sweeping + +}; + +class Iterator_legacy_3rd_order_tele : public Iterator_legacy_tele { + +public: + Iterator_legacy_3rd_order_tele(InputParams&, Grid&, Source&, IO_utils&, const std::string&, bool, bool, bool); + //void run_iteration_forward(InputParams&, Grid&, IO_utils&, bool&); +private: + void do_sweep(int, Grid&, InputParams&) override ; // do sweeping + +}; + +class Iterator_legacy_1st_order_upwind_tele : public Iterator_legacy_tele { + +public: + Iterator_legacy_1st_order_upwind_tele(InputParams&, Grid&, Source&, IO_utils&, const std::string&, bool, bool, bool); + //void run_iteration_forward(InputParams&, Grid&, IO_utils&, bool&); +private: + void do_sweep(int, Grid&, InputParams&) override ; // do sweeping + +}; + +#endif // ITERATOR_LEGACY_H \ No newline at end of file diff --git a/include/iterator_level.h b/include/iterator_level.h new file mode 100644 index 0000000..da916e7 --- /dev/null +++ b/include/iterator_level.h @@ -0,0 +1,65 @@ +#ifndef ITERATOR_LEVEL_H +#define ITERATOR_LEVEL_H + +#include "iterator.h" + + +class Iterator_level : public Iterator { +public: + Iterator_level(InputParams&, Grid&, Source&, IO_utils&, const std::string&, bool, bool, bool); +protected: + void do_sweep_adj(int, Grid&, InputParams&) override ; // do sweeping for adjoint routine + virtual void do_sweep(int, Grid&, InputParams&) {}; // do sweeping +}; + +class Iterator_level_tele : public Iterator { +public: + Iterator_level_tele(InputParams& , Grid&, Source&, IO_utils&, const std::string&, bool, bool, bool); +protected: + void do_sweep_adj(int, Grid&, InputParams&) override ; // do sweeping for adjoint routine + virtual void do_sweep(int, Grid&, InputParams&) {}; // do sweeping +}; + +class Iterator_level_1st_order : public Iterator_level { +public: + Iterator_level_1st_order(InputParams&, Grid&, Source&, IO_utils&, const std::string&, bool, bool, bool); +private: + void do_sweep(int, Grid&, InputParams&) override ; // do sweeping +}; + +class Iterator_level_3rd_order : public Iterator_level { +public: + Iterator_level_3rd_order(InputParams&, Grid&, Source&, IO_utils&, const std::string&, bool, bool, bool); +private: + void do_sweep(int, Grid&, InputParams&) override ; // do sweeping +}; + +class Iterator_level_1st_order_upwind : public Iterator_level { +public: + Iterator_level_1st_order_upwind(InputParams&, Grid&, Source&, IO_utils&, const std::string&, bool, bool, bool); +private: + void do_sweep(int, Grid&, InputParams&) override ; // do sweeping +}; + +class Iterator_level_1st_order_tele : public Iterator_level_tele { +public: + Iterator_level_1st_order_tele(InputParams&, Grid&, Source&, IO_utils&, const std::string&, bool, bool, bool); +private: + void do_sweep(int, Grid&, InputParams&) override ; // do sweeping +}; + +class Iterator_level_3rd_order_tele : public Iterator_level_tele { +public: + Iterator_level_3rd_order_tele(InputParams&, Grid&, Source&, IO_utils&, const std::string&, bool, bool, bool); +private: + void do_sweep(int, Grid&, InputParams&) override ; // do sweeping +}; + +class Iterator_level_1st_order_upwind_tele : public Iterator_level_tele { +public: + Iterator_level_1st_order_upwind_tele(InputParams&, Grid&, Source&, IO_utils&, const std::string&, bool, bool, bool); +private: + void do_sweep(int, Grid&, InputParams&) override ; // do sweeping +}; + +#endif // ITERATOR_LEVEL_H \ No newline at end of file diff --git a/include/iterator_selector.h b/include/iterator_selector.h new file mode 100644 index 0000000..a6c0b09 --- /dev/null +++ b/include/iterator_selector.h @@ -0,0 +1,98 @@ +#ifndef ITERATOR_SELECTOR_H +#define ITERATOR_SELECTOR_H + +#include +#include "iterator.h" +#include "iterator_legacy.h" +#include "iterator_level.h" + + +void select_iterator(InputParams& IP, Grid& grid, Source& src, IO_utils& io, const std::string& src_name, \ + bool first_init, bool is_teleseismic, std::unique_ptr& It, bool is_second_run) { + // initialize iterator object + + if (!is_teleseismic){ + if (IP.get_sweep_type() == SWEEP_TYPE_LEGACY) { + if (IP.get_stencil_order() == 1){ + if (IP.get_stencil_type() == UPWIND){ + It = std::make_unique(IP, grid, src, io, src_name, first_init, is_teleseismic, is_second_run); + } else { + It = std::make_unique(IP, grid, src, io, src_name, first_init, is_teleseismic, is_second_run); + } + } else if (IP.get_stencil_order() == 3){ + It = std::make_unique(IP, grid, src, io, src_name, first_init, is_teleseismic, is_second_run); + if (IP.get_stencil_type() == UPWIND){ + std::cout << "WARNING: Upwind Stencil type not supported, using 3rd order non upwind scheme (LF)" << std::endl; + } + } else{ + std::cout << "ERROR: Stencil order not supported" << std::endl; + exit(1); + } + } else if (IP.get_sweep_type() == SWEEP_TYPE_LEVEL){ + if (IP.get_stencil_order() == 1){ + if (IP.get_stencil_type() == UPWIND){ + // std::cout << "WARNING: Upwind Stencil type not supported, using non upwind scheme (LF)" << std::endl; + It = std::make_unique(IP, grid, src, io, src_name, first_init, is_teleseismic, is_second_run); + } else { + It = std::make_unique(IP, grid, src, io, src_name, first_init, is_teleseismic, is_second_run); + } + } else if (IP.get_stencil_order() == 3){ + It = std::make_unique(IP, grid, src, io, src_name, first_init, is_teleseismic, is_second_run); + if (IP.get_stencil_type() == UPWIND){ + std::cout << "WARNING: Upwind Stencil type not supported, using 3rd order non upwind scheme (LF)" << std::endl; + } + } else{ + std::cout << "ERROR: Stencil order not supported" << std::endl; + exit(1); + } + } else { + std::cout << "ERROR: Sweep type not supported" << std::endl; + exit(1); + } + } else { // teleseismic event + if (IP.get_sweep_type() == SWEEP_TYPE_LEGACY) { + if (IP.get_stencil_order() == 1){ + if (IP.get_stencil_type() == UPWIND){ + It = std::make_unique(IP, grid, src, io, src_name, first_init, is_teleseismic, is_second_run); + } else { + It = std::make_unique(IP, grid, src, io, src_name, first_init, is_teleseismic, is_second_run); + } + } else if (IP.get_stencil_order() == 3){ + It = std::make_unique(IP, grid, src, io, src_name, first_init, is_teleseismic, is_second_run); + if (IP.get_stencil_type() == UPWIND){ + std::cout << "WARNING: Upwind Stencil type not supported, using non upwind scheme (LF)" << std::endl; + } + } else{ + std::cout << "ERROR: Stencil order not supported" << std::endl; + exit(1); + } + } else if (IP.get_sweep_type() == SWEEP_TYPE_LEVEL){ + if (IP.get_stencil_order() == 1){ + if (IP.get_stencil_type() == UPWIND){ + It = std::make_unique(IP, grid, src, io, src_name, first_init, is_teleseismic, is_second_run); + } else { + It = std::make_unique(IP, grid, src, io, src_name, first_init, is_teleseismic, is_second_run); + std::cout << "WARNING: SWEEP_TYPE_LEVEL for non-unwind solver does not work. Index wrong currently" << std::endl; + exit(1); + } + } else if (IP.get_stencil_order() == 3){ + It = std::make_unique(IP, grid, src, io, src_name, first_init, is_teleseismic, is_second_run); + std::cout << "WARNING: SWEEP_TYPE_LEVEL for non-unwind solver does not work. Index wrong currently" << std::endl; + exit(1); + if (IP.get_stencil_type() == UPWIND){ + std::cout << "WARNING: Upwind Stencil type not supported, using non upwind scheme (LF)" << std::endl; + } + } else{ + std::cout << "ERROR: Stencil order not supported" << std::endl; + exit(1); + } + } else { + std::cout << "ERROR: Sweep type not supported" << std::endl; + exit(1); + } + } + +} + +#endif + diff --git a/include/kernel.h b/include/kernel.h new file mode 100644 index 0000000..1a11362 --- /dev/null +++ b/include/kernel.h @@ -0,0 +1,226 @@ +#ifndef KERNEL_H +#define KERNEL_H + +#include "config.h" +#include "grid.h" +#include "input_params.h" + +void calculate_sensitivity_kernel(Grid& grid, InputParams& IP, const std::string& name_sim_src){ + // calculate sensitivity kernel + + // kernel calculation will be done only by the subdom_main + if (subdom_main) { + // get the necessary parameters + int np = loc_I; + int nt = loc_J; + int nr = loc_K; + CUSTOMREAL dr = grid.dr; + CUSTOMREAL dt = grid.dt; + CUSTOMREAL dp = grid.dp; + CUSTOMREAL src_lon = IP.get_src_lon( name_sim_src); + CUSTOMREAL src_lat = IP.get_src_lat( name_sim_src); + CUSTOMREAL src_r = IP.get_src_radius(name_sim_src); + + CUSTOMREAL weight = _1_CR; + + // inner points + for (int kkr = 1; kkr < nr-1; kkr++) { + for (int jjt = 1; jjt < nt-1; jjt++) { + for (int iip = 1; iip < np-1; iip++) { + + // calculate the kernel + CUSTOMREAL Tr_km = (grid.T_loc[I2V(iip,jjt,kkr+1)] - grid.T_loc[I2V(iip,jjt,kkr-1)]) / (_2_CR * dr); + CUSTOMREAL Ttheta_km = (grid.T_loc[I2V(iip,jjt+1,kkr)] - grid.T_loc[I2V(iip,jjt-1,kkr)]) / (_2_CR * dt) / grid.r_loc_1d[kkr]; + CUSTOMREAL Tphi_km = (grid.T_loc[I2V(iip+1,jjt,kkr)] - grid.T_loc[I2V(iip-1,jjt,kkr)]) / (_2_CR * dp) / (grid.r_loc_1d[kkr]*std::cos(grid.t_loc_1d[jjt])); + + CUSTOMREAL azi_ratio = std::sqrt((my_square(Ttheta_km) + my_square(Tphi_km))/(my_square(Tr_km) + my_square(Ttheta_km) + my_square(Tphi_km))); + + // mask within one grid around the source + if ((std::abs(grid.r_loc_1d[kkr] - src_r) >= dr) || + (std::abs(grid.t_loc_1d[jjt] - src_lat) >= dt) || + (std::abs(grid.p_loc_1d[iip] - src_lon) >= dp)) { + // density of ks + grid.Ks_density_loc[I2V(iip,jjt,kkr)] += weight * grid.Tadj_density_loc[I2V(iip,jjt,kkr)]; + + // density of kxi + // grid.Kxi_density_loc[I2V(iip,jjt,kkr)] += weight * grid.Tadj_density_loc[I2V(iip,jjt,kkr)]; + grid.Kxi_density_loc[I2V(iip,jjt,kkr)] += weight * grid.Tadj_density_loc[I2V(iip,jjt,kkr)] * azi_ratio; + + // density of keta + // grid.Keta_density_loc[I2V(iip,jjt,kkr)] += weight * grid.Tadj_density_loc[I2V(iip,jjt,kkr)]; + grid.Keta_density_loc[I2V(iip,jjt,kkr)] += weight * grid.Tadj_density_loc[I2V(iip,jjt,kkr)] * azi_ratio; + + + if (IP.get_update_slowness()==1){ // we need to update slowness + // Kernel w r t slowness s + grid.Ks_loc[I2V(iip,jjt,kkr)] += weight * grid.Tadj_loc[I2V(iip,jjt,kkr)] * my_square(grid.fun_loc[I2V(iip,jjt,kkr)]); + } else { + grid.Ks_loc[I2V(iip,jjt,kkr)] = _0_CR; + } + + + if (IP.get_update_azi_ani()){ // we need to update azimuthal anisotropy + // Kernel w r t anisotrophy xi + if (isZero(std::sqrt(my_square(grid.xi_loc[I2V(iip,jjt,kkr)])+my_square(grid.eta_loc[I2V(iip,jjt,kkr)])))) { + grid.Kxi_loc[I2V(iip,jjt,kkr)] += weight * grid.Tadj_loc[I2V(iip,jjt,kkr)] \ + * (my_square(Ttheta_km) - my_square(Tphi_km)); + + grid.Keta_loc[I2V(iip,jjt,kkr)] += weight * grid.Tadj_loc[I2V(iip,jjt,kkr)] \ + * ( -_2_CR * Ttheta_km * Tphi_km ); + + } else { + grid.Kxi_loc[I2V(iip,jjt,kkr)] += weight * grid.Tadj_loc[I2V(iip,jjt,kkr)] \ + * ((- GAMMA * grid.xi_loc[I2V(iip,jjt,kkr)] / \ + std::sqrt(my_square(grid.xi_loc[ I2V(iip,jjt,kkr)]) + my_square(grid.eta_loc[I2V(iip,jjt,kkr)]))) * my_square(Tr_km) \ + + my_square(Ttheta_km) + - my_square(Tphi_km)); + + grid.Keta_loc[I2V(iip,jjt,kkr)] += weight * grid.Tadj_loc[I2V(iip,jjt,kkr)] \ + * (( - GAMMA * grid.eta_loc[I2V(iip,jjt,kkr)]/ \ + std::sqrt(my_square(grid.xi_loc[I2V(iip,jjt,kkr)]) + my_square(grid.eta_loc[I2V(iip,jjt,kkr)]))) * my_square(Tr_km) \ + - _2_CR * Ttheta_km * Tphi_km ); + } + } else { + grid.Kxi_loc[I2V(iip,jjt,kkr)] = _0_CR; + grid.Keta_loc[I2V(iip,jjt,kkr)] = _0_CR; + } + + } else{ + grid.Ks_loc[I2V(iip,jjt,kkr)] += _0_CR; + grid.Kxi_loc[I2V(iip,jjt,kkr)] += _0_CR; + grid.Keta_loc[I2V(iip,jjt,kkr)] += _0_CR; + + grid.Ks_density_loc[I2V(iip,jjt,kkr)] += _0_CR; + grid.Kxi_density_loc[I2V(iip,jjt,kkr)] += _0_CR; + grid.Keta_density_loc[I2V(iip,jjt,kkr)] += _0_CR; + + } + } + } + } + + // boundary + for (int kkr = 0; kkr < nr; kkr++) { + for (int jjt = 0; jjt < nt; jjt++) { + // set Ks Kxi Keta to zero + if (grid.i_first()){ + grid.Ks_loc[I2V(0,jjt,kkr)] = _0_CR; + grid.Kxi_loc[I2V(0,jjt,kkr)] = _0_CR; + grid.Keta_loc[I2V(0,jjt,kkr)] = _0_CR; + grid.Ks_density_loc[I2V(0,jjt,kkr)] = _0_CR; + grid.Kxi_density_loc[I2V(0,jjt,kkr)] = _0_CR; + grid.Keta_density_loc[I2V(0,jjt,kkr)] = _0_CR; + } + if (grid.i_last()){ + grid.Ks_loc[I2V(np-1,jjt,kkr)] = _0_CR; + grid.Kxi_loc[I2V(np-1,jjt,kkr)] = _0_CR; + grid.Keta_loc[I2V(np-1,jjt,kkr)] = _0_CR; + grid.Ks_density_loc[I2V(np-1,jjt,kkr)] = _0_CR; + grid.Kxi_density_loc[I2V(np-1,jjt,kkr)] = _0_CR; + grid.Keta_density_loc[I2V(np-1,jjt,kkr)]= _0_CR; + } + } + } + for (int kkr = 0; kkr < nr; kkr++) { + for (int iip = 0; iip < np; iip++) { + // set Ks Kxi Keta to zero + if (grid.j_first()){ + grid.Ks_loc[I2V(iip,0,kkr)] = _0_CR; + grid.Kxi_loc[I2V(iip,0,kkr)] = _0_CR; + grid.Keta_loc[I2V(iip,0,kkr)] = _0_CR; + grid.Ks_density_loc[I2V(iip,0,kkr)] = _0_CR; + grid.Kxi_density_loc[I2V(iip,0,kkr)] = _0_CR; + grid.Keta_density_loc[I2V(iip,0,kkr)] = _0_CR; + } + if (grid.j_last()){ + grid.Ks_loc[I2V(iip,nt-1,kkr)] = _0_CR; + grid.Kxi_loc[I2V(iip,nt-1,kkr)] = _0_CR; + grid.Keta_loc[I2V(iip,nt-1,kkr)] = _0_CR; + grid.Ks_density_loc[I2V(iip,nt-1,kkr)] = _0_CR; + grid.Kxi_density_loc[I2V(iip,nt-1,kkr)] = _0_CR; + grid.Keta_density_loc[I2V(iip,nt-1,kkr)]= _0_CR; + } + } + } + for (int jjt = 0; jjt < nt; jjt++) { + for (int iip = 0; iip < np; iip++) { + // set Ks Kxi Keta to zero + if (grid.k_first()){ + grid.Ks_loc[I2V(iip,jjt,0)] = _0_CR; + grid.Kxi_loc[I2V(iip,jjt,0)] = _0_CR; + grid.Keta_loc[I2V(iip,jjt,0)] = _0_CR; + grid.Ks_density_loc[I2V(iip,jjt,0)] = _0_CR; + grid.Kxi_density_loc[I2V(iip,jjt,0)] = _0_CR; + grid.Keta_density_loc[I2V(iip,jjt,0)] = _0_CR; + } + if (grid.k_last()){ + grid.Ks_loc[I2V(iip,jjt,nr-1)] = _0_CR; + grid.Kxi_loc[I2V(iip,jjt,nr-1)] = _0_CR; + grid.Keta_loc[I2V(iip,jjt,nr-1)] = _0_CR; + grid.Ks_density_loc[I2V(iip,jjt,nr-1)] = _0_CR; + grid.Kxi_density_loc[I2V(iip,jjt,nr-1)] = _0_CR; + grid.Keta_density_loc[I2V(iip,jjt,nr-1)]= _0_CR; + } + } + } + + } // end if subdom_main +} + + +void check_kernel_density(Grid& grid, InputParams& IP) { + if(subdom_main){ + // check local kernel density positivity + for (int i_loc = 0; i_loc < loc_I; i_loc++) { + for (int j_loc = 0; j_loc < loc_J; j_loc++) { + for (int k_loc = 0; k_loc < loc_K; k_loc++) { + if (isNegative(grid.Ks_density_loc[I2V(i_loc,j_loc,k_loc)])){ + std::cout << "Warning, id_sim: " << id_sim << ", grid.Ks_density_loc[I2V(" << i_loc << "," << j_loc << "," << k_loc << ")] is less than 0, = " + << grid.Ks_density_loc[I2V(i_loc,j_loc,k_loc)] + << std::endl; + // // print the source name + // for (int i_src = 0; i_src < IP.n_src_this_sim_group; i_src++){ + // // get source info + // const std::string name_sim_src = IP.get_src_name(i_src); // get_src_name must be run by all processes + // std::cout << "id_sim: " << id_sim << ", " + // << i_src + 1 << "/" << IP.n_src_this_sim_group << ", source name: " << name_sim_src << std::endl; + // } + } + } + } + } + } +} + + +void sumup_kernels(Grid& grid) { + if(subdom_main){ + int n_grids = loc_I*loc_J*loc_K; + + allreduce_cr_sim_inplace(grid.Ks_loc, n_grids); + allreduce_cr_sim_inplace(grid.Kxi_loc, n_grids); + allreduce_cr_sim_inplace(grid.Keta_loc, n_grids); + allreduce_cr_sim_inplace(grid.Ks_density_loc, n_grids); + allreduce_cr_sim_inplace(grid.Kxi_density_loc, n_grids); + allreduce_cr_sim_inplace(grid.Keta_density_loc, n_grids); + + // share the values on boundary + grid.send_recev_boundary_data(grid.Ks_loc); + grid.send_recev_boundary_data(grid.Kxi_loc); + grid.send_recev_boundary_data(grid.Keta_loc); + grid.send_recev_boundary_data(grid.Ks_density_loc); + grid.send_recev_boundary_data(grid.Kxi_density_loc); + grid.send_recev_boundary_data(grid.Keta_density_loc); + + grid.send_recev_boundary_data_kosumi(grid.Ks_loc); + grid.send_recev_boundary_data_kosumi(grid.Kxi_loc); + grid.send_recev_boundary_data_kosumi(grid.Keta_loc); + grid.send_recev_boundary_data_kosumi(grid.Ks_density_loc); + grid.send_recev_boundary_data_kosumi(grid.Kxi_density_loc); + grid.send_recev_boundary_data_kosumi(grid.Keta_density_loc); + } + + synchronize_all_world(); +} + +#endif \ No newline at end of file diff --git a/include/lbfgs.h b/include/lbfgs.h new file mode 100644 index 0000000..0f9a642 --- /dev/null +++ b/include/lbfgs.h @@ -0,0 +1,577 @@ +#ifndef LBFGS_H +#define LBFGS_H + +#include "config.h" +#include "utils.h" +#include "grid.h" +#include "mpi_funcs.h" + +inline CUSTOMREAL volume_domain = _0_CR; // volume of the domain +inline CUSTOMREAL weight_Tikonov = _0_CR; // weight of the regularization term +inline CUSTOMREAL weight_Tikonov_ani = _0_CR; // weight of the regularization term for anisotropic regularization +inline int N_params = 3; // number of parameters to invert +inline CUSTOMREAL q_0 = _0_CR; // initial cost function +inline CUSTOMREAL qp_0 = _0_CR; // store initial p_k * grad(f_k) (descent_direction * gradient) +inline int damp_weight_fun = _1_CR; // damp weights for fun +inline int damp_weight_eta = _1_CR; // damp weights for eta +inline int damp_weight_xi = _1_CR; // damp weights for xi + + +void store_model_and_gradient(Grid& grid, int i_inv) { + + if (subdom_main && id_sim==0) { + + if (i_inv < Mbfgs){ + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + grid.Ks_model_store_loc[ I2VLBFGS(i_inv,i,j,k)] = grid.fun_loc[I2V(i,j,k)]; + grid.Keta_model_store_loc[I2VLBFGS(i_inv,i,j,k)] = grid.eta_loc[I2V(i,j,k)]; + grid.Kxi_model_store_loc[ I2VLBFGS(i_inv,i,j,k)] = grid.xi_loc[ I2V(i,j,k)]; + grid.Ks_grad_store_loc[ I2VLBFGS(i_inv,i,j,k)] = grid.Ks_update_loc[ I2V(i,j,k)]; + grid.Keta_grad_store_loc[ I2VLBFGS(i_inv,i,j,k)] = grid.Keta_update_loc[I2V(i,j,k)]; + grid.Kxi_grad_store_loc[ I2VLBFGS(i_inv,i,j,k)] = grid.Kxi_update_loc[ I2V(i,j,k)]; + } + } + } + + } else { + // replace the current stored models and gradients + for (int istore = 0; istore < Mbfgs-1; istore++){ + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + grid.Ks_model_store_loc[ I2VLBFGS(istore,i,j,k)] = grid.Ks_model_store_loc[ I2VLBFGS(istore+1,i,j,k)]; + grid.Keta_model_store_loc[I2VLBFGS(istore,i,j,k)] = grid.Keta_model_store_loc[I2VLBFGS(istore+1,i,j,k)]; + grid.Kxi_model_store_loc[ I2VLBFGS(istore,i,j,k)] = grid.Kxi_model_store_loc[ I2VLBFGS(istore+1,i,j,k)]; + grid.Ks_grad_store_loc[ I2VLBFGS(istore,i,j,k)] = grid.Ks_grad_store_loc[ I2VLBFGS(istore+1,i,j,k)]; + grid.Keta_grad_store_loc[ I2VLBFGS(istore,i,j,k)] = grid.Keta_grad_store_loc[ I2VLBFGS(istore+1,i,j,k)]; + grid.Kxi_grad_store_loc[ I2VLBFGS(istore,i,j,k)] = grid.Kxi_grad_store_loc[ I2VLBFGS(istore+1,i,j,k)]; + } + } + } + } + + // store new model and gradient + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + grid.Ks_model_store_loc[ I2VLBFGS(Mbfgs-1,i,j,k)] = grid.fun_loc[I2V(i,j,k)]; + grid.Keta_model_store_loc[I2VLBFGS(Mbfgs-1,i,j,k)] = grid.eta_loc[I2V(i,j,k)]; + grid.Kxi_model_store_loc[ I2VLBFGS(Mbfgs-1,i,j,k)] = grid.xi_loc[ I2V(i,j,k)]; + grid.Ks_grad_store_loc[ I2VLBFGS(Mbfgs-1,i,j,k)] = grid.Ks_update_loc[ I2V(i,j,k)]; + grid.Keta_grad_store_loc[ I2VLBFGS(Mbfgs-1,i,j,k)] = grid.Keta_update_loc[I2V(i,j,k)]; + grid.Kxi_grad_store_loc[ I2VLBFGS(Mbfgs-1,i,j,k)] = grid.Kxi_update_loc[ I2V(i,j,k)]; + } + } + } + } + + } // end subdom main and id_sim==0 + +} + + +void calculate_descent_direction_lbfgs(Grid& grid, int i_inv) { + + if (subdom_main && id_sim==0) { + int imin = 0; + int imax = 0; + if (i_inv >= Mbfgs) + imax = Mbfgs-2; + else + imax = i_inv-1; + + CUSTOMREAL* ak_store = allocateMemory(imax-imin+1, 2000); + CUSTOMREAL* pk_store = allocateMemory(imax-imin+1, 2001); + + CUSTOMREAL* desc_wks_Ks = allocateMemory(loc_I*loc_J*loc_K, 2002); + CUSTOMREAL* desc_wks_Keta = allocateMemory(loc_I*loc_J*loc_K, 2003); + CUSTOMREAL* desc_wks_Kxi = allocateMemory(loc_I*loc_J*loc_K, 2004); + + CUSTOMREAL* wks_1_Ks = allocateMemory(loc_I*loc_J*loc_K, 2005); + CUSTOMREAL* wks_1_Keta = allocateMemory(loc_I*loc_J*loc_K, 2006); + CUSTOMREAL* wks_1_Kxi = allocateMemory(loc_I*loc_J*loc_K, 2007); + CUSTOMREAL* wks_2_Ks = allocateMemory(loc_I*loc_J*loc_K, 2008); + CUSTOMREAL* wks_2_Keta = allocateMemory(loc_I*loc_J*loc_K, 2009); + CUSTOMREAL* wks_2_Kxi = allocateMemory(loc_I*loc_J*loc_K, 2010); + + std::cout << "imax, imin: " << imax << ", " << imin << std::endl; + + // initialize + for (int i = 0; i < imax-imin+1; i++) { + ak_store[i] = 0.0; // alpha + pk_store[i] = 0.0; //rho + } + + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + desc_wks_Ks[I2V(i,j,k)] = grid.Ks_grad_store_loc[ I2VLBFGS(imax+1,i,j,k)]; // d + desc_wks_Keta[I2V(i,j,k)] = grid.Keta_grad_store_loc[I2VLBFGS(imax+1,i,j,k)]; // d + desc_wks_Kxi[I2V(i,j,k)] = grid.Kxi_grad_store_loc[ I2VLBFGS(imax+1,i,j,k)]; // d + wks_1_Ks[I2V(i,j,k)] = grid.Ks_grad_store_loc[ I2VLBFGS(imax+1,i,j,k)] - grid.Ks_grad_store_loc[ I2VLBFGS(imax,i,j,k)]; + wks_1_Keta[I2V(i,j,k)] = grid.Keta_grad_store_loc[I2VLBFGS(imax+1,i,j,k)] - grid.Keta_grad_store_loc[I2VLBFGS(imax,i,j,k)]; + wks_1_Kxi[I2V(i,j,k)] = grid.Kxi_grad_store_loc[ I2VLBFGS(imax+1,i,j,k)] - grid.Kxi_grad_store_loc[ I2VLBFGS(imax,i,j,k)]; + } + } + } + + //calculate l2 norms + CUSTOMREAL norm_yiter = 0.0; + + norm_yiter += calc_l2norm(wks_1_Ks,loc_I*loc_J*loc_K); + norm_yiter += calc_l2norm(wks_1_Keta,loc_I*loc_J*loc_K); + norm_yiter += calc_l2norm(wks_1_Kxi,loc_I*loc_J*loc_K); + + CUSTOMREAL tmp = norm_yiter; + allreduce_cr_single(tmp, norm_yiter); + + for (int iinv = imax; iinv >= imin; iinv--){ + + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + wks_1_Ks[I2V(i,j,k)] = grid.Ks_grad_store_loc[ I2VLBFGS(iinv+1,i,j,k)] - grid.Ks_grad_store_loc[I2VLBFGS(iinv,i,j,k)]; + wks_1_Keta[I2V(i,j,k)] = grid.Keta_grad_store_loc[I2VLBFGS(iinv+1,i,j,k)] - grid.Keta_grad_store_loc[I2VLBFGS(iinv,i,j,k)]; + wks_1_Kxi[I2V(i,j,k)] = grid.Kxi_grad_store_loc[ I2VLBFGS(iinv+1,i,j,k)] - grid.Kxi_grad_store_loc[I2VLBFGS(iinv,i,j,k)]; + + wks_2_Ks[I2V(i,j,k)] = grid.Ks_model_store_loc[ I2VLBFGS(iinv+1,i,j,k)] - grid.Ks_model_store_loc[I2VLBFGS(iinv,i,j,k)]; + wks_2_Keta[I2V(i,j,k)] = grid.Keta_model_store_loc[I2VLBFGS(iinv+1,i,j,k)] - grid.Keta_model_store_loc[I2VLBFGS(iinv,i,j,k)]; + wks_2_Kxi[I2V(i,j,k)] = grid.Kxi_model_store_loc[ I2VLBFGS(iinv+1,i,j,k)] - grid.Kxi_model_store_loc[I2VLBFGS(iinv,i,j,k)]; + } + } + } + + CUSTOMREAL pk = _0_CR; + pk += dot_product(wks_1_Ks,wks_2_Ks,loc_I*loc_J*loc_K); + pk += dot_product(wks_1_Keta,wks_2_Keta,loc_I*loc_J*loc_K); + pk += dot_product(wks_1_Kxi,wks_2_Kxi,loc_I*loc_J*loc_K); + CUSTOMREAL tmp = pk; + allreduce_cr_single(tmp, pk); + pk_store[iinv] = _1_CR / pk; + + CUSTOMREAL ak = _0_CR; + ak += dot_product(wks_2_Ks, desc_wks_Ks,loc_I*loc_J*loc_K); + ak += dot_product(wks_2_Keta, desc_wks_Keta,loc_I*loc_J*loc_K); + ak += dot_product(wks_2_Kxi, desc_wks_Kxi,loc_I*loc_J*loc_K); + // print ak + if(myrank== 0) std::cout << "ak: " << ak << std::endl; + tmp = ak; + allreduce_cr_single(tmp, ak); + // print ak + if(myrank== 0) std::cout << "ak gathered: " << ak << std::endl; + ak_store[iinv] = pk_store[iinv] * ak; + + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + desc_wks_Ks[I2V(i,j,k)] -= ak_store[iinv] * wks_1_Ks[I2V(i,j,k)]; + desc_wks_Keta[I2V(i,j,k)] -= ak_store[iinv] * wks_1_Keta[I2V(i,j,k)]; + desc_wks_Kxi[I2V(i,j,k)] -= ak_store[iinv] * wks_1_Kxi[I2V(i,j,k)]; + } + } + } + + } // end loop iinv + + // Nocedal's default preconditionning + CUSTOMREAL pk = _1_CR / (pk_store[imax] * norm_yiter); + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + desc_wks_Ks[I2V(i,j,k)] *= pk; + desc_wks_Keta[I2V(i,j,k)] *= pk; + desc_wks_Kxi[I2V(i,j,k)] *= pk; + } + } + } + + // print ak_store and pk_store + if (myrank == 0) { + std::cout << "ak_store: "; + for (int i = 0; i < imax+1; i++) { + std::cout << ak_store[i] << " "; + } + std::cout << std::endl; + std::cout << "pk_store: "; + for (int i = 0; i < imax+1; i++) { + std::cout << pk_store[i] << " "; + } + std::cout << std::endl; + } + + + // custom preconditionning + // diagonal preconditionner + + for (int iinv = imin; iinv <= imax; iinv++){ + + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + wks_1_Ks[I2V(i,j,k)] = grid.Ks_grad_store_loc[ I2VLBFGS(iinv+1,i,j,k)] - grid.Ks_grad_store_loc[I2VLBFGS(iinv,i,j,k)]; + wks_1_Keta[I2V(i,j,k)] = grid.Keta_grad_store_loc[I2VLBFGS(iinv+1,i,j,k)] - grid.Keta_grad_store_loc[I2VLBFGS(iinv,i,j,k)]; + wks_1_Kxi[I2V(i,j,k)] = grid.Kxi_grad_store_loc[ I2VLBFGS(iinv+1,i,j,k)] - grid.Kxi_grad_store_loc[I2VLBFGS(iinv,i,j,k)]; + + wks_2_Ks[I2V(i,j,k)] = grid.Ks_model_store_loc[ I2VLBFGS(iinv+1,i,j,k)] - grid.Ks_model_store_loc[I2VLBFGS(iinv,i,j,k)]; + wks_2_Keta[I2V(i,j,k)] = grid.Keta_model_store_loc[I2VLBFGS(iinv+1,i,j,k)] - grid.Keta_model_store_loc[I2VLBFGS(iinv,i,j,k)]; + wks_2_Kxi[I2V(i,j,k)] = grid.Kxi_model_store_loc[ I2VLBFGS(iinv+1,i,j,k)] - grid.Kxi_model_store_loc[I2VLBFGS(iinv,i,j,k)]; + } + } + } + + CUSTOMREAL beta = _0_CR; + beta += dot_product(wks_1_Ks,desc_wks_Ks,loc_I*loc_J*loc_K); + beta += dot_product(wks_1_Keta,desc_wks_Keta,loc_I*loc_J*loc_K); + beta += dot_product(wks_1_Kxi,desc_wks_Kxi,loc_I*loc_J*loc_K); + CUSTOMREAL tmp = beta; + allreduce_cr_single(tmp, beta); + beta = pk_store[iinv] * beta; + + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + desc_wks_Ks[I2V(i,j,k)] += (ak_store[iinv]-beta) * wks_2_Ks[I2V(i,j,k)]; + desc_wks_Keta[I2V(i,j,k)] += (ak_store[iinv]-beta) * wks_2_Keta[I2V(i,j,k)]; + desc_wks_Kxi[I2V(i,j,k)] += (ak_store[iinv]-beta) * wks_2_Kxi[I2V(i,j,k)]; + } + } + } + } + + // descent directions + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + grid.Ks_descent_dir_loc[I2V(i,j,k)] = - _1_CR * desc_wks_Ks[I2V(i,j,k)]; + grid.Keta_descent_dir_loc[I2V(i,j,k)] = - _1_CR * desc_wks_Keta[I2V(i,j,k)]; + grid.Kxi_descent_dir_loc[I2V(i,j,k)] = - _1_CR * desc_wks_Kxi[I2V(i,j,k)]; + //grid.Ks_descent_dir_loc[I2V(i,j,k)] = desc_wks_Ks[I2V(i,j,k)]; + //grid.Keta_descent_dir_loc[I2V(i,j,k)] = desc_wks_Keta[I2V(i,j,k)]; + //grid.Kxi_descent_dir_loc[I2V(i,j,k)] = desc_wks_Kxi[I2V(i,j,k)]; + + } + } + } + + + delete [] ak_store; + delete [] pk_store; + delete [] desc_wks_Ks; + delete [] desc_wks_Keta; + delete [] desc_wks_Kxi; + delete [] wks_1_Ks; + delete [] wks_1_Keta; + delete [] wks_1_Kxi; + delete [] wks_2_Ks; + delete [] wks_2_Keta; + delete [] wks_2_Kxi; + + + } // end of subdom_main + + // share with all simultaneous run + if (subdom_main){ + broadcast_cr_inter_sim(grid.Ks_descent_dir_loc, loc_I*loc_J*loc_K, 0); + broadcast_cr_inter_sim(grid.Keta_descent_dir_loc, loc_I*loc_J*loc_K, 0); + broadcast_cr_inter_sim(grid.Kxi_descent_dir_loc, loc_I*loc_J*loc_K, 0); + } + +} + +/* +// laplacian approximation in cartesian coordinates +inline void calc_laplacian_field(Grid& grid, CUSTOMREAL* arr_in, CUSTOMREAL* arr_res) { + if (subdom_main) { + + //CUSTOMREAL lr = 1.0; + //CUSTOMREAL lt = 1.0; + //CUSTOMREAL lp = 1.0; + + CUSTOMREAL lr = regul_lp; + CUSTOMREAL lt = regul_lt; + CUSTOMREAL lp = regul_lp; + + // calculate L(m) + for (int k = 1; k < loc_K-1; k++) { + for (int j = 1; j < loc_J-1; j++) { + for (int i = 1; i < loc_I-1; i++) { + arr_res[I2V(i,j,k)] = \ + - _2_CR * (lr+lt+lp) * arr_in[I2V(i,j,k)] \ + + lr * (arr_in[I2V(i,j,k+1)] + arr_in[I2V(i,j,k-1)]) \ + + lt * (arr_in[I2V(i,j+1,k)] + arr_in[I2V(i,j-1,k)]) \ + + lp * (arr_in[I2V(i+1,j,k)] + arr_in[I2V(i-1,j,k)]); + } + } + } + + // communicate with adjacent subdomains + grid.send_recev_boundary_data(arr_res); + } +} +*/ + +// laplacian approximation in spherical coordinates +inline void calc_laplacian_field(Grid& grid, CUSTOMREAL* d, CUSTOMREAL* arr_out){ + + if (subdom_main) { + + CUSTOMREAL lr = regul_lp; + CUSTOMREAL lt = regul_lt; + CUSTOMREAL lp = regul_lp; + CUSTOMREAL dr = grid.dr; + CUSTOMREAL dt = grid.dt; + CUSTOMREAL dp = grid.dp; + + CUSTOMREAL r,t; + + // calculate L(m) in sphercal coordinates + for (int k = 1; k < loc_K-1; k++) { + for (int j = 1; j < loc_J-1; j++) { + for (int i = 1; i < loc_I-1; i++) { + r = grid.r_loc_1d[k]; + t = grid.t_loc_1d[j]; + + // finite difference approximation of laplacian spherical coordinates + arr_out[I2V(i,j,k)] = \ + lr*lr*((d[I2V(i,j,k+1)] - _2_CR*d[I2V(i,j,k)] + d[I2V(i,j,k-1)])/(dr*dr) \ + +(_2_CR/r)*(d[I2V(i,j,k+1)]-d[I2V(i,j,k-1)])/dr) \ + + lt*lt*((_1_CR/(r*r*std::sin(t)))*(std::cos(t)*(d[I2V(i,j+1,k)]-d[I2V(i,j-1,k)])/dt \ + - (std::sin(t)*(d[I2V(i,j+1,k)]-_2_CR*d[I2V(i,j,k)]+d[I2V(i,j-1,k)])/(dt*dt)))) \ + + lp*lp*((_1_CR/(r*r*std::sin(t)*std::sin(t)))*(d[I2V(i+1,j,k)]-_2_CR*d[I2V(i,j,k)]+d[I2V(i-1,j,k)])/(dp*dp)); + + } + } + } + + // communicate with adjacent subdomains + grid.send_recev_boundary_data(arr_out); + } +} + + + + +// add 1/2 * L(m)^2 to the objective function +inline CUSTOMREAL calculate_regularization_obj(Grid& grid) { + + CUSTOMREAL regularization_term = _0_CR; + + if (subdom_main && id_sim==0) { + int ngrid = loc_I*loc_J*loc_K; + + regularization_term += weight_Tikonov * calc_l2norm(grid.fun_regularization_penalty_loc, ngrid); + regularization_term += weight_Tikonov_ani * calc_l2norm(grid.eta_regularization_penalty_loc, ngrid); + regularization_term += weight_Tikonov_ani * calc_l2norm(grid.xi_regularization_penalty_loc, ngrid); + + // gather from all subdomain + CUSTOMREAL tmp = regularization_term; + allreduce_cr_single(tmp, regularization_term); + } + + // share retularization_term with all simultaneous run (may be unnecessary) + broadcast_cr_single_inter_sim(regularization_term, 0); + + return _0_5_CR * regularization_term; + +} + + +inline void init_regularization_penalty(Grid& grid) { + if (subdom_main && id_sim==0) { + int ngrid = loc_I*loc_J*loc_K; + + // initialize regularization penalties + std::fill(grid.fun_regularization_penalty_loc, grid.fun_regularization_penalty_loc + ngrid, _0_CR); + std::fill(grid.eta_regularization_penalty_loc, grid.eta_regularization_penalty_loc + ngrid, _0_CR); + std::fill(grid.xi_regularization_penalty_loc, grid.xi_regularization_penalty_loc + ngrid, _0_CR); + std::fill(grid.fun_gradient_regularization_penalty_loc, grid.fun_gradient_regularization_penalty_loc + ngrid, _0_CR); + std::fill(grid.eta_gradient_regularization_penalty_loc, grid.eta_gradient_regularization_penalty_loc + ngrid, _0_CR); + std::fill(grid.xi_gradient_regularization_penalty_loc, grid.xi_gradient_regularization_penalty_loc + ngrid, _0_CR); + } +} + +inline void init_regulaization_penalty_with_one(Grid& grid) { + if (subdom_main && id_sim==0) { + int ngrid = loc_I*loc_J*loc_K; + + // initialize regularization penalties + std::fill(grid.fun_regularization_penalty_loc, grid.fun_regularization_penalty_loc + ngrid, _1_CR); + std::fill(grid.eta_regularization_penalty_loc, grid.eta_regularization_penalty_loc + ngrid, _1_CR); + std::fill(grid.xi_regularization_penalty_loc, grid.xi_regularization_penalty_loc + ngrid, _1_CR); + std::fill(grid.fun_gradient_regularization_penalty_loc, grid.fun_gradient_regularization_penalty_loc + ngrid, _1_CR); + std::fill(grid.eta_gradient_regularization_penalty_loc, grid.eta_gradient_regularization_penalty_loc + ngrid, _1_CR); + std::fill(grid.xi_gradient_regularization_penalty_loc, grid.xi_gradient_regularization_penalty_loc + ngrid, _1_CR); + } +} + + +inline void calculate_regularization_penalty(Grid& grid) { + if (subdom_main && id_sim==0) { + int n_grid = loc_I*loc_J*loc_K; + + CUSTOMREAL* tmp_fun = allocateMemory(n_grid, 2011); + CUSTOMREAL* tmp_eta = allocateMemory(n_grid, 2012); + CUSTOMREAL* tmp_xi = allocateMemory(n_grid, 2013); + + for (int i = 0; i < n_grid; i++) { + tmp_fun[i] = grid.fun_loc[i] - grid.fun_prior_loc[i]; + tmp_eta[i] = grid.eta_loc[i] - grid.eta_prior_loc[i]; + tmp_xi[i] = grid.xi_loc[i] - grid.xi_prior_loc[i]; + } + + init_regularization_penalty(grid); + + // calculate LL(m) on fun (Ks) + calc_laplacian_field(grid, tmp_fun, grid.fun_regularization_penalty_loc); + calc_laplacian_field(grid, grid.fun_regularization_penalty_loc, grid.fun_gradient_regularization_penalty_loc); + + // calculate LL(m) on eta (Keta) + calc_laplacian_field(grid, tmp_eta, grid.eta_regularization_penalty_loc); + calc_laplacian_field(grid, grid.eta_regularization_penalty_loc, grid.eta_gradient_regularization_penalty_loc); + + // calculate LL(m) on xi (Kxi) + calc_laplacian_field(grid, tmp_xi, grid.xi_regularization_penalty_loc); + calc_laplacian_field(grid, grid.xi_regularization_penalty_loc, grid.xi_gradient_regularization_penalty_loc); + + for (int i = 0; i < n_grid; i++){ + // calculate gradient_regularization_penalty first for avoiding using overwrited value in regularization_penalty + grid.fun_gradient_regularization_penalty_loc[i] = damp_weight_fun*damp_weight_fun*(tmp_fun[i] - _2_CR * grid.fun_regularization_penalty_loc[i] + grid.fun_gradient_regularization_penalty_loc[i]); + grid.eta_gradient_regularization_penalty_loc[i] = damp_weight_eta*damp_weight_eta*(tmp_eta[i] - _2_CR * grid.eta_regularization_penalty_loc[i] + grid.eta_gradient_regularization_penalty_loc[i]); + grid.xi_gradient_regularization_penalty_loc[i] = damp_weight_xi *damp_weight_xi *(tmp_xi[i] - _2_CR * grid.xi_regularization_penalty_loc[i] + grid.xi_gradient_regularization_penalty_loc[i]); + } + + grid.send_recev_boundary_data(grid.fun_gradient_regularization_penalty_loc); + grid.send_recev_boundary_data(grid.eta_gradient_regularization_penalty_loc); + grid.send_recev_boundary_data(grid.xi_gradient_regularization_penalty_loc); + + for (int i = 0; i < n_grid; i++){ + // calculate gradient_regularization_penalty first for avoiding using overwrited value in regularization_penalty + + grid.fun_regularization_penalty_loc[i] = damp_weight_fun*(tmp_fun[i] - grid.fun_regularization_penalty_loc[i]); + grid.eta_regularization_penalty_loc[i] = damp_weight_eta*(tmp_eta[i] - grid.eta_regularization_penalty_loc[i]); + grid.xi_regularization_penalty_loc[i] = damp_weight_xi *(tmp_xi[i] - grid.xi_regularization_penalty_loc[i]); + } + + grid.send_recev_boundary_data(grid.fun_regularization_penalty_loc); + grid.send_recev_boundary_data(grid.eta_regularization_penalty_loc); + grid.send_recev_boundary_data(grid.xi_regularization_penalty_loc); + + delete [] tmp_fun; + delete [] tmp_eta; + delete [] tmp_xi; + } +} + + +// add grad(L(m)) to gradient +inline void add_regularization_grad(Grid& grid) { + if (subdom_main){ + if(id_sim==0){ + // add LL(m) to gradient + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + + //grid.fun_gradient_regularization_penalty_loc[I2V(i,j,k)] /= Linf_Ks; + //grid.eta_gradient_regularization_penalty_loc[I2V(i,j,k)] /= Linf_Keta; + //grid.xi_gradient_regularization_penalty_loc[I2V(i,j,k)] /= Linf_Kxi; + + grid.Ks_update_loc[I2V(i,j,k)] += weight_Tikonov * grid.fun_gradient_regularization_penalty_loc[I2V(i,j,k)]; + grid.Keta_update_loc[I2V(i,j,k)] += weight_Tikonov_ani * grid.eta_gradient_regularization_penalty_loc[I2V(i,j,k)]; + grid.Kxi_update_loc[I2V(i,j,k)] += weight_Tikonov_ani * grid.xi_gradient_regularization_penalty_loc[I2V(i,j,k)]; + } + } + } + + grid.send_recev_boundary_data(grid.Ks_update_loc); + grid.send_recev_boundary_data(grid.Keta_update_loc); + grid.send_recev_boundary_data(grid.Kxi_update_loc); + + }// end id_sim==0 + + + // share with all simultaneous run (may be unnecessary) + broadcast_cr_inter_sim(grid.Ks_update_loc, loc_I*loc_J*loc_K, 0); + broadcast_cr_inter_sim(grid.Keta_update_loc, loc_I*loc_J*loc_K, 0); + broadcast_cr_inter_sim(grid.Kxi_update_loc, loc_I*loc_J*loc_K, 0); + + }// end subdom_main +} + + +// compute initial guess for step length to try for line search +void initial_guess_step(Grid& grid, CUSTOMREAL& step_length, CUSTOMREAL SC_VAL) { + // find the max value in descent_direction + CUSTOMREAL max_val = _0_CR, max_val_all = _0_CR; + const CUSTOMREAL max_relative_pert = 0.02; + + if(subdom_main && id_sim==0) { + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + if (std::abs(grid.Ks_descent_dir_loc[I2V(i,j,k)] ) > max_val) max_val = std::abs(grid.Ks_descent_dir_loc[I2V(i,j,k)]); + if (std::abs(grid.Keta_descent_dir_loc[I2V(i,j,k)]) > max_val) max_val = std::abs(grid.Keta_descent_dir_loc[I2V(i,j,k)]); + if (std::abs(grid.Kxi_descent_dir_loc[I2V(i,j,k)] ) > max_val) max_val = std::abs(grid.Kxi_descent_dir_loc[I2V(i,j,k)]); + } + } + } + + // reduce + allreduce_cr_single_max(max_val, max_val_all); + + // debug print max_val + std::cout << "max_val: " << max_val_all << std::endl; + + // step size + step_length = max_relative_pert / SC_VAL / max_val_all; + } + + // broadcast to all simultaneous run (may be unnecessary) + if (subdom_main) + broadcast_cr_single_inter_sim(step_length, 0); + +} + + +inline CUSTOMREAL compute_volume_domain(Grid& grid) { + CUSTOMREAL volume = _0_CR; + + if (subdom_main && id_sim==0) { + volume += calc_l2norm(grid.fun_regularization_penalty_loc, loc_I*loc_J*loc_K); + volume += calc_l2norm(grid.eta_regularization_penalty_loc, loc_I*loc_J*loc_K); + volume += calc_l2norm(grid.xi_regularization_penalty_loc, loc_I*loc_J*loc_K); + + // reduce + allreduce_cr_single(volume, volume); + } + + // broadcast to all simultaneous run (may be unnecessary) + broadcast_cr_single_inter_sim(volume, 0); + + return volume; +} + + +inline void compute_damp_weights(const Grid& grid) { + // (size/sum)**2 + + if(subdom_main){ + CUSTOMREAL sum_fun = std::accumulate(grid.fun_prior_loc, grid.fun_prior_loc + loc_I*loc_J*loc_K, _0_CR); + //CUSTOMREAL sum_eta = std::accumulate(grid.eta_prior_loc, grid.eta_prior_loc + loc_I*loc_J*loc_K, _0_CR); // do not use + //CUSTOMREAL sum_xi = std::accumulate(grid.xi_prior_loc, grid.xi_prior_loc + loc_I*loc_J*loc_K, _0_CR); + + allreduce_cr_single(sum_fun, sum_fun); + + damp_weight_fun = (volume_domain / sum_fun)*(volume_domain / sum_fun); + //damp_weight_eta = (volume / sum_eta)*(volume / sum_eta); + //damp_weight_xi = (volume / sum_xi)*(volume / sum_xi); + damp_weight_eta = _1_CR; + damp_weight_xi = _1_CR; + + } + +} + +#endif \ No newline at end of file diff --git a/include/main_routines_calling.h b/include/main_routines_calling.h new file mode 100644 index 0000000..98c2208 --- /dev/null +++ b/include/main_routines_calling.h @@ -0,0 +1,923 @@ +#ifndef MAIN_ROUTINES_CALLING_H +#define MAIN_ROUTINES_CALLING_H + +#include +#include +#include "mpi_funcs.h" +#include "config.h" +#include "utils.h" +#include "input_params.h" +#include "grid.h" +#include "io.h" +#include "main_routines_inversion_mode.h" +#include "model_optimization_routines.h" +#include "main_routines_earthquake_relocation.h" +#include "iterator_selector.h" +#include "iterator.h" +#include "iterator_legacy.h" +#include "iterator_level.h" +#include "source.h" +#include "receiver.h" +#include "kernel.h" +#include "model_update.h" +#include "lbfgs.h" +#include "objective_function_utils.h" +#include "timer.h" +#include "oneD_inversion.h" + +// run forward-only or inversion mode +inline void run_forward_only_or_inversion(InputParams &IP, Grid &grid, IO_utils &io) { + + // for check if the current source is the first source + bool first_src = true; + + if(myrank == 0) + std::cout << "id_sim: " << id_sim << ", size of src_map: " << IP.src_map.size() << std::endl; + + // estimate running time + Timer timer("Forward_or_inversion", true); + + // prepare objective_function file + std::ofstream out_main; // close() is not mandatory + prepare_header_line(IP, out_main); + + if (id_sim==0) { + io.prepare_grid_inv_xdmf(0); + + //io.change_xdmf_obj(0); // change xmf file for next src + io.change_group_name_for_model(); + + // write out model info + io.write_vel(grid, 0); + io.write_xi( grid, 0); + io.write_eta(grid, 0); + //io.write_zeta(grid, i_inv); // TODO + + if (IP.get_verbose_output_level()){ + io.write_a(grid, 0); + io.write_b(grid, 0); + io.write_c(grid, 0); + io.write_f(grid, 0); + io.write_fun(grid, 0); + } + + // // output model_parameters_inv_0000.dat + // if (IP.get_if_output_model_dat()) + // io.write_concerning_parameters(grid, 0, IP); + } + + + // output station correction file (only for teleseismic differential data) + IP.write_station_correction_file(0); + + synchronize_all_world(); + + ///////////////////// + // loop for inversion + ///////////////////// + + bool line_search_mode = false; // if true, run_simulation_one_step skips adjoint simulation and only calculates objective function value + + // objective function for all src + CUSTOMREAL v_obj = 0.0, old_v_obj = 0.0; + std::vector v_obj_misfit(20, 0.0); + + for (int i_inv = 0; i_inv < IP.get_max_iter_inv(); i_inv++) { + + if(myrank == 0 && id_sim ==0){ + std::cout << "iteration " << i_inv << " starting ... " << std::endl; + } + + old_v_obj = v_obj; + + // prepare inverstion iteration group in xdmf file + io.prepare_grid_inv_xdmf(i_inv); + + /////////////////////////////////////////////////////// + // run (forward and adjoint) simulation for each source + /////////////////////////////////////////////////////// + + // run forward and adjoint simulation and calculate current objective function value and sensitivity kernel for all sources + line_search_mode = false; + // skip for the mode with sub-iteration + if (i_inv > 0 && optim_method != GRADIENT_DESCENT) { + } else { + bool is_save_T = false; + v_obj_misfit = run_simulation_one_step(IP, grid, io, i_inv, first_src, line_search_mode, is_save_T); + v_obj = v_obj_misfit[0]; + } + + // wait for all processes to finish + synchronize_all_world(); + + // check if v_obj is nan + if (std::isnan(v_obj)) { + if (myrank == 0) + std::cout << "v_obj is nan, stop inversion" << std::endl; + // stop inversion + break; + } + + // output src rec file with the result arrival times + if (IP.get_if_output_in_process_data() || i_inv == IP.get_max_iter_inv()-1 || i_inv==0) { + IP.write_src_rec_file(i_inv,0); + } + + /////////////// + // model update + /////////////// + if(myrank == 0 && id_sim ==0) + std::cout << "model update starting ... " << std::endl; + + if (IP.get_run_mode() == DO_INVERSION) { + if (optim_method == GRADIENT_DESCENT) + model_optimize(IP, grid, io, i_inv, v_obj, old_v_obj, first_src, out_main); + else if (optim_method == HALVE_STEPPING_MODE) + v_obj_misfit = model_optimize_halve_stepping(IP, grid, io, i_inv, v_obj, first_src, out_main); + else if (optim_method == LBFGS_MODE) { + bool found_next_step = model_optimize_lbfgs(IP, grid, io, i_inv, v_obj, first_src, out_main); + if (!found_next_step) + goto end_of_inversion; + } + } + + // output station correction file (only for teleseismic differential data) + IP.write_station_correction_file(i_inv + 1); + + // output objective function + write_objective_function(IP, i_inv, v_obj_misfit, out_main, "model update"); + + // since model is update. The written traveltime field should be discraded. + // initialize is_T_written_into_file + for (int i_src = 0; i_src < IP.n_src_this_sim_group; i_src++){ + const std::string name_sim_src = IP.get_src_name(i_src); + + if (proc_store_srcrec) // only proc_store_srcrec has the src_map object + IP.src_map[name_sim_src].is_T_written_into_file = false; + } + + // output updated model + if (id_sim==0) { + //io.change_xdmf_obj(0); // change xmf file for next src + io.change_group_name_for_model(); + + // write out model info + if (IP.get_if_output_in_process() || i_inv >= IP.get_max_iter_inv() - 2){ + io.write_vel(grid, i_inv+1); + io.write_xi( grid, i_inv+1); + io.write_eta(grid, i_inv+1); + } + //io.write_zeta(grid, i_inv); // TODO + + if (IP.get_verbose_output_level()){ + io.write_a(grid, i_inv+1); + io.write_b(grid, i_inv+1); + io.write_c(grid, i_inv+1); + io.write_f(grid, i_inv+1); + io.write_fun(grid, i_inv+1); + } + + // // output model_parameters_inv_0000.dat + // if (IP.get_if_output_model_dat() + // && (IP.get_if_output_in_process() || i_inv >= IP.get_max_iter_inv() - 2)) + // io.write_concerning_parameters(grid, i_inv + 1, IP); + + } + + // writeout temporary xdmf file + io.update_xdmf_file(); + + // wait for all processes to finish + synchronize_all_world(); + + + // estimate running time + CUSTOMREAL time_elapsed = timer.get_t(); + if (id_sim == 0 && myrank == 0 && i_inv < IP.get_max_iter_inv()-1) { + const time_t end_time_estimated = time_elapsed / (i_inv + 1) * (IP.get_max_iter_inv() - i_inv - 1) + timer.get_start(); + auto will_run_time = (int)(time_elapsed/(i_inv + 1) * (IP.get_max_iter_inv() - i_inv - 1)); + + std::cout << std::endl; + std::cout << "The program begins at " << timer.get_start_t() << std::endl; + std::cout << "Iteration (" << i_inv + 1 << "/" << IP.get_max_iter_inv() << ") finished at " << time_elapsed << " seconds" << std::endl; + std::cout << i_inv + 1 << " iterations run " << timer.get_t() << " seconds, the rest of " << IP.get_max_iter_inv() - i_inv - 1 << " iterations require " << will_run_time << " seconds." << std::endl; + std::cout << "The program is estimated to stop at " << timer.get_utc_from_time_t(end_time_estimated) << std::endl; + std::cout << std::endl; + } + + // output current state of the model + if (IP.get_if_output_final_model()) { + // io.write_final_model(grid, IP); + io.write_merged_model(grid, IP, "final_model.h5"); + } + if (IP.get_if_output_middle_model()) { + std::string tmp_fname = "middle_model_step_" + int2string_zero_fill(i_inv + 1) + ".h5"; + io.write_merged_model(grid, IP, tmp_fname); + } + + + } // end loop inverse + +end_of_inversion: + + // close xdmf file + io.finalize_data_output_file(); + + timer.stop_timer(); + if (id_sim == 0 && myrank == 0) { + std::cout << std::endl; + std::cout << "The program begin at " << timer.get_start_t() << std::endl; + std::cout << "Forward_or_inversion end at " << timer.get_end_t() << std::endl; + std::cout << "It has run " << timer.get_elapsed_t() << " seconds in total." << std::endl; + std::cout << std::endl; + } +} + + +// run earthquake relocation mode +inline void run_earthquake_relocation(InputParams& IP, Grid& grid, IO_utils& io) { + + Receiver recs; + + // calculate traveltime for each receiver (swapped from source) and write in output file + calculate_traveltime_for_all_src_rec(IP, grid, io); + + // prepare output for iteration status + std::ofstream out_main; // close() is not mandatory + prepare_header_line(IP, out_main); + + // objective function and its gradient + CUSTOMREAL v_obj = 999999999.0; + + int i_iter = 0; + + std::vector v_obj_misfit; + + // iterate + while (true) { + + v_obj = 0.0; + + // calculate gradient of objective function at sources + v_obj_misfit = calculate_gradient_objective_function(IP, grid, io, i_iter); + v_obj = v_obj_misfit[0]; + + // update source location + recs.update_source_location(IP, grid); + + synchronize_all_world(); + + // check convergence + bool finished = false; + + if (subdom_main && id_subdomain==0) { + if (i_iter >= N_ITER_MAX_SRC_RELOC){ + std::cout << "Finished relocation because iteration number exceeds the maximum " << N_ITER_MAX_SRC_RELOC << std::endl; + finished = true; + } + allreduce_bool_single_inplace_sim(finished); //LAND + } + + synchronize_all_world(); + + // check if all processes have finished + broadcast_bool_inter_and_intra_sim(finished, 0); + + synchronize_all_world(); + + // output location information + if(id_sim == 0 && myrank == 0){ + // write objective function + std::cout << "iteration: " << i_iter << ", objective function: " << v_obj << std::endl; + } + + // write objective functions + write_objective_function(IP, i_iter, v_obj_misfit, out_main, "relocation"); + + // write out new src_rec_file + if (IP.get_if_output_in_process_data() || i_iter == N_ITER_MAX_SRC_RELOC-1 || i_iter==0){ + IP.write_src_rec_file(0,i_iter); + } + + // modify the receiver's location for output + IP.modify_swapped_source_location(); + + + if (finished) + break; + + // new iteration + i_iter++; + } + + // modify the receiver's location + IP.modify_swapped_source_location(); + // write out new src_rec_file + IP.write_src_rec_file(0,i_iter); + // close xdmf file + io.finalize_data_output_file(); + +} + + +// run earthquake relocation mode +inline void run_inversion_and_relocation(InputParams& IP, Grid& grid, IO_utils& io) { + + Timer timer("Inv_and_reloc", true); + + ///////////////////// + // preparation of model update + ///////////////////// + + // for check if the current source is the first source + bool first_src = true; + + if(myrank == 0) + std::cout << "id_sim: " << id_sim << ", size of src_map: " << IP.src_map.size() << std::endl; + + // prepare objective_function file + std::ofstream out_main; // close() is not mandatory + prepare_header_line(IP, out_main); + + if (id_sim==0) { + // prepare inverstion iteration group in xdmf file + io.prepare_grid_inv_xdmf(0); + + //io.change_xdmf_obj(0); // change xmf file for next src + io.change_group_name_for_model(); + + // write out model info + io.write_vel(grid, 0); + io.write_xi( grid, 0); + io.write_eta(grid, 0); + //io.write_zeta(grid, i_inv); // TODO + + if (IP.get_verbose_output_level()){ + io.write_a(grid, 0); + io.write_b(grid, 0); + io.write_c(grid, 0); + io.write_f(grid, 0); + io.write_fun(grid, 0); + } + + // // output model_parameters_inv_0000.dat + // if (IP.get_if_output_model_dat()) + // io.write_concerning_parameters(grid, 0, IP); + } + + // output station correction file (only for teleseismic differential data) + IP.write_station_correction_file(0); + + synchronize_all_world(); + + bool line_search_mode = false; // if true, run_simulation_one_step skips adjoint simulation and only calculates objective function value + + ///////////////////// + // preparation of relocation + ///////////////////// + + Receiver recs; + + ///////////////////// + // initializae objective function + ///////////////////// + + CUSTOMREAL v_obj = 0.0, old_v_obj = 10000000000.0; + std::vector v_obj_misfit(20, 0.0); + + if (inv_mode == ITERATIVE){ + + ///////////////////// + // main loop for model update and relocation + ///////////////////// + + int model_update_step = 0; + int relocation_step = 0; + + for (int i_loop = 0; i_loop < IP.get_max_loop_mode0(); i_loop++){ + ///////////////////// + // stage 1, update model parameters + ///////////////////// + + for (int one_loop_i_inv = 0; one_loop_i_inv < IP.get_model_update_N_iter(); one_loop_i_inv++){ + // the actural step index of model update + int i_inv = i_loop * IP.get_model_update_N_iter() + one_loop_i_inv; + + if(myrank == 0 && id_sim ==0){ + std::cout << std::endl; + std::cout << "loop " << i_loop+1 << ", model update iteration " << one_loop_i_inv+1 + << " ( the " << i_inv+1 << "-th model update) starting ... " << std::endl; + std::cout << std::endl; + } + + + // prepare inverstion iteration group in xdmf file + io.prepare_grid_inv_xdmf(i_inv); + + /////////////////////////////////////////////////////// + // run (forward and adjoint) simulation for each source + /////////////////////////////////////////////////////// + + // run forward and adjoint simulation and calculate current objective function value and sensitivity kernel for all sources + line_search_mode = false; + // skip for the mode with sub-iteration + if (i_inv > 0 && optim_method != GRADIENT_DESCENT) { + } else { + bool is_save_T = false; + v_obj_misfit = run_simulation_one_step(IP, grid, io, i_inv, first_src, line_search_mode, is_save_T); + v_obj = v_obj_misfit[0]; + } + + // wait for all processes to finish + synchronize_all_world(); + + // check if v_obj is nan + if (std::isnan(v_obj)) { + if (myrank == 0) + std::cout << "v_obj is nan, stop inversion" << std::endl; + // stop inversion + break; + } + + /////////////// + // model update + /////////////// + + if (optim_method == GRADIENT_DESCENT) + model_optimize(IP, grid, io, i_inv, v_obj, old_v_obj, first_src, out_main); + else if (optim_method == HALVE_STEPPING_MODE) + v_obj_misfit = model_optimize_halve_stepping(IP, grid, io, i_inv, v_obj, first_src, out_main); + else if (optim_method == LBFGS_MODE) { + bool found_next_step = model_optimize_lbfgs(IP, grid, io, i_inv, v_obj, first_src, out_main); + + if (!found_next_step) + break; + } + + // define old_v_obj + old_v_obj = v_obj; + + // output objective function + write_objective_function(IP, i_inv, v_obj_misfit, out_main, "model update"); + + // since model is update. The written traveltime field should be discraded. + // initialize is_T_written_into_file + for (int i_src = 0; i_src < IP.n_src_this_sim_group; i_src++){ + const std::string name_sim_src = IP.get_src_name(i_src); + + if (proc_store_srcrec) // only proc_store_srcrec has the src_map object + IP.src_map[name_sim_src].is_T_written_into_file = false; + } + + // output updated model + if (id_sim==0) { + //io.change_xdmf_obj(0); // change xmf file for next src + io.change_group_name_for_model(); + + // write out model info + if (IP.get_if_output_in_process() || i_inv >= IP.get_max_loop_mode0()*IP.get_model_update_N_iter() - 2){ + io.write_vel(grid, i_inv+1); + io.write_xi( grid, i_inv+1); + io.write_eta(grid, i_inv+1); + } + //io.write_zeta(grid, i_inv); // TODO + + if (IP.get_verbose_output_level()){ + io.write_a(grid, i_inv+1); + io.write_b(grid, i_inv+1); + io.write_c(grid, i_inv+1); + io.write_f(grid, i_inv+1); + io.write_fun(grid, i_inv+1); + } + + // // output model_parameters_inv_0000.dat + // if (IP.get_if_output_model_dat() + // && (IP.get_if_output_in_process() || i_inv >= IP.get_max_loop_mode0()*IP.get_model_update_N_iter() - 2)) + // io.write_concerning_parameters(grid, i_inv + 1, IP); + + } // end output updated model + + // writeout temporary xdmf file + io.update_xdmf_file(); + + // write src rec files + if (IP.get_if_output_in_process_data()){ + IP.write_src_rec_file(model_update_step,relocation_step); + } else if (i_inv == IP.get_max_loop_mode0() * IP.get_model_update_N_iter()-1 || i_inv==0) { + IP.write_src_rec_file(model_update_step,relocation_step); + } + model_update_step += 1; + + // wait for all processes to finish + synchronize_all_world(); + + // output current state of the model + if (IP.get_if_output_final_model()) { + // io.write_final_model(grid, IP); + io.write_merged_model(grid, IP, "final_model.h5"); + } + if (IP.get_if_output_middle_model()) { + std::string tmp_fname = "middle_model_step_" + int2string_zero_fill(i_inv + 1) + ".h5"; + io.write_merged_model(grid, IP, tmp_fname); + } + + } // end model update in one loop + + + ///////////////////// + // stage 2, update earthquake locations + ///////////////////// + + if(myrank == 0 && id_sim ==0){ + std::cout << std::endl; + std::cout << "loop " << i_loop+1 << ", computing traveltime field for relocation" << std::endl; + std::cout << std::endl; + } + + // calculate traveltime for each receiver (swapped from source) and write in output file + if (IP.get_relocation_N_iter() > 0) // we really do relocation + calculate_traveltime_for_all_src_rec(IP, grid, io); + + + // initilize all earthquakes + if (proc_store_srcrec){ + for(auto iter = IP.rec_map.begin(); iter != IP.rec_map.end(); iter++){ + iter->second.is_stop = false; + } + } + + // iterate + for (int one_loop_i_iter = 0; one_loop_i_iter < IP.get_relocation_N_iter(); one_loop_i_iter++){ + int i_iter = i_loop * IP.get_relocation_N_iter() + one_loop_i_iter; + + if(myrank == 0 && id_sim ==0){ + std::cout << std::endl; + std::cout << "loop " << i_loop+1 << ", relocation iteration " << one_loop_i_iter+1 + << " ( the " << i_iter+1 << "-th relocation) starting ... " << std::endl; + std::cout << std::endl; + } + + + // calculate gradient of objective function at sources + v_obj_misfit = calculate_gradient_objective_function(IP, grid, io, i_iter); + v_obj = v_obj_misfit[0]; + + // update source location + recs.update_source_location(IP, grid); + + synchronize_all_world(); + + + // output location information + if(id_sim == 0 && myrank == 0){ + std::cout << "objective function: " << v_obj << std::endl; + } + + // write objective functions + write_objective_function(IP, i_iter, v_obj_misfit, out_main, "relocation"); + + // write out new src_rec_file + if (IP.get_if_output_in_process_data()){ + IP.write_src_rec_file(model_update_step,relocation_step); + } else if (i_iter == IP.get_max_loop_mode0() * IP.get_relocation_N_iter()-1 || i_iter==0) { + IP.write_src_rec_file(model_update_step,relocation_step); + } + + // modify the receiver's location for output + IP.modify_swapped_source_location(); + + relocation_step += 1; + } // end relocation loop + + grid.rejuvenate_abcf(); // (a,b/r^2,c/(r^2*cos^2),f/(r^2*cos)) -> (a,b,c,f) + + // estimate running time + CUSTOMREAL time_elapsed = timer.get_t(); + if (id_sim == 0 && myrank == 0 && i_loop < IP.get_max_loop_mode0()-1) { + const time_t end_time_estimated = time_elapsed / (i_loop + 1) * (IP.get_max_loop_mode0() - i_loop - 1) + timer.get_start(); + auto will_run_time = (int)(time_elapsed/(i_loop + 2) * (IP.get_max_loop_mode0() - i_loop - 1)); + + std::cout << std::endl; + std::cout << "The program begins at " << timer.get_start_t() << std::endl; + std::cout << "Loop (" << i_loop + 1 << "/" << IP.get_max_loop_mode0() << ") finished at " << time_elapsed << " seconds" << std::endl; + std::cout << i_loop + 1 << " loop run " << timer.get_t() << " seconds, the rest of " << IP.get_max_loop_mode0() - i_loop - 1 << " iterations require " << will_run_time << " seconds." << std::endl; + std::cout << "The program is estimated to stop at " << timer.get_utc_from_time_t(end_time_estimated) << std::endl; + std::cout << std::endl; + } + + } // end loop for model update and relocation + } else if (inv_mode == SIMULTANEOUS) { + + for (int i_loop = 0; i_loop < IP.get_max_loop_mode1(); i_loop++){ + + if(myrank == 0 && id_sim ==0){ + std::cout << std::endl; + std::cout << "loop " << i_loop+1 << ", model update and relocation starting ... " << std::endl; + std::cout << std::endl; + } + + ///////////////////// + // stage 1, update model parameters + ///////////////////// + + + // prepare inversion iteration group in xdmf file + io.prepare_grid_inv_xdmf(i_loop); + + /////////////////////////////////////////////////////// + // run (forward and adjoint) simulation for each source + /////////////////////////////////////////////////////// + + // run forward and adjoint simulation and calculate current objective function value and sensitivity kernel for all sources + line_search_mode = false; + // skip for the mode with sub-iteration + if (i_loop > 0 && optim_method != GRADIENT_DESCENT) { + } else { + bool is_save_T = true; + v_obj_misfit = run_simulation_one_step(IP, grid, io, i_loop, first_src, line_search_mode, is_save_T); + v_obj = v_obj_misfit[0]; + } + + // wait for all processes to finish + synchronize_all_world(); + + // check if v_obj is nan + if (std::isnan(v_obj)) { + if (myrank == 0) + std::cout << "v_obj is nan, stop inversion" << std::endl; + + // stop inversion + break; + } + + /////////////// + // model update + /////////////// + + if (optim_method == GRADIENT_DESCENT) + model_optimize(IP, grid, io, i_loop, v_obj, old_v_obj, first_src, out_main); + else if (optim_method == HALVE_STEPPING_MODE) + v_obj_misfit = model_optimize_halve_stepping(IP, grid, io, i_loop, v_obj, first_src, out_main); + else if (optim_method == LBFGS_MODE) { + bool found_next_step = model_optimize_lbfgs(IP, grid, io, i_loop, v_obj, first_src, out_main); + + if (!found_next_step) + break; + } + + + // output objective function (model update part) + write_objective_function(IP, i_loop, v_obj_misfit, out_main, "model update"); + + ///////////////////// + // stage 2, update earthquake locations + ///////////////////// + + + // initilize all earthquakes + if (proc_store_srcrec){ + for(auto iter = IP.rec_map.begin(); iter != IP.rec_map.end(); iter++){ + iter->second.is_stop = false; + } + } + + // calculate gradient of objective function at sources + v_obj_misfit = calculate_gradient_objective_function(IP, grid, io, i_loop); + + // update source location + recs.update_source_location(IP, grid); + + synchronize_all_world(); + + // output objective function (relocation part) + write_objective_function(IP, i_loop, v_obj_misfit, out_main, "relocation"); + + + // define old_v_obj + old_v_obj = v_obj; + + + // since model is update. The written traveltime field should be discraded. + // initialize is_T_written_into_file + for (int i_src = 0; i_src < IP.n_src_this_sim_group; i_src++){ + const std::string name_sim_src = IP.get_src_name(i_src); + + if (proc_store_srcrec) // only proc_store_srcrec has the src_map object + IP.src_map[name_sim_src].is_T_written_into_file = false; + } + + // output updated model + if (id_sim==0) { + //io.change_xdmf_obj(0); // change xmf file for next src + io.change_group_name_for_model(); + + // write out model info + if (IP.get_if_output_in_process() || i_loop >= IP.get_max_loop_mode1() - 2){ + io.write_vel(grid, i_loop+1); + io.write_xi( grid, i_loop+1); + io.write_eta(grid, i_loop+1); + } + //io.write_zeta(grid, i_inv); // TODO + + if (IP.get_verbose_output_level()){ + io.write_a(grid, i_loop+1); + io.write_b(grid, i_loop+1); + io.write_c(grid, i_loop+1); + io.write_f(grid, i_loop+1); + io.write_fun(grid, i_loop+1); + } + + // // output model_parameters_inv_0000.dat + // if (IP.get_if_output_model_dat() + // && (IP.get_if_output_in_process() || i_loop >= IP.get_max_loop_mode1() - 2)) + // io.write_concerning_parameters(grid, i_loop + 1, IP); + + } // end output updated model + + // writeout temporary xdmf file + io.update_xdmf_file(); + + // write src rec files + if (IP.get_if_output_in_process_data()){ + IP.write_src_rec_file(i_loop,i_loop); + } else if (i_loop == IP.get_max_loop_mode1() -1 || i_loop==0) { + IP.write_src_rec_file(i_loop,i_loop); + } + + // modify the receiver's location for output + IP.modify_swapped_source_location(); + + // wait for all processes to finish + synchronize_all_world(); + + grid.rejuvenate_abcf(); // (a,b/r^2,c/(r^2*cos^2),f/(r^2*cos)) -> (a,b,c,f) + + // estimate running time + CUSTOMREAL time_elapsed = timer.get_t(); + if (id_sim == 0 && myrank == 0 && i_loop < IP.get_max_loop_mode1()-1) { + const time_t end_time_estimated = time_elapsed / (i_loop + 1) * (IP.get_max_loop_mode1() - i_loop - 1) + timer.get_start(); + auto will_run_time = (int)(time_elapsed/(i_loop + 2) * (IP.get_max_loop_mode1() - i_loop - 1)); + + std::cout << std::endl; + std::cout << "The program begins at " << timer.get_start_t() << std::endl; + std::cout << "Loop (" << i_loop + 1 << "/" << IP.get_max_loop_mode1() << ") finished at " << time_elapsed << " seconds" << std::endl; + std::cout << i_loop + 1 << " loop run " << timer.get_t() << " seconds, the rest of " << IP.get_max_loop_mode1() - i_loop - 1 << " iterations require " << will_run_time << " seconds." << std::endl; + std::cout << "The program is estimated to stop at " << timer.get_utc_from_time_t(end_time_estimated) << std::endl; + std::cout << std::endl; + } + + // output current state of the model + if (IP.get_if_output_final_model()) { + // io.write_final_model(grid, IP); + io.write_merged_model(grid, IP, "final_model.h5"); + } + if (IP.get_if_output_middle_model()) { + std::string tmp_fname = "middle_model_step_" + int2string_zero_fill(i_loop + 1) + ".h5"; + io.write_merged_model(grid, IP, tmp_fname); + } + } // end loop for model update and relocation + + } else { + std::cout << "Error: inv_mode is not defined" << std::endl; + exit(1); + } + // close xdmf file + io.finalize_data_output_file(); + + timer.stop_timer(); + if (id_sim == 0 && myrank == 0) { + std::cout << std::endl; + std::cout << "The program begin at " << timer.get_start_t(); + std::cout << "Inv_and_reloc end at " << timer.get_end_t(); + std::cout << "It has run " << timer.get_elapsed_t() << " seconds in total." << std::endl; + std::cout << std::endl; + } + +} + + +// run 1D inversion mode +inline void run_1d_inversion(InputParams& IP, Grid& grid, IO_utils& io) { + OneDInversion oneDInv(IP, grid); + + if(myrank == 0) + std::cout << "id_sim: " << id_sim << ", size of src_map: " << IP.src_map.size() << std::endl; + + // estimate running time + Timer timer("1D_inversion", true); + + // prepare objective_function file + std::ofstream out_main; // close() is not mandatory + prepare_header_line(IP, out_main); + + synchronize_all_world(); + + ///////////////////// + // loop for inversion + ///////////////////// + + // objective function for all src + std::vector v_obj_misfit(20, 0.0); + + for (int i_inv = 0; i_inv < IP.get_max_iter_inv(); i_inv++) { + if(myrank == 0 && id_sim ==0){ + std::cout << "iteration " << i_inv << " starting ... " << std::endl; + } + + // prepare inverstion iteration group in xdmf file + io.prepare_grid_inv_xdmf(i_inv); + + /////////////////////////////////////////////////////// + // run (forward and adjoint) simulation for each source + /////////////////////////////////////////////////////// + v_obj_misfit = oneDInv.run_simulation_one_step_1dinv(IP, io, i_inv); + + // wait for all processes to finish + synchronize_all_world(); + + // check if v_obj is nan + if (std::isnan(v_obj_misfit[0])) { + if (myrank == 0) + std::cout << "v_obj is nan, stop inversion" << std::endl; + // stop inversion + break; + } + + // output src rec file with the result arrival times + if (IP.get_if_output_in_process_data()){ + IP.write_src_rec_file(i_inv,0); + } else if (i_inv == IP.get_max_iter_inv()-1 || i_inv==0) { + IP.write_src_rec_file(i_inv,0); + } + + /////////////// + // model update + /////////////// + if(myrank == 0 && id_sim ==0) + std::cout << "model update starting ... " << std::endl; + oneDInv.model_optimize_1dinv(IP, grid, io, i_inv); + + // output objective function + write_objective_function(IP, i_inv, v_obj_misfit, out_main, "1d inversion"); + + // output updated model + if (id_sim==0) { + //io.change_xdmf_obj(0); // change xmf file for next src + io.change_group_name_for_model(); + + // write out model info + if (IP.get_if_output_in_process() || i_inv >= IP.get_max_iter_inv() - 2){ + io.write_vel(grid, i_inv+1); + io.write_xi( grid, i_inv+1); + io.write_eta(grid, i_inv+1); + } + } + + // writeout temporary xdmf file + io.update_xdmf_file(); + + // wait for all processes to finish + synchronize_all_world(); + + // estimate running time + CUSTOMREAL time_elapsed = timer.get_t(); + if (id_sim == 0 && myrank == 0 && i_inv < IP.get_max_iter_inv()-1) { + const time_t end_time_estimated = time_elapsed / (i_inv + 1) * (IP.get_max_iter_inv() - i_inv - 1) + timer.get_start(); + auto will_run_time = (int)(time_elapsed/(i_inv + 1) * (IP.get_max_iter_inv() - i_inv - 1)); + + std::cout << std::endl; + std::cout << "The program begins at " << timer.get_start_t() << std::endl; + std::cout << "Iteration (" << i_inv + 1 << "/" << IP.get_max_iter_inv() << ") finished at " << time_elapsed << " seconds" << std::endl; + std::cout << i_inv + 1 << " iterations run " << timer.get_t() << " seconds, the rest of " << IP.get_max_iter_inv() - i_inv - 1 << " iterations require " << will_run_time << " seconds." << std::endl; + std::cout << "The program is estimated to stop at " << timer.get_utc_from_time_t(end_time_estimated) << std::endl; + std::cout << std::endl; + } + + // output current state of the model + if (IP.get_if_output_final_model()) { + // io.write_final_model(grid, IP); + io.write_merged_model(grid, IP, "final_model.h5"); + } + if (IP.get_if_output_middle_model()) { + std::string tmp_fname = "middle_model_step_" + int2string_zero_fill(i_inv + 1) + ".h5"; + io.write_merged_model(grid, IP, tmp_fname); + } + + // wait for all processes to finish + synchronize_all_world(); + } // end loop inverse + + // close xdmf file + io.finalize_data_output_file(); + + timer.stop_timer(); + if (id_sim == 0 && myrank == 0) { + std::cout << std::endl; + std::cout << "The program begin at " << timer.get_start_t() << std::endl; + std::cout << "1d model inversion ended at " << timer.get_end_t() << std::endl; + std::cout << "It has run " << timer.get_elapsed_t() << " seconds in total." << std::endl; + std::cout << std::endl; + } +} + +#endif // MAIN_ROUTINES_CALLING_H \ No newline at end of file diff --git a/include/main_routines_earthquake_relocation.h b/include/main_routines_earthquake_relocation.h new file mode 100644 index 0000000..6f3ca59 --- /dev/null +++ b/include/main_routines_earthquake_relocation.h @@ -0,0 +1,149 @@ +#ifndef MAIN_ROUTINES_EARTHQUAKE_RELOCATION_H +#define MAIN_ROUTINES_EARTHQUAKE_RELOCATION_H + +#include +#include +#include "mpi_funcs.h" +#include "config.h" +#include "utils.h" +#include "input_params.h" +#include "grid.h" +#include "io.h" +#include "iterator_selector.h" +#include "iterator.h" +#include "iterator_legacy.h" +#include "iterator_level.h" +#include "source.h" +#include "receiver.h" +#include "main_routines_inversion_mode.h" + + +// calculate traveltime field for all sources-receivers and write to file +void calculate_traveltime_for_all_src_rec(InputParams& IP, Grid& grid, IO_utils& io){ + + // check if this run is in source receiver swap mode + // if not, stop the program + if (IP.get_is_srcrec_swap() == false){ + std::cout << "Error: Source relocation mode must run with swap_src_rec = true" << std::endl; + exit(1); + } + + // reinitialize factors + grid.reinitialize_abcf(); + + // prepare inverstion iteration group in xdmf file + io.prepare_grid_inv_xdmf(0); + + /////////////////////// + // loop for each source + /////////////////////// + + Source src; + + // iterate over sources + for (int i_src = 0; i_src < IP.n_src_this_sim_group; i_src++){ + + const std::string name_sim_src = IP.get_src_name(i_src); + const int id_sim_src = IP.get_src_id(name_sim_src); // global source id + + // check if the source is teleseismic or not + // because teleseismic source is not supported in this mode + bool is_teleseismic = IP.get_if_src_teleseismic(name_sim_src); + + if (is_teleseismic){ + std::cout << "Error: Teleseismic source is not supported in source relocation mode." << std::endl; + exit(1); + } + + // set simu group id and source name for output files/dataset names + io.reset_source_info(id_sim_src, name_sim_src); + + // set source position + src.set_source_position(IP, grid, is_teleseismic, name_sim_src); + + // initialize iterator object + bool first_init = (i_src==0); + + // initialize iterator object + std::unique_ptr It; + select_iterator(IP, grid, src, io, name_sim_src, first_init, is_teleseismic, It, false); + + ///////////////////////// + // run forward simulation + ///////////////////////// + + if (proc_store_srcrec){ + auto srcmap_this = IP.get_src_point(name_sim_src); + + std::cout << "calculating source (" << i_src+1 << "/" << IP.n_src_this_sim_group << "), name: " + << name_sim_src << ", lat: " << srcmap_this.lat + << ", lon: " << srcmap_this.lon << ", dep: " << srcmap_this.dep + << std::endl; + } + + bool write_tmp_T = true; + calculate_or_read_traveltime_field(IP, grid, io, i_src, IP.n_src_this_sim_group, first_init, It, name_sim_src, write_tmp_T); + + } + + // wait for all processes to finish traveltime calculation + synchronize_all_world(); +} + + +std::vector calculate_gradient_objective_function(InputParams& IP, Grid& grid, IO_utils& io, int i_iter){ + + Receiver recs; // here the source is swapped to receiver + + // initialize source parameters (obj, kernel, ) + recs.init_vars_src_reloc(IP); + + // iterate over sources (to obtain gradient of traveltime field T and absolute traveltime, common source differential traveltime, and common receiver differential traveltime) + for (int i_src = 0; i_src < IP.n_src_this_sim_group; i_src++){ + + const std::string name_sim_src = IP.get_src_name(i_src); + const int id_sim_src = IP.get_src_id(name_sim_src); // global source id + + // set simu group id and source name for output files/dataset names + io.reset_source_info(id_sim_src, name_sim_src); + + // load travel time field on grid.T_loc + io.read_T_tmp(grid); + + // calculate travel time at the actual source location (absolute traveltime, common source differential traveltime) + recs.interpolate_and_store_arrival_times_at_rec_position(IP, grid, name_sim_src); + + // calculate gradient at the actual source location + recs.calculate_T_gradient(IP, grid, name_sim_src); + } + + // wait for all processes to finish + synchronize_all_world(); + + // gather all the traveltime to the main process and distribute to all processes + // for calculating the synthetic (common receiver differential traveltime) + IP.gather_traveltimes_and_calc_syn_diff(); + + + // iterate over sources for calculating gradient of objective function + for (int i_src = 0; i_src < IP.n_src_this_sim_group; i_src++){ + const std::string name_sim_src = IP.get_src_name(i_src); + + // calculate gradient of objective function with respect to location and ortime + recs.calculate_grad_obj_src_reloc(IP, name_sim_src); + } + + // compute the objective function + std::vector obj_residual = recs.calculate_obj_reloc(IP, i_iter); + + // sum grad_tau and grad_chi_k of all simulation groups + IP.allreduce_rec_map_grad_src(); + + //synchronize_all_world(); // not necessary here because allreduce is already synchronizing communication + + return obj_residual; +} + + + +#endif // MAIN_ROUTINES_EARTHQUAKE_RELOCATION_H \ No newline at end of file diff --git a/include/main_routines_inversion_mode.h b/include/main_routines_inversion_mode.h new file mode 100644 index 0000000..31b9071 --- /dev/null +++ b/include/main_routines_inversion_mode.h @@ -0,0 +1,293 @@ +#ifndef MAIN_ROUTINES_INVERSION_MODE_H +#define MAIN_ROUTINES_INVERSION_MODE_H + +#include +#include +#include "mpi_funcs.h" +#include "config.h" +#include "utils.h" +#include "input_params.h" +#include "grid.h" +#include "io.h" +#include "iterator_selector.h" +#include "iterator.h" +#include "iterator_legacy.h" +#include "iterator_level.h" +#include "source.h" +#include "receiver.h" +#include "kernel.h" +#include "model_update.h" +#include "lbfgs.h" + + +inline void calculate_or_read_traveltime_field(InputParams& IP, Grid& grid, IO_utils& io, const int i_src, const int N_src, bool first_init, + std::unique_ptr& It, const std::string& name_sim_src, const bool& prerun=false){ + + if (IP.get_is_T_written_into_file(name_sim_src)){ + // load travel time field on grid.T_loc + if (myrank == 0){ + std::cout << "id_sim: " << id_sim << ", reading source (" << i_src+1 << "/" << N_src + << "), name: " + << name_sim_src << ", lat: " << IP.src_map[name_sim_src].lat + << ", lon: " << IP.src_map[name_sim_src].lon << ", dep: " << IP.src_map[name_sim_src].dep + << std::endl; + } + + io.read_T_tmp(grid); + + } else { + // We need to solve eikonal equation + if (myrank == 0){ + std::cout << "id_sim: " << id_sim << ", calculating source (" << i_src+1 << "/" << N_src + << "), name: " + << name_sim_src << ", lat: " << IP.src_map[name_sim_src].lat + << ", lon: " << IP.src_map[name_sim_src].lon << ", dep: " << IP.src_map[name_sim_src].dep + << std::endl; + } + + // solve travel time field on grid.T_loc + It->run_iteration_forward(IP, grid, io, first_init); + + // writeout travel time field + if (prerun) { + // write the temporary traveltime field into file for later use + io.write_T_tmp(grid); + + if (proc_store_srcrec) // only proc_store_srcrec has the src_map object + IP.src_map[name_sim_src].is_T_written_into_file = true; + } + } +} + + + +inline void pre_run_forward_only(InputParams& IP, Grid& grid, IO_utils& io, int i_inv){ + if(world_rank == 0) + std::cout << "preparing traveltimes of common receiver data ..." << std::endl; + + Source src; + Receiver recs; + + // noted that src_map_comm_rec is the subset of src_map + for (int i_src = 0; i_src < IP.n_src_comm_rec_this_sim_group; i_src++){ + + // check if this is the first iteration of entire inversion process + bool first_init = (i_inv == 0 && i_src==0); + + // get source info + std::string name_sim_src = IP.get_src_name_comm(i_src); + int id_sim_src = IP.get_src_id(name_sim_src); // global source id + bool is_teleseismic = IP.get_if_src_teleseismic(name_sim_src); // get is_teleseismic flag + + // set simu group id and source name for output files/dataset names + io.reset_source_info(id_sim_src, name_sim_src); + + // set source position + src.set_source_position(IP, grid, is_teleseismic, name_sim_src); + + // initialize iterator object + std::unique_ptr It; + + select_iterator(IP, grid, src, io, name_sim_src, first_init, is_teleseismic, It, false); + + // calculate or read traveltime field + bool prerun_mode = true; + calculate_or_read_traveltime_field(IP, grid, io, i_src, IP.n_src_comm_rec_this_sim_group, first_init, It, name_sim_src, prerun_mode); + + // interpolate and store traveltime, cs_dif. For cr_dif, only store the traveltime. + recs.interpolate_and_store_arrival_times_at_rec_position(IP, grid, name_sim_src); + // CHS: At this point, all the synthesised arrival times for all the co-located stations are recorded in syn_time_map_sr. When you need to use it later, you can just look it up. + } + + + // wait for all processes to finish + synchronize_all_world(); + + if(world_rank == 0) + std::cout << "synthetic traveltimes of common receiver data have been prepared." << std::endl; + + // gather all the traveltime to the main process and distribute to all processes + // for calculating cr_dif + IP.gather_traveltimes_and_calc_syn_diff(); + + +} + + +// run forward and adjoint simulation and calculate current objective function value and sensitivity kernel if requested +inline std::vector run_simulation_one_step(InputParams& IP, Grid& grid, IO_utils& io, int i_inv, bool& first_src, bool line_search_mode, bool is_save_T){ + + // initialize kernel arrays + if (IP.get_run_mode() == DO_INVERSION || IP.get_run_mode() == INV_RELOC) + grid.initialize_kernels(); + + // reinitialize factors + grid.reinitialize_abcf(); + + /////////////////////////////////////////////////////////////////////// + // compute the synthetic common receiver differential traveltime first + /////////////////////////////////////////////////////////////////////// + + // prepare synthetic traveltime for all earthquakes, if + // 1. common receiver data exists; + // 2. we use common receiver data to update model; (cr + not swap) or (cs + swap) + // 3. we do inversion + if ( src_pair_exists && + ((IP.get_use_cr() && !IP.get_is_srcrec_swap()) + || (IP.get_use_cs() && IP.get_is_srcrec_swap()) ) + && (IP.get_run_mode() == DO_INVERSION || IP.get_run_mode() == INV_RELOC)){ + pre_run_forward_only(IP, grid, io, i_inv); + } + // + // loop over all sources + // + + Source src; + Receiver recs; + + if(world_rank == 0) + std::cout << "computing traveltime field, adjoint field and kernel ..." << std::endl; + + // iterate over sources + for (int i_src = 0; i_src < IP.n_src_this_sim_group; i_src++){ + + // check if this is the first iteration of entire inversion process + bool first_init = (i_inv == 0 && i_src==0); + + // get source info + const std::string name_sim_src = IP.get_src_name(i_src); // source name + const int id_sim_src = IP.get_src_id(name_sim_src); // global source id + bool is_teleseismic = IP.get_if_src_teleseismic(name_sim_src); // get is_teleseismic flag + + // set simu group id and source name for output files/dataset names + io.reset_source_info(id_sim_src, name_sim_src); + + // output initial field + if(first_src && IP.get_if_output_source_field()) { + // write true solution + if (if_test){ + io.write_true_solution(grid); + } + + first_src = false; + } + + ///////////////////////// + // run forward simulation + ///////////////////////// + + // (re) initialize source object and set to grid + src.set_source_position(IP, grid, is_teleseismic, name_sim_src); + + // initialize iterator object + std::unique_ptr It; + + if (!hybrid_stencil_order){ + select_iterator(IP, grid, src, io, name_sim_src, first_init, is_teleseismic, It, false); + + // if traveltime field has been wriiten into the file, we choose to read the traveltime data. + calculate_or_read_traveltime_field(IP, grid, io, i_src, IP.n_src_this_sim_group, first_init, It, name_sim_src, is_save_T); + + } else { + // hybrid stencil mode + std::cout << "\nrunnning in hybrid stencil mode\n" << std::endl; + + // run 1st order forward simulation + std::unique_ptr It_pre; + IP.set_stencil_order(1); + IP.set_conv_tol(IP.get_conv_tol()*100.0); + select_iterator(IP, grid, src, io, name_sim_src, first_init, is_teleseismic, It_pre, false); + calculate_or_read_traveltime_field(IP, grid, io, i_src, IP.n_src_this_sim_group, first_init, It_pre, name_sim_src, is_save_T); + + // run 3rd order forward simulation + IP.set_stencil_order(3); + IP.set_conv_tol(IP.get_conv_tol()/100.0); + select_iterator(IP, grid, src, io, name_sim_src, first_init, is_teleseismic, It, true); + calculate_or_read_traveltime_field(IP, grid, io, i_src, IP.n_src_this_sim_group, first_init, It, name_sim_src, is_save_T); + } + + // output the result of forward simulation + // ignored for inversion mode. + if (!line_search_mode && IP.get_if_output_source_field()) { + + // output T (result timetable) + io.write_T(grid, i_inv); + + // output T0v + //io.write_T0v(grid,i_inv); // initial Timetable + // output u (true solution) + //if (if_test) + // io.write_u(grid); // true Timetable + // output tau + //io.write_tau(grid, i_inv); // calculated deviation + // output residual (residual = true_solution - result) + //if (if_test) + // io.write_residual(grid); // this will over write the u_loc, so we need to call write_u_h5 first + } + // calculate the arrival times at each receivers + recs.interpolate_and_store_arrival_times_at_rec_position(IP, grid, name_sim_src); + + ///////////////////////// + // run adjoint simulation + ///////////////////////// + + // if (myrank == 0){ + // std::cout << "calculating adjoint field, source (" << i_src+1 << "/" << (int)IP.src_id2name.size() << "), name: " + // << name_sim_src << ", lat: " << IP.src_map[name_sim_src].lat + // << ", lon: " << IP.src_map[name_sim_src].lon << ", dep: " << IP.src_map[name_sim_src].dep + // << std::endl; + // } + + if (IP.get_run_mode()==DO_INVERSION || IP.get_run_mode()==INV_RELOC){ + // calculate adjoint source + recs.calculate_adjoint_source(IP, name_sim_src); + // run iteration for adjoint field calculation + int adj_type = 0; // compute adjoint field + It->run_iteration_adjoint(IP, grid, io, adj_type); + // run iteration for density of the adjoint field + adj_type = 1; // compute adjoint field + It->run_iteration_adjoint(IP, grid, io, adj_type); + // calculate sensitivity kernel + calculate_sensitivity_kernel(grid, IP, name_sim_src); + if (subdom_main && !line_search_mode && IP.get_if_output_source_field()) { + // adjoint field will be output only at the end of subiteration + // output the result of adjoint simulation + io.write_adjoint_field(grid,i_inv); + } + + // io.write_adjoint_field(grid,i_inv); + + // check adjoint source + // if (proc_store_srcrec){ + // for (auto iter = IP.rec_map.begin(); iter != IP.rec_map.end(); iter++){ + // std::cout << "rec id: " << iter->second.id << ", rec name: " << iter->second.name << ", adjoint source: " << iter->second.adjoint_source << std::endl; + // } + // } + + } // end if run_mode == DO_INVERSION + + // wait for all processes to finish + // this should not be called here, for the case that the simultaneous run group has different number of sources + //synchronize_all_world(); + + } // end for i_src + // synchronize all processes + synchronize_all_world(); + + // gather all the traveltime to the main process and distribute to all processes + // for calculating the synthetic common receiver differential traveltime + if ( IP.get_run_mode()==ONLY_FORWARD || // case 1. if we are doing forward modeling, traveltime is not prepared for computing cr_dif data. Now we need to compute it + (!IP.get_use_cr() && !IP.get_is_srcrec_swap()) || // case 2-1, we do inversion, but we do not use cr data (cr + no swap) + (!IP.get_use_cs() && IP.get_is_srcrec_swap())){ // case 2-2, we do inversion, but we do not use cr data (cs + swap) + IP.gather_traveltimes_and_calc_syn_diff(); + } + // compute all residual and obj + std::vector obj_residual = recs.calculate_obj_and_residual(IP); + + + // return current objective function value + return obj_residual; +} + + +#endif // MAIN_ROUTINES_INVERSION_MODE_H \ No newline at end of file diff --git a/include/model_optimization_routines.h b/include/model_optimization_routines.h new file mode 100644 index 0000000..eac1baa --- /dev/null +++ b/include/model_optimization_routines.h @@ -0,0 +1,496 @@ +#ifndef MODEL_OPTIMIZATION_ROUTINES_H +#define MODEL_OPTIMIZATION_ROUTINES_H + +#include +#include +#include "mpi_funcs.h" +#include "config.h" +#include "utils.h" +#include "input_params.h" +#include "grid.h" +#include "io.h" +#include "main_routines_calling.h" +#include "iterator_selector.h" +#include "iterator.h" +#include "iterator_legacy.h" +#include "iterator_level.h" +#include "source.h" +#include "receiver.h" +#include "kernel.h" +#include "model_update.h" +#include "lbfgs.h" +#include "objective_function_utils.h" + + +// do model update by gradient descent +inline void model_optimize(InputParams& IP, Grid& grid, IO_utils& io, int i_inv, \ + CUSTOMREAL& v_obj_inout, CUSTOMREAL& old_v_obj, bool& first_src, std::ofstream& out_main) { + + // check kernel density + check_kernel_density(grid, IP); + + // sum kernels among all simultaneous runs + sumup_kernels(grid); + + // write out original kernels + if (id_sim==0 && subdom_main && IP.get_if_output_kernel() && (IP.get_if_output_in_process() || i_inv >= IP.get_max_iter_inv() - 2 || i_inv == 0)) { + // store kernel only in the first src datafile + io.change_group_name_for_model(); + + // write kernel + io.write_Ks(grid, i_inv); + io.write_Keta(grid, i_inv); + io.write_Kxi(grid, i_inv); + + // write kernel density + io.write_Ks_density(grid, i_inv); + io.write_Kxi_density(grid, i_inv); + io.write_Keta_density(grid, i_inv); + } + + // smooth kernels (multigrid, and kdensity normalization) + smooth_kernels(grid, IP); + + // write out modified kernels + if (id_sim==0 && subdom_main && IP.get_if_output_kernel() && (IP.get_if_output_in_process() || i_inv >= IP.get_max_iter_inv() - 2 || i_inv == 0)) { + // store kernel only in the first src datafile + io.change_group_name_for_model(); + + // // kernel over density + // io.write_Ks_over_Kden(grid, i_inv); + // io.write_Keta_over_Kden(grid, i_inv); + // io.write_Kxi_over_Kden(grid, i_inv); + + // kernel over density with smoothing + io.write_Ks_update(grid, i_inv); + io.write_Keta_update(grid, i_inv); + io.write_Kxi_update(grid, i_inv); + + // density with smoothing + io.write_Ks_density_update(grid, i_inv); + io.write_Kxi_density_update(grid, i_inv); + io.write_Keta_density_update(grid, i_inv); + } + + // change stepsize + // Option 1: the step length is modulated when obj changes. + if (step_method == OBJ_DEFINED){ + if(i_inv != 0){ + if (v_obj_inout < old_v_obj) { + step_length_init = std::min((CUSTOMREAL)0.02, step_length_init); + if(myrank == 0 && id_sim == 0){ + std::cout << std::endl; + std::cout << "The obj keeps decreasing, from " << old_v_obj << " to " << v_obj_inout + << ", the step length is " << step_length_init << std::endl; + std::cout << std::endl; + } + } else if (v_obj_inout >= old_v_obj) { + step_length_init = std::max((CUSTOMREAL)0.0001, step_length_init*step_length_decay); + if(myrank == 0 && id_sim == 0){ + std::cout << std::endl; + std::cout << "The obj keep increases, from " << old_v_obj << " to " << v_obj_inout + << ", the step length decreases from " << step_length_init/step_length_decay + << " to " << step_length_init << std::endl; + std::cout << std::endl; + } + } + } else { + if(myrank == 0 && id_sim == 0){ + std::cout << std::endl; + std::cout << "At the first iteration, the step length is " << step_length_init << std::endl; + std::cout << std::endl; + } + } + } else if (step_method == GRADIENT_DEFINED){ + // Option 2: we modulate the step length according to the angle between the previous and current gradient directions. + // If the angle is less than XX degree, which means the model update direction is successive, we should enlarge the step size + // Otherwise, the step length should decrease + CUSTOMREAL angle = direction_change_of_model_update(grid); + if(i_inv != 0){ + if (angle > step_length_gradient_angle){ + CUSTOMREAL old_step_length = step_length_init; + step_length_init = std::max((CUSTOMREAL)0.0001, step_length_init * step_length_down); + if(myrank == 0 && id_sim == 0){ + std::cout << std::endl; + std::cout << "The angle between two update darections is " << angle + << ". Because the angle is greater than " << step_length_gradient_angle << " degree, the step length decreases from " + << old_step_length << " to " << step_length_init << std::endl; + std::cout << std::endl; + } + } else if (angle <= step_length_gradient_angle) { + CUSTOMREAL old_step_length = step_length_init; + step_length_init = std::min((CUSTOMREAL)0.02, step_length_init * step_length_up); + if(myrank == 0 && id_sim == 0){ + std::cout << std::endl; + std::cout << "The angle between two update darections is " << angle + << ". Because the angle is less than " << step_length_gradient_angle << " degree, the step length increases from " + << old_step_length << " to " << step_length_init << std::endl; + std::cout << std::endl; + } + } + } else { + if(myrank == 0 && id_sim == 0){ + std::cout << std::endl; + std::cout << "At the first iteration, the step length is " << step_length_init << std::endl; + std::cout << std::endl; + } + } + } else { + std::cout << std::endl; + std::cout << "No supported method for step size change, step keep the same: " << step_length_init << std::endl; + std::cout << std::endl; + } + + // broadcast the step_length + broadcast_cr_single(step_length_init,0); + + // update the model with the initial step size + set_new_model(grid, step_length_init); + + // make station correction + IP.station_correction_update(step_length_init_sc); + + // writeout temporary xdmf file + if (IP.get_verbose_output_level()) + io.update_xdmf_file(); + + synchronize_all_world(); +} + + +inline std::vector model_optimize_halve_stepping(InputParams& IP, Grid& grid, IO_utils& io, int i_inv, CUSTOMREAL& v_obj_inout, bool& first_src, std::ofstream& out_main) { + + CUSTOMREAL step_length = step_length_init; // step size init is global variable + CUSTOMREAL diff_obj = - 9999999999; + CUSTOMREAL v_obj_old = v_obj_inout; + CUSTOMREAL v_obj_new = 0.0; + std::vector v_obj_misfit_new = std::vector(10, 0.0); + int sub_iter_count = 0; + + // sum kernels among all simultaneous runs + sumup_kernels(grid); + + // smooth kernels + smooth_kernels(grid, IP); + + // backup the initial model + grid.back_up_fun_xi_eta_bcf(); + + // update the model with the initial step size + set_new_model(grid, step_length); + + + if (IP.get_verbose_output_level()) { + // store kernel only in the first src datafile + io.change_group_name_for_model(); + + // output updated velocity models + io.write_Ks(grid, i_inv); + io.write_Keta(grid, i_inv); + io.write_Kxi(grid, i_inv); + + // output descent direction + io.write_Ks_update(grid, i_inv); + io.write_Keta_update(grid, i_inv); + io.write_Kxi_update(grid, i_inv); + } + + // writeout temporary xdmf file + if (IP.get_verbose_output_level()) + io.update_xdmf_file(); + + synchronize_all_world(); + + // loop till + while (sub_iter_count < max_sub_iterations) { + // check the new objective function value + // v_obj_new = run_simulation_one_step(IP, grid, io, i_inv, first_src, true); // run simulations with line search mode + v_obj_misfit_new = run_simulation_one_step(IP, grid, io, i_inv, first_src, true, false); // run simulations with line search mode + v_obj_new = v_obj_misfit_new[0]; + // if the new objective function value is larger than the old one, make the step width to be half of the previous one + diff_obj = v_obj_new - v_obj_old; + + if ( diff_obj > _0_CR // if the objective function value is larger than the old one + || std::abs(diff_obj/v_obj_old) > MAX_DIFF_RATIO_VOBJ) { // if the objective function reduced too much ) { + + // set step length just for writing out + step_length_init = step_length; + // print status + write_objective_function(IP, i_inv, v_obj_misfit_new, out_main, "sub iter"); + + grid.restore_fun_xi_eta_bcf(); + step_length *= HALVE_STEP_RATIO; + set_new_model(grid, step_length); + + sub_iter_count++; + } else { + // if the new objective function value is smaller than the old one, make the step width to be twice of the previous one + goto end_of_sub_iteration; + } + + } + +end_of_sub_iteration: + + v_obj_inout = v_obj_new; + step_length_init = step_length/(HALVE_STEP_RATIO)*HALVE_STEP_RESTORAION_RATIO; // use this step size for the next inversion + + // write adjoint field + int next_i_inv = i_inv + 1; + if (subdom_main && IP.get_if_output_source_field()) + io.write_adjoint_field(grid,next_i_inv); + + return v_obj_misfit_new; + +} + + +// do model update +inline bool model_optimize_lbfgs(InputParams& IP, Grid& grid, IO_utils& io, int i_inv, CUSTOMREAL& v_obj_inout, bool& first_src, std::ofstream& out_main) { + + int subiter_count = 0; // subiteration count + //CUSTOMREAL qp_0 = _0_CR; // store initial p_k * grad(f_k) (descent_direction * gradient) + CUSTOMREAL qp_t = _0_CR; // store p_k * grad(f_k) + CUSTOMREAL td = _0_CR; // wolfes right step + CUSTOMREAL tg = _0_CR; // wolfes left step + CUSTOMREAL step_length = step_length_init; // step size init is global variable + CUSTOMREAL v_obj_reg = _0_CR; // regularization term == q_t + //CUSTOMREAL q_0 = _0_CR; // initial cost function + CUSTOMREAL q_t = _0_CR; // current cost function + std::vector v_obj_misfit_new = std::vector(10, 0.0); + + // + // initialize + // + if (i_inv == 0) { + // initialize regularization + // regularization_penalty[:] = 1.0 + init_regulaization_penalty_with_one(grid); + + // calculate volume_domain = SquaredL2Norm(regularization_penalty) + volume_domain = compute_volume_domain(grid); + + // volume_domain /= N_params + volume_domain /= N_params; + + // weight_Tikonov = penalty_weight / volume_domain + weight_Tikonov = regularization_weight / volume_domain; + weight_Tikonov_ani = regularization_weight; + std::cout << "DEBUG: weight_Tikonov: " << weight_Tikonov << std::endl; + + // calculate damp_weights + compute_damp_weights(grid); + + // calculate gradient (run onestep forward+adjoint) not necessary to do here. already done + //v_obj_misfit_new = run_simulation_one_step(IP, grid, io, i_inv, first_src, true); + + // Q0 = initial obj + q_0 = v_obj_inout; + + // sum kernels among all simultaneous runs + sumup_kernels(grid); + + // smooth gradient + smooth_kernels(grid, IP); + + // calc regularization penalties + calculate_regularization_penalty(grid); + + //// smooth calculated grad regularization penalty + //smooth_gradient_regularization(grid); + + // calc (update) obj_regl = squaredL2Norm(regularization_penalty) + v_obj_reg = calculate_regularization_obj(grid); + + // Q0 += 0.5*weight_Tiknov*obj_regl + q_0 += v_obj_reg; + + // init_grad += weight_Tikonov * gadient_regularization_penalty + add_regularization_grad(grid); + + // store model and gradient + store_model_and_gradient(grid, i_inv); + + // log out + if(myrank == 0 && id_sim ==0) { + out_main \ + << std::setw(5) << i_inv \ + << "," << std::setw(5) << subiter_count \ + << "," << std::setw(15) << step_length \ + << "," << std::setw(15) << q_0 \ + << "," << std::setw(15) << q_t \ + << "," << std::setw(15) << v_obj_reg \ + << "," << std::setw(15) << qp_0 \ + << "," << std::setw(15) << qp_t \ + << "," << std::setw(15) << td \ + << "," << std::setw(15) << tg \ + << "," << std::setw(15) << wolfe_c1*qp_0 \ + << "," << std::setw(15) << wolfe_c2*qp_0 \ + << "," << std::setw(15) << "init" << std::endl; + } + } + + // backup the initial model + grid.back_up_fun_xi_eta_bcf(); + + // update the model with the initial step size + if (IP.get_verbose_output_level() && id_sim==0) { + // store kernel only in the first src datafile + io.change_group_name_for_model(); + + // output updated velocity models + io.write_Ks(grid, i_inv); + io.write_Keta(grid, i_inv); + io.write_Kxi(grid, i_inv); + + // output descent direction + io.write_Ks_descent_dir(grid, i_inv); + io.write_Keta_descent_dir(grid, i_inv); + io.write_Kxi_descent_dir(grid, i_inv); + } + + // writeout temporary xdmf file + if (IP.get_verbose_output_level()&& id_sim==0) + io.update_xdmf_file(); + + // + // iteration + // + if (i_inv > 0) { + // sum kernels among all simultaneous runs + sumup_kernels(grid); + + // smooth kernels + smooth_kernels(grid, IP); + } + + // compute descent direction + calc_descent_direction(grid, i_inv, IP); + + // smooth descent direction + smooth_descent_direction(grid); + + // calc qp_0 = inital grad * descent direction + qp_0 = compute_q_k(grid); + + // loop wolfes subiterations + bool wolfe_cond_ok = false; + while (wolfe_cond_ok != true) { + + // initial guess for isub = 0 + if (i_inv == 0 && subiter_count == 0) + initial_guess_step(grid, step_length, 1.0); + else if (i_inv == 1 && subiter_count == 0) + initial_guess_step(grid, step_length, LBFGS_RELATIVE_step_length); + + //// Update model + set_new_model(grid, step_length); + + //// calculate gradient (run onestep forward+adjoint) + v_obj_misfit_new = run_simulation_one_step(IP, grid, io, i_inv, first_src, true, false); + + //// Qt update (=current obj) + q_t = v_obj_misfit_new[0]; + + // sum kernels among all simultaneous runs + sumup_kernels(grid); + + //// smooth gradient + smooth_kernels(grid, IP); + + //// calculate regularization to grad + calculate_regularization_penalty(grid); + + //// smooth calculated grad regularization penalty + //smooth_gradient_regularization(grid); + + //// add regularization term to Qt (Qt += 0.5 * obj_regl ) + v_obj_reg = calculate_regularization_obj(grid); + q_t += v_obj_reg; + + //// current grad += weight_Tikonov * gadient_regularization_penalty + add_regularization_grad(grid); + + //// Qpt = Inner product(current_grad * descent_direction) + qp_t = compute_q_k(grid); + + //// check wolfe conditions + wolfe_cond_ok = check_wolfe_cond(grid, q_0, q_t, qp_0, qp_t, td, tg, step_length); + + // update the model with the initial step size + if (IP.get_verbose_output_level() && id_sim==0) { + // store kernel only in the first src datafile + io.change_group_name_for_model(); + + // gradient + io.write_Ks_update(grid, i_inv*100+subiter_count); + io.write_Keta_update(grid, i_inv*100+subiter_count); + io.write_Kxi_update(grid, i_inv*100+subiter_count); + + // output descent direction + io.write_Ks_descent_dir(grid, i_inv*100+subiter_count); + io.write_Keta_descent_dir(grid, i_inv*100+subiter_count); + io.write_Kxi_descent_dir(grid, i_inv*100+subiter_count); + + } + + // writeout temporary xdmf file + if (IP.get_verbose_output_level()&& id_sim==0) + io.update_xdmf_file(); + + // log out + if(myrank == 0 && id_sim ==0) + out_main \ + << std::setw(5) << i_inv \ + << "," << std::setw(5) << subiter_count \ + << "," << std::setw(15) << step_length \ + << "," << std::setw(15) << q_0 \ + << "," << std::setw(15) << q_t \ + << "," << std::setw(15) << v_obj_reg \ + << "," << std::setw(15) << qp_0 \ + << "," << std::setw(15) << qp_t \ + << "," << std::setw(15) << td \ + << "," << std::setw(15) << tg \ + << "," << std::setw(15) << wolfe_c1*qp_0 \ + << "," << std::setw(15) << wolfe_c2*qp_0 \ + << "," << std::setw(15) << wolfe_cond_ok << std::endl; + + if (wolfe_cond_ok) { + goto end_of_subiteration; + } else if (subiter_count > max_sub_iterations){ + // reached max subiter + // exit + std::cout << "reached max subiterations" << std::endl; + + return false; + + } else { + // wolfe conditions not satisfied + subiter_count++; + + grid.restore_fun_xi_eta_bcf(); + } + + } + +end_of_subiteration: + //// store model and gradient, + store_model_and_gradient(grid, i_inv+1); + + //// Q0=Qt + q_0 = q_t; + qp_0 = qp_t; + + step_length_init = step_length; // use current step size for the next iteration + + + if (myrank == 0) + std::cout << "Wolfe conditions satisfied at iteration " << subiter_count << std::endl; + + return true; + +} + + + +#endif // MODEL_OPTIMIZATION_ROUTINES_H \ No newline at end of file diff --git a/include/model_update.h b/include/model_update.h new file mode 100644 index 0000000..08eaac4 --- /dev/null +++ b/include/model_update.h @@ -0,0 +1,485 @@ +#ifndef MODEL_UPDATE_H +#define MODEL_UPDATE_H + +#include +#include "config.h" +#include "grid.h" +#include "smooth.h" +#include "smooth_descent_dir.h" +#include "smooth_grad_regul.h" +#include "lbfgs.h" + + +// generate smoothed kernels (K*_update_loc) from the kernels (K*_loc) +// before doing this, K*_loc should be summed up among all simultaneous runs (by calling sumup_kernels) +// before doing this, K*_update_loc has no meaning (unavailable) +void smooth_kernels(Grid& grid, InputParams& IP) { + + if (subdom_main){ // parallel level 3 + + if (id_sim==0){ // parallel level 1 + // initiaize update params + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + grid.Ks_update_loc_previous[I2V(i,j,k)] = grid.Ks_update_loc[I2V(i,j,k)]; + grid.Keta_update_loc_previous[I2V(i,j,k)] = grid.Keta_update_loc[I2V(i,j,k)]; + grid.Kxi_update_loc_previous[I2V(i,j,k)] = grid.Kxi_update_loc[I2V(i,j,k)]; + grid.Ks_update_loc[I2V(i,j,k)] = _0_CR; + grid.Keta_update_loc[I2V(i,j,k)] = _0_CR; + grid.Kxi_update_loc[I2V(i,j,k)] = _0_CR; + // grid.Ks_density_update_loc[I2V(i,j,k)] = _0_CR; + // grid.Kxi_density_update_loc[I2V(i,j,k)] = _0_CR; + // grid.Keta_density_update_loc[I2V(i,j,k)] = _0_CR; + } + } + } + + // check kernel + CUSTOMREAL max_kernel = _0_CR; + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + max_kernel = std::max(max_kernel, std::abs(grid.Ks_loc[I2V(i,j,k)])); + } + } + } + CUSTOMREAL tmp = 0; + allreduce_cr_single_max(max_kernel, tmp); + max_kernel = tmp; + + if (max_kernel <= eps) { + std::cout << "Error: max_kernel is near zero (less than 10^-12), check data residual and whether no data is used" << std::endl; + exit(1); + } + + if (smooth_method == 0) { + // Ks_loc, Keta_loc, Kxi_loc to be 0 for ghost layers to eliminate the effect of overlapping boundary + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + + if (i == 0 && !grid.i_first()) { + grid.Ks_loc[I2V(i,j,k)] = _0_CR; + grid.Keta_loc[I2V(i,j,k)] = _0_CR; + grid.Kxi_loc[I2V(i,j,k)] = _0_CR; + grid.Ks_density_loc[I2V(i,j,k)] = _0_CR; + grid.Kxi_density_loc[I2V(i,j,k)] = _0_CR; + grid.Keta_density_loc[I2V(i,j,k)] = _0_CR; + } + if (i == loc_I-1 && !grid.i_last()) { + grid.Ks_loc[I2V(i,j,k)] = _0_CR; + grid.Keta_loc[I2V(i,j,k)] = _0_CR; + grid.Kxi_loc[I2V(i,j,k)] = _0_CR; + grid.Ks_density_loc[I2V(i,j,k)] = _0_CR; + grid.Kxi_density_loc[I2V(i,j,k)] = _0_CR; + grid.Keta_density_loc[I2V(i,j,k)] = _0_CR; + } + if (j == 0 && !grid.j_first()) { + grid.Ks_loc[I2V(i,j,k)] = _0_CR; + grid.Keta_loc[I2V(i,j,k)] = _0_CR; + grid.Kxi_loc[I2V(i,j,k)] = _0_CR; + grid.Ks_density_loc[I2V(i,j,k)] = _0_CR; + grid.Kxi_density_loc[I2V(i,j,k)] = _0_CR; + grid.Keta_density_loc[I2V(i,j,k)] = _0_CR; + } + if (j == loc_J-1 && !grid.j_last()) { + grid.Ks_loc[I2V(i,j,k)] = _0_CR; + grid.Keta_loc[I2V(i,j,k)] = _0_CR; + grid.Kxi_loc[I2V(i,j,k)] = _0_CR; + grid.Ks_density_loc[I2V(i,j,k)] = _0_CR; + grid.Kxi_density_loc[I2V(i,j,k)] = _0_CR; + grid.Keta_density_loc[I2V(i,j,k)] = _0_CR; + } + if (k == 0 && !grid.k_first()) { + grid.Ks_loc[I2V(i,j,k)] = _0_CR; + grid.Keta_loc[I2V(i,j,k)] = _0_CR; + grid.Kxi_loc[I2V(i,j,k)] = _0_CR; + grid.Ks_density_loc[I2V(i,j,k)] = _0_CR; + grid.Kxi_density_loc[I2V(i,j,k)] = _0_CR; + grid.Keta_density_loc[I2V(i,j,k)] = _0_CR; + } + if (k == loc_K-1 && !grid.k_last()) { + grid.Ks_loc[I2V(i,j,k)] = _0_CR; + grid.Keta_loc[I2V(i,j,k)] = _0_CR; + grid.Kxi_loc[I2V(i,j,k)] = _0_CR; + grid.Ks_density_loc[I2V(i,j,k)] = _0_CR; + grid.Kxi_density_loc[I2V(i,j,k)] = _0_CR; + grid.Keta_density_loc[I2V(i,j,k)] = _0_CR; + } + } + } + } + + // grid based smoothing + smooth_inv_kernels_orig(grid, IP); + } else if (smooth_method == 1) { + // CG smoothing + smooth_inv_kernels_CG(grid, smooth_lr, smooth_lt, smooth_lp); + } + + // shared values on the boundary + grid.send_recev_boundary_data(grid.Ks_update_loc); + grid.send_recev_boundary_data(grid.Keta_update_loc); + grid.send_recev_boundary_data(grid.Kxi_update_loc); + grid.send_recev_boundary_data(grid.Ks_density_update_loc); + grid.send_recev_boundary_data(grid.Kxi_density_update_loc); + grid.send_recev_boundary_data(grid.Keta_density_update_loc); + + grid.send_recev_boundary_data_kosumi(grid.Ks_update_loc); + grid.send_recev_boundary_data_kosumi(grid.Keta_update_loc); + grid.send_recev_boundary_data_kosumi(grid.Kxi_update_loc); + grid.send_recev_boundary_data_kosumi(grid.Ks_density_update_loc); + grid.send_recev_boundary_data_kosumi(grid.Kxi_density_update_loc); + grid.send_recev_boundary_data_kosumi(grid.Keta_density_update_loc); + + } // end if id_sim == 0 + + // send the updated model to all the simultaneous run + broadcast_cr_inter_sim(grid.Ks_update_loc, loc_I*loc_J*loc_K, 0); + broadcast_cr_inter_sim(grid.Kxi_update_loc, loc_I*loc_J*loc_K, 0); + broadcast_cr_inter_sim(grid.Keta_update_loc, loc_I*loc_J*loc_K, 0); + broadcast_cr_inter_sim(grid.Ks_density_update_loc, loc_I*loc_J*loc_K, 0); + broadcast_cr_inter_sim(grid.Kxi_density_update_loc, loc_I*loc_J*loc_K, 0); + broadcast_cr_inter_sim(grid.Keta_density_update_loc, loc_I*loc_J*loc_K, 0); + + // send the previous updated model to all the simultaneous run + broadcast_cr_inter_sim(grid.Ks_update_loc_previous, loc_I*loc_J*loc_K, 0); + broadcast_cr_inter_sim(grid.Kxi_update_loc_previous, loc_I*loc_J*loc_K, 0); + broadcast_cr_inter_sim(grid.Keta_update_loc_previous, loc_I*loc_J*loc_K, 0); + + } // end if subdom_main + + synchronize_all_world(); +} + + +// smooth gradient regularization term +void smooth_gradient_regularization(Grid& grid) { + + if (subdom_main && id_sim==0){ // only id_sim==0 has values for these arrays + if (smooth_method == 0) { + // grid based smoothing + smooth_gradient_regularization_orig(grid); + } else if (smooth_method == 1) { + // CG smoothing + smooth_gradient_regularization_CG(grid, smooth_lr, smooth_lt, smooth_lp); + } + + grid.send_recev_boundary_data(grid.fun_gradient_regularization_penalty_loc); + grid.send_recev_boundary_data(grid.eta_gradient_regularization_penalty_loc); + grid.send_recev_boundary_data(grid.xi_gradient_regularization_penalty_loc); + } +} + + +void smooth_descent_direction(Grid& grid){ + if (subdom_main){ + if (id_sim == 0) { // calculation of the update model is only done in the main simultaneous run + if (smooth_method == 0) { + // grid based smoothing + smooth_descent_dir(grid); + } else if (smooth_method == 1) { + // CG smoothing + smooth_descent_dir_CG(grid, smooth_lr, smooth_lt, smooth_lp); + } + + // shared values on the boundary + grid.send_recev_boundary_data( grid.Ks_descent_dir_loc); + grid.send_recev_boundary_data(grid.Keta_descent_dir_loc); + grid.send_recev_boundary_data( grid.Kxi_descent_dir_loc); + + } // end if id_sim == 0 + + // send the updated model to all the simultaneous run + broadcast_cr_inter_sim( grid.Ks_descent_dir_loc, loc_I*loc_J*loc_K, 0); + broadcast_cr_inter_sim( grid.Kxi_descent_dir_loc, loc_I*loc_J*loc_K, 0); + broadcast_cr_inter_sim(grid.Keta_descent_dir_loc, loc_I*loc_J*loc_K, 0); + + } +} + + +void calc_descent_direction(Grid& grid, int i_inv, InputParams& IP) { + + if (subdom_main) { + + // routines for LBFGS + if (optim_method == LBFGS_MODE) { + + // calculate the descent direction + if (i_inv > 0) { + calculate_descent_direction_lbfgs(grid, i_inv); + // use gradient for the first iteration + } else { + int n_grid = loc_I*loc_J*loc_K; + + // first time, descent direction = - precond * gradient + // inverse the gradient to fit the update scheme for LBFGS + for (int i = 0; i < n_grid; i++){ + grid.Ks_descent_dir_loc[i] = - _1_CR* grid.Ks_update_loc[i]; + grid.Keta_descent_dir_loc[i] = - _1_CR* grid.Keta_update_loc[i]; + grid.Kxi_descent_dir_loc[i] = - _1_CR* grid.Kxi_update_loc[i]; + //grid.Ks_descent_dir_loc[i] = - _1_CR* grid.Ks_loc[i]; + //grid.Keta_descent_dir_loc[i] = - _1_CR* grid.Keta_loc[i]; + //grid.Kxi_descent_dir_loc[i] = - _1_CR* grid.Kxi_loc[i]; + + } + } + } else { + // return error + std::cout << "Error: optim_method is not set to LBFGS_MODE (=2)" << std::endl; + exit(1); + } + + + } // end if subdom_main + + synchronize_all_world(); + +} + +CUSTOMREAL direction_change_of_model_update(Grid& grid){ + CUSTOMREAL norm_grad = _0_CR; + CUSTOMREAL norm_grad_previous = _0_CR; + CUSTOMREAL inner_product = _0_CR; + CUSTOMREAL cos_angle = _0_CR; + CUSTOMREAL angle = _0_CR; + if (subdom_main) { + // initiaize update params + inner_product = dot_product(grid.Ks_update_loc_previous, grid.Ks_update_loc, loc_I*loc_J*loc_K); + norm_grad = dot_product(grid.Ks_update_loc, grid.Ks_update_loc, loc_I*loc_J*loc_K); + norm_grad_previous = dot_product(grid.Ks_update_loc_previous, grid.Ks_update_loc_previous, loc_I*loc_J*loc_K); + + CUSTOMREAL tmp; + allreduce_cr_single(inner_product,tmp); + inner_product = tmp; + + allreduce_cr_single(norm_grad,tmp); + norm_grad = tmp; + + allreduce_cr_single(norm_grad_previous,tmp); + norm_grad_previous = tmp; + + cos_angle = inner_product / (std::sqrt(norm_grad) * std::sqrt(norm_grad_previous)); + angle = acos(cos_angle) * RAD2DEG; + } + + return angle; +} + + +void set_new_model(Grid& grid, CUSTOMREAL step_length_new, bool init_bfgs=false) { + + if (subdom_main) { + + // for LBFGS mode. K*_update_loc is not directly the descent direction but smoothed gradient + // so for non LBFGS_mode, nextstep will be calculated with K*_update_loc + if (optim_method != LBFGS_MODE) { + // // get the scaling factor + // CUSTOMREAL Linf_Ks = _0_CR, Linf_Keta = _0_CR, Linf_Kxi = _0_CR; + // for (int k = 1; k < loc_K-1; k++) { + // for (int j = 1; j < loc_J-1; j++) { + // for (int i = 1; i < loc_I-1; i++) { + // Linf_Ks = std::max(Linf_Ks, std::abs(grid.Ks_update_loc[I2V(i,j,k)])); + // Linf_Keta = std::max(Linf_Keta, std::abs(grid.Keta_update_loc[I2V(i,j,k)])); + // Linf_Kxi = std::max(Linf_Kxi, std::abs(grid.Kxi_update_loc[I2V(i,j,k)])); + // } + // } + // } + + // // get the maximum scaling factor among subdomains + // CUSTOMREAL Linf_tmp; + // allreduce_cr_single_max(Linf_Ks, Linf_tmp); Linf_Ks = Linf_tmp; + // allreduce_cr_single_max(Linf_Keta, Linf_tmp); Linf_Keta = Linf_tmp; + // allreduce_cr_single_max(Linf_Kxi, Linf_tmp); Linf_Kxi = Linf_tmp; + + // CUSTOMREAL Linf_all = _0_CR; + // Linf_all = std::max(Linf_Ks, std::max(Linf_Keta, Linf_Kxi)); + + // // if (myrank == 0 && id_sim == 0) + // // std::cout << "Scaling factor for all kernels: " << Linf_all << std::endl; + // // std::cout << "Scaling factor for model update for Ks, Keta, Kx, stepsize: " << Linf_Ks << ", " << Linf_Keta << ", " << Linf_Kxi << ", " << step_length_new << std::endl; + + + // Linf_Ks = Linf_all; + // Linf_Keta = Linf_all; + // Linf_Kxi = Linf_all; + + // kernel update has been rescaled in "smooth_inv_kernels_orig" + + // update the model + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + + // // update + // grid.fun_loc[I2V(i,j,k)] *= (_1_CR - grid.Ks_update_loc[I2V(i,j,k) ] / (Linf_Ks /step_length_new) ); + // grid.xi_loc[I2V(i,j,k)] -= grid.Kxi_update_loc[I2V(i,j,k) ] / (Linf_Kxi /step_length_new) ; + // grid.eta_loc[I2V(i,j,k)] -= grid.Keta_update_loc[I2V(i,j,k)] / (Linf_Keta /step_length_new) ; + + // update + grid.fun_loc[I2V(i,j,k)] *= (_1_CR - grid.Ks_update_loc[I2V(i,j,k) ] * step_length_new); + grid.xi_loc[I2V(i,j,k)] -= grid.Kxi_update_loc[I2V(i,j,k) ] * step_length_new; + grid.eta_loc[I2V(i,j,k)] -= grid.Keta_update_loc[I2V(i,j,k)] * step_length_new; + + + // grid.fac_b_loc[I2V(i,j,k)] = _1_CR - _2_CR * grid.xi_loc[I2V(i,j,k)]; + // grid.fac_c_loc[I2V(i,j,k)] = _1_CR + _2_CR * grid.xi_loc[I2V(i,j,k)]; + // grid.fac_f_loc[I2V(i,j,k)] = - _2_CR * grid.eta_loc[I2V(i,j,k)]; + + // grid.fun_loc[I2V(i,j,k)] *= (_1_CR); + // grid.xi_loc[I2V(i,j,k)] -= (_0_CR); + // grid.eta_loc[I2V(i,j,k)] -= (_0_CR); + + // grid.fac_b_loc[I2V(i,j,k)] = _1_CR - _2_CR * grid.xi_loc[I2V(i,j,k)]; + // grid.fac_c_loc[I2V(i,j,k)] = _1_CR + _2_CR * grid.xi_loc[I2V(i,j,k)]; + // grid.fac_f_loc[I2V(i,j,k)] = - _2_CR * grid.eta_loc[I2V(i,j,k)]; + + } + } + } + + grid.rejuvenate_abcf(); + + + } else { // for LBFGS routine + + // here all the simultaneous runs have the same values used in this routine. + // thus we don't need to if(id_sim==0) + + CUSTOMREAL step_length = step_length_new; + const CUSTOMREAL factor = - _1_CR; + + // update the model + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + // update + grid.fun_loc[I2V(i,j,k)] *= (_1_CR - factor * grid.Ks_descent_dir_loc[I2V(i,j,k)] * step_length); + grid.xi_loc[I2V(i,j,k)] -= factor * grid.Kxi_descent_dir_loc[I2V(i,j,k) ] * step_length; + grid.eta_loc[I2V(i,j,k)] -= factor * grid.Keta_descent_dir_loc[I2V(i,j,k)] * step_length; + //grid.fun_loc[I2V(i,j,k)] += grid.Ks_descent_dir_loc[I2V(i,j,k)] *step_length_new; + //grid.xi_loc[I2V(i,j,k)] += grid.Kxi_descent_dir_loc[I2V(i,j,k)] *step_length_new; + //grid.eta_loc[I2V(i,j,k)] += grid.Keta_descent_dir_loc[I2V(i,j,k)]*step_length_new; + + grid.fac_b_loc[I2V(i,j,k)] = _1_CR - _2_CR * grid.xi_loc[I2V(i,j,k)]; + grid.fac_c_loc[I2V(i,j,k)] = _1_CR + _2_CR * grid.xi_loc[I2V(i,j,k)]; + grid.fac_f_loc[I2V(i,j,k)] = - _2_CR * grid.eta_loc[I2V(i,j,k)]; + } + } + } + + } // end LBFGS model update + + // shared values on the boundary + grid.send_recev_boundary_data(grid.fun_loc); + grid.send_recev_boundary_data(grid.xi_loc); + grid.send_recev_boundary_data(grid.eta_loc); + grid.send_recev_boundary_data(grid.fac_b_loc); + grid.send_recev_boundary_data(grid.fac_c_loc); + grid.send_recev_boundary_data(grid.fac_f_loc); + + } // end if subdom_main +} + + + +// compute p_k * grad(f_k) +CUSTOMREAL compute_q_k(Grid& grid) { + + CUSTOMREAL tmp_qk = _0_CR; + + if (subdom_main && id_sim == 0) { + + // grad * descent_direction + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + // we can add here a precondition (here use *_update_loc for storing descent direction) + tmp_qk += grid.Ks_update_loc[I2V(i,j,k)] * grid.Ks_descent_dir_loc[I2V(i,j,k)] + + grid.Keta_update_loc[I2V(i,j,k)] * grid.Keta_descent_dir_loc[I2V(i,j,k)] + + grid.Kxi_update_loc[I2V(i,j,k)] * grid.Kxi_descent_dir_loc[I2V(i,j,k)]; + } + } + } + + // add tmp_qk among all subdomain + allreduce_cr_single(tmp_qk, tmp_qk); + } + + // share tmp_qk among all simultaneous runs + if (subdom_main) + broadcast_cr_single_inter_sim(tmp_qk,0); + + return tmp_qk; + +} + + +// check if the wolfe conditions are satisfied +bool check_wolfe_cond(Grid& grid, \ + CUSTOMREAL q_0, CUSTOMREAL q_t, \ + CUSTOMREAL qp_0, CUSTOMREAL qp_t, \ + CUSTOMREAL& td, CUSTOMREAL& tg, CUSTOMREAL& step_length_sub) { + /* + q_0 : initial cost function + q_t : current cost function + q_p0 : initial grad * descent_dir + q_pt : current grad * descent_dir + td : right step size + tg : left step size + step_length_sub : current step size + */ + + bool step_accepted = false; + + // check if the wolfe conditions are satisfied and update the step_length_sub + CUSTOMREAL qpt = (q_t - q_0) / step_length_sub; + + if (subdom_main) { + // good step size + if (qpt <= wolfe_c1*qp_0 \ + && wolfe_c2*qp_0 <= qp_t \ + ){ + if (myrank==0) + std::cout << "Wolfe rules: step accepted" << std::endl; + step_accepted = true; + } else { + // modify the stepsize + if (wolfe_c1*qp_0 < qpt) { + td = step_length_sub; + if (myrank==0) + std::cout << "Wolfe rules: right step size updated." << std::endl; + } + if (qpt <= wolfe_c1*qp_0 && qp_t < wolfe_c2*qp_0) { + tg = step_length_sub; + if (myrank==0) + std::cout << "Wolfe rules: left step size updated." << std::endl; + } + //if (isZero(td)) { + if (td == _0_CR) { + step_length_sub = _2_CR * step_length_sub; + if (myrank==0) + std::cout << "Wolfe rules: step size too small. Increased to " << step_length_sub << std::endl; + } else { + step_length_sub = _0_5_CR * (td+tg); + if (myrank==0) + std::cout << "Wolfe rules: step size too large. Decreased to " << step_length_sub << std::endl; + } + } + + // share step_accepted among all subdomains + broadcast_bool_single(step_accepted,0); + broadcast_cr_single(step_length_sub,0); + } // end if subdom_main + + broadcast_bool_single_sub(step_accepted,0); + broadcast_cr_single_sub(step_length_sub,0); + + return step_accepted; +} + + + +#endif // MODEL_UPDATE_H \ No newline at end of file diff --git a/include/mpi_funcs.h b/include/mpi_funcs.h new file mode 100644 index 0000000..22a7e45 --- /dev/null +++ b/include/mpi_funcs.h @@ -0,0 +1,1062 @@ +#ifndef MPI_FUNCS_H +#define MPI_FUNCS_H + +#include +#include +#include +#include +#include +#include +#include "utils.h" +#include "config.h" + +#ifdef USE_OMP +#include +#endif + +// Forward declaration for Grid class +class Grid; + +inline void initialize_mpi(); +inline void finalize_mpi(); +inline void cleanup_all_mpi_windows(); // Add cleanup function declaration + +inline void mpi_debug(char const* str); + +template +inline std::vector node_reordering(const std::vector&); +inline int check_total_nprocs_and_ndiv(); +inline void synchronize_all(); +inline void synchronize_all_inter_sim(); +inline void synchronize_all_sim(); +inline void synchronize_all_sub(); +inline void synchronize_all_inter(); +inline void synchronize_all_world(); +inline void send_bool_single_sim(bool*, int); +inline void recv_bool_single_sim(bool*, int); +inline void send_i_single_sim(int*, int); +inline void recv_i_single_sim(int*, int); +inline void send_cr(CUSTOMREAL*, int, int); +inline void recv_cr(CUSTOMREAL*, int, int); +inline void isend_cr(CUSTOMREAL*, int, int, MPI_Request&); +inline void irecv_cr(CUSTOMREAL*, int, int, MPI_Request&); +inline void send_cr_single_sim(CUSTOMREAL *, int); +inline void recv_cr_single_sim(CUSTOMREAL *, int); +inline void send_str_sim(std::string, int); +inline void recv_str_sim(std::string&, int); +inline void send_str(std::string, int); +inline void recv_str(std::string&, int); +inline void allreduce_i_single(int&, int&); +inline void allreduce_cr_single(CUSTOMREAL&, CUSTOMREAL&); +inline void allreduce_i_inplace(int*, int); +inline void allreduce_i_sim_single_inplace(int&); +inline void allreduce_bool_inplace_inter_sim(bool*, int); +inline void allreduce_bool_inplace(bool*, int); +inline void allreduce_bool_inplace_sub(bool*, int); +inline void allreduce_bool_single_inplace(bool&); +inline void allreduce_bool_single_inplace_world(bool&); +inline void allreduce_cr_inplace(CUSTOMREAL*, int); +inline void allreduce_cr_sim(CUSTOMREAL*, int, CUSTOMREAL*); +inline void allreduce_cr_sim_inplace(CUSTOMREAL*, int); +inline void allreduce_cr_sim_single_inplace(CUSTOMREAL&); +inline void allgather_i_single(int*, int*); +inline void allgather_cr_single(CUSTOMREAL*, CUSTOMREAL*); +inline void allgather_str(const std::string&, std::vector&); +inline void broadcast_bool_single(bool&, int); +inline void broadcast_bool_single_sub(bool&, int); +inline void broadcast_bool_single_inter_sim(bool&, int); +inline void broadcast_bool_inter_and_intra_sim(bool&, int); +inline void broadcast_i_single(int&, int); +inline void broadcast_i_single_inter_sim(int&, int); +inline void broadcast_i_single_sub(int&, int); +inline void broadcast_i_single_intra_sim(int&, int); +inline void broadcast_i_single_inter_and_intra_sim(int&, int); +inline void broadcast_f_single(float&, int); +inline void broadcast_cr(CUSTOMREAL* , int, int); +inline void broadcast_cr_single(CUSTOMREAL&, int); +inline void broadcast_cr_single_inplace(CUSTOMREAL&); +inline void broadcast_cr_inter_sim(CUSTOMREAL*, int, int); +inline void broadcast_str(std::string&, int); +inline void broadcast_str_inter_sim(std::string&, int); +inline void broadcast_str_sub(std::string&, int); +inline void broadcast_str_inter_and_intra_sim(std::string&, int); +inline void broadcast_cr_single_sub(CUSTOMREAL&, int); +inline void broadcast_cr_sub(CUSTOMREAL*, int, int); +inline void broadcast_cr_single_inter_and_intra_sim(CUSTOMREAL&, int); +inline void prepare_shm_array_cr(int, CUSTOMREAL*&, MPI_Win&); +inline void prepare_shm_array_bool(int, bool*&, MPI_Win&); +inline void cleanup_mpi_win(MPI_Win&); +inline void cleanup_mpi_wins(std::initializer_list); +inline void init_mpi_wins(std::initializer_list); + +inline void wait_req(MPI_Request&); +inline void shm_fence(MPI_Win&); + +inline void initialize_mpi(){ + // Initialize the MPI environment +#ifndef USE_OMP + MPI_Init(NULL, NULL); +#else + int provided; + MPI_Init_thread(NULL,NULL,MPI_THREAD_FUNNELED,&provided); + if(provided != MPI_THREAD_FUNNELED){ + std::cerr << "MPI_THREAD_FUNNELED is not supported" << std::endl; + exit(1); + } + + // currently no routine except src/rec weight calculation is parallelized by openmp + // thus put 1 thread per process + omp_set_num_threads(1); + + // show the number of threads + int nthreads = omp_get_max_threads(); + + // error check + if (nthreads != 1){ + std::cerr << "number of threads is not 1" << std::endl; + exit(1); + } + + //if (world_rank == 0) + // std::cout << "Number of threads = " << nthreads << std::endl; +#endif + // Get the number of processes + MPI_Comm_size(MPI_COMM_WORLD, &world_nprocs); + // Get the rank of the process + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + + // temporary use those parameters for reading input file + nprocs = world_nprocs; + myrank = world_rank; + inter_sub_comm = MPI_COMM_WORLD; + + stdout_by_rank_zero("mpi initialized."); +} + + +inline void finalize_mpi(){ + + synchronize_all_world(); + + // Clean up all MPI windows before finalizing MPI + cleanup_all_mpi_windows(); + + // free communicators if necessary + //if (sub_comm != MPI_COMM_NULL) + // MPI_Comm_free(&sub_comm); + //if (inter_sub_comm != MPI_COMM_WORLD) + // MPI_Comm_free(&inter_sub_comm); + //if (sim_comm != MPI_COMM_NULL) + // MPI_Comm_free(&sim_comm); + + // Finalize the MPI environment. + MPI_Finalize(); + + stdout_by_rank_zero("mpi finalized."); +} + + +inline void mpi_debug(char const* str){ + std::cout << "rank: " << world_rank << ", " << str << std::endl; + synchronize_all_world(); +} + + +template +inline std::vector node_reordering(const std::vector& vec){ + // reordering the nodes in the order of the number of particles + // the first node has the most particles + std::vector idx(vec.size()); + std::iota(idx.begin(), idx.end(), 0); + std::sort(idx.begin(), idx.end(), [&vec](size_t i1, size_t i2) {return vec[i1] > vec[i2];}); + return idx; +} + + +inline std::vector define_node_ids(std::vector& mpi_node_names_pre){ + std::vector mpi_node_ids(world_nprocs); + std::vector mpi_node_names_unique = mpi_node_names_pre; + std::sort(mpi_node_names_unique.begin(), mpi_node_names_unique.end()); + mpi_node_names_unique.erase(std::unique(mpi_node_names_unique.begin(), mpi_node_names_unique.end()), mpi_node_names_unique.end()); + for (int irank = 0; irank < world_nprocs; irank++){ + for (long unsigned int i = 0; i < mpi_node_names_unique.size(); i++){ + if (mpi_node_names_pre[irank] == mpi_node_names_unique[i]){ + mpi_node_ids[irank] = i; + break; + } + } + } + return mpi_node_ids; +} + + +inline int count_number_compute_nodes(std::vector mpi_node_names) { + std::vector mpi_node_names_unique = mpi_node_names; + std::sort(mpi_node_names_unique.begin(), mpi_node_names_unique.end()); + mpi_node_names_unique.erase(std::unique(mpi_node_names_unique.begin(), mpi_node_names_unique.end()), mpi_node_names_unique.end()); + return mpi_node_names_unique.size(); +} + + +inline void split_mpi_comm(){ + /* + This function splits MPI_COMM_WORLD into 3 layers of mpi communication groups + - simulation groups + - subdomain groups + - group of only the sub domain's leader + + subdomain leader is selected from the first processes of each simulation group. + Then the later processes will be assigned to the subdomain group. + + # memo + h5 grid file is written only by the first group of simultaneous runs + h5 data is written by the subdomain main processes of all the simultaneous runs. + xdmf file is written by only the first subdomain's subdomain main process of all the simultaneous runs. + */ + + // make a list of mpi node names and redefine the world_rank + std::vector mpi_node_names(world_nprocs, "not_initialized"), mpi_node_names_pre(world_nprocs, "not_initialized"); + std::vector mpi_node_ids(world_nprocs, -1); // we put id for each node + + // get processor name of this process + char processor_name[MPI_MAX_PROCESSOR_NAME]; + int name_len; + MPI_Get_processor_name(processor_name, &name_len); + mpi_node_names_pre[world_rank] = std::string(processor_name); + +// +// DEBUG ONLY rename mpi node names into 4 different names +// +// //if (world_nprocs != 32){ +// // std::cout << "ERROR: world_nprocs is not 64. (for processor assignment test)" << std::endl; +// // exit(1); +// //} +// if (world_nprocs%2 != 0){ +// std::cout << "ERROR: world_nprocs is not even. (for processor assignment test)" << std::endl; +// exit(1); +// } +// +// if (world_rank %2 == 0) { +// mpi_node_names_pre[world_rank] = "node_inu"; +// //} else if (world_rank % 4 == 1) { +// // mpi_node_names_pre[world_rank] = "node_neko"; +// //} else if (world_rank % 4 == 2) { +// // mpi_node_names_pre[world_rank] = "node_kani"; +// } else { +// mpi_node_names_pre[world_rank] = "node_usagi"; +// } +// +// // debug out +// if (world_rank == 0){ +// for (int irank = 0; irank < world_nprocs; irank++){ +// std::cout << "rank: " << irank << ", node name: " << mpi_node_names_pre[irank] << std::endl; +// } +// } +// +// synchronize_all_world(); +// +// DEBUG node fake name assignment done +// + + // gather all the node names in std::vector + allgather_str(mpi_node_names_pre[world_rank], mpi_node_names_pre); + + // define node id for each node + mpi_node_ids = define_node_ids(mpi_node_names_pre); + + // total number of nodes (unique) + int n_compute_nodes = count_number_compute_nodes(mpi_node_names_pre); + + // reorder if the number of unique mpi_node_ids != 1 + if (n_compute_nodes > 1){ + + // sort mpi_node_names and change world rank accordingly + std::vector node_reorder = node_reordering(mpi_node_names_pre); + std::vector mpi_node_names_sorted(world_nprocs); + std::vector mpi_node_ids_sorted(world_nprocs); + for (int irank = 0; irank < world_nprocs; irank++){ + mpi_node_names_sorted[irank] = mpi_node_names_pre[node_reorder[irank]]; + mpi_node_ids_sorted[irank] = mpi_node_ids[node_reorder[irank]]; + } + mpi_node_names = mpi_node_names_sorted; + mpi_node_ids = mpi_node_ids_sorted; + + // renumbering this process's rank + world_rank = node_reorder[world_rank]; + + } else { + mpi_node_names = mpi_node_names_pre; + //mpi_node_ids = mpi_node_ids; + } + + // debug out +// if (world_rank == 0){ +// for (int irank = 0; irank < world_nprocs; irank++){ +// std::cout << "apres rank: " << irank << ", node name: " << mpi_node_names[irank] << ", node id : " << mpi_node_ids[irank] << std::endl; +// } +// } +// synchronize_all_world(); + + // show node name and number summary + if (world_rank == 0){ + std::cout << "\n\n Node name summary\n" << std::endl; + + std::cout << "Total number of compute nodes: " << n_compute_nodes << std::endl; + + for (long unsigned int i = 0; i < mpi_node_names.size(); i++){ + // only one show for each node name + if (i == 0 || mpi_node_names[i] != mpi_node_names[i-1]){ + std::cout << "node name: " << mpi_node_names[i] << ", number: " << std::count(mpi_node_names.begin(), mpi_node_names.end(), mpi_node_names[i]) << std::endl; + } + } + std::cout << "\n" << std::endl; + } + + // create communicator for this group if simultaneous run mode + if(n_sims > 1) { + // set a simultaneous run id + if (world_nprocs%n_sims == 0) { + n_procs_each_sim = static_cast(world_nprocs/n_sims); + id_sim = std::floor(world_rank/n_procs_each_sim); + //id_sim = static_cast(world_rank/n_procs_each_sim); + } else { + stdout_by_main("Error: requested nproc is not divisible by n_sims."); + finalize_mpi(); + exit(1); + } + + // create communicator for simulation group + MPI_Comm_split(MPI_COMM_WORLD, id_sim, world_rank, &sim_comm); + MPI_Comm_rank(sim_comm, &sim_rank); // rank in simulation group + MPI_Comm_size(sim_comm, &sim_nprocs); // number of processes in simulation group + + // recreate node_names and node_ids for this simulation group + std::vector mpi_node_names_tmp(sim_nprocs); + std::vector mpi_node_ids_tmp(sim_nprocs); + + for (int irank = 0; irank < sim_nprocs; irank++){ + mpi_node_names_tmp[irank] = mpi_node_names[n_procs_each_sim*id_sim + irank]; + mpi_node_ids_tmp[irank] = mpi_node_ids[ n_procs_each_sim*id_sim + irank]; + } + + // re-assign node_names and node_ids + mpi_node_names = mpi_node_names_tmp; + mpi_node_ids = mpi_node_ids_tmp; + + // count the number of compute nodes (unique) again + n_compute_nodes = count_number_compute_nodes(mpi_node_names); + + } else { + // this is not a simultaneous run + n_procs_each_sim = world_nprocs; + id_sim = 0; + + sim_comm = MPI_COMM_WORLD; + sim_rank = world_rank; + sim_nprocs = world_nprocs; + } + + // inter-communicator (between simulation groups) + MPI_Comm_split(MPI_COMM_WORLD, sim_rank, id_sim, &inter_sim_comm); + MPI_Comm_rank(inter_sim_comm, &inter_sim_rank); + + // number of subdomains + n_subdomains = ndiv_i*ndiv_j*ndiv_k; + + // check if the number of compute node is multiple of n_subdomains + if (n_subdomains % n_compute_nodes != 0){ + std::cout << "ERROR: n_compute_nodes is not multiple of n_subdomains" << std::endl; + exit(1); + } + + // number of subdomains per node + //int n_subdomains_per_node = static_cast(n_subdomains/n_compute_nodes); + int n_procs_per_subdomain = static_cast(sim_nprocs/n_subdomains); + id_subdomain = std::floor(sim_rank/n_procs_per_subdomain); + int id_proc_in_subdomain = sim_rank - id_subdomain*n_procs_per_subdomain; + + // assign first ranks to the main node of subdomain + // and create a commmunicator for main processes of subdomain + if (id_proc_in_subdomain == 0) { + //std::cout << "my sim_rank: " << sim_rank << std::endl; + subdom_main = true; + MPI_Comm_split(sim_comm, 0, sim_rank, &inter_sub_comm); + MPI_Comm_rank(inter_sub_comm, &inter_sub_rank); + MPI_Comm_size(inter_sub_comm, &inter_sub_nprocs); + + // then the calculation in the sub domain will be done by only the processes + // with subdomom_main == true and with inter_sub_comm commmunicator + + // use the rank number of inter_sub_comm as the myrank + myrank = inter_sub_rank; + nprocs = inter_sub_nprocs; + + } else { + //std::cout << "my sim_rank to sub : " << sim_rank << std::endl; + MPI_Comm_split(sim_comm, 1, sim_rank, &inter_sub_comm); + + // assign those ranks as subprocesses of each sub domain. + subdom_main = false; + myrank = -9999; + nprocs = -9999; + } + + synchronize_all_sim(); + + MPI_Comm_split(sim_comm, id_subdomain, sim_rank, &sub_comm); + MPI_Comm_rank(sub_comm, &sub_rank); + MPI_Comm_size(sub_comm, &sub_nprocs); + + // convert the sub_comm to shared memory available communicator + MPI_Comm tmp_comm; + MPI_Comm_split_type(sub_comm, MPI_COMM_TYPE_SHARED, id_subdomain, MPI_INFO_NULL, &tmp_comm); + sub_comm = tmp_comm; + MPI_Comm_rank(sub_comm, &sub_rank); + MPI_Comm_size(sub_comm, &sub_nprocs); + + synchronize_all_world(); + + // check processors + for (int irank = 0; irank < world_nprocs; irank++){ + synchronize_all_world(); + if (irank == world_rank) + std::cout << "global rank: " << world_rank << ", node name: " << mpi_node_names[world_rank] \ + << " | i_simul/total: " << id_sim << "/" << n_sims << ", n_procs_each_sim: " << n_procs_each_sim \ + << " | i_subdom/total: " << id_subdomain << "/" << n_subdomains << ", subdom_main: " << subdom_main \ + << ", sub_rank/total: " << sub_rank << "/" << sub_nprocs \ + << std::endl; + } + + synchronize_all_world(); + + // // check processors + // for (int irank = 0; irank < world_nprocs; irank++){ + // synchronize_all_world(); + // if (irank == world_rank) { + // std::cout << "global rank: " << world_rank << ", node name: " << mpi_node_names[world_rank] + // << ", world_rank: " << world_rank << ", world_nprocs: " << world_nprocs + // << ", sim_rank: " << sim_rank << ", sim_nprocs: " << sim_nprocs + // << ", sub_rank: " << sub_rank << ", sub_nprocs: " << sub_nprocs + // << ", inter_sim_rank: " << inter_sim_rank + // << ", inter_sub_rank: " << inter_sub_rank << ", inter_sub_nprocs: " << inter_sub_nprocs + // << ", id_sim: " << id_sim << ", id_subdomain: " << id_subdomain + // << ", subdom_main: " << subdom_main + // << ", id_proc_in_subdomain: " << id_proc_in_subdomain + // << ", id_subdomain: " << id_subdomain + // << std::endl; + // std::cout << std::endl; + // } + // } + // synchronize_all_world(); + +} + + +inline int check_total_nprocs_and_ndiv(){ + if (world_nprocs != (n_sims*ndiv_i*ndiv_j*ndiv_k*n_subprocs)){ + stdout_by_main("ERROR: the number of requested processors and n_sims*ndiv_rtp[0]*ndiv_rtp[1]*ndiv_rtp[2]*nproc_sub in input_params.yml need to be the same."); + if (world_rank==0){ + // print all params + std::cout << "n_sims: " << n_sims << std::endl; + std::cout << "ndiv_rtp: " << ndiv_k << " " << ndiv_j << " " << ndiv_i << std::endl; + std::cout << "n_subprocs: " << n_subprocs << std::endl; + std::cout << "nprocs should be n_sims*ndiv_p*ndiv_t*ndiv_r*n_subprocs = " << n_sims*ndiv_i*ndiv_j*ndiv_k*n_subprocs << std::endl; + std::cout << "but the actual nprocs = " << nprocs << std::endl; + } + finalize_mpi(); + exit(EXIT_FAILURE); + } + return 0; +} + + +inline void synchronize_all(){ + MPI_Barrier(sim_comm); +} + + +inline void synchronize_all_sim(){ + MPI_Barrier(sim_comm); +} + + +inline void synchronize_all_sub(){ + MPI_Barrier(sub_comm); +} + + +inline void synchronize_all_inter(){ + MPI_Barrier(inter_sub_comm); +} + + +inline void synchronize_all_inter_sim(){ + MPI_Barrier(inter_sim_comm); +} + + +inline void synchronize_all_world(){ + MPI_Barrier(MPI_COMM_WORLD); +} + + +inline void send_bool_single_sim(bool* b, int dest){ + const int n = 1; + MPI_Send(b, n, MPI_C_BOOL, dest, MPI_DUMMY_TAG, inter_sim_comm); +} + + +inline void recv_bool_single_sim(bool* b, int src){ + const int n = 1; + MPI_Recv(b, n, MPI_C_BOOL, src, MPI_DUMMY_TAG, inter_sim_comm, MPI_STATUS_IGNORE); +} + + +inline void send_i_single_sim(int* i, int dest){ + const int n = 1; + MPI_Send(i, n, MPI_INT, dest, MPI_DUMMY_TAG, inter_sim_comm); +} + + +inline void recv_i_single_sim(int* i, int src){ + const int n = 1; + MPI_Recv(i, n, MPI_INT, src, MPI_DUMMY_TAG, inter_sim_comm, MPI_STATUS_IGNORE); +} + + +inline void send_cr_single_sim(CUSTOMREAL *cr, int dest){ + const int n = 1; + MPI_Send(cr, n, MPI_CR, dest, MPI_DUMMY_TAG, inter_sim_comm); +} + + +inline void recv_cr_single_sim(CUSTOMREAL *cr, int src){ + const int n = 1; + MPI_Recv(cr, n, MPI_CR, src, MPI_DUMMY_TAG, inter_sim_comm, MPI_STATUS_IGNORE); +} + + +inline void send_str_sim(std::string str, int dest){ + const int n = str.size(); + char* cstr = new char[n+1]; + strcpy(cstr, str.c_str()); + MPI_Send(cstr, n, MPI_CHAR, dest, MPI_DUMMY_TAG, inter_sim_comm); + delete[] cstr; +} + + +inline void recv_str_sim(std::string& str, int src){ + MPI_Status status; + int n; + MPI_Probe(src, MPI_DUMMY_TAG, inter_sim_comm, &status); + MPI_Get_count(&status, MPI_CHAR, &n); + char* cstr = new char[n+1]; + MPI_Recv(cstr, n, MPI_CHAR, src, MPI_DUMMY_TAG, inter_sim_comm, MPI_STATUS_IGNORE); + cstr[n] = '\0'; + str = std::string(cstr); + delete[] cstr; +} + + +inline void send_str(std::string str, int dest){ + const int n = str.size(); + char* cstr = new char[n+1]; + strcpy(cstr, str.c_str()); + MPI_Send(cstr, n, MPI_CHAR, dest, MPI_DUMMY_TAG, inter_sub_comm); + delete[] cstr; +} + + +inline void recv_str(std::string& str, int src){ + MPI_Status status; + int n; + MPI_Probe(src, MPI_DUMMY_TAG, inter_sub_comm, &status); + MPI_Get_count(&status, MPI_CHAR, &n); + char* cstr = new char[n+1]; + MPI_Recv(cstr, n, MPI_CHAR, src, MPI_DUMMY_TAG, inter_sub_comm, MPI_STATUS_IGNORE); + cstr[n] = '\0'; + str = std::string(cstr); + delete[] cstr; +} + + +inline void send_cr(CUSTOMREAL *cr, int n, int dest){ + MPI_Send(cr, n, MPI_CR, dest, MPI_DUMMY_TAG, inter_sub_comm); +} + + +inline void recv_cr(CUSTOMREAL *cr, int n, int src){ + MPI_Recv(cr, n, MPI_CR, src, MPI_DUMMY_TAG, inter_sub_comm, MPI_STATUS_IGNORE); +} + +inline void isend_cr(CUSTOMREAL* buf, int count, int dest, MPI_Request& request){ + //MPI_Request request = MPI_REQUEST_NULL; + //std::cout << "sending from : " << inter_sub_rank << ", to : " << dest <<", size : " << count << std::endl; + MPI_Isend(buf, count, MPI_CR, dest, MPI_DUMMY_TAG, inter_sub_comm, &request); +} + +inline void irecv_cr(CUSTOMREAL* buf, int count, int source, MPI_Request& request){ + //MPI_Request request = MPI_REQUEST_NULL; + //std::cout << "receiving by : " << inter_sub_rank << ", from : " << source << ", size : " << count << std::endl; + MPI_Irecv(buf, count, MPI_CR, source, MPI_DUMMY_TAG, inter_sub_comm, &request); +} + +inline void allreduce_i_single(int& value, int& result){ + int count = 1; + MPI_Allreduce(&value, &result, count, MPI_INT, MPI_SUM, inter_sub_comm); +} + +inline void allreduce_i_sim_single_inplace(int& value){ + int count = 1; + MPI_Allreduce(MPI_IN_PLACE, &value, count, MPI_INT, MPI_SUM, inter_sim_comm); +} + +inline void allreduce_cr_single(CUSTOMREAL& loc_buf, CUSTOMREAL& all_buf){ + int count = 1; + MPI_Allreduce(&loc_buf, &all_buf, count, MPI_CR, MPI_SUM, inter_sub_comm); +} + + +inline void allreduce_bool_inplace_inter_sim(bool* loc_buf, int count){ + // return true if any of the processes return true + MPI_Allreduce(MPI_IN_PLACE, loc_buf, count, MPI_CXX_BOOL, MPI_LOR, inter_sim_comm); +} + + +inline void allreduce_bool_inplace(bool* loc_buf, int count){ + // return true if any of the processes return true + MPI_Allreduce(MPI_IN_PLACE, loc_buf, count, MPI_CXX_BOOL, MPI_LOR, inter_sub_comm); +} + + +inline void allreduce_bool_inplace_sub(bool* loc_buf, int count){ + // return true if any of the processes return true + MPI_Allreduce(MPI_IN_PLACE, loc_buf, count, MPI_CXX_BOOL, MPI_LOR, sub_comm); +} + + +inline void allreduce_bool_single_inplace(bool& loc_buf){ + MPI_Allreduce(MPI_IN_PLACE, &loc_buf, 1, MPI_CXX_BOOL, MPI_LAND, inter_sub_comm); +} + +// true if all processes return true else false +inline void allreduce_bool_single_inplace_sim(bool& loc_buf){ + MPI_Allreduce(MPI_IN_PLACE, &loc_buf, 1, MPI_CXX_BOOL, MPI_LAND, inter_sim_comm); +} + +inline void allreduce_i_inplace(int* loc_buf, int count){ + MPI_Allreduce(MPI_IN_PLACE, loc_buf, count, MPI_INT, MPI_SUM, inter_sub_comm); +} + +inline void allreduce_cr_inplace(CUSTOMREAL* loc_buf, int count){ + MPI_Allreduce(MPI_IN_PLACE, loc_buf, count, MPI_CR, MPI_SUM, inter_sub_comm); +} + +inline void allreduce_cr_sim(CUSTOMREAL* loc_buf, int count, CUSTOMREAL* all_buf){ + MPI_Allreduce(loc_buf, all_buf, count, MPI_CR, MPI_SUM, inter_sim_comm); +} + +inline void allreduce_cr_sim_single(CUSTOMREAL& loc_buf, CUSTOMREAL& all_buf){ + int count = 1; + MPI_Allreduce(&loc_buf, &all_buf, count, MPI_CR, MPI_SUM, inter_sim_comm); +} + +inline void allreduce_cr_sim_single_inplace(CUSTOMREAL& loc_buf){ + int count = 1; + MPI_Allreduce(MPI_IN_PLACE, &loc_buf, count, MPI_CR, MPI_SUM, inter_sim_comm); +} + +inline void allreduce_cr_sim_inplace(CUSTOMREAL* loc_buf, int count){ + MPI_Allreduce(MPI_IN_PLACE, loc_buf, count, MPI_CR, MPI_SUM, inter_sim_comm); +} + +inline void alleduce_cr_sim_single_inplace(CUSTOMREAL& loc_buf){ + int count = 1; + MPI_Allreduce(MPI_IN_PLACE, &loc_buf, count, MPI_CR, MPI_SUM, inter_sim_comm); +} + +inline void allreduce_cr_single_max(CUSTOMREAL& loc_buf, CUSTOMREAL& all_buf){ + int count = 1; + MPI_Allreduce(&loc_buf, &all_buf, count, MPI_CR, MPI_MAX, inter_sub_comm); +} + +inline void allgather_i_single(int* loc_buf, int* all_buf){ + int count = 1; + MPI_Allgather(loc_buf, count, MPI_INT, all_buf, count, MPI_INT, inter_sub_comm); +} + +inline void allgather_cr_single(CUSTOMREAL* loc_buf, CUSTOMREAL* all_buf){ + int count = 1; + MPI_Allgather(loc_buf, count, MPI_CR, all_buf, count, MPI_CR, inter_sub_comm); +} + +inline void allgather_bool_single(bool* loc_buf, bool* all_buf){ + int count = 1; + MPI_Allgather(loc_buf, count, MPI_CXX_BOOL, all_buf, count, MPI_CXX_BOOL, inter_sub_comm); +} + +inline void broadcast_bool_single(bool& value, int root){ + int count = 1; + MPI_Bcast(&value, count, MPI_CXX_BOOL, root, inter_sub_comm); +} + +inline void broadcast_bool_single_sub(bool& value, int root){ + int count = 1; + MPI_Bcast(&value, count, MPI_CXX_BOOL, root, sub_comm); +} + +inline void broadcast_bool_single_inter_sim(bool& value, int root){ + int count = 1; + MPI_Bcast(&value, count, MPI_CXX_BOOL, root, inter_sim_comm); +} + +inline void broadcast_bool_inter_and_intra_sim(bool& value, int root){ + broadcast_bool_single_inter_sim(value, root); // broadcast among simultaneous run group + broadcast_bool_single(value, root); // broadcast among subdomain group + broadcast_bool_single_sub(value, root); // broadcast within subdomain group +} + +inline void broadcast_i_single(int& value, int root){ + int count = 1; + MPI_Bcast(&value, count, MPI_INT, root, inter_sub_comm); +} + + +inline void broadcast_i_single_inter_sim(int& value, int root){ + int count = 1; + MPI_Bcast(&value, count, MPI_INT, root, inter_sim_comm); +} + +inline void broadcast_i_single_intra_sim(int& value, int root){ + broadcast_i_single(value, root); // broadcast among subdomain group + broadcast_i_single_sub(value, root); // broadcast within subdomain group +} + +inline void broadcast_i_single_inter_and_intra_sim(int& value, int root){ + broadcast_i_single_inter_sim(value, root); // broadcast among simultaneous run group + broadcast_i_single(value, root); // broadcast among subdomain group + broadcast_i_single_sub(value, root); // broadcast within subdomain group +} + +inline void broadcast_f_single(float& value, int root){ // !!!! FOR ONLY READ PARAMETER !!!!! + int count = 1; + MPI_Bcast(&value, count, MPI_FLOAT, root, inter_sub_comm); +} + +inline void broadcast_cr_single(CUSTOMREAL& buf, int root){ + MPI_Bcast(&buf, 1, MPI_CR, root, inter_sub_comm); +} + +inline void broadcast_cr(CUSTOMREAL* buf, int count, int root){ + MPI_Bcast(buf, count, MPI_CR, root, inter_sub_comm); +} + +inline void broadcast_cr_single_inplace(CUSTOMREAL& buf, int root){ + MPI_Bcast(&buf, 1, MPI_CR, root, inter_sub_comm); +} + +inline void broadcast_cr_inter_sim(CUSTOMREAL* buf, int count, int root){ + MPI_Bcast(buf, count, MPI_CR, root, inter_sim_comm); +} + + +inline void broadcast_cr_single_inter_sim(CUSTOMREAL& buf, int root){ + int count = 1; + MPI_Bcast(&buf, count, MPI_CR, root, inter_sim_comm); +} + + +inline void broadcast_cr_single_inter_and_intra_sim(CUSTOMREAL& buf, int root){ + broadcast_cr_single_inter_sim(buf, root); // broadcast among simultaneous run group + broadcast_cr_single(buf, root); // broadcast among subdomain group + broadcast_cr_single_sub(buf, root); // broadcast within subdomain group +} + + +inline void broadcast_i_single_sub(int& value, int root){ + int count = 1; + MPI_Bcast(&value, count, MPI_INT, root, sub_comm); +} + +//inline void broadcast_f_single_sub(float& value, int root){ // !!!! FOR ONLY READ PARAMETER !!!!! +// int count = 1; +// MPI_Bcast(&value, count, MPI_FLOAT, root, sub_comm); +//} + +inline void broadcast_cr_single_sub(CUSTOMREAL& buf, int root){ + int count = 1; + MPI_Bcast(&buf, count, MPI_CR, root, sub_comm); +} + +inline void broadcast_cr_sub(CUSTOMREAL* buf, int count, int root){ + MPI_Bcast(buf, count, MPI_CR, root, sub_comm); +} + +inline void broadcast_str(std::string& str, int root) { + int count = str.size(); + MPI_Bcast(&count, 1, MPI_INT, root, inter_sub_comm); + char* buf = new char[count+1]; + if (root == inter_sub_rank) { + std::strcpy(buf, str.c_str()); + } + MPI_Bcast(buf, count+1, MPI_CHAR, root, inter_sub_comm); + str = buf; + delete[] buf; +} + +inline void broadcast_str_sub(std::string& str, int root) { + int count = str.size(); + MPI_Bcast(&count, 1, MPI_INT, root, sub_comm); + char* buf = new char[count+1]; + if (root == sub_rank) { + std::strcpy(buf, str.c_str()); + } + MPI_Bcast(buf, count+1, MPI_CHAR, root, sub_comm); + str = buf; + delete[] buf; +} + +inline void broadcast_str_inter_sim(std::string& str, int root) { + int count = str.size(); + MPI_Bcast(&count, 1, MPI_INT, root, inter_sim_comm); + char* buf = new char[count+1]; + if (root == inter_sim_rank) { + std::strcpy(buf, str.c_str()); + } + MPI_Bcast(buf, count+1, MPI_CHAR, root, inter_sim_comm); + str = buf; + delete[] buf; +} + +inline void broadcast_str_inter_and_intra_sim(std::string& str, int root) { + broadcast_str_inter_sim(str, root); + broadcast_str(str, root); + broadcast_str_sub(str, root); +} + + +inline void allgather_str(const std::string &str, std::vector &result) { + MPI_Comm comm = MPI_COMM_WORLD; + int size = world_nprocs; + + int str_size = str.size(); + std::vector str_sizes(size); + MPI_Allgather(&str_size, 1, MPI_INT, str_sizes.data(), 1, MPI_INT, comm); + + int total_size = 0; + std::vector displs(size); + for (int i = 0; i < size; i++) { + total_size += str_sizes[i]; + displs[i] = (i == 0) ? 0 : (displs[i - 1] + str_sizes[i - 1]); + } + + std::vector data(total_size); + MPI_Allgatherv(str.data(), str_size, MPI_CHAR, data.data(), str_sizes.data(), displs.data(), MPI_CHAR, comm); + + result.reserve(size); + int start = 0; + for (int i = 0; i < size; i++) { + result[i] = std::string(&data[start], str_sizes[i]); + start += str_sizes[i]; + } + +} + + +inline void prepare_shm_array_cr(int n_elms, CUSTOMREAL* &buf, MPI_Win& win){ + int* model; + int flag; + MPI_Aint winsize_dummy; + int windisp_dummy; + + // Allocate shared memory for the array on only the subdomain's main process (n_elms == 0 for the other processes) + MPI_Win_allocate_shared(n_elms*sizeof(CUSTOMREAL), sizeof(CUSTOMREAL), MPI_INFO_NULL, sub_comm, &buf, &win); + // get attribute + MPI_Win_get_attr(win, MPI_WIN_MODEL, &model, &flag); + // shared query + if (sub_rank != 0){ + MPI_Win_shared_query(win, 0, &winsize_dummy, &windisp_dummy, &buf); + } + + shm_fence(win); +} + +/* +inline void prepare_shm_single_i(int*& value, MPI_Win& win){ + int* model; + int flag; + MPI_Aint winsize_dummy; + int windisp_dummy; + int mpi_size; + if (sub_rank == 0){ + mpi_size = sizeof(int)*1; + } else { + mpi_size = 0; + } + + // Allocate shared memory for the array on only the subdomain's main process (n_elms == 0 for the other processes) + MPI_Win_allocate_shared(mpi_size, sizeof(int), MPI_INFO_NULL, sub_comm, &value, &win); + // get attribute + MPI_Win_get_attr(win, MPI_WIN_MODEL, &model, &flag); + // shared query + if (sub_rank != 0){ + MPI_Win_shared_query(win, 0, &winsize_dummy, &windisp_dummy, &value); + } + + shm_fence(win); +} +*/ +/* +inline void prepare_shm_single_cr(CUSTOMREAL*& value, MPI_Win& win){ + int* model; + int flag; + MPI_Aint winsize_dummy; + int windisp_dummy; + int mpi_size; + if (sub_rank == 0){ + mpi_size = sizeof(CUSTOMREAL)*1; + } else { + mpi_size = 0; + } + + // Allocate shared memory for the array on only the subdomain's main process (n_elms == 0 for the other processes) + MPI_Win_allocate_shared(mpi_size, sizeof(CUSTOMREAL), MPI_INFO_NULL, sub_comm, &value, &win); + // get attribute + MPI_Win_get_attr(win, MPI_WIN_MODEL, &model, &flag); + // shared query + if (sub_rank != 0){ + MPI_Win_shared_query(win, 0, &winsize_dummy, &windisp_dummy, &value); + } + + shm_fence(win); +} +*/ + +inline void prepare_shm_array_bool(int n_elms, bool* &buf, MPI_Win& win){ + int* model; + int flag; + MPI_Aint winsize_dummy; + int windisp_dummy; + + // Allocate shared memory for the array on only the subdomain's main process (n_elms == 0 for the other processes) + MPI_Win_allocate_shared(n_elms*sizeof(bool), sizeof(bool), MPI_INFO_NULL, sub_comm, &buf, &win); + // get attribute + MPI_Win_get_attr(win, MPI_WIN_MODEL, &model, &flag); + // shared query + if (sub_rank != 0){ + MPI_Win_shared_query(win, 0, &winsize_dummy, &windisp_dummy, &buf); + } + + shm_fence(win); +} + + +inline void wait_req(MPI_Request& req){ + MPI_Status status; + MPI_Wait(&req, &status); +} + + +inline void shm_fence(MPI_Win& win){ + MPI_Win_fence(0, win); +} + +// Function to safely free a single MPI window +inline void cleanup_mpi_win(MPI_Win& win) { + if (win != MPI_WIN_NULL) { + int mpi_error = MPI_Win_free(&win); + if (mpi_error != MPI_SUCCESS) { + char error_string[MPI_MAX_ERROR_STRING]; + int length_of_error_string; + MPI_Error_string(mpi_error, error_string, &length_of_error_string); + std::cerr << "ERROR: MPI_Win_free failed with error code " << mpi_error + << ": " << error_string << std::endl; + std::cerr << "This may indicate issues with Intel OneAPI MPI shared memory cleanup." << std::endl; + // Don't call MPI_Abort here as we're likely in cleanup phase + } else { + win = MPI_WIN_NULL; + } + } +} + +// Function to safely free multiple MPI windows +inline void cleanup_mpi_wins(std::initializer_list wins) { + int error_count = 0; + int total_windows = 0; + + for (MPI_Win* win : wins) { + if (win != nullptr) { + total_windows++; + if (*win != MPI_WIN_NULL) { + int mpi_error = MPI_Win_free(win); + if (mpi_error != MPI_SUCCESS) { + error_count++; + char error_string[MPI_MAX_ERROR_STRING]; + int length_of_error_string; + MPI_Error_string(mpi_error, error_string, &length_of_error_string); + std::cerr << "ERROR: MPI_Win_free failed for window " << total_windows + << " with error code " << mpi_error + << ": " << error_string << std::endl; + } else { + *win = MPI_WIN_NULL; + } + } + } + } + + if (error_count > 0) { + std::cerr << "WARNING: " << error_count << " out of " << total_windows + << " MPI windows failed to free properly." << std::endl; + std::cerr << "This may indicate Intel OneAPI MPI shared memory cleanup issues." << std::endl; + } else if (total_windows > 0) { + // Only show success message in verbose mode or for debugging + if (if_verbose && world_rank == 0) { + std::cout << "Successfully freed " << total_windows << " MPI shared memory windows." << std::endl; + } + } +} + +// Function to initialize multiple MPI windows to NULL +inline void init_mpi_wins(std::initializer_list wins) { + int initialized_count = 0; + + for (MPI_Win* win : wins) { + if (win != nullptr) { + *win = MPI_WIN_NULL; + initialized_count++; + } else { + std::cerr << "WARNING: Null pointer passed to init_mpi_wins, skipping." << std::endl; + } + } + + if (if_verbose && world_rank == 0 && initialized_count > 0) { + std::cout << "Initialized " << initialized_count << " MPI windows to MPI_WIN_NULL." << std::endl; + } +} + +// Simple flag to track if MPI windows have been cleaned up +inline bool& get_mpi_windows_cleaned_flag() { + static bool mpi_windows_cleaned = false; + return mpi_windows_cleaned; +} + +// Clean up all MPI windows before MPI_Finalize (called once) +inline void cleanup_all_mpi_windows() { + bool& cleaned = get_mpi_windows_cleaned_flag(); + + if (!cleaned) { + if (world_rank == 0 && if_verbose) { + std::cout << "Cleaning up all MPI windows before MPI_Finalize..." << std::endl; + } + cleaned = true; + + if (world_rank == 0 && if_verbose) { + std::cout << "All MPI windows cleaned up successfully." << std::endl; + } + } +} + + + + +#endif // MPI_FUNCS_H \ No newline at end of file diff --git a/include/objective_function_utils.h b/include/objective_function_utils.h new file mode 100644 index 0000000..49c2899 --- /dev/null +++ b/include/objective_function_utils.h @@ -0,0 +1,181 @@ +#ifndef OBJECTIVE_FUNCTION_UTILS_H +#define OBJECTIVE_FUNCTION_UTILS_H + +#include +#include + +#include "config.h" +#include "input_params.h" + +// prepare header line of objective_funciton.txt +inline void prepare_header_line(InputParams &IP, std::ofstream &out_main) { + // prepare output for iteration status + if(myrank == 0 && id_sim ==0){ + out_main.open(output_dir + "/objective_function.txt"); + if (optim_method == GRADIENT_DESCENT || optim_method == HALVE_STEPPING_MODE){ + + out_main << std::setw(8) << std::right << "# iter,"; + out_main << std::setw(13) << std::right << " type,"; + + // if (optim_method == HALVE_STEPPING_MODE) + // out_main << std::setw(8) << std::right << "subiter,"; (TODO in the future) + std::string tmp = "obj("; + if(IP.get_run_mode() == ONED_INVERSION){ + tmp.append(std::to_string(IP.N_abs_local_data)); // for 1d inversion, only absolute time residual is considered in obj + } else { + tmp.append(std::to_string(IP.N_data)); + } + tmp.append("),"); + out_main << std::setw(20) << tmp; + + tmp = "obj_abs("; + tmp.append(std::to_string(IP.N_abs_local_data)); + tmp.append("),"); + out_main << std::setw(20) << tmp; + + tmp = "obj_cs_dif("; + if (IP.get_is_srcrec_swap()) + tmp.append(std::to_string(IP.N_cr_dif_local_data)); + else + tmp.append(std::to_string(IP.N_cs_dif_local_data)); + tmp.append("),"); + out_main << std::setw(20) << tmp; + + tmp = "obj_cr_dif("; + if (IP.get_is_srcrec_swap()) + tmp.append(std::to_string(IP.N_cs_dif_local_data)); + else + tmp.append(std::to_string(IP.N_cr_dif_local_data)); + tmp.append("),"); + out_main << std::setw(20) << tmp; + + tmp = "obj_tele("; + tmp.append(std::to_string(IP.N_teleseismic_data)); + tmp.append("),"); + out_main << std::setw(20) << tmp; + + out_main << std::setw(25) << "res(mean/std),"; + + out_main << std::setw(25) << "res_abs(mean/std),"; + + out_main << std::setw(25) << "res_cs_dif(mean/std),"; + + out_main << std::setw(25) << "res_cr_dif(mean/std),"; + + out_main << std::setw(25) << "res_tele(mean/std),"; + + out_main << std::setw(20) << "step_length," << std::endl; + + } else if (optim_method == LBFGS_MODE) + out_main << std::setw(6) << "it," << std::setw(6) << "subit," << std::setw(16) << "step_length," << std::setw(16) << "q_0," << std::setw(16) << "q_t," \ + << std::setw(16) << "v_obj_reg," << std::setw(16) << "qp_0," << std::setw(16) << "qp_t," << std::setw(16) << "td," << std::setw(16) << "tg," \ + << std::setw(16) << "c1*qp_0," << std::setw(16) << "c2*qp_0," << std::setw(6) << "step ok," << std::endl; + + } +} + + +inline void write_objective_function(InputParams& IP, int i_inv, std::vector& v_misfit_inout, std::ofstream& out_main, std::string type) { + // output objective function + if (myrank==0 && id_sim==0) { + out_main << std::setw(8) << std::to_string(i_inv)+","; + out_main << std::setw(13) << type; + out_main << "," << std::setw(19) << v_misfit_inout[0]; + out_main << "," << std::setw(19) << v_misfit_inout[1]; + if (IP.get_is_srcrec_swap()) + out_main << "," << std::setw(19) << v_misfit_inout[3]; + else + out_main << "," << std::setw(19) << v_misfit_inout[2]; + if (IP.get_is_srcrec_swap()) + out_main << "," << std::setw(19) << v_misfit_inout[2]; + else + out_main << "," << std::setw(19) << v_misfit_inout[3]; + out_main << "," << std::setw(19) << v_misfit_inout[4]; + // res + CUSTOMREAL mean; + CUSTOMREAL std; + std::string tmp; + if (IP.N_data > 0) { + mean = v_misfit_inout[5]/IP.N_data; + std = sqrt(v_misfit_inout[6]/IP.N_data - my_square(mean)); + tmp = std::to_string(mean); + tmp.append("/"); + tmp.append(std::to_string(std)); + out_main << "," << std::setw(24) << tmp; + } else { + out_main << "," << std::setw(24) << "0.0/0.0"; + } + // res_abs + if (IP.N_abs_local_data > 0) { + mean = v_misfit_inout[7]/IP.N_abs_local_data; + std = sqrt(v_misfit_inout[8]/IP.N_abs_local_data - my_square(mean)); + tmp = std::to_string(mean); + tmp.append("/"); + tmp.append(std::to_string(std)); + out_main << "," << std::setw(24) << tmp; + } else { + out_main << "," << std::setw(24) << "0.0/0.0"; + } + if (IP.get_is_srcrec_swap()){ + if (IP.N_cr_dif_local_data > 0) { + mean = v_misfit_inout[11]/IP.N_cr_dif_local_data; + std = sqrt(v_misfit_inout[12]/IP.N_cr_dif_local_data - my_square(mean)); + tmp = std::to_string(mean); + tmp.append("/"); + tmp.append(std::to_string(std)); + out_main << "," << std::setw(24) << tmp; + } else { + out_main << "," << std::setw(24) << "0.0/0.0"; + } + if (IP.N_cs_dif_local_data > 0) { + mean = v_misfit_inout[9]/IP.N_cs_dif_local_data; + std = sqrt(v_misfit_inout[10]/IP.N_cs_dif_local_data - my_square(mean)); + tmp = std::to_string(mean); + tmp.append("/"); + tmp.append(std::to_string(std)); + out_main << "," << std::setw(24) << tmp; + } else { + out_main << "," << std::setw(24) << "0.0/0.0"; + } + } else { + if (IP.N_cs_dif_local_data > 0) { + mean = v_misfit_inout[9]/IP.N_cs_dif_local_data; + std = sqrt(v_misfit_inout[10]/IP.N_cs_dif_local_data - my_square(mean)); + tmp = std::to_string(mean); + tmp.append("/"); + tmp.append(std::to_string(std)); + out_main << "," << std::setw(24) << tmp; + } else { + out_main << "," << std::setw(24) << "0.0/0.0"; + } + if (IP.N_cr_dif_local_data > 0) { + mean = v_misfit_inout[11]/IP.N_cr_dif_local_data; + std = sqrt(v_misfit_inout[12]/IP.N_cr_dif_local_data - my_square(mean)); + tmp = std::to_string(mean); + tmp.append("/"); + tmp.append(std::to_string(std)); + out_main << "," << std::setw(24) << tmp; + } else { + out_main << "," << std::setw(24) << "0.0/0.0"; + } + } + + if (IP.N_teleseismic_data > 0) { + mean = v_misfit_inout[13]/IP.N_teleseismic_data; + std = sqrt(v_misfit_inout[14]/IP.N_teleseismic_data - my_square(mean)); + tmp = std::to_string(mean); + tmp.append("/"); + tmp.append(std::to_string(std)); + out_main << "," << std::setw(24) << tmp; + } else { + out_main << "," << std::setw(24) << "0.0/0.0"; + } + if(type == "model update" || type == "1d inversion") + out_main << "," << std::setw(19) << step_length_init << ","; + + out_main << std::endl; + } +} + + +#endif // OBJECTIVE_FUNCTION_UTILS_H \ No newline at end of file diff --git a/include/oneD_inversion.h b/include/oneD_inversion.h new file mode 100644 index 0000000..0229eac --- /dev/null +++ b/include/oneD_inversion.h @@ -0,0 +1,109 @@ +#ifndef ONED_INVERSION_H +#define ONED_INVERSION_H + +#include +#include +#include + +#include "input_params.h" +#include "grid.h" +#include "utils.h" +#include "config.h" +#include "receiver.h" + +class OneDInversion { + +public: + OneDInversion(InputParams&, Grid&); + ~OneDInversion(); + + // grid parameters + int nr_1dinv, nt_1dinv; // number of grid points in r and epicenter distance + CUSTOMREAL *r_1dinv, *t_1dinv; // coordinates + CUSTOMREAL dr_1dinv, dt_1dinv; // grid spacing + + // parameters on grid nodes (for model) + CUSTOMREAL *slowness_1dinv; // slowness + CUSTOMREAL *fac_a_1dinv; // fac_a + CUSTOMREAL *fac_b_1dinv; // fac_b + + // parameters on grid nodes (for eikonal solver and adjoint solver) + CUSTOMREAL *tau_1dinv; // tau + CUSTOMREAL *tau_old_1dinv; // tau_old + CUSTOMREAL *T_1dinv; // T + CUSTOMREAL *Tadj_1dinv; // Tadj + CUSTOMREAL *Tadj_density_1dinv; // Tadj + CUSTOMREAL *T0v_1dinv; // T0v + CUSTOMREAL *T0r_1dinv; // T0r + CUSTOMREAL *T0t_1dinv; // T0t + bool *is_changed_1dinv; // is_changed + CUSTOMREAL *delta_1dinv; // delta + + // parameters on grid nodes (for inversion) + CUSTOMREAL *Ks_1dinv; // Ks + CUSTOMREAL *Ks_density_1dinv; // Ks_density + CUSTOMREAL *Ks_over_Kden_1dinv; // Ks_over_Kdensity + CUSTOMREAL *Ks_multigrid_1dinv; // (Ks_over_Kdensity) parameterized by multigrid + CUSTOMREAL *Ks_multigrid_previous_1dinv; // Ks_multigrid at previous iteration + + // parameters for optimization + CUSTOMREAL v_obj; + CUSTOMREAL old_v_obj; + + // functions + std::vector run_simulation_one_step_1dinv(InputParams&, IO_utils&, const int&); + void model_optimize_1dinv(InputParams&, Grid&, IO_utils&, const int&); + + // h5 file output + void write_T_1dinv(IO_utils&, const std::string&, const int&); + void write_Tadj_1dinv(IO_utils&, const std::string&, const int&); + void write_vel_1dinv(IO_utils&, const int&); + +private: + + // for eikonal solver + int count_cand; + int ii,ii_nr,ii_n2r,ii_pr,ii_p2r,ii_nt,ii_n2t,ii_pt,ii_p2t; + CUSTOMREAL ar,br,at,bt,ar1,ar2,at1,at2,br1,br2,bt1,bt2; + CUSTOMREAL eqn_a, eqn_b, eqn_c, eqn_Delta; + CUSTOMREAL tmp_tau, T_r, T_t, charact_r, charact_t; + bool is_causality; + std::vector canditate = std::vector(60); + + + // member functions + // class functions + void generate_2d_mesh(InputParams&); + void deallocate_arrays(); + void allocate_arrays(); + void load_1d_model(Grid&); + int I2V_1DINV(const int&,const int&); + + // "run_simulation_one_step_1dinv" subfunctions: + void eikonal_solver_2d(InputParams&, int& ); + void initialize_eikonal_array(CUSTOMREAL); + void FSM_2d(); + void calculate_stencil(const int&, const int&); + + void calculate_synthetic_traveltime_and_adjoint_source(InputParams&, int& ); + CUSTOMREAL interpolate_2d_traveltime(const CUSTOMREAL&, const CUSTOMREAL&); + + void adjoint_solver_2d(InputParams&, const int&, const int&); + void initialize_adjoint_array(InputParams&, const int&, const int&); + void FSM_2d_adjoint(const int&); + void calculate_stencil_adj(const int&, const int&); + + void initialize_kernel_1d(); + void calculate_kernel_1d(); + + // "model_optimize_1dinv" subfunctions: + void kernel_processing_1dinv(Grid&); + void density_normalization_1dinv(); + void multi_grid_parameterization_1dinv(Grid&); + void model_update_1dinv(const int&); + void determine_step_size_1dinv(const int&); + CUSTOMREAL norm_1dinv(const CUSTOMREAL*, const int&); + void generate_3d_model(Grid&); +}; + +#endif // ONED_INVERSION_H \ No newline at end of file diff --git a/include/receiver.h b/include/receiver.h new file mode 100644 index 0000000..8fbcc83 --- /dev/null +++ b/include/receiver.h @@ -0,0 +1,36 @@ +#ifndef RECEIVER_H +#define RECEIVER_H + +#include +#include "input_params.h" +#include "grid.h" + +class Receiver { +public: + Receiver(); + ~Receiver(); + + void interpolate_and_store_arrival_times_at_rec_position(InputParams&, Grid&, const std::string&); // only for common receiver differential traveltime + + // adjoint source + void calculate_adjoint_source(InputParams&, const std::string&); + // objective function and residual + std::vector calculate_obj_and_residual(InputParams&); + // Gradient of traveltime + void calculate_T_gradient(InputParams&, Grid&, const std::string&); + // initialize variables for source relocation + void init_vars_src_reloc(InputParams&); + // Gradient of objective function + void calculate_grad_obj_src_reloc(InputParams&, const std::string&); + // objective function + std::vector calculate_obj_reloc(InputParams&, int); + // update source location + void update_source_location(InputParams&, Grid&); + +private: + CUSTOMREAL interpolate_travel_time(Grid&, InputParams&, std::string, std::string); + void calculate_T_gradient_one_rec(Grid&, InputParams&, std::string, CUSTOMREAL*); + bool check_if_receiver_is_in_this_subdomain(Grid&, const CUSTOMREAL&, const CUSTOMREAL&, const CUSTOMREAL&); +}; + +#endif // RECEIVER_H \ No newline at end of file diff --git a/include/simd_conf.h b/include/simd_conf.h new file mode 100644 index 0000000..3101acf --- /dev/null +++ b/include/simd_conf.h @@ -0,0 +1,194 @@ +#ifndef SIMD_CONF_H +#define SIMD_CONF_H + +#ifdef USE_SIMD + +// flags for self controling the SIMD usage +#define USE_AVX __AVX__ +#define USE_AVX512 __AVX512F__ +#define USE_ARM_SVE __ARM_FEATURE_SVE +#define USE_NEON __ARM_NEON__ + +// forcely make USE_AVX and USE_AVX512 to be false if USE_ARM_SVE is true +#if USE_ARM_SVE +#undef USE_AVX +#define USE_AVX 0 +#undef USE_AVX512 +#define USE_AVX512 0 +#endif + +#if USE_AVX || USE_AVX512 +#include +#elif USE_ARM_SVE +#include +#elif USE_NEON +#include +#endif + + +#ifdef SINGLE_PRECISION + +#if USE_AVX && !USE_AVX512 +const int ALIGN = 32; +const int NSIMD = 8; +#define __mT __m256 +#define _mmT_set1_pT _mm256_set1_ps +#define _mmT_loadu_pT _mm256_loadu_ps +#define _mmT_mul_pT _mm256_mul_ps +#define _mmT_sub_pT _mm256_sub_ps +#define _mmT_add_pT _mm256_add_ps +#define _mmT_div_pT _mm256_div_ps +#define _mmT_min_pT _mm256_min_ps +#define _mmT_sqrt_pT _mm256_sqrt_ps +#define _mmT_store_pT _mm256_store_ps +#define _mmT_fmadd_pT _mm256_fmadd_ps + +#define _mm256_cmp_pT _mm256_cmp_ps + +#elif USE_AVX512 +const int ALIGN = 64; +const int NSIMD = 16; +#define __mT __m512 +#define _mmT_set1_pT _mm512_set1_ps +#define _mmT_loadu_pT _mm512_loadu_ps +#define _mmT_mul_pT _mm512_mul_ps +#define _mmT_sub_pT _mm512_sub_ps +#define _mmT_add_pT _mm512_add_ps +#define _mmT_div_pT _mm512_div_ps +#define _mmT_min_pT _mm512_min_ps +#define _mmT_max_pT _mm512_max_ps +#define _mmT_sqrt_pT _mm512_sqrt_ps +#define _mmT_store_pT _mm512_store_ps +#define _mmT_fmadd_pT _mm512_fmadd_ps + +#define __mmaskT __mmask16 +#define _mm512_cmp_pT_mask _mm512_cmp_ps_mask +#define _mm512_mask_blend_pT _mm512_mask_blend_ps +#define _kand_maskT _kand_mask16 + + +#elif USE_ARM_SVE // NOT TESTED YET +const int ALIGN = 8*svcntd(); // use svcntw() for float +const int NSIMD = svcntd(); // Vector Length +#define __mT svfloat32_t +//#define _mmT_set1_pT svdup_f64 +//#define _mmT_loadu_pT svld1_f64_f64_f64 +//#define _mmT_mul_pT svmul_f64_m +//#define _mmT_sub_pT svsub_f64_m +//#define _mmT_add_pT svadd_f64_m +//#define _mmT_div_pT svdiv_f64_m +//#define _mmT_min_pT svmin_f64_m +//#define _mmT_sqrt_pT svsqrt_f64_m +//#define _mmT_store_pT svst1_f64 + +#elif USE_NEON +const int ALIGN = 16; +const int NSIMD = 4; +#define __mT float32x4_t +#define _mmT_set1_pT vdupq_n_f32 +#define _mmT_loadu_pT vld1q_f32 +#define _mmT_mul_pT vmulq_f32 +#define _mmT_sub_pT vsubq_f32 +#define _mmT_add_pT vaddq_f32 +#define _mmT_div_pT vdivq_f32 +#define _mmT_min_pT vminq_f32 +#define _mmT_sqrt_pT vsqrtq_f32 +#define _mmT_store_pT vst1q_f32 + +#endif // __ARM_FEATURE_SVE + + +#else // DOUBLE_PRECISION + +#if USE_AVX && !USE_AVX512 +const int ALIGN = 32; +const int NSIMD = 4; +#define __mT __m256d +#define _mmT_set1_pT _mm256_set1_pd +#define _mmT_loadu_pT _mm256_loadu_pd +#define _mmT_mul_pT _mm256_mul_pd +#define _mmT_sub_pT _mm256_sub_pd +#define _mmT_add_pT _mm256_add_pd +#define _mmT_div_pT _mm256_div_pd +#define _mmT_min_pT _mm256_min_pd +#define _mmT_sqrt_pT _mm256_sqrt_pd +#define _mmT_store_pT _mm256_store_pd +#define _mmT_fmadd_pT _mm256_fmadd_pd + +#define _mm256_cmp_pT _mm256_cmp_pd + +#elif USE_AVX512 +const int ALIGN = 64; +const int NSIMD = 8; +#define __mT __m512d +#define _mmT_set1_pT _mm512_set1_pd +#define _mmT_loadu_pT _mm512_loadu_pd +#define _mmT_mul_pT _mm512_mul_pd +#define _mmT_sub_pT _mm512_sub_pd +#define _mmT_add_pT _mm512_add_pd +#define _mmT_div_pT _mm512_div_pd +#define _mmT_min_pT _mm512_min_pd +#define _mmT_max_pT _mm512_max_pd +#define _mmT_sqrt_pT _mm512_sqrt_pd +#define _mmT_store_pT _mm512_store_pd +#define _mmT_fmadd_pT _mm512_fmadd_pd + +#define __mmaskT __mmask8 +#define _mm512_cmp_pT_mask _mm512_cmp_pd_mask +#define _mm512_mask_blend_pT _mm512_mask_blend_pd +#define _kand_maskT _kand_mask8 + + +#elif USE_ARM_SVE +const int ALIGN = 8*svcntd(); // use svcntw() for float +const int NSIMD = svcntd(); // Vector Length +#define __mT svfloat64_t +//#define _mmT_set1_pT svdup_f64 +//#define _mmT_loadu_pT svld1_f64_f64_f64 +//#define _mmT_mul_pT svmul_f64_m +//#define _mmT_sub_pT svsub_f64_m +//#define _mmT_add_pT svadd_f64_m +//#define _mmT_div_pT svdiv_f64_m +//#define _mmT_min_pT svmin_f64_m +//#define _mmT_sqrt_pT svsqrt_f64_m +//#define _mmT_store_pT svst1_f64 + +#elif USE_NEON +const int ALIGN = 16; +const int NSIMD = 2; +#define __mT float64x2_t +#define _mmT_set1_pT vdupq_n_f64 +#define _mmT_loadu_pT vld1q_f64 +#define _mmT_mul_pT vmulq_f64 +#define _mmT_sub_pT vsubq_f64 +#define _mmT_add_pT vaddq_f64 +#define _mmT_div_pT vdivq_f64 +#define _mmT_min_pT vminq_f64 +#define _mmT_sqrt_pT vsqrtq_f64 +#define _mmT_store_pT vst1q_f64 + +#endif // __ARM_FEATURE_SVE + +#endif // DOUBLE_PRECISION + +inline void print_simd_type() { + std::cout << "SIMD type: "; +#if USE_AVX && !USE_AVX512 + std::cout << "AVX" << std::endl; +#elif USE_AVX512 + std::cout << "AVX512" << std::endl; +#elif USE_ARM_SVE + std::cout << "ARM SVE" << std::endl; +#elif USE_NEON + std::cout << "NEON" << std::endl; +#endif // __ARM_FEATURE_SVE +} + +#else // USE_CUDA but not AVX dummy +const int ALIGN = 32; +const int NSIMD = 4; +#endif // USE_SIMD + + + +#endif // SIMD_CONF_H \ No newline at end of file diff --git a/include/smooth.h b/include/smooth.h new file mode 100644 index 0000000..b39605d --- /dev/null +++ b/include/smooth.h @@ -0,0 +1,773 @@ +#ifndef SMOOTH_H +#define SMOOTH_H + +#include +#include "grid.h" +#include "config.h" +#include "utils.h" + +void calc_inversed_laplacian(CUSTOMREAL* d, CUSTOMREAL* Ap, + const int i, const int j, const int k, + const CUSTOMREAL lr, const CUSTOMREAL lt, const CUSTOMREAL lp, + const CUSTOMREAL dr, const CUSTOMREAL dt, const CUSTOMREAL dp) { + // calculate inversed laplacian operator + CUSTOMREAL termx = _0_CR, termy = _0_CR, termz = _0_CR; + + if (i==0) { + termx = dp*lp/3.0 * (1/(lp*dp)*(d[I2V(i,j,k)]) - lp/(dp*dp*dp)*(-2.0*d[I2V(i,j,k)]+2.0*d[I2V(i+1,j,k)])); + } else if (i==loc_I-1) { + termx = dp*lp/3.0 * (1/(lp*dp)*(d[I2V(i,j,k)]) - lp/(dp*dp*dp)*(-2.0*d[I2V(i,j,k)]+2.0*d[I2V(i-1,j,k)])); + } else { + termx = dp*lp/3.0 * (1/(lp*dp)*(d[I2V(i,j,k)]) - lp/(dp*dp*dp)*(-2.0*d[I2V(i,j,k)]+d[I2V(i-1,j,k)]+d[I2V(i+1,j,k)])); + } + + if (j==0) { + termy = dt*lt/3.0 * (1/(lt*dt)*(d[I2V(i,j,k)]) - lt/(dt*dt*dt)*(-2.0*d[I2V(i,j,k)]+2.0*d[I2V(i,j+1,k)])); + } else if (j==loc_J-1) { + termy = dt*lt/3.0 * (1/(lt*dt)*(d[I2V(i,j,k)]) - lt/(dt*dt*dt)*(-2.0*d[I2V(i,j,k)]+2.0*d[I2V(i,j-1,k)])); + } else { + termy = dt*lt/3.0 * (1/(lt*dt)*(d[I2V(i,j,k)]) - lt/(dt*dt*dt)*(-2.0*d[I2V(i,j,k)]+d[I2V(i,j-1,k)]+d[I2V(i,j+1,k)])); + } + + if (k==0) { + termz = dr*lr/3.0 * (1/(lr*dr)*(d[I2V(i,j,k)]) - lr/(dr*dr*dr)*(-2.0*d[I2V(i,j,k)]+2.0*d[I2V(i,j,k+1)])); + } else if (k==loc_K-1) { + termz = dr*lr/3.0 * (1/(lr*dr)*(d[I2V(i,j,k)]) - lr/(dr*dr*dr)*(-2.0*d[I2V(i,j,k)]+2.0*d[I2V(i,j,k-1)])); + } else { + termz = dr*lr/3.0 * (1/(lr*dr)*(d[I2V(i,j,k)]) - lr/(dr*dr*dr)*(-2.0*d[I2V(i,j,k)]+d[I2V(i,j,k-1)]+d[I2V(i,j,k+1)])); + } + + Ap[I2V(i,j,k)] = termx+termy+termz; +} + + + +void CG_smooth(Grid& grid, CUSTOMREAL* arr_in, CUSTOMREAL* arr_out, CUSTOMREAL lr, CUSTOMREAL lt, CUSTOMREAL lp) { + // arr: array to be smoothed + // lr: smooth length on r + // lt: smooth length on theta + // lp: smooth length on phi + + // arrays : + // x_array model + // g_array gradient + // d_array descent direction + // Ap stiffness scalar (laplacian) + // pAp = d_array*Ap + // rr = g_array * g_array (dot product) + + const int max_iter_cg = 1000; + const CUSTOMREAL xtol = 0.001; + const bool use_scaling = true; + + CUSTOMREAL dr=grid.dr, dt=grid.dt, dp=grid.dp; // in km, rad, rad + //CUSTOMREAL dr=_1_CR,dt=_1_CR,dp=_1_CR; + //debug + std::cout << "dr, dt, dp, lr, lt, lp = " << dr << " " << dt << " " << dp << " " << lr << " " << lt << " " << lp << std::endl; + + // allocate memory + CUSTOMREAL* x_array = allocateMemory(loc_I*loc_J*loc_K, 3000); + CUSTOMREAL* r_array = allocateMemory(loc_I*loc_J*loc_K, 3001); + CUSTOMREAL* p_array = allocateMemory(loc_I*loc_J*loc_K, 3002); + CUSTOMREAL* Ap = allocateMemory(loc_I*loc_J*loc_K, 3003); + CUSTOMREAL pAp=_0_CR, rr_0=_0_CR, rr=_0_CR, rr_new=_0_CR, aa=_0_CR, bb=_0_CR, tmp=_0_CR; + + CUSTOMREAL scaling_A=_1_CR, scaling_coeff = _1_CR; + + if (use_scaling) { + // calculate scaling factor + //scaling_A = std::sqrt(_1_CR / (_8_CR * PI * lr * lt * lp)); + // scaling coefficient for gradient + scaling_coeff = find_absmax(arr_in, loc_I*loc_J*loc_K); + tmp = scaling_coeff; + allreduce_cr_single_max(tmp, scaling_coeff); + //if (scaling_coeff == _0_CR) + if (isZero(scaling_coeff)) + scaling_coeff = _1_CR; + } + // std out scaling factors + if (myrank == 0) { + std::cout << "scaling_A = " << scaling_A << std::endl; + std::cout << "scaling_coeff = " << scaling_coeff << std::endl; + } + + + // array initialization + for (int i=0; ir.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)], grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)])) { + kdr = ii_invr; + r_r = calc_ratio_between(r_glob, grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)], grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)]); + break; + } + } + + r_r_ani = -_1_CR; + for (int ii_invr = 0; ii_invr < n_inv_K_loc_ani-1; ii_invr++){ + // increasing or decreasing order + if (in_between(r_glob, grid.inv_grid->r_ani.arr[I2V_INV_ANI_GRIDS_1DK(ii_invr,i_grid)], grid.inv_grid->r_ani.arr[I2V_INV_ANI_GRIDS_1DK(ii_invr+1,i_grid)])) { + kdr_ani = ii_invr; + r_r_ani = calc_ratio_between(r_glob, grid.inv_grid->r_ani.arr[I2V_INV_ANI_GRIDS_1DK(ii_invr,i_grid)], grid.inv_grid->r_ani.arr[I2V_INV_ANI_GRIDS_1DK(ii_invr+1,i_grid)]); + break; + } + } + // depth model update taper + CUSTOMREAL depth = radius2depth(r_glob); + if (depth < taper[0]) { // weight = 0; + weight = _0_CR; + } else if (depth < taper[1]) { + weight = (_1_CR - std::cos(PI*(depth - taper[0])/(taper[1] - taper[0]))) / _2_CR; + } else { + weight = _1_CR; + } + + // continue if r is out of the inversion grid + if (r_r < _0_CR || r_r_ani < _0_CR) continue; + + for (int j = j_start; j < j_end; j++) { + CUSTOMREAL t_glob = grid.get_lat_min() + j*grid.get_delta_lat(); + r_t = -_1_CR; + for (int ii_invt = 0; ii_invt < n_inv_J_loc-1; ii_invt++){ + CUSTOMREAL left = grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt, kdr,i_grid)]*(1-r_r) + grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt, kdr+1,i_grid)]*(r_r); + CUSTOMREAL right = grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt+1,kdr,i_grid)]*(1-r_r) + grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt+1,kdr+1,i_grid)]*(r_r); + if (in_between(t_glob, left, right)) { + jdt = ii_invt; + r_t = calc_ratio_between(t_glob, left, right); + break; + } + } + + r_t_ani = -_1_CR; + for (int ii_invt = 0; ii_invt < n_inv_J_loc_ani-1; ii_invt++){ + CUSTOMREAL left = grid.inv_grid->t_ani.arr[I2V_INV_ANI_GRIDS_1DJ(ii_invt, kdr_ani,i_grid)]*(1-r_r_ani) + grid.inv_grid->t_ani.arr[I2V_INV_ANI_GRIDS_1DJ(ii_invt, kdr_ani+1,i_grid)]*(r_r_ani); + CUSTOMREAL right = grid.inv_grid->t_ani.arr[I2V_INV_ANI_GRIDS_1DJ(ii_invt+1,kdr_ani,i_grid)]*(1-r_r_ani) + grid.inv_grid->t_ani.arr[I2V_INV_ANI_GRIDS_1DJ(ii_invt+1,kdr_ani+1,i_grid)]*(r_r_ani); + if (in_between(t_glob, left, right)) { + jdt_ani = ii_invt; + r_t_ani = calc_ratio_between(t_glob, left, right); + break; + } + } + + // continue if t is out of the inversion grid + if (r_t < _0_CR || r_t_ani < _0_CR) continue; + + for (int i = i_start; i < i_end; i++) { + CUSTOMREAL p_glob = grid.get_lon_min() + i*grid.get_delta_lon(); + r_p = -_1_CR; + for (int ii_invp = 0; ii_invp < n_inv_I_loc-1; ii_invp++){ + CUSTOMREAL left = grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp, kdr,i_grid)]*(1-r_r) + grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp, kdr+1,i_grid)]*(r_r); + CUSTOMREAL right = grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp+1,kdr,i_grid)]*(1-r_r) + grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp+1,kdr+1,i_grid)]*(r_r); + if (in_between(p_glob, left, right)) { + idp = ii_invp; + r_p = calc_ratio_between(p_glob, left, right); + break; + } + } + + r_p_ani = -_1_CR; + for (int ii_invp = 0; ii_invp < n_inv_I_loc_ani-1; ii_invp++){ + CUSTOMREAL left = grid.inv_grid->p_ani.arr[I2V_INV_ANI_GRIDS_1DI(ii_invp, kdr_ani,i_grid)]*(1-r_r_ani) + grid.inv_grid->p_ani.arr[I2V_INV_ANI_GRIDS_1DI(ii_invp, kdr_ani+1,i_grid)]*(r_r_ani); + CUSTOMREAL right = grid.inv_grid->p_ani.arr[I2V_INV_ANI_GRIDS_1DI(ii_invp+1,kdr_ani,i_grid)]*(1-r_r_ani) + grid.inv_grid->p_ani.arr[I2V_INV_ANI_GRIDS_1DI(ii_invp+1,kdr_ani+1,i_grid)]*(r_r_ani); + if (in_between(p_glob, left, right)) { + idp_ani = ii_invp; + r_p_ani = calc_ratio_between(p_glob, left, right); + break; + } + } + + // continue if p is out of the inversion grid + if (r_p < _0_CR || r_p_ani < _0_CR) continue; + + // global grid id to local id + int k_loc = k - grid.get_offset_k(); + int j_loc = j - grid.get_offset_j(); + int i_loc = i - grid.get_offset_i(); + + // check if *_loc are inside the local subdomain + if (k_loc < 0 || k_loc > loc_K-1) continue; + if (j_loc < 0 || j_loc > loc_J-1) continue; + if (i_loc < 0 || i_loc > loc_I-1) continue; + + CUSTOMREAL pert_Ks = 0.0; + CUSTOMREAL pert_Keta = 0.0; + CUSTOMREAL pert_Kxi = 0.0; + CUSTOMREAL pert_Ks_density = 0.0; + CUSTOMREAL pert_Keta_density = 0.0; + CUSTOMREAL pert_Kxi_density = 0.0; + + pert_Ks += (_1_CR-r_r)*(_1_CR-r_t)*(_1_CR-r_p)*grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt,kdr)]; + pert_Keta += (_1_CR-r_r_ani)*(_1_CR-r_t_ani)*(_1_CR-r_p_ani)*grid.Keta_inv_loc[I2V_INV_ANI_KNL(idp_ani,jdt_ani,kdr_ani)]; + pert_Kxi += (_1_CR-r_r_ani)*(_1_CR-r_t_ani)*(_1_CR-r_p_ani)*grid.Kxi_inv_loc[ I2V_INV_ANI_KNL(idp_ani,jdt_ani,kdr_ani)]; + pert_Ks_density += (_1_CR-r_r)*(_1_CR-r_t)*(_1_CR-r_p)*grid.Ks_density_inv_loc[ I2V_INV_KNL(idp,jdt,kdr)]; + pert_Keta_density += (_1_CR-r_r_ani)*(_1_CR-r_t_ani)*(_1_CR-r_p_ani)*grid.Keta_density_inv_loc[I2V_INV_ANI_KNL(idp_ani,jdt_ani,kdr_ani)]; + pert_Kxi_density += (_1_CR-r_r_ani)*(_1_CR-r_t_ani)*(_1_CR-r_p_ani)*grid.Kxi_density_inv_loc[ I2V_INV_ANI_KNL(idp_ani,jdt_ani,kdr_ani)]; + + pert_Ks += r_r*(_1_CR-r_t)*(_1_CR-r_p)*grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt,kdr+1)]; + pert_Keta += r_r_ani*(_1_CR-r_t_ani)*(_1_CR-r_p_ani)*grid.Keta_inv_loc[I2V_INV_ANI_KNL(idp_ani,jdt_ani,kdr_ani+1)]; + pert_Kxi += r_r_ani*(_1_CR-r_t_ani)*(_1_CR-r_p_ani)*grid.Kxi_inv_loc[ I2V_INV_ANI_KNL(idp_ani,jdt_ani,kdr_ani+1)]; + pert_Ks_density += r_r*(_1_CR-r_t)*(_1_CR-r_p)*grid.Ks_density_inv_loc[ I2V_INV_KNL(idp,jdt,kdr+1)]; + pert_Keta_density += r_r_ani*(_1_CR-r_t_ani)*(_1_CR-r_p_ani)*grid.Keta_density_inv_loc[I2V_INV_ANI_KNL(idp_ani,jdt_ani,kdr_ani+1)]; + pert_Kxi_density += r_r_ani*(_1_CR-r_t_ani)*(_1_CR-r_p_ani)*grid.Kxi_density_inv_loc[ I2V_INV_ANI_KNL(idp_ani,jdt_ani,kdr_ani+1)]; + + pert_Ks += (_1_CR-r_r)*r_t*(_1_CR-r_p)*grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr)]; + pert_Keta += (_1_CR-r_r_ani)*r_t_ani*(_1_CR-r_p_ani)*grid.Keta_inv_loc[I2V_INV_ANI_KNL(idp_ani,jdt_ani+1,kdr_ani)]; + pert_Kxi += (_1_CR-r_r_ani)*r_t_ani*(_1_CR-r_p_ani)*grid.Kxi_inv_loc[ I2V_INV_ANI_KNL(idp_ani,jdt_ani+1,kdr_ani)]; + pert_Ks_density += (_1_CR-r_r)*r_t*(_1_CR-r_p)*grid.Ks_density_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr)]; + pert_Keta_density = (_1_CR-r_r_ani)*r_t_ani*(_1_CR-r_p_ani)*grid.Keta_density_inv_loc[I2V_INV_ANI_KNL(idp_ani,jdt_ani+1,kdr_ani)]; + pert_Kxi_density += (_1_CR-r_r_ani)*r_t_ani*(_1_CR-r_p_ani)*grid.Kxi_density_inv_loc[ I2V_INV_ANI_KNL(idp_ani,jdt_ani+1,kdr_ani)]; + + pert_Ks += (_1_CR-r_r)*(_1_CR-r_t)*r_p*grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr)]; + pert_Keta += (_1_CR-r_r_ani)*(_1_CR-r_t_ani)*r_p_ani*grid.Keta_inv_loc[I2V_INV_ANI_KNL(idp_ani+1,jdt_ani,kdr_ani)]; + pert_Kxi += (_1_CR-r_r_ani)*(_1_CR-r_t_ani)*r_p_ani*grid.Kxi_inv_loc[ I2V_INV_ANI_KNL(idp_ani+1,jdt_ani,kdr_ani)]; + pert_Ks_density += (_1_CR-r_r)*(_1_CR-r_t)*r_p*grid.Ks_density_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr)]; + pert_Keta_density += (_1_CR-r_r_ani)*(_1_CR-r_t_ani)*r_p_ani*grid.Keta_density_inv_loc[I2V_INV_ANI_KNL(idp_ani+1,jdt_ani,kdr_ani)]; + pert_Kxi_density += (_1_CR-r_r_ani)*(_1_CR-r_t_ani)*r_p_ani*grid.Kxi_density_inv_loc[ I2V_INV_ANI_KNL(idp_ani+1,jdt_ani,kdr_ani)]; + + pert_Ks += r_r*r_t*(_1_CR-r_p)*grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr+1)]; + pert_Keta += r_r_ani*r_t_ani*(_1_CR-r_p_ani)*grid.Keta_inv_loc[I2V_INV_ANI_KNL(idp_ani,jdt_ani+1,kdr_ani+1)]; + pert_Kxi += r_r_ani*r_t_ani*(_1_CR-r_p_ani)*grid.Kxi_inv_loc[ I2V_INV_ANI_KNL(idp_ani,jdt_ani+1,kdr_ani+1)]; + pert_Ks_density += r_r*r_t*(_1_CR-r_p)*grid.Ks_density_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr+1)]; + pert_Keta_density += r_r_ani*r_t_ani*(_1_CR-r_p_ani)*grid.Keta_density_inv_loc[I2V_INV_ANI_KNL(idp_ani,jdt_ani+1,kdr_ani+1)]; + pert_Kxi_density += r_r_ani*r_t_ani*(_1_CR-r_p_ani)*grid.Kxi_density_inv_loc[ I2V_INV_ANI_KNL(idp_ani,jdt_ani+1,kdr_ani+1)]; + + pert_Ks += r_r*(_1_CR-r_t)*r_p*grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr+1)]; + pert_Keta += r_r_ani*(_1_CR-r_t_ani)*r_p_ani*grid.Keta_inv_loc[I2V_INV_ANI_KNL(idp_ani+1,jdt_ani,kdr_ani+1)]; + pert_Kxi += r_r_ani*(_1_CR-r_t_ani)*r_p_ani*grid.Kxi_inv_loc[ I2V_INV_ANI_KNL(idp_ani+1,jdt_ani,kdr_ani+1)]; + pert_Ks_density += r_r*(_1_CR-r_t)*r_p*grid.Ks_density_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr+1)]; + pert_Keta_density += r_r_ani*(_1_CR-r_t_ani)*r_p_ani*grid.Keta_density_inv_loc[I2V_INV_ANI_KNL(idp_ani+1,jdt_ani,kdr_ani+1)]; + pert_Kxi_density += r_r_ani*(_1_CR-r_t_ani)*r_p_ani*grid.Kxi_density_inv_loc[ I2V_INV_ANI_KNL(idp_ani+1,jdt_ani,kdr_ani+1)]; + + pert_Ks += (_1_CR-r_r)*r_t*r_p*grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr)]; + pert_Keta += (_1_CR-r_r_ani)*r_t_ani*r_p_ani*grid.Keta_inv_loc[I2V_INV_ANI_KNL(idp_ani+1,jdt_ani+1,kdr_ani)]; + pert_Kxi += (_1_CR-r_r_ani)*r_t_ani*r_p_ani*grid.Kxi_inv_loc[ I2V_INV_ANI_KNL(idp_ani+1,jdt_ani+1,kdr_ani)]; + pert_Ks_density += (_1_CR-r_r)*r_t*r_p*grid.Ks_density_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr)]; + pert_Keta_density += (_1_CR-r_r_ani)*r_t_ani*r_p_ani*grid.Keta_density_inv_loc[I2V_INV_ANI_KNL(idp_ani+1,jdt_ani+1,kdr_ani)]; + pert_Kxi_density += (_1_CR-r_r_ani)*r_t_ani*r_p_ani*grid.Kxi_density_inv_loc[ I2V_INV_ANI_KNL(idp_ani+1,jdt_ani+1,kdr_ani)]; + + pert_Ks += r_r*r_t*r_p*grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr+1)]; + pert_Keta += r_r_ani*r_t_ani*r_p_ani*grid.Keta_inv_loc[I2V_INV_ANI_KNL(idp_ani+1,jdt_ani+1,kdr_ani+1)]; + pert_Kxi += r_r_ani*r_t_ani*r_p_ani*grid.Kxi_inv_loc[ I2V_INV_ANI_KNL(idp_ani+1,jdt_ani+1,kdr_ani+1)]; + pert_Ks_density += r_r*r_t*r_p*grid.Ks_density_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr+1)]; + pert_Keta_density += r_r_ani*r_t_ani*r_p_ani*grid.Keta_density_inv_loc[I2V_INV_ANI_KNL(idp_ani+1,jdt_ani+1,kdr_ani+1)]; + pert_Kxi_density += r_r_ani*r_t_ani*r_p_ani*grid.Kxi_density_inv_loc[ I2V_INV_ANI_KNL(idp_ani+1,jdt_ani+1,kdr_ani+1)]; + + // update para + grid.Ks_update_loc[ I2V(i_loc,j_loc,k_loc)] += weight * pert_Ks; + grid.Keta_update_loc[ I2V(i_loc,j_loc,k_loc)] += weight * pert_Keta; + grid.Kxi_update_loc[ I2V(i_loc,j_loc,k_loc)] += weight * pert_Kxi; + grid.Ks_density_update_loc[ I2V(i_loc,j_loc,k_loc)] += weight * pert_Ks_density; + grid.Keta_density_update_loc[ I2V(i_loc,j_loc,k_loc)] += weight * pert_Keta_density; + grid.Kxi_density_update_loc[ I2V(i_loc,j_loc,k_loc)] += weight * pert_Kxi_density; + + } // end for i + } // end for j + } // end for k + + } // end i_grid + + + // + // rescale kernel update to -1 ~ 1 + // + // get the scaling factor + CUSTOMREAL Linf_Ks = _0_CR, Linf_Keta = _0_CR, Linf_Kxi = _0_CR; + // CUSTOMREAL Linf_Kden = _0_CR; + for (int k = 1; k < loc_K-1; k++) { + for (int j = 1; j < loc_J-1; j++) { + for (int i = 1; i < loc_I-1; i++) { + Linf_Ks = std::max(Linf_Ks, std::abs(grid.Ks_update_loc[I2V(i,j,k)])); + Linf_Keta = std::max(Linf_Keta, std::abs(grid.Keta_update_loc[I2V(i,j,k)])); + Linf_Kxi = std::max(Linf_Kxi, std::abs(grid.Kxi_update_loc[I2V(i,j,k)])); + } + } + } + + // get the maximum scaling factor among subdomains + CUSTOMREAL Linf_tmp; + allreduce_cr_single_max(Linf_Ks, Linf_tmp); Linf_Ks = Linf_tmp; + allreduce_cr_single_max(Linf_Keta, Linf_tmp); Linf_Keta = Linf_tmp; + allreduce_cr_single_max(Linf_Kxi, Linf_tmp); Linf_Kxi = Linf_tmp; + + CUSTOMREAL Linf_all = _0_CR; + Linf_all = std::max(Linf_Ks, std::max(Linf_Keta, Linf_Kxi)); + + Linf_Ks = Linf_all; + Linf_Keta = Linf_all; + Linf_Kxi = Linf_all; + + // rescale the kernel update + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + grid.Ks_update_loc[I2V(i,j,k)] /= Linf_Ks; + grid.Keta_update_loc[I2V(i,j,k)] /= Linf_Keta; + grid.Kxi_update_loc[I2V(i,j,k)] /= Linf_Kxi; + } + } + } +} + + +#endif \ No newline at end of file diff --git a/include/smooth_descent_dir.h b/include/smooth_descent_dir.h new file mode 100644 index 0000000..38c1b55 --- /dev/null +++ b/include/smooth_descent_dir.h @@ -0,0 +1,319 @@ +#ifndef SMOOTH_DESCENT_DIR_H +#define SMOOTH_DESCENT_DIR_H + +#include +#include "grid.h" +#include "config.h" +#include "smooth.h" + + +inline void smooth_descent_dir_CG(Grid& grid, const CUSTOMREAL lr, const CUSTOMREAL lt, const CUSTOMREAL lp) { + // smoothing kernels with Conjugate Gradient method + // lr,lt,lp: smoothing length in r, theta, phi direction + + // smooth Ks + CG_smooth(grid, grid.Ks_descent_dir_loc, grid.Ks_descent_dir_loc, lr, lt, lp); + // smooth Keta + CG_smooth(grid, grid.Keta_descent_dir_loc, grid.Keta_descent_dir_loc, lr, lt, lp); + // smooth Kxi + CG_smooth(grid, grid.Kxi_descent_dir_loc, grid.Kxi_descent_dir_loc, lr, lt, lp); + +} + + +// original method for smoothing kernels +inline void smooth_descent_dir(Grid& grid){ + // necessary params + CUSTOMREAL r_r, r_t, r_p; + int kdr, jdt, idp; + + int k_start = 0; + int j_start = 0; + int i_start = 0; + int k_end = ngrid_k; + int j_end = ngrid_j; + int i_end = ngrid_i; + + // + // sum the kernel values on the inversion grid + // + + for (int i_grid = 0; i_grid < n_inv_grids; i_grid++) { + + // init coarser kernel arrays + for (int k = 0; k < n_inv_K_loc; k++) { + for (int j = 0; j < n_inv_J_loc; j++) { + for (int i = 0; i < n_inv_I_loc; i++) { + grid.Ks_inv_loc[ I2V_INV_KNL(i,j,k)] = _0_CR; + grid.Keta_inv_loc[I2V_INV_KNL(i,j,k)] = _0_CR; + grid.Kxi_inv_loc[ I2V_INV_KNL(i,j,k)] = _0_CR; + } + } + } + + for (int k = k_start; k < k_end; k++) { + // CUSTOMREAL r_glob = grid.get_r_min() + k*grid.get_delta_r(); // global coordinate of r + // r_r = -_1_CR; + // for (int ii_invr = 0; ii_invr < n_inv_K_loc-1; ii_invr++){ + // if (r_glob > grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)] && r_glob <= grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)]) { + // kdr = ii_invr; + // r_r = (r_glob - grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)]) / (grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)] - grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)]); + // break; + // } + // } + CUSTOMREAL r_glob = grid.get_r_min() + k*grid.get_delta_r(); // global coordinate of r + r_r = -_1_CR; + for (int ii_invr = 0; ii_invr < n_inv_K_loc-1; ii_invr++){ + // increasing or decreasing order + if (in_between(r_glob, grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)], grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)])) { + kdr = ii_invr; + r_r = calc_ratio_between(r_glob, grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)], grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)]); + break; + } + } + // continue if r is out of the inversion grid + if (r_r < 0) continue; + + for (int j = j_start; j < j_end; j++) { + // CUSTOMREAL t_glob = grid.get_lat_min() + j*grid.get_delta_lat(); + // r_t = -_1_CR; + // for (int ii_invt = 0; ii_invt < n_inv_J_loc-1; ii_invt++){ + // if (t_glob > grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt,i_grid)] && t_glob <= grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt+1,i_grid)]) { + // jdt = ii_invt; + // r_t = (t_glob - grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt,i_grid)]) / (grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt+1,i_grid)] - grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt,i_grid)]); + // break; + // } + // } + CUSTOMREAL t_glob = grid.get_lat_min() + j*grid.get_delta_lat(); // global coordinate of t (latitude) + r_t = -_1_CR; + for (int ii_invt = 0; ii_invt < n_inv_J_loc-1; ii_invt++){ + CUSTOMREAL left = grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt, kdr,i_grid)]*(1-r_r) + grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt, kdr+1,i_grid)]*(r_r); + CUSTOMREAL right = grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt+1,kdr,i_grid)]*(1-r_r) + grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt+1,kdr+1,i_grid)]*(r_r); + if (in_between(t_glob, left, right)) { + jdt = ii_invt; + r_t = calc_ratio_between(t_glob, left, right); + break; + } + } + + // continue if t is out of the inversion grid + if (r_t < 0) continue; + + for (int i = i_start; i < i_end; i++) { + // CUSTOMREAL p_glob = grid.get_lon_min() + i*grid.get_delta_lon(); + // r_p = -_1_CR; + // for (int ii_invp = 0; ii_invp < n_inv_I_loc-1; ii_invp++){ + // if (p_glob > grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp,i_grid)] && p_glob <= grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp+1,i_grid)]) { + // idp = ii_invp; + // r_p = (p_glob - grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp,i_grid)]) / (grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp+1,i_grid)] - grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp,i_grid)]); + // break; + // } + // } + CUSTOMREAL p_glob = grid.get_lon_min() + i*grid.get_delta_lon(); // global coordinate of p (longitude) + r_p = -_1_CR; + for (int ii_invp = 0; ii_invp < n_inv_I_loc-1; ii_invp++){ + CUSTOMREAL left = grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp, kdr,i_grid)]*(1-r_r) + grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp, kdr,i_grid)]*(r_r); + CUSTOMREAL right = grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp+1,kdr,i_grid)]*(1-r_r) + grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp+1,kdr,i_grid)]*(r_r); + if (in_between(p_glob, left, right)) { + idp = ii_invp; + r_p = calc_ratio_between(p_glob, left, right); + break; + } + } + + // continue if p is out of the inversion grid + if (r_p < 0) continue; + + // global grid id to local id + int k_loc = k - grid.get_offset_k(); + int j_loc = j - grid.get_offset_j(); + int i_loc = i - grid.get_offset_i(); + + // check if *_loc are inside the local subdomain + if (k_loc < 0 || k_loc > loc_K-1) continue; + if (j_loc < 0 || j_loc > loc_J-1) continue; + if (i_loc < 0 || i_loc > loc_I-1) continue; + + // update Ks_inv Keta_inv Kxi_inv + grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt,kdr)] += (_1_CR-r_r)*(_1_CR-r_t)*(_1_CR-r_p)*grid.Ks_descent_dir_loc[ I2V(i_loc,j_loc,k_loc)]; + grid.Keta_inv_loc[I2V_INV_KNL(idp,jdt,kdr)] += (_1_CR-r_r)*(_1_CR-r_t)*(_1_CR-r_p)*grid.Keta_descent_dir_loc[I2V(i_loc,j_loc,k_loc)]; + grid.Kxi_inv_loc[ I2V_INV_KNL(idp,jdt,kdr)] += (_1_CR-r_r)*(_1_CR-r_t)*(_1_CR-r_p)*grid.Kxi_descent_dir_loc[ I2V(i_loc,j_loc,k_loc)]; + + grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt,kdr+1)] += r_r*(_1_CR-r_t)*(_1_CR-r_p)*grid.Ks_descent_dir_loc[ I2V(i_loc,j_loc,k_loc)]; + grid.Keta_inv_loc[I2V_INV_KNL(idp,jdt,kdr+1)] += r_r*(_1_CR-r_t)*(_1_CR-r_p)*grid.Keta_descent_dir_loc[I2V(i_loc,j_loc,k_loc)]; + grid.Kxi_inv_loc[ I2V_INV_KNL(idp,jdt,kdr+1)] += r_r*(_1_CR-r_t)*(_1_CR-r_p)*grid.Kxi_descent_dir_loc[ I2V(i_loc,j_loc,k_loc)]; + + grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr)] += (_1_CR-r_r)*r_t*(_1_CR-r_p)*grid.Ks_descent_dir_loc[ I2V(i_loc,j_loc,k_loc)]; + grid.Keta_inv_loc[I2V_INV_KNL(idp,jdt+1,kdr)] += (_1_CR-r_r)*r_t*(_1_CR-r_p)*grid.Keta_descent_dir_loc[I2V(i_loc,j_loc,k_loc)]; + grid.Kxi_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr)] += (_1_CR-r_r)*r_t*(_1_CR-r_p)*grid.Kxi_descent_dir_loc[ I2V(i_loc,j_loc,k_loc)]; + + grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr)] += (_1_CR-r_r)*(_1_CR-r_t)*r_p*grid.Ks_descent_dir_loc[ I2V(i_loc,j_loc,k_loc)]; + grid.Keta_inv_loc[I2V_INV_KNL(idp+1,jdt,kdr)] += (_1_CR-r_r)*(_1_CR-r_t)*r_p*grid.Keta_descent_dir_loc[I2V(i_loc,j_loc,k_loc)]; + grid.Kxi_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr)] += (_1_CR-r_r)*(_1_CR-r_t)*r_p*grid.Kxi_descent_dir_loc[ I2V(i_loc,j_loc,k_loc)]; + + grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr+1)] += r_r*r_t*(_1_CR-r_p)*grid.Ks_descent_dir_loc[ I2V(i_loc,j_loc,k_loc)]; + grid.Keta_inv_loc[I2V_INV_KNL(idp,jdt+1,kdr+1)] += r_r*r_t*(_1_CR-r_p)*grid.Keta_descent_dir_loc[I2V(i_loc,j_loc,k_loc)]; + grid.Kxi_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr+1)] += r_r*r_t*(_1_CR-r_p)*grid.Kxi_descent_dir_loc[ I2V(i_loc,j_loc,k_loc)]; + + grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr+1)] += r_r*(_1_CR-r_t)*r_p*grid.Ks_descent_dir_loc[ I2V(i_loc,j_loc,k_loc)]; + grid.Keta_inv_loc[I2V_INV_KNL(idp+1,jdt,kdr+1)] += r_r*(_1_CR-r_t)*r_p*grid.Keta_descent_dir_loc[I2V(i_loc,j_loc,k_loc)]; + grid.Kxi_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr+1)] += r_r*(_1_CR-r_t)*r_p*grid.Kxi_descent_dir_loc[ I2V(i_loc,j_loc,k_loc)]; + + grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr)] += (_1_CR-r_r)*r_t*r_p*grid.Ks_descent_dir_loc[ I2V(i_loc,j_loc,k_loc)]; + grid.Keta_inv_loc[I2V_INV_KNL(idp+1,jdt+1,kdr)] += (_1_CR-r_r)*r_t*r_p*grid.Keta_descent_dir_loc[I2V(i_loc,j_loc,k_loc)]; + grid.Kxi_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr)] += (_1_CR-r_r)*r_t*r_p*grid.Kxi_descent_dir_loc[ I2V(i_loc,j_loc,k_loc)]; + + grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr+1)] += r_r*r_t*r_p*grid.Ks_descent_dir_loc[ I2V(i_loc,j_loc,k_loc)]; + grid.Keta_inv_loc[I2V_INV_KNL(idp+1,jdt+1,kdr+1)] += r_r*r_t*r_p*grid.Keta_descent_dir_loc[I2V(i_loc,j_loc,k_loc)]; + grid.Kxi_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr+1)] += r_r*r_t*r_p*grid.Kxi_descent_dir_loc[ I2V(i_loc,j_loc,k_loc)]; + + } // end for i + } // end for j + } // end for k + + // sum over all sub-domains + allreduce_cr_inplace(grid.Ks_inv_loc, n_inv_I_loc*n_inv_J_loc*n_inv_K_loc); + allreduce_cr_inplace(grid.Keta_inv_loc, n_inv_I_loc*n_inv_J_loc*n_inv_K_loc); + allreduce_cr_inplace(grid.Kxi_inv_loc, n_inv_I_loc*n_inv_J_loc*n_inv_K_loc); + + // + // update factors + // + for (int k = k_start; k < k_end; k++) { + // CUSTOMREAL r_glob = grid.get_r_min() + k*grid.get_delta_r(); // global coordinate of r + // r_r = -_1_CR; + // for (int ii_invr = 0; ii_invr < n_inv_K_loc-1; ii_invr++){ + // if (r_glob > grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)] && r_glob <= grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)]) { + // kdr = ii_invr; + // r_r = (r_glob - grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)]) / (grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)] - grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)]); + // break; + // } + // } + CUSTOMREAL r_glob = grid.get_r_min() + k*grid.get_delta_r(); // global coordinate of r + r_r = -_1_CR; + for (int ii_invr = 0; ii_invr < n_inv_K_loc-1; ii_invr++){ + if (in_between(r_glob, grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)], grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)])) { + kdr = ii_invr; + r_r = calc_ratio_between(r_glob, grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)], grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)]); + break; + } + } + + // continue if r is out of the inversion grid + if (r_r < 0) continue; + + for (int j = j_start; j < j_end; j++) { + // CUSTOMREAL t_glob = grid.get_lat_min() + j*grid.get_delta_lat(); + // r_t = -_1_CR; + // for (int ii_invt = 0; ii_invt < n_inv_J_loc-1; ii_invt++){ + // if (t_glob > grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt,i_grid)] && t_glob <= grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt+1,i_grid)]) { + // jdt = ii_invt; + // r_t = (t_glob - grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt,i_grid)]) / (grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt+1,i_grid)] - grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt,i_grid)]); + // break; + // } + // } + CUSTOMREAL t_glob = grid.get_lat_min() + j*grid.get_delta_lat(); + r_t = -_1_CR; + for (int ii_invt = 0; ii_invt < n_inv_J_loc-1; ii_invt++){ + CUSTOMREAL left = grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt, kdr,i_grid)]*(1-r_r) + grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt, kdr+1,i_grid)]*(r_r); + CUSTOMREAL right = grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt+1,kdr,i_grid)]*(1-r_r) + grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt+1,kdr+1,i_grid)]*(r_r); + if (in_between(t_glob, left, right)) { + jdt = ii_invt; + r_t = calc_ratio_between(t_glob, left, right); + break; + } + } + + + // continue if t is out of the inversion grid + if (r_t < 0) continue; + + for (int i = i_start; i < i_end; i++) { + // CUSTOMREAL p_glob = grid.get_lon_min() + i*grid.get_delta_lon(); + // r_p = -_1_CR; + // for (int ii_invp = 0; ii_invp < n_inv_I_loc-1; ii_invp++){ + // if (p_glob > grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp,i_grid)] && p_glob <= grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp+1,i_grid)]) { + // idp = ii_invp; + // r_p = (p_glob - grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp,i_grid)]) / (grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp+1,i_grid)] - grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp,i_grid)]); + // break; + // } + // } + CUSTOMREAL p_glob = grid.get_lon_min() + i*grid.get_delta_lon(); + r_p = -_1_CR; + for (int ii_invp = 0; ii_invp < n_inv_I_loc-1; ii_invp++){ + CUSTOMREAL left = grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp, kdr,i_grid)]*(1-r_r) + grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp, kdr,i_grid)]*(r_r); + CUSTOMREAL right = grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp+1,kdr,i_grid)]*(1-r_r) + grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp+1,kdr,i_grid)]*(r_r); + if (in_between(p_glob, left, right)) { + idp = ii_invp; + r_p = calc_ratio_between(p_glob, left, right); + break; + } + } + + // continue if p is out of the inversion grid + if (r_p < 0) continue; + + // global grid id to local id + int k_loc = k - grid.get_offset_k(); + int j_loc = j - grid.get_offset_j(); + int i_loc = i - grid.get_offset_i(); + + // check if *_loc are inside the local subdomain + if (k_loc < 0 || k_loc > loc_K-1) continue; + if (j_loc < 0 || j_loc > loc_J-1) continue; + if (i_loc < 0 || i_loc > loc_I-1) continue; + + CUSTOMREAL pert_Ks = 0.0; + CUSTOMREAL pert_Keta = 0.0; + CUSTOMREAL pert_Kxi = 0.0; + + pert_Ks += (_1_CR-r_r)*(_1_CR-r_t)*(_1_CR-r_p)*grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt,kdr)]; + pert_Keta += (_1_CR-r_r)*(_1_CR-r_t)*(_1_CR-r_p)*grid.Keta_inv_loc[I2V_INV_KNL(idp,jdt,kdr)]; + pert_Kxi += (_1_CR-r_r)*(_1_CR-r_t)*(_1_CR-r_p)*grid.Kxi_inv_loc[ I2V_INV_KNL(idp,jdt,kdr)]; + + pert_Ks += r_r*(_1_CR-r_t)*(_1_CR-r_p)*grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt,kdr+1)]; + pert_Keta += r_r*(_1_CR-r_t)*(_1_CR-r_p)*grid.Keta_inv_loc[I2V_INV_KNL(idp,jdt,kdr+1)]; + pert_Kxi += r_r*(_1_CR-r_t)*(_1_CR-r_p)*grid.Kxi_inv_loc[ I2V_INV_KNL(idp,jdt,kdr+1)]; + + pert_Ks += (_1_CR-r_r)*r_t*(_1_CR-r_p)*grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr)]; + pert_Keta += (_1_CR-r_r)*r_t*(_1_CR-r_p)*grid.Keta_inv_loc[I2V_INV_KNL(idp,jdt+1,kdr)]; + pert_Kxi += (_1_CR-r_r)*r_t*(_1_CR-r_p)*grid.Kxi_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr)]; + + pert_Ks += (_1_CR-r_r)*(_1_CR-r_t)*r_p*grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr)]; + pert_Keta += (_1_CR-r_r)*(_1_CR-r_t)*r_p*grid.Keta_inv_loc[I2V_INV_KNL(idp+1,jdt,kdr)]; + pert_Kxi += (_1_CR-r_r)*(_1_CR-r_t)*r_p*grid.Kxi_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr)]; + + pert_Ks += r_r*r_t*(_1_CR-r_p)*grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr+1)]; + pert_Keta += r_r*r_t*(_1_CR-r_p)*grid.Keta_inv_loc[I2V_INV_KNL(idp,jdt+1,kdr+1)]; + pert_Kxi += r_r*r_t*(_1_CR-r_p)*grid.Kxi_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr+1)]; + + pert_Ks += r_r*(_1_CR-r_t)*r_p*grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr+1)]; + pert_Keta += r_r*(_1_CR-r_t)*r_p*grid.Keta_inv_loc[I2V_INV_KNL(idp+1,jdt,kdr+1)]; + pert_Kxi += r_r*(_1_CR-r_t)*r_p*grid.Kxi_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr+1)]; + + pert_Ks += (_1_CR-r_r)*r_t*r_p*grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr)]; + pert_Keta += (_1_CR-r_r)*r_t*r_p*grid.Keta_inv_loc[I2V_INV_KNL(idp+1,jdt+1,kdr)]; + pert_Kxi += (_1_CR-r_r)*r_t*r_p*grid.Kxi_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr)]; + + pert_Ks += r_r*r_t*r_p*grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr+1)]; + pert_Keta += r_r*r_t*r_p*grid.Keta_inv_loc[I2V_INV_KNL(idp+1,jdt+1,kdr+1)]; + pert_Kxi += r_r*r_t*r_p*grid.Kxi_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr+1)]; + + + // update para + grid.Ks_descent_dir_loc[ I2V(i_loc,j_loc,k_loc)] += pert_Ks; + grid.Keta_descent_dir_loc[I2V(i_loc,j_loc,k_loc)] += pert_Keta; + grid.Kxi_descent_dir_loc[ I2V(i_loc,j_loc,k_loc)] += pert_Kxi; + + + } // end for i + } // end for j + } // end for k + + } // end i_grid + +} + + + +#endif \ No newline at end of file diff --git a/include/smooth_grad_regul.h b/include/smooth_grad_regul.h new file mode 100644 index 0000000..bc1db58 --- /dev/null +++ b/include/smooth_grad_regul.h @@ -0,0 +1,321 @@ +#ifndef SMOOTH_GRAD_REGUL_H +#define SMOOTH_GRAD_REGUL_H + +#include +#include "grid.h" +#include "config.h" +#include "smooth.h" + +inline void smooth_gradient_regularization_CG(Grid& grid, const CUSTOMREAL lr, const CUSTOMREAL lt, const CUSTOMREAL lp) { + // smoothing kernels with Conjugate Gradient method + // lr,lt,lp: smoothing length in r, theta, phi direction + + // smooth Ks + CG_smooth(grid, grid.fun_gradient_regularization_penalty_loc, \ + grid.fun_gradient_regularization_penalty_loc, lr, lt, lp); + // smooth Keta + CG_smooth(grid, grid.eta_gradient_regularization_penalty_loc, \ + grid.eta_gradient_regularization_penalty_loc, lr, lt, lp); + // smooth Kxi + CG_smooth(grid, grid.xi_gradient_regularization_penalty_loc, \ + grid.xi_gradient_regularization_penalty_loc, lr, lt, lp); + +} + +// original method for smoothing kernels +inline void smooth_gradient_regularization_orig(Grid& grid){ + // necessary params + CUSTOMREAL r_r, r_t, r_p; + int kdr, jdt, idp; + + int k_start = 0; + int j_start = 0; + int i_start = 0; + int k_end = ngrid_k; + int j_end = ngrid_j; + int i_end = ngrid_i; + + // + // sum the kernel values on the inversion grid + // + + for (int i_grid = 0; i_grid < n_inv_grids; i_grid++) { + + // init coarser kernel arrays + for (int k = 0; k < n_inv_K_loc; k++) { + for (int j = 0; j < n_inv_J_loc; j++) { + for (int i = 0; i < n_inv_I_loc; i++) { + grid.Ks_inv_loc[ I2V_INV_KNL(i,j,k)] = _0_CR; + grid.Keta_inv_loc[I2V_INV_KNL(i,j,k)] = _0_CR; + grid.Kxi_inv_loc[ I2V_INV_KNL(i,j,k)] = _0_CR; + } + } + } + + for (int k = k_start; k < k_end; k++) { + // CUSTOMREAL r_glob = grid.get_r_min() + k*grid.get_delta_r(); // global coordinate of r + // r_r = -_1_CR; + // for (int ii_invr = 0; ii_invr < n_inv_K_loc-1; ii_invr++){ + // if (r_glob > grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)] && r_glob <= grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)]) { + // kdr = ii_invr; + // r_r = (r_glob - grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)]) / (grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)] - grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)]); + // break; + // } + // } + CUSTOMREAL r_glob = grid.get_r_min() + k*grid.get_delta_r(); // global coordinate of r + r_r = -_1_CR; + for (int ii_invr = 0; ii_invr < n_inv_K_loc-1; ii_invr++){ + // increasing or decreasing order + if (in_between(r_glob, grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)], grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)])) { + kdr = ii_invr; + r_r = calc_ratio_between(r_glob, grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)], grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)]); + break; + } + } + + // continue if r is out of the inversion grid + if (r_r < 0) continue; + + for (int j = j_start; j < j_end; j++) { + // CUSTOMREAL t_glob = grid.get_lat_min() + j*grid.get_delta_lat(); + // r_t = -_1_CR; + // for (int ii_invt = 0; ii_invt < n_inv_J_loc-1; ii_invt++){ + // if (t_glob > grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt,i_grid)] && t_glob <= grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt+1,i_grid)]) { + // jdt = ii_invt; + // r_t = (t_glob - grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt,i_grid)]) / (grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt+1,i_grid)] - grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt,i_grid)]); + // break; + // } + // } + CUSTOMREAL t_glob = grid.get_lat_min() + j*grid.get_delta_lat(); // global coordinate of t (latitude) + r_t = -_1_CR; + for (int ii_invt = 0; ii_invt < n_inv_J_loc-1; ii_invt++){ + CUSTOMREAL left = grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt, kdr,i_grid)]*(1-r_r) + grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt, kdr+1,i_grid)]*(r_r); + CUSTOMREAL right = grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt+1,kdr,i_grid)]*(1-r_r) + grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt+1,kdr+1,i_grid)]*(r_r); + if (in_between(t_glob, left, right)) { + jdt = ii_invt; + r_t = calc_ratio_between(t_glob, left, right); + break; + } + } + + // continue if t is out of the inversion grid + if (r_t < 0) continue; + + for (int i = i_start; i < i_end; i++) { + // CUSTOMREAL p_glob = grid.get_lon_min() + i*grid.get_delta_lon(); + // r_p = -_1_CR; + // for (int ii_invp = 0; ii_invp < n_inv_I_loc-1; ii_invp++){ + // if (p_glob > grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp,i_grid)] && p_glob <= grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp+1,i_grid)]) { + // idp = ii_invp; + // r_p = (p_glob - grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp,i_grid)]) / (grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp+1,i_grid)] - grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp,i_grid)]); + // break; + // } + // } + CUSTOMREAL p_glob = grid.get_lon_min() + i*grid.get_delta_lon(); // global coordinate of p (longitude) + r_p = -_1_CR; + for (int ii_invp = 0; ii_invp < n_inv_I_loc-1; ii_invp++){ + CUSTOMREAL left = grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp, kdr,i_grid)]*(1-r_r) + grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp, kdr,i_grid)]*(r_r); + CUSTOMREAL right = grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp+1,kdr,i_grid)]*(1-r_r) + grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp+1,kdr,i_grid)]*(r_r); + if (in_between(p_glob, left, right)) { + idp = ii_invp; + r_p = calc_ratio_between(p_glob, left, right); + break; + } + } + + // continue if p is out of the inversion grid + if (r_p < 0) continue; + + // global grid id to local id + int k_loc = k - grid.get_offset_k(); + int j_loc = j - grid.get_offset_j(); + int i_loc = i - grid.get_offset_i(); + + // check if *_loc are inside the local subdomain + if (k_loc < 0 || k_loc > loc_K-1) continue; + if (j_loc < 0 || j_loc > loc_J-1) continue; + if (i_loc < 0 || i_loc > loc_I-1) continue; + + // update Ks_inv Keta_inv Kxi_inv + grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt,kdr)] += (_1_CR-r_r)*(_1_CR-r_t)*(_1_CR-r_p)*grid.fun_gradient_regularization_penalty_loc[ I2V(i_loc,j_loc,k_loc)]; + grid.Keta_inv_loc[I2V_INV_KNL(idp,jdt,kdr)] += (_1_CR-r_r)*(_1_CR-r_t)*(_1_CR-r_p)*grid.eta_gradient_regularization_penalty_loc[I2V(i_loc,j_loc,k_loc)]; + grid.Kxi_inv_loc[ I2V_INV_KNL(idp,jdt,kdr)] += (_1_CR-r_r)*(_1_CR-r_t)*(_1_CR-r_p)*grid.xi_gradient_regularization_penalty_loc[ I2V(i_loc,j_loc,k_loc)]; + + grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt,kdr+1)] += r_r*(_1_CR-r_t)*(_1_CR-r_p)*grid.fun_gradient_regularization_penalty_loc[ I2V(i_loc,j_loc,k_loc)]; + grid.Keta_inv_loc[I2V_INV_KNL(idp,jdt,kdr+1)] += r_r*(_1_CR-r_t)*(_1_CR-r_p)*grid.eta_gradient_regularization_penalty_loc[I2V(i_loc,j_loc,k_loc)]; + grid.Kxi_inv_loc[ I2V_INV_KNL(idp,jdt,kdr+1)] += r_r*(_1_CR-r_t)*(_1_CR-r_p)*grid.xi_gradient_regularization_penalty_loc[ I2V(i_loc,j_loc,k_loc)]; + + grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr)] += (_1_CR-r_r)*r_t*(_1_CR-r_p)*grid.fun_gradient_regularization_penalty_loc[ I2V(i_loc,j_loc,k_loc)]; + grid.Keta_inv_loc[I2V_INV_KNL(idp,jdt+1,kdr)] += (_1_CR-r_r)*r_t*(_1_CR-r_p)*grid.eta_gradient_regularization_penalty_loc[I2V(i_loc,j_loc,k_loc)]; + grid.Kxi_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr)] += (_1_CR-r_r)*r_t*(_1_CR-r_p)*grid.xi_gradient_regularization_penalty_loc[ I2V(i_loc,j_loc,k_loc)]; + + grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr)] += (_1_CR-r_r)*(_1_CR-r_t)*r_p*grid.fun_gradient_regularization_penalty_loc[ I2V(i_loc,j_loc,k_loc)]; + grid.Keta_inv_loc[I2V_INV_KNL(idp+1,jdt,kdr)] += (_1_CR-r_r)*(_1_CR-r_t)*r_p*grid.eta_gradient_regularization_penalty_loc[I2V(i_loc,j_loc,k_loc)]; + grid.Kxi_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr)] += (_1_CR-r_r)*(_1_CR-r_t)*r_p*grid.xi_gradient_regularization_penalty_loc[ I2V(i_loc,j_loc,k_loc)]; + + grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr+1)] += r_r*r_t*(_1_CR-r_p)*grid.fun_gradient_regularization_penalty_loc[ I2V(i_loc,j_loc,k_loc)]; + grid.Keta_inv_loc[I2V_INV_KNL(idp,jdt+1,kdr+1)] += r_r*r_t*(_1_CR-r_p)*grid.eta_gradient_regularization_penalty_loc[I2V(i_loc,j_loc,k_loc)]; + grid.Kxi_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr+1)] += r_r*r_t*(_1_CR-r_p)*grid.xi_gradient_regularization_penalty_loc[ I2V(i_loc,j_loc,k_loc)]; + + grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr+1)] += r_r*(_1_CR-r_t)*r_p*grid.fun_gradient_regularization_penalty_loc[ I2V(i_loc,j_loc,k_loc)]; + grid.Keta_inv_loc[I2V_INV_KNL(idp+1,jdt,kdr+1)] += r_r*(_1_CR-r_t)*r_p*grid.eta_gradient_regularization_penalty_loc[I2V(i_loc,j_loc,k_loc)]; + grid.Kxi_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr+1)] += r_r*(_1_CR-r_t)*r_p*grid.xi_gradient_regularization_penalty_loc[ I2V(i_loc,j_loc,k_loc)]; + + grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr)] += (_1_CR-r_r)*r_t*r_p*grid.fun_gradient_regularization_penalty_loc[ I2V(i_loc,j_loc,k_loc)]; + grid.Keta_inv_loc[I2V_INV_KNL(idp+1,jdt+1,kdr)] += (_1_CR-r_r)*r_t*r_p*grid.eta_gradient_regularization_penalty_loc[I2V(i_loc,j_loc,k_loc)]; + grid.Kxi_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr)] += (_1_CR-r_r)*r_t*r_p*grid.xi_gradient_regularization_penalty_loc[ I2V(i_loc,j_loc,k_loc)]; + + grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr+1)] += r_r*r_t*r_p*grid.fun_gradient_regularization_penalty_loc[ I2V(i_loc,j_loc,k_loc)]; + grid.Keta_inv_loc[I2V_INV_KNL(idp+1,jdt+1,kdr+1)] += r_r*r_t*r_p*grid.eta_gradient_regularization_penalty_loc[I2V(i_loc,j_loc,k_loc)]; + grid.Kxi_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr+1)] += r_r*r_t*r_p*grid.xi_gradient_regularization_penalty_loc[ I2V(i_loc,j_loc,k_loc)]; + + } // end for i + } // end for j + } // end for k + + // sum over all sub-domains + allreduce_cr_inplace(grid.Ks_inv_loc, n_inv_I_loc*n_inv_J_loc*n_inv_K_loc); + allreduce_cr_inplace(grid.Keta_inv_loc, n_inv_I_loc*n_inv_J_loc*n_inv_K_loc); + allreduce_cr_inplace(grid.Kxi_inv_loc, n_inv_I_loc*n_inv_J_loc*n_inv_K_loc); + + // + // update factors + // + for (int k = k_start; k < k_end; k++) { + // CUSTOMREAL r_glob = grid.get_r_min() + k*grid.get_delta_r(); // global coordinate of r + // r_r = -_1_CR; + // for (int ii_invr = 0; ii_invr < n_inv_K_loc-1; ii_invr++){ + // if (r_glob > grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)] && r_glob <= grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)]) { + // kdr = ii_invr; + // r_r = (r_glob - grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)]) / (grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)] - grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)]); + // break; + // } + // } + CUSTOMREAL r_glob = grid.get_r_min() + k*grid.get_delta_r(); // global coordinate of r + r_r = -_1_CR; + for (int ii_invr = 0; ii_invr < n_inv_K_loc-1; ii_invr++){ + // increasing or decreasing order + if (in_between(r_glob, grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)], grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)])) { + kdr = ii_invr; + r_r = calc_ratio_between(r_glob, grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)], grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)]); + break; + } + } + + // continue if r is out of the inversion grid + if (r_r < 0) continue; + + for (int j = j_start; j < j_end; j++) { + // CUSTOMREAL t_glob = grid.get_lat_min() + j*grid.get_delta_lat(); + // r_t = -_1_CR; + // for (int ii_invt = 0; ii_invt < n_inv_J_loc-1; ii_invt++){ + // if (t_glob > grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt,i_grid)] && t_glob <= grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt+1,i_grid)]) { + // jdt = ii_invt; + // r_t = (t_glob - grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt,i_grid)]) / (grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt+1,i_grid)] - grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt,i_grid)]); + // break; + // } + // } + CUSTOMREAL t_glob = grid.get_lat_min() + j*grid.get_delta_lat(); // global coordinate of t (latitude) + r_t = -_1_CR; + for (int ii_invt = 0; ii_invt < n_inv_J_loc-1; ii_invt++){ + CUSTOMREAL left = grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt, kdr,i_grid)]*(1-r_r) + grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt, kdr+1,i_grid)]*(r_r); + CUSTOMREAL right = grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt+1,kdr,i_grid)]*(1-r_r) + grid.inv_grid->t.arr[I2V_INV_GRIDS_2DJ(ii_invt+1,kdr+1,i_grid)]*(r_r); + if (in_between(t_glob, left, right)) { + jdt = ii_invt; + r_t = calc_ratio_between(t_glob, left, right); + break; + } + } + + // continue if t is out of the inversion grid + if (r_t < 0) continue; + + for (int i = i_start; i < i_end; i++) { + // CUSTOMREAL p_glob = grid.get_lon_min() + i*grid.get_delta_lon(); + // r_p = -_1_CR; + // for (int ii_invp = 0; ii_invp < n_inv_I_loc-1; ii_invp++){ + // if (p_glob > grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp,i_grid)] && p_glob <= grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp+1,i_grid)]) { + // idp = ii_invp; + // r_p = (p_glob - grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp,i_grid)]) / (grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp+1,i_grid)] - grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp,i_grid)]); + // break; + // } + // } + CUSTOMREAL p_glob = grid.get_lon_min() + i*grid.get_delta_lon(); // global coordinate of p (longitude) + r_p = -_1_CR; + for (int ii_invp = 0; ii_invp < n_inv_I_loc-1; ii_invp++){ + CUSTOMREAL left = grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp, kdr,i_grid)]*(1-r_r) + grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp, kdr,i_grid)]*(r_r); + CUSTOMREAL right = grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp+1,kdr,i_grid)]*(1-r_r) + grid.inv_grid->p.arr[I2V_INV_GRIDS_2DI(ii_invp+1,kdr,i_grid)]*(r_r); + if (in_between(p_glob, left, right)) { + idp = ii_invp; + r_p = calc_ratio_between(p_glob, left, right); + break; + } + } + + // continue if p is out of the inversion grid + if (r_p < 0) continue; + + // global grid id to local id + int k_loc = k - grid.get_offset_k(); + int j_loc = j - grid.get_offset_j(); + int i_loc = i - grid.get_offset_i(); + + // check if *_loc are inside the local subdomain + if (k_loc < 0 || k_loc > loc_K-1) continue; + if (j_loc < 0 || j_loc > loc_J-1) continue; + if (i_loc < 0 || i_loc > loc_I-1) continue; + + CUSTOMREAL pert_Ks = 0.0; + CUSTOMREAL pert_Keta = 0.0; + CUSTOMREAL pert_Kxi = 0.0; + + pert_Ks += (_1_CR-r_r)*(_1_CR-r_t)*(_1_CR-r_p)*grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt,kdr)]; + pert_Keta += (_1_CR-r_r)*(_1_CR-r_t)*(_1_CR-r_p)*grid.Keta_inv_loc[I2V_INV_KNL(idp,jdt,kdr)]; + pert_Kxi += (_1_CR-r_r)*(_1_CR-r_t)*(_1_CR-r_p)*grid.Kxi_inv_loc[ I2V_INV_KNL(idp,jdt,kdr)]; + + pert_Ks += r_r*(_1_CR-r_t)*(_1_CR-r_p)*grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt,kdr+1)]; + pert_Keta += r_r*(_1_CR-r_t)*(_1_CR-r_p)*grid.Keta_inv_loc[I2V_INV_KNL(idp,jdt,kdr+1)]; + pert_Kxi += r_r*(_1_CR-r_t)*(_1_CR-r_p)*grid.Kxi_inv_loc[ I2V_INV_KNL(idp,jdt,kdr+1)]; + + pert_Ks += (_1_CR-r_r)*r_t*(_1_CR-r_p)*grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr)]; + pert_Keta += (_1_CR-r_r)*r_t*(_1_CR-r_p)*grid.Keta_inv_loc[I2V_INV_KNL(idp,jdt+1,kdr)]; + pert_Kxi += (_1_CR-r_r)*r_t*(_1_CR-r_p)*grid.Kxi_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr)]; + + pert_Ks += (_1_CR-r_r)*(_1_CR-r_t)*r_p*grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr)]; + pert_Keta += (_1_CR-r_r)*(_1_CR-r_t)*r_p*grid.Keta_inv_loc[I2V_INV_KNL(idp+1,jdt,kdr)]; + pert_Kxi += (_1_CR-r_r)*(_1_CR-r_t)*r_p*grid.Kxi_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr)]; + + pert_Ks += r_r*r_t*(_1_CR-r_p)*grid.Ks_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr+1)]; + pert_Keta += r_r*r_t*(_1_CR-r_p)*grid.Keta_inv_loc[I2V_INV_KNL(idp,jdt+1,kdr+1)]; + pert_Kxi += r_r*r_t*(_1_CR-r_p)*grid.Kxi_inv_loc[ I2V_INV_KNL(idp,jdt+1,kdr+1)]; + + pert_Ks += r_r*(_1_CR-r_t)*r_p*grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr+1)]; + pert_Keta += r_r*(_1_CR-r_t)*r_p*grid.Keta_inv_loc[I2V_INV_KNL(idp+1,jdt,kdr+1)]; + pert_Kxi += r_r*(_1_CR-r_t)*r_p*grid.Kxi_inv_loc[ I2V_INV_KNL(idp+1,jdt,kdr+1)]; + + pert_Ks += (_1_CR-r_r)*r_t*r_p*grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr)]; + pert_Keta += (_1_CR-r_r)*r_t*r_p*grid.Keta_inv_loc[I2V_INV_KNL(idp+1,jdt+1,kdr)]; + pert_Kxi += (_1_CR-r_r)*r_t*r_p*grid.Kxi_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr)]; + + pert_Ks += r_r*r_t*r_p*grid.Ks_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr+1)]; + pert_Keta += r_r*r_t*r_p*grid.Keta_inv_loc[I2V_INV_KNL(idp+1,jdt+1,kdr+1)]; + pert_Kxi += r_r*r_t*r_p*grid.Kxi_inv_loc[ I2V_INV_KNL(idp+1,jdt+1,kdr+1)]; + + + // update para + grid.fun_gradient_regularization_penalty_loc[ I2V(i_loc,j_loc,k_loc)] += pert_Ks; + grid.eta_gradient_regularization_penalty_loc[I2V(i_loc,j_loc,k_loc)] += pert_Keta; + grid.xi_gradient_regularization_penalty_loc[ I2V(i_loc,j_loc,k_loc)] += pert_Kxi; + + + } // end for i + } // end for j + } // end for k + + } // end i_grid + +} + + + +#endif \ No newline at end of file diff --git a/include/source.fwd.h b/include/source.fwd.h new file mode 100644 index 0000000..51fc038 --- /dev/null +++ b/include/source.fwd.h @@ -0,0 +1,2 @@ +#pragma once +class Source; \ No newline at end of file diff --git a/include/source.h b/include/source.h new file mode 100644 index 0000000..14e6165 --- /dev/null +++ b/include/source.h @@ -0,0 +1,71 @@ +#ifndef SOURCE_H +#define SOURCE_H + +// to handle circular dependency +#pragma once +#include "grid.fwd.h" +#include "source.fwd.h" + +#include "input_params.h" +#include "grid.h" +#include "config.h" +#include "mpi_funcs.h" + +class Source { +public: + Source(){}; + ~Source(); + + // set source information + void set_source_position(InputParams &, Grid &, bool&, const std::string&, bool for_2d_solver=false); + // + // getters + // + CUSTOMREAL get_ds_lat(){return dis_src_lat;}; + CUSTOMREAL get_ds_lon(){return dis_src_lon;}; + CUSTOMREAL get_ds_r (){return dis_src_r;}; + CUSTOMREAL get_src_r(){return src_r;}; // radius + CUSTOMREAL get_src_t(){return src_lat;}; // radian + CUSTOMREAL get_src_p(){return src_lon;}; // radian + CUSTOMREAL get_src_dep(){return radius2depth(src_r);}; // km + + // + // parallel getters + // + CUSTOMREAL get_fac_at_source(CUSTOMREAL*, bool check=false); + CUSTOMREAL get_fac_at_point(CUSTOMREAL*, int, int, int); + +private: + // positions + CUSTOMREAL src_lat; + CUSTOMREAL src_lon; + CUSTOMREAL src_r; + + // discretize source position ids (LOCAL) + int i_src_loc; + int j_src_loc; + int k_src_loc; + + // discretized source position + CUSTOMREAL dis_src_lat; + CUSTOMREAL dis_src_lon; + CUSTOMREAL dis_src_r; + + CUSTOMREAL dis_src_err_r; // r1 + CUSTOMREAL dis_src_err_lat; // r2 + CUSTOMREAL dis_src_err_lon; // r3 + + // if source is in this subdomain + bool is_in_subdomain = false; + int src_rank; + bool *src_flags; + int n_dom_src = 0; + + // position error by discretization for each direction + CUSTOMREAL error_lon, error_lat, error_r; + + // grid gaps + CUSTOMREAL delta_lon, delta_lat, delta_r; +}; + +#endif // SOURCE_H \ No newline at end of file diff --git a/include/src_rec.h b/include/src_rec.h new file mode 100644 index 0000000..dc34ca9 --- /dev/null +++ b/include/src_rec.h @@ -0,0 +1,211 @@ +#ifndef SRC_REC_H +#define SRC_REC_H + +#include +#include +#include +#include +#include +#include +#include + +#include "config.h" +#include "utils.h" +#include "timer.h" +#include "mpi_funcs.h" + + +// information of source or receiver +class SrcRecInfo { +public: + int id = -1; + std::string name = "unknown"; + CUSTOMREAL dep; // stored as depth (km), so need to depth2radious function when using it in other part of the code + CUSTOMREAL lat; // stored in degree, but convarted to radian when passed through get_src_* function + CUSTOMREAL lon; // stored in degree, but convarted to radian when passed through get_src_* function + + int year = -1; + int month = -1; + int day = -1; + int hour = -1; + int min = -1; + CUSTOMREAL sec = -1.0; + CUSTOMREAL mag = -1.0; + + CUSTOMREAL adjoint_source = 0.0; + CUSTOMREAL adjoint_source_density = 0.0; + + int n_data = 0; + + // arrays for storing arrival times on boundary surfaces, calculated by 2D Eikonal solver + bool is_out_of_region = false; // is the source or receiver in the region; false: in the refion; true: teleseismic + //CUSTOMREAL* arr_times_bound_N = nullptr; // arrival time of the receiver at the north boundary of the subdomain + //CUSTOMREAL* arr_times_bound_E = nullptr; // arrival time of the receiver at the east boundary of the subdomain + //CUSTOMREAL* arr_times_bound_W = nullptr; // arrival time of the receiver at the west boundary of the subdomain + //CUSTOMREAL* arr_times_bound_S = nullptr; // arrival time of the receiver at the south boundary of the subdomain + //CUSTOMREAL* arr_times_bound_Bot = nullptr; // arrival time of the receiver at the bottom boundary of the subdomain + //bool* is_bound_src; // true if the source is on the boundary surface + + // kernel + CUSTOMREAL sta_correct = 0.0; + CUSTOMREAL sta_correct_kernel = 0.0; + + // relocation + bool is_stop = false; + CUSTOMREAL tau_opt = 0.0; + CUSTOMREAL grad_chi_i = 0.0; + CUSTOMREAL grad_chi_j = 0.0; + CUSTOMREAL grad_chi_k = 0.0; + CUSTOMREAL grad_tau = 0.0; + CUSTOMREAL sum_weight = 0.0; + CUSTOMREAL vobj_src_reloc_old = 99999999.9; + CUSTOMREAL vobj_src_reloc = 0.0; + CUSTOMREAL vobj_grad_norm_src_reloc = 0.0; + + CUSTOMREAL step_length_max = step_length_src_reloc; // 2 km default, step length for relocation + CUSTOMREAL change_dep = 0.0; + CUSTOMREAL change_lat = 0.0; + CUSTOMREAL change_lon = 0.0; + CUSTOMREAL change_tau = 0.0; + int Ndata = 0.0; + + bool is_T_written_into_file = false; +}; + +class DataInfo { +public: + + CUSTOMREAL data_weight = 1.0; // the weight in the src_rec file + CUSTOMREAL weight = 1.0; // the actual weight in the inversion, equal data_weight * weight about the data type; + CUSTOMREAL weight_reloc = 1.0; // the actual weight for relocation, equal data_weight * weight about the data type; + + std::string phase = "unknown"; + + bool dual_data = false; // if true, this data is a dual data, used for generating kernel, but not for obj estimation (if true, data type = 2 or 3) + + bool is_src_rec = false; // absolute traveltime, single source - receiver + + // source information + int id_src = -1; + std::string name_src = "unknown"; + + // receiver information + int id_rec = -1; + std::string name_rec = "unknown"; + + // traveltime + CUSTOMREAL travel_time = -999.0; + CUSTOMREAL travel_time_obs = -999.0; + + // receiver pair infomation + bool is_rec_pair = false; // common source differential traveltime + std::vector id_rec_pair = {-1,-1}; + std::vector name_rec_pair = {"unknown","unknown"}; + + // common source differential travel time + CUSTOMREAL cs_dif_travel_time = -999.0; + CUSTOMREAL cs_dif_travel_time_obs = -999.0; + + // source pair infomation + bool is_src_pair = false; // common receiver differential traveltime (for future) + std::vector id_src_pair = {-1,-1}; + std::vector name_src_pair = {"unknown","unknown"}; + + // common receiver differential travel time + CUSTOMREAL cr_dif_travel_time = -999.0; + CUSTOMREAL cr_dif_travel_time_obs = -999.0; + + // source relocation + CUSTOMREAL DTi = 0.0; + CUSTOMREAL DTj = 0.0; + CUSTOMREAL DTk = 0.0; + + std::vector DTi_pair = {0.0, 0.0}; + std::vector DTj_pair = {0.0, 0.0}; + std::vector DTk_pair = {0.0, 0.0}; + +}; + + + +// methods for managing SrcRec objects/lists + +// parse src_rec_file +void parse_src_rec_file(std::string& , \ + std::map&, \ + std::map&, \ + std::map>>&, \ + std::vector&, \ + std::vector>>&); + +// parse sta_correctoion_file +void parse_sta_correction_file(std::string&, \ + std::map&); + +// swap the sources and receivers +void do_swap_src_rec(std::map &, \ + std::map &, \ + std::map>> &, \ + std::vector&); + +// do not swap the sources and receivers +void do_not_swap_src_rec(std::map &, \ + std::map &, \ + std::map>> &, \ + std::vector&); + +// tele seismic source management +void separate_region_and_tele_src_rec_data(std::map &, + std::map &, + std::map>>&, + std::map &, + std::map &, + std::map>>&, + std::map &, + std::map &, + std::map>>&, + std::map &, + int &, + int &, + int &, + int &, + int &, + const CUSTOMREAL, const CUSTOMREAL, + const CUSTOMREAL, const CUSTOMREAL, + const CUSTOMREAL, const CUSTOMREAL, + bool); + +void merge_region_and_tele_src(std::map &, + std::map &, + std::map>>&, + std::vector&, + std::map &, + std::map &, + std::map>>&); + +// distribute srcrec data to all simulation groups +void distribute_src_rec_data(std::map&, \ + std::map&, \ + std::map>>&, \ + std::vector&, \ + std::map&, \ + std::map&, \ + std::map>>&, \ + std::vector&, \ + std::vector&); + +void prepare_src_map_for_2d_solver(std::map&, \ + std::map&, \ + std::vector&, \ + std::map&); + +void send_src_info_inter_sim(SrcRecInfo&, int); +void recv_src_info_inter_sim(SrcRecInfo&, int); +void broadcast_src_info_intra_sim(SrcRecInfo&, int); +void send_rec_info_inter_sim(SrcRecInfo&, int); +void recv_rec_info_inter_sim(SrcRecInfo&, int); +void broadcast_rec_info_intra_sim(SrcRecInfo&, int); +void send_data_info_inter_sim(DataInfo&, int); +void recv_data_info_inter_sim(DataInfo&, int); + +#endif //SRC_REC_H \ No newline at end of file diff --git a/include/timer.h b/include/timer.h new file mode 100644 index 0000000..c09a53a --- /dev/null +++ b/include/timer.h @@ -0,0 +1,98 @@ +#ifndef TIMER_H +#define TIMER_H + + +#include +#include +#include +#include +#include +#include "config.h" + +class Timer { +public: + Timer(std::string name, bool show_start_time = false) : name(name), show_start_time(show_start_time) { + start_timer(); + } + + ~Timer() {} + + std::string name; + std::chrono::high_resolution_clock::time_point start; + std::chrono::high_resolution_clock::time_point end; + std::chrono::duration elapsed_time; + bool show_start_time = false; + + void start_timer() { + start = std::chrono::high_resolution_clock::now(); + time_back = start; + if (show_start_time && proc_read_srcrec) { + std::cout << this->name << " started at " << get_current_utc_time() << std::endl; + } + } + + void stop_timer() { + end = std::chrono::high_resolution_clock::now(); + elapsed_time = end - start; + print_elapsed_time(); + } + + double get_start() { + return std::chrono::duration(start.time_since_epoch()).count(); + } + + double get_t_delta() { + auto current_time = std::chrono::high_resolution_clock::now(); + auto delta = current_time - time_back; + time_back = current_time; + return std::chrono::duration(delta).count(); + } + + double get_t() { + return std::chrono::duration(std::chrono::high_resolution_clock::now() - start).count(); + } + + std::string get_start_t() { + return get_current_utc_time(start); + } + + std::string get_end_t() { + return get_current_utc_time(end); + } + + std::string get_elapsed_t() { + return std::to_string(elapsed_time.count()) + " sec"; + } + + std::string get_utc_from_time_t(std::time_t time_t) { + std::tm utc_tm = *std::gmtime(&time_t); + + std::ostringstream oss; + oss << std::put_time(&utc_tm, "%F %T") << " UTC"; + return oss.str(); + } + +private: + std::chrono::high_resolution_clock::time_point time_back; + + void print_elapsed_time() { + if (if_verbose) + std::cout << "Time for " << name << ": " << elapsed_time.count() << " sec" << std::endl; + } + + std::string get_current_utc_time(std::chrono::high_resolution_clock::time_point time = std::chrono::high_resolution_clock::now()) { + std::chrono::milliseconds ms = std::chrono::duration_cast(time.time_since_epoch()); + std::time_t time_t = ms.count() / 1000; + + std::tm utc_tm = *std::gmtime(&time_t); + + std::ostringstream oss; + oss << std::put_time(&utc_tm, "%F %T") << " UTC"; + return oss.str(); + } + +}; + + + +#endif // TIMER_H \ No newline at end of file diff --git a/include/utils.h b/include/utils.h new file mode 100644 index 0000000..81f13f6 --- /dev/null +++ b/include/utils.h @@ -0,0 +1,401 @@ +#ifndef UTILS_H +#define UTILS_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include // for std::bad_alloc +#include // for std::exit + + +// chec if compiler is gcc 7.5 or older +//#if __GNUC__ == 7 && __GNUC_MINOR__ <= 5 +//#include +//#define GNUC_7_5 +//#elif __cplusplus > 201402L // compilers supporting c++17 +//#include +//#endif + +#include "config.h" + + +inline int mkpath(std::string s,mode_t mode) { + size_t pos=0; + std::string dir; + int mdret = 0; + + if(s[s.size()-1]!='/'){ + // force trailing / so we can handle everything in loop + s+='/'; + } + + while((pos=s.find_first_of('/',pos))!=std::string::npos){ + dir=s.substr(0,pos++); + if(dir.size()==0) continue; // if leading / first time is 0 length + if((mdret=mkdir(dir.c_str(),mode)) && errno!=EEXIST){ + return mdret; + } + } + return mdret; +} + + + +inline void create_output_dir(std::string dir_path){ + + // create output directory if not exists (directories tree) + if (world_rank == 0) { + +//#if __cplusplus > 201402L && !defined(GNUC_7_5) +// // this function requires c++17 +// if (!std::filesystem::exists(dir_path)){ +// std::filesystem::create_directories(dir_path); +// } else { +// std::cout << "Output directory already exists. Overwriting..." << std::endl; +// } +//#else // compilers not supporting std++17 + // check if directory exists + struct stat info; + if (stat(dir_path.c_str(), &info) != 0){ + // directory does not exist + // create directory + int status = mkpath(dir_path, 0755); + if (status != 0){ + std::cout << "Error: cannot create output directory" << std::endl; + std::cout << "Exiting..." << std::endl; + exit(1); + } + } else { + // directory exists + std::cout << "Output directory already exists. Overwriting..." << std::endl; + } +//#endif + + } + +} + + +inline bool is_file_exist(const char* fileName) +{ + return static_cast(std::ifstream(fileName)); +} + + +inline void stdout_by_main(char const* str){ + if (sim_rank == 0 && inter_sub_rank == 0 && sub_rank == 0 && id_sim == 0) + std::cout << str << std::endl; +} + + +inline void stdout_by_rank_zero(char const* str){ + if(world_rank == 0) + std::cout << str << std::endl; +} + + +inline void parse_options(int argc, char* argv[]){ + bool input_file_found = false; + + for (int i = 1; i < argc; i++){ + if(strcmp(argv[i], "-v") == 0) + if_verbose = true; + else if (strcmp(argv[i],"-i") == 0){ + input_file = argv[i+1]; + input_file_found = true; + } + else if (strcmp(argv[i], "-h") == 0){ + stdout_by_main("usage: mpirun -np 4 TOMOATT -i input_params.yaml"); + exit(EXIT_SUCCESS); + } + } + + // error if input_file is not found + if(!input_file_found){ + stdout_by_main("usage: mpirun -np 4 TOMOATT -i input_params.yaml"); + std::cout << "Error: input parameter file not found" << std::endl; + exit(EXIT_FAILURE); + } +} + + +inline void parse_options_srcrec_weight(int argc, char* argv[]){ + bool input_file_found = false; + + for (int i = 1; i < argc; i++){ + if(strcmp(argv[i], "-v") == 0) + if_verbose = true; + else if (strcmp(argv[i],"-i") == 0){ + input_file = argv[i+1]; + input_file_found = true; + } else if (strcmp(argv[i],"-r") == 0){ + // reference value + ref_value = atof(argv[i+1]); + } else if (strcmp(argv[i], "-o") == 0){ + // get output filename + output_file_weight = argv[i+1]; + } + } + + // error if input_file is not found + if(!input_file_found){ + stdout_by_main("usage: ./SrcRecWeight -i srcrec_file.txt -r 10.0 -o srcrec_weight.txt"); + std::cout << argc << std::endl; + exit(EXIT_FAILURE); + } +} + + +template +inline int check_data_type(T const& data){ + if (std::is_same::value){ + return 0; + } else if (std::is_same::value){ + return 1; + } else if (std::is_same::value){ + return 2; + } else if (std::is_same::value){ + return 3; + } else { + std::cout << "Error: custom real type is not float or double" << std::endl; + std::cout << "Please check the definition of CUSTOMREAL in io.h" << std::endl; + std::cout << "Exiting..." << std::endl; + exit(1); + } +} + + +template +inline T my_square(T const& a){ + return a * a; +} + + +// defined function is more than 2 times slower than inline function +//#define my_square(a) (a * a) + + +template +T* allocateMemory(size_t size, int allocationID) { + try { + T* ptr = new T[size]; + return ptr; + } catch (const std::bad_alloc& e) { + // Handle memory allocation failure + std::cerr << "Memory allocation failed for ID " << allocationID << ": " << e.what() << std::endl; + std::exit(EXIT_FAILURE); // Exit the program on allocation failure + } +} + + +inline void RLonLat2xyz(CUSTOMREAL lon, CUSTOMREAL lat, CUSTOMREAL R, CUSTOMREAL& x, CUSTOMREAL& y, CUSTOMREAL& z){ + /* + lon : longitude in radian + lat : latitude in radian + R : radius + + x : x coordinate in m + y : y coordinate in m + z : z coordinate in m + */ + //x = R*cos(lat*DEG2RAD)*cos(lon*DEG2RAD); + //y = R*cos(lat*DEG2RAD)*sin(lon*DEG2RAD); + //z = R*sin(lat*DEG2RAD); + x = R*cos(lat)*cos(lon); + y = R*cos(lat)*sin(lon); + z = R*sin(lat); + +} + + +// calculate epicentral distance in radian from lon lat in radian +inline void Epicentral_distance_sphere(const CUSTOMREAL lat1, const CUSTOMREAL lon1, \ + const CUSTOMREAL lat2, const CUSTOMREAL lon2, \ + CUSTOMREAL& dist) { + + // calculate epicentral distance in radian + //dist = std::abs(acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon2-lon1))); + CUSTOMREAL lon_dif = lon2 - lon1; + + dist = std::atan2(std::sqrt((my_square(std::cos(lat2) * std::sin(lon_dif)) + \ + my_square(std::cos(lat1) * std::sin(lat2) - std::sin(lat1) * std::cos(lat2) * std::cos(lon_dif)))), \ + std::sin(lat1) * std::sin(lat2) + std::cos(lat1) * std::cos(lat2) * std::cos(lon_dif)); + +} + + + + +//calculate azimuth +inline void Azimuth_sphere(CUSTOMREAL lat1, CUSTOMREAL lon1, \ + CUSTOMREAL lat2, CUSTOMREAL lon2, \ + CUSTOMREAL& azi) { + + if (isZero(my_square((lat1-lat2)) \ + && + my_square((lon1-lon2)))){ + azi = _0_CR; + } else { + azi = atan2(sin(lon2-lon1)*cos(lat2), \ + cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(lon2-lon1)); + if (azi < _0_CR) + azi += _2_CR * PI; + } +} + + +inline void WGS84ToCartesian(CUSTOMREAL& lon, CUSTOMREAL& lat, CUSTOMREAL R, \ + CUSTOMREAL& x, CUSTOMREAL& y, CUSTOMREAL& z, \ + CUSTOMREAL& lon_center, CUSTOMREAL& lat_center){ + + // equatorial radius WGS84 major axis + const static CUSTOMREAL equRadius = R_earth; // in m in this function + const static CUSTOMREAL flattening = 1.0 / 298.257222101; + + const static CUSTOMREAL sqrEccentricity = flattening * (2.0 - flattening); + + const CUSTOMREAL lat_rad = lat - lat_center; // input should be already in radian + const CUSTOMREAL lon_rad = lon - lon_center; + const CUSTOMREAL alt = R - equRadius; // altitude (height above sea level) + + const CUSTOMREAL sinLat = sin(lat_rad); + const CUSTOMREAL cosLat = cos(lat_rad); + const CUSTOMREAL sinLon = sin(lon_rad); + const CUSTOMREAL cosLon = cos(lon_rad); + + // Normalized radius + const CUSTOMREAL normRadius = equRadius / sqrt(1.0 - sqrEccentricity * sinLat * sinLat); + + x = (normRadius + alt) * cosLat * cosLon; + y = (normRadius + alt) * cosLat * sinLon; + z = (normRadius * (1.0 - sqrEccentricity) + alt) * sinLat; + +} + + +template +inline T dot_product(T const* const a, T const* const b, int const& n){ + CUSTOMREAL result = _0_CR; + for (int i = 0; i < n; i++){ + result += a[i] * b[i]; + } + return result; +} + +template +inline T find_max(T const* const a, int const& n){ + T max = a[0]; + for (int i = 1; i < n; i++){ + if (a[i] > max){ + max = a[i]; + } + } + return max; +} + +template +inline T find_absmax(T const* const a, int const& n){ + T max = fabs(a[0]); + for (int i = 1; i < n; i++){ + if (fabs(a[i]) > max){ + max = fabs(a[i]); + } + } + return max; +} + +template +inline T calc_l2norm(T const* const a, int const& n){ + T result = _0_CR; + for (int i = 0; i < n; i++){ + result += a[i] * a[i]; + } + return result; +} + + +inline std::string int2string_zero_fill(int i) { + std::stringstream ss; + ss << std::setfill('0') << std::setw(4) << i; + return ss.str(); +} + + +inline bool in_between(CUSTOMREAL const& a, CUSTOMREAL const& b, CUSTOMREAL const& c){ + // check if a is between b and c + if ((a-b)*(a-c) <= _0_CR){ + return true; + } else { + return false; + } +} + + +inline CUSTOMREAL calc_ratio_between(CUSTOMREAL const& a, CUSTOMREAL const& b, CUSTOMREAL const& c){ + // calculate ratio of a between b and c + //if (b < c) + return (a - b) / (c - b); + //else + // return (a - b) / (b - c); +} + + +inline void linear_interpolation_1d_sorted(const CUSTOMREAL* x1, const CUSTOMREAL* y1, const int& n1, const CUSTOMREAL* x2, CUSTOMREAL* y2, const int& n2){ + // linear interpolation for sorted 1d array (monotonely increasing) + // x1 : positions of the first array + // y1 : values of the first array + // n1 : size of the first array + // x2 : positions of the second array + // y2 : values of the second array + // n2 : size of the second array + int start = 0; + for(int pt2=0; pt2= x1[n1-1]){ // x2[pt2] >= x1[n1-1] + y2[pt2] = y1[n1-1]; + } else { // x1[0] < x2[pt2] < x1[n1-1] + for(int pt1=start; pt1= x1[pt1] && x2[pt2] <= x1[pt1+1]){ + y2[pt2] = y1[pt1] + (y1[pt1+1] - y1[pt1]) * (x2[pt2] - x1[pt1]) / (x1[pt1+1] - x1[pt1]); + start = pt1; + break; + } + } + } + } +} + +template +std::vector linspace(T start_in, T end_in, int num_in) +{ + + std::vector linspaced; + + double start = static_cast(start_in); + double end = static_cast(end_in); + double num = static_cast(num_in); + + if (num == 0) { return linspaced; } + if (num == 1) + { + linspaced.push_back(start); + return linspaced; + } + + double delta = (end - start) / (num - 1); + + for(int i=0; i < num-1; ++i) + { + linspaced.push_back(start + delta * i); + } + linspaced.push_back(end); // I want to ensure that start and end + // are exactly the same as the input + return linspaced; +} + +#endif // UTILS_H \ No newline at end of file diff --git a/include/vectorized_sweep.h b/include/vectorized_sweep.h new file mode 100644 index 0000000..8f59731 --- /dev/null +++ b/include/vectorized_sweep.h @@ -0,0 +1,825 @@ +#ifndef VECTORIZED_SWEEP_H +#define VECTORIZED_SWEEP_H + + +#include +#include "config.h" + +#ifdef USE_SIMD // closed at the end of this file +#include "simd_conf.h" + +#if USE_AVX || USE_AVX512 +__mT COEF = _mmT_set1_pT(1.0); +__mT v_1 = _mmT_set1_pT(1.0); +__mT v_0 = _mmT_set1_pT(0.0); +__mT v_half = _mmT_set1_pT(0.5); +__mT v_2 = _mmT_set1_pT(2.0); +__mT v_m2 = _mmT_set1_pT(-2.0); +__mT v_4 = _mmT_set1_pT(4.0); +__mT v_m3 = _mmT_set1_pT(-3.0); +__mT coe_max = _mmT_set1_pT(1e19); +__mT v_eps = _mmT_set1_pT(1e-12); +__mT COEF_TELE = _mmT_set1_pT(1.05); + + +// square of __mT +inline __mT my_square_v(__mT const& a){ + return _mmT_mul_pT(a, a); +} + +// pp = (a - b) * Dinv +inline __mT calc_1d_stencil(__mT const& a, __mT const& b, __mT const& Dinv){ + return _mmT_mul_pT(_mmT_sub_pT(a,b),Dinv); +} + +/* + ww = _1_CR/(_1_CR+_2_CR*my_square_v((eps + my_square_v( a \ + -_2_CR*b \ + + c) ) \ + + / (eps + my_square_v( d \ + -_2_CR*a \ + + b) )) ); + + pp = sign * (_1_CR - ww) * ( b \ <-- sign = +1 or -1 + - d) * 0.5 * Dinv \ + + ww * ( -3.0 * a \ + + 4.0 * b \ + - 1.0 * c ) * 0.5 * Dinv ); +*/ +inline __mT calc_3d_stencil(__mT const& a, __mT const& b, __mT const&c, __mT const& d, __mT const& Dinv_half, int const& sign){ + +#ifdef __FMA__ + // v_eps + square(a - 2.0*b + c) + __mT tmp1 = _mmT_add_pT(v_eps,my_square_v(_mmT_add_pT(a,_mmT_fmadd_pT(v_m2,b,c)))); + // v_eps + square(d - 2.0*a + b) + __mT tmp2 = _mmT_add_pT(v_eps,my_square_v(_mmT_add_pT(d,_mmT_fmadd_pT(v_m2,a,b)))); + // ww = 1.0/(1.0 + 2.0 * square(tmp1/tmp2)) + __mT ww = _mmT_div_pT(v_1,_mmT_fmadd_pT(v_2,my_square_v(_mmT_div_pT(tmp1,tmp2)),v_1)); + // pp = sign* ((1.0 - ww) * (b - d) / 2.0 / D + // + ww * (-3.0* a + 4.0 * b - c) * Dinv_half) + /* + */ + return _mmT_mul_pT(_mmT_set1_pT(sign), \ + _mmT_add_pT(\ + _mmT_mul_pT(_mmT_sub_pT(v_1,ww),_mmT_mul_pT(_mmT_sub_pT(b,d),Dinv_half)),\ + _mmT_mul_pT(ww,_mmT_mul_pT(_mmT_sub_pT(_mmT_fmadd_pT(v_4,b,_mmT_mul_pT(v_m3,a)),c),Dinv_half))\ + )\ + ); +#else + __mT tmp1 = _mmT_add_pT(v_eps,my_square_v(_mmT_add_pT(a,_mmT_add_pT(_mmT_mul_pT(v_m2,b),c)))); + __mT tmp2 = _mmT_add_pT(v_eps,my_square_v(_mmT_add_pT(d,_mmT_add_pT(_mmT_mul_pT(v_m2,a),b)))); + __mT ww = _mmT_div_pT(v_1,_mmT_add_pT(v_1,_mmT_mul_pT(v_2,my_square_v(_mmT_div_pT(tmp1,tmp2))))); + return _mmT_mul_pT(_mmT_set1_pT(sign), \ + _mmT_add_pT(\ + _mmT_mul_pT(_mmT_sub_pT(v_1,ww),_mmT_mul_pT(_mmT_sub_pT(b,d),Dinv_half)),\ + _mmT_mul_pT(ww,_mmT_mul_pT(_mmT_sub_pT(_mmT_add_pT(_mmT_mul_pT(v_4,b),_mmT_mul_pT(v_m3,a)),c),Dinv_half))\ + )\ + ); +#endif + +} + +#elif USE_ARM_SVE + +inline __mT my_square_v(svbool_t const& pg, __mT const& a){ + return svmul_f64_z(pg, a, a); +} + +inline __mT calc_1d_stencil(svbool_t const& pg, __mT const& a, __mT const& b, __mT const& Dinv){ + return svmul_f64_z(pg, svsub_f64_z(pg, a, b), Dinv); +} + +inline __mT calc_3d_stencil(svbool_t const& pg, __mT const& a, __mT const& b, __mT const&c, __mT const& d, __mT const& Dinv_half, int const& sign){ + + __mT v_1 = svdup_f64(1.0); + __mT v_2 = svdup_f64(2.0); + __mT v_m2 = svdup_f64(-2.0); + __mT v_4 = svdup_f64(4.0); + __mT v_m3 = svdup_f64(-3.0); + __mT v_eps = svdup_f64(1e-12); + + // v_eps + square(a - 2.0*b + c) + //__mT tmp1 = svadd_f64_z(pg, v_eps, my_square_v(pg, svadd_f64_z(pg, a, svadd_f64_z(pg, svmul_f64_z(pg, v_m2, b), c)))); + __mT tmp1 = svadd_f64_z(pg, v_eps, my_square_v(pg, svadd_f64_z(pg, a, svmad_f64_z(pg, v_m2, b, c)))); + // v_eps + square(d - 2.0*a + b) + //__mT tmp2 = svadd_f64_z(pg, v_eps, my_square_v(pg, svadd_f64_z(pg, d, svadd_f64_z(pg, svmul_f64_z(pg, v_m2, a), b)))); + __mT tmp2 = svadd_f64_z(pg, v_eps, my_square_v(pg, svadd_f64_z(pg, d, svmad_f64_z(pg, v_m2, a, b)))); + // ww = 1.0/(1.0 + 2.0 * square(tmp1/tmp2)) + //__mT ww = svdiv_f64_z(pg, v_1, svadd_f64_z(pg, v_1, svmul_f64_z(pg, v_2, my_square_v(pg, svdiv_f64_z(pg, tmp1, tmp2))))); + __mT ww = svdiv_f64_z(pg, v_1, svmad_f64_z(pg, v_2, my_square_v(pg, svdiv_f64_z(pg, tmp1, tmp2)), v_1)); + // pp = sign* ((1.0 - ww) * (b - d) / 2.0 / D + // + ww * (-3.0* a + 4.0 * b - c) * Dinv_half) + /* + return svmul_f64_m(pg, svdup_f64(sign), \ + svadd_f64_z(pg, \ + svmul_f64_z(pg, svsub_f64_z(pg, v_1, ww), svmul_f64_z(pg, svsub_f64_z(pg, b, d), Dinv_half)),\ + svmul_f64_z(pg, ww, svmul_f64_z(pg, svsub_f64_z(pg, svadd_f64_z(pg, svmul_f64_z(pg, v_4, b), svmul_f64_z(pg, v_m3, a)), c), Dinv_half))\ + )\ + ); + */ + return svmul_f64_m(pg, svdup_f64(sign), \ + svadd_f64_z(pg, \ + svmul_f64_z(pg, svsub_f64_z(pg, v_1, ww), svmul_f64_z(pg, svsub_f64_z(pg, b, d), Dinv_half)),\ + svmul_f64_z(pg, ww, svmul_f64_z(pg, svsub_f64_z(pg, svmad_f64_z(pg, v_4, b, svmul_f64_z(pg, v_m3, a)), c), Dinv_half))\ + )\ + ); +} + + +#endif + + + +inline void vect_stencil_1st_pre_simd( +#if USE_ARM_SVE + svbool_t const& pg, +#endif + __mT const& v_iip, __mT const& v_jjt, __mT const& v_kkr, + __mT const& v_c__, + __mT const& v_p__, __mT const& v_m__, __mT const& v__p_, __mT const& v__m_, __mT const& v___p, __mT const& v___m, + __mT& v_pp1, __mT& v_pp2, __mT& v_pt1, __mT& v_pt2, __mT& v_pr1, __mT& v_pr2, + __mT const& v_DP_inv, __mT const& v_DT_inv, __mT const& v_DR_inv, + __mT const& v_DP_inv_half, __mT const& v_DT_inv_half, __mT const& v_DR_inv_half, + int const& NP, int const& NT, int const& NR){ + +#if USE_AVX512 || USE_AVX + + v_pp1 = calc_1d_stencil(v_c__, v_m__, v_DP_inv); + v_pp2 = calc_1d_stencil(v_p__, v_c__, v_DP_inv); + v_pt1 = calc_1d_stencil(v_c__, v__m_, v_DT_inv); + v_pt2 = calc_1d_stencil(v__p_, v_c__, v_DT_inv); + v_pr1 = calc_1d_stencil(v_c__, v___m, v_DR_inv); + v_pr2 = calc_1d_stencil(v___p, v_c__, v_DR_inv); + +#elif USE_ARM_SVE + + v_pp1 = calc_1d_stencil(pg, v_c__, v_m__, v_DP_inv); + v_pp2 = calc_1d_stencil(pg, v_p__, v_c__, v_DP_inv); + v_pt1 = calc_1d_stencil(pg, v_c__, v__m_, v_DT_inv); + v_pt2 = calc_1d_stencil(pg, v__p_, v_c__, v_DT_inv); + v_pr1 = calc_1d_stencil(pg, v_c__, v___m, v_DR_inv); + v_pr2 = calc_1d_stencil(pg, v___p, v_c__, v_DR_inv); + +#endif + +} + + +inline void vect_stencil_3rd_pre_simd( +#if USE_ARM_SVE + svbool_t const& pg, +#endif + __mT const& v_iip, __mT const& v_jjt, __mT const& v_kkr, + __mT const& v_c__, + __mT const& v_p__, __mT const& v_m__, __mT const& v__p_, __mT const& v__m_, __mT const& v___p, __mT const& v___m, + __mT const& v_pp____, __mT const& v_mm____, __mT const& v___pp__, __mT const& v___mm__, __mT const& v_____pp, __mT const& v_____mm, + __mT& v_pp1, __mT& v_pp2, __mT& v_pt1, __mT& v_pt2, __mT& v_pr1, __mT& v_pr2, + __mT const& v_DP_inv, __mT const& v_DT_inv, __mT const& v_DR_inv, + __mT const& v_DP_inv_half, __mT const& v_DT_inv_half, __mT const& v_DR_inv_half, + int const& NP, int const& NT, int const& NR){ + + const int PLUS = 1; + const int MINUS = -1; + +#if USE_AVX512 + + __mmaskT mask_i_eq_1 = _mm512_cmp_pT_mask(v_iip, v_1,_CMP_EQ_OQ); // if iip == 1 + __mmaskT mask_j_eq_1 = _mm512_cmp_pT_mask(v_jjt, v_1,_CMP_EQ_OQ); // if jjt == 1 + __mmaskT mask_k_eq_1 = _mm512_cmp_pT_mask(v_kkr, v_1,_CMP_EQ_OQ); // if kkr == 1 + __mmaskT mask_i_eq_N_minus_2 = _mm512_cmp_pT_mask(v_iip, _mmT_set1_pT(NP-2),_CMP_EQ_OQ); // if iip == N-2 + __mmaskT mask_j_eq_N_minus_2 = _mm512_cmp_pT_mask(v_jjt, _mmT_set1_pT(NT-2),_CMP_EQ_OQ); // if jjt == N-2 + __mmaskT mask_k_eq_N_minus_2 = _mm512_cmp_pT_mask(v_kkr, _mmT_set1_pT(NR-2),_CMP_EQ_OQ); // if kkr == N-2 + + // 1 < iip < N-2 + __mmaskT mask_i_else = _kand_maskT( + _mm512_cmp_pT_mask(v_iip, v_1 , _CMP_GT_OQ), + _mm512_cmp_pT_mask(_mmT_set1_pT(NP-2), v_iip, _CMP_GT_OQ) + ); + // 1 < jjt < N-2 + __mmaskT mask_j_else = _kand_maskT( + _mm512_cmp_pT_mask(v_jjt, v_1 , _CMP_GT_OQ), + _mm512_cmp_pT_mask(_mmT_set1_pT(NT-2), v_jjt, _CMP_GT_OQ) + ); + // 1 < kkr < N-2 + __mmaskT mask_k_else = _kand_maskT( + _mm512_cmp_pT_mask(v_kkr, v_1 , _CMP_GT_OQ), + _mm512_cmp_pT_mask(_mmT_set1_pT(NR-2), v_kkr, _CMP_GT_OQ) + ); + + // if _i_eq_1 == true + v_pp1 = _mm512_mask_blend_pT(mask_i_eq_1, calc_1d_stencil(v_c__, v_m__, v_DP_inv) , v_pp1 ); + v_pp2 = _mm512_mask_blend_pT(mask_i_eq_1, calc_3d_stencil(v_c__, v_p__, v_pp____, v_m__, v_DP_inv_half, PLUS), v_pp2 ); + // if_i_eq_N_minus_2 == true + v_pp1 = _mm512_mask_blend_pT(mask_i_eq_N_minus_2, calc_3d_stencil(v_c__, v_m__, v_mm____, v_p__, v_DP_inv_half, MINUS), v_pp1); + v_pp2 = _mm512_mask_blend_pT(mask_i_eq_N_minus_2, calc_1d_stencil(v_p__, v_c__, v_DP_inv) , v_pp2); + // else + v_pp1 = _mm512_mask_blend_pT(mask_i_else, calc_3d_stencil(v_c__, v_m__, v_mm____, v_p__, v_DP_inv_half, MINUS), v_pp1); + v_pp2 = _mm512_mask_blend_pT(mask_i_else, calc_3d_stencil(v_c__, v_p__, v_pp____, v_m__, v_DP_inv_half, PLUS) , v_pp2); + + // if _j_eq_1 == true + v_pt1 = _mm512_mask_blend_pT(mask_j_eq_1, calc_1d_stencil(v_c__, v__m_, v_DT_inv) , v_pt1); + v_pt2 = _mm512_mask_blend_pT(mask_j_eq_1, calc_3d_stencil(v_c__, v__p_, v___pp__, v__m_, v_DT_inv_half, PLUS), v_pt2); + // if _j_eq_N_minus_2 == true + v_pt1 = _mm512_mask_blend_pT(mask_j_eq_N_minus_2, calc_3d_stencil(v_c__, v__m_, v___mm__, v__p_, v_DT_inv_half, MINUS), v_pt1); + v_pt2 = _mm512_mask_blend_pT(mask_j_eq_N_minus_2, calc_1d_stencil(v__p_, v_c__, v_DT_inv) , v_pt2); + // else + v_pt1 = _mm512_mask_blend_pT(mask_j_else, calc_3d_stencil(v_c__, v__m_, v___mm__, v__p_, v_DT_inv_half, MINUS), v_pt1); + v_pt2 = _mm512_mask_blend_pT(mask_j_else, calc_3d_stencil(v_c__, v__p_, v___pp__, v__m_, v_DT_inv_half, PLUS) , v_pt2); + + // if _k_eq_1 == true + v_pr1 = _mm512_mask_blend_pT(mask_k_eq_1, calc_1d_stencil(v_c__, v___m, v_DR_inv) , v_pr1 ); + v_pr2 = _mm512_mask_blend_pT(mask_k_eq_1, calc_3d_stencil(v_c__, v___p, v_____pp, v___m, v_DR_inv_half, PLUS), v_pr2 ); + // if _k_eq_N_minus_2 == true + v_pr1 = _mm512_mask_blend_pT(mask_k_eq_N_minus_2, calc_3d_stencil(v_c__, v___m, v_____mm, v___p, v_DR_inv_half, MINUS), v_pr1); + v_pr2 = _mm512_mask_blend_pT(mask_k_eq_N_minus_2, calc_1d_stencil(v___p, v_c__, v_DR_inv) , v_pr2); + // else + v_pr1 = _mm512_mask_blend_pT(mask_k_else, calc_3d_stencil(v_c__, v___m, v_____mm, v___p, v_DR_inv_half, MINUS), v_pr1); + v_pr2 = _mm512_mask_blend_pT(mask_k_else, calc_3d_stencil(v_c__, v___p, v_____pp, v___m, v_DR_inv_half, PLUS) , v_pr2); + +#elif USE_AVX + + __mT mask_i_eq_1 = _mm256_cmp_pT(v_iip, v_1,_CMP_EQ_OQ); // if iip == 1 + __mT mask_j_eq_1 = _mm256_cmp_pT(v_jjt, v_1,_CMP_EQ_OQ); // if jjt == 1 + __mT mask_k_eq_1 = _mm256_cmp_pT(v_kkr, v_1,_CMP_EQ_OQ); // if kkr == 1 + __mT mask_i_eq_N_minus_2 = _mm256_cmp_pT(v_iip, _mmT_set1_pT(NP-2),_CMP_EQ_OQ); // if iip == N-2 + __mT mask_j_eq_N_minus_2 = _mm256_cmp_pT(v_jjt, _mmT_set1_pT(NT-2),_CMP_EQ_OQ); // if jjt == N-2 + __mT mask_k_eq_N_minus_2 = _mm256_cmp_pT(v_kkr, _mmT_set1_pT(NR-2),_CMP_EQ_OQ); // if kkr == N-2 + + // 1 < iip < N-2 + __m256d mask_i_else = _mm256_and_pd( + _mm256_cmp_pT(v_iip, v_1 , _CMP_GT_OQ), + _mm256_cmp_pT(_mmT_set1_pT(NP-2),v_iip, _CMP_GT_OQ) + ); + // 1 < jjt < N-2 + __m256d mask_j_else = _mm256_and_pd( + _mm256_cmp_pT(v_jjt, v_1 , _CMP_GT_OQ), + _mm256_cmp_pT(_mmT_set1_pT(NT-2),v_jjt, _CMP_GT_OQ) + ); + // 1 < kkr < N-2 + __m256d mask_k_else = _mm256_and_pd( + _mm256_cmp_pT(v_kkr, v_1 , _CMP_GT_OQ), + _mm256_cmp_pT(_mmT_set1_pT(NR-2),v_kkr, _CMP_GT_OQ) + ); + + // if _i_eq_1 == true + v_pp1 = _mm256_blendv_pd(v_pp1, calc_1d_stencil(v_c__, v_m__, v_DP_inv), mask_i_eq_1); + v_pp2 = _mm256_blendv_pd(v_pp2, calc_3d_stencil(v_c__, v_p__, v_pp____, v_m__, v_DP_inv_half, PLUS), mask_i_eq_1); + // if_i_eq_N_minus_2 == true + v_pp1 = _mm256_blendv_pd(v_pp1, calc_3d_stencil(v_c__, v_m__, v_mm____, v_p__, v_DP_inv_half, MINUS), mask_i_eq_N_minus_2); + v_pp2 = _mm256_blendv_pd(v_pp2, calc_1d_stencil(v_p__, v_c__, v_DP_inv), mask_i_eq_N_minus_2); + // else + v_pp1 = _mm256_blendv_pd(v_pp1, calc_3d_stencil(v_c__, v_m__, v_mm____, v_p__, v_DP_inv_half, MINUS), mask_i_else); + v_pp2 = _mm256_blendv_pd(v_pp2, calc_3d_stencil(v_c__, v_p__, v_pp____, v_m__, v_DP_inv_half, PLUS), mask_i_else); + + // if _j_eq_1 == true + v_pt1 = _mm256_blendv_pd(v_pt1, calc_1d_stencil(v_c__, v__m_, v_DT_inv), mask_j_eq_1); + v_pt2 = _mm256_blendv_pd(v_pt2, calc_3d_stencil(v_c__, v__p_, v___pp__, v__m_, v_DT_inv_half, PLUS), mask_j_eq_1); + // if _j_eq_N_minus_2 == true + v_pt1 = _mm256_blendv_pd(v_pt1, calc_3d_stencil(v_c__, v__m_, v___mm__, v__p_, v_DT_inv_half, MINUS), mask_j_eq_N_minus_2); + v_pt2 = _mm256_blendv_pd(v_pt2, calc_1d_stencil(v__p_, v_c__, v_DT_inv), mask_j_eq_N_minus_2); + // else + v_pt1 = _mm256_blendv_pd(v_pt1, calc_3d_stencil(v_c__, v__m_, v___mm__, v__p_, v_DT_inv_half, MINUS), mask_j_else); + v_pt2 = _mm256_blendv_pd(v_pt2, calc_3d_stencil(v_c__, v__p_, v___pp__, v__m_, v_DT_inv_half, PLUS), mask_j_else); + + // if _k_eq_1 == true + v_pr1 = _mm256_blendv_pd(v_pr1, calc_1d_stencil(v_c__, v___m, v_DR_inv), mask_k_eq_1); + v_pr2 = _mm256_blendv_pd(v_pr2, calc_3d_stencil(v_c__, v___p, v_____pp, v___m, v_DR_inv_half, PLUS), mask_k_eq_1); + // if _k_eq_N_minus_2 == true + v_pr1 = _mm256_blendv_pd(v_pr1, calc_3d_stencil(v_c__, v___m, v_____mm, v___p, v_DR_inv_half, MINUS), mask_k_eq_N_minus_2); + v_pr2 = _mm256_blendv_pd(v_pr2, calc_1d_stencil(v___p, v_c__, v_DR_inv), mask_k_eq_N_minus_2); + // else + v_pr1 = _mm256_blendv_pd(v_pr1, calc_3d_stencil(v_c__, v___m, v_____mm, v___p, v_DR_inv_half, MINUS), mask_k_else); + v_pr2 = _mm256_blendv_pd(v_pr2, calc_3d_stencil(v_c__, v___p, v_____pp, v___m, v_DR_inv_half, PLUS), mask_k_else); + +#elif USE_ARM_SVE + + svfloat64_t v_1 = svdup_f64(1.0); + + svfloat64_t v_NP_minus_2 = svdup_f64(NP-2); + svfloat64_t v_NT_minus_2 = svdup_f64(NT-2); + svfloat64_t v_NR_minus_2 = svdup_f64(NR-2); + + svbool_t mask_i_eq_1 = svcmpeq_f64(pg, v_iip, v_1); // if iip == 1 + svbool_t mask_j_eq_1 = svcmpeq_f64(pg, v_jjt, v_1); // if jjt == 1 + svbool_t mask_k_eq_1 = svcmpeq_f64(pg, v_kkr, v_1); // if kkr == 1 + svbool_t mask_i_eq_N_minus_2 = svcmpeq_f64(pg, v_iip, v_NP_minus_2); // if iip == N-2 + svbool_t mask_j_eq_N_minus_2 = svcmpeq_f64(pg, v_jjt, v_NT_minus_2); // if jjt == N-2 + svbool_t mask_k_eq_N_minus_2 = svcmpeq_f64(pg, v_kkr, v_NR_minus_2); // if kkr == N-2 + + // 1 < iip < N-2 + svbool_t mask_i_else = svand_b_z(pg, + svcmpgt_f64(pg, v_iip, v_1), + svcmplt_f64(pg, v_iip, v_NP_minus_2) + ); + // 1 < jjt < N-2 + svbool_t mask_j_else = svand_b_z(pg, + svcmpgt_f64(pg, v_jjt, v_1), + svcmplt_f64(pg, v_jjt, v_NT_minus_2) + ); + // 1 < kkr < N-2 + svbool_t mask_k_else = svand_b_z(pg, + svcmpgt_f64(pg, v_kkr, v_1), + svcmplt_f64(pg, v_kkr, v_NR_minus_2) + ); + + // if _i_eq_1 == true + v_pp1 = svsel_f64(mask_i_eq_1, calc_1d_stencil(mask_i_eq_1, v_c__, v_m__, v_DP_inv) , v_pp1); + v_pp2 = svsel_f64(mask_i_eq_1, calc_3d_stencil(mask_i_eq_1, v_c__, v_p__, v_pp____, v_m__, v_DP_inv_half, PLUS), v_pp2); + // if_i_eq_N_minus_2 == true + v_pp1 = svsel_f64(mask_i_eq_N_minus_2, calc_3d_stencil(mask_i_eq_N_minus_2, v_c__, v_m__, v_mm____, v_p__, v_DP_inv_half, MINUS), v_pp1); + v_pp2 = svsel_f64(mask_i_eq_N_minus_2, calc_1d_stencil(mask_i_eq_N_minus_2, v_p__, v_c__, v_DP_inv) , v_pp2); + // else + v_pp1 = svsel_f64(mask_i_else, calc_3d_stencil(mask_i_else, v_c__, v_m__, v_mm____, v_p__, v_DP_inv_half, MINUS), v_pp1); + v_pp2 = svsel_f64(mask_i_else, calc_3d_stencil(mask_i_else, v_c__, v_p__, v_pp____, v_m__, v_DP_inv_half, PLUS) , v_pp2); + + // if _j_eq_1 == true + v_pt1 = svsel_f64(mask_j_eq_1, calc_1d_stencil(mask_j_eq_1, v_c__, v__m_, v_DT_inv) , v_pt1); + v_pt2 = svsel_f64(mask_j_eq_1, calc_3d_stencil(mask_j_eq_1, v_c__, v__p_, v___pp__, v__m_, v_DT_inv_half, PLUS), v_pt2); + // if _j_eq_N_minus_2 == true + v_pt1 = svsel_f64(mask_j_eq_N_minus_2, calc_3d_stencil(mask_j_eq_N_minus_2, v_c__, v__m_, v___mm__, v__p_, v_DT_inv_half, MINUS), v_pt1); + v_pt2 = svsel_f64(mask_j_eq_N_minus_2, calc_1d_stencil(mask_j_eq_N_minus_2, v__p_, v_c__, v_DT_inv) , v_pt2); + // else + v_pt1 = svsel_f64(mask_j_else, calc_3d_stencil(mask_j_else, v_c__, v__m_, v___mm__, v__p_, v_DT_inv_half, MINUS), v_pt1); + v_pt2 = svsel_f64(mask_j_else, calc_3d_stencil(mask_j_else, v_c__, v__p_, v___pp__, v__m_, v_DT_inv_half, PLUS) , v_pt2); + + // if _k_eq_1 == true + v_pr1 = svsel_f64(mask_k_eq_1, calc_1d_stencil(mask_k_eq_1, v_c__, v___m, v_DR_inv) , v_pr1); + v_pr2 = svsel_f64(mask_k_eq_1, calc_3d_stencil(mask_k_eq_1, v_c__, v___p, v_____pp, v___m, v_DR_inv_half, PLUS), v_pr2); + // if _k_eq_N_minus_2 == true + v_pr1 = svsel_f64(mask_k_eq_N_minus_2, calc_3d_stencil(mask_k_eq_N_minus_2, v_c__, v___m, v_____mm, v___p, v_DR_inv_half, MINUS), v_pr1); + v_pr2 = svsel_f64(mask_k_eq_N_minus_2, calc_1d_stencil(mask_k_eq_N_minus_2, v___p, v_c__, v_DR_inv) , v_pr2); + // else + v_pr1 = svsel_f64(mask_k_else, calc_3d_stencil(mask_k_else, v_c__, v___m, v_____mm, v___p, v_DR_inv_half, MINUS), v_pr1); + v_pr2 = svsel_f64(mask_k_else, calc_3d_stencil(mask_k_else, v_c__, v___p, v_____pp, v___m, v_DR_inv_half, PLUS) , v_pr2); + + +#endif + +} + + +inline void vect_stencil_1st_3rd_apre_simd( +#if USE_ARM_SVE + svbool_t const& pg, +#endif + __mT& v_tau, __mT const& v_fac_a,__mT const& v_fac_b, __mT const& v_fac_c, __mT const& v_fac_f, + __mT const& v_T0v, __mT const& v_T0p, __mT const& v_T0t, __mT const& v_T0r, __mT const& v_fun, __mT const& v_change, + __mT const& v_pp1, __mT const& v_pp2, __mT const& v_pt1, __mT const& v_pt2, __mT const& v_pr1, __mT const& v_pr2, + __mT const& DP_inv, __mT const& DT_inv, __mT const& DR_inv){ + +#if USE_AVX512 || USE_AVX + + // sigr = COEF * sqrt(v_fac_a)*v_T0v; + __mT sigr = _mmT_mul_pT(_mmT_mul_pT(COEF,_mmT_sqrt_pT(v_fac_a)),v_T0v); + // sigt = COEF * sqrt(v_fac_b)*v_T0v; + __mT sigt = _mmT_mul_pT(_mmT_mul_pT(COEF,_mmT_sqrt_pT(v_fac_b)),v_T0v); + // sigp = COEF * sqrt(v_fac_c)*v_T0v; + __mT sigp = _mmT_mul_pT(_mmT_mul_pT(COEF,_mmT_sqrt_pT(v_fac_c)),v_T0v); + + // coe = 1.0 / (sigr/D + sigt/D + sigz/D); + __mT coe = _mmT_div_pT(v_1,_mmT_add_pT(_mmT_add_pT(_mmT_mul_pT(sigr,DR_inv),_mmT_mul_pT(sigt,DT_inv)),_mmT_mul_pT(sigp,DP_inv))); + // coe becomes inf as sig* goes to 0 + // if coe > 1e19, set coe = 1e19 + coe = _mmT_min_pT(coe,coe_max); + + // Htau = v_fac_a * square(v_T0r * v_tau + v_T0v * (v_pr1 + v_pr2)*0.5); + __mT Htau = _mmT_mul_pT(v_fac_a,my_square_v(_mmT_add_pT(_mmT_mul_pT(v_T0r,v_tau),_mmT_mul_pT(v_T0v,_mmT_mul_pT(_mmT_add_pT(v_pr1,v_pr2),v_half))))); + + // Htau += v_fac_b * square(v_T0t * v_tau + v_T0v * (v_pt1 + v_pt2)*0.5)) + Htau = _mmT_add_pT(Htau,_mmT_mul_pT(v_fac_b,my_square_v(_mmT_add_pT(_mmT_mul_pT(v_T0t,v_tau),_mmT_mul_pT(v_T0v,_mmT_mul_pT(_mmT_add_pT(v_pt1,v_pt2), v_half)))))); + // Htau += v_fac_c * square(v_T0p * v_tau + v_T0v * (v_pp1 + v_pp2)*0.5)) + Htau = _mmT_add_pT(Htau,_mmT_mul_pT(v_fac_c,my_square_v(_mmT_add_pT(_mmT_mul_pT(v_T0p,v_tau),_mmT_mul_pT(v_T0v,_mmT_mul_pT(_mmT_add_pT(v_pp1,v_pp2), v_half)))))); + + // tmp1 = ( v_T0t * v_tau + v_T0v * (v_pt1 + v_pt2)*0.5) + __mT tmp1 = _mmT_add_pT(_mmT_mul_pT(v_T0t,v_tau),_mmT_mul_pT(v_T0v,_mmT_mul_pT(_mmT_add_pT(v_pt1,v_pt2), v_half))); + // tmp2 = ( v_T0p * v_tau + v_T0v * (v_pp1 + v_pp2)*0.5)) + __mT tmp2 = _mmT_add_pT(_mmT_mul_pT(v_T0p,v_tau),_mmT_mul_pT(v_T0v,_mmT_mul_pT(_mmT_add_pT(v_pp1,v_pp2), v_half))); + // tmp3 = -2.0 * v_fac_f * tmp1 * tmp2; + __mT tmp3 = _mmT_mul_pT(v_m2,_mmT_mul_pT(v_fac_f,_mmT_mul_pT(tmp1,tmp2))); + + // Htau = sqrt(Htau + tmp3); // # becamse nan as Htau - tmp3 goes to 0 + Htau = _mmT_sqrt_pT(_mmT_add_pT(Htau,tmp3)); + + // tmp = (sigr*(v_pr2 - v_pr1) + sigt*(v_pt2 - v_pt1) + sigz*(v_pp2 - v_pp1))*0.5 + __mT tmp = _mmT_mul_pT(v_half,_mmT_add_pT(_mmT_add_pT(_mmT_mul_pT(sigr,_mmT_sub_pT(v_pr2,v_pr1)),_mmT_mul_pT(sigt,_mmT_sub_pT(v_pt2,v_pt1))),_mmT_mul_pT(sigp,_mmT_sub_pT(v_pp2,v_pp1)))); + + // v_tau += coe * ((v_fun - Htau) + tmp) if mask is true + v_tau = _mmT_add_pT(v_tau,_mmT_mul_pT(coe,_mmT_add_pT(_mmT_sub_pT(v_fun,Htau),tmp))); + +#if USE_AVX512 + // mask if v_change != 1.0 + __mmaskT mask = _mm512_cmp_pT_mask(v_change,v_1,_CMP_NEQ_OQ); + // set 1 if mask is true + v_tau = _mm512_mask_blend_pT(mask,v_tau,v_1); +#elif USE_AVX + __m256d mask = _mm256_cmp_pT(v_change, v_1,_CMP_NEQ_OQ); + v_tau = _mm256_blendv_pd(v_tau, v_1,mask); +#endif + +#elif USE_ARM_SVE + + __mT COEF = svdup_f64(1.0); + __mT v_1 = svdup_f64(1.0); + __mT v_half = svdup_f64(0.5); + __mT v_m2 = svdup_f64(-2.0); + __mT coe_max = svdup_f64(1e19); + + // sigr = COEF * sqrt(v_fac_a)*v_T0v; + __mT sigr = svmul_f64_z(pg, svmul_f64_z(pg,COEF,svsqrt_f64_z(pg,v_fac_a)), v_T0v); + // sigt = COEF * sqrt(v_fac_b)*v_T0v; + __mT sigt = svmul_f64_z(pg, svmul_f64_z(pg,COEF,svsqrt_f64_z(pg,v_fac_b)), v_T0v); + // sigp = COEF * sqrt(v_fac_c)*v_T0v; + __mT sigp = svmul_f64_z(pg, svmul_f64_z(pg,COEF,svsqrt_f64_z(pg,v_fac_c)), v_T0v); + + // coe = 1.0 / (sigr/D + sigt/D + sigz/D); + __mT coe = svdiv_f64_z(pg, v_1, svadd_f64_z(pg, svadd_f64_z(pg, svmul_f64_z(pg, sigr, DR_inv), svmul_f64_z(pg, sigt, DT_inv)), svmul_f64_z(pg, sigp, DP_inv))); + // coe becomes inf as sig* goes to 0 + // if coe > 1e19, set coe = 1e19 + coe = svmin_f64_z(pg, coe, coe_max); + + // Htau = v_fac_a * square(v_T0r * v_tau + v_T0v * (v_pr1 + v_pr2)*0.5); + __mT Htau = svmul_f64_z(pg, v_fac_a, my_square_v(pg, svadd_f64_z(pg, \ + svmul_f64_z(pg, v_T0r, v_tau), \ + svmul_f64_z(pg, v_T0v, svmul_f64_z(pg, v_half, svadd_f64_z(pg, v_pr1, v_pr2))))\ + )\ + ); + + // Htau += v_fac_b * square(v_T0t * v_tau + v_T0v * (v_pt1 + v_pt2)*0.5)) + Htau = svadd_f64_z(pg, Htau, svmul_f64_z(pg, v_fac_b, my_square_v(pg, svadd_f64_z(pg, \ + svmul_f64_z(pg, v_T0t, v_tau), \ + svmul_f64_z(pg, v_T0v, svmul_f64_z(pg, v_half, svadd_f64_z(pg, v_pt1, v_pt2))))\ + )\ + )\ + ); + // Htau += v_fac_c * square(v_T0p * v_tau + v_T0v * (v_pp1 + v_pp2)*0.5)) + Htau = svadd_f64_z(pg, Htau, svmul_f64_z(pg, v_fac_c, my_square_v(pg, svadd_f64_z(pg, \ + svmul_f64_z(pg, v_T0p, v_tau), \ + svmul_f64_z(pg, v_T0v, svmul_f64_z(pg, v_half, svadd_f64_z(pg, v_pp1, v_pp2))))\ + )\ + )\ + ); + + // tmp1 = ( v_T0t * v_tau + v_T0v * (v_pt1 + v_pt2)*0.5) + __mT tmp1 = svadd_f64_z(pg, \ + svmul_f64_z(pg, v_T0t, v_tau), \ + svmul_f64_z(pg, v_T0v, svmul_f64_z(pg, v_half, svadd_f64_z(pg, v_pt1, v_pt2)))\ + ); + // tmp2 = ( v_T0p * v_tau + v_T0v * (v_pp1 + v_pp2)*0.5)) + __mT tmp2 = svadd_f64_z(pg, \ + svmul_f64_z(pg, v_T0p, v_tau), \ + svmul_f64_z(pg, v_T0v, svmul_f64_z(pg, v_half, svadd_f64_z(pg, v_pp1, v_pp2)))\ + ); + // tmp3 = -2.0 * v_fac_f * tmp1 * tmp2; + __mT tmp3 = svmul_f64_z(pg, v_m2, svmul_f64_z(pg, v_fac_f, svmul_f64_z(pg, tmp1, tmp2))); + + // Htau = sqrt(Htau + tmp3); // # becamse nan as Htau - tmp3 goes to 0 + Htau = svsqrt_f64_z(pg, svadd_f64_z(pg, Htau, tmp3)); + + // tmp = (sigr*(v_pr2 - v_pr1) + sigt*(v_pt2 - v_pt1) + sigz*(v_pp2 - v_pp1))*0.5 + __mT tmp = svmul_f64_z(pg, v_half, svadd_f64_z(pg, \ + svadd_f64_z(pg, \ + svmul_f64_z(pg, sigr, svsub_f64_z(pg, v_pr2, v_pr1)), \ + svmul_f64_z(pg, sigt, svsub_f64_z(pg, v_pt2, v_pt1))\ + ), \ + svmul_f64_z(pg, sigp, svsub_f64_z(pg, v_pp2, v_pp1))\ + )\ + ); + + // v_tau += coe * ((v_fun - Htau) + tmp) if mask is true + v_tau = svadd_f64_z(pg, v_tau, svmul_f64_z(pg, coe, svadd_f64_z(pg, svsub_f64_z(pg, v_fun, Htau), tmp))); + // mask = v_change != 1.0 + svbool_t mask = svcmpne_f64(pg, v_change, v_1); + // v_tau = v_1 if mask is true (!= 1.0) + v_tau = svsel_f64(mask, v_1, v_tau); + +#endif + +} + + + +inline void vect_stencil_1st_3rd_apre_simd_tele( +#if USE_ARM_SVE + svbool_t const& pg, +#endif + __mT& v_tau, __mT const& v_fac_a,__mT const& v_fac_b, __mT const& v_fac_c, __mT const& v_fac_f, + __mT const& v_fun, __mT const& v_change, + __mT const& v_pp1, __mT const& v_pp2, __mT const& v_pt1, __mT const& v_pt2, __mT const& v_pr1, __mT const& v_pr2, + __mT const& DP_inv, __mT const& DT_inv, __mT const& DR_inv){ + +#if USE_AVX512 || USE_AVX + + // sigr = COEF * sqrt(v_fac_a); + __mT sigr = _mmT_mul_pT(COEF_TELE,_mmT_sqrt_pT(v_fac_a)); + // sigt = COEF * sqrt(v_fac_b); + __mT sigt = _mmT_mul_pT(COEF_TELE,_mmT_sqrt_pT(v_fac_b)); + // sigp = COEF * sqrt(v_fac_c); + __mT sigp = _mmT_mul_pT(COEF_TELE,_mmT_sqrt_pT(v_fac_c)); + + // coe = 1.0 / (sigr/D + sigt/D + sigz/D); + __mT coe = _mmT_div_pT(v_1,_mmT_add_pT(_mmT_add_pT(_mmT_mul_pT(sigr,DR_inv),_mmT_mul_pT(sigt,DT_inv)),_mmT_mul_pT(sigp,DP_inv))); + // coe becomes inf as sig* goes to 0 + // if coe > 1e19, set coe = 1e19 + coe = _mmT_min_pT(coe,coe_max); + + // Htau = v_fac_a * square((v_pr1 + v_pr2)*0.5); + __mT Htau = _mmT_mul_pT(v_fac_a,my_square_v(_mmT_mul_pT(_mmT_add_pT(v_pr1,v_pr2),v_half))); + + // Htau += v_fac_b * square((v_pt1 + v_pt2)*0.5)) + Htau = _mmT_add_pT(Htau,_mmT_mul_pT(v_fac_b,my_square_v(_mmT_mul_pT(_mmT_add_pT(v_pt1,v_pt2), v_half)))); + // Htau += v_fac_c * square((v_pp1 + v_pp2)*0.5)) + Htau = _mmT_add_pT(Htau,_mmT_mul_pT(v_fac_c,my_square_v(_mmT_mul_pT(_mmT_add_pT(v_pp1,v_pp2), v_half)))); + + // tmp1 = (v_pt1 + v_pt2)*0.5 + __mT tmp1 = _mmT_mul_pT(_mmT_add_pT(v_pt1,v_pt2), v_half); + // tmp2 = (v_pp1 + v_pp2)*0.5 + __mT tmp2 = _mmT_mul_pT(_mmT_add_pT(v_pp1,v_pp2), v_half); + // tmp3 = -2.0 * v_fac_f * tmp1 * tmp2; + __mT tmp3 = _mmT_mul_pT(v_m2,_mmT_mul_pT(v_fac_f,_mmT_mul_pT(tmp1,tmp2))); + + // Htau = sqrt(Htau + tmp3); // # becamse nan as Htau - tmp3 goes to 0 + Htau = _mmT_sqrt_pT(_mmT_add_pT(Htau,tmp3)); + + // tmp = (sigr*(v_pr2 - v_pr1) + sigt*(v_pt2 - v_pt1) + sigz*(v_pp2 - v_pp1))*0.5 + __mT tmp = _mmT_mul_pT(v_half,_mmT_add_pT(_mmT_add_pT(_mmT_mul_pT(sigr,_mmT_sub_pT(v_pr2,v_pr1)),_mmT_mul_pT(sigt,_mmT_sub_pT(v_pt2,v_pt1))),_mmT_mul_pT(sigp,_mmT_sub_pT(v_pp2,v_pp1)))); + + // v_tau += coe * ((v_fun - Htau) + tmp) if mask is true + v_tau = _mmT_add_pT(v_tau,_mmT_mul_pT(coe,_mmT_add_pT(_mmT_sub_pT(v_fun,Htau),tmp))); + +#if USE_AVX512 + // mask if v_change != 1.0 + __mmaskT mask = _mm512_cmp_pT_mask(v_change,v_1,_CMP_NEQ_OQ); + // set 1 if mask is true + v_tau = _mm512_mask_blend_pT(mask,v_tau,v_1); +#elif USE_AVX + __m256d mask = _mm256_cmp_pT(v_change, v_1,_CMP_NEQ_OQ); + v_tau = _mm256_blendv_pd(v_tau, v_1,mask); +#endif + +#elif USE_ARM_SVE + + __mT COEF_TELE = svdup_f64(1.05); + __mT v_1 = svdup_f64(1.0); + __mT v_half = svdup_f64(0.5); + __mT v_m2 = svdup_f64(-2.0); + __mT coe_max = svdup_f64(1e19); + + // sigr = COEF * sqrt(v_fac_a); + __mT sigr = svmul_f64_z(pg,COEF_TELE,svsqrt_f64_z(pg,v_fac_a)); + // sigt = COEF * sqrt(v_fac_b); + __mT sigt = svmul_f64_z(pg,COEF_TELE,svsqrt_f64_z(pg,v_fac_b)); + // sigp = COEF * sqrt(v_fac_c); + __mT sigp = svmul_f64_z(pg,COEF_TELE,svsqrt_f64_z(pg,v_fac_c)); + + // coe = 1.0 / (sigr/D + sigt/D + sigz/D); + __mT coe = svdiv_f64_z(pg, v_1, svadd_f64_z(pg, svadd_f64_z(pg, svmul_f64_z(pg, sigr, DR_inv), svmul_f64_z(pg, sigt, DT_inv)), svmul_f64_z(pg, sigp, DP_inv))); + // coe becomes inf as sig* goes to 0 + // if coe > 1e19, set coe = 1e19 + coe = svmin_f64_z(pg, coe, coe_max); + + // Htau = v_fac_a * square((v_pr1 + v_pr2)*0.5); + __mT Htau = svmul_f64_z(pg, v_fac_a, my_square_v(pg, svmul_f64_z(pg, v_half, svadd_f64_z(pg, v_pr1, v_pr2)))); + // Htau += v_fac_b * square((v_pt1 + v_pt2)*0.5)) + Htau = svadd_f64_z(pg, Htau, svmul_f64_z(pg, v_fac_b, my_square_v(pg, svmul_f64_z(pg, v_half, svadd_f64_z(pg, v_pt1, v_pt2))))); + // Htau += v_fac_c * square((v_pp1 + v_pp2)*0.5)) + Htau = svadd_f64_z(pg, Htau, svmul_f64_z(pg, v_fac_c, my_square_v(pg, svmul_f64_z(pg, v_half, svadd_f64_z(pg, v_pp1, v_pp2))))); + + // tmp1 = (v_pt1 + v_pt2)*0.5 + __mT tmp1 = svmul_f64_z(pg, v_half, svadd_f64_z(pg, v_pt1, v_pt2)); + // tmp2 = (v_pp1 + v_pp2)*0.5 + __mT tmp2 = svmul_f64_z(pg, v_half, svadd_f64_z(pg, v_pp1, v_pp2)); + // tmp3 = -2.0 * v_fac_f * tmp1 * tmp2; + __mT tmp3 = svmul_f64_z(pg, v_m2, svmul_f64_z(pg, v_fac_f, svmul_f64_z(pg, tmp1, tmp2))); + + // Htau = sqrt(Htau + tmp3); // # becamse nan as Htau - tmp3 goes to 0 + Htau = svsqrt_f64_z(pg, svadd_f64_z(pg, Htau, tmp3)); + + // tmp = (sigr*(v_pr2 - v_pr1) + sigt*(v_pt2 - v_pt1) + sigz*(v_pp2 - v_pp1))*0.5 + __mT tmp = svmul_f64_z(pg, v_half, svadd_f64_z(pg, \ + svadd_f64_z(pg, \ + svmul_f64_z(pg, sigr, svsub_f64_z(pg, v_pr2, v_pr1)), \ + svmul_f64_z(pg, sigt, svsub_f64_z(pg, v_pt2, v_pt1))\ + ), \ + svmul_f64_z(pg, sigp, svsub_f64_z(pg, v_pp2, v_pp1))\ + )\ + ); + + // v_tau += coe * ((v_fun - Htau) + tmp) if mask is true + v_tau = svadd_f64_z(pg, v_tau, svmul_f64_z(pg, coe, svadd_f64_z(pg, svsub_f64_z(pg, v_fun, Htau), tmp))); + // mask = v_change != 1.0 + svbool_t mask = svcmpne_f64(pg, v_change, v_1); + // v_tau = v_1 if mask is true (!= 1.0) + v_tau = svsel_f64(mask, v_1, v_tau); + +#endif + +} + + +// function for calculating the values on boundaries +inline void calculate_boundary_nodes_tele_simd( +#if USE_ARM_SVE + svbool_t const& pg, +#endif + __mT const& v_iip, __mT const& v_jjt, __mT const& v_kkr, + __mT & v_c__, + __mT const& v_p__, __mT const& v_m__, __mT const& v__p_, __mT const& v__m_, __mT const& v___p, __mT const& v___m, + __mT const& v_pp____, __mT const& v_mm____, __mT const& v___pp__, __mT const& v___mm__, __mT const& v_____pp, __mT const& v_____mm, + __mT const& v_change, + int const& loc_I, int const& loc_J, int const& loc_K +){ + +#if USE_AVX512 + + // mask for bottom boundary (v_kkr == 0 && v_change == 1.0) + __mmaskT mask_bot = _kand_maskT(\ + _mm512_cmp_pT_mask(v_kkr, v_0, _CMP_EQ_OQ), \ + _mm512_cmp_pT_mask(v_change, v_1, _CMP_EQ_OQ)); + // mask for top boundary (v_kkr == loc_K-1 && v_change == 1.0) + __mmaskT mask_top = _kand_maskT(\ + _mm512_cmp_pT_mask(v_kkr, _mmT_set1_pT(loc_K-1), _CMP_EQ_OQ), \ + _mm512_cmp_pT_mask(v_change, v_1, _CMP_EQ_OQ)); + // mask for south boundary (v_jjt == 0 && v_change == 1.0) + __mmaskT mask_south = _kand_maskT(\ + _mm512_cmp_pT_mask(v_jjt, v_0, _CMP_EQ_OQ), \ + _mm512_cmp_pT_mask(v_change, v_1, _CMP_EQ_OQ)); + // mask for north boundary (v_jjt == loc_J-1 && v_change == 1.0) + __mmaskT mask_north = _kand_maskT(\ + _mm512_cmp_pT_mask(v_jjt, _mmT_set1_pT(loc_J-1), _CMP_EQ_OQ), \ + _mm512_cmp_pT_mask(v_change, v_1, _CMP_EQ_OQ)); + // mask for west boundary (v_iip == 0 && v_change == 1.0) + __mmaskT mask_west = _kand_maskT(\ + _mm512_cmp_pT_mask(v_iip, v_0, _CMP_EQ_OQ), \ + _mm512_cmp_pT_mask(v_change, v_1, _CMP_EQ_OQ)); + // mask for east boundary (v_iip == loc_I-1 && v_change == 1.0) + __mmaskT mask_east = _kand_maskT(\ + _mm512_cmp_pT_mask(v_iip, _mmT_set1_pT(loc_I-1), _CMP_EQ_OQ), \ + _mm512_cmp_pT_mask(v_change, v_1, _CMP_EQ_OQ)); + + // if mask_bot, v_c__ = max(2*v___p - v_____pp, v_____pp) + v_c__ = _mm512_mask_blend_pT(mask_bot, v_c__, _mmT_max_pT(_mmT_sub_pT(_mmT_mul_pT(v_2, v___p), v_____pp), v_____pp)); + // if mask_top, v_c__ = max(2*v___m - v_____mm, v_____mm) + v_c__ = _mm512_mask_blend_pT(mask_top, v_c__, _mmT_max_pT(_mmT_sub_pT(_mmT_mul_pT(v_2, v___m), v_____mm), v_____mm)); + // if mask_south, v_c__ = max(2*v__p_ - v___pp__, v___pp__) + v_c__ = _mm512_mask_blend_pT(mask_south, v_c__, _mmT_max_pT(_mmT_sub_pT(_mmT_mul_pT(v_2, v__p_), v___pp__), v___pp__)); + // if mask_north, v_c__ = max(2*v__m_ - v___mm__, v___mm__) + v_c__ = _mm512_mask_blend_pT(mask_north, v_c__, _mmT_max_pT(_mmT_sub_pT(_mmT_mul_pT(v_2, v__m_), v___mm__), v___mm__)); + // if mask_west, v_c__ = max(2*v_p__ - v_pp____, v_pp____) + v_c__ = _mm512_mask_blend_pT(mask_west, v_c__, _mmT_max_pT(_mmT_sub_pT(_mmT_mul_pT(v_2, v_p__), v_pp____), v_pp____)); + // if mask_east, v_c__ = max(2*v_m__ - v_mm____, v_mm____) + v_c__ = _mm512_mask_blend_pT(mask_east, v_c__, _mmT_max_pT(_mmT_sub_pT(_mmT_mul_pT(v_2, v_m__), v_mm____), v_mm____)); +#elif USE_AVX + + // mask for bottom boundary (v_kkr == 0 && v_change == 1.0) + __m256d mask_bot = _mm256_and_pd(\ + _mm256_cmp_pT(v_kkr, v_0, _CMP_EQ_OQ), \ + _mm256_cmp_pT(v_change, v_1, _CMP_EQ_OQ)); + // mask for top boundary (v_kkr == loc_K-1 && v_change == 1.0) + __m256d mask_top = _mm256_and_pd(\ + _mm256_cmp_pT(v_kkr, _mmT_set1_pT(loc_K-1), _CMP_EQ_OQ), \ + _mm256_cmp_pT(v_change, v_1, _CMP_EQ_OQ)); + // mask for south boundary (v_jjt == 0 && v_change == 1.0) + __m256d mask_south = _mm256_and_pd(\ + _mm256_cmp_pT(v_jjt, v_0, _CMP_EQ_OQ), \ + _mm256_cmp_pT(v_change, v_1, _CMP_EQ_OQ)); + // mask for north boundary (v_jjt == loc_J-1 && v_change == 1.0) + __m256d mask_north = _mm256_and_pd(\ + _mm256_cmp_pT(v_jjt, _mmT_set1_pT(loc_J-1), _CMP_EQ_OQ), \ + _mm256_cmp_pT(v_change, v_1, _CMP_EQ_OQ)); + // mask for west boundary (v_iip == 0 && v_change == 1.0) + __m256d mask_west = _mm256_and_pd(\ + _mm256_cmp_pT(v_iip, v_0, _CMP_EQ_OQ), \ + _mm256_cmp_pT(v_change, v_1, _CMP_EQ_OQ)); + // mask for east boundary (v_iip == loc_I-1 && v_change == 1.0) + __m256d mask_east = _mm256_and_pd(\ + _mm256_cmp_pT(v_iip, _mmT_set1_pT(loc_I-1), _CMP_EQ_OQ), \ + _mm256_cmp_pT(v_change, v_1, _CMP_EQ_OQ)); + // if mask_bot, v_c__ = max(2*v___p - v_____pp, v_____pp) + v_c__ = _mm256_blendv_pd(v_c__, _mm256_max_pd(_mm256_sub_pd(_mm256_mul_pd(v_2, v___p), v_____pp), v_____pp), mask_bot); + // if mask_top, v_c__ = max(2*v___m - v_____mm, v_____mm) + v_c__ = _mm256_blendv_pd(v_c__, _mm256_max_pd(_mm256_sub_pd(_mm256_mul_pd(v_2, v___m), v_____mm), v_____mm), mask_top); + // if mask_south, v_c__ = max(2*v__p_ - v___pp__, v___pp__) + v_c__ = _mm256_blendv_pd(v_c__, _mm256_max_pd(_mm256_sub_pd(_mm256_mul_pd(v_2, v__p_), v___pp__), v___pp__), mask_south); + // if mask_north, v_c__ = max(2*v__m_ - v___mm__, v___mm__) + v_c__ = _mm256_blendv_pd(v_c__, _mm256_max_pd(_mm256_sub_pd(_mm256_mul_pd(v_2, v__m_), v___mm__), v___mm__), mask_north); + // if mask_west, v_c__ = max(2*v_p__ - v_pp____, v_pp____) + v_c__ = _mm256_blendv_pd(v_c__, _mm256_max_pd(_mm256_sub_pd(_mm256_mul_pd(v_2, v_p__), v_pp____), v_pp____), mask_west); + // if mask_east, v_c__ = max(2*v_m__ - v_mm____, v_mm____) + v_c__ = _mm256_blendv_pd(v_c__, _mm256_max_pd(_mm256_sub_pd(_mm256_mul_pd(v_2, v_m__), v_mm____), v_mm____), mask_east); + +#elif USE_ARM_SVE + + svfloat64_t v_0 = svdup_f64(0.0); + svfloat64_t v_1 = svdup_f64(1.0); + svfloat64_t v_2 = svdup_f64(2.0); + svfloat64_t v_loc_I_minus_1 = svdup_f64(loc_I-1); + svfloat64_t v_loc_J_minus_1 = svdup_f64(loc_J-1); + svfloat64_t v_loc_K_minus_1 = svdup_f64(loc_K-1); + + + // mask for bottom boundary + svbool_t mask_bot = svand_b_z(pg, \ + svcmpeq_f64(pg, v_kkr, v_0), \ + svcmpeq_f64(pg, v_change, v_1)); + // mask for top boundary + svbool_t mask_top = svand_b_z(pg, \ + svcmpeq_f64(pg, v_kkr, v_loc_K_minus_1), \ + svcmpeq_f64(pg, v_change, v_1)); + // mask for south boundary + svbool_t mask_south = svand_b_z(pg, \ + svcmpeq_f64(pg, v_jjt, v_0), \ + svcmpeq_f64(pg, v_change, v_1)); + // mask for north boundary + svbool_t mask_north = svand_b_z(pg, \ + svcmpeq_f64(pg, v_jjt, v_loc_J_minus_1), \ + svcmpeq_f64(pg, v_change, v_1)); + // mask for west boundary + svbool_t mask_west = svand_b_z(pg, \ + svcmpeq_f64(pg, v_iip, v_0), \ + svcmpeq_f64(pg, v_change, v_1)); + // mask for east boundary + svbool_t mask_east = svand_b_z(pg, \ + svcmpeq_f64(pg, v_iip, v_loc_I_minus_1), \ + svcmpeq_f64(pg, v_change, v_1)); + + // if mask_bot, v_c__ = max(2*v___p - v_____pp, v_____pp) + v_c__ = svsel_f64(mask_bot, \ + svmax_f64_z(pg, svsub_f64_z(pg, svmul_f64_z(pg, v_2, v___p), v_____pp), v_____pp), \ + v_c__); + // if mask_top, v_c__ = max(2*v___m - v_____mm, v_____mm) + v_c__ = svsel_f64(mask_top, \ + svmax_f64_z(pg, svsub_f64_z(pg, svmul_f64_z(pg, v_2, v___m), v_____mm), v_____mm), \ + v_c__); + // if mask_south, v_c__ = max(2*v__p_ - v___pp__, v___pp__) + v_c__ = svsel_f64(mask_south, \ + svmax_f64_z(pg, svsub_f64_z(pg, svmul_f64_z(pg, v_2, v__p_), v___pp__), v___pp__), \ + v_c__); + // if mask_north, v_c__ = max(2*v__m_ - v___mm__, v___mm__) + v_c__ = svsel_f64(mask_north, \ + svmax_f64_z(pg, svsub_f64_z(pg, svmul_f64_z(pg, v_2, v__m_), v___mm__), v___mm__), \ + v_c__); + // if mask_west, v_c__ = max(2*v_p__ - v_pp____, v_pp____) + v_c__ = svsel_f64(mask_west, \ + svmax_f64_z(pg, svsub_f64_z(pg, svmul_f64_z(pg, v_2, v_p__), v_pp____), v_pp____), \ + v_c__); + // if mask_east, v_c__ = max(2*v_m__ - v_mm____, v_mm____) + v_c__ = svsel_f64(mask_east, \ + svmax_f64_z(pg, svsub_f64_z(pg, svmul_f64_z(pg, v_2, v_m__), v_mm____), v_mm____), \ + v_c__); + +#endif + +} + + + + + + +#if USE_AVX512 || USE_AVX + +inline __mT load_mem_gen_to_mTd(CUSTOMREAL* a, int* ijk){ + + CUSTOMREAL dump_[NSIMD]; + for (int i=0; i/etc/yum.repos.d/CentOS-Base.repo && \ + yum clean all + +RUN yum update ca-certificates -y + +# install dependencies +RUN yum update -y && \ + yum groupinstall -y 'Development Tools' && \ + yum install -y \ + openssl-devel \ + libuuid-devel \ + libseccomp-devel \ + wget \ + squashfs-tools \ + cryptsetup + + + +# install go +ENV VERSION=1.16.2 OS=linux ARCH=amd64 +RUN wget https://dl.google.com/go/go$VERSION.$OS-$ARCH.tar.gz && \ + tar -C /usr/local -xzvf go$VERSION.$OS-$ARCH.tar.gz && \ + rm go$VERSION.$OS-$ARCH.tar.gz +ENV PATH="${PATH}:/usr/local/go/bin" + +# install singularity of 3.6.4 +RUN wget https://github.com/apptainer/singularity/releases/download/v3.6.4/singularity-3.6.4.tar.gz && \ + tar -xvf singularity-3.6.4.tar.gz && \ + rm singularity-3.6.4.tar.gz && \ + cd singularity && \ + ./mconfig && \ + make -C builddir && \ + make -C builddir install + +# install singularity of 3.9 +#ENV VERSION=3.9.5 +#RUN wget https://github.com/sylabs/singularity/releases/download/v${VERSION}/singularity-ce-${VERSION}.tar.gz && \ +# tar -xzf singularity-ce-${VERSION}.tar.gz && \ +# cd singularity-ce-${VERSION} && \ +# ./mconfig && \ +# make -C builddir && \ +# make -C builddir install + diff --git a/singularity/Dockerfile_singularity_on_centos6_cuda10.1 b/singularity/Dockerfile_singularity_on_centos6_cuda10.1 new file mode 100644 index 0000000..a755071 --- /dev/null +++ b/singularity/Dockerfile_singularity_on_centos6_cuda10.1 @@ -0,0 +1,47 @@ +FROM nvidia/cuda:10.2-devel-centos6 + +# install wget without yum +RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak && \ + curl https://www.host-stage.net/hsmirrors/centos6repofix >/etc/yum.repos.d/CentOS-Base.repo && \ + yum clean all + +RUN yum update ca-certificates -y + +# install dependencies +RUN yum update -y && \ + yum groupinstall -y 'Development Tools' && \ + yum install -y \ + openssl-devel \ + libuuid-devel \ + libseccomp-devel \ + wget \ + squashfs-tools \ + cryptsetup + + + +# install go +ENV VERSION=1.16.2 OS=linux ARCH=amd64 +RUN wget https://dl.google.com/go/go$VERSION.$OS-$ARCH.tar.gz && \ + tar -C /usr/local -xzvf go$VERSION.$OS-$ARCH.tar.gz && \ + rm go$VERSION.$OS-$ARCH.tar.gz +ENV PATH="${PATH}:/usr/local/go/bin" + +# install singularity of 3.6.4 +RUN wget https://github.com/apptainer/singularity/releases/download/v3.6.4/singularity-3.6.4.tar.gz && \ + tar -xvf singularity-3.6.4.tar.gz && \ + rm singularity-3.6.4.tar.gz && \ + cd singularity && \ + ./mconfig && \ + make -C builddir && \ + make -C builddir install + +# install singularity of 3.9 +#ENV VERSION=3.9.5 +#RUN wget https://github.com/sylabs/singularity/releases/download/v${VERSION}/singularity-ce-${VERSION}.tar.gz && \ +# tar -xzf singularity-ce-${VERSION}.tar.gz && \ +# cd singularity-ce-${VERSION} && \ +# ./mconfig && \ +# make -C builddir && \ +# make -C builddir install + diff --git a/singularity/README.md b/singularity/README.md new file mode 100644 index 0000000..2a93b6c --- /dev/null +++ b/singularity/README.md @@ -0,0 +1,51 @@ +# Singularity image of TomoATT project + +[Singularity](https://docs.sylabs.io/guides/3.10/user-guide/introduction.html) is a container technology that prepare a pre-compiled project's executable with an environment required dependencies (this is called a container image). +This is very useful for the users who are not familiar with the process of compiling the project's executable and installing the required dependencies, and also for the users who are not allowed to install the required dependencies on their system. + +Once the container image is prepared, this image can be uploaded on singularity-hub.org, and the users can download the image and run the project's executable on their system instantly. + +[Docker](https://www.docker.com/) is another container technology similar to Singularity, which is rather popular in the Information Technology (IT) community. However, Docker may not access the MPI library on the native system, which Singularity can do, and this cause degradation of the performance of the application. + +Therefore, Singularity is more popular and suitable in scientific computing community and often used in the HPC environment. + + +This directry includes a singularity receipe file (*.def) to build a container image of TomoATT project. +To build the container image, +``` bash +sudo singularity build tomoatt.sif tomoatt.def +``` + +To run the TomoATT executable on the container image, +``` bash +singularity run tomoatt.sif TOMOATT +``` + +To run the TomoATT executable on the container image with native MPI library, +``` bash +mpirun -n 8 singularity run tomoatt.sif TOMOATT -i input_params.yml +``` +For utilizing the native MPI library, the version number of OpenMPI should be the same between the native system and the container image. +The two variables in tomoatt.def file need to be modified for this purpose. +``` bash + export OMPI_VERSOIN_MAJOR=3.0 + export OMPI_VERSION_FULL=3.0.1 +``` + + +# For running the container image on the HPC with old kernel environment + +Some HPC systems have old kernel environment, e.g. CentOS 6, RHEL 6, and Ubuntu 16.04. +In this case, the container image cannot be run on the HPC system. (The error message is "FATAL: kernel too old") +To create a container image that can be run on the HPC system, this image needs to be built on the old kernel environment as well. +For this purpose, we use [docker](https://www.docker.com/) for virtualy creating an old kernel environment, and then build the container image on it. + +To build the container image on the old kernel environment, +``` bash +docker build -t singularity_on_centos6 -f Dockerfile_singularity_on_centos6 . +``` + +To build the container image on the old kernel environment, +``` bash +docker run --privileged -v "(full path to)/TomoATT:/TomoATT" singularity_on_centos6 singularity build /TomoATT/singularity/tomoatt.sif /TomoATT/singularity/tomoatt.def +``` \ No newline at end of file diff --git a/singularity/tomoatt.def b/singularity/tomoatt.def new file mode 100644 index 0000000..46ca9a1 --- /dev/null +++ b/singularity/tomoatt.def @@ -0,0 +1,87 @@ +Bootstrap: docker +From: ubuntu:16.04 + +%help +This is a test container. + +%files + ../../TomoATT /opt/TomoATT + +%environment + export PKG_DIR=/opt/packages + export SINGULARITY_PKG_DIR=$PKG_DIR + export SINGULARITYENV_APPEND_PATH=$PKG_DIR/bin + export SINGULAIRTYENV_APPEND_LD_LIBRARY_PATH=$PKG_DIR/lib + export PATH=$PKG_DIR/bin:$PATH + export PATH=/opt/TomoATT/build/bin:$PATH + export LD_LIBRARY_PATH=$PKG_DIR/lib:$LD_LIBRARY_PATH + +%post + echo "Installing required packages..." + apt-get update && apt-get install -y wget git bash gcc gfortran g++ make file apt-transport-https ca-certificates + + # install gcc-9 and g++-9 + apt-get install -y software-properties-common && \ + add-apt-repository ppa:ubuntu-toolchain-r/test -y && \ + apt-get update -y && \ + apt-get install -y gcc-9 g++-9 && \ + update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 60 --slave /usr/bin/g++ g++ /usr/bin/g++-9 + + # install latest cmake + apt update && \ + apt install -y software-properties-common lsb-release && \ + apt clean all && \ + wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null && \ + apt-add-repository "deb https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main" && \ + apt update && \ + apt install kitware-archive-keyring && \ + rm /etc/apt/trusted.gpg.d/kitware.gpg && \ + apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4 && \ + apt update && \ + apt install -y cmake && \ + apt clean all + + export PKG_DIR=/opt/packages + export NPROC=4 + + echo "Installing Open MPI" + export OMPI_VERSOIN_MAJOR=3.0 + export OMPI_VERSION_FULL=3.0.1 + export OMPI_URL="https://download.open-mpi.org/release/open-mpi/v$OMPI_VERSOIN_MAJOR/openmpi-$OMPI_VERSION_FULL.tar.gz" + mkdir -p /tmp/ompi + mkdir -p /opt + # Download + cd /tmp/ompi && wget -O openmpi-$OMPI_VERSION_FULL.tar.gz $OMPI_URL && tar -xvf openmpi-$OMPI_VERSION_FULL.tar.gz + # Compile and install + cd /tmp/ompi/openmpi-$OMPI_VERSION_FULL && ./configure --prefix=$PKG_DIR && make -j$NPROC && make install + # Set env variables so we can compile our application + export PATH=$PKG_DIR/bin:$PATH + export LD_LIBRARY_PATH=$PKG_DIR/lib:$LD_LIBRARY_PATH + export MANPATH=$PKG_DIR/share/man:$MANPATH + + echo "openmpi installed." + + echo "Compiling hdf5" + + export HDF5_VERSION_MAJOR=1.13 + export HDF5_VERSION_FULL=1.13.2 + export HDF5_URL="https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-$HDF5_VERSION_MAJOR/hdf5-$HDF5_VERSION_FULL/src/hdf5-$HDF5_VERSION_FULL.tar.gz" + mkdir -p /tmp/hdf5 + cd /tmp/hdf5 && wget -O hdf5-$HDF5_VERSION_FULL.tar.gz $HDF5_URL && tar -xvf hdf5-$HDF5_VERSION_FULL.tar.gz && cd hdf5-$HDF5_VERSION_FULL + tar -xvf hdf5-$HDF5_VERSION_FULL.tar.gz && cd hdf5-$HDF5_VERSION_FULL + CC=mpicc CXX=mpic++ ./configure --enable-parallel --enable-unsupported --enable-shared --enable-cxx --prefix=$PKG_DIR && make -j$NPROC && make install + + echo "hdf5 installed." + + cd /opt/TomoATT + mkdir -p build && cd build && rm -rf ./* + cmake .. -DCMAKE_PREFIX_PATH=$PKG_DIR + make -j$NPROC + + echo "TomoATT installed." + +%labels + + Maintainer MasaruNagaso + + Version v1.0 diff --git a/singularity/tomoatt_cuda.def b/singularity/tomoatt_cuda.def new file mode 100644 index 0000000..51e3046 --- /dev/null +++ b/singularity/tomoatt_cuda.def @@ -0,0 +1,87 @@ +Bootstrap: docker +From: ubuntu:16.04 + +%help +This is a test container. + +%files + ../../TomoATT /opt/TomoATT + +%environment + export PKG_DIR=/opt/packages + export SINGULARITY_PKG_DIR=$PKG_DIR + export SINGULARITYENV_APPEND_PATH=$PKG_DIR/bin + export SINGULAIRTYENV_APPEND_LD_LIBRARY_PATH=$PKG_DIR/lib + export PATH=$PKG_DIR/bin:$PATH + export PATH=/opt/TomoATT/build/bin:$PATH + export LD_LIBRARY_PATH=$PKG_DIR/lib:$LD_LIBRARY_PATH + +%post + echo "Installing required packages..." + apt-get update && apt-get install -y wget git bash gcc gfortran g++ make file apt-transport-https ca-certificates + + # install gcc-9 and g++-9 + apt-get install -y software-properties-common && \ + add-apt-repository ppa:ubuntu-toolchain-r/test -y && \ + apt-get update -y && \ + apt-get install -y gcc-9 g++-9 && \ + update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 60 --slave /usr/bin/g++ g++ /usr/bin/g++-9 + + # install latest cmake + apt update && \ + apt install -y software-properties-common lsb-release && \ + apt clean all && \ + wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null && \ + apt-add-repository "deb https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main" && \ + apt update && \ + apt install kitware-archive-keyring && \ + rm /etc/apt/trusted.gpg.d/kitware.gpg && \ + apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4 && \ + apt update && \ + apt install -y cmake && \ + apt clean all + + export PKG_DIR=/opt/packages + export NPROC=4 + + echo "Installing Open MPI" + export OMPI_VERSOIN_MAJOR=3.0 + export OMPI_VERSION_FULL=3.0.1 + export OMPI_URL="https://download.open-mpi.org/release/open-mpi/v$OMPI_VERSOIN_MAJOR/openmpi-$OMPI_VERSION_FULL.tar.gz" + mkdir -p /tmp/ompi + mkdir -p /opt + # Download + cd /tmp/ompi && wget -O openmpi-$OMPI_VERSION_FULL.tar.gz $OMPI_URL && tar -xvf openmpi-$OMPI_VERSION_FULL.tar.gz + # Compile and install + cd /tmp/ompi/openmpi-$OMPI_VERSION_FULL && ./configure --prefix=$PKG_DIR && make -j$NPROC && make install + # Set env variables so we can compile our application + export PATH=$PKG_DIR/bin:$PATH + export LD_LIBRARY_PATH=$PKG_DIR/lib:$LD_LIBRARY_PATH + export MANPATH=$PKG_DIR/share/man:$MANPATH + + echo "openmpi installed." + + echo "Compiling hdf5" + + export HDF5_VERSION_MAJOR=1.13 + export HDF5_VERSION_FULL=1.13.2 + export HDF5_URL="https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-$HDF5_VERSION_MAJOR/hdf5-$HDF5_VERSION_FULL/src/hdf5-$HDF5_VERSION_FULL.tar.gz" + mkdir -p /tmp/hdf5 + cd /tmp/hdf5 && wget -O hdf5-$HDF5_VERSION_FULL.tar.gz $HDF5_URL && tar -xvf hdf5-$HDF5_VERSION_FULL.tar.gz && cd hdf5-$HDF5_VERSION_FULL + tar -xvf hdf5-$HDF5_VERSION_FULL.tar.gz && cd hdf5-$HDF5_VERSION_FULL + CC=mpicc CXX=mpic++ ./configure --enable-parallel --enable-unsupported --enable-shared --enable-cxx --prefix=$PKG_DIR && make -j$NPROC && make install + + echo "hdf5 installed." + + cd /opt/TomoATT + mkdir -p build && cd build && rm -rf ./* + cmake .. -DUSE_CUDA=True -DCMAKE_PREFIX_PATH=$PKG_DIR + make -j$NPROC + + echo "TomoATT installed." + +%labels + + Maintainer MasaruNagaso + + Version v1.0 diff --git a/src/SrcRecWeight.cxx b/src/SrcRecWeight.cxx new file mode 100644 index 0000000..35f8f59 --- /dev/null +++ b/src/SrcRecWeight.cxx @@ -0,0 +1,505 @@ +#include +#include +#include + +#include "utils.h" +#include "input_params.h" +#include "src_rec.h" +#include "mpi_funcs.h" + +#ifdef USE_OMP +#include +#endif + +/* + caluclate geographical weight for sources and receivers. + At first, we calculate inversed weight for each source from summation of epicentral distances to all sources. + Then, we calculate inversed weight for each receiver from summation of epicentral distances to all receivers. + + ref: Youyi Ruan(2019) https://academic.oup.com/gji/article/219/2/1225/5542709 +*/ + +void calc_dist_min_max(std::map& src_or_rec, \ + std::vector& id2name,\ + CUSTOMREAL& d_min, CUSTOMREAL& d_max){ + // calculate the min and max epicentral distance of all src_or_rec + + // check the min and max epicentral distance of all src_or_rec + CUSTOMREAL tmp_min = 1.0e+10; + CUSTOMREAL tmp_max = 0.0; + + int n_elm = src_or_rec.size(); + + #pragma omp parallel for default(none) shared(src_or_rec, id2name, n_elm) reduction(min:tmp_min) reduction(max:tmp_max) + for (int i = 0; i < n_elm-1; i++) { + for (int j = i+1; j < n_elm; j++) { + CUSTOMREAL d_ij = 0.0; + + SrcRecInfo& sr_i = src_or_rec[id2name[i]]; + SrcRecInfo& sr_j = src_or_rec[id2name[j]]; + + Epicentral_distance_sphere(sr_i.lat*DEG2RAD, \ + sr_i.lon*DEG2RAD, \ + sr_j.lat*DEG2RAD, \ + sr_j.lon*DEG2RAD, \ + d_ij); + + if (d_ij < tmp_min) tmp_min = d_ij; + if (d_ij > tmp_max) tmp_max = d_ij; + } + } + + // set result + d_min = tmp_min; + d_max = tmp_max; + + // print the min and max epicentral distance + //std::cout << "min epicentral distance = " << d_min << std::endl; + //std::cout << "max epicentral distance = " << d_max << std::endl; + +} + +void init_weight(std::map& src_or_rec, \ + std::vector& id2name){ + // initialize all the source and receiver weights to be zero + #pragma omp parallel for default(none) shared(src_or_rec, id2name) + for (int i = 0; i < (int)id2name.size(); i++) { + src_or_rec[id2name[i]].sum_weight = 0.0; + } +} + + +CUSTOMREAL _calc_weight(std::map& src_or_rec, \ + std::vector& id2name, \ + CUSTOMREAL& d_zero){ + + int n_elm = id2name.size(); + + // parallelize loop over sources and receivers + // sharing src_or_rec.weight + #pragma omp parallel for default(none) shared(src_or_rec, id2name, n_elm, d_zero, std::cout) + for (int i = 0; i < n_elm-1; i++) { + for (int j = i+1; j < n_elm; j++) { + CUSTOMREAL d_ij = 0.0; + + SrcRecInfo& sr_i = src_or_rec[id2name[i]]; + SrcRecInfo& sr_j = src_or_rec[id2name[j]]; + + Epicentral_distance_sphere(sr_i.lat*DEG2RAD, \ + sr_i.lon*DEG2RAD, \ + sr_j.lat*DEG2RAD, \ + sr_j.lon*DEG2RAD, \ + d_ij); + + d_ij *= RAD2DEG; + + CUSTOMREAL w_inv_tmp = std::exp(-std::pow(d_ij/d_zero, 2.0)); + //CUSTOMREAL w_inv_tmp = std::pow(-(d_ij/d_zero)*(d_ij/d_zero),4.0); + + // check if w_inv_tmp is nan or inf + if (std::isnan(w_inv_tmp) || std::isinf(w_inv_tmp)) { + std::cout << "w_inv_tmp is nan or inf " << std::endl; + std::cout << "d_ij = " << d_ij << std::endl; + std::cout << "d_zero = " << d_zero << std::endl; + std::cout << "i = " << i << std::endl; + std::cout << "j = " << j << std::endl; + std::cout << "name_i = " << id2name[i] << std::endl; + std::cout << "name_j = " << id2name[j] << std::endl; + std::cout << "sr_i.id = " << sr_i.id << std::endl; + std::cout << "sr_j.id = " << sr_j.id << std::endl; + std::cout << "sr_i.lat = " << sr_i.lat << std::endl; + std::cout << "sr_i.lon = " << sr_i.lon << std::endl; + std::cout << "sr_j.lat = " << sr_j.lat << std::endl; + std::cout << "sr_j.lon = " << sr_j.lon << std::endl; + std::cout << "w_inv_tmp = " << w_inv_tmp << std::endl; + exit(1); + } + + sr_i.sum_weight += w_inv_tmp; + sr_j.sum_weight += w_inv_tmp; + } + } + + + // here the weight is inversed weight, so we need to invert it + #pragma omp parallel for default(none) shared(src_or_rec, id2name, n_elm, d_zero, std::cout) + for (int i = 0; i < n_elm; i++) { + CUSTOMREAL w_tmp = src_or_rec[id2name[i]].sum_weight; + // check if w_tmp is nan or inf + if (std::isnan(w_tmp) || std::isinf(w_tmp)){ + std::cout << "w_tmp is nan or inf" << std::endl; + std::cout << "i = " << i << std::endl; + std::cout << "name_i = " << id2name[i] << std::endl; + std::cout << "w_tmp = " << w_tmp << std::endl; + exit(1); + } + + + src_or_rec[id2name[i]].sum_weight = 1.0/src_or_rec[id2name[i]].sum_weight; + } + + // calculate condition number (min/max of weight) + CUSTOMREAL w_min = 1.0e+10; + CUSTOMREAL w_max = 0.0; + + // parallelize loop for finding min and max with reduction + #pragma omp parallel for default(none) shared(src_or_rec, id2name, n_elm) reduction(min:w_min) reduction(max:w_max) + for (int i = 0; i < n_elm; i++) { + if (src_or_rec[id2name[i]].sum_weight < w_min) w_min = src_or_rec[id2name[i]].sum_weight; + if (src_or_rec[id2name[i]].sum_weight > w_max) w_max = src_or_rec[id2name[i]].sum_weight; + } + + std::cout << "weight min = " << w_min << std::endl; + std::cout << "weight max = " << w_max << std::endl; + std::cout << "condition number = " << w_max/w_min << std::endl; + + return w_max/w_min; + +} + + +int find_good_ncond(std::vector& condition_numbers){ + // select the best condition number + + int n_try = condition_numbers.size(); + + CUSTOMREAL ncond_min = 1.0e+10; + CUSTOMREAL ncond_max = 0.0; + + for (int i = 0; i < n_try; i++) { + // ignore abnormal value + if (std::isnan(condition_numbers[i])) continue; + if (std::isinf(condition_numbers[i])) continue; + + if (condition_numbers[i] < ncond_min) { + ncond_min = condition_numbers[i]; + } + if (condition_numbers[i] > ncond_max) { + ncond_max = condition_numbers[i]; + } + } + + // find the first one-third point between min and max condition number + CUSTOMREAL ncond_1_3 = ncond_min + (ncond_max - ncond_min) / 3.0; + int ncond_1_3_idx = 0; + + for (int i = 0; i < n_try; i++) { + // ignore abnormal value + if (std::isnan(condition_numbers[i])) continue; + if (std::isinf(condition_numbers[i])) continue; + + if (condition_numbers[i] > ncond_1_3) { + ncond_1_3_idx = i; + break; + } + } + + return ncond_1_3_idx; +} + + +void normalize_weight(std::map& src_or_rec, std::vector& id2name){ + + // scale weight values to be \sum_{i}^{S} w_i = S + + int n_elm = src_or_rec.size(); + CUSTOMREAL w_sum = 0.0; + #pragma omp parallel for default(none) reduction(+:w_sum) shared(src_or_rec, id2name, n_elm) + for(int i = 0; i < n_elm; i++){ + w_sum += src_or_rec[id2name[i]].sum_weight; + } + + #pragma omp parallel for default(none) shared(src_or_rec, id2name, n_elm, w_sum) + for (int i=0; i>>& data_map, \ + std::map& src_map, \ + std::map& rec_map, \ + std::vector& src_id2name, \ + std::vector& rec_id2name){ + + // normalize weight in each event (sum of weight*n_data becomes 1.0*number of data tracks in the event) + int n_src = src_id2name.size(); + int n_rec = rec_id2name.size(); + +// +// this way cancel the geographical weight on the receiver side +// + #pragma omp parallel for default(none) shared(data_map, src_map, rec_map, src_id2name, rec_id2name, n_src, n_rec) + for (int i = 0; i < n_src; i++) { + CUSTOMREAL w_sum_tmp = 0.0; // sum of receiver weight + for (int j = 0; j < n_rec; j++) { + int v_data_size = data_map[src_id2name[i]][rec_id2name[j]].size(); + if (v_data_size > 0) { + CUSTOMREAL& weight_rec = rec_map[rec_id2name[j]].sum_weight; + w_sum_tmp += weight_rec*v_data_size; + //n_data +=v_data_size; + } + } + + // normalize for receivers + for (int j = 0; j < n_rec; j++) { + for(auto &data : data_map[src_id2name[i]][rec_id2name[j]]){ + data.data_weight = src_map[src_id2name[i]].sum_weight*rec_map[rec_id2name[j]].sum_weight/w_sum_tmp; + } + } + } + +// #pragma omp parallel for default(none) shared(data_map, src_map, rec_map, src_id2name, rec_id2name, n_src, n_rec) +// for (int i = 0; i < n_src; i++) { +// for (int j = 0; j < n_rec; j++) { +// int v_data_size = data_map[src_id2name[i]][rec_id2name[j]].size(); +// for (int k = 0; k < v_data_size; k++) { +// data_map[src_id2name[i]][rec_id2name[j]][k].data_weight = src_map[src_id2name[i]].sum_weight*rec_map[rec_id2name[j]].sum_weight; +// } +// } +// } +} + + + + +void calc_weight(std::map& src_or_rec, \ + std::vector& id2name){ + + CUSTOMREAL d_zero_fin; + + if (ref_value < 0) { + + // calculate the weights of sources or receivers + int n_try = 30; // number of tries + + // get the min and max epicentral distance of all src_or_rec + CUSTOMREAL d_min, d_max; + // calc_dist_min_max(src_or_rec, id2name, d_min, d_max); + + // convert rad to deg + //d_min *= RAD2DEG; + //d_max *= RAD2DEG; + + d_max = 5.0; // in deg + d_min = 0.01; // shouldn't be 0.0 + // + std::cout << "ref distance min = " << d_min << std::endl; + std::cout << "ref distance max = " << d_max << std::endl; + + std::vector condition_numbers; // store the condition numbers + std::vector test_d_zero; // store the test d_zero + + // prepare the test d_zero (d_min ~ d_max by n_try times) + CUSTOMREAL d_zero_step = (d_max - d_min) / (n_try - 1); + CUSTOMREAL d_zero_tmp = d_min; // void d_zero = 0.0 + for (int i = 0; i < n_try; i++) { + test_d_zero.push_back(d_zero_tmp); + d_zero_tmp += d_zero_step; + } + + // calculate the weights iteratively + int c = 0; + for (auto& d_zero_try : test_d_zero) { + // initialize all the source or receiver weights to be zero + init_weight(src_or_rec, id2name); + CUSTOMREAL ncond = _calc_weight(src_or_rec, id2name, d_zero_try); + + // store the condition number + condition_numbers.push_back(ncond); + + // output d_zero and condition number + std::cout << "i-iter/total: " << c << "/" << n_try << ", d_zero: " << d_zero_try << ", condition number: " << ncond << std::endl; + + c++; + } + + // find the one-third point between min and max condition number + d_zero_fin = test_d_zero[find_good_ncond(condition_numbers)]; + + } else { + // use largest distance as d_zero_fin + d_zero_fin = ref_value; + } + + // calculate the weights with the final d_zero + init_weight(src_or_rec, id2name); + _calc_weight(src_or_rec, id2name, d_zero_fin); + +} + +void calculate_src_rec_weight(std::map &src_map, \ + std::map &rec_map, \ + std::map>> &data_map, \ + std::vector &src_id2name, \ + std::vector &rec_id2name) { + + + // calculate source weights + std::cout << "calculating source weights..." << std::endl; + calc_weight(src_map, src_id2name); + // normalize the source weight + normalize_weight(src_map, src_id2name); + + // calculate receiver weights + std::cout << "calculating receiver weights..." << std::endl; + calc_weight(rec_map, rec_id2name); + + // normalize the receiver weight + // (the receiver weight is normalized for each source) + normalize_weight_data(data_map, src_map, rec_map, src_id2name, rec_id2name); + + // end +} + + +void write_src_rec_file_with_weight(std::string src_rec_file_out, \ + std::map &src_map, \ + std::map &rec_map, \ + std::map>> &data_map, \ + std::vector &src_id2name, \ + std::vector &rec_id2name){ + + std::ofstream ofs; + + // open file + ofs.open(src_rec_file_out); + + for (int i_src = 0; i_src < (int)src_id2name.size(); i_src++){ + + std::string name_src = src_id2name[i_src]; + SrcRecInfo src = src_map[name_src]; + + // format should be the same as input src_rec_file + // source line : id_src year month day hour min sec lat lon dep_km mag num_recs id_event + ofs << std::setw(7) << std::right << std::setfill(' ') << src.id << " " + << src.year << " " << src.month << " " << src.day << " " + << src.hour << " " << src.min << " " + << std::fixed << std::setprecision(2) << std::setw(5) << std::right << std::setfill(' ') << src.sec << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << src.lat << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << src.lon << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << src.dep << " " + << std::fixed << std::setprecision(2) << std::setw(5) << std::right << std::setfill(' ') << src.mag << " " + << std::setw(5) << std::right << std::setfill(' ') << src.n_data << " " + << src.name << " " + << std::fixed << std::setprecision(4) << std::setw(6) << std::right << std::setfill(' ') << 1.0 //src.sum_weight + << std::endl; + + // data line + int i_rec = 0; + for (auto iter = data_map[name_src].begin(); iter != data_map[name_src].end(); iter++){ + + const std::string name_rec = iter->first; + std::vector v_data = data_map[name_src][name_rec]; + + for (const auto& data : v_data){ + + // absolute traveltime data + if (data.is_src_rec){ + SrcRecInfo rec = rec_map[name_rec]; + + CUSTOMREAL travel_time = data.travel_time_obs; // write the observed travel time + + // receiver line : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arival_time + ofs << std::setw(7) << std::right << std::setfill(' ') << src.id << " " + << std::setw(5) << std::right << std::setfill(' ') << i_rec << " " + << rec.name << " " + << std::fixed << std::setprecision(4) << std::setw(9) << rec.lat << " " + << std::fixed << std::setprecision(4) << std::setw(9) << rec.lon << " " + << std::fixed << std::setprecision(4) << std::setw(9) << -1.0*rec.dep*1000.0 << " " + << data.phase << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << travel_time << " " + << std::fixed << std::setprecision(4) << std::setw(6) << std::right << std::setfill(' ') << data.data_weight + << std::endl; + + i_rec++; + }else { + std::cout << "Error: data type is not defined." << std::endl; + exit(1); + } // end of if (data.is_src_rec) + + } // end of for (const auto& data : v_data) + } // end of for (auto iter = data_map_back[name_src].begin(); iter != data_map_back[name_src].end(); iter++) + } // end of for (int i_src = 0; i_src < (int)src_name_list.size(); i_src++) + + // close file + ofs.close(); + + +} + +// +// function for calculating the source and receiver weight +// MNMN: receiver pair data is not supported yet. +int main(int argc, char *argv[]) +{ + // parse options + parse_options_srcrec_weight(argc, argv); + + // init mpi + initialize_mpi(); + + // exit if number of processes is not 1 + if (nprocs > 1) { + std::cout << "number of processes should be 1." << std::endl; + exit(1); + } + +#ifdef USE_OMP + // srcrec weight calculation uses opnemp parallelization + // set 12 threads for openmp + omp_set_num_threads(12); + + // n threads + int n_threads = omp_get_max_threads(); +#endif + + stdout_by_main("------------------------------------------------------"); + stdout_by_main("start Src Rec weight calculation."); + std::cout << "number of openmp threads: " << n_threads << std::endl; + stdout_by_main("------------------------------------------------------"); + + std::map src_map; + std::map rec_map; + std::map>> data_map; + std::vector src_id2name, rec_id2name; + std::vector>> rec_id2name_back_dummy; + + std::cout << "parsing src_rec file: " << input_file << std::endl; + + // read src_rec file + parse_src_rec_file(input_file, \ + src_map, \ + rec_map, \ + data_map, \ + src_id2name, \ + rec_id2name_back_dummy); + + // create rec_id2name + for (auto& rec: rec_map) { + rec_id2name.push_back(rec.first); + } + + std::cout << "calculating source and receiver weight..." << std::endl; + + // calculate source and receiver weight + calculate_src_rec_weight(src_map, rec_map, data_map, src_id2name, rec_id2name); + + std::cout << "writing src_rec file with weight: " << output_file_weight << std::endl; + + // write src_rec file with calculated weights + write_src_rec_file_with_weight(output_file_weight, \ + src_map, \ + rec_map, \ + data_map, \ + src_id2name, \ + rec_id2name); + + stdout_by_main("------------------------------------------------------"); + stdout_by_main("end Src Rec weight calculation."); + stdout_by_main(("output file: " + output_file_weight).c_str()); + stdout_by_main("------------------------------------------------------"); + return 0; + +} \ No newline at end of file diff --git a/src/TOMOATT.cxx b/src/TOMOATT.cxx new file mode 100644 index 0000000..100d2e7 --- /dev/null +++ b/src/TOMOATT.cxx @@ -0,0 +1,131 @@ +#include +#include +#include +#include +#include "mpi_funcs.h" +#include "config.h" +#include "utils.h" +#include "input_params.h" +#include "grid.h" +#include "io.h" +#include "source.h" +#include "receiver.h" +#include "kernel.h" +#include "model_update.h" +#include "main_routines_calling.h" +#include "eikonal_solver_2d.h" +#include "version.h" +#include "oneD_inversion.h" + +#ifdef USE_CUDA +#include "cuda_initialize.cuh" +#endif + +//#ifdef USE_BLAS +//#include "cblas.h" +//#endif + +// TOMOATT main function +int main(int argc, char *argv[]) +{ + // parse options + parse_options(argc, argv); + + // initialize mpi + initialize_mpi(); + + stdout_by_rank_zero("------------------------------------------------------"); + stdout_by_rank_zero(("TOMOATT version: " + std::string(TOMOATT_VERSION)).c_str()); + stdout_by_rank_zero(("git commit: " + std::string(GIT_COMMIT)).c_str()); + stdout_by_rank_zero("TOMOATT calculation starting..."); + stdout_by_rank_zero("------------------------------------------------------"); + + // read input file + InputParams IP(input_file); + + // create output directory + create_output_dir(output_dir); + +#ifdef USE_CUDA + // initialize cuda + if(use_gpu) initialize_cuda(); +#endif + +#ifdef USE_SIMD + // check SIMD type + if (myrank==0) + print_simd_type(); +#endif + + // check the number of mpi processes and ndiv setting is consistent + check_total_nprocs_and_ndiv(); + + // split mpi communicator for simultaneous run, subdomain division and sweep parallelization + split_mpi_comm(); + + // assign source for each simultaneous run group + IP.prepare_src_map(); + + // initialize file IO object + IO_utils io(IP); // create IO object for main and non-main process as well + + { + // initialize compute grids (use scope block to ensure destruction before MPI_Finalize) + Grid grid(IP, io); // member objects are created in only the main process of subdomain groups + + // output inversion grid file (by main process) + grid.inv_grid->write_inversion_grid_to_file(); + + if (subdom_main) { + // output grid data (grid data is only output in the main simulation) + io.write_grid(grid); + } + + // preapre teleseismic boundary conditions (do nothinng if no teleseismic source is defined) + prepare_teleseismic_boundary_conditions(IP, grid, io); // not ready for new version of src rec data + + synchronize_all_world(); + + // + // run main calculation routines depending on specified mode + // + if (IP.get_run_mode() == ONLY_FORWARD || IP.get_run_mode() == DO_INVERSION){ + run_forward_only_or_inversion(IP, grid, io); + } else if (IP.get_run_mode() == TELESEIS_PREPROCESS) { + // terminate the program here if the run mode is TELESEIS_PREPROCESS + // because prepare_teleseismic_boundary_conditions is already called. + } else if (IP.get_run_mode() == SRC_RELOCATION) { + run_earthquake_relocation(IP, grid, io); + } else if (IP.get_run_mode() == INV_RELOC) { + run_inversion_and_relocation(IP,grid,io); + } else if (IP.get_run_mode() == ONED_INVERSION) { + run_1d_inversion(IP,grid,io); + } else { + std::cerr << "Error: invalid run mode is specified." << std::endl; + exit(1); + } + + // output final state of the model + if (IP.get_if_output_final_model()) { + io.write_merged_model(grid, IP, "final_model.h5"); + } + + synchronize_all_world(); + + } // Grid destructor called here - before finalize_mpi()! + + + // finalize cuda +#ifdef USE_CUDA + if (use_gpu) finalize_cuda(); +#endif + + // finalize mpi + finalize_mpi(); + + stdout_by_rank_zero("------------------------------------------------------"); + stdout_by_rank_zero("TOMOATT calculation end."); + stdout_by_rank_zero("------------------------------------------------------"); + + return 0; +} \ No newline at end of file diff --git a/src/TOMOATT_2d_precalc.cxx b/src/TOMOATT_2d_precalc.cxx new file mode 100644 index 0000000..a5f775c --- /dev/null +++ b/src/TOMOATT_2d_precalc.cxx @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include "mpi_funcs.h" +#include "config.h" +#include "utils.h" +#include "input_params.h" +#include "grid.h" +#include "io.h" +#include "source.h" +#include "iterator.h" +#include "iterator_selector.h" + +#include "eikonal_solver_2d.h" + +#ifdef USE_CUDA +#include "cuda_initialize.cuh" +#endif + +// TOMOATT main function +int main(int argc, char *argv[]) +{ + // parse options + parse_options(argc, argv); + + // initialize mpi + initialize_mpi(); + + stdout_by_rank_zero("------------------------------------------------------"); + stdout_by_rank_zero("start TOMOATT 2d pre calculation mode."); + stdout_by_rank_zero("------------------------------------------------------"); + + // read input file + InputParams IP(input_file); + + // create output directory + create_output_dir(output_dir); + + // check the number of mpi processes and ndiv setting is consistent + check_total_nprocs_and_ndiv(); + + // split mpi communicator for simultaneous run, subdomain division and sweep parallelization + split_mpi_comm(); + + // assign source for each simultaneous run group + IP.prepare_src_map(); + + // initialize file IO object + IO_utils io(IP); // create IO object for main and non-main process as well + + // initialize compute grids + Grid grid(IP, io); // member objects are created in only the main process of subdomain groups + + if (subdom_main) { + // output grid data (grid data is only output in the main simulation) + io.write_grid(grid); + } + + // preapre teleseismic boundary conditions (do nothinng if no teleseismic source is defined) + prepare_teleseismic_boundary_conditions(IP, grid, io); + + synchronize_all_world(); + + // finalize mpi + finalize_mpi(); + + stdout_by_rank_zero("------------------------------------------------------"); + stdout_by_rank_zero("end TOMOATT 2d pre calculation mode."); + stdout_by_rank_zero("------------------------------------------------------"); + + return 0; +} \ No newline at end of file diff --git a/src/TOMOATT_solver_only.cxx b/src/TOMOATT_solver_only.cxx new file mode 100644 index 0000000..b8e24e4 --- /dev/null +++ b/src/TOMOATT_solver_only.cxx @@ -0,0 +1,165 @@ +//# TODO: this file need to modify for new srcrec handling routines + + +#include +#include +#include +#include +#include "mpi_funcs.h" +#include "config.h" +#include "utils.h" +#include "input_params.h" +#include "grid.h" +#include "io.h" +#include "source.h" +#include "iterator.h" +#include "iterator_selector.h" +#include "eikonal_solver_2d.h" +#include "main_routines_inversion_mode.h" + +#ifdef USE_CUDA +#include "cuda_initialize.cuh" +#endif + +// TOMOATT main function +int main(int argc, char *argv[]) +{ + // parse options + parse_options(argc, argv); + + // here we set i_inv = 0; but later we can modify the code to set from command line + int i_inv = 0; + + // initialize mpi + initialize_mpi(); + + stdout_by_rank_zero("------------------------------------------------------"); + stdout_by_rank_zero("start TOMOATT only traveltime field calculation mode."); + stdout_by_rank_zero("------------------------------------------------------"); + + // read input file + InputParams IP(input_file); + + // create output directory + create_output_dir(output_dir); + +#ifdef USE_CUDA + // initialize cuda + if(use_gpu) initialize_cuda(); +#endif + +#ifdef USE_SIMD + // check SIMD type + if (myrank==0) + print_simd_type(); +#endif + + // check the number of mpi processes and ndiv setting is consistent + check_total_nprocs_and_ndiv(); + + // split mpi communicator for simultaneous run, subdomain division and sweep parallelization + split_mpi_comm(); + + // assign source for each simultaneous run group + IP.prepare_src_map(); + + // initialize file IO object + IO_utils io(IP); // create IO object for main and non-main process as well + + // initialize compute grids + Grid grid(IP, io); // member objects are created in only the main process of subdomain groups + + if (subdom_main) { + // output grid data (grid data is only output in the main simulation) + io.write_grid(grid); + } + + // preapre teleseismic boundary conditions (do nothinng if no teleseismic source is defined) + prepare_teleseismic_boundary_conditions(IP, grid, io); + + synchronize_all_world(); + + // initialize factors + grid.reinitialize_abcf(); + + // prepare iteration group in xdmf file + io.prepare_grid_inv_xdmf(i_inv); + + /////////////////////// + // loop for each source + /////////////////////// + Source src; + + for (long unsigned int i_src = 0; i_src < IP.n_src_comm_rec_this_sim_group; i_src++) { + + // check if this is the first source + bool first_init = (i_src==0); + + // check source info + std::string name_sim_src = IP.get_src_name_comm(i_src); // source name + int id_sim_src = IP.get_src_id(name_sim_src); // global source id + bool is_teleseismic = IP.get_if_src_teleseismic(name_sim_src); // get is_teleseismic flag + + // set simu group id and source name for output files/dataset names + io.reset_source_info(id_sim_src, name_sim_src); + + if (myrank == 0) + std::cout << "source id: " << id_sim_src << ", forward modeling starting..." << std::endl; + + // (re) initialize source object and set to grid + src.set_source_position(IP, grid, is_teleseismic, name_sim_src); + + ///////////////////////// + // run forward simulation + ///////////////////////// + + // initialize iterator object + std::unique_ptr It; + + if (!hybrid_stencil_order){ + select_iterator(IP, grid, src, io, name_sim_src, first_init, is_teleseismic, It, false); + It->run_iteration_forward(IP, grid, io, first_init); + } else { + // hybrid stencil mode + std::cout << "\nrunnning in hybrid stencil mode\n" << std::endl; + + // run 1st order forward simulation + std::unique_ptr It_pre; + IP.set_stencil_order(1); + IP.set_conv_tol(IP.get_conv_tol()*100.0); + select_iterator(IP, grid, src, io, name_sim_src, first_init, is_teleseismic, It_pre, false); + It_pre->run_iteration_forward(IP, grid, io, first_init); + + // run 3rd order forward simulation + IP.set_stencil_order(3); + IP.set_conv_tol(IP.get_conv_tol()/100.0); + select_iterator(IP, grid, src, io, name_sim_src, first_init, is_teleseismic, It, true); + It->run_iteration_forward(IP, grid, io, first_init); + } + + // output the result of forward simulation + // ignored for inversion mode. + io.write_T_merged(grid, IP, i_inv); + + } // end loop sources + + // wait for all processes to finish + synchronize_all_world(); + + // close xdmf file + io.finalize_data_output_file(); + + // finalize cuda +#ifdef USE_CUDA + if (use_gpu) finalize_cuda(); +#endif + + // finalize mpi + finalize_mpi(); + + stdout_by_rank_zero("------------------------------------------------------"); + stdout_by_rank_zero("end TOMOATT only traveltime calculation mode."); + stdout_by_rank_zero("------------------------------------------------------"); + + return 0; +} \ No newline at end of file diff --git a/src/eikonal_solver_2d.cpp b/src/eikonal_solver_2d.cpp new file mode 100644 index 0000000..9c7d0f9 --- /dev/null +++ b/src/eikonal_solver_2d.cpp @@ -0,0 +1,1075 @@ +#include "eikonal_solver_2d.h" + +void prepare_teleseismic_boundary_conditions(InputParams& IP, Grid& grid, IO_utils& io) { + bool if_teleseismic_event_exists=false; + + // 2D travel time fields vary only by the depth of the source. + // So here we make another src_id2name list for dropping the sources + // that have the same depth, in onder to reduce the number of 2D eikonal solver runs. + + // so we use + // - src_id2name_2d + // - src_map_2d + // for 2D eikonal solver runs + + // in the current implentation, we only run the 2d solver with the proc_store_srcrec process + // thus all the processes assigned to subdomain and sweep parallelization will not used. + // For efficiency, it is strongly recommended to use pre-run mode of teleseismic source calculation, + // with no domain decomposition and sweep parallelization. + + // + // pre calculation of 2d travel time fields + // + + for (int i_src = 0; i_src < IP.n_src_2d_this_sim_group; i_src++){ + + std::string name_sim_src; + + if (proc_store_srcrec) + name_sim_src = IP.src_id2name_2d[i_src]; + broadcast_str(name_sim_src, 0); + + // get source info + bool is_teleseismic = true; // the object in src_id2name_2d is always teleseismic + // #BUG: src in src_id2name_2d includes the srcs in other sim groups. + bool for_2d_solver = true; + + Source src; + src.set_source_position(IP, grid, is_teleseismic, name_sim_src, for_2d_solver); + + // run 2d eikonal solver for teleseismic boundary conditions if teleseismic event + if (proc_store_srcrec){ + if (myrank==0) + std::cout << "solve 2d eikonal equation for src: " << name_sim_src << std::endl; + run_2d_solver(IP, src, io); + } + } + + synchronize_all_world(); + + // boundary travel time data should not be loaded here because the memory requirement will be + // too large for large scale simulations. + // instead, we load the boundary travel time data at the initialization of the iterator class. + + if (IP.n_src_2d_this_sim_group > 0) + if_teleseismic_event_exists = true; + + if (myrank==0 && if_teleseismic_event_exists) + std::cout << "done preparing teleseismic boundary conditions" << std::endl; +} + + + +PlainGrid::PlainGrid(Source& src, InputParams& IP) { + + //stdout_by_main("PlainGrid initialization start."); + + // get source info + src_r = src.get_src_r(); + src_t = src.get_src_t(); + src_p = src.get_src_p(); + src_t_dummy = _0_CR; // dummy src_t + rmin_3d = radius2depth(IP.get_max_dep()); + rmax_3d = radius2depth(IP.get_min_dep()); + tmin_3d = IP.get_min_lat(); + tmax_3d = IP.get_max_lat(); + pmin_3d = IP.get_min_lon(); + pmax_3d = IP.get_max_lon(); + + // allocate arrays + allocate_arrays(); + + // calculate epicentral distance and azimuth between source and simulation domain + // S-W + Epicentral_distance_sphere(tmin_3d, pmin_3d, src_t, src_p, epicentral_distance_2d[0]); + Azimuth_sphere(tmin_3d, pmin_3d, src_t, src_p, azimuth_2d[0]); + // S-E + Epicentral_distance_sphere(tmin_3d, pmax_3d, src_t, src_p, epicentral_distance_2d[1]); + Azimuth_sphere(tmin_3d, pmax_3d, src_t, src_p, azimuth_2d[1]); + // N-W + Epicentral_distance_sphere(tmax_3d, pmin_3d, src_t, src_p, epicentral_distance_2d[2]); + Azimuth_sphere(tmax_3d, pmin_3d, src_t, src_p, azimuth_2d[2]); + // N-E + Epicentral_distance_sphere(tmax_3d, pmax_3d, src_t, src_p, epicentral_distance_2d[3]); + Azimuth_sphere(tmax_3d, pmax_3d, src_t, src_p, azimuth_2d[3]); + + // determine which boundaries are activated + max_degree = std::max({ + std::abs(epicentral_distance_2d[0]), + std::abs(epicentral_distance_2d[1]), + std::abs(epicentral_distance_2d[2]), + std::abs(epicentral_distance_2d[3]), + }); + + //activated_boundaries[0] = true; // N + //activated_boundaries[1] = true; // E + //activated_boundaries[2] = true; // W + //activated_boundaries[3] = true; // S + //activated_boundaries[4] = true; // Bot + + // grid setup + nr_2d = std::floor((rmax_2d-rmin_2d)/dr_2d)+1; + nt_2d = std::floor((tmax_2d-tmin_2d)/dt_2d)+1; + + // initialize arrays + r_2d = allocateMemory(nr_2d, 4000); + t_2d = allocateMemory(nt_2d, 4001); + + // fill arrays + for (int i = 0; i < nr_2d; i++) { + r_2d[i] = rmin_2d + i*dr_2d; + } + for (int i = 0; i < nt_2d; i++) { + t_2d[i] = tmin_2d + i*dt_2d; + } + + // output summary of 2d grid + if (myrank==0 && if_verbose) { + std::cout << "\n\n2d grid info :" << std::endl; + std::cout << "nr_2d: " << nr_2d << std::endl; + std::cout << "nt_2d: " << nt_2d << std::endl; + std::cout << "rmin_2d: " << rmin_2d << std::endl; + std::cout << "rmax_2d: " << rmax_2d << std::endl; + std::cout << "tmin_2d: " << tmin_2d << std::endl; + std::cout << "tmax_2d: " << tmax_2d << std::endl; + std::cout << "dr_2d: " << dr_2d << std::endl; + std::cout << "dt_2d: " << dt_2d << std::endl; + std::cout << "r_2d: " << r_2d[0] << " " << r_2d[nr_2d-1] << std::endl; + std::cout << "t_2d: " << t_2d[0] << " " << t_2d[nt_2d-1] << std::endl; + std::cout << "\n\n" << std::endl; + } + + // field setup + fun_2d = allocateMemory(nr_2d*nt_2d, 4002); + fac_a_2d = allocateMemory(nr_2d*nt_2d, 4003); + fac_b_2d = allocateMemory(nr_2d*nt_2d, 4004); + u_2d = allocateMemory(nr_2d*nt_2d, 4005); + T_2d = allocateMemory(nr_2d*nt_2d, 4006); + T0v_2d = allocateMemory(nr_2d*nt_2d, 4007); + T0r_2d = allocateMemory(nr_2d*nt_2d, 4008); + T0t_2d = allocateMemory(nr_2d*nt_2d, 4009); + tau_2d = allocateMemory(nr_2d*nt_2d, 4010); + tau_old_2d = allocateMemory(nr_2d*nt_2d, 4011); + is_changed_2d = allocateMemory(nr_2d*nt_2d, 4012); + + // load 1d model to 2d field + load_1d_model(IP.get_model_1d_name()); + + // initialize other field + for (int ir = 0; ir < nr_2d; ir++){ + for (int it = 0; it < nt_2d; it++){ + fac_a_2d[ir*nt_2d+it] = _1_CR; + fac_b_2d[ir*nt_2d+it] = _1_CR/my_square(r_2d[ir]); + u_2d[ir*nt_2d+it] = _0_CR; + T_2d[ir*nt_2d+it] = _0_CR; + } + } + + // discretize the src position + int src_r_i = std::floor((src_r -rmin_2d)/dr_2d); + int src_t_i = std::floor((src_t_dummy-tmin_2d)/dt_2d); + + // error of discretized source position + CUSTOMREAL src_r_err = std::min(_1_CR, (src_r - r_2d[src_r_i])/dr_2d); + CUSTOMREAL src_t_err = std::min(_1_CR, (src_t_dummy - t_2d[src_t_i])/dt_2d); + + // check precision error for floor + if (src_r_err == _1_CR) { + src_r_err = _0_CR; + src_r_i++; + } + if (src_t_err == _1_CR) { + src_t_err = _0_CR; + src_t_i++; + } + + // initialize the initial fields + CUSTOMREAL a0 = (_1_CR - src_r_err)*(_1_CR - src_t_err)*fac_a_2d[src_r_i*nt_2d+src_t_i] \ + + (_1_CR - src_r_err)* src_t_err *fac_a_2d[src_r_i*nt_2d+src_t_i+1] \ + + src_r_err*(_1_CR - src_t_err)*fac_a_2d[(src_r_i+1)*nt_2d+src_t_i] \ + + src_r_err* src_t_err *fac_a_2d[(src_r_i+1)*nt_2d+src_t_i+1]; + + CUSTOMREAL b0 = (_1_CR - src_r_err)*(_1_CR - src_t_err)*fac_b_2d[src_r_i*nt_2d+src_t_i] \ + + (_1_CR - src_r_err)* src_t_err *fac_b_2d[src_r_i*nt_2d+src_t_i+1] \ + + src_r_err *(_1_CR - src_t_err)*fac_b_2d[(src_r_i+1)*nt_2d+src_t_i] \ + + src_r_err * src_t_err *fac_b_2d[(src_r_i+1)*nt_2d+src_t_i+1]; + + CUSTOMREAL fun0 = (_1_CR - src_r_err)*(_1_CR - src_t_err)*fun_2d[src_r_i*nt_2d+src_t_i] \ + + (_1_CR - src_r_err)* src_t_err *fun_2d[src_r_i*nt_2d+src_t_i+1] \ + + src_r_err *(_1_CR - src_t_err)*fun_2d[(src_r_i+1)*nt_2d+src_t_i] \ + + src_r_err * src_t_err *fun_2d[(src_r_i+1)*nt_2d+src_t_i+1]; + + + for (int ir = 0; ir < nr_2d; ir++){ + for (int it = 0; it < nt_2d; it++){ + + int irt = ir*nt_2d+it; + T0v_2d[irt] = fun0 * std::sqrt((_1_CR/a0) * my_square((r_2d[ir]-src_r)) + + _1_CR/b0 * my_square((t_2d[it]-src_t_dummy))); + + if (isZero(T0v_2d[irt])) { + T0r_2d[irt] = _0_CR; + T0t_2d[irt] = _0_CR; + } else { + T0r_2d[irt] = my_square(fun0) * (_1_CR/a0 * (r_2d[ir]-src_r)) / T0v_2d[irt]; + T0t_2d[irt] = my_square(fun0) * (_1_CR/b0 * (t_2d[it]-src_t_dummy)) / T0v_2d[irt]; + } + + if (std::abs((r_2d[ir]-src_r)/dr_2d) <= _2_CR \ + && std::abs((t_2d[it]-src_t_dummy)/dt_2d) <= _2_CR) { + tau_2d[irt] = TAU_INITIAL_VAL; + is_changed_2d[irt] = false; + } else { + tau_2d[irt] = TAU_INF_VAL; // upwind scheme, initial tau should be large enough + is_changed_2d[irt] = true; + } + + tau_old_2d[irt] = _0_CR; + } + } +} + + +void PlainGrid::allocate_arrays(){ + azimuth_2d = allocateMemory(4, 4013); + epicentral_distance_2d = allocateMemory(4, 4014); +} + + +void PlainGrid::deallocate_arrays(){ + delete[] azimuth_2d; + delete[] epicentral_distance_2d; + delete[] r_2d; + delete[] t_2d; + delete[] fun_2d; + delete[] fac_a_2d; + delete[] fac_b_2d; + delete[] u_2d; + delete[] T_2d; + delete[] T0v_2d; + delete[] T0r_2d; + delete[] T0t_2d; + delete[] tau_2d; + delete[] tau_old_2d; + delete[] is_changed_2d; +} + + +PlainGrid::~PlainGrid() { + deallocate_arrays(); +} + + +void PlainGrid::select_1d_model(std::string model_1d_name){ + if(model_1d_name.compare("iasp91")==0) { + model_1d_ref = model_1d_iasp91; + } else if (model_1d_name.compare("ak135")==0) { + model_1d_ref = model_1d_ak135; + } else if (model_1d_name.compare("user_defined")==0) { + model_1d_ref = model_1d_prem; + } else { + model_1d_ref = model_1d_prem; + } +} + + +void PlainGrid::load_1d_model(std::string model_1d_name){ + + // debug output 1d model to a file + std::ofstream file_1d_model; + file_1d_model.open(output_dir + "/model_1d.txt"); + + // load 1d model to 2d field + for (int i = 0; i < nr_2d; i++) { + + // interpolate from model_1d_ref by linear interpolation + CUSTOMREAL r = r_2d[i]; + + // select 1d model + select_1d_model(model_1d_name); + + // find 2 closest r in model_1d_ref + int ir = 0; + for (auto& dep_vel : model_1d_ref) { + CUSTOMREAL r_model = depth2radius(dep_vel[0]); + if (r > r_model) + break; + ir++; + } + + // linear interpolation + CUSTOMREAL v_interp; + + if(ir != 0){ + CUSTOMREAL r_model_1 = depth2radius(model_1d_ref[ir-1][0]); + CUSTOMREAL r_model_2 = depth2radius(model_1d_ref[ir][0]); + CUSTOMREAL v_model_1 = model_1d_ref[ir-1][1]; + CUSTOMREAL v_model_2 = model_1d_ref[ir][1]; + + v_interp = v_model_1 + (v_model_2 - v_model_1) * (r - r_model_1) / (r_model_2 - r_model_1); + + if (isZero((r_model_2 - r_model_1))) + v_interp = model_1d_ref[ir][1]; + } else { + v_interp = model_1d_ref[ir][1]; + } + + // debug output 1d model to a file + file_1d_model << r << ", " << v_interp << std::endl; + + for (int j = 0; j < nt_2d; j++) + fun_2d[i*nt_2d+j] = _1_CR / v_interp; + + } + + // close file + file_1d_model.close(); +} + + +void PlainGrid::run_iteration(InputParams& IP){ + // solve Tau, H(tau) = a tau_x^2+ b tau_y^2 + (2aTx-2cTy) tau_x + (2bTy-2cTx) tau_y + // -2c tau_x tau_y + (aTx^2+bTy^2-2cTxTy) = f^2 + + if (myrank==0) + std::cout << "Running 2d eikonal solver..." << std::endl; + + CUSTOMREAL L1_dif =1000000000; + CUSTOMREAL Linf_dif=1000000000; + CUSTOMREAL L1_err =_0_CR; + CUSTOMREAL Linf_err=_0_CR; + + int iter = 0; + + while (true) { + + // update tau_old + std::memcpy(tau_old_2d, tau_2d, sizeof(CUSTOMREAL)*nr_2d*nt_2d); + + int r_start, r_end; + int t_start, t_end; + int r_dirc, t_dirc; + + // sweep direction + for (int iswp = 0; iswp < 4; iswp++){ + if (iswp == 0){ + r_start = nr_2d-2; + r_end = 0; + t_start = nt_2d-2; + t_end = 0; + r_dirc = -1; + t_dirc = -1; + } else if (iswp==1){ + r_start = nr_2d-2; + r_end = 0; + t_start = 1; + t_end = nt_2d-1; + r_dirc = -1; + t_dirc = 1; + } else if (iswp==2){ + r_start = 1; + r_end = nr_2d-1; + t_start = nt_2d-2; + t_end = 0; + r_dirc = 1; + t_dirc = -1; + } else { + r_start = 1; + r_end = nr_2d-1; + t_start = 1; + t_end = nt_2d-1; + r_dirc = 1; + t_dirc = 1; + } + + for (int ir = r_start; ir != r_end; ir += r_dirc) { + for (int it = t_start; it != t_end; it += t_dirc) { + + // if the point is not in the boundary, skip it + if (is_changed_2d[ir*nt_2d+it]) + calculate_stencil_2d(ir, it); + + } + } + + // boundary + for (int ir = 0; ir < nr_2d; ir++) { + tau_2d[ir*nt_2d] = std::max(_2_CR*tau_2d[ir*nt_2d+1] -tau_2d[ir*nt_2d+2], tau_2d[ir*nt_2d+2]); + tau_2d[ir*nt_2d+nt_2d-1] = std::max(_2_CR*tau_2d[ir*nt_2d+nt_2d-2]-tau_2d[ir*nt_2d+nt_2d-3], tau_2d[ir*nt_2d+nt_2d-3]); + } + for (int it = 0; it < nt_2d; it++) { + tau_2d[it] = std::max(_2_CR*tau_2d[1*nt_2d+it] -tau_2d[2*nt_2d+it], tau_2d[2*nt_2d+it]); + tau_2d[(nr_2d-1)*nt_2d+it] = std::max(_2_CR*tau_2d[(nr_2d-2)*nt_2d+it]-tau_2d[(nr_2d-3)*nt_2d+it], tau_2d[(nr_2d-3)*nt_2d+it]); + } + + } // end of iswp + + // calculate L1 and Linf error + L1_dif = _0_CR; + Linf_dif= _0_CR; + + for (int ii = 0; ii < nr_2d*nt_2d; ii++){ + L1_dif += std::abs(tau_2d[ii]-tau_old_2d[ii]); + Linf_dif = std::max(Linf_dif, std::abs(tau_2d[ii]-tau_old_2d[ii])); + } + L1_dif /= nr_2d*nt_2d; + + // calculate L1 and Linf error + L1_err = _0_CR; + Linf_err= _0_CR; + + for (int ii = 0; ii < nr_2d*nt_2d; ii++){ + L1_err += std::abs(tau_2d[ii]*T0v_2d[ii] - u_2d[ii]); + Linf_err = std::max(Linf_err, std::abs(tau_2d[ii]*T0v_2d[ii] - u_2d[ii])); + } + L1_err /= nr_2d*nt_2d; + + // check convergence + if (std::abs(L1_dif) < TOL_2D_SOLVER && std::abs(Linf_dif) < TOL_2D_SOLVER){ + if (myrank==0) + std::cout << "Converged at iteration " << iter << std::endl; + goto iter_end; + } else if (iter > MAX_ITER_2D_SOLVER){ + if (myrank==0) + std::cout << "Maximum iteration reached at iteration " << iter << std::endl; + goto iter_end; + } else { + if (myrank==0 && if_verbose) + std::cout << "Iteration " << iter << "L_1(Tnew-Told)= " << L1_dif << " , L_inf(Tnew-Told) = " << Linf_dif << std::endl; + iter++; + } + // if (myrank==0){ + // std::cout << "Iteration " << iter << "L_1(Tnew-Told)= " << L1_dif << " , L_inf(Tnew-Told) = " << Linf_dif << std::endl; + // std::cout << "Iteration " << iter << ": L1 error = " << L1_err << ", Linf error = " << Linf_err << std::endl; + // } + } // end of wile + +iter_end: + if (myrank==0) + std::cout << "Iteration " << iter << " finished." << std::endl; + + for (int ii = 0; ii < nr_2d*nt_2d; ii++){ + T_2d[ii] = tau_2d[ii]*T0v_2d[ii]; + } + +} + + +void PlainGrid::calculate_stencil_2d(int& ir, int& it){ + ii = ir*nt_2d+it; + ii_nr = (ir-1)*nt_2d+it; + ii_n2r = (ir-2)*nt_2d+it; + ii_nt = ir*nt_2d+(it-1); + ii_n2t = ir*nt_2d+(it-2); + ii_pr = (ir+1)*nt_2d+it; + ii_p2r = (ir+2)*nt_2d+it; + ii_pt = ir*nt_2d+(it+1); + ii_p2t = ir*nt_2d+(it+2); + + CUSTOMREAL sigr = std::sqrt(fac_a_2d[ii])*T0v_2d[ii]; + CUSTOMREAL sigt = std::sqrt(fac_b_2d[ii])*T0v_2d[ii]; + CUSTOMREAL coe = _1_CR/(sigr/dr_2d + sigt/dt_2d); + + CUSTOMREAL px1, px2, wx1=0, wx2=0; + CUSTOMREAL py1, py2, wy1=0, wy2=0; + + if(ir==1){ + px1=(tau_2d[ii]-tau_2d[ii_nr])/dr_2d; + wx2=_1_CR/(_1_CR+_2_CR*my_square( (eps_2d+my_square(tau_2d[ii] - _2_CR*tau_2d[ii_pr]+ tau_2d[ii_p2r])) \ + / (eps_2d +my_square(tau_2d[ii_nr] - _2_CR*tau_2d[ii] + tau_2d[ii_pr] )))); + px2=(_1_CR-wx2)*( tau_2d[ii_pr] -tau_2d[ii_nr]) /_2_CR/dr_2d \ + + wx2 *(-_3_CR*tau_2d[ii]+_4_CR*tau_2d[ii_pr]-tau_2d[ii_p2r])/_2_CR/dr_2d; + + } + else if (ir == nr_2d-2){ + wx1=_1_CR/(_1_CR+_2_CR*my_square( (eps_2d+my_square(tau_2d[ii] - _2_CR*tau_2d[ii_nr]+ tau_2d[ii_n2r])) \ + / (eps_2d+my_square(tau_2d[ii_pr] - _2_CR*tau_2d[ii] + tau_2d[ii_nr] )))); + px1=(_1_CR-wx1)*( tau_2d[ii_pr] -tau_2d[ii_nr]) /_2_CR/dr_2d \ + + wx1 *( _3_CR*tau_2d[ii]-_4_CR*tau_2d[ii_nr]+tau_2d[ii_n2r])/_2_CR/dr_2d; + px2=(tau_2d[ii_pr]-tau_2d[ii_nr])/dr_2d; + } + else { + wx1=_1_CR/(_1_CR+_2_CR*my_square( (eps_2d+my_square(tau_2d[ii] - _2_CR*tau_2d[ii_nr]+ tau_2d[ii_n2r])) \ + / (eps_2d+my_square(tau_2d[ii_pr] - _2_CR*tau_2d[ii] + tau_2d[ii_nr] )))); + px1=(_1_CR-wx1)*( tau_2d[ii_pr] -tau_2d[ii_nr]) /_2_CR/dr_2d \ + + wx1 *( _3_CR*tau_2d[ii]-_4_CR*tau_2d[ii_nr]+tau_2d[ii_n2r])/_2_CR/dr_2d; + wx2=_1_CR/(_1_CR+_2_CR*my_square( (eps_2d+my_square(tau_2d[ii] - _2_CR*tau_2d[ii_pr]+ tau_2d[ii_p2r])) \ + / (eps_2d+my_square(tau_2d[ii_nr] - _2_CR*tau_2d[ii] + tau_2d[ii_pr] )))); + px2=(_1_CR-wx2)*( tau_2d[ii_pr] -tau_2d[ii_nr]) /_2_CR/dr_2d \ + + wx2 *(-_3_CR*tau_2d[ii]+_4_CR*tau_2d[ii_pr]-tau_2d[ii_p2r])/_2_CR/dr_2d; + } + + if(it==1){ + py1=(tau_2d[ii]-tau_2d[ii_nt])/dt_2d; + wy2=_1_CR/(_1_CR+_2_CR*my_square( (eps_2d+my_square(tau_2d[ii] - _2_CR*tau_2d[ii_pt]+ tau_2d[ii_p2t])) \ + / (eps_2d+my_square(tau_2d[ii_nt] - _2_CR*tau_2d[ii] + tau_2d[ii_pt] )))); + py2=(_1_CR-wy2)*( tau_2d[ii_pt] -tau_2d[ii_nt]) /_2_CR/dt_2d \ + + wy2 *(-_3_CR*tau_2d[ii]+_4_CR*tau_2d[ii_pt]-tau_2d[ii_p2t])/_2_CR/dt_2d; + } + else if (it == nt_2d-2){ + wy1=_1_CR/(_1_CR+_2_CR*my_square( (eps_2d+my_square(tau_2d[ii] - _2_CR*tau_2d[ii_nt]+ tau_2d[ii_n2t])) \ + / (eps_2d+my_square(tau_2d[ii_pt] - _2_CR*tau_2d[ii] + tau_2d[ii_nt] )))); + py1=(_1_CR-wy1)*( tau_2d[ii_pt] -tau_2d[ii_nt]) /_2_CR/dt_2d \ + + wy1 *( _3_CR*tau_2d[ii]-_4_CR*tau_2d[ii_nt]+tau_2d[ii_n2t])/_2_CR/dt_2d; + py2=(tau_2d[ii_pt]-tau_2d[ii])/dt_2d; + } + else { + wy1=_1_CR/(_1_CR+_2_CR*my_square( (eps_2d+my_square(tau_2d[ii] - _2_CR*tau_2d[ii_nt]+ tau_2d[ii_n2t])) \ + / (eps_2d+my_square(tau_2d[ii_pt] - _2_CR*tau_2d[ii] + tau_2d[ii_nt] )))); + py1=(_1_CR-wy1)*( tau_2d[ii_pt] -tau_2d[ii_nt]) /_2_CR/dt_2d \ + + wy1 *( _3_CR*tau_2d[ii]-_4_CR*tau_2d[ii_nt]+tau_2d[ii_n2t])/_2_CR/dt_2d; + wy2=_1_CR/(_1_CR+_2_CR*my_square( (eps_2d+my_square(tau_2d[ii] - _2_CR*tau_2d[ii_pt]+ tau_2d[ii_p2t])) \ + / (eps_2d+my_square(tau_2d[ii_nt] - _2_CR*tau_2d[ii] + tau_2d[ii_pt] )))); + py2=(_1_CR-wy2)*( tau_2d[ii_pt] -tau_2d[ii_nt]) /_2_CR/dt_2d \ + + wy2 *(-_3_CR*tau_2d[ii]+_4_CR*tau_2d[ii_pt]-tau_2d[ii_p2t])/_2_CR/dt_2d; + } + + CUSTOMREAL Htau = std::sqrt(fac_a_2d[ii]*my_square(T0r_2d[ii]*tau_2d[ii]+T0v_2d[ii]*(px1+px2)/_2_CR) \ + +fac_b_2d[ii]*my_square(T0t_2d[ii]*tau_2d[ii]+T0v_2d[ii]*(py1+py2)/_2_CR)); + + tau_2d[ii] = coe * ( (fun_2d[ii] - Htau) + (sigr*(px2-px1)/_2_CR + sigt*(py2-py1)/_2_CR) ) + tau_2d[ii]; + +} + + +void PlainGrid::run_iteration_upwind(InputParams& IP){ + // solve Tau, H(tau) = a tau_x^2+ b tau_y^2 + (2aTx-2cTy) tau_x + (2bTy-2cTx) tau_y + // -2c tau_x tau_y + (aTx^2+bTy^2-2cTxTy) = f^2 + + if (myrank==0) + std::cout << "Running 2d eikonal solver..." << std::endl; + + CUSTOMREAL L1_dif =1000000000; + CUSTOMREAL Linf_dif=1000000000; + CUSTOMREAL L1_err =_0_CR; + CUSTOMREAL Linf_err=_0_CR; + + int iter = 0; + + while (true) { + + // update tau_old + std::memcpy(tau_old_2d, tau_2d, sizeof(CUSTOMREAL)*nr_2d*nt_2d); + + int r_start, r_end; + int t_start, t_end; + int r_dirc, t_dirc; + + // sweep direction + for (int iswp = 0; iswp < 4; iswp++){ + if (iswp == 0){ + r_start = nr_2d-1; + r_end = -1; + t_start = nt_2d-1; + t_end = -1; + r_dirc = -1; + t_dirc = -1; + } else if (iswp==1){ + r_start = nr_2d-1; + r_end = -1; + t_start = 0; + t_end = nt_2d; + r_dirc = -1; + t_dirc = 1; + } else if (iswp==2){ + r_start = 0; + r_end = nr_2d; + t_start = nt_2d-1; + t_end = -1; + r_dirc = 1; + t_dirc = -1; + } else { + r_start = 0; + r_end = nr_2d; + t_start = 0; + t_end = nt_2d; + r_dirc = 1; + t_dirc = 1; + } + + for (int ir = r_start; ir != r_end; ir += r_dirc) { + for (int it = t_start; it != t_end; it += t_dirc) { + + // if the point is not in the boundary, skip it + if (is_changed_2d[ir*nt_2d+it]) + calculate_stencil_upwind_2d(ir, it); + + } + } + } // end of iswp + + // calculate L1 and Linf error + L1_dif = _0_CR; + Linf_dif= _0_CR; + + for (int ii = 0; ii < nr_2d*nt_2d; ii++){ + L1_dif += std::abs(tau_2d[ii]-tau_old_2d[ii]); + Linf_dif = std::max(Linf_dif, std::abs(tau_2d[ii]-tau_old_2d[ii])); + } + L1_dif /= nr_2d*nt_2d; + + // calculate L1 and Linf error + L1_err = _0_CR; + Linf_err= _0_CR; + + for (int ii = 0; ii < nr_2d*nt_2d; ii++){ + L1_err += std::abs(tau_2d[ii]*T0v_2d[ii] - u_2d[ii]); + Linf_err = std::max(Linf_err, std::abs(tau_2d[ii]*T0v_2d[ii] - u_2d[ii])); + } + L1_err /= nr_2d*nt_2d; + + // check convergence + if (std::abs(L1_dif) < TOL_2D_SOLVER && std::abs(Linf_dif) < TOL_2D_SOLVER){ + if (myrank==0) + std::cout << "Converged at iteration " << iter << std::endl; + goto iter_end; + } else if (iter > MAX_ITER_2D_SOLVER){ + if (myrank==0) + std::cout << "Maximum iteration reached at iteration " << iter << std::endl; + goto iter_end; + } else { + if (myrank==0 && if_verbose) + std::cout << "Iteration " << iter << ": L1 error = " << L1_err << ", Linf error = " << Linf_err << std::endl; + iter++; + + } + // if (myrank==0){ + // std::cout << "Iteration " << iter << "L_1(Tnew-Told)= " << L1_dif << " , L_inf(Tnew-Told) = " << Linf_dif << std::endl; + // // std::cout << "Iteration " << iter << ": L1 error = " << L1_err << ", Linf error = " << Linf_err << std::endl; + // } + } // end of wile + +iter_end: + if (myrank==0) + std::cout << "Iteration " << iter << " finished." << std::endl; + + for (int ii = 0; ii < nr_2d*nt_2d; ii++){ + T_2d[ii] = tau_2d[ii]*T0v_2d[ii]; + } + +} + + +void PlainGrid::calculate_stencil_upwind_2d(int& ir, int& it){ + + count_cand = 0; + ii = ir*nt_2d+it; + ii_nr = (ir-1)*nt_2d+it; + ii_pr = (ir+1)*nt_2d+it; + ii_nt = ir*nt_2d+(it-1); + ii_pt = ir*nt_2d+(it+1); + + + // (T0*tau)_r = ar*tau(iix,iiy)+br; (T0*tau)_t = at*tau(iix,iiy)+bt + if (it > 0){ + at1 = T0t_2d[ii] + T0v_2d[ii]/dt_2d; + bt1 = -T0v_2d[ii]/dt_2d*tau_2d[ii_nt]; + } + if (it < nt_2d-1){ + at2 = T0t_2d[ii] - T0v_2d[ii]/dt_2d; + bt2 = T0v_2d[ii]/dt_2d*tau_2d[ii_pt]; + } + if (ir > 0){ + ar1 = T0r_2d[ii] + T0v_2d[ii]/dr_2d; + br1 = -T0v_2d[ii]/dr_2d*tau_2d[ii_nr]; + } + if (ir < nr_2d-1){ + ar2 = T0r_2d[ii] - T0v_2d[ii]/dr_2d; + br2 = T0v_2d[ii]/dr_2d*tau_2d[ii_pr]; + } + + // start to find candidate solutions + + // first catalog: characteristic travels through sector in 2D volume (4 cases) + for (int i_case = 0; i_case < 4; i_case++){ + // determine discretization of T_t,T_r + switch (i_case) { + case 0: // characteristic travels from -t, -r + if (it == 0 || ir == 0) + continue; + at = at1; bt = bt1; + ar = ar1; br = br1; + break; + case 1: // characteristic travels from -t, +r + if (it == 0 || ir == nr_2d-1) + continue; + at = at1; bt = bt1; + ar = ar2; br = br2; + break; + case 2: // characteristic travels from +t, -r + if (it == nt_2d-1 || ir == 0) + continue; + at = at2; bt = bt2; + ar = ar1; br = br1; + break; + case 3: // characteristic travels from +t, +r + if (it == nt_2d-1 || ir == nr_2d-1) + continue; + at = at2; bt = bt2; + ar = ar2; br = br2; + break; + } + + // plug T_t, T_r into eikonal equation, solving the quadratic equation with respect to tau(iip,jjt,kkr) + // that is a*(ar*tau+br)^2 + b*(at*tau+bt)^2 = s^2 + eqn_a = fac_a_2d[ii] * std::pow(ar, _2_CR) + fac_b_2d[ii] * std::pow(at, _2_CR); + eqn_b = fac_a_2d[ii] * _2_CR * ar * br + fac_b_2d[ii] * _2_CR * at * bt; + eqn_c = fac_a_2d[ii] * std::pow(br, _2_CR) + fac_b_2d[ii] * std::pow(bt, _2_CR) - std::pow(fun_2d[ii], _2_CR); + eqn_Delta = std::pow(eqn_b, _2_CR) - _4_CR * eqn_a * eqn_c; + + if (eqn_Delta >= 0){ // one or two real solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_tau = (-eqn_b + std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + case 1: + tmp_tau = (-eqn_b - std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + } + + // check the causality condition: the characteristic passing through (it,ir) is in between used two sides + // characteristic direction is (dr/dt, dtheta/dt, tphi/dt) = (H_p1,H_p2,H_p3), p1 = T_r, p2 = T_t, p3 = T_p + T_r = ar*tmp_tau + br; + T_t = at*tmp_tau + bt; + + charact_r = T_r; + charact_t = T_t; + + is_causality = false; + switch (i_case){ + case 0: //characteristic travels from -t, -r + if (charact_t >= 0 && charact_r >= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 1: //characteristic travels from -t, +r + if (charact_t >= 0 && charact_r <= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 2: //characteristic travels from +t, -r + if (charact_t <= 0 && charact_r >= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 3: //characteristic travels from +t, +r + if (charact_t <= 0 && charact_r <= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_tau; + count_cand += 1; + } + } + } + } + + // second catalog: characteristic travels through lines in 1D volume (4 cases) + // case: 1-2 + // characteristic travels along r-axis, force H_p2, H_p3 = 0, that is, T_t = 0 + // plug the constraint into eikonal equation, we have the equation: a*T_r^2 = s^2 + for (int i_case = 0; i_case < 2; i_case++){ + switch (i_case){ + case 0: //characteristic travels from -r + if (ir == 0){ + continue; + } + ar = ar1; br = br1; + break; + case 1: //characteristic travels from +r + if (ir == nr_2d-1){ + continue; + } + ar = ar2; br = br2; + break; + } + + // plug T_t, T_r into eikonal equation, solve the quadratic equation: (ar*tau+br)^2 = s^2 + // simply, we have two solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_tau = ( std::sqrt(std::pow(fun_2d[ii],_2_CR)/fac_a_2d[ii]) - br)/ar; + break; + case 1: + tmp_tau = (-std::sqrt(std::pow(fun_2d[ii],_2_CR)/fac_a_2d[ii]) - br)/ar; + break; + } + + // check the causality condition: + + is_causality = false; + switch (i_case){ + case 0: //characteristic travels from -r (we can simply compare the traveltime, which is the same as check the direction of characteristic) + if (tmp_tau * T0v_2d[ii] > tau_2d[ii_nr] * T0v_2d[ii_nr] + && tmp_tau > tau_2d[ii_nr]/_2_CR && tmp_tau > 0){ // this additional condition ensures the causality near the source + is_causality = true; + } + break; + case 1: //characteristic travels from +r + if (tmp_tau * T0v_2d[ii] > tau_2d[ii_pr] * T0v_2d[ii_pr] + && tmp_tau > tau_2d[ii_pr]/_2_CR && tmp_tau > 0){ + is_causality = true; + } + break; + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_tau; + count_cand += 1; + } + } + + } + + + // case: 3-4 + // characteristic travels along t-axis, force H_p1, H_p3 = 0, that is, T_r = 0; + // plug the constraint into eikonal equation, we have the equation: T_t^2 = s^2 + for (int i_case = 2; i_case < 4; i_case++){ + switch (i_case){ + case 2: //characteristic travels from -t + if (it == 0){ + continue; + } + at = at1; bt = bt1; + break; + case 3: //characteristic travels from +t + if (it == nt_2d-1){ + continue; + } + at = at2; bt = bt2; + break; + } + + // plug T_t into eikonal equation, solve the quadratic equation: b*(at*tau+bt)^2 = s^2 + // simply, we have two solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_tau = ( std::sqrt(std::pow(fun_2d[ii],_2_CR)/fac_b_2d[ii]) - bt)/at; + break; + case 1: + tmp_tau = (-std::sqrt(std::pow(fun_2d[ii],_2_CR)/fac_b_2d[ii]) - bt)/at; + break; + } + + // check the causality condition: + + is_causality = false; + switch (i_case){ + case 2: //characteristic travels from -t (we can simply compare the traveltime, which is the same as check the direction of characteristic) + if (tmp_tau * T0v_2d[ii] > tau_2d[ii_nt] * T0v_2d[ii_nt] + && tmp_tau > tau_2d[ii_nt]/_2_CR && tmp_tau > 0){ // this additional condition ensures the causality near the source + is_causality = true; + } + break; + case 3: //characteristic travels from +t + if (tmp_tau * T0v_2d[ii] > tau_2d[ii_pt] * T0v_2d[ii_pt] + && tmp_tau > tau_2d[ii_pt]/_2_CR && tmp_tau > 0){ + is_causality = true; + } + break; + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_tau; + count_cand += 1; + } + } + } + + // final, choose the minimum candidate solution as the updated value + for (int i_cand = 0; i_cand < count_cand; i_cand++){ + tau_2d[ii] = std::min(tau_2d[ii], canditate[i_cand]); + if (tau_2d[ii] < 0 ){ + std::cout << "error, tele tau_loc < 0. ir: " << ir << ", it: " << it << std::endl; + exit(1); + } + } + +} + + +CUSTOMREAL interp2d(PlainGrid& pg, CUSTOMREAL t, CUSTOMREAL r) { + // interpolate 2d travel time field on the boundaries + // pg is the grid + // t is distance between source and boundary point + // r is the radius of the boundary point + + // find the index of the closest point on the grid + int it_n=0, it_p=0, ir_n=0, ir_p=0; + + CUSTOMREAL dt = pg.t_2d[1] - pg.t_2d[0]; + CUSTOMREAL dr = pg.r_2d[1] - pg.r_2d[0]; + + // here t is the distance between source and boundary point + // which is ok because t values of 2d grid is also relative + margin from source + // location + it_n = std::floor((t - pg.t_2d[0]) / dt); + it_p = it_n + 1; + ir_n = std::floor((r - pg.r_2d[0]) / dr); + ir_p = ir_n + 1; + + // interpolate + CUSTOMREAL T_tnrn = pg.T_2d[ir_n*pg.nt_2d+it_n]; + CUSTOMREAL T_tnrp = pg.T_2d[ir_p*pg.nt_2d+it_n]; + CUSTOMREAL T_tprn = pg.T_2d[ir_n*pg.nt_2d+it_p]; + CUSTOMREAL T_tprp = pg.T_2d[ir_p*pg.nt_2d+it_p]; + + CUSTOMREAL t_err = std::min(_1_CR, (t-pg.t_2d[it_n])/dt); + CUSTOMREAL r_err = std::min(_1_CR, (r-pg.r_2d[ir_n])/dr); + + return (1-t_err)*(1-r_err)*T_tnrn + t_err*(1-r_err)*T_tprn + (1-t_err)*r_err*T_tnrp + t_err*r_err*T_tprp; +} + + +std::string get_2d_tt_filename(const std::string& dir_2d, Source& src) { + + std::string fname_2d_src; + + if (output_format == OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + // add the depth of the source to the file name + // to share the travel time field if sources have the same depth of hypocenter + auto str = std::to_string(src.get_src_dep()); + fname_2d_src = dir_2d + "/2d_travel_time_field_dep_" + str.substr(0,str.find(".")+4) +".h5"; +#else + std::cout << "HDF5 is not enabled. Please recompile with HDF5" << std::endl; +#endif + } else if (output_format == OUTPUT_FORMAT_ASCII) { + auto str = std::to_string(src.get_src_dep()); // use depth value of the source to the file name + fname_2d_src = dir_2d + "/2d_travel_time_field_dep_" + str.substr(0,str.find(".")+4) +".dat"; + } + + return fname_2d_src; + +} + + +void run_2d_solver(InputParams& IP, Source& src, IO_utils& io) { + // calculate 2d travel time field by only the first process of each simulation group + + // initialize grid for all processes + PlainGrid plain_grid(src,IP); + + // check if pre-calculated 2d travel time field exists + + // create output directory for 2d solver + std::string dir_2d = output_dir+"/"+OUTPUT_DIR_2D; + create_output_dir(dir_2d); + + std::string fname_2d_src = get_2d_tt_filename(dir_2d, src); + + if (is_file_exist(fname_2d_src.c_str())) { + std::cout << "2d solver skipped the src because traveltime data already exists: " << fname_2d_src << std::endl; + } else { // if not, calculate and store it + // run iteration + std::cout << "start run iteration myrank: " << myrank << ", for file: " << fname_2d_src << std::endl; + plain_grid.run_iteration_upwind(IP); + + // write out calculated 2D travel time field + io.write_2d_travel_time_field(plain_grid.T_2d, plain_grid.r_2d, plain_grid.t_2d, plain_grid.nr_2d, plain_grid.nt_2d, src.get_src_dep()); + } + + } + + +void load_2d_traveltime(InputParams& IP, Source& src, Grid& grid, IO_utils& io) { + // initialize grid for all processes + PlainGrid plain_grid(src,IP); + + // check if pre-calculated 2d travel time field exists + if(myrank == 0) { + + // output directory for 2d solver + std::string dir_2d = output_dir+"/"+OUTPUT_DIR_2D; + //create_output_dir(dir_2d); + + std::string fname_2d_src = get_2d_tt_filename(dir_2d, src); + + if (is_file_exist(fname_2d_src.c_str())) { + // remark :: TODO :: we need to check whether the 2d_traveltime file has the same size of T_2d here. + // Otherwise, we need to recalculate the 2d traveltime field and write it out. + + // read 2d travel time field from file + io.read_2d_travel_time_field(fname_2d_src, plain_grid.T_2d, plain_grid.nt_2d, plain_grid.nr_2d); + + if (if_verbose) + std::cout << "2d travel time field has been read from file: " << fname_2d_src << std::endl; + } else { // if not, stop the program + std::cout << "2d travel time field does not exist. Please verify if the 2d solver finished normally." << std::endl; + std::cout << "missing : " << fname_2d_src << std::endl; + exit(1); + } + } + + // share T_2d, r_2d and t_2d to all processes + broadcast_cr(plain_grid.T_2d, plain_grid.nr_2d*plain_grid.nt_2d, 0); + broadcast_cr(plain_grid.r_2d, plain_grid.nr_2d, 0); + broadcast_cr(plain_grid.t_2d, plain_grid.nt_2d, 0); + + // interpolate results on the boundaries and store SrcRec object + + CUSTOMREAL tmp_dist; + + for (int l = 0; l < N_LAYER_SRC_BOUND; l++){ + for (int k = 0; k < loc_K; k++) { + for (int i = 0; i < loc_I; i++) { + // North boundary + if (grid.j_last()){ + Epicentral_distance_sphere(plain_grid.src_t, plain_grid.src_p, grid.get_lat_by_index(loc_J-1-l), grid.get_lon_by_index(i), tmp_dist); + grid.T_loc[I2V(i, loc_J-1-l, k)] = interp2d(plain_grid, tmp_dist, grid.get_r_by_index(k)); + grid.is_changed[I2V(i, loc_J-1-l, k)] = false; + } + // South boundary + if (grid.j_first()){ + Epicentral_distance_sphere(plain_grid.src_t, plain_grid.src_p, grid.get_lat_by_index(l), grid.get_lon_by_index(i), tmp_dist); + grid.T_loc[I2V(i, l, k)] = interp2d(plain_grid, tmp_dist, grid.get_r_by_index(k)); + grid.is_changed[I2V(i, l, k)] = false; + } + } + } + + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + // East boundary + if (grid.i_last()){ + Epicentral_distance_sphere(plain_grid.src_t, plain_grid.src_p, grid.get_lat_by_index(j), grid.get_lon_by_index(loc_I-1-l), tmp_dist); + grid.T_loc[I2V(loc_I-1-l, j, k)] = interp2d(plain_grid, tmp_dist, grid.get_r_by_index(k)); + grid.is_changed[I2V(loc_I-1-l, j, k)] = false; + } + // West boundary + if (grid.i_first()){ + Epicentral_distance_sphere(plain_grid.src_t, plain_grid.src_p, grid.get_lat_by_index(j), grid.get_lon_by_index(l), tmp_dist); + grid.T_loc[I2V(l, j, k)] = interp2d(plain_grid, tmp_dist, grid.get_r_by_index(k)); + grid.is_changed[I2V(l, j, k)] = false; + } + } + } + + for (int i = 0; i < loc_I; i++) { + for (int j = 0; j < loc_J; j++) { + // Bottom boundary + if (grid.k_first()){ + Epicentral_distance_sphere(plain_grid.src_t, plain_grid.src_p, grid.get_lat_by_index(j), grid.get_lon_by_index(i), tmp_dist); + grid.T_loc[I2V(i, j, l)] = interp2d(plain_grid, tmp_dist, grid.get_r_by_index(l)); + grid.is_changed[I2V(i, j, l)] = false; + } + } + } + } + +} + + diff --git a/src/grid.cpp b/src/grid.cpp new file mode 100644 index 0000000..85821e2 --- /dev/null +++ b/src/grid.cpp @@ -0,0 +1,2305 @@ +#include "grid.h" + +Grid::Grid(InputParams& IP, IO_utils& io) { + stdout_by_main("--- grid object initialization starts. ---"); + + // Initialize all MPI_Win variables to NULL to ensure proper cleanup + init_mpi_wins({&win_fac_a_loc, &win_fac_b_loc, &win_fac_c_loc, &win_fac_f_loc, + &win_T0r_loc, &win_T0p_loc, &win_T0t_loc, &win_T0v_loc, + &win_tau_loc, &win_fun_loc, &win_is_changed, + &win_T_loc, &win_tau_old_loc, + &win_xi_loc, &win_eta_loc, &win_zeta_loc, + &win_r_loc_1d, &win_t_loc_1d, &win_p_loc_1d, + &win_Tadj_loc, &win_Tadj_density_loc}); + + // initialize grid parameters are done by only the main process of each subdomain + if (subdom_main) { + // domain decomposition + init_decomposition(IP); + + // memory allocation + memory_allocation(); + } + + // allocate memory for shm arrays if necessary + if (n_subprocs > 1){ + shm_memory_allocation(); + } + + synchronize_all_world(); + + // setup grid parameters + if (subdom_main) + setup_grid_params(IP, io); + +} + +Grid::~Grid() { + // deallocate memory from all arrays + if (subdom_main) memory_deallocation(); + + if (n_subprocs > 1) { + // deallocate memory from shm arrays + shm_memory_deallocation(); + } +} + +void Grid::init_decomposition(InputParams& IP) { + + int tmp_rank = 0; + + for (int kk = 0; kk < ndiv_k; kk++) + for (int jj = 0; jj < ndiv_j; jj++) + for (int ii = 0; ii < ndiv_i; ii++) { + tmp_rank = kk * ndiv_i * ndiv_j + jj * ndiv_i + ii; + if (tmp_rank == myrank) { + // check neighbors on i axis + if (ndiv_i > 1) { + if (ii == 0) { // neighbor on the bound +i + neighbors_id[1] = tmp_rank + 1; + } else if (ii == ndiv_i - 1) { // neighbor on the bound -i + neighbors_id[0] = tmp_rank - 1; + } else { // middle layers + neighbors_id[0] = tmp_rank - 1; + neighbors_id[1] = tmp_rank + 1; + } + } + + // check neighbors on j axis + if (ndiv_j > 1) { + if (jj == 0) { // neighbor on the bound +j + neighbors_id[3] = tmp_rank + ndiv_i; + } else if (jj == ndiv_j - 1) { // neighbor on the bound -j + neighbors_id[2] = tmp_rank - ndiv_i; + } else { // middle layers + neighbors_id[2] = tmp_rank - ndiv_i; + neighbors_id[3] = tmp_rank + ndiv_i; + } + } + + // check neighbors on k axis + if (ndiv_k > 1) { + if (kk == 0) { // neighbor on the bound +k + neighbors_id[5] = tmp_rank + ndiv_i * ndiv_j; + } else if (kk == ndiv_k - 1) { // neighbor on the bound -k + neighbors_id[4] = tmp_rank - ndiv_i * ndiv_j; + } else { // middle layers + neighbors_id[4] = tmp_rank - ndiv_i * ndiv_j; + neighbors_id[5] = tmp_rank + ndiv_i * ndiv_j; + } + } + + // store the layer id + domain_i = ii; + domain_j = jj; + domain_k = kk; + + // stop searching immediately if this rank found the local ids + goto end_pos_detected; + } + } + + end_pos_detected: + + // calculate the number of grid points for this subdomain + loc_I = (int)ngrid_i/ndiv_i; + loc_J = (int)ngrid_j/ndiv_j; + loc_K = (int)ngrid_k/ndiv_k; + + // calculate the number of grid points for this subdomain + offset_i = domain_i * loc_I; + offset_j = domain_j * loc_J; + offset_k = domain_k * loc_K; + + // add modulus to the last rank + if (i_last()) loc_I += ngrid_i % ndiv_i; + if (j_last()) loc_J += ngrid_j % ndiv_j; + if (k_last()) loc_K += ngrid_k % ndiv_k; + + // number of grid points on the boundary surfaces + n_grid_bound_i = loc_J * loc_K; + n_grid_bound_j = loc_I * loc_K; + n_grid_bound_k = loc_I * loc_J; + + // store the number of grids excluding the ghost grids + loc_I_excl_ghost = loc_I; + loc_J_excl_ghost = loc_J; + loc_K_excl_ghost = loc_K; + + // initialize iteration start/end + i_start_loc = 0; + j_start_loc = 0; + k_start_loc = 0; + i_end_loc = loc_I-1; // end id needs to be included for the iterations + j_end_loc = loc_J-1; // thus please pay attaintion to the for loop + k_end_loc = loc_K-1; // to be e.g. for (i = i_start_loc; i <= i_end_loc; i++) + + // add ghost nodes to comunicate with neighbor domains + // i axis + if (ndiv_i > 1) { + if (i_first() || i_last()) { + loc_I += n_ghost_layers; + } else { + loc_I += n_ghost_layers * 2; + } + // store the start/end ids of iteration for axis i + if (!i_first()) i_start_loc = n_ghost_layers; + if (!i_last()) i_end_loc = loc_I - n_ghost_layers - 1; + if (i_last()) i_end_loc = loc_I - 1; + } + + // j axis + if (ndiv_j > 1) { + if (j_first() || j_last()) { + loc_J += n_ghost_layers; + } else { + loc_J += n_ghost_layers * 2; + } + // store the start/end ids of iteration for axis j + if (!j_first()) j_start_loc = n_ghost_layers; + if (!j_last()) j_end_loc = loc_J - n_ghost_layers - 1; + if (j_last()) j_end_loc = loc_J - 1; + } + // k axis + if (ndiv_k > 1) { + if (k_first() || k_last()) { + loc_K += n_ghost_layers; + } else { + loc_K += n_ghost_layers * 2; + } + // store the start/end ids of iteration for axis k + if (!k_first()) k_start_loc = n_ghost_layers; + if (!k_last()) k_end_loc = loc_K - n_ghost_layers - 1; + if (k_last()) k_end_loc = loc_K - 1; + } + + // calculate the nodes' and elms' offset for data output + loc_nnodes = loc_I_excl_ghost * loc_J_excl_ghost * loc_K_excl_ghost; + loc_nelms = (loc_I_excl_ghost - 1) * (loc_J_excl_ghost - 1) * (loc_K_excl_ghost - 1); + + nnodes = allocateMemory(nprocs, 1001); + nelms = allocateMemory(nprocs, 1002); + + // gather the number of nodes and elements + allgather_i_single(&loc_nnodes, nnodes); + allgather_i_single(&loc_nelms, nelms); + + if (myrank > 0){ + // sum nnodes and nelms + for (int i = 0; i < myrank; i++) { + offset_nnodes += nnodes[i]; + offset_nelms += nelms[i]; + } + } + + // setup number of elements and nodes for visualization (additinoal 1 layer for connection) + loc_I_vis = loc_I_excl_ghost; + loc_J_vis = loc_J_excl_ghost; + loc_K_vis = loc_K_excl_ghost; + if (!i_last()) loc_I_vis++; + if (!j_last()) loc_J_vis++; + if (!k_last()) loc_K_vis++; + + loc_nnodes_vis = loc_I_vis * loc_J_vis * loc_K_vis; + loc_nelms_vis = (loc_I_vis - 1) * (loc_J_vis - 1) * (loc_K_vis - 1); + nnodes_vis = allocateMemory(nprocs, 1003); + nelms_vis = allocateMemory(nprocs, 1004); + allgather_i_single(&loc_nnodes_vis, nnodes_vis); + allgather_i_single(&loc_nelms_vis, nelms_vis); + if (myrank > 0){ + // sum nnodes and nelms + for (int i = 0; i < myrank; i++) { + offset_nnodes_vis += nnodes_vis[i]; + offset_nelms_vis += nelms_vis[i]; + } + } + i_start_vis = i_start_loc; + j_start_vis = j_start_loc; + k_start_vis = k_start_loc; + i_end_vis = i_end_loc; + j_end_vis = j_end_loc; + k_end_vis = k_end_loc; + // add one layer for connection to the next subdomain + if (!i_last()) i_end_vis++; + if (!j_last()) j_end_vis++; + if (!k_last()) k_end_vis++; + + // inversion setup + // check if inversion grids are needed + if (IP.get_run_mode()==DO_INVERSION || IP.get_run_mode()==INV_RELOC || IP.get_run_mode()==ONED_INVERSION){ + inverse_flag = true; + inv_grid = new InvGrid(IP); + } else { + inverse_flag = false; + } + + // check subdomains contacting lines and points + // ij nn + if (neighbors_id[0] != -1 && neighbors_id[2] != -1) + neighbors_id_ij[0] = neighbors_id[2]-1; + // ij np + if (neighbors_id[0] != -1 && neighbors_id[3] != -1) + neighbors_id_ij[1] = neighbors_id[3]-1; + // ij pn + if (neighbors_id[1] != -1 && neighbors_id[2] != -1) + neighbors_id_ij[2] = neighbors_id[2]+1; + // ij pp + if (neighbors_id[1] != -1 && neighbors_id[3] != -1) + neighbors_id_ij[3] = neighbors_id[3]+1; + // jk nn + if (neighbors_id[2] != -1 && neighbors_id[4] != -1) + neighbors_id_jk[0] = neighbors_id[4]-ndiv_i; + // jk np + if (neighbors_id[2] != -1 && neighbors_id[5] != -1) + neighbors_id_jk[1] = neighbors_id[5]-ndiv_i; + // jk pn + if (neighbors_id[3] != -1 && neighbors_id[4] != -1) + neighbors_id_jk[2] = neighbors_id[4]+ndiv_i; + // jk pp + if (neighbors_id[3] != -1 && neighbors_id[5] != -1) + neighbors_id_jk[3] = neighbors_id[5]+ndiv_i; + // ik nn + if (neighbors_id[0] != -1 && neighbors_id[4] != -1) + neighbors_id_ik[0] = neighbors_id[4]-1; + // ik np + if (neighbors_id[0] != -1 && neighbors_id[5] != -1) + neighbors_id_ik[1] = neighbors_id[5]-1; + // ik pn + if (neighbors_id[1] != -1 && neighbors_id[4] != -1) + neighbors_id_ik[2] = neighbors_id[4]+1; + // ik pp + if (neighbors_id[1] != -1 && neighbors_id[5] != -1) + neighbors_id_ik[3] = neighbors_id[5]+1; + // ijk nnn + if (neighbors_id[0] != -1 && neighbors_id[2] != -1 && neighbors_id[4] != -1) + neighbors_id_ijk[0] = neighbors_id[4]-ndiv_i; + // ijk nnp + if (neighbors_id[0] != -1 && neighbors_id[2] != -1 && neighbors_id[5] != -1) + neighbors_id_ijk[1] = neighbors_id[5]-ndiv_i; + // ijk npn + if (neighbors_id[0] != -1 && neighbors_id[3] != -1 && neighbors_id[4] != -1) + neighbors_id_ijk[2] = neighbors_id[4]+ndiv_i; + // ijk npp + if (neighbors_id[0] != -1 && neighbors_id[3] != -1 && neighbors_id[5] != -1) + neighbors_id_ijk[3] = neighbors_id[5]+ndiv_i; + // ijk pnn + if (neighbors_id[1] != -1 && neighbors_id[2] != -1 && neighbors_id[4] != -1) + neighbors_id_ijk[4] = neighbors_id[4]-ndiv_i; + // ijk pnp + if (neighbors_id[1] != -1 && neighbors_id[2] != -1 && neighbors_id[5] != -1) + neighbors_id_ijk[5] = neighbors_id[5]-ndiv_i; + // ijk ppn + if (neighbors_id[1] != -1 && neighbors_id[3] != -1 && neighbors_id[4] != -1) + neighbors_id_ijk[6] = neighbors_id[4]+ndiv_i; + // ijk ppp + if (neighbors_id[1] != -1 && neighbors_id[3] != -1 && neighbors_id[5] != -1) + neighbors_id_ijk[7] = neighbors_id[5]+ndiv_i; + + // debug output + stdout_by_main("domain decomposition initialization end."); + + + for (int i = 0; i < nprocs; i++) { + synchronize_all_inter(); + + if (id_sim == 0){ + if (i == myrank) { + std::cout << "--- myrank: ---" << myrank << std::endl; + + if (i == 0) { + std::cout << "ndiv_i j k : " << ndiv_i << " " << ndiv_j << " " << ndiv_k << std::endl; + std::cout << "ngrid_i j k : " << ngrid_i << " " << ngrid_j << " " << ngrid_k << std::endl; + } + + std::cout << "domain_i j k: " << domain_i << " " << domain_j << " " << domain_k << std::endl; + std::cout << "loc_I J K: " << loc_I << " " << loc_J << " " << loc_K << std::endl; + std::cout << "loc_I_excl_ghost J_excl_ghost K_excl_ghost: " << loc_I_excl_ghost << " " << loc_J_excl_ghost << " " << loc_K_excl_ghost << std::endl; + std::cout << "i_start_loc i_end_loc: " << i_start_loc << " " << i_end_loc << std::endl; + std::cout << "j_start_loc j_end_loc: " << j_start_loc << " " << j_end_loc << std::endl; + std::cout << "k_start_loc k_end_loc: " << k_start_loc << " " << k_end_loc << std::endl; + std::cout << "offset_nnodes offset_nelms: " << offset_nnodes << " " << offset_nelms << std::endl; + std::cout << "n total local grids: " << loc_I*loc_J*loc_K << " max vector elm id: " << I2V(loc_I-1,loc_J-1,loc_K-1) << std::endl; + // print neighbors_id + std::cout << "neighbors_id: "; + for (int i = 0; i < 6; i++) { + std::cout << neighbors_id[i] << " "; + } + std::cout << std::endl; + } + } + } + + synchronize_all_inter(); +} + + + +// allocate memory for arrays, called only for subdom_main +void Grid::memory_allocation() { + // 3d arrays + int n_total_loc_grid_points = loc_I * loc_J * loc_K; + // skip allocation of shm arrays if not using shm + if (sub_nprocs <= 1) { +#ifdef USE_CUDA + if(use_gpu) + cudaMallocHost((void**)&tau_loc, n_total_loc_grid_points * sizeof(CUSTOMREAL)); + else + tau_loc = allocateMemory(n_total_loc_grid_points, 1); +#else + tau_loc = allocateMemory(n_total_loc_grid_points, 1); +#endif + + xi_loc = allocateMemory(n_total_loc_grid_points, 2); + eta_loc = allocateMemory(n_total_loc_grid_points, 3); + zeta_loc = allocateMemory(n_total_loc_grid_points, 4); + T_loc = allocateMemory(n_total_loc_grid_points, 5); + tau_old_loc = allocateMemory(n_total_loc_grid_points, 6); + + T0r_loc = allocateMemory(n_total_loc_grid_points, 7); + T0t_loc = allocateMemory(n_total_loc_grid_points, 8); + T0p_loc = allocateMemory(n_total_loc_grid_points, 9); + T0v_loc = allocateMemory(n_total_loc_grid_points, 10); + fac_a_loc = allocateMemory(n_total_loc_grid_points, 11); + fac_b_loc = allocateMemory(n_total_loc_grid_points, 12); + fac_c_loc = allocateMemory(n_total_loc_grid_points, 13); + fac_f_loc = allocateMemory(n_total_loc_grid_points, 14); + fun_loc = allocateMemory(n_total_loc_grid_points, 15); + is_changed = allocateMemory(n_total_loc_grid_points, 16); + + // 1d arrays + p_loc_1d = allocateMemory(loc_I, 17); + t_loc_1d = allocateMemory(loc_J, 18); + r_loc_1d = allocateMemory(loc_K, 19); + } + + if (if_test) + u_loc = allocateMemory(n_total_loc_grid_points, 20); + + // ghost layer arrays + if (neighbors_id[0] != -1) { + bin_s = allocateMemory(n_ghost_layers*n_grid_bound_i, 21); + bin_r = allocateMemory(n_ghost_layers*n_grid_bound_i, 22); + } + if (neighbors_id[1] != -1) { + bip_s = allocateMemory(n_ghost_layers*n_grid_bound_i, 23); + bip_r = allocateMemory(n_ghost_layers*n_grid_bound_i, 24); + } + if (neighbors_id[2] != -1) { + bjn_s = allocateMemory(n_ghost_layers*n_grid_bound_j, 25); + bjn_r = allocateMemory(n_ghost_layers*n_grid_bound_j, 26); + } + if (neighbors_id[3] != -1) { + bjp_s = allocateMemory(n_ghost_layers*n_grid_bound_j, 27); + bjp_r = allocateMemory(n_ghost_layers*n_grid_bound_j, 28); + } + if (neighbors_id[4] != -1) { + bkn_s = allocateMemory(n_ghost_layers*n_grid_bound_k, 29); + bkn_r = allocateMemory(n_ghost_layers*n_grid_bound_k, 30); + } + if (neighbors_id[5] != -1) { + bkp_s = allocateMemory(n_ghost_layers*n_grid_bound_k, 31); + bkp_r = allocateMemory(n_ghost_layers*n_grid_bound_k, 32); + } + if (neighbors_id_ij[0] != -1) { + bij_nn_s = allocateMemory(loc_K_vis, 33); + bij_nn_r = allocateMemory(loc_K_vis, 34); + } + if (neighbors_id_ij[1] != -1) { + bij_np_s = allocateMemory(loc_K_vis, 35); + bij_np_r = allocateMemory(loc_K_vis, 36); + } + if (neighbors_id_ij[2] != -1) { + bij_pn_s = allocateMemory(loc_K_vis, 37); + bij_pn_r = allocateMemory(loc_K_vis, 38); + } + if (neighbors_id_ij[3] != -1) { + bij_pp_s = allocateMemory(loc_K_vis, 39); + bij_pp_r = allocateMemory(loc_K_vis, 40); + } + if (neighbors_id_jk[0] != -1) { + bjk_nn_s = allocateMemory(loc_I_vis, 41); + bjk_nn_r = allocateMemory(loc_I_vis, 42); + } + if (neighbors_id_jk[1] != -1) { + bjk_np_s = allocateMemory(loc_I_vis, 43); + bjk_np_r = allocateMemory(loc_I_vis, 44); + } + if (neighbors_id_jk[2] != -1) { + bjk_pn_s = allocateMemory(loc_I_vis, 45); + bjk_pn_r = allocateMemory(loc_I_vis, 46); + } + if (neighbors_id_jk[3] != -1) { + bjk_pp_s = allocateMemory(loc_I_vis, 47); + bjk_pp_r = allocateMemory(loc_I_vis, 48); + } + if (neighbors_id_ik[0] != -1) { + bik_nn_s = allocateMemory(loc_J_vis, 49); + bik_nn_r = allocateMemory(loc_J_vis, 50); + } + if (neighbors_id_ik[1] != -1) { + bik_np_s = allocateMemory(loc_J_vis, 51); + bik_np_r = allocateMemory(loc_J_vis, 52); + } + if (neighbors_id_ik[2] != -1) { + bik_pn_s = allocateMemory(loc_J_vis, 53); + bik_pn_r = allocateMemory(loc_J_vis, 54); + } + if (neighbors_id_ik[3] != -1) { + bik_pp_s = allocateMemory(loc_J_vis, 55); + bik_pp_r = allocateMemory(loc_J_vis, 56); + } + if (neighbors_id_ijk[0] != -1) { + bijk_nnn_s = allocateMemory(1, 57); + bijk_nnn_r = allocateMemory(1, 58); + } + if (neighbors_id_ijk[1] != -1) { + bijk_nnp_s = allocateMemory(1, 59); + bijk_nnp_r = allocateMemory(1, 60); + } + if (neighbors_id_ijk[2] != -1) { + bijk_npn_s = allocateMemory(1, 61); + bijk_npn_r = allocateMemory(1, 62); + } + if (neighbors_id_ijk[3] != -1) { + bijk_npp_s = allocateMemory(1, 63); + bijk_npp_r = allocateMemory(1, 64); + } + if (neighbors_id_ijk[4] != -1) { + bijk_pnn_s = allocateMemory(1, 65); + bijk_pnn_r = allocateMemory(1, 66); + } + if (neighbors_id_ijk[5] != -1) { + bijk_pnp_s = allocateMemory(1, 67); + bijk_pnp_r = allocateMemory(1, 68); + } + if (neighbors_id_ijk[6] != -1) { + bijk_ppn_s = allocateMemory(1, 69); + bijk_ppn_r = allocateMemory(1, 70); + } + if (neighbors_id_ijk[7] != -1) { + bijk_ppp_s = allocateMemory(1, 71); + bijk_ppp_r = allocateMemory(1, 72); + } + + // array for mpi request + mpi_send_reqs = allocateMemory(6, 731); + mpi_recv_reqs = allocateMemory(6, 732); + for (int i = 0; i < 6; i++){ + mpi_send_reqs[i] = MPI_REQUEST_NULL; + mpi_recv_reqs[i] = MPI_REQUEST_NULL; + } + + mpi_send_reqs_kosumi = allocateMemory(20, 741); + mpi_recv_reqs_kosumi = allocateMemory(20, 742); + for (int i = 0; i < 20; i++){ + mpi_send_reqs_kosumi[i] = MPI_REQUEST_NULL; + mpi_recv_reqs_kosumi[i] = MPI_REQUEST_NULL; + } + + // arrays for data output + if (subdom_main){ // only accessible by the main process of each subdomain, which store the field data + int nnodes_loc_vis = loc_I_vis * loc_J_vis * loc_K_vis; + int nelms_loc_vis = (loc_I_vis-1) * (loc_J_vis-1) * (loc_K_vis-1); + x_loc_3d = allocateMemory(nnodes_loc_vis, 75); + y_loc_3d = allocateMemory(nnodes_loc_vis, 76); + z_loc_3d = allocateMemory(nnodes_loc_vis, 77); + p_loc_3d = allocateMemory(nnodes_loc_vis, 78); + t_loc_3d = allocateMemory(nnodes_loc_vis, 79); + r_loc_3d = allocateMemory(nnodes_loc_vis, 80); + elms_conn = allocateMemory(nelms_loc_vis*9, 81); + my_proc_dump = allocateMemory(nnodes_loc_vis, 82); // DEBUG + vis_data = allocateMemory(nnodes_loc_vis, 83); // temp array for visuzulization + } + + // arrays for inversion + if (inverse_flag) { + int n_total_loc_inv_grid = n_inv_I_loc * n_inv_J_loc * n_inv_K_loc; + int n_total_loc_inv_grid_ani = n_inv_I_loc_ani * n_inv_J_loc_ani * n_inv_K_loc_ani; + + if (subdom_main){ // only accessible by the main process of each subdomain, which store the field data + Ks_loc = allocateMemory(n_total_loc_grid_points, 90); + Kxi_loc = allocateMemory(n_total_loc_grid_points, 91); + Keta_loc = allocateMemory(n_total_loc_grid_points, 92); + Ks_density_loc = allocateMemory(n_total_loc_grid_points, 93); + Kxi_density_loc = allocateMemory(n_total_loc_grid_points, 94); + Keta_density_loc = allocateMemory(n_total_loc_grid_points, 95); + + Ks_inv_loc = allocateMemory(n_total_loc_inv_grid, 96); + Kxi_inv_loc = allocateMemory(n_total_loc_inv_grid_ani, 97); + Keta_inv_loc = allocateMemory(n_total_loc_inv_grid_ani, 98); + Ks_density_inv_loc = allocateMemory(n_total_loc_inv_grid, 99); + Kxi_density_inv_loc = allocateMemory(n_total_loc_inv_grid_ani, 100); + Keta_density_inv_loc = allocateMemory(n_total_loc_inv_grid_ani, 101); + + Ks_update_loc = allocateMemory(n_total_loc_grid_points, 99); + Kxi_update_loc = allocateMemory(n_total_loc_grid_points, 100); + Keta_update_loc = allocateMemory(n_total_loc_grid_points, 101); + Ks_density_update_loc = allocateMemory(n_total_loc_grid_points, 102); + Kxi_density_update_loc = allocateMemory(n_total_loc_grid_points, 103); + Keta_density_update_loc = allocateMemory(n_total_loc_grid_points, 104); + + Ks_update_loc_previous = allocateMemory(n_total_loc_grid_points, 102); + Kxi_update_loc_previous = allocateMemory(n_total_loc_grid_points, 103); + Keta_update_loc_previous = allocateMemory(n_total_loc_grid_points, 104); + } + + if (sub_nprocs <= 1){ + Tadj_loc = allocateMemory(n_total_loc_grid_points, 105); + Tadj_density_loc = allocateMemory(n_total_loc_grid_points, 106); + } + + if (optim_method==HALVE_STEPPING_MODE) { + fac_b_loc_back = allocateMemory(n_total_loc_grid_points, 107); + fac_c_loc_back = allocateMemory(n_total_loc_grid_points, 108); + fac_f_loc_back = allocateMemory(n_total_loc_grid_points, 109); + xi_loc_back = allocateMemory(n_total_loc_grid_points, 110); + eta_loc_back = allocateMemory(n_total_loc_grid_points, 111); + fun_loc_back = allocateMemory(n_total_loc_grid_points, 112); + } + + if (optim_method==LBFGS_MODE) { + fac_b_loc_back = allocateMemory(n_total_loc_grid_points, 113); + fac_c_loc_back = allocateMemory(n_total_loc_grid_points, 114); + fac_f_loc_back = allocateMemory(n_total_loc_grid_points, 115); + xi_loc_back = allocateMemory(n_total_loc_grid_points, 116); + eta_loc_back = allocateMemory(n_total_loc_grid_points, 117); + fun_loc_back = allocateMemory(n_total_loc_grid_points, 118); + + int n_total_loc_lbfgs = n_total_loc_grid_points * Mbfgs; + Ks_descent_dir_loc = allocateMemory(n_total_loc_lbfgs, 119); + Kxi_descent_dir_loc = allocateMemory(n_total_loc_lbfgs, 120); + Keta_descent_dir_loc = allocateMemory(n_total_loc_lbfgs, 121); + // initialize + std::fill(Ks_descent_dir_loc, Ks_descent_dir_loc + n_total_loc_lbfgs, _0_CR); + std::fill(Kxi_descent_dir_loc, Kxi_descent_dir_loc + n_total_loc_lbfgs, _0_CR); + std::fill(Keta_descent_dir_loc, Keta_descent_dir_loc + n_total_loc_lbfgs, _0_CR); + + if (id_sim==0){ + Ks_grad_store_loc = allocateMemory(n_total_loc_lbfgs, 122); + Kxi_grad_store_loc = allocateMemory(n_total_loc_lbfgs, 123); + Keta_grad_store_loc = allocateMemory(n_total_loc_lbfgs, 124); + Ks_model_store_loc = allocateMemory(n_total_loc_lbfgs, 125); + Kxi_model_store_loc = allocateMemory(n_total_loc_lbfgs, 126); + Keta_model_store_loc = allocateMemory(n_total_loc_lbfgs, 127); + fun_gradient_regularization_penalty_loc = allocateMemory(n_total_loc_lbfgs, 128); + xi_gradient_regularization_penalty_loc = allocateMemory(n_total_loc_lbfgs, 129); + eta_gradient_regularization_penalty_loc = allocateMemory(n_total_loc_lbfgs, 130); + fun_regularization_penalty_loc = allocateMemory(n_total_loc_lbfgs, 131); + xi_regularization_penalty_loc = allocateMemory(n_total_loc_lbfgs, 132); + eta_regularization_penalty_loc = allocateMemory(n_total_loc_lbfgs, 133); + fun_prior_loc = allocateMemory(n_total_loc_lbfgs, 134); + xi_prior_loc = allocateMemory(n_total_loc_lbfgs, 135); + eta_prior_loc = allocateMemory(n_total_loc_lbfgs, 136); + + // initialize + std::fill(Ks_grad_store_loc, Ks_grad_store_loc + n_total_loc_lbfgs, _0_CR); + std::fill(Kxi_grad_store_loc, Kxi_grad_store_loc + n_total_loc_lbfgs, _0_CR); + std::fill(Keta_grad_store_loc, Keta_grad_store_loc + n_total_loc_lbfgs, _0_CR); + std::fill(Ks_model_store_loc, Ks_model_store_loc + n_total_loc_lbfgs, _0_CR); + std::fill(Kxi_model_store_loc, Kxi_model_store_loc + n_total_loc_lbfgs, _0_CR); + std::fill(Keta_model_store_loc, Keta_model_store_loc + n_total_loc_lbfgs, _0_CR); + std::fill(fun_gradient_regularization_penalty_loc, fun_gradient_regularization_penalty_loc + n_total_loc_lbfgs, _0_CR); + std::fill(xi_gradient_regularization_penalty_loc, xi_gradient_regularization_penalty_loc + n_total_loc_lbfgs, _0_CR); + std::fill(eta_gradient_regularization_penalty_loc, eta_gradient_regularization_penalty_loc + n_total_loc_lbfgs, _0_CR); + std::fill(fun_regularization_penalty_loc, fun_regularization_penalty_loc + n_total_loc_lbfgs, _0_CR); + std::fill(xi_regularization_penalty_loc, xi_regularization_penalty_loc + n_total_loc_lbfgs, _0_CR); + std::fill(eta_regularization_penalty_loc, eta_regularization_penalty_loc + n_total_loc_lbfgs, _0_CR); + std::fill(fun_prior_loc, fun_prior_loc + n_total_loc_lbfgs, _0_CR); + std::fill(xi_prior_loc, xi_prior_loc + n_total_loc_lbfgs, _0_CR); + std::fill(eta_prior_loc, eta_prior_loc + n_total_loc_lbfgs, _0_CR); + } + } + } // end of if inverse_flag + + stdout_by_main("Memory allocation done."); +} + + +void Grid::shm_memory_allocation() { + + synchronize_all_sub(); + + int n_total_loc_grid_points = loc_I * loc_J * loc_K; + if (sub_rank != 0) + n_total_loc_grid_points = 0; + + prepare_shm_array_cr(n_total_loc_grid_points, T_loc, win_T_loc); + prepare_shm_array_cr(n_total_loc_grid_points, tau_old_loc, win_tau_old_loc); + prepare_shm_array_cr(n_total_loc_grid_points, xi_loc, win_xi_loc); + prepare_shm_array_cr(n_total_loc_grid_points, eta_loc, win_eta_loc); + prepare_shm_array_cr(n_total_loc_grid_points, zeta_loc, win_zeta_loc); + + prepare_shm_array_cr(n_total_loc_grid_points, T0r_loc, win_T0r_loc); + prepare_shm_array_cr(n_total_loc_grid_points, T0t_loc, win_T0t_loc); + prepare_shm_array_cr(n_total_loc_grid_points, T0p_loc, win_T0p_loc); + prepare_shm_array_cr(n_total_loc_grid_points, T0v_loc, win_T0v_loc); + prepare_shm_array_cr(n_total_loc_grid_points, tau_loc, win_tau_loc); + prepare_shm_array_cr(n_total_loc_grid_points, fac_a_loc, win_fac_a_loc); + prepare_shm_array_cr(n_total_loc_grid_points, fac_b_loc, win_fac_b_loc); + prepare_shm_array_cr(n_total_loc_grid_points, fac_c_loc, win_fac_c_loc); + prepare_shm_array_cr(n_total_loc_grid_points, fac_f_loc, win_fac_f_loc); + prepare_shm_array_cr(n_total_loc_grid_points, fun_loc, win_fun_loc); + prepare_shm_array_bool(n_total_loc_grid_points, is_changed, win_is_changed); + + prepare_shm_array_cr(loc_I, p_loc_1d, win_p_loc_1d); + prepare_shm_array_cr(loc_J, t_loc_1d, win_t_loc_1d); + prepare_shm_array_cr(loc_K, r_loc_1d, win_r_loc_1d); + + // inversion + prepare_shm_array_cr(n_total_loc_grid_points, Tadj_loc, win_Tadj_loc); + prepare_shm_array_cr(n_total_loc_grid_points, Tadj_density_loc, win_Tadj_density_loc); +} + + +void Grid::shm_memory_deallocation() { + // Free MPI shared memory windows before MPI_Finalize to avoid Intel OneAPI errors + // These windows were allocated in shm_memory_allocation() + cleanup_mpi_wins({&win_fac_a_loc, &win_fac_b_loc, &win_fac_c_loc, &win_fac_f_loc, + &win_T0r_loc, &win_T0p_loc, &win_T0t_loc, &win_T0v_loc, + &win_tau_loc, &win_fun_loc, &win_is_changed, + &win_T_loc, &win_tau_old_loc, + &win_xi_loc, &win_eta_loc, &win_zeta_loc, + &win_r_loc_1d, &win_t_loc_1d, &win_p_loc_1d, + &win_Tadj_loc, &win_Tadj_density_loc}); +} + +// function for memory allocation, called only for subdomain. +void Grid::memory_deallocation() { + // shm array deallocation is done in shm_memory_deallocation() if shm is used + if (sub_nprocs <= 1) { + +#ifdef USE_CUDA + if(use_gpu) + cudaFree(tau_loc); + else + delete[] tau_loc; +#else + delete[] tau_loc; +#endif + delete[] xi_loc; + delete[] eta_loc; + delete[] zeta_loc; + delete[] T_loc; + delete[] tau_old_loc; + + delete[] T0r_loc; + delete[] T0t_loc; + delete[] T0p_loc; + delete[] T0v_loc; + delete[] fac_a_loc; + delete[] fac_b_loc; + delete[] fac_c_loc; + delete[] fac_f_loc; + delete[] fun_loc; + delete[] is_changed; + + delete[] t_loc_1d; + delete[] p_loc_1d; + delete[] r_loc_1d; + + } + + if(if_test) + delete[] u_loc; + + if (neighbors_id[0] != -1) { + delete[] bin_s; + delete[] bin_r; + } + if (neighbors_id[1] != -1) { + delete[] bip_s; + delete[] bip_r; + } + if (neighbors_id[2] != -1) { + delete[] bjn_s; + delete[] bjn_r; + } + if (neighbors_id[3] != -1) { + delete[] bjp_s; + delete[] bjp_r; + } + if (neighbors_id[4] != -1) { + delete[] bkn_s; + delete[] bkn_r; + } + if (neighbors_id[5] != -1) { + delete[] bkp_s; + delete[] bkp_r; + } + if (neighbors_id_ij[0] != -1) { + delete[] bij_nn_s; + delete[] bij_nn_r; + } + if (neighbors_id_ij[1] != -1) { + delete[] bij_np_s; + delete[] bij_np_r; + } + if (neighbors_id_ij[2] != -1) { + delete[] bij_pn_s; + delete[] bij_pn_r; + } + if (neighbors_id_ij[3] != -1) { + delete[] bij_pp_s; + delete[] bij_pp_r; + } + if (neighbors_id_jk[0] != -1) { + delete[] bjk_nn_s; + delete[] bjk_nn_r; + } + if (neighbors_id_jk[1] != -1) { + delete[] bjk_np_s; + delete[] bjk_np_r; + } + if (neighbors_id_jk[2] != -1) { + delete[] bjk_pn_s; + delete[] bjk_pn_r; + } + if (neighbors_id_jk[3] != -1) { + delete[] bjk_pp_s; + delete[] bjk_pp_r; + } + if (neighbors_id_ik[0] != -1) { + delete[] bik_nn_s; + delete[] bik_nn_r; + } + if (neighbors_id_ik[1] != -1) { + delete[] bik_np_s; + delete[] bik_np_r; + } + if (neighbors_id_ik[2] != -1) { + delete[] bik_pn_s; + delete[] bik_pn_r; + } + if (neighbors_id_ik[3] != -1) { + delete[] bik_pp_s; + delete[] bik_pp_r; + } + if (neighbors_id_ijk[0] != -1) { + delete[] bijk_nnn_s; + delete[] bijk_nnn_r; + } + if (neighbors_id_ijk[1] != -1) { + delete[] bijk_nnp_s; + delete[] bijk_nnp_r; + } + if (neighbors_id_ijk[2] != -1) { + delete[] bijk_npn_s; + delete[] bijk_npn_r; + } + if (neighbors_id_ijk[3] != -1) { + delete[] bijk_npp_s; + delete[] bijk_npp_r; + } + if (neighbors_id_ijk[4] != -1) { + delete[] bijk_pnn_s; + delete[] bijk_pnn_r; + } + if (neighbors_id_ijk[5] != -1) { + delete[] bijk_pnp_s; + delete[] bijk_pnp_r; + } + if (neighbors_id_ijk[6] != -1) { + delete[] bijk_ppn_s; + delete[] bijk_ppn_r; + } + if (neighbors_id_ijk[7] != -1) { + delete[] bijk_ppp_s; + delete[] bijk_ppp_r; + } + + delete[] mpi_send_reqs; + delete[] mpi_recv_reqs; + delete[] mpi_send_reqs_kosumi; + delete[] mpi_recv_reqs_kosumi; + + // delete arrays + delete[] nnodes; + delete[] nelms; + delete[] nnodes_vis; + delete[] nelms_vis; + + if (subdom_main){ + delete[] x_loc_3d; + delete[] y_loc_3d; + delete[] z_loc_3d; + delete[] p_loc_3d; + delete[] t_loc_3d; + delete[] r_loc_3d; + delete[] elms_conn; + delete[] my_proc_dump; + delete[] vis_data; + } + + // inversion arrays + if (inverse_flag){ + delete inv_grid; + + if (subdom_main){ + delete[] Ks_loc; + delete[] Kxi_loc; + delete[] Keta_loc; + delete[] Ks_density_loc; + delete[] Kxi_density_loc; + delete[] Keta_density_loc; + delete[] Ks_inv_loc; + delete[] Kxi_inv_loc; + delete[] Keta_inv_loc; + delete[] Ks_density_inv_loc; + delete[] Kxi_density_inv_loc; + delete[] Keta_density_inv_loc; + delete[] Ks_update_loc; + delete[] Kxi_update_loc; + delete[] Keta_update_loc; + delete[] Ks_density_update_loc; + delete[] Kxi_density_update_loc; + delete[] Keta_density_update_loc; + delete[] Ks_update_loc_previous; + delete[] Kxi_update_loc_previous; + delete[] Keta_update_loc_previous; + } + + if (sub_nprocs <= 1){ + delete[] Tadj_loc; + delete[] Tadj_density_loc; + } + + if (optim_method==HALVE_STEPPING_MODE) { + delete[] fac_b_loc_back; + delete[] fac_c_loc_back; + delete[] fac_f_loc_back; + delete[] fun_loc_back; + delete[] xi_loc_back; + delete[] eta_loc_back; + } + + if (optim_method==LBFGS_MODE) { + delete[] fac_b_loc_back; + delete[] fac_c_loc_back; + delete[] fac_f_loc_back; + delete[] fun_loc_back; + delete[] xi_loc_back; + delete[] eta_loc_back; + + if (id_sim==0){ + delete[] Ks_grad_store_loc; + delete[] Kxi_grad_store_loc; + delete[] Keta_grad_store_loc; + delete[] Ks_model_store_loc; + delete[] Kxi_model_store_loc; + delete[] Keta_model_store_loc; + delete[] fun_gradient_regularization_penalty_loc; + delete[] xi_gradient_regularization_penalty_loc; + delete[] eta_gradient_regularization_penalty_loc; + delete[] fun_regularization_penalty_loc; + delete[] xi_regularization_penalty_loc; + delete[] eta_regularization_penalty_loc; + delete[] fun_prior_loc; + delete[] xi_prior_loc; + delete[] eta_prior_loc; + } + } + } // end if inverse_flag + + stdout_by_main("Memory deallocation done."); +} + + +// setput the grid parameters (material and source etc.) +void Grid::setup_grid_params(InputParams &IP, IO_utils& io) { + + // setup coordinates + r_min = depth2radius(IP.get_max_dep()); // convert from depth to radius + r_max = depth2radius(IP.get_min_dep()); // convert from depth to radius + lat_min = IP.get_min_lat(); // in rad + lat_max = IP.get_max_lat(); // in rad + lon_min = IP.get_min_lon(); // in rad + lon_max = IP.get_max_lon(); // in rad + + dr = (r_max - r_min) / (ngrid_k - 1); + dlat = (lat_max - lat_min) / (ngrid_j - 1); + dlon = (lon_max - lon_min) / (ngrid_i - 1); + + dt = dlat; dp = dlon; + + // starting position in global indices including ghost layers + int tmp_offset_k = get_offset_k(); + int tmp_offset_j = get_offset_j(); + int tmp_offset_i = get_offset_i(); // offset_i - i_start_loc + + // output global grid parameters + if (inter_sub_rank == 0 && myrank == 0 && id_sim == 0) { + std::cout << "\n\n Global grid information: \n\n" << std::endl; + std::cout << " r_min r_max dr : " << r_min << " " << r_max << " " << dr << std::endl; + std::cout << " depth_min depth_max dz : " << IP.get_min_dep() << " " << IP.get_max_dep() << std::endl; + std::cout << " lat_min lat_max dlat [degree] : " << lat_min*RAD2DEG << " " << lat_max*RAD2DEG << " " << dlat*RAD2DEG << std::endl; + std::cout << " lon_min lon_max dlon [degree] : " << lon_min*RAD2DEG << " " << lon_max*RAD2DEG << " " << dlon*RAD2DEG << std::endl; + std::cout << " ngrid_i ngrid_j ngrid_k : " << ngrid_i << " " << ngrid_j << " " << ngrid_k << std::endl; + std::cout << "\n\n" << std::endl; + } + + // assign coordinates to 1d arrays + // r + for (int k = 0; k < loc_K; k++) { + r_loc_1d[k] = r_min + (tmp_offset_k + k)*dr; + } + // lat + for (int j = 0; j < loc_J; j++) { + t_loc_1d[j] = lat_min + (tmp_offset_j + j)*dlat; + } + // lon + for (int i = 0; i < loc_I; i++) { + p_loc_1d[i] = lon_min + (tmp_offset_i + i)*dlon; + } + + for (int i = 0; i < nprocs; i++) { + synchronize_all_inter(); + if (i == myrank && id_sim == 0) { + std::cout << "\n--- subdomain info ---- rank : " << i << "\n\n" << std::endl; + std::cout << " p_loc_1d min max in deg.: " << p_loc_1d[0]*RAD2DEG << " " << p_loc_1d[loc_I-1]*RAD2DEG << std::endl; + std::cout << " t_loc_1d min max in deg.: " << t_loc_1d[0]*RAD2DEG << " " << t_loc_1d[loc_J-1]*RAD2DEG << std::endl; + std::cout << " r_loc_1d min max in km : " << r_loc_1d[0] << " " << r_loc_1d[loc_K-1] << std::endl; + + std::cout << " p_loc_1d min max in rad.: " << p_loc_1d[0] << " " << p_loc_1d[loc_I-1] << std::endl; + std::cout << " t_loc_1d min max in rad.: " << t_loc_1d[0] << " " << t_loc_1d[loc_J-1] << std::endl; + + std::cout << " r_min, get_offset_k(), dr in km: " << r_min << " " << tmp_offset_k << " " << dr << std::endl; + std::cout << " lat_min, get_offset_j(), dlat in deg.: " << lat_min*RAD2DEG << " " << tmp_offset_j << " " << dlat*RAD2DEG << std::endl; + std::cout << " lon_min, get_offset_i(), dlon in deg.: " << lon_min*RAD2DEG << " " << tmp_offset_i << " " << dlon*RAD2DEG << std::endl; + std::cout << "\n" << std::endl; + } + } + + // independent read model data + if (id_sim == 0){ + // read init model + std::string f_model_path = IP.get_init_model_path(); + io.read_model(f_model_path,"xi", xi_loc, tmp_offset_i, tmp_offset_j, tmp_offset_k); + io.read_model(f_model_path,"eta", eta_loc, tmp_offset_i, tmp_offset_j, tmp_offset_k); + //io.read_model(f_model_path,"zeta", zeta_loc, tmp_offset_i, tmp_offset_j, tmp_offset_k); + io.read_model(f_model_path,"vel", fun_loc, tmp_offset_i, tmp_offset_j, tmp_offset_k); // use slowness array temprarily + if(if_test) { + // solver test + io.read_model(f_model_path, "u", u_loc, tmp_offset_i, tmp_offset_j, tmp_offset_k); + } + + // set zeta = 0 (optimization for zeta is not implemented yet) + std::fill(zeta_loc, zeta_loc + loc_I*loc_J*loc_K, _0_CR); + + // copy initial model to prior model arrays + if (optim_method==LBFGS_MODE){ + std::copy(xi_loc, xi_loc + loc_I*loc_J*loc_K, xi_prior_loc); + std::copy(eta_loc, eta_loc + loc_I*loc_J*loc_K, eta_prior_loc); + std::copy(fun_loc, fun_loc + loc_I*loc_J*loc_K, fun_prior_loc); + } + + } + + // broadcast + int n_total_loc_grid_points = loc_I * loc_J * loc_K; + broadcast_cr_inter_sim(xi_loc, n_total_loc_grid_points, 0); + broadcast_cr_inter_sim(eta_loc, n_total_loc_grid_points, 0); + broadcast_cr_inter_sim(zeta_loc, n_total_loc_grid_points, 0); + broadcast_cr_inter_sim(fun_loc, n_total_loc_grid_points, 0); // here passing velocity array + if(if_test) { + broadcast_cr_inter_sim(u_loc, n_total_loc_grid_points, 0); + } + + // center of the domain + CUSTOMREAL lon_center = (lon_min + lon_max) / 2.0; + CUSTOMREAL lat_center = (lat_min + lat_max) / 2.0; + + // initialize other necessary arrays + for (int k_r = 0; k_r < loc_K; k_r++) { + for (int j_lat = 0; j_lat < loc_J; j_lat++) { + for (int i_lon = 0; i_lon < loc_I; i_lon++) { + + // convert velocity to slowness + fun_loc[I2V(i_lon, j_lat, k_r)] = _1_CR / fun_loc[I2V(i_lon, j_lat, k_r)]; + + // calculate fac_a_loc, fac_b_loc, fac_c_loc, fac_f_loc + fac_a_loc[I2V(i_lon, j_lat, k_r)] = _1_CR + _2_CR * zeta_loc[I2V(i_lon, j_lat, k_r)]; + fac_b_loc[I2V(i_lon, j_lat, k_r)] = _1_CR - _2_CR * xi_loc[I2V(i_lon, j_lat, k_r)]; + fac_c_loc[I2V(i_lon, j_lat, k_r)] = _1_CR + _2_CR * xi_loc[I2V(i_lon, j_lat, k_r)]; + fac_f_loc[I2V(i_lon, j_lat, k_r)] = - _2_CR * eta_loc[I2V(i_lon, j_lat, k_r)]; + + // construct 3d coordinate arrays and node connectivity for visualization + // exclude the ghost nodes + if (i_start_vis <= i_lon && i_lon <= i_end_vis \ + && j_start_vis <= j_lat && j_lat <= j_end_vis \ + && k_start_vis <= k_r && k_r <= k_end_vis) { + int i_loc_tmp = i_lon - i_start_vis; + int j_loc_tmp = j_lat - j_start_vis; + int k_loc_tmp = k_r - k_start_vis; + + // get the coordinates of the point + CUSTOMREAL x, y, z; + //RLonLat2xyz(p_loc_1d[i_lon], t_loc_1d[j_lat], r_loc_1d[k_r], x, y, z); // complete sphere + WGS84ToCartesian(p_loc_1d[i_lon], t_loc_1d[j_lat], r_loc_1d[k_r], x, y, z, lon_center, lat_center); // WGS84 + + x_loc_3d[I2V_VIS(i_loc_tmp,j_loc_tmp,k_loc_tmp)] = x; + y_loc_3d[I2V_VIS(i_loc_tmp,j_loc_tmp,k_loc_tmp)] = y; + z_loc_3d[I2V_VIS(i_loc_tmp,j_loc_tmp,k_loc_tmp)] = z; + p_loc_3d[I2V_VIS(i_loc_tmp,j_loc_tmp,k_loc_tmp)] = p_loc_1d[i_lon]*RAD2DEG; + t_loc_3d[I2V_VIS(i_loc_tmp,j_loc_tmp,k_loc_tmp)] = t_loc_1d[j_lat]*RAD2DEG; + // r_loc_3d[I2V_VIS(i_loc_tmp,j_loc_tmp,k_loc_tmp)] = r_loc_1d[k_r]*M2KM; + r_loc_3d[I2V_VIS(i_loc_tmp,j_loc_tmp,k_loc_tmp)] = r_loc_1d[k_r]; + + // dump proc id + my_proc_dump[I2V_VIS(i_loc_tmp,j_loc_tmp,k_loc_tmp)] = myrank; + + // node connectivity + // exclude the last layers + if (i_lon < i_end_vis \ + && j_lat < j_end_vis \ + && k_r < k_end_vis) { + elms_conn[I2V_ELM_CONN(i_loc_tmp,j_loc_tmp,k_loc_tmp)*9] = cell_type; + elms_conn[I2V_ELM_CONN(i_loc_tmp,j_loc_tmp,k_loc_tmp)*9+1] = offset_nnodes_vis+I2V_VIS(i_loc_tmp, j_loc_tmp, k_loc_tmp); + elms_conn[I2V_ELM_CONN(i_loc_tmp,j_loc_tmp,k_loc_tmp)*9+2] = offset_nnodes_vis+I2V_VIS(i_loc_tmp+1,j_loc_tmp, k_loc_tmp); + elms_conn[I2V_ELM_CONN(i_loc_tmp,j_loc_tmp,k_loc_tmp)*9+3] = offset_nnodes_vis+I2V_VIS(i_loc_tmp+1,j_loc_tmp+1,k_loc_tmp); + elms_conn[I2V_ELM_CONN(i_loc_tmp,j_loc_tmp,k_loc_tmp)*9+4] = offset_nnodes_vis+I2V_VIS(i_loc_tmp, j_loc_tmp+1,k_loc_tmp); + elms_conn[I2V_ELM_CONN(i_loc_tmp,j_loc_tmp,k_loc_tmp)*9+5] = offset_nnodes_vis+I2V_VIS(i_loc_tmp, j_loc_tmp, k_loc_tmp+1); + elms_conn[I2V_ELM_CONN(i_loc_tmp,j_loc_tmp,k_loc_tmp)*9+6] = offset_nnodes_vis+I2V_VIS(i_loc_tmp+1,j_loc_tmp, k_loc_tmp+1); + elms_conn[I2V_ELM_CONN(i_loc_tmp,j_loc_tmp,k_loc_tmp)*9+7] = offset_nnodes_vis+I2V_VIS(i_loc_tmp+1,j_loc_tmp+1,k_loc_tmp+1); + elms_conn[I2V_ELM_CONN(i_loc_tmp,j_loc_tmp,k_loc_tmp)*9+8] = offset_nnodes_vis+I2V_VIS(i_loc_tmp, j_loc_tmp+1,k_loc_tmp+1); + } + } + } + } + } // end of for loop + + + // check model discontinuity + if (id_sim == 0 && (!IP.get_ignore_velocity_discontinuity())){ + check_velocity_discontinuity(); + } + + + // setup parameters for inversion grids +// if (inverse_flag) +// setup_inv_grid_params(IP); + +} + + +void Grid::check_velocity_discontinuity(){ + + for (int j_lat = 0; j_lat < loc_J; j_lat++) { + for (int i_lon = 0; i_lon < loc_I; i_lon++){ + for (int k_r = 0; k_r < loc_K-1; k_r++) { + CUSTOMREAL vel_bottom = 1.0/fun_loc[I2V(i_lon,j_lat,k_r)]; + CUSTOMREAL vel_top = 1.0/fun_loc[I2V(i_lon,j_lat,k_r+1)]; + if (vel_top > vel_bottom * 1.2 || vel_top < vel_bottom * 0.8){ + std::cout << "Velocity discontinuity detected at i = " << i_lon << " j = " << j_lat << " k = " << k_r << std::endl; + std::cout << "vel_loc[I2V(i,j,k)] = " << vel_bottom << std::endl; + std::cout << "vel_loc[I2V(i,j,k+1)] = " << vel_top << std::endl; + std::cout << std::endl; + std::cout << "Smoothing the input model using Gaussian filter is highly recommended." << std::endl; + std::cout << "Please set the flag ignore_velocity_discontinuity: True in the input_params.yaml file (below run_mode) if you want to solve in a model with discontinuity. " << std::endl; + std::cout << "Unexpected bias may occur in traveltime and kernel." << std::endl; + exit(1); + } + } + } + } +} + + +void Grid::initialize_kernels(){ + // initialize kernels + if (subdom_main){ + std::fill(Ks_loc, Ks_loc + loc_I*loc_J*loc_K, _0_CR); + std::fill(Kxi_loc, Kxi_loc + loc_I*loc_J*loc_K, _0_CR); + std::fill(Keta_loc, Keta_loc + loc_I*loc_J*loc_K, _0_CR); + std::fill(Ks_density_loc, Ks_density_loc + loc_I*loc_J*loc_K, _0_CR); + std::fill(Kxi_density_loc,Kxi_density_loc + loc_I*loc_J*loc_K, _0_CR); + std::fill(Keta_density_loc,Keta_density_loc + loc_I*loc_J*loc_K, _0_CR); + //for (int k = 0; k < loc_K; k++) { + // for (int j = 0; j < loc_J; j++) { + // for (int i = 0; i < loc_I; i++) { + // Ks_loc[ I2V(i,j,k)] = _0_CR; + // Kxi_loc[ I2V(i,j,k)] = _0_CR; + // Keta_loc[I2V(i,j,k)] = _0_CR; + // } + // } + //} + } +} + + +// get a part of pointers from the requested array for visualization +CUSTOMREAL* Grid::get_array_for_vis(CUSTOMREAL* arr, bool inverse_value) { + + send_recev_boundary_data(arr); + // add a routine for communication the boundary value + // with the neighbors with line/point contact + send_recev_boundary_data_kosumi(arr); + + for (int k_r = 0; k_r < loc_K; k_r++) { + for (int j_lat = 0; j_lat < loc_J; j_lat++) { + for (int i_lon = 0; i_lon < loc_I; i_lon++) { + if (i_start_vis <= i_lon && i_lon <= i_end_vis \ + && j_start_vis <= j_lat && j_lat <= j_end_vis \ + && k_start_vis <= k_r && k_r <= k_end_vis) { + int i_loc_tmp = i_lon - i_start_vis; + int j_loc_tmp = j_lat - j_start_vis; + int k_loc_tmp = k_r - k_start_vis; + + if(!inverse_value) + vis_data[I2V_VIS(i_loc_tmp,j_loc_tmp,k_loc_tmp)] = arr[I2V(i_lon,j_lat,k_r)]; + else + vis_data[I2V_VIS(i_loc_tmp,j_loc_tmp,k_loc_tmp)] = _1_CR/arr[I2V(i_lon,j_lat,k_r)]; // used for convert from slowness to velocity + } + } + } + } + + return vis_data; +} + + +// set visualization array to local array +void Grid::set_array_from_vis(CUSTOMREAL* arr) { + + for (int k_r = 0; k_r < loc_K; k_r++) { + for (int j_lat = 0; j_lat < loc_J; j_lat++) { + for (int i_lon = 0; i_lon < loc_I; i_lon++) { + if (i_start_vis <= i_lon && i_lon <= i_end_vis \ + && j_start_vis <= j_lat && j_lat <= j_end_vis \ + && k_start_vis <= k_r && k_r <= k_end_vis) { + int i_loc_tmp = i_lon - i_start_vis; + int j_loc_tmp = j_lat - j_start_vis; + int k_loc_tmp = k_r - k_start_vis; + + arr[I2V(i_lon,j_lat,k_r)] = vis_data[I2V_VIS(i_loc_tmp,j_loc_tmp,k_loc_tmp)]; + } + } + } + } + + // set values to ghost layer + send_recev_boundary_data(arr); + +} + + +// get a part of pointers from the requested array for visualization +void Grid::get_array_for_3d_output(const CUSTOMREAL *arr_in, CUSTOMREAL* arr_out, bool inverse_value) { + + for (int k_r = k_start_loc; k_r <= k_end_loc; k_r++) { + for (int j_lat = j_start_loc; j_lat <= j_end_loc; j_lat++) { + for (int i_lon = i_start_loc; i_lon <= i_end_loc; i_lon++) { + int i_loc_tmp = i_lon - i_start_loc; + int j_loc_tmp = j_lat - j_start_loc; + int k_loc_tmp = k_r - k_start_loc; + if (!inverse_value) + arr_out[I2V_3D(i_loc_tmp,j_loc_tmp,k_loc_tmp)] = arr_in[I2V(i_lon,j_lat,k_r)]; + else + arr_out[I2V_3D(i_loc_tmp,j_loc_tmp,k_loc_tmp)] = _1_CR/arr_in[I2V(i_lon,j_lat,k_r)]; // used for convert from slowness to velocity + } + } + } +} + + +void Grid::reinitialize_abcf(){ + if (subdom_main) { + for (int k_r = 0; k_r < loc_K; k_r++) { + for (int j_lat = 0; j_lat < loc_J; j_lat++) { + for (int i_lon = 0; i_lon < loc_I; i_lon++) { + // initialize arrays + fac_a_loc[I2V(i_lon,j_lat,k_r)] = fac_a_loc[I2V(i_lon,j_lat,k_r)]; + fac_b_loc[I2V(i_lon,j_lat,k_r)] = fac_b_loc[I2V(i_lon,j_lat,k_r)]/ my_square(r_loc_1d[k_r]); + fac_c_loc[I2V(i_lon,j_lat,k_r)] = fac_c_loc[I2V(i_lon,j_lat,k_r)]/(my_square(r_loc_1d[k_r])*my_square(std::cos(t_loc_1d[j_lat]))); + fac_f_loc[I2V(i_lon,j_lat,k_r)] = fac_f_loc[I2V(i_lon,j_lat,k_r)]/(my_square(r_loc_1d[k_r])* std::cos(t_loc_1d[j_lat])); + } + } + } + } +} + + +void Grid::rejuvenate_abcf(){ + if (subdom_main) { + for (int k_r = 0; k_r < loc_K; k_r++) { + for (int j_lat = 0; j_lat < loc_J; j_lat++) { + for (int i_lon = 0; i_lon < loc_I; i_lon++) { + // initialize arrays + fac_a_loc[I2V(i_lon,j_lat,k_r)] = fac_a_loc[I2V(i_lon,j_lat,k_r)]; + fac_b_loc[I2V(i_lon,j_lat,k_r)] = _1_CR - _2_CR * xi_loc[I2V(i_lon,j_lat,k_r)]; + fac_c_loc[I2V(i_lon,j_lat,k_r)] = _1_CR + _2_CR * xi_loc[I2V(i_lon,j_lat,k_r)]; + fac_f_loc[I2V(i_lon,j_lat,k_r)] = - _2_CR * eta_loc[I2V(i_lon,j_lat,k_r)]; + } + } + } + } +} + + +void Grid::setup_factors(Source &src){ + + // calculate factors for the source + a0 = src.get_fac_at_source(fac_a_loc); + b0 = src.get_fac_at_source(fac_b_loc); + c0 = src.get_fac_at_source(fac_c_loc); + f0 = src.get_fac_at_source(fac_f_loc); + fun0 = src.get_fac_at_source(fun_loc, false); // true for debug +} + + +void Grid::initialize_fields(Source& src, InputParams& IP){ + + // get source position + CUSTOMREAL src_r = src.get_src_r(); + CUSTOMREAL src_t = src.get_src_t(); + CUSTOMREAL src_p = src.get_src_p(); + + // std out src positions + CUSTOMREAL c0b0_minus_f0f0 = c0*b0 - f0*f0; + + // debug + int n_source_node = 0; + + // std::cout << a0 << ' ' << b0 << ' ' << c0 << ' ' << f0 << ' ' << std::endl; + + + + for (int k_r = 0; k_r < loc_K; k_r++) { + for (int j_lat = 0; j_lat < loc_J; j_lat++) { + for (int i_lon = 0; i_lon < loc_I; i_lon++) { + CUSTOMREAL dr_from_src = r_loc_1d[k_r] - src_r; + CUSTOMREAL dt_from_src = t_loc_1d[j_lat] - src_t; + CUSTOMREAL dp_from_src = p_loc_1d[i_lon] - src_p; + + T0v_loc[I2V(i_lon,j_lat,k_r)] = fun0 * std::sqrt( _1_CR/a0 *my_square(dr_from_src) \ + + c0/(c0b0_minus_f0f0) *my_square(dt_from_src) \ + + b0/(c0b0_minus_f0f0) *my_square(dp_from_src) \ + + _2_CR*f0/(c0b0_minus_f0f0)*dt_from_src*dp_from_src); + + is_changed[I2V(i_lon,j_lat,k_r)] = true; + + if (isZero(T0v_loc[I2V(i_lon,j_lat,k_r)])) { + T0r_loc[I2V(i_lon,j_lat,k_r)] = _0_CR; + T0t_loc[I2V(i_lon,j_lat,k_r)] = _0_CR; + T0p_loc[I2V(i_lon,j_lat,k_r)] = _0_CR; + } else { + T0r_loc[I2V(i_lon,j_lat,k_r)] = my_square(fun0)*(_1_CR/a0*dr_from_src)/T0v_loc[I2V(i_lon,j_lat,k_r)]; + T0t_loc[I2V(i_lon,j_lat,k_r)] = my_square(fun0)*(c0/(c0b0_minus_f0f0)*dt_from_src+f0/(c0b0_minus_f0f0)*dp_from_src)/T0v_loc[I2V(i_lon,j_lat,k_r)]; + T0p_loc[I2V(i_lon,j_lat,k_r)] = my_square(fun0)*(b0/(c0b0_minus_f0f0)*dp_from_src+f0/(c0b0_minus_f0f0)*dt_from_src)/T0v_loc[I2V(i_lon,j_lat,k_r)]; + } + + if (IP.get_stencil_order() == 1){ + source_width = _1_CR * 0.9; + } else { + source_width = _2_CR; + } + + if (std::abs(dr_from_src/dr) <= source_width \ + && std::abs(dt_from_src/dt) <= source_width \ + && std::abs(dp_from_src/dp) <= source_width) { + + tau_loc[I2V(i_lon,j_lat,k_r)] = TAU_INITIAL_VAL; + is_changed[I2V(i_lon,j_lat,k_r)] = false; + + n_source_node++; + + // std::cout << "source def " << std::endl; + // std::cout << "p_loc_1d (lon): " << p_loc_1d[i_lon]*RAD2DEG << ", id_i: " << i_lon << ", src_p: " << src_p*RAD2DEG << std::endl; + // std::cout << "t_loc_1d (lat): " << t_loc_1d[j_lat]*RAD2DEG << ", id_j: " << j_lat << ", src_t: " << src_t*RAD2DEG << std::endl; + // std::cout << "r_loc_1d (r): " << r_loc_1d[k_r] << ", id_k: " << k_r << ", src_r: " << src_r << std::endl; + + if (if_verbose) { + if ( (k_r == 0 && k_first()) || (k_r == loc_K-1 && k_last()) ) + std::cout << "Warning: source is on the boundary k of the grid.\n"; + if ( (j_lat == 0 && j_first()) || (j_lat == loc_J-1 && j_last()) ) + std::cout << "Warning: source is on the boundary j of the grid.\n"; + if ( (i_lon == 0 && i_first()) || (i_lon == loc_I-1 && i_last()) ) + std::cout << "Warning: source is on the boundary i of the grid.\n"; + } + + } else { + if (IP.get_stencil_type()==UPWIND) // upwind scheme, initial tau should be large enough + tau_loc[I2V(i_lon,j_lat,k_r)] = TAU_INF_VAL; + else + tau_loc[I2V(i_lon,j_lat,k_r)] = TAU_INITIAL_VAL; + is_changed[I2V(i_lon,j_lat,k_r)] = true; + + } + + tau_old_loc[I2V(i_lon,j_lat,k_r)] = _0_CR; + + } // end loop i + } // end loop j + } // end loop k + + // int iip_out = 6; + // int jjt_out = 41; + // int kkr_out = 49; + + // std::cout << "T0v_loc[I2V(iip_out-2,jjt_out,kkr_out)]: " << T0v_loc[I2V(iip_out-2,jjt_out,kkr_out)] << std::endl; + // std::cout << "T0v_loc[I2V(iip_out-1,jjt_out,kkr_out)]: " << T0v_loc[I2V(iip_out-1,jjt_out,kkr_out)] << std::endl; + // std::cout << "T0v_loc[I2V(iip_out ,jjt_out,kkr_out)]: " << T0v_loc[I2V(iip_out,jjt_out,kkr_out)] << std::endl; + // std::cout << "T0v_loc[I2V(iip_out+1,jjt_out,kkr_out)]: " << T0v_loc[I2V(iip_out+1,jjt_out,kkr_out)] << std::endl; + // std::cout << "T0v_loc[I2V(iip_out+2,jjt_out,kkr_out)]: " << T0v_loc[I2V(iip_out+2,jjt_out,kkr_out)] << std::endl; + // std::cout << "T0p_loc[I2V(iip_out ,jjt_out,kkr_out)]: " << T0p_loc[I2V(iip_out ,jjt_out,kkr_out)] << std::endl; + + // std::cout << "p_loc_1d (lon): " << p_loc_1d[25]*RAD2DEG << ", id_i: " << 25 + // << "t_loc_1d (lat): " << t_loc_1d[29]*RAD2DEG << ", id_j: " << 29 + // << "r_loc_1d (r): " << r_loc_1d[41] << ", id_k: " << 41 << std::endl; + + // warning if source node is not found + if( n_source_node > 0 && if_verbose ) + std::cout << "rank n_source_node: " << myrank << " " << n_source_node << std::endl; + +} + + +void Grid::initialize_fields_teleseismic(){ + CUSTOMREAL inf_T = 2000.0; + + for (int k_r = 0; k_r < loc_K; k_r++) { + for (int j_lat = 0; j_lat < loc_J; j_lat++) { + for (int i_lon = 0; i_lon < loc_I; i_lon++) { + is_changed[I2V(i_lon,j_lat,k_r)] = true; + T_loc[I2V(i_lon,j_lat,k_r)] = inf_T; + } + } + } + + // setup of boundary arrival time conditions is done in iterator function +} + + +// copy the tau values to tau_old +void Grid::tau2tau_old() { + std::copy(tau_loc, tau_loc+loc_I*loc_J*loc_K, tau_old_loc); +} + + +// copy the T values to tau_old +void Grid::T2tau_old() { + std::copy(T_loc, T_loc+loc_I*loc_J*loc_K, tau_old_loc); +} + + +// copy the tau values to Tadj +void Grid::update_Tadj() { + std::copy(tau_loc, tau_loc+loc_I*loc_J*loc_K, Tadj_loc); +} +void Grid::update_Tadj_density() { + std::copy(tau_loc, tau_loc+loc_I*loc_J*loc_K, Tadj_density_loc); +} + +void Grid::back_up_fun_xi_eta_bcf() { + if (!subdom_main) return; + + std::copy(fun_loc, fun_loc+loc_I*loc_J*loc_K, fun_loc_back); + std::copy(xi_loc, xi_loc +loc_I*loc_J*loc_K, xi_loc_back); + std::copy(eta_loc, eta_loc+loc_I*loc_J*loc_K, eta_loc_back); + std::copy(fac_b_loc, fac_b_loc+loc_I*loc_J*loc_K, fac_b_loc_back); + std::copy(fac_c_loc, fac_c_loc+loc_I*loc_J*loc_K, fac_c_loc_back); + std::copy(fac_f_loc, fac_f_loc+loc_I*loc_J*loc_K, fac_f_loc_back); +} + + +void Grid::restore_fun_xi_eta_bcf() { + if (!subdom_main) return; + + std::copy(fun_loc_back, fun_loc_back+loc_I*loc_J*loc_K, fun_loc); + std::copy(xi_loc_back, xi_loc_back +loc_I*loc_J*loc_K, xi_loc); + std::copy(eta_loc_back, eta_loc_back+loc_I*loc_J*loc_K, eta_loc); + std::copy(fac_b_loc_back, fac_b_loc_back+loc_I*loc_J*loc_K, fac_b_loc); + std::copy(fac_c_loc_back, fac_c_loc_back+loc_I*loc_J*loc_K, fac_c_loc); + std::copy(fac_f_loc_back, fac_f_loc_back+loc_I*loc_J*loc_K, fac_f_loc); +} + + +void Grid::calc_L1_and_Linf_diff(CUSTOMREAL& L1_diff, CUSTOMREAL& Linf_diff) { + if (subdom_main) { + L1_diff = 0.0; + Linf_diff = 0.0; + CUSTOMREAL obj_func_glob = 0.0; + + // calculate L1 error + for (int k_r = k_start_loc; k_r <= k_end_loc; k_r++) { + for (int j_lat = j_start_loc; j_lat <= j_end_loc; j_lat++) { + for (int i_lon = i_start_loc; i_lon <= i_end_loc; i_lon++) { + L1_diff += std::abs(tau_loc[I2V(i_lon,j_lat,k_r)] - tau_old_loc[I2V(i_lon,j_lat,k_r)]) * T0v_loc[I2V(i_lon,j_lat,k_r)]; + Linf_diff = std::max(Linf_diff,std::abs(tau_loc[I2V(i_lon,j_lat,k_r)] - tau_old_loc[I2V(i_lon,j_lat,k_r)]) * T0v_loc[I2V(i_lon,j_lat,k_r)]); + // std::cout << R_earth-r_loc_3d[k_r] << ' ' << t_loc_3d[j_lat] << ' ' << p_loc_3d[i_lon] << ' ' << T0v_loc[I2V(i_lon,j_lat,k_r)] << ' ' << std::endl; + } + } + } + + // sum up the values of all processes + obj_func_glob=0.0; + allreduce_cr_single(L1_diff, obj_func_glob); + L1_diff = obj_func_glob/((ngrid_i-2)*(ngrid_j-2)*(ngrid_k-2)); + obj_func_glob=0.0; + allreduce_cr_single_max(Linf_diff, obj_func_glob); + Linf_diff = obj_func_glob;///(ngrid_i*ngrid_j*ngrid_k); + } +} + + +void Grid::calc_L1_and_Linf_diff_tele(CUSTOMREAL& L1_diff, CUSTOMREAL& Linf_diff) { + if (subdom_main) { + L1_diff = 0.0; + Linf_diff = 0.0; + CUSTOMREAL obj_func_glob = 0.0; + + // calculate L1 error + for (int k_r = k_start_loc; k_r <= k_end_loc; k_r++) { + for (int j_lat = j_start_loc; j_lat <= j_end_loc; j_lat++) { + for (int i_lon = i_start_loc; i_lon <= i_end_loc; i_lon++) { + L1_diff += std::abs(T_loc[I2V(i_lon,j_lat,k_r)] - tau_old_loc[I2V(i_lon,j_lat,k_r)]); // tau_old is used as T_old_loc here + Linf_diff = std::max(Linf_diff,std::abs(T_loc[I2V(i_lon,j_lat,k_r)] - tau_old_loc[I2V(i_lon,j_lat,k_r)])); + } + } + } + + // sum up the values of all processes + obj_func_glob=0.0; + allreduce_cr_single(L1_diff, obj_func_glob); + L1_diff = obj_func_glob/((ngrid_i-2)*(ngrid_j-2)*(ngrid_k-2)); + obj_func_glob=0.0; + allreduce_cr_single_max(Linf_diff, obj_func_glob); + Linf_diff = obj_func_glob;///(ngrid_i*ngrid_j*ngrid_k); + } +} + + +void Grid::calc_L1_and_Linf_diff_adj(CUSTOMREAL& L1_diff, CUSTOMREAL& Linf_diff) { + + if (subdom_main) { + //L1_diff = 0.0; + Linf_diff = 0.0; + CUSTOMREAL obj_func_glob = 0.0; + CUSTOMREAL adj_factor = 1.0; + + // calculate L1 error + for (int k_r = k_start_loc; k_r <= k_end_loc; k_r++) { + for (int j_lat = j_start_loc; j_lat <= j_end_loc; j_lat++) { + for (int i_lon = i_start_loc; i_lon <= i_end_loc; i_lon++) { + // Adjoint simulation use only Linf + Linf_diff = std::max(Linf_diff,std::abs(tau_loc[I2V(i_lon,j_lat,k_r)] - Tadj_loc[I2V(i_lon,j_lat,k_r)])); + } + } + } + + // sum up the values of all processes + obj_func_glob=0.0; + allreduce_cr_single_max(Linf_diff, obj_func_glob); + Linf_diff = obj_func_glob*adj_factor;///(ngrid_i*ngrid_j*ngrid_k); + } +} + +void Grid::calc_L1_and_Linf_diff_adj_density(CUSTOMREAL& L1_diff, CUSTOMREAL& Linf_diff) { + + if (subdom_main) { + //L1_diff = 0.0; + Linf_diff = 0.0; + CUSTOMREAL obj_func_glob = 0.0; + CUSTOMREAL adj_factor = 1.0; + + // calculate L1 error + for (int k_r = k_start_loc; k_r <= k_end_loc; k_r++) { + for (int j_lat = j_start_loc; j_lat <= j_end_loc; j_lat++) { + for (int i_lon = i_start_loc; i_lon <= i_end_loc; i_lon++) { + // Adjoint simulation use only Linf + Linf_diff = std::max(Linf_diff,std::abs(tau_loc[I2V(i_lon,j_lat,k_r)] - Tadj_density_loc[I2V(i_lon,j_lat,k_r)])); + } + } + } + + // sum up the values of all processes + obj_func_glob=0.0; + allreduce_cr_single_max(Linf_diff, obj_func_glob); + Linf_diff = obj_func_glob*adj_factor;///(ngrid_i*ngrid_j*ngrid_k); + } +} + +void Grid::calc_L1_and_Linf_error(CUSTOMREAL& L1_error, CUSTOMREAL& Linf_error) { + L1_error = 0.0; + Linf_error = 0.0; + CUSTOMREAL obj_func_glob = 0.0; + + // calculate L1 error + for (int k_r = k_start_loc; k_r <= k_end_loc; k_r++) { + for (int j_lat = j_start_loc; j_lat <= j_end_loc; j_lat++) { + for (int i_lon = i_start_loc; i_lon <= i_end_loc; i_lon++) { + L1_error += std::abs(u_loc[I2V(i_lon,j_lat,k_r)] - T0v_loc[I2V(i_lon,j_lat,k_r)] * tau_loc[I2V(i_lon,j_lat,k_r)]); + Linf_error = std::max(Linf_error,std::abs(u_loc[I2V(i_lon,j_lat,k_r)] - T0v_loc[I2V(i_lon,j_lat,k_r)] * tau_loc[I2V(i_lon,j_lat,k_r)])); + } + } + } + + // sum up the values of all processes + obj_func_glob=0.0; + allreduce_cr_single(L1_error, obj_func_glob); + L1_error = obj_func_glob; + obj_func_glob = 0.0; + allreduce_cr_single_max(Linf_error, obj_func_glob); + Linf_error = obj_func_glob;///(ngrid_i*ngrid_j*ngrid_k); +} + + +void Grid::prepare_boundary_data_to_send(CUSTOMREAL* arr) { + // store the pointers to the ghost layer's elements to be sent / to receive + // node order should be always smaller to larger + + // j-k plane negative + if (neighbors_id[0] != -1) { + for (int i = 0; i < n_ghost_layers; i++) { + for (int k = k_start_loc; k <= k_end_loc; k++) { + for (int j = j_start_loc; j <= j_end_loc; j++) { + bin_s[i*loc_J_excl_ghost*loc_K_excl_ghost + (k-k_start_loc)*loc_J_excl_ghost + (j-j_start_loc)] = arr[I2V(i+n_ghost_layers,j,k)]; + } + } + } + } + // j-k plane positive + if (neighbors_id[1] != -1) { + for (int i = 0; i < n_ghost_layers; i++) { + for (int k = k_start_loc; k <= k_end_loc; k++) { + for (int j = j_start_loc; j <= j_end_loc; j++) { + bip_s[i*loc_J_excl_ghost*loc_K_excl_ghost + (k-k_start_loc)*loc_J_excl_ghost + (j-j_start_loc)] = arr[I2V(loc_I-n_ghost_layers*2+i,j,k)]; + } + } + } + } + // i-k plane negative + if (neighbors_id[2] != -1) { + for (int j = 0; j < n_ghost_layers; j++) { + for (int k = k_start_loc; k <= k_end_loc; k++) { + for (int i = i_start_loc; i <= i_end_loc; i++) { + bjn_s[j*loc_I_excl_ghost*loc_K_excl_ghost + (k-k_start_loc)*loc_I_excl_ghost + (i-i_start_loc)] = arr[I2V(i,j+n_ghost_layers,k)]; + } + } + } + } + // i-k plane positive + if (neighbors_id[3] != -1) { + for (int j = 0; j < n_ghost_layers; j++) { + for (int k = k_start_loc; k <= k_end_loc; k++) { + for (int i = i_start_loc; i <= i_end_loc; i++) { + bjp_s[j*loc_I_excl_ghost*loc_K_excl_ghost + (k-k_start_loc)*loc_I_excl_ghost + (i-i_start_loc)] = arr[I2V(i,loc_J-n_ghost_layers*2+j,k)]; + } + } + } + } + + // i-j plane negative + if (neighbors_id[4] != -1) { + for (int k = 0; k < n_ghost_layers; k++) { + for (int j = j_start_loc; j <= j_end_loc; j++) { + for (int i = i_start_loc; i <= i_end_loc; i++) { + bkn_s[k*loc_I_excl_ghost*loc_J_excl_ghost + (j-j_start_loc)*loc_I_excl_ghost + (i-i_start_loc)] = arr[I2V(i,j,k+n_ghost_layers)]; + } + } + } + } + // i-j plane positive + if (neighbors_id[5] != -1) { + for (int k = 0; k < n_ghost_layers; k++) { + for (int j = j_start_loc; j <= j_end_loc; j++) { + for (int i = i_start_loc; i <= i_end_loc; i++) { + bkp_s[k*loc_I_excl_ghost*loc_J_excl_ghost + (j-j_start_loc)*loc_I_excl_ghost + (i-i_start_loc)] = arr[I2V(i,j,loc_K-n_ghost_layers*2+k)]; + } + } + } + } + + //stdout_by_main("Preparation ghost layers done."); +} + +void Grid::assign_received_data_to_ghost(CUSTOMREAL* arr) { + // store the pointers to the ghost layer's elements to be sent / to receive + // node order should be always smaller to larger + + // j-k plane negative + if (neighbors_id[0] != -1) { + for (int i = 0; i < n_ghost_layers; i++) { + for (int k = k_start_loc; k <= k_end_loc; k++) { + for (int j = j_start_loc; j <= j_end_loc; j++) { + arr[I2V(i,j,k)] = bin_r[i*loc_J_excl_ghost*loc_K_excl_ghost + (k-k_start_loc)*loc_J_excl_ghost + (j-j_start_loc)]; + } + } + } + } + // j-k plane positive + if (neighbors_id[1] != -1) { + for (int i = 0; i < n_ghost_layers; i++) { + for (int k = k_start_loc; k <= k_end_loc; k++) { + for (int j = j_start_loc; j <= j_end_loc; j++) { + arr[I2V(loc_I-n_ghost_layers+i,j,k)] = bip_r[i*loc_J_excl_ghost*loc_K_excl_ghost + (k-k_start_loc)*loc_J_excl_ghost + (j-j_start_loc)]; + } + } + } + } + // i-k plane negative + if (neighbors_id[2] != -1) { + for (int j = 0; j < n_ghost_layers; j++) { + for (int k = k_start_loc; k <= k_end_loc; k++) { + for (int i = i_start_loc; i <= i_end_loc; i++) { + arr[I2V(i,j,k)] = bjn_r[j*loc_I_excl_ghost*loc_K_excl_ghost + (k-k_start_loc)*loc_I_excl_ghost + (i-i_start_loc)]; + } + } + } + } + // i-k plane positive + if (neighbors_id[3] != -1) { + for (int j = 0; j < n_ghost_layers; j++) { + for (int k = k_start_loc; k <= k_end_loc; k++) { + for (int i = i_start_loc; i <= i_end_loc; i++) { + arr[I2V(i,loc_J-n_ghost_layers+j,k)] = bjp_r[j*loc_I_excl_ghost*loc_K_excl_ghost + (k-k_start_loc)*loc_I_excl_ghost + (i-i_start_loc)]; + } + } + } + } + + // i-j plane negative + if (neighbors_id[4] != -1) { + for (int k = 0; k < n_ghost_layers; k++) { + for (int j = j_start_loc; j <= j_end_loc; j++) { + for (int i = i_start_loc; i <= i_end_loc; i++) { + arr[I2V(i,j,k)] = bkn_r[k*loc_I_excl_ghost*loc_J_excl_ghost + (j-j_start_loc)*loc_I_excl_ghost + (i-i_start_loc)]; + } + } + } + } + // i-j plane positive + if (neighbors_id[5] != -1) { + for (int k = 0; k < n_ghost_layers; k++) { + for (int j = j_start_loc; j <= j_end_loc; j++) { + for (int i = i_start_loc; i <= i_end_loc; i++) { + arr[I2V(i,j,loc_K-n_ghost_layers+k)] = bkp_r[k*loc_I_excl_ghost*loc_J_excl_ghost + (j-j_start_loc)*loc_I_excl_ghost + (i-i_start_loc)]; + } + } + } + } + + //stdout_by_main("Preparation ghost layers done."); +} + +void Grid::assign_received_data_to_ghost_av(CUSTOMREAL* arr) { + // store the pointers to the ghost layer's elements to be sent / to receive + // node order should be always smaller to larger + + // j-k plane negative + if (neighbors_id[0] != -1) { + for (int i = 0; i < n_ghost_layers; i++) { + for (int k = k_start_loc; k <= k_end_loc; k++) { + for (int j = j_start_loc; j <= j_end_loc; j++) { + arr[I2V(i,j,k)] += bin_r[i*loc_J_excl_ghost*loc_K_excl_ghost + (k-k_start_loc)*loc_J_excl_ghost + (j-j_start_loc)]/_2_CR; + } + } + } + } + // j-k plane positive + if (neighbors_id[1] != -1) { + for (int i = 0; i < n_ghost_layers; i++) { + for (int k = k_start_loc; k <= k_end_loc; k++) { + for (int j = j_start_loc; j <= j_end_loc; j++) { + arr[I2V(loc_I-n_ghost_layers+i,j,k)] += bip_r[i*loc_J_excl_ghost*loc_K_excl_ghost + (k-k_start_loc)*loc_J_excl_ghost + (j-j_start_loc)]/_2_CR; + } + } + } + } + // i-k plane negative + if (neighbors_id[2] != -1) { + for (int j = 0; j < n_ghost_layers; j++) { + for (int k = k_start_loc; k <= k_end_loc; k++) { + for (int i = i_start_loc; i <= i_end_loc; i++) { + arr[I2V(i,j,k)] += bjn_r[j*loc_I_excl_ghost*loc_K_excl_ghost + (k-k_start_loc)*loc_I_excl_ghost + (i-i_start_loc)]/_2_CR; + } + } + } + } + // i-k plane positive + if (neighbors_id[3] != -1) { + for (int j = 0; j < n_ghost_layers; j++) { + for (int k = k_start_loc; k <= k_end_loc; k++) { + for (int i = i_start_loc; i <= i_end_loc; i++) { + arr[I2V(i,loc_J-n_ghost_layers+j,k)] += bjp_r[j*loc_I_excl_ghost*loc_K_excl_ghost + (k-k_start_loc)*loc_I_excl_ghost + (i-i_start_loc)]/_2_CR; + } + } + } + } + + // i-j plane negative + if (neighbors_id[4] != -1) { + for (int k = 0; k < n_ghost_layers; k++) { + for (int j = j_start_loc; j <= j_end_loc; j++) { + for (int i = i_start_loc; i <= i_end_loc; i++) { + arr[I2V(i,j,k)] += bkn_r[k*loc_I_excl_ghost*loc_J_excl_ghost + (j-j_start_loc)*loc_I_excl_ghost + (i-i_start_loc)]/_2_CR; + } + } + } + } + // i-j plane positive + if (neighbors_id[5] != -1) { + for (int k = 0; k < n_ghost_layers; k++) { + for (int j = j_start_loc; j <= j_end_loc; j++) { + for (int i = i_start_loc; i <= i_end_loc; i++) { + arr[I2V(i,j,loc_K-n_ghost_layers+k)] += bkp_r[k*loc_I_excl_ghost*loc_J_excl_ghost + (j-j_start_loc)*loc_I_excl_ghost + (i-i_start_loc)]/_2_CR; + } + } + } + } + + //stdout_by_main("Preparation ghost layers done."); +} + + + +void Grid::send_recev_boundary_data(CUSTOMREAL* arr){ + prepare_boundary_data_to_send(arr); + + // i-direction negative + if (neighbors_id[0] != -1) { + // send boundary layer to neighbor + isend_cr(bin_s, n_grid_bound_i*n_ghost_layers, neighbors_id[0], mpi_send_reqs[0]); + // receive boundary layer from neighbor + irecv_cr(bin_r, n_grid_bound_i*n_ghost_layers, neighbors_id[0], mpi_recv_reqs[0]); + } + // i-direction positive + if (neighbors_id[1] != -1) { + // send boundary layer to neighbor + isend_cr(bip_s, n_grid_bound_i*n_ghost_layers, neighbors_id[1], mpi_send_reqs[1]); + // receive boundary layer from neighbor + irecv_cr(bip_r, n_grid_bound_i*n_ghost_layers, neighbors_id[1], mpi_recv_reqs[1]); + } + // j-direction negative + if (neighbors_id[2] != -1) { + // send boundary layer to neighbor + isend_cr(bjn_s, n_grid_bound_j*n_ghost_layers, neighbors_id[2], mpi_send_reqs[2]); + // receive boundary layer from neighbor + irecv_cr(bjn_r, n_grid_bound_j*n_ghost_layers, neighbors_id[2], mpi_recv_reqs[2]); + } + // j-direction positive + if (neighbors_id[3] != -1) { + // send boundary layer to neighbor + isend_cr(bjp_s, n_grid_bound_j*n_ghost_layers, neighbors_id[3], mpi_send_reqs[3]); + // receive boundary layer from neighbor + irecv_cr(bjp_r, n_grid_bound_j*n_ghost_layers, neighbors_id[3], mpi_recv_reqs[3]); + } + // k-direction negative + if (neighbors_id[4] != -1) { + // send boundary layer to neighbor + isend_cr(bkn_s, n_grid_bound_k*n_ghost_layers, neighbors_id[4], mpi_send_reqs[4]); + // receive boundary layer from neighbor + irecv_cr(bkn_r, n_grid_bound_k*n_ghost_layers, neighbors_id[4], mpi_recv_reqs[4]); + } + // k-direction positive + if (neighbors_id[5] != -1) { + // send boundary layer to neighbor + isend_cr(bkp_s, n_grid_bound_k*n_ghost_layers, neighbors_id[5], mpi_send_reqs[5]); + // receive boundary layer from neighbor + irecv_cr(bkp_r, n_grid_bound_k*n_ghost_layers, neighbors_id[5], mpi_recv_reqs[5]); + } + + // wait for finishing communication + for (int i = 0; i < 6; i++) { + if (neighbors_id[i] != -1) { + wait_req(mpi_send_reqs[i]); + wait_req(mpi_recv_reqs[i]); + } + } + + // THIS SYNCHRONIZATION IS IMPORTANT. + synchronize_all_inter(); + + assign_received_data_to_ghost(arr); + +} + + +void Grid::send_recev_boundary_data_av(CUSTOMREAL* arr){ + prepare_boundary_data_to_send(arr); + + // i-direction negative + if (neighbors_id[0] != -1) { + // send boundary layer to neighbor + isend_cr(bin_s, n_grid_bound_i*n_ghost_layers, neighbors_id[0], mpi_send_reqs[0]); + // receive boundary layer from neighbor + irecv_cr(bin_r, n_grid_bound_i*n_ghost_layers, neighbors_id[0], mpi_recv_reqs[0]); + } + // i-direction positive + if (neighbors_id[1] != -1) { + // send boundary layer to neighbor + isend_cr(bip_s, n_grid_bound_i*n_ghost_layers, neighbors_id[1], mpi_send_reqs[1]); + // receive boundary layer from neighbor + irecv_cr(bip_r, n_grid_bound_i*n_ghost_layers, neighbors_id[1], mpi_recv_reqs[1]); + } + // j-direction negative + if (neighbors_id[2] != -1) { + // send boundary layer to neighbor + isend_cr(bjn_s, n_grid_bound_j*n_ghost_layers, neighbors_id[2], mpi_send_reqs[2]); + // receive boundary layer from neighbor + irecv_cr(bjn_r, n_grid_bound_j*n_ghost_layers, neighbors_id[2], mpi_recv_reqs[2]); + } + // j-direction positive + if (neighbors_id[3] != -1) { + // send boundary layer to neighbor + isend_cr(bjp_s, n_grid_bound_j*n_ghost_layers, neighbors_id[3], mpi_send_reqs[3]); + // receive boundary layer from neighbor + irecv_cr(bjp_r, n_grid_bound_j*n_ghost_layers, neighbors_id[3], mpi_recv_reqs[3]); + } + // k-direction negative + if (neighbors_id[4] != -1) { + // send boundary layer to neighbor + isend_cr(bkn_s, n_grid_bound_k*n_ghost_layers, neighbors_id[4], mpi_send_reqs[4]); + // receive boundary layer from neighbor + irecv_cr(bkn_r, n_grid_bound_k*n_ghost_layers, neighbors_id[4], mpi_recv_reqs[4]); + } + // k-direction positive + if (neighbors_id[5] != -1) { + // send boundary layer to neighbor + isend_cr(bkp_s, n_grid_bound_k*n_ghost_layers, neighbors_id[5], mpi_send_reqs[5]); + // receive boundary layer from neighbor + irecv_cr(bkp_r, n_grid_bound_k*n_ghost_layers, neighbors_id[5], mpi_recv_reqs[5]); + } + + // wait for finishing communication + for (int i = 0; i < 6; i++) { + if (neighbors_id[i] != -1) { + wait_req(mpi_send_reqs[i]); + wait_req(mpi_recv_reqs[i]); + } + } + + assign_received_data_to_ghost_av(arr); + +} + + +void Grid::prepare_boundary_data_to_send_kosumi(CUSTOMREAL* arr) { + // ij nn + if (neighbors_id_ij[0] != -1) + for (int k = k_start_loc; k <= k_end_vis; k++) + bij_nn_s[k-k_start_loc] = arr[I2V(i_start_loc,j_start_loc,k)]; + // ij np + if (neighbors_id_ij[1] != -1) + for (int k = k_start_loc; k <= k_end_vis; k++) + bij_np_s[k-k_start_loc] = arr[I2V(i_start_loc,j_end_loc,k)]; + // ij pn + if (neighbors_id_ij[2] != -1) + for (int k = k_start_loc; k <= k_end_vis; k++) + bij_pn_s[k-k_start_loc] = arr[I2V(i_end_loc,j_start_loc,k)]; + // ij pp + if (neighbors_id_ij[3] != -1) + for (int k = k_start_loc; k <= k_end_vis; k++) + bij_pp_s[k-k_start_loc] = arr[I2V(i_end_loc,j_end_loc,k)]; + // jk nn + if (neighbors_id_jk[0] != -1) + for (int i = i_start_loc; i <= i_end_vis; i++) + bjk_nn_s[i-i_start_loc] = arr[I2V(i,j_start_loc,k_start_loc)]; + // jk np + if (neighbors_id_jk[1] != -1) + for (int i = i_start_loc; i <= i_end_vis; i++) + bjk_np_s[i-i_start_loc] = arr[I2V(i,j_start_loc,k_end_loc)]; + // jk pn + if (neighbors_id_jk[2] != -1) + for (int i = i_start_loc; i <= i_end_vis; i++) + bjk_pn_s[i-i_start_loc] = arr[I2V(i,j_end_loc,k_start_loc)]; + // jk pp + if (neighbors_id_jk[3] != -1) + for (int i = i_start_loc; i <= i_end_vis; i++) + bjk_pp_s[i-i_start_loc] = arr[I2V(i,j_end_loc,k_end_loc)]; + // ik nn + if (neighbors_id_ik[0] != -1) + for (int j = j_start_loc; j <= j_end_vis; j++) + bik_nn_s[j-j_start_loc] = arr[I2V(i_start_loc,j,k_start_loc)]; + // ik np + if (neighbors_id_ik[1] != -1) + for (int j = j_start_loc; j <= j_end_vis; j++) + bik_np_s[j-j_start_loc] = arr[I2V(i_start_loc,j,k_end_loc)]; + // ik pn + if (neighbors_id_ik[2] != -1) + for (int j = j_start_loc; j <= j_end_vis; j++) + bik_pn_s[j-j_start_loc] = arr[I2V(i_end_loc,j,k_start_loc)]; + // ik pp + if (neighbors_id_ik[3] != -1) + for (int j = j_start_loc; j <= j_end_vis; j++) + bik_pp_s[j-j_start_loc] = arr[I2V(i_end_loc,j,k_end_loc)]; + // ijk nnn + if (neighbors_id_ijk[0] != -1) + bijk_nnn_s[0] = arr[I2V(i_start_loc,j_start_loc,k_start_loc)]; + // ijk nnp + if (neighbors_id_ijk[1] != -1) + bijk_nnp_s[0] = arr[I2V(i_start_loc,j_start_loc,k_end_loc)]; + // ijk npn + if (neighbors_id_ijk[2] != -1) + bijk_npn_s[0] = arr[I2V(i_start_loc,j_end_loc,k_start_loc)]; + // ijk npp + if (neighbors_id_ijk[3] != -1) + bijk_npp_s[0] = arr[I2V(i_start_loc,j_end_loc,k_end_loc)]; + // ijk pnn + if (neighbors_id_ijk[4] != -1) + bijk_pnn_s[0] = arr[I2V(i_end_loc,j_start_loc,k_start_loc)]; + // ijk pnp + if (neighbors_id_ijk[5] != -1) + bijk_pnp_s[0] = arr[I2V(i_end_loc,j_start_loc,k_end_loc)]; + // ijk ppn + if (neighbors_id_ijk[6] != -1) + bijk_ppn_s[0] = arr[I2V(i_end_loc,j_end_loc,k_start_loc)]; + // ijk ppp + if (neighbors_id_ijk[7] != -1) + bijk_ppp_s[0] = arr[I2V(i_end_loc,j_end_loc,k_end_loc)]; +} + + +void Grid::assign_received_data_to_ghost_kosumi(CUSTOMREAL* arr) { + // ij nn + if (neighbors_id_ij[0] != -1) + for (int k = k_start_loc; k <= k_end_vis; k++) + arr[I2V(i_start_loc-1,j_start_loc-1,k)] = bij_nn_r[k-k_start_loc]; + // ij np + if (neighbors_id_ij[1] != -1) + for (int k = k_start_loc; k <= k_end_vis; k++) + arr[I2V(i_start_loc-1,j_end_vis,k)] = bij_np_r[k-k_start_loc]; + // ij pn + if (neighbors_id_ij[2] != -1) + for (int k = k_start_loc; k <= k_end_vis; k++) + arr[I2V(i_end_vis,j_start_loc-1,k)] = bij_pn_r[k-k_start_loc]; + // ij pp + if (neighbors_id_ij[3] != -1) + for (int k = k_start_loc; k <= k_end_vis; k++) + arr[I2V(i_end_vis,j_end_loc+1,k)] = bij_pp_r[k-k_start_loc]; + // jk nn + if (neighbors_id_jk[0] != -1) + for (int i = i_start_loc; i <= i_end_vis; i++) + arr[I2V(i,j_start_loc-1,k_start_loc-1)] = bjk_nn_r[i-i_start_loc]; + // jk np + if (neighbors_id_jk[1] != -1) + for (int i = i_start_loc; i <= i_end_vis; i++) + arr[I2V(i,j_start_loc-1,k_end_vis)] = bjk_np_r[i-i_start_loc]; + // jk pn + if (neighbors_id_jk[2] != -1) + for (int i = i_start_loc; i <= i_end_vis; i++) + arr[I2V(i,j_end_vis,k_start_loc-1)] = bjk_pn_r[i-i_start_loc]; + // jk pp + if (neighbors_id_jk[3] != -1) + for (int i = i_start_loc; i <= i_end_vis; i++) + arr[I2V(i,j_end_vis,k_end_vis)] = bjk_pp_r[i-i_start_loc]; + // ik nn + if (neighbors_id_ik[0] != -1) + for (int j = j_start_loc; j <= j_end_vis; j++) + arr[I2V(i_start_loc-1,j,k_start_loc-1)] = bik_nn_r[j-j_start_loc]; + // ik np + if (neighbors_id_ik[1] != -1) + for (int j = j_start_loc; j <= j_end_vis; j++) + arr[I2V(i_start_loc-1,j,k_end_vis)] = bik_np_r[j-j_start_loc]; + // ik pn + if (neighbors_id_ik[2] != -1) + for (int j = j_start_loc; j <= j_end_vis; j++) + arr[I2V(i_end_vis,j,k_start_loc-1)] = bik_pn_r[j-j_start_loc]; + // ik pp + if (neighbors_id_ik[3] != -1) + for (int j = j_start_loc; j <= j_end_vis; j++) + arr[I2V(i_end_vis,j,k_end_vis)] = bik_pp_r[j-j_start_loc]; + // ijk nnn + if (neighbors_id_ijk[0] != -1) + arr[I2V(i_start_loc-1,j_start_loc-1,k_start_loc-1)] = bijk_nnn_r[0]; + // ijk nnp + if (neighbors_id_ijk[1] != -1) + arr[I2V(i_start_loc-1,j_start_loc-1,k_end_vis)] = bijk_nnp_r[0]; + // ijk npn + if (neighbors_id_ijk[2] != -1) + arr[I2V(i_start_loc-1,j_end_vis,k_start_loc-1)] = bijk_npn_r[0]; + // ijk npp + if (neighbors_id_ijk[3] != -1) + arr[I2V(i_start_loc-1,j_end_vis,k_end_vis)] = bijk_npp_r[0]; + // ijk pnn + if (neighbors_id_ijk[4] != -1) + arr[I2V(i_end_vis,j_start_loc-1,k_start_loc-1)] = bijk_pnn_r[0]; + // ijk pnp + if (neighbors_id_ijk[5] != -1) + arr[I2V(i_end_vis,j_start_loc-1,k_end_vis)] = bijk_pnp_r[0]; + // ijk ppn + if (neighbors_id_ijk[6] != -1) + arr[I2V(i_end_vis,j_end_vis,k_start_loc-1)] = bijk_ppn_r[0]; + // ijk ppp + if (neighbors_id_ijk[7] != -1) + arr[I2V(i_end_vis,j_end_vis,k_end_vis)] = bijk_ppp_r[0]; + +} + + +void Grid::send_recev_boundary_data_kosumi(CUSTOMREAL* arr){ + + prepare_boundary_data_to_send_kosumi(arr); + + // ij nn + if (neighbors_id_ij[0] != -1){ + // send boundary layer to neighbor + isend_cr(bij_nn_s, loc_K_vis, neighbors_id_ij[0], mpi_send_reqs_kosumi[0]); + // receive boundary layer from neighbor + irecv_cr(bij_nn_r, loc_K_vis, neighbors_id_ij[0], mpi_recv_reqs_kosumi[0]); + } + // ij np + if (neighbors_id_ij[1] != -1){ + // send boundary layer to neighbor + isend_cr(bij_np_s, loc_K_vis, neighbors_id_ij[1], mpi_send_reqs_kosumi[1]); + // receive boundary layer from neighbor + irecv_cr(bij_np_r, loc_K_vis, neighbors_id_ij[1], mpi_recv_reqs_kosumi[1]); + } + // ij pn + if (neighbors_id_ij[2] != -1){ + // send boundary layer to neighbor + isend_cr(bij_pn_s, loc_K_vis, neighbors_id_ij[2], mpi_send_reqs_kosumi[2]); + // receive boundary layer from neighbor + irecv_cr(bij_pn_r, loc_K_vis, neighbors_id_ij[2], mpi_recv_reqs_kosumi[2]); + } + // ij pp + if (neighbors_id_ij[3] != -1){ + // send boundary layer to neighbor + isend_cr(bij_pp_s, loc_K_vis, neighbors_id_ij[3], mpi_send_reqs_kosumi[3]); + // receive boundary layer from neighbor + irecv_cr(bij_pp_r, loc_K_vis, neighbors_id_ij[3], mpi_recv_reqs_kosumi[3]); + } + // jk nn + if (neighbors_id_jk[0] != -1){ + // send boundary layer to neighbor + isend_cr(bjk_nn_s, loc_I_vis, neighbors_id_jk[0], mpi_send_reqs_kosumi[4]); + // receive boundary layer from neighbor + irecv_cr(bjk_nn_r, loc_I_vis, neighbors_id_jk[0], mpi_recv_reqs_kosumi[4]); + } + // jk np + if (neighbors_id_jk[1] != -1){ + // send boundary layer to neighbor + isend_cr(bjk_np_s, loc_I_vis, neighbors_id_jk[1], mpi_send_reqs_kosumi[5]); + // receive boundary layer from neighbor + irecv_cr(bjk_np_r, loc_I_vis, neighbors_id_jk[1], mpi_recv_reqs_kosumi[5]); + } + // jk pn + if (neighbors_id_jk[2] != -1){ + // send boundary layer to neighbor + isend_cr(bjk_pn_s, loc_I_vis, neighbors_id_jk[2], mpi_send_reqs_kosumi[6]); + // receive boundary layer from neighbor + irecv_cr(bjk_pn_r, loc_I_vis, neighbors_id_jk[2], mpi_recv_reqs_kosumi[6]); + } + // jk pp + if (neighbors_id_jk[3] != -1){ + // send boundary layer to neighbor + isend_cr(bjk_pp_s, loc_I_vis, neighbors_id_jk[3], mpi_send_reqs_kosumi[7]); + // receive boundary layer from neighbor + irecv_cr(bjk_pp_r, loc_I_vis, neighbors_id_jk[3], mpi_recv_reqs_kosumi[7]); + } + // ik nn + if (neighbors_id_ik[0] != -1){ + // send boundary layer to neighbor + isend_cr(bik_nn_s, loc_J_vis, neighbors_id_ik[0], mpi_send_reqs_kosumi[8]); + // receive boundary layer from neighbor + irecv_cr(bik_nn_r, loc_J_vis, neighbors_id_ik[0], mpi_recv_reqs_kosumi[8]); + } + // ik np + if (neighbors_id_ik[1] != -1){ + // send boundary layer to neighbor + isend_cr(bik_np_s, loc_J_vis, neighbors_id_ik[1], mpi_send_reqs_kosumi[9]); + // receive boundary layer from neighbor + irecv_cr(bik_np_r, loc_J_vis, neighbors_id_ik[1], mpi_recv_reqs_kosumi[9]); + } + // ik pn + if (neighbors_id_ik[2] != -1){ + // send boundary layer to neighbor + isend_cr(bik_pn_s, loc_J_vis, neighbors_id_ik[2], mpi_send_reqs_kosumi[10]); + // receive boundary layer from neighbor + irecv_cr(bik_pn_r, loc_J_vis, neighbors_id_ik[2], mpi_recv_reqs_kosumi[10]); + } + // ik pp + if (neighbors_id_ik[3] != -1){ + // send boundary layer to neighbor + isend_cr(bik_pp_s, loc_J_vis, neighbors_id_ik[3], mpi_send_reqs_kosumi[11]); + // receive boundary layer from neighbor + irecv_cr(bik_pp_r, loc_J_vis, neighbors_id_ik[3], mpi_recv_reqs_kosumi[11]); + } + // ijk nnn + if (neighbors_id_ijk[0] != -1){ + // send boundary layer to neighbor + isend_cr(bijk_nnn_s, 1, neighbors_id_ijk[0], mpi_send_reqs_kosumi[12]); + // receive boundary layer from neighbor + irecv_cr(bijk_nnn_r, 1, neighbors_id_ijk[0], mpi_recv_reqs_kosumi[12]); + } + // ijk nnp + if (neighbors_id_ijk[1] != -1){ + // send boundary layer to neighbor + isend_cr(bijk_nnp_s, 1, neighbors_id_ijk[1], mpi_send_reqs_kosumi[13]); + // receive boundary layer from neighbor + irecv_cr(bijk_nnp_r, 1, neighbors_id_ijk[1], mpi_recv_reqs_kosumi[13]); + } + // ijk npn + if (neighbors_id_ijk[2] != -1){ + // send boundary layer to neighbor + isend_cr(bijk_npn_s, 1, neighbors_id_ijk[2], mpi_send_reqs_kosumi[14]); + // receive boundary layer from neighbor + irecv_cr(bijk_npn_r, 1, neighbors_id_ijk[2], mpi_recv_reqs_kosumi[14]); + } + // ijk npp + if (neighbors_id_ijk[3] != -1){ + // send boundary layer to neighbor + isend_cr(bijk_npp_s, 1, neighbors_id_ijk[3], mpi_send_reqs_kosumi[15]); + // receive boundary layer from neighbor + irecv_cr(bijk_npp_r, 1, neighbors_id_ijk[3], mpi_recv_reqs_kosumi[15]); + } + // ijk pnn + if (neighbors_id_ijk[4] != -1){ + // send boundary layer to neighbor + isend_cr(bijk_pnn_s, 1, neighbors_id_ijk[4], mpi_send_reqs_kosumi[16]); + // receive boundary layer from neighbor + irecv_cr(bijk_pnn_r, 1, neighbors_id_ijk[4], mpi_recv_reqs_kosumi[16]); + } + // ijk pnp + if (neighbors_id_ijk[5] != -1){ + // send boundary layer to neighbor + isend_cr(bijk_pnp_s, 1, neighbors_id_ijk[5], mpi_send_reqs_kosumi[17]); + // receive boundary layer from neighbor + irecv_cr(bijk_pnp_r, 1, neighbors_id_ijk[5], mpi_recv_reqs_kosumi[17]); + } + // ijk ppn + if (neighbors_id_ijk[6] != -1){ + // send boundary layer to neighbor + isend_cr(bijk_ppn_s, 1, neighbors_id_ijk[6], mpi_send_reqs_kosumi[18]); + // receive boundary layer from neighbor + irecv_cr(bijk_ppn_r, 1, neighbors_id_ijk[6], mpi_recv_reqs_kosumi[18]); + } + // ijk ppp + if (neighbors_id_ijk[7] != -1){ + // send boundary layer to neighbor + isend_cr(bijk_ppp_s, 1, neighbors_id_ijk[7], mpi_send_reqs_kosumi[19]); + // receive boundary layer from neighbor + irecv_cr(bijk_ppp_r, 1, neighbors_id_ijk[7], mpi_recv_reqs_kosumi[19]); + } + + // wait for all communication to finish + // ij nn + if (neighbors_id_ij[0] != -1){ + wait_req(mpi_send_reqs_kosumi[0]); + wait_req(mpi_recv_reqs_kosumi[0]); + } + // ij np + if (neighbors_id_ij[1] != -1){ + wait_req(mpi_send_reqs_kosumi[1]); + wait_req(mpi_recv_reqs_kosumi[1]); + } + // ij pn + if (neighbors_id_ij[2] != -1){ + wait_req(mpi_send_reqs_kosumi[2]); + wait_req(mpi_recv_reqs_kosumi[2]); + } + // ij pp + if (neighbors_id_ij[3] != -1){ + wait_req(mpi_send_reqs_kosumi[3]); + wait_req(mpi_recv_reqs_kosumi[3]); + } + // jk nn + if (neighbors_id_jk[0] != -1){ + wait_req(mpi_send_reqs_kosumi[4]); + wait_req(mpi_recv_reqs_kosumi[4]); + } + // jk np + if (neighbors_id_jk[1] != -1){ + wait_req(mpi_send_reqs_kosumi[5]); + wait_req(mpi_recv_reqs_kosumi[5]); + } + // jk pn + if (neighbors_id_jk[2] != -1){ + wait_req(mpi_send_reqs_kosumi[6]); + wait_req(mpi_recv_reqs_kosumi[6]); + } + // jk pp + if (neighbors_id_jk[3] != -1){ + wait_req(mpi_send_reqs_kosumi[7]); + wait_req(mpi_recv_reqs_kosumi[7]); + } + // ik nn + if (neighbors_id_ik[0] != -1){ + wait_req(mpi_send_reqs_kosumi[8]); + wait_req(mpi_recv_reqs_kosumi[8]); + } + // ik np + if (neighbors_id_ik[1] != -1){ + wait_req(mpi_send_reqs_kosumi[9]); + wait_req(mpi_recv_reqs_kosumi[9]); + } + // ik pn + if (neighbors_id_ik[2] != -1){ + wait_req(mpi_send_reqs_kosumi[10]); + wait_req(mpi_recv_reqs_kosumi[10]); + } + // ik pp + if (neighbors_id_ik[3] != -1){ + wait_req(mpi_send_reqs_kosumi[11]); + wait_req(mpi_recv_reqs_kosumi[11]); + } + // ijk nnn + if (neighbors_id_ijk[0] != -1){ + wait_req(mpi_send_reqs_kosumi[12]); + wait_req(mpi_recv_reqs_kosumi[12]); + } + // ijk nnp + if (neighbors_id_ijk[1] != -1){ + wait_req(mpi_send_reqs_kosumi[13]); + wait_req(mpi_recv_reqs_kosumi[13]); + } + // ijk npn + if (neighbors_id_ijk[2] != -1){ + wait_req(mpi_send_reqs_kosumi[14]); + wait_req(mpi_recv_reqs_kosumi[14]); + } + // ijk npp + if (neighbors_id_ijk[3] != -1){ + wait_req(mpi_send_reqs_kosumi[15]); + wait_req(mpi_recv_reqs_kosumi[15]); + } + // ijk pnn + if (neighbors_id_ijk[4] != -1){ + wait_req(mpi_send_reqs_kosumi[16]); + wait_req(mpi_recv_reqs_kosumi[16]); + } + // ijk pnp + if (neighbors_id_ijk[5] != -1){ + wait_req(mpi_send_reqs_kosumi[17]); + wait_req(mpi_recv_reqs_kosumi[17]); + } + // ijk ppn + if (neighbors_id_ijk[6] != -1){ + wait_req(mpi_send_reqs_kosumi[18]); + wait_req(mpi_recv_reqs_kosumi[18]); + } + // ijk ppp + if (neighbors_id_ijk[7] != -1){ + wait_req(mpi_send_reqs_kosumi[19]); + wait_req(mpi_recv_reqs_kosumi[19]); + } + + assign_received_data_to_ghost_kosumi(arr); + +} + + +void Grid::calc_T_plus_tau() { + // calculate T_plus_tau + for (int k_r = 0; k_r < loc_K; k_r++) { + for (int j_lat = 0; j_lat < loc_J; j_lat++) { + for (int i_lon = 0; i_lon < loc_I; i_lon++) { + // T0*tau + T_loc[I2V(i_lon,j_lat,k_r)] = T0v_loc[I2V(i_lon,j_lat,k_r)] * tau_loc[I2V(i_lon,j_lat,k_r)]; + + } + } + } +} + + +void Grid::calc_residual() { + for (int k_r = 0; k_r < loc_K; k_r++) { + for (int j_lat = 0; j_lat < loc_J; j_lat++) { + for (int i_lon = 0; i_lon < loc_I; i_lon++) { + u_loc[I2V(i_lon,j_lat,k_r)] = u_loc[I2V(i_lon,j_lat,k_r)] - T_loc[I2V(i_lon,j_lat,k_r)]; + } + } + } +} + + diff --git a/src/input_params.cpp b/src/input_params.cpp new file mode 100644 index 0000000..95edd1e --- /dev/null +++ b/src/input_params.cpp @@ -0,0 +1,3291 @@ +#include "input_params.h" +#include +#include + +// Base case of the variadic template function +template +void getNodeValue(const YAML::Node& node, const std::string& key, T& value) { + if (node[key]) { + try { + value = node[key].as(); + } catch (const YAML::Exception& e) { + std::cout << "Error parsing YAML value for key: " << key << ". " << e.what() << std::endl; + } + } else { + std::cout << "Key not found in YAML: " << key << std::endl; + } +} + +// function overload for reading array +template +void getNodeValue(const YAML::Node& node, const std::string& key, T& value, const int index) { + if (node[key]) { + try { + value = node[key][index].as(); + } catch (const YAML::Exception& e) { + std::cout << "Error parsing YAML value for key: " << key << ". " << e.what() << std::endl; + } + } else { + std::cout << "Key not found in YAML: " << key << std::endl; + } +} + + +InputParams::InputParams(std::string& input_file){ + + if (world_rank == 0) { + // parse input files + YAML::Node config = YAML::LoadFile(input_file); + + // + // domain + // + if (config["domain"]) { + // minimum and maximum depth + getNodeValue(config["domain"], "min_max_dep", min_dep, 0); + getNodeValue(config["domain"], "min_max_dep", max_dep, 1); + // minimum and maximum latitude + if (config["domain"]["min_max_lat"]) { + getNodeValue(config["domain"], "min_max_lat", min_lat, 0); + getNodeValue(config["domain"], "min_max_lat", max_lat, 1); + } + // minimum and maximum longitude + if (config["domain"]["min_max_lon"]) { + getNodeValue(config["domain"], "min_max_lon", min_lon, 0); + getNodeValue(config["domain"], "min_max_lon", max_lon, 1); + } + // number of grid nodes on each axis r(dep), t(lat), p(lon) + if (config["domain"]["n_rtp"]) { + getNodeValue(config["domain"], "n_rtp", ngrid_k, 0); + getNodeValue(config["domain"], "n_rtp", ngrid_j, 1); + getNodeValue(config["domain"], "n_rtp", ngrid_i, 2); + } + } else { + std::cout << "domain is not defined. stop." << std::endl; + exit(1); + } + + // + // source + // + if (config["source"]) { + // src rec file + if (config["source"]["src_rec_file"]) { + src_rec_file_exist = true; + getNodeValue(config["source"], "src_rec_file", src_rec_file); + } else { + std::cout << "ERROR, tag src_rec_file is not included. Please check YAML file." << std::endl; + exit(1); + } + // swap src rec + if (config["source"]["swap_src_rec"]) { + getNodeValue(config["source"], "swap_src_rec", swap_src_rec); + } + } else { + std::cout << "source is not defined. stop." << std::endl; + exit(1); + } + + // + // model + // + if (config["model"]) { + // model file path + if (config["model"]["init_model_path"]) { + getNodeValue(config["model"], "init_model_path", init_model_path); + } else { + std::cout << "WARNING: tag init_model_path is not included. Please check YAML file." << std::endl; + } + // model file path + if (config["model"]["model_1d_name"]) { + getNodeValue(config["model"], "model_1d_name", model_1d_name); + } + } else { + std::cout << "model is not defined. stop." << std::endl; + exit(1); + } + + // + // parallel + // + if (config["parallel"]) { + // number of simultaneous runs + if(config["parallel"]["n_sims"]) { + getNodeValue(config["parallel"], "n_sims", n_sims); + } + // number of subdomains + if (config["parallel"]["ndiv_rtp"]) { + getNodeValue(config["parallel"], "ndiv_rtp", ndiv_k, 0); + getNodeValue(config["parallel"], "ndiv_rtp", ndiv_j, 1); + getNodeValue(config["parallel"], "ndiv_rtp", ndiv_i, 2); + } + // number of processes in each subdomain + if (config["parallel"]["nproc_sub"]) { + getNodeValue(config["parallel"], "nproc_sub", n_subprocs); + } + // gpu flag + if (config["parallel"]["use_gpu"]) { + getNodeValue(config["parallel"], "use_gpu", use_gpu); + } + } + + // + // output setting + // + if (config["output_setting"]) { + // output path + if (config["output_setting"]["output_dir"]) + getNodeValue(config["output_setting"], "output_dir", output_dir); + + if (config["output_setting"]["output_source_field"]) + getNodeValue(config["output_setting"], "output_source_field", output_source_field); + + if (config["output_setting"]["output_kernel"]) + getNodeValue(config["output_setting"], "output_kernel", output_kernel); + + if (config["output_setting"]["verbose_output_level"]){ + getNodeValue(config["output_setting"], "verbose_output_level", verbose_output_level); + // currently only 0 or 1 is defined + if (verbose_output_level > 1) { + std::cout << "undefined verbose_output_level. stop." << std::endl; + //MPI_Finalize(); + exit(1); + } + } + + if (config["output_setting"]["output_final_model"]) + getNodeValue(config["output_setting"], "output_final_model", output_final_model); + + if (config["output_setting"]["output_middle_model"]) + getNodeValue(config["output_setting"], "output_middle_model", output_middle_model); + + if (config["output_setting"]["output_in_process"]) + getNodeValue(config["output_setting"], "output_in_process", output_in_process); + + if (config["output_setting"]["output_in_process_data"]) + getNodeValue(config["output_setting"], "output_in_process_data", output_in_process_data); + + if (config["output_setting"]["single_precision_output"]) + getNodeValue(config["output_setting"], "single_precision_output", single_precision_output); + + // output file format + if (config["output_setting"]["output_file_format"]) { + int ff_flag; + getNodeValue(config["output_setting"], "output_file_format", ff_flag); + if (ff_flag == 0){ + #if USE_HDF5 + output_format = OUTPUT_FORMAT_HDF5; + #else + std::cout << "output_file_format is 0, but the code is compiled without HDF5. stop." << std::endl; + //MPI_Finalize(); + exit(1); + #endif + } else if (ff_flag == 1){ + output_format = OUTPUT_FORMAT_ASCII; + } else { + std::cout << "undefined output_file_format. stop." << std::endl; + //MPI_Finalize(); + exit(1); + } + } + } + + // + // run mode + // + if (config["run_mode"]) { + getNodeValue(config, "run_mode", run_mode); + if (run_mode > 4) { + std::cout << "undefined run_mode. stop." << std::endl; + //MPI_Finalize(); + exit(1); + } + } + + if (config["have_tele_data"]) { + getNodeValue(config, "have_tele_data", have_tele_data); + } + + if (config["ignore_velocity_discontinuity"]) { + getNodeValue(config, "ignore_velocity_discontinuity", ignore_velocity_discontinuity); + } + + // + // model update + // + if (config["model_update"]) { + // number of max iteration for inversion + if (config["model_update"]["max_iterations"]) { + getNodeValue(config["model_update"], "max_iterations", max_iter_inv); + } + // optim_method + if (config["model_update"]["optim_method"]) { + getNodeValue(config["model_update"], "optim_method", optim_method); + if (optim_method > 2) { + std::cout << "undefined optim_method. stop." << std::endl; + //MPI_Finalize(); + exit(1); + } + } + // step_length + if (config["model_update"]["step_length"]) { + getNodeValue(config["model_update"], "step_length", step_length_init); + } + + // parameters for optim_method == 0 + if (optim_method == 0) { + // step method + if (config["model_update"]["optim_method_0"]["step_method"]) { + getNodeValue(config["model_update"]["optim_method_0"], "step_method", step_method); + } + // step length decay + if (config["model_update"]["optim_method_0"]["step_length_decay"]) { + getNodeValue(config["model_update"]["optim_method_0"], "step_length_decay", step_length_decay); + } + if (config["model_update"]["optim_method_0"]["step_length_gradient_angle"]) { + getNodeValue(config["model_update"]["optim_method_0"], "step_length_gradient_angle", step_length_gradient_angle); + } + if (config["model_update"]["optim_method_0"]["step_length_change"]) { + getNodeValue(config["model_update"]["optim_method_0"], "step_length_change", step_length_down,0); + getNodeValue(config["model_update"]["optim_method_0"], "step_length_change", step_length_up,1); + } + if (config["model_update"]["optim_method_0"]["Kdensity_coe"]) { + getNodeValue(config["model_update"]["optim_method_0"], "Kdensity_coe", Kdensity_coe); + if (Kdensity_coe < 0.0){ + Kdensity_coe = 0.0; + std::cout << std::endl; + std::cout << "Kdensity_coe: " << Kdensity_coe << " is out of range, which is set to be 0.0 in the inversion." << std::endl; + std::cout << std::endl; + } + if (Kdensity_coe > 0.95){ + Kdensity_coe = 0.95; + std::cout << std::endl; + std::cout << "Kdensity_coe: " << Kdensity_coe << " is out of range, which is set to be 0.95 in the inversion." << std::endl; + std::cout << std::endl; + } + } + } + + // parameters for optim_method == 1 or 2 + if (optim_method == 1 || optim_method == 2) { + // max_sub_iterations + if (config["model_update"]["optim_method_1_2"]["max_sub_iterations"]) { + getNodeValue(config["model_update"]["optim_method_1_2"], "max_sub_iterations", max_sub_iterations); + } + // regularization weight + if (config["model_update"]["optim_method_1_2"]["regularization_weight"]) { + getNodeValue(config["model_update"]["optim_method_1_2"], "regularization_weight", regularization_weight); + } + // regularization laplacian weights + if (config["model_update"]["optim_method_1_2"]["coefs_regulalization_rtp"]) { + getNodeValue(config["model_update"]["optim_method_1_2"], "coefs_regulalization_rtp", regul_lr, 0); + getNodeValue(config["model_update"]["optim_method_1_2"], "coefs_regulalization_rtp", regul_lt, 1); + getNodeValue(config["model_update"]["optim_method_1_2"], "coefs_regulalization_rtp", regul_lp, 2); + + // convert degree to radian + regul_lt = regul_lt * DEG2RAD; + regul_lp = regul_lp * DEG2RAD; + } + } + + // smoothing + if (config["model_update"]["smoothing"]["smooth_method"]) { + getNodeValue(config["model_update"]["smoothing"], "smooth_method", smooth_method); + if (smooth_method > 1) { + std::cout << "undefined smooth_method. stop." << std::endl; + MPI_Finalize(); + exit(1); + } + } + // l_smooth_rtp + if (config["model_update"]["smoothing"]["l_smooth_rtp"]) { + getNodeValue(config["model_update"]["smoothing"], "l_smooth_rtp", smooth_lr, 0); + getNodeValue(config["model_update"]["smoothing"], "l_smooth_rtp", smooth_lt, 1); + getNodeValue(config["model_update"]["smoothing"], "l_smooth_rtp", smooth_lp, 2); + + // convert degree to radian + smooth_lt = smooth_lt * DEG2RAD; + smooth_lp = smooth_lp * DEG2RAD; + } + // n_inversion_grid + if (config["model_update"]["n_inversion_grid"]) { + getNodeValue(config["model_update"], "n_inversion_grid", n_inversion_grid); + } + + // auto inversion grid + if (config["model_update"]["uniform_inv_grid_dep"]) { + getNodeValue(config["model_update"], "uniform_inv_grid_dep", uniform_inv_grid_dep); + } + if (config["model_update"]["uniform_inv_grid_lat"]) { + getNodeValue(config["model_update"], "uniform_inv_grid_lat", uniform_inv_grid_lat); + } + if (config["model_update"]["uniform_inv_grid_lon"]) { + getNodeValue(config["model_update"], "uniform_inv_grid_lon", uniform_inv_grid_lon); + } + + // number of inversion grid for regular grid + if (config["model_update"]["n_inv_dep_lat_lon"]) { + getNodeValue(config["model_update"], "n_inv_dep_lat_lon", n_inv_r, 0); + getNodeValue(config["model_update"], "n_inv_dep_lat_lon", n_inv_t, 1); + getNodeValue(config["model_update"], "n_inv_dep_lat_lon", n_inv_p, 2); + } + + // inversion grid positions + if (config["model_update"]["min_max_dep_inv"]) { + getNodeValue(config["model_update"], "min_max_dep_inv", min_dep_inv, 0); + getNodeValue(config["model_update"], "min_max_dep_inv", max_dep_inv, 1); + } + // minimum and maximum latitude + if (config["model_update"]["min_max_lat_inv"]) { + getNodeValue(config["model_update"], "min_max_lat_inv", min_lat_inv, 0); + getNodeValue(config["model_update"], "min_max_lat_inv", max_lat_inv, 1); + } + // minimum and maximum longitude + if (config["model_update"]["min_max_lon_inv"]) { + getNodeValue(config["model_update"], "min_max_lon_inv", min_lon_inv, 0); + getNodeValue(config["model_update"], "min_max_lon_inv", max_lon_inv, 1); + } + + + // flexible inversion grid for velocity + if (config["model_update"]["dep_inv"]){ + n_inv_r_flex = config["model_update"]["dep_inv"].size(); + dep_inv = allocateMemory(n_inv_r_flex, 5000); + for (int i = 0; i < n_inv_r_flex; i++){ + getNodeValue(config["model_update"], "dep_inv", dep_inv[i], i); + } + } else { + if (!uniform_inv_grid_dep){ + std::cout << "dep_inv is not defined. stop." << std::endl; + exit(1); + } + } + if (config["model_update"]["lat_inv"]) { + n_inv_t_flex = config["model_update"]["lat_inv"].size(); + lat_inv = allocateMemory(n_inv_t_flex, 5001); + for (int i = 0; i < n_inv_t_flex; i++){ + getNodeValue(config["model_update"], "lat_inv", lat_inv[i], i); + } + } else { + if (!uniform_inv_grid_lat){ + std::cout << "lat_inv is not defined. stop." << std::endl; + exit(1); + } + } + if (config["model_update"]["lon_inv"]) { + n_inv_p_flex = config["model_update"]["lon_inv"].size(); + lon_inv = allocateMemory(n_inv_p_flex, 5002); + for (int i = 0; i < n_inv_p_flex; i++){ + getNodeValue(config["model_update"], "lon_inv", lon_inv[i], i); + } + } else { + if (!uniform_inv_grid_lon){ + std::cout << "lon_inv is not defined. stop." << std::endl; + exit(1); + } + } + if (config["model_update"]["trapezoid"]) { + for (int i = 0; i < n_trapezoid; i++){ + getNodeValue(config["model_update"], "trapezoid", trapezoid[i], i); + } + } + + // inversion grid for anisotropy + if (config["model_update"]["invgrid_ani"]) { + getNodeValue(config["model_update"], "invgrid_ani", invgrid_ani); + } + + if (config["model_update"]["n_inv_dep_lat_lon_ani"]) { + getNodeValue(config["model_update"], "n_inv_dep_lat_lon_ani", n_inv_r_ani, 0); + getNodeValue(config["model_update"], "n_inv_dep_lat_lon_ani", n_inv_t_ani, 1); + getNodeValue(config["model_update"], "n_inv_dep_lat_lon_ani", n_inv_p_ani, 2); + } + + if (config["model_update"]["min_max_dep_inv_ani"]) { + getNodeValue(config["model_update"], "min_max_dep_inv_ani", min_dep_inv_ani, 0); + getNodeValue(config["model_update"], "min_max_dep_inv_ani", max_dep_inv_ani, 1); + } + + if (config["model_update"]["min_max_lat_inv_ani"]) { + getNodeValue(config["model_update"], "min_max_lat_inv_ani", min_lat_inv_ani, 0); + getNodeValue(config["model_update"], "min_max_lat_inv_ani", max_lat_inv_ani, 1); + } + + if (config["model_update"]["min_max_lon_inv_ani"]) { + getNodeValue(config["model_update"], "min_max_lon_inv_ani", min_lon_inv_ani, 0); + getNodeValue(config["model_update"], "min_max_lon_inv_ani", max_lon_inv_ani, 1); + } + + // flexible inversion grid for anisotropy + if (config["model_update"]["dep_inv_ani"]) { + n_inv_r_flex_ani = config["model_update"]["dep_inv_ani"].size(); + dep_inv_ani = allocateMemory(n_inv_r_flex_ani, 5003); + for (int i = 0; i < n_inv_r_flex_ani; i++){ + getNodeValue(config["model_update"], "dep_inv_ani", dep_inv_ani[i], i); + } + } + + if (config["model_update"]["lat_inv_ani"]) { + n_inv_t_flex_ani = config["model_update"]["lat_inv_ani"].size(); + lat_inv_ani = allocateMemory(n_inv_t_flex_ani, 5004); + for (int i = 0; i < n_inv_t_flex_ani; i++){ + getNodeValue(config["model_update"], "lat_inv_ani", lat_inv_ani[i], i); + } + } + if (config["model_update"]["lon_inv_ani"]) { + n_inv_p_flex_ani = config["model_update"]["lon_inv_ani"].size(); + lon_inv_ani = allocateMemory(n_inv_p_flex_ani, 5005); + for (int i = 0; i < n_inv_p_flex_ani; i++){ + getNodeValue(config["model_update"], "lon_inv_ani", lon_inv_ani[i], i); + } + } + if (config["model_update"]["trapezoid_ani"]) { + for (int i = 0; i < n_trapezoid; i++){ + getNodeValue(config["model_update"], "trapezoid_ani", trapezoid_ani[i], i); + } + } + + setup_uniform_inv_grid(); + + // if (config["model_update"]["invgrid_volume_rescale"]) { + // getNodeValue(config["model_update"], "invgrid_volume_rescale", invgrid_volume_rescale); + // } + + // station correction (now only for teleseismic data) + if (config["model_update"]["use_sta_correction"]){ + getNodeValue(config["model_update"], "use_sta_correction", use_sta_correction); + } + // sta_correction_file + if (config["model_update"]["initial_sta_correction_file"]) { + getNodeValue(config["model_update"], "initial_sta_correction_file", sta_correction_file); + if (use_sta_correction) { + sta_correction_file_exist = true; + } + } + + // date usage flags and weights + // absolute travel times + if (config["model_update"]["abs_time"]) { + getNodeValue(config["model_update"]["abs_time"], "use_abs_time", use_abs); + if (config["model_update"]["abs_time"]["residual_weight"]){ + for (int i = 0; i < n_weight; i++) + getNodeValue(config["model_update"]["abs_time"], "residual_weight", residual_weight_abs[i], i); + } + if (config["model_update"]["abs_time"]["distance_weight"]) { + for (int i = 0; i < n_weight; i++) + getNodeValue(config["model_update"]["abs_time"], "distance_weight", distance_weight_abs[i], i); + } + } + + // common source diff travel times + if (config["model_update"]["cs_dif_time"]) { + getNodeValue(config["model_update"]["cs_dif_time"], "use_cs_time", use_cs); + if (config["model_update"]["cs_dif_time"]["residual_weight"]){ + for (int i = 0; i < n_weight; i++) + getNodeValue(config["model_update"]["cs_dif_time"], "residual_weight", residual_weight_cs[i], i); + } + if (config["model_update"]["cs_dif_time"]["azimuthal_weight"]) { + for (int i = 0; i < n_weight; i++) + getNodeValue(config["model_update"]["cs_dif_time"], "azimuthal_weight", azimuthal_weight_cs[i], i); + } + } + + // common reciever diff travel times + if (config["model_update"]["cr_dif_time"]) { + getNodeValue(config["model_update"]["cr_dif_time"], "use_cr_time", use_cr); + if (config["model_update"]["cr_dif_time"]["residual_weight"]){ + for (int i = 0; i < n_weight; i++) + getNodeValue(config["model_update"]["cr_dif_time"], "residual_weight", residual_weight_cr[i], i); + } + if (config["model_update"]["cr_dif_time"]["azimuthal_weight"]) { + for (int i = 0; i < n_weight; i++) + getNodeValue(config["model_update"]["cr_dif_time"], "azimuthal_weight", azimuthal_weight_cr[i], i); + } + } + + // weight of different types of data + if (config["model_update"]["global_weight"]){ + if (config["model_update"]["global_weight"]["balance_data_weight"]) { + getNodeValue(config["model_update"]["global_weight"], "balance_data_weight", balance_data_weight); + } + if (config["model_update"]["global_weight"]["abs_time_weight"]) { + getNodeValue(config["model_update"]["global_weight"], "abs_time_weight", abs_time_local_weight); + } + if (config["model_update"]["global_weight"]["cs_dif_time_local_weight"]) { + getNodeValue(config["model_update"]["global_weight"], "cs_dif_time_local_weight", cs_dif_time_local_weight); + } + if (config["model_update"]["global_weight"]["cr_dif_time_local_weight"]) { + getNodeValue(config["model_update"]["global_weight"], "cr_dif_time_local_weight", cr_dif_time_local_weight); + } + if (config["model_update"]["global_weight"]["teleseismic_weight"]) { + getNodeValue(config["model_update"]["global_weight"], "teleseismic_weight", teleseismic_weight); + } + } + + // update which model parameters + if (config["model_update"]["update_slowness"]) + getNodeValue(config["model_update"], "update_slowness", update_slowness); + if (config["model_update"]["update_azi_ani"]) + getNodeValue(config["model_update"], "update_azi_ani", update_azi_ani); + if (config["model_udpate"]["update_rad_ani"]) + getNodeValue(config["model_update"], "update_rad_ani", update_rad_ani); + + // taper kernel (now only for teleseismic tomography) + if (config["model_update"]["depth_taper"]){ + getNodeValue(config["model_update"], "depth_taper", depth_taper[0], 0); + getNodeValue(config["model_update"], "depth_taper", depth_taper[1], 1); + } + + // station correction (now only for teleseismic data) + if (config["model_update"]["use_sta_correction"]){ + getNodeValue(config["model_update"], "use_sta_correction", use_sta_correction); + } + + // station correction step length + if (config["model_update"]["step_length_sta_correction"]){ + getNodeValue(config["model_update"], "step_length_sta_correction", step_length_init_sc); + } + } // end of model_update + + // + // relocatoin + // + if (config["relocation"]) { + // the minimum number of data for relocation + if (config["relocation"]["min_Ndata"]) { + getNodeValue(config["relocation"], "min_Ndata", min_Ndata_reloc); + } + + // step size of relocation + if (config["relocation"]["step_length"]) { + getNodeValue(config["relocation"], "step_length", step_length_src_reloc); + } + // step size decay of relocation + if (config["relocation"]["step_length_decay"]) { + getNodeValue(config["relocation"], "step_length_decay", step_length_decay_src_reloc); + } + // rescaling values + if (config["relocation"]["rescaling_dep_lat_lon_ortime"]){ + getNodeValue(config["relocation"], "rescaling_dep_lat_lon_ortime", rescaling_dep, 0); + getNodeValue(config["relocation"], "rescaling_dep_lat_lon_ortime", rescaling_lat, 1); + getNodeValue(config["relocation"], "rescaling_dep_lat_lon_ortime", rescaling_lon, 2); + getNodeValue(config["relocation"], "rescaling_dep_lat_lon_ortime", rescaling_ortime, 3); + } + // max change values + if (config["relocation"]["max_change_dep_lat_lon_ortime"]) { + getNodeValue(config["relocation"], "max_change_dep_lat_lon_ortime", max_change_dep, 0); + getNodeValue(config["relocation"], "max_change_dep_lat_lon_ortime", max_change_lat, 1); + getNodeValue(config["relocation"], "max_change_dep_lat_lon_ortime", max_change_lon, 2); + getNodeValue(config["relocation"], "max_change_dep_lat_lon_ortime", max_change_ortime, 3); + } + // max iteration for relocation + if (config["relocation"]["max_iterations"]) { + getNodeValue(config["relocation"], "max_iterations", N_ITER_MAX_SRC_RELOC); + } + // norm(grad) threshold of stopping relocation + if (config["relocation"]["tol_gradient"]) { + getNodeValue(config["relocation"], "tol_gradient", TOL_SRC_RELOC); + } + // data usage + if (config["relocation"]["abs_time"]) { + getNodeValue(config["relocation"]["abs_time"], "use_abs_time", use_abs_reloc); + if (config["relocation"]["abs_time"]["residual_weight"]){ + for (int i = 0; i < n_weight; i++) + getNodeValue(config["relocation"]["abs_time"], "residual_weight", residual_weight_abs_reloc[i], i); + } + if (config["relocation"]["abs_time"]["distance_weight"]) { + for (int i = 0; i < n_weight; i++) + getNodeValue(config["relocation"]["abs_time"], "distance_weight", distance_weight_abs_reloc[i], i); + } + } + if (config["relocation"]["cs_dif_time"]){ + getNodeValue(config["relocation"]["cs_dif_time"], "use_cs_time", use_cs_reloc); + if (config["relocation"]["cs_dif_time"]["residual_weight"]){ + for (int i = 0; i < n_weight; i++) + getNodeValue(config["relocation"]["cs_dif_time"], "residual_weight", residual_weight_cs_reloc[i], i); + } + if (config["relocation"]["cs_dif_time"]["azimuthal_weight"]) { + for (int i = 0; i < n_weight; i++) + getNodeValue(config["relocation"]["cs_dif_time"], "azimuthal_weight", azimuthal_weight_cs_reloc[i], i); + } + } + if (config["relocation"]["cr_dif_time"]){ + getNodeValue(config["relocation"]["cr_dif_time"], "use_cr_time", use_cr_reloc); + if (config["relocation"]["cr_dif_time"]["residual_weight"]){ + for (int i = 0; i < n_weight; i++) + getNodeValue(config["relocation"]["cr_dif_time"], "residual_weight", residual_weight_cr_reloc[i], i); + } + if (config["relocation"]["cr_dif_time"]["azimuthal_weight"]) { + for (int i = 0; i < n_weight; i++) + getNodeValue(config["relocation"]["cr_dif_time"], "azimuthal_weight", azimuthal_weight_cr_reloc[i], i); + } + } + // weight of different types of data + if (config["relocation"]["global_weight"]){ + if (config["relocation"]["global_weight"]["balance_data_weight"]) { + getNodeValue(config["relocation"]["global_weight"], "balance_data_weight", balance_data_weight_reloc); + } + if (config["relocation"]["global_weight"]["abs_time_weight"]) { + getNodeValue(config["relocation"]["global_weight"], "abs_time_weight", abs_time_local_weight_reloc); + } + if (config["relocation"]["global_weight"]["cs_dif_time_local_weight"]) { + getNodeValue(config["relocation"]["global_weight"], "cs_dif_time_local_weight", cs_dif_time_local_weight_reloc); + } + if (config["relocation"]["global_weight"]["cr_dif_time_local_weight"]) { + getNodeValue(config["relocation"]["global_weight"], "cr_dif_time_local_weight", cr_dif_time_local_weight_reloc); + } + } + } // end of relocation + + // + // inversion strategy + // + if (config["inversion_strategy"]) { + // inversion mode, 0: for update model parameters and relocation iteratively + if (config["inversion_strategy"]["inv_mode"]) + getNodeValue(config["inversion_strategy"], "inv_mode", inv_mode); + + // paramters for inv_mode == 0 + if (config["inversion_strategy"]["inv_mode_0"]){ + // model_update_N_iter + if (config["inversion_strategy"]["inv_mode_0"]["model_update_N_iter"]) + getNodeValue(config["inversion_strategy"]["inv_mode_0"], "model_update_N_iter", model_update_N_iter); + // relocation_N_iter + if (config["inversion_strategy"]["inv_mode_0"]["relocation_N_iter"]) + getNodeValue(config["inversion_strategy"]["inv_mode_0"], "relocation_N_iter", relocation_N_iter); + // max_loop + if (config["inversion_strategy"]["inv_mode_0"]["max_loop"]) + getNodeValue(config["inversion_strategy"]["inv_mode_0"], "max_loop", max_loop_mode0); + } + + // paramters for inv_mode == 1 + if (config["inversion_strategy"]["inv_mode_1"]){ + // max_loop + if (config["inversion_strategy"]["inv_mode_1"]["max_loop"]) + getNodeValue(config["inversion_strategy"]["inv_mode_1"], "max_loop", max_loop_mode1); + } + } + + // + // calculation + // + if (config["calculation"]) { + // convergence tolerance + if (config["calculation"]["convergence_tolerance"]) { + getNodeValue(config["calculation"], "convergence_tolerance", conv_tol); + } + // max number of iterations + if (config["calculation"]["max_iterations"]) { + getNodeValue(config["calculation"], "max_iterations", max_iter); + } + // stencil order + if (config["calculation"]["stencil_order"]) { + getNodeValue(config["calculation"], "stencil_order", stencil_order); + // check if stencil_order == 999 : hybrid scheme + if (stencil_order == 999) { + hybrid_stencil_order = true; + stencil_order = 1; + } + } + // stencil type + if (config["calculation"]["stencil_type"]) { + getNodeValue(config["calculation"], "stencil_type", stencil_type); + } + // sweep type + if (config["calculation"]["sweep_type"]) { + getNodeValue(config["calculation"], "sweep_type", sweep_type); + } + } + + if (config["debug"]) { + if (config["debug"]["debug_mode"]) { + getNodeValue(config["debug"], "debug_mode", if_test); + } + } + + + std::cout << "min_max_dep: " << min_dep << " " << max_dep << std::endl; + std::cout << "min_max_lat: " << min_lat << " " << max_lat << std::endl; + std::cout << "min_max_lon: " << min_lon << " " << max_lon << std::endl; + std::cout << "n_rtp: " << ngrid_k << " " << ngrid_j << " " << ngrid_i << std::endl; + std::cout << "ndiv_rtp: " << ndiv_k << " " << ndiv_j << " " << ndiv_i << std::endl; + std::cout << "n_subprocs: " << n_subprocs << std::endl; + std::cout << "n_sims: " << n_sims << std::endl; + + } + + stdout_by_rank_zero("parameter file read done."); + + synchronize_all_world(); + + // broadcast all the values read + broadcast_cr_single(min_dep, 0); + broadcast_cr_single(max_dep, 0); + broadcast_cr_single(min_lat, 0); + broadcast_cr_single(max_lat, 0); + broadcast_cr_single(min_lon, 0); + broadcast_cr_single(max_lon, 0); + + broadcast_i_single(ngrid_i, 0); + broadcast_i_single(ngrid_j, 0); + broadcast_i_single(ngrid_k, 0); + + broadcast_cr_single(src_dep, 0); + broadcast_cr_single(src_lat, 0); + broadcast_cr_single(src_lon, 0); + + broadcast_bool_single(src_rec_file_exist, 0); + + // This have to be done only after broadcast src_rec_file_exist + if (src_rec_file_exist == false){ + SrcRecInfo src; + src.id = 0; + src.name = "s0"; + src.lat = src_lat; + src.lon = src_lon; + src.dep = src_dep; + src_map[src.name] = src; + SrcRecInfo rec; + rec.id = 0; + rec.name = "r0"; + rec_map[rec.name] = rec; + DataInfo data; + data_map[src.name][rec.name].push_back(data); + } + + broadcast_str(src_rec_file, 0); + broadcast_bool_single(swap_src_rec, 0); + + + broadcast_str(init_model_path, 0); + broadcast_str(model_1d_name, 0); + + broadcast_i_single(n_sims, 0); + broadcast_i_single(ndiv_i, 0); + broadcast_i_single(ndiv_j, 0); + broadcast_i_single(ndiv_k, 0); + broadcast_i_single(n_subprocs, 0); + broadcast_bool_single(use_gpu, 0); + + broadcast_str(output_dir, 0); + broadcast_bool_single(output_source_field, 0); + broadcast_bool_single(output_kernel, 0); + broadcast_i_single(verbose_output_level, 0); + broadcast_bool_single(output_final_model, 0); + broadcast_bool_single(output_middle_model, 0); + broadcast_bool_single(output_in_process, 0); + broadcast_bool_single(output_in_process_data, 0); + broadcast_bool_single(single_precision_output, 0); + broadcast_i_single(output_format, 0); + + broadcast_i_single(run_mode, 0); + broadcast_bool_single(have_tele_data, 0); + broadcast_bool_single(ignore_velocity_discontinuity, 0); + + broadcast_i_single(max_iter_inv, 0); + broadcast_i_single(optim_method, 0); + broadcast_i_single(step_method, 0); + broadcast_cr_single(step_length_init, 0); + broadcast_cr_single(step_length_decay, 0); + broadcast_cr_single(step_length_gradient_angle, 0); + broadcast_cr_single(step_length_down, 0); + broadcast_cr_single(step_length_up, 0); + broadcast_cr_single(Kdensity_coe, 0); + broadcast_i_single(max_sub_iterations, 0); + broadcast_cr_single(regularization_weight, 0); + broadcast_cr_single(regul_lr, 0); + broadcast_cr_single(regul_lt, 0); + broadcast_cr_single(regul_lp, 0); + broadcast_i_single(smooth_method, 0); + broadcast_cr_single(smooth_lr, 0); + broadcast_cr_single(smooth_lt, 0); + broadcast_cr_single(smooth_lp, 0); + + broadcast_i_single(n_inversion_grid, 0); + + broadcast_bool_single(uniform_inv_grid_dep, 0); + broadcast_bool_single(uniform_inv_grid_lon, 0); + broadcast_bool_single(uniform_inv_grid_lat, 0); + + broadcast_i_single(n_inv_r_flex, 0); + broadcast_i_single(n_inv_t_flex, 0); + broadcast_i_single(n_inv_p_flex, 0); + + broadcast_i_single(n_inv_r_flex_ani, 0); + broadcast_i_single(n_inv_t_flex_ani, 0); + broadcast_i_single(n_inv_p_flex_ani, 0); + + if (world_rank != 0) { + dep_inv = allocateMemory(n_inv_r_flex, 5012); + lat_inv = allocateMemory(n_inv_t_flex, 5013); + lon_inv = allocateMemory(n_inv_p_flex, 5014); + dep_inv_ani = allocateMemory(n_inv_r_flex_ani, 5015); + lat_inv_ani = allocateMemory(n_inv_t_flex_ani, 5016); + lon_inv_ani = allocateMemory(n_inv_p_flex_ani, 5017); + } + broadcast_cr(dep_inv,n_inv_r_flex, 0); + broadcast_cr(lat_inv,n_inv_t_flex, 0); + broadcast_cr(lon_inv,n_inv_p_flex, 0); + broadcast_cr(trapezoid,n_trapezoid, 0); + broadcast_cr(dep_inv_ani,n_inv_r_flex_ani, 0); + broadcast_cr(lat_inv_ani,n_inv_t_flex_ani, 0); + broadcast_cr(lon_inv_ani,n_inv_p_flex_ani, 0); + broadcast_cr(trapezoid_ani,n_trapezoid, 0); + + broadcast_bool_single(invgrid_ani, 0); + // broadcast_bool_single(invgrid_volume_rescale, 0); + + broadcast_bool_single(use_sta_correction, 0); + broadcast_cr_single(step_length_init_sc, 0); + broadcast_bool_single(sta_correction_file_exist, 0); + broadcast_str(sta_correction_file, 0); + + broadcast_bool_single(use_abs, 0); + broadcast_cr(residual_weight_abs, n_weight, 0); + broadcast_cr(distance_weight_abs, n_weight, 0); + broadcast_bool_single(use_cs, 0); + broadcast_cr(residual_weight_cs, n_weight, 0); + broadcast_cr(azimuthal_weight_cs, n_weight, 0); + broadcast_bool_single(use_cr, 0); + broadcast_cr(residual_weight_cr, n_weight, 0); + broadcast_cr(azimuthal_weight_cr, n_weight, 0); + + broadcast_bool_single(balance_data_weight, 0); + broadcast_cr_single(abs_time_local_weight, 0); + broadcast_cr_single(cs_dif_time_local_weight, 0); + broadcast_cr_single(cr_dif_time_local_weight, 0); + broadcast_cr_single(teleseismic_weight, 0); + + broadcast_bool_single(update_slowness, 0); + broadcast_bool_single(update_azi_ani, 0); + broadcast_bool_single(update_rad_ani, 0); + broadcast_cr(depth_taper,2,0); + + broadcast_i_single(min_Ndata_reloc, 0); + broadcast_cr_single(step_length_src_reloc, 0); + broadcast_cr_single(step_length_decay_src_reloc, 0); + broadcast_cr_single(rescaling_dep, 0); + broadcast_cr_single(rescaling_lat, 0); + broadcast_cr_single(rescaling_lon, 0); + broadcast_cr_single(rescaling_ortime, 0); + broadcast_cr_single(max_change_dep, 0); + broadcast_cr_single(max_change_lat, 0); + broadcast_cr_single(max_change_lon, 0); + broadcast_cr_single(max_change_ortime, 0); + broadcast_i_single(N_ITER_MAX_SRC_RELOC, 0); + broadcast_cr_single(TOL_SRC_RELOC, 0); + broadcast_bool_single(ortime_local_search, 0); + + broadcast_bool_single(use_abs_reloc, 0); + broadcast_cr(residual_weight_abs_reloc, n_weight, 0); + broadcast_cr(distance_weight_abs_reloc, n_weight, 0); + broadcast_bool_single(use_cs_reloc, 0); + broadcast_cr(residual_weight_cs_reloc, n_weight, 0); + broadcast_cr(azimuthal_weight_cs_reloc, n_weight, 0); + broadcast_bool_single(use_cr_reloc, 0); + broadcast_cr(residual_weight_cr_reloc, n_weight, 0); + broadcast_cr(azimuthal_weight_cr_reloc, n_weight, 0); + + broadcast_bool_single(balance_data_weight_reloc, 0); + broadcast_cr_single(abs_time_local_weight_reloc, 0); + broadcast_cr_single(cs_dif_time_local_weight_reloc, 0); + broadcast_cr_single(cr_dif_time_local_weight_reloc, 0); + + broadcast_i_single(inv_mode, 0); + broadcast_i_single(model_update_N_iter, 0); + broadcast_i_single(relocation_N_iter, 0); + broadcast_i_single(max_loop_mode0, 0); + broadcast_i_single(max_loop_mode1, 0); + + broadcast_cr_single(conv_tol, 0); + broadcast_i_single(max_iter, 0); + broadcast_i_single(stencil_order, 0); + broadcast_bool_single(hybrid_stencil_order, 0); + broadcast_i_single(stencil_type, 0); + broadcast_i_single(sweep_type, 0); + broadcast_bool_single(if_test, 0); + + // check contradictory settings + check_contradictions(); + + // write parameter file to output directory + if (world_rank == 0) + write_params_to_file(); + + // broadcast the values to all processes + stdout_by_rank_zero("read input file successfully."); + +} + + +InputParams::~InputParams(){ + // free memory + + // check allocated memory + if (dep_inv != nullptr) delete [] dep_inv; + if (lat_inv != nullptr) delete [] lat_inv; + if (lon_inv != nullptr) delete [] lon_inv; + + if (dep_inv_ani != nullptr) delete [] dep_inv_ani; + if (lat_inv_ani != nullptr) delete [] lat_inv_ani; + if (lon_inv_ani != nullptr) delete [] lon_inv_ani; + + // clear all src, rec, data + src_map.clear(); + src_map_tele.clear(); + src_map_all.clear(); + src_map_back.clear(); + src_map_tele.clear(); + rec_map.clear(); + rec_map_tele.clear(); + rec_map_all.clear(); + rec_map_back.clear(); + data_map.clear(); + data_map_tele.clear(); + data_map_all.clear(); + data_map_back.clear(); +} + + +void InputParams::write_params_to_file() { + // write all the simulation parameters in another yaml file + std::string file_name = "params_log.yaml"; + std::ofstream fout(file_name); + // print boolean as string + fout << std::boolalpha; + + fout << "version: " << 3 << std::endl; + + fout << std::endl; + + fout << "#################################################" << std::endl; + fout << "# computational domian #" << std::endl; + fout << "#################################################" << std::endl; + fout << "domain:" << std::endl; + fout << " min_max_dep: [" << min_dep << ", " << max_dep << "] # depth in km" << std::endl; + fout << " min_max_lat: [" << min_lat << ", " << max_lat << "] # latitude in degree" << std::endl; + fout << " min_max_lon: [" << min_lon << ", " << max_lon << "] # longitude in degree" << std::endl; + fout << " n_rtp: [" << ngrid_k << ", " << ngrid_j << ", " << ngrid_i << "] # number of nodes in depth,latitude,longitude direction" << std::endl; + fout << std::endl; + + fout << "#################################################" << std::endl; + fout << "# traveltime data file path #" << std::endl; + fout << "#################################################" << std::endl; + fout << "source:" << std::endl; + fout << " src_rec_file: " << src_rec_file << " # source receiver file path" << std::endl; + fout << " swap_src_rec: " << swap_src_rec << " # swap source and receiver (only valid for regional source and receiver, those of tele remain unchanged)" << std::endl; + fout << std::endl; + + fout << "#################################################" << std::endl; + fout << "# initial model file path #" << std::endl; + fout << "#################################################" << std::endl; + fout << "model:" << std::endl; + fout << " init_model_path: " << init_model_path << " # path to initial model file " << std::endl; + // check if model_1d_name has any characters + if (model_1d_name.size() > 0) + fout << " model_1d_name: " << model_1d_name; + else + fout << "# model_1d_name: " << "dummy_model_1d_name"; + fout << " # 1D model name used in teleseismic 2D solver (iasp91, ak135, user_defined is available), defined in include/1d_model.h" << std::endl; + fout << std::endl; + + + fout << "#################################################" << std::endl; + fout << "# parallel computation settings #" << std::endl; + fout << "#################################################" << std::endl; + fout << "parallel: # parameters for parallel computation" << std::endl; + fout << " n_sims: " << n_sims << " # number of simultanoues runs (parallel the sources)" << std::endl; + fout << " ndiv_rtp: [" << ndiv_k << ", " << ndiv_j << ", " << ndiv_i << "] # number of subdivision on each direction (parallel the computional domain)" << std::endl; + fout << " nproc_sub: " << n_subprocs << " # number of processors for sweep parallelization (parallel the fast sweep method)" << std::endl; + fout << " use_gpu: " << use_gpu << " # true if use gpu (EXPERIMENTAL)" << std::endl; + fout << std::endl; + + fout << "############################################" << std::endl; + fout << "# output file setting #" << std::endl; + fout << "############################################" << std::endl; + fout << "output_setting:" << std::endl; + fout << " output_dir: " << output_dir << " # path to output director (default is ./OUTPUT_FILES/)" << std::endl; + fout << " output_source_field: " << output_source_field << " # True: output the traveltime field and adjoint field of all sources at each iteration. Default: false. File: 'out_data_sim_group_X'." << std::endl; + fout << " output_kernel: " << output_kernel << " # True: output sensitivity kernel and kernel density. Default: false. File: 'out_data_sim_group_X'." << std::endl; + fout << " output_final_model: " << output_final_model << " # True: output merged final model. This file can be used as the input model for TomoATT. Default: true. File: 'model_final.h5'." << std::endl; + fout << " output_middle_model: " << output_middle_model << " # True: output merged intermediate models during inversion. This file can be used as the input model for TomoATT. Default: false. File: 'middle_model_step_XXXX.h5'" << std::endl; + fout << " output_in_process: " << output_in_process << " # True: output at each inv iteration, otherwise, only output step 0, Niter-1, Niter. Default: true. File: 'out_data_sim_group_0'." << std::endl; + fout << " output_in_process_data: " << output_in_process_data << " # True: output src_rec_file at each inv iteration, otherwise, only output step 0, Niter-2, Niter-1. Default: true. File: 'src_rec_file_step_XXXX.dat'" << std::endl; + fout << " single_precision_output: " << single_precision_output << " # True: output results in single precision. Default: false. " << std::endl; + fout << " verbose_output_level: " << verbose_output_level << " # output internal parameters, (to do)." << std::endl; + int ff_flag=0; + if (output_format == OUTPUT_FORMAT_HDF5) ff_flag = 0; + else if (output_format == OUTPUT_FORMAT_ASCII) ff_flag = 1; + else { + std::cout << "Error: output_format is not defined!" << std::endl; + exit(1); + } + fout << " output_file_format: " << ff_flag << " # 0: hdf5, 1: ascii" << std::endl; + fout << std::endl; + fout << "# output files:" << std::endl; + fout << "# File: 'out_data_grid.h5'. Keys: ['Mesh']['elem_conn'], element index; " << std::endl; + fout << "# ['Mesh']['node_coords_p'], phi coordinates of nodes; " << std::endl; + fout << "# ['Mesh']['node_coords_t'], theta coordinates of nodes; " << std::endl; + fout << "# ['Mesh']['node_coords_r'], r coordinates of nodes;" << std::endl; + fout << "# ['Mesh']['node_coords_x'], phi coordinates of elements; " << std::endl; + fout << "# ['Mesh']['node_coords_y'], theta coordinates of elements; " << std::endl; + fout << "# ['Mesh']['node_coords_z'], r coordinates of elements; " << std::endl; + fout << "# File: 'out_data_sim_group_0'. Keys: ['model']['vel_inv_XXXX'], velocity model at iteration XXXX; " << std::endl; + fout << "# ['model']['xi_inv_XXXX'], xi model at iteration XXXX; " << std::endl; + fout << "# ['model']['eta_inv_XXXX'], eta model at iteration XXXX" << std::endl; + fout << "# ['model']['Ks_inv_XXXX'], sensitivity kernel related to slowness at iteration XXXX" << std::endl; + fout << "# ['model']['Kxi_inv_XXXX'], sensitivity kernel related to xi at iteration XXXX" << std::endl; + fout << "# ['model']['Keta_inv_XXXX'], sensitivity kernel related to eta at iteration XXXX" << std::endl; + fout << "# ['model']['Ks_density_inv_XXXX'], kernel density of Ks at iteration XXXX" << std::endl; + fout << "# ['model']['Kxi_density_inv_XXXX'], kernel density of Kxi at iteration XXXX" << std::endl; + fout << "# ['model']['Keta_density_inv_XXXX'], kernel density of Keta at iteration XXXX" << std::endl; + // fout << "# ['model']['Ks_over_Kden_inv_XXXX'], slowness kernel over kernel density at iteration XXXX" << std::endl; + // fout << "# ['model']['Kxi_over_Kden_inv_XXXX'], xi kernel over kernel density at iteration XXXX" << std::endl; + // fout << "# ['model']['Keta_over_Kden_inv_XXXX'], eta kernel over kernel density at iteration XXXX" << std::endl; + fout << "# ['model']['Ks_update_inv_XXXX'], slowness kernel smoothed by inversion grid over the samely smoothed kernel density at iteration XXXX, " << std::endl; + fout << "# ['model']['Kxi_update_inv_XXXX'], xi kernel smoothed by inversion grid over the samely smoothed kernel density at iteration XXXX" << std::endl; + fout << "# ['model']['Keta_update_inv_XXXX'], eta kernel smoothed by inversion grid over the samely smoothed kernel density at iteration XXXX" << std::endl; + fout << "# ['model']['Ks_density_update_inv_XXXX'], slowness kernel density at iteration XXXX, smoothed by inversion grid" << std::endl; + fout << "# ['model']['Kxi_density_update_inv_XXXX'], xi kernel density at iteration XXXX, smoothed by inversion grid" << std::endl; + fout << "# ['model']['Keta_density_update_inv_XXXX'], eta kernel density at iteration XXXX, smoothed by inversion grid" << std::endl; + fout << "# ['1dinv']['vel_1dinv_inv_XXXX'], 2d velocity model at iteration XXXX, in 1d inversion mode" << std::endl; + fout << "# ['1dinv']['r_1dinv'], r coordinates (depth), in 1d inversion mode" << std::endl; + fout << "# ['1dinv']['t_1dinv'], t coordinates (epicenter distance), in 1d inversion mode" << std::endl; + fout << "# File: 'src_rec_file_step_XXXX.dat' or 'src_rec_file_forward.dat'. The synthetic traveltime data file." << std::endl; + fout << "# File: 'final_model.h5'. Keys: ['eta'], ['xi'], ['vel'], the final model." << std::endl; + fout << "# File: 'middle_model_step_XXXX.h5'. Keys: ['eta'], ['xi'], ['vel'], the model at step XXXX." << std::endl; + fout << "# File: 'inversion_grid.txt'. The location of inversion grid nodes" << std::endl; + fout << "# File: 'objective_function.txt'. The objective function value at each iteration" << std::endl; + fout << "# File: 'out_data_sim_group_X'. Keys: ['src_YYYY']['time_field_inv_XXXX'], traveltime field of source YYYY at iteration XXXX;" << std::endl; + fout << "# ['src_YYYY']['adjoint_field_inv_XXXX'], adjoint field of source YYYY at iteration XXXX;" << std::endl; + fout << "# ['1dinv']['time_field_1dinv_YYYY_inv_XXXX'], 2d traveltime field of source YYYY at iteration XXXX, in 1d inversion mode" << std::endl; + fout << "# ['1dinv']['adjoint_field_1dinv_YYYY_inv_XXXX'], 2d adjoint field of source YYYY at iteration XXXX, in 1d inversion mode" << std::endl; + fout << std::endl; + fout << std::endl; + + fout << "#################################################" << std::endl; + fout << "# inversion or forward modeling #" << std::endl; + fout << "#################################################" << std::endl; + fout << "# run mode" << std::endl; + fout << "# 0 for forward simulation only," << std::endl; + fout << "# 1 for inversion" << std::endl; + fout << "# 2 for earthquake relocation" << std::endl; + fout << "# 3 for inversion + earthquake relocation" << std::endl; + fout << "# 4 for 1d model inversion" << std::endl; + fout << "run_mode: " << run_mode << std::endl; + fout << std::endl; + + fout << "have_tele_data: " << have_tele_data << " # An error will be reported if false but source out of study region is used. Default: false." << std::endl; + fout << "ignore_velocity_discontinuity: " << ignore_velocity_discontinuity << " # An error will be reported if false but there is velocity discontinuity (v[ix,iy,iz+1] > v[ix,iy,iz] * 1.2 or v[ix,iy,iz+1] < v[ix,iy,iz] * 0.8) in the input model. Default: false." << std::endl; + fout << "# velocity discontinuity will lead to unexpected bais in traveltime and kernel. Smoothing the model with Gaussian filter is highly recommended. If you really want to use the model with discontinuity, please set True. " << std::endl; + fout << std::endl; + fout << std::endl; + + fout << "###################################################" << std::endl; + fout << "# model update parameters setting #" << std::endl; + fout << "###################################################" << std::endl; + fout << "model_update:" << std::endl; + fout << " max_iterations: " << max_iter_inv << " # maximum number of inversion iterations" << std::endl; + fout << " optim_method: " << optim_method << " # optimization method. 0 : grad_descent, 1 : halve-stepping, 2 : lbfgs (EXPERIMENTAL)" << std::endl; + fout << std::endl; + fout << " #common parameters for all optim methods" << std::endl; + fout << " step_length: " << step_length_init << " # the initial step length of model perturbation. 0.01 means maximum 1% perturbation for each iteration." << std::endl; + fout << std::endl; + fout << " # parameters for optim_method 0 (gradient_descent)" << std::endl; + fout << " optim_method_0:" << std::endl; + fout << " step_method: " << step_method << " # the method to modulate step size. 0: according to objective function; 1: according to gradient direction " << std::endl; + fout << " # if step_method:0. if objective function increase, step size -> step length * step_length_decay. " << std::endl; + fout << " step_length_decay: " << step_length_decay << " # default: 0.9" << std::endl; + fout << " # if step_method:1. if the angle between the current and the previous gradients is greater than step_length_gradient_angle, step size -> step length * step_length_change[0]. " << std::endl; + fout << " # otherwise, step size -> step length * step_length_change[1]. " << std::endl; + fout << " step_length_gradient_angle: " << step_length_gradient_angle << " # default: 120.0 " << std::endl; + fout << " step_length_change: [" << step_length_down << ", " << step_length_up << "] # default: [0.5,1.2] " << std::endl; + fout << " # Kdensity_coe is used to rescale the final kernel: kernel -> kernel / pow(density of kernel, Kdensity_coe). if Kdensity_coe > 0, the region with less data will be enhanced during the inversion" << std::endl; + fout << " # e.g., if Kdensity_coe = 0, kernel remains upchanged; if Kdensity_coe = 1, kernel is fully normalized. 0.5 or less is recommended if really required." << std::endl; + fout << " Kdensity_coe: " << Kdensity_coe << " # default: 0.0, limited range: 0.0 - 0.95 " << std::endl; + fout << std::endl; + fout << " # parameters for optim_method 1 (halve-stepping) or 2 (lbfgs)" << std::endl; + fout << " optim_method_1_2:" << std::endl; + fout << " max_sub_iterations: " << max_sub_iterations << " # maximum number of each sub-iteration" << std::endl; + fout << " regularization_weight: " << regularization_weight << " # weight value for regularization (lbfgs mode only)" << std::endl; + + fout << " coefs_regulalization_rtp: [" << regul_lr << ", " << regul_lt << ", " << regul_lp << "] # regularization coefficients for rtp (lbfgs mode only)" << std::endl; + fout << std::endl; + + fout << " # smoothing" << std::endl; + fout << " smoothing:" << std::endl; + fout << " smooth_method: " << smooth_method << " # 0: multiparametrization, 1: laplacian smoothing (EXPERIMENTAL)" << std::endl; + fout << " l_smooth_rtp: [" << smooth_lr << ", " << smooth_lt << ", " << smooth_lp << "] # smoothing coefficients for laplacian smoothing" << std::endl; + fout << std::endl; + + fout << " # parameters for smooth method 0 (multigrid model parametrization)" << std::endl; + fout << " # inversion grid can be viewed in OUTPUT_FILES/inversion_grid.txt" << std::endl; + fout << " n_inversion_grid: " << n_inversion_grid << " # number of inversion grid sets" << std::endl; + fout << std::endl; + + fout << " uniform_inv_grid_dep: " << uniform_inv_grid_dep << " # true if use uniform inversion grid for dep, false if use flexible inversion grid" << std::endl; + fout << " uniform_inv_grid_lat: " << uniform_inv_grid_lat << " # true if use uniform inversion grid for lat, false if use flexible inversion grid" << std::endl; + fout << " uniform_inv_grid_lon: " << uniform_inv_grid_lon << " # true if use uniform inversion grid for lon, false if use flexible inversion grid" << std::endl; + fout << std::endl; + + fout << " # -------------- uniform inversion grid setting -------------- " << std::endl; + fout << " # settings for uniform inversion grid" << std::endl; + fout << " n_inv_dep_lat_lon: [" << n_inv_r << ", " << n_inv_t << ", " << n_inv_p << "] # number of the base inversion grid points" << std::endl; + fout << " min_max_dep_inv: [" << min_dep_inv << ", " << max_dep_inv << "] # depth in km (Radius of the earth is defined in config.h/R_earth)" << std::endl; + fout << " min_max_lat_inv: [" << min_lat_inv << ", " << max_lat_inv << "] # latitude in degree" << std::endl; + fout << " min_max_lon_inv: [" << min_lon_inv << ", " << max_lon_inv << "] # longitude in degree" << std::endl; + fout << std::endl; + + fout << " # -------------- flexible inversion grid setting -------------- " << std::endl; + fout << " # settings for flexible inversion grid" << std::endl; + fout << " dep_inv: ["; + for (int i = 0; i < n_inv_r_flex; i++){ + fout << dep_inv[i]; + if (i != n_inv_r_flex-1) + fout << ", "; + } + fout << "] # inversion grid for vel in depth (km)" << std::endl; + fout << " lat_inv: ["; + for (int i = 0; i < n_inv_t_flex; i++){ + fout << lat_inv[i]; + if (i != n_inv_t_flex-1) + fout << ", "; + } + fout << "] # inversion grid for vel in latitude (degree)" << std::endl; + fout << " lon_inv: ["; + for (int i = 0; i < n_inv_p_flex; i++){ + fout << lon_inv[i]; + if (i != n_inv_p_flex-1) + fout << ", "; + } + fout << "] # inversion grid for vel in longitude (degree)" << std::endl; + fout << " trapezoid: ["; + for (int i = 0; i < n_trapezoid; i++){ + fout << trapezoid[i]; + if (i != n_trapezoid-1) + fout << ", "; + } + fout << "] # usually set as [1.0, 0.0, 50.0] (default)" << std::endl; + fout << std::endl; + + fout << " # if we want to use another inversion grid for inverting anisotropy, set invgrid_ani: true (default: false)" << std::endl; + fout << " invgrid_ani: " << invgrid_ani << std::endl; + fout << std::endl; + + fout << " # ---------- uniform inversion grid setting for anisotropy ----------" << std::endl; + fout << " n_inv_dep_lat_lon_ani: [" << n_inv_r_ani << ", " << n_inv_t_ani << ", " << n_inv_p_ani << "] # number of the base inversion grid points" << std::endl; + fout << " min_max_dep_inv_ani: [" << min_dep_inv_ani << ", " << max_dep_inv_ani << "] # depth in km (Radius of the earth is defined in config.h/R_earth)" << std::endl; + fout << " min_max_lat_inv_ani: [" << min_lat_inv_ani << ", " << max_lat_inv_ani << "] # latitude in degree" << std::endl; + fout << " min_max_lon_inv_ani: [" << min_lon_inv_ani << ", " << max_lon_inv_ani << "] # longitude in degree" << std::endl; + fout << std::endl; + + fout << " # ---------- flexible inversion grid setting for anisotropy ----------" << std::endl; + fout << " # settings for flexible inversion grid for anisotropy" << std::endl; + fout << " dep_inv_ani: ["; + for (int i = 0; i < n_inv_r_flex_ani; i++){ + fout << dep_inv_ani[i]; + if (i != n_inv_r_flex_ani-1) + fout << ", "; + } + fout << "] # inversion grid for ani in depth (km)" << std::endl; + fout << " lat_inv_ani: ["; + for (int i = 0; i < n_inv_t_flex_ani; i++){ + fout << lat_inv_ani[i]; + if (i != n_inv_t_flex_ani-1) + fout << ", "; + } + fout << "] # inversion grid for ani in latitude (degree)" << std::endl; + fout << " lon_inv_ani: ["; + for (int i = 0; i < n_inv_p_flex_ani; i++){ + fout << lon_inv_ani[i]; + if (i != n_inv_p_flex_ani-1) + fout << ", "; + } + fout << "] # inversion grid for ani in longitude (degree)" << std::endl; + fout << " trapezoid_ani: ["; + for (int i = 0; i < n_trapezoid; i++){ + fout << trapezoid_ani[i]; + if (i != n_trapezoid-1) + fout << ", "; + } + fout << "] # usually set as [1.0, 0.0, 50.0] (default)" << std::endl; + fout << std::endl; + + fout << " # Carefully change trapezoid and trapezoid_ani, if you really want to use trapezoid inversion grid, increasing the inversion grid spacing with depth to account for the worse data coverage in greater depths." << std::endl; + fout << " # The trapezoid_ inversion grid with index (i,j,k) in longitude, latitude, and depth is defined as:" << std::endl; + fout << " # if dep_inv[k] < trapezoid[1], lon = lon_inv[i]; " << std::endl; + fout << " # lat = lat_inv[j]; " << std::endl; + fout << " # dep = dep_inv[k];" << std::endl; + fout << " # if trapezoid[1] <= dep_inv[k] < trapezoid[2], lon = mid_lon_inv+(lon_inv[i]-mid_lon_inv)*(dep_inv[k]-trapezoid[1])/(trapezoid[2]-trapezoid[1])*trapezoid[0]; " << std::endl; + fout << " # lat = mid_lat_inv+(lat_inv[i]-mid_lat_inv)*(dep_inv[k]-trapezoid[1])/(trapezoid[2]-trapezoid[1])*trapezoid[0]; " << std::endl; + fout << " # dep = dep_inv[k];" << std::endl; + fout << " # if trapezoid[2] <= dep_inv[k], lon = mid_lon_inv+(lon_inv[i]-mid_lon_inv)*trapezoid[0]; " << std::endl; + fout << " # lat = mid_lat_inv+(lat_inv[i]-mid_lat_inv)*trapezoid[0]; " << std::endl; + fout << " # dep = dep_inv[k];" << std::endl; + fout << " # The shape of trapezoid inversion gird (x) looks like:" << std::endl; + fout << " #" << std::endl; + fout << " # lon_inv[0] [1] [2] [3] [4]" << std::endl; + fout << " # |<-------- (lon_inv[end] - lon_inv[0]) ---->| " << std::endl; + fout << " # dep_inv[0] | x x x x x | " << std::endl; + fout << " # | | " << std::endl; + fout << " # dep_inv[1] | x x x x x | " << std::endl; + fout << " # | | " << std::endl; + fout << " # dep_inv[2] = trapezoid[1] / x x x x x \\ " << std::endl; + fout << " # / \\ " << std::endl; + fout << " # dep_inv[3] / x x x x x \\ " << std::endl; + fout << " # / \\ " << std::endl; + fout << " # dep_inv[4] = trapezoid[2] / x x x x x \\ " << std::endl; + fout << " # | | " << std::endl; + fout << " # dep_inv[5] | x x x x x | " << std::endl; + fout << " # | | " << std::endl; + fout << " # dep_inv[6] | x x x x x | " << std::endl; + fout << " # |<---- trapezoid[0]* (lon_inv[end] - lon_inv[0]) ------>| " << std::endl; + fout << std::endl; + + + // fout << " # inversion grid volume rescale (kernel -> kernel / volume of inversion grid mesh)," << std::endl; + // fout << " # this precondition may be carefully applied if the sizes of inversion grids are unbalanced" << std::endl; + // fout << " invgrid_volume_rescale: " << invgrid_volume_rescale << std::endl; + fout << std::endl; + + fout << " # path to station correction file (under development)" << std::endl; + fout << " use_sta_correction: " << use_sta_correction << std::endl; + if (sta_correction_file_exist) + fout << " initial_sta_correction_file: " << sta_correction_file; + else + fout << " # initial_sta_correction_file: " << "dummy_sta_correction_file"; + fout << " # the path of initial station correction " << std::endl; + fout << " step_length_sta_correction: " << step_length_init_sc << " # step length relate to the update of station correction terms" << std::endl; + fout << std::endl; + + fout << std::endl; + + fout << " # In the following data subsection, XXX_weight means a weight is assigned to the data, influencing the objective function and gradient" << std::endl; + fout << " # XXX_weight : [d1,d2,w1,w2] means: " << std::endl; + fout << " # if XXX < d1, weight = w1 " << std::endl; + fout << " # if d1 <= XXX < d2, weight = w1 + (XXX-d1)/(d2-d1)*(w2-w1), (linear interpolation) " << std::endl; + fout << " # if d2 <= XXX , weight = w2 " << std::endl; + fout << " # You can easily set w1 = w2 = 1.0 to normalize the weight related to XXX." << std::endl; + + fout << " # -------------- using absolute traveltime data --------------" << std::endl; + fout << " abs_time:" << std::endl; + fout << " use_abs_time: " << use_abs << " # 'true' for using absolute traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section)" << std::endl; + fout << " residual_weight: ["; + for (int i = 0; i < n_weight; i++){ + fout << residual_weight_abs[i]; + if (i != n_weight-1) + fout << ", "; + } + fout << "] # XXX is the absolute traveltime residual (second) = abs(t^{obs}_{n,i} - t^{syn}_{n,j})" << std::endl; + fout << " distance_weight: ["; + for (int i = 0; i < n_weight; i++){ + fout << distance_weight_abs[i]; + if (i != n_weight-1) + fout << ", "; + } + fout << "] # XXX is epicenter distance (km) between the source and receiver related to the data" << std::endl; + fout << std::endl; + + fout << " # -------------- using common source differential traveltime data --------------" << std::endl; + fout << " cs_dif_time:" << std::endl; + fout << " use_cs_time: " << use_cs << " # 'true' for using common source differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section)" << std::endl; + fout << " residual_weight: ["; + for (int i = 0; i < n_weight; i++){ + fout << residual_weight_cs[i]; + if (i != n_weight-1) + fout << ", "; + } + fout << "] # XXX is the common source differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{n,j} - t^{syn}_{n,i} + t^{syn}_{n,j})." << std::endl; + fout << " azimuthal_weight: ["; + for (int i = 0; i < n_weight; i++){ + fout << azimuthal_weight_cs[i]; + if (i != n_weight-1) + fout << ", "; + } + fout << "] # XXX is the azimuth difference between two separate stations related to the common source." << std::endl; + fout << std::endl; + + fout << " # -------------- using common receiver differential traveltime data --------------" << std::endl; + fout << " cr_dif_time:" << std::endl; + fout << " use_cr_time: " << use_cr << " # 'true' for using common receiver differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section)" << std::endl; + fout << " residual_weight: ["; + for (int i = 0; i < n_weight; i++){ + fout << residual_weight_cr[i]; + if (i != n_weight-1) + fout << ", "; + } + fout << "] # XXX is the common receiver differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{m,i} - t^{syn}_{n,i} + t^{syn}_{m,i})" << std::endl; + fout << " azimuthal_weight: ["; + for (int i = 0; i < n_weight; i++){ + fout << azimuthal_weight_cr[i]; + if (i != n_weight-1) + fout << ", "; + } + fout << "] # XXX is the azimuth difference between two separate sources related to the common receiver." << std::endl; + fout << std::endl; + + fout << " # -------------- global weight of different types of data (to balance the weight of different data) --------------" << std::endl; + fout << " global_weight:" << std::endl; + fout << " balance_data_weight: " << balance_data_weight << " # yes: over the total weight of the each type of the data. no: use original weight (below weight for each type of data needs to be set)" << std::endl; + fout << " abs_time_weight: " << abs_time_local_weight << " # weight of absolute traveltime data after balance, default: 1.0" << std::endl; + fout << " cs_dif_time_local_weight: " << cs_dif_time_local_weight << " # weight of common source differential traveltime data after balance, default: 1.0" << std::endl; + fout << " cr_dif_time_local_weight: " << cr_dif_time_local_weight << " # weight of common receiver differential traveltime data after balance, default: 1.0" << std::endl; + fout << " teleseismic_weight: " << teleseismic_weight << " # weight of teleseismic data after balance, default: 1.0 (exclude in this version)" << std::endl; + fout << std::endl; + + fout << " # -------------- inversion parameters --------------" << std::endl; + fout << " update_slowness : " << update_slowness << " # update slowness (velocity) or not. default: true" << std::endl; + fout << " update_azi_ani : " << update_azi_ani << " # update azimuthal anisotropy (xi, eta) or not. default: false" << std::endl; + // fout << " update_rad_ani : " << update_rad_ani << " # update radial anisotropy (in future) or not. default: false" << std::endl; + fout << std::endl; + + fout << " # -------------- for teleseismic inversion (under development) --------------" << std::endl; + fout << " # depth_taper : [d1,d2] means: " << std::endl; + fout << " # if XXX < d1, kernel <- kernel * 0.0 " << std::endl; + fout << " # if d1 <= XXX < d2, kernel <- kernel * (XXX-d1)/(d2-d1), (linear interpolation) " << std::endl; + fout << " # if d2 <= XXX , kernel <- kernel * 1.0 " << std::endl; + fout << " # You can easily set d1 = -200, d1 = -100 to remove this taper." << std::endl; + fout << " depth_taper : [" << depth_taper[0] << ", " << depth_taper[1] << "]" << std::endl; + fout << std::endl; + + fout << "#################################################" << std::endl; + fout << "# relocation parameters setting #" << std::endl; + fout << "#################################################" << std::endl; + fout << "relocation: # update earthquake hypocenter and origin time (when run_mode : 2 and 3)" << std::endl; + fout << " min_Ndata: " << min_Ndata_reloc << " # if the number of data of the earthquake is less than , the earthquake will not be relocated. defaut value: 4 " << std::endl; + fout << std::endl; + + fout << " # relocation_strategy" << std::endl; + fout << " step_length : " << step_length_src_reloc << " # initial step length of relocation perturbation. 0.01 means maximum 1% perturbation for each iteration." << std::endl; + fout << " step_length_decay : " << step_length_decay_src_reloc << " # if objective function increase, step size -> step length * step_length_decay. default: 0.9" << std::endl; + + fout << " rescaling_dep_lat_lon_ortime : ["; + fout << rescaling_dep << ", " << rescaling_lat << ", " << rescaling_lon << ", " << rescaling_ortime; + fout << "] # The perturbation is related to . Unit: km,km,km,second" << std::endl; + + fout << " max_change_dep_lat_lon_ortime : ["; + fout << max_change_dep << ", " << max_change_lat << ", " << max_change_lon << ", " << max_change_ortime; + fout << "] # the change of dep,lat,lon,ortime do not exceed max_change. Unit: km,km,km,second" << std::endl; + fout << " max_iterations : " << N_ITER_MAX_SRC_RELOC <<" # maximum number of iterations for relocation" << std::endl; + fout << " tol_gradient : " << TOL_SRC_RELOC << " # if the norm of gradient is smaller than the tolerance, the iteration of relocation terminates" << std::endl; + fout << std::endl; + + fout << " # -------------- using absolute traveltime data --------------" << std::endl; + fout << " abs_time:" << std::endl; + fout << " use_abs_time : " << use_abs_reloc << " # 'yes' for using absolute traveltime data to update ortime and location; 'no' for not using (no need to set parameters in this section)" << std::endl; + fout << " residual_weight : ["; + for (int i = 0; i < n_weight; i++){ + fout << residual_weight_abs_reloc[i]; + if (i != n_weight-1) + fout << ", "; + } + fout << "] # XXX is the absolute traveltime residual (second) = abs(t^{obs}_{n,i} - t^{syn}_{n,j})" << std::endl; + fout << " distance_weight : ["; + for (int i = 0; i < n_weight; i++){ + fout << distance_weight_abs_reloc[i]; + if (i != n_weight-1) + fout << ", "; + } + fout << "] # XXX is epicenter distance (km) between the source and receiver related to the data" << std::endl; + fout << std::endl; + + fout << " # -------------- using common source differential traveltime data --------------" << std::endl; + fout << " cs_dif_time:" << std::endl; + fout << " use_cs_time : " << use_cs_reloc <<" # 'yes' for using common source differential traveltime data to update ortime and location; 'no' for not using (no need to set parameters in this section)" << std::endl; + fout << " residual_weight : ["; + for (int i = 0; i < n_weight; i++){ + fout << residual_weight_cs_reloc[i]; + if (i != n_weight-1) + fout << ", "; + } + fout << "] # XXX is the common source differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{n,j} - t^{syn}_{n,i} + t^{syn}_{n,j})." << std::endl; + fout << " azimuthal_weight : ["; + for (int i = 0; i < n_weight; i++){ + fout << azimuthal_weight_cs_reloc[i]; + if (i != n_weight-1) + fout << ", "; + } + fout << "] # XXX is the azimuth difference between two separate stations related to the common source." << std::endl; + fout << std::endl; + + fout << " # -------------- using common receiver differential traveltime data --------------" << std::endl; + fout << " cr_dif_time:" << std::endl; + fout << " use_cr_time : " << use_cr_reloc <<" # 'yes' for using common receiver differential traveltime data to update ortime and location; 'no' for not using (no need to set parameters in this section)" << std::endl; + fout << " residual_weight : ["; + for (int i = 0; i < n_weight; i++){ + fout << residual_weight_cr_reloc[i]; + if (i != n_weight-1) + fout << ", "; + } + fout << "] # XXX is the common receiver differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{m,i} - t^{syn}_{n,i} + t^{syn}_{m,i})" << std::endl; + fout << " azimuthal_weight : ["; + for (int i = 0; i < n_weight; i++){ + fout << azimuthal_weight_cr_reloc[i]; + if (i != n_weight-1) + fout << ", "; + } + fout << "] # XXX is the azimuth difference between two separate sources related to the common receiver." << std::endl; + fout << std::endl; + + fout << std::endl; + fout << " # -------------- global weight of different types of data (to balance the weight of different data) --------------" << std::endl; + fout << " global_weight:" << std::endl; + fout << " balance_data_weight: " << balance_data_weight_reloc << " # yes: over the total weight of the each type of the data. no: use original weight (below weight for each type of data needs to be set)" << std::endl; + fout << " abs_time_local_weight: " << abs_time_local_weight_reloc << " # weight of absolute traveltime data for relocation after balance, default: 1.0" << std::endl; + fout << " cs_dif_time_local_weight: " << cs_dif_time_local_weight_reloc << " # weight of common source differential traveltime data for relocation after balance, default: 1.0" << std::endl; + fout << " cr_dif_time_local_weight: " << cr_dif_time_local_weight_reloc << " # weight of common receiver differential traveltime data for relocation after balance, default: 1.0" << std::endl; + fout << std::endl; + + + fout << "####################################################################" << std::endl; + fout << "# inversion strategy for tomography and relocation #" << std::endl; + fout << "####################################################################" << std::endl; + fout << "inversion_strategy: # update model parameters and earthquake hypocenter iteratively (when run_mode : 3)" << std::endl; + fout << std::endl; + fout << " inv_mode : " << inv_mode << " # 0 for update model parameters and relocation iteratively. 1 for update model parameters and relocation simultaneously." << std::endl; + fout << std::endl; + fout << " # for inv_mode : 0, parameters below are required" << std::endl; + fout << " inv_mode_0: # update model for steps, then update location for steps, and repeat the process for loops." << std::endl; + fout << " model_update_N_iter : " << model_update_N_iter << std::endl; + fout << " relocation_N_iter : " << relocation_N_iter << std::endl; + fout << " max_loop : " << max_loop_mode0 << std::endl; + fout << std::endl; + + fout << " # for inv_mode : 1, parameters below are required" << std::endl; + fout << " inv_mode_1: # update model and location simultaneously for loops." << std::endl; + fout << " max_loop : " << max_loop_mode1 << std::endl; + fout << std::endl; + + fout << "# keep these setting unchanged, unless you are familiar with the eikonal solver in this code" << std::endl; + fout << "calculation:" << std::endl; + fout << " convergence_tolerance: " << conv_tol << " # threshold value for checking the convergence for each forward/adjoint run"<< std::endl; + fout << " max_iterations: " << max_iter << " # number of maximum iteration for each forward/adjoint run" << std::endl; + fout << " stencil_order: " << stencil_order << " # order of stencil, 1 or 3" << std::endl; + fout << " stencil_type: " << stencil_type << " # 0: , 1: first-order upwind scheme (only sweep_type 0 is supported) " << std::endl; + fout << " sweep_type: " << sweep_type << " # 0: legacy, 1: cuthill-mckee with shm parallelization" << std::endl; + fout << std::endl; + //fout << std::endl; + //fout << "debug:" << std::endl; + //fout << " debug_mode: " << int(if_test) << std::endl; + + +} + +void InputParams::setup_uniform_inv_grid() { + // set the number of inversion grid points + if (uniform_inv_grid_dep){ + if (min_dep_inv == -9999.0 || max_dep_inv == -9999.0){ + std::cout << "Error: please setup min_max_dep_inv" << std::endl; + exit(1); + } + if (max_dep_inv < min_dep_inv){ + std::cout << "Error: max_dep_inv should be larger than min_dep_inv" << std::endl; + exit(1); + } + + n_inv_r_flex = n_inv_r; + + std::vector tmp_dep_inv = linspace(min_dep_inv, max_dep_inv, n_inv_r_flex); + + if (dep_inv != nullptr) delete[] dep_inv; + + dep_inv = allocateMemory(n_inv_r_flex, 5000); + + for (int i = 0; i < n_inv_r_flex; i++){ + dep_inv[i] = tmp_dep_inv[i]; + } + + if (invgrid_ani) { + if (min_dep_inv_ani == -9999.0 || max_dep_inv_ani == -9999.0){ + std::cout << "Error: please setup min_max_dep_inv_ani" << std::endl; + exit(1); + } + if (max_dep_inv_ani < min_dep_inv_ani){ + std::cout << "Error: max_dep_inv_ani should be larger than min_dep_inv_ani" << std::endl; + exit(1); + } + + n_inv_r_flex_ani = n_inv_r_ani; + + if (dep_inv_ani != nullptr) delete[] dep_inv_ani; + + dep_inv_ani = allocateMemory(n_inv_r_flex_ani, 5003); + + tmp_dep_inv = linspace(min_dep_inv_ani, max_dep_inv_ani, n_inv_r_flex_ani); + + for (int i = 0; i < n_inv_r_flex_ani; i++){ + dep_inv_ani[i] = tmp_dep_inv[i]; + } + } + tmp_dep_inv.clear(); + + } + + + if (uniform_inv_grid_lat){ + if (min_lat_inv == -9999.0 || max_lat_inv == -9999.0){ + std::cout << "Error: please setup min_max_lat_inv_ani" << std::endl; + exit(1); + } + if (max_lat_inv < min_lat_inv){ + std::cout << "Error: max_lat_inv should be larger than min_lat_inv" << std::endl; + exit(1); + } + n_inv_t_flex = n_inv_t; + + std::vector tmp_lat_inv = linspace(min_lat_inv, max_lat_inv, n_inv_t_flex); + + if (lat_inv != nullptr) delete[] lat_inv; + + lat_inv = allocateMemory(n_inv_t_flex, 5001); + + for (int i = 0; i < n_inv_t_flex; i++){ + lat_inv[i] = tmp_lat_inv[i]; + } + + if (invgrid_ani) { + if (min_lat_inv_ani == -9999.0 || max_lat_inv_ani == -9999.0){ + std::cout << "Error: please setup min_max_lat_inv_ani" << std::endl; + exit(1); + } + if (max_lat_inv_ani < min_lat_inv_ani){ + std::cout << "Error: max_lat_inv_ani should be larger than min_lat_inv_ani" << std::endl; + exit(1); + } + + n_inv_t_flex_ani = n_inv_t_ani; + + if (lat_inv_ani != nullptr) delete[] lat_inv_ani; + + lat_inv_ani = allocateMemory(n_inv_t_flex_ani, 5004); + + tmp_lat_inv = linspace(min_lat_inv_ani, max_lat_inv_ani, n_inv_t_flex_ani); + + for (int i = 0; i < n_inv_t_flex_ani; i++){ + lat_inv_ani[i] = tmp_lat_inv[i]; + } + } + tmp_lat_inv.clear(); + } + + if (uniform_inv_grid_lon){ + if (min_lon_inv == -9999.0 || max_lon_inv == -9999.0){ + std::cout << "Error: please setup min_max_lon_inv_ani" << std::endl; + exit(1); + } + if (max_lon_inv < min_lon_inv){ + std::cout << "Error: max_lon_inv should be larger than min_lon_inv" << std::endl; + exit(1); + } + n_inv_p_flex = n_inv_p; + + std::vector tmp_lon_inv = linspace(min_lon_inv, max_lon_inv, n_inv_p_flex); + + if (lon_inv != nullptr) delete[] lon_inv; + + lon_inv = allocateMemory(n_inv_p_flex, 5002); + + for (int i = 0; i < n_inv_p_flex; i++){ + lon_inv[i] = tmp_lon_inv[i]; + } + + if (invgrid_ani) { + if (min_lon_inv_ani == -9999.0 || max_lon_inv_ani == -9999.0){ + std::cout << "Error: please setup min_max_lon_inv_ani" << std::endl; + exit(1); + } + if (max_lon_inv_ani < min_lon_inv_ani){ + std::cout << "Error: max_lon_inv_ani should be larger than min_lon_inv_ani" << std::endl; + exit(1); + } + + n_inv_p_flex_ani = n_inv_p_ani; + + if (lon_inv_ani != nullptr) delete[] lon_inv_ani; + + lon_inv_ani = allocateMemory(n_inv_p_flex_ani, 5005); + + tmp_lon_inv = linspace(min_lon_inv_ani, max_lon_inv_ani, n_inv_p_flex_ani); + + for (int i = 0; i < n_inv_p_flex_ani; i++){ + lon_inv_ani[i] = tmp_lon_inv[i]; + } + + } + tmp_lon_inv.clear(); + } +} + + + +// return radious +CUSTOMREAL InputParams::get_src_radius(const std::string& name_sim_src) { + if (src_rec_file_exist) + return depth2radius(get_src_point_bcast(name_sim_src).dep); + else + return depth2radius(src_dep); +} + + +CUSTOMREAL InputParams::get_src_lat(const std::string& name_sim_src) { + if (src_rec_file_exist) + return get_src_point_bcast(name_sim_src).lat*DEG2RAD; + else + return src_lat*DEG2RAD; +} + + +CUSTOMREAL InputParams::get_src_lon(const std::string& name_sim_src) { + if (src_rec_file_exist) + return get_src_point_bcast(name_sim_src).lon*DEG2RAD; + else + return src_lon*DEG2RAD; +} + +CUSTOMREAL InputParams::get_src_radius_2d(const std::string& name_sim_src) { + if (src_rec_file_exist) + return depth2radius(get_src_point_bcast_2d(name_sim_src).dep); + else + return depth2radius(src_dep); +} + + +CUSTOMREAL InputParams::get_src_lat_2d(const std::string& name_sim_src) { + if (src_rec_file_exist) + return get_src_point_bcast_2d(name_sim_src).lat*DEG2RAD; + else + return src_lat*DEG2RAD; +} + + +CUSTOMREAL InputParams::get_src_lon_2d(const std::string& name_sim_src) { + if (src_rec_file_exist) + return get_src_point_bcast_2d(name_sim_src).lon*DEG2RAD; + else + return src_lon*DEG2RAD; +} + + +SrcRecInfo& InputParams::get_src_point(const std::string& name_src){ + if (proc_store_srcrec) + return src_map[name_src]; + else { + // exit with error + std::cout << "Error: non-proc_store_srcrec process should not call the function get_src_point." << std::endl; + exit(1); + } +} + + +SrcRecInfo& InputParams::get_rec_point(const std::string& name_rec){ + if (proc_store_srcrec) + return rec_map[name_rec]; + else { + // exit with error + std::cout << "Error: non-proc_store_srcrec process should not call the function get_rec_point." << std::endl; + exit(1); + } +} + + +SrcRecInfo InputParams::get_src_point_bcast(const std::string& name_src){ + // + // This function returns copy of a SrcRecInfo object + // thus modifying the returned object will not affect the original object + // + + SrcRecInfo src_tmp; + + if (proc_store_srcrec) + src_tmp = src_map[name_src]; + + // broadcast + broadcast_src_info_intra_sim(src_tmp, 0); + + // return + return src_tmp; + +} + + +SrcRecInfo InputParams::get_src_point_bcast_2d(const std::string& name_src){ + // + // This function returns copy of a SrcRecInfo object + // thus modifying the returned object will not affect the original object + // + + SrcRecInfo src_tmp; + + if (proc_store_srcrec) + src_tmp = src_map_2d[name_src]; + + // broadcast + broadcast_src_info_intra_sim(src_tmp, 0); + + // return + return src_tmp; + +} + + + + + +SrcRecInfo InputParams::get_rec_point_bcast(const std::string& name_rec) { + // + // This function returns copy of a SrcRecInfo object + // thus modifying the returned object will not affect the original object + // + + SrcRecInfo rec_tmp; + + if (proc_store_srcrec) + rec_tmp = rec_map[name_rec]; + + // broadcast + broadcast_rec_info_intra_sim(rec_tmp, 0); + + return rec_tmp; + +} + + +// return source name from in-sim_group id +std::string InputParams::get_src_name(const int& local_id){ + + std::string src_name; + if (proc_store_srcrec) + src_name = src_id2name[local_id]; + + // broadcast + broadcast_str(src_name, 0); + + return src_name; +} + +std::string InputParams::get_src_name_comm(const int& local_id){ + + std::string src_name; + if (proc_store_srcrec) + src_name = src_id2name_comm_rec[local_id]; + + // broadcast + broadcast_str(src_name, 0); + + return src_name; +} + + + + +std::string InputParams::get_rec_name(const int& local_id){ + + std::string rec_name; + if (proc_store_srcrec) + rec_name = rec_id2name[local_id]; + + // broadcast + broadcast_str(rec_name, 0); + + return rec_name; +} + + +// return src global id from src name +int InputParams::get_src_id(const std::string& src_name) { + int src_id; + if (proc_store_srcrec) + src_id = src_map[src_name].id; + + // broadcast + broadcast_i_single(src_id, 0); + + return src_id; +} + + +bool InputParams::get_if_src_teleseismic(const std::string& src_name) { + bool if_src_teleseismic = false; + + if (proc_store_srcrec) + if_src_teleseismic = get_src_point(src_name).is_out_of_region; + + // broadcast to all processes within simultaneous run group + broadcast_bool_single(if_src_teleseismic, 0); + broadcast_bool_single_sub(if_src_teleseismic, 0); + + return if_src_teleseismic; +} + + +bool InputParams::get_is_T_written_into_file(const std::string& src_name) { + bool is_T_written_into_file = false; + + if (proc_store_srcrec) + is_T_written_into_file = get_src_point(src_name).is_T_written_into_file; + + // broadcast to all processes within simultaneous run group + broadcast_bool_single(is_T_written_into_file, 0); + broadcast_bool_single_sub(is_T_written_into_file, 0); + + return is_T_written_into_file; +} + + +void InputParams::prepare_src_map(){ + // + // only the + // - subdom_main process of the + // - first subdomain of the + // - first simultaneous run group + // (subdom_main==true && id_subdomain==0 && id_sim==0) reads src/rec file + // and stores entile src/rec list in src_points and rec_points + // then, the subdom_main process of each simultaneous run group (id_sim==any && subdom_main==true) retains only its own src/rec objects, + // which are actually calculated in those simultaneous run groups + // + + // assigne processor roles + proc_read_srcrec = (subdom_main && id_subdomain==0 && id_sim==0); // process which reads src/rec file (only one process per entire simulation) + proc_store_srcrec = (subdom_main && id_subdomain==0); // process which stores src/rec objects (only one process per simultaneous run group) + + // read src rec file only + if (src_rec_file_exist && proc_read_srcrec) { + + // read source and receiver data, e.g., + // event info: s0 + // data info1 (abs): r0 + // data info2 (cr_dif): r1 r2 + // data info3 (cs_dif): r3 s1 + // + // we generate the data structure: + // | abs | cs_dif | cr_dif | + // | s0 - r0 | s0 - r1 | s0 - r3 | + // | | | | | | + // | | r2 | s1 | + parse_src_rec_file(src_rec_file, \ + src_map_all, \ + rec_map_all, \ + data_map_all, \ + src_id2name_all, \ + rec_id2name_back); + + // read station correction file by all processes + if (sta_correction_file_exist) { + // store all src/rec info + parse_sta_correction_file(sta_correction_file, + rec_map_all); + } + + // copy backups (KEEPED AS THE STATE BEFORE SWAPPING SRC AND REC) + src_map_back = src_map_all; + rec_map_back = rec_map_all; + data_map_back = data_map_all; + src_id2name_back = src_id2name_all; + + // check if src positions are within the domain or not (teleseismic source) + // detected teleseismic source is separated into tele_src_points and tele_rec_points + + std::cout << std::endl << "separate regional and teleseismic src/rec points" << std::endl; + + separate_region_and_tele_src_rec_data(src_map_back, rec_map_back, data_map_back, + src_map_all, rec_map_all, data_map_all, + src_map_tele, rec_map_tele, data_map_tele, + data_type, + N_abs_local_data, + N_cr_dif_local_data, + N_cs_dif_local_data, + N_teleseismic_data, + N_data, + min_lat, max_lat, min_lon, max_lon, min_dep, max_dep, + have_tele_data); + + if (swap_src_rec) { + // we swap the source and receviver for regional earthquakes. After that, we have new data structure: + // Before: + // | abs | cs_dif | cr_dif | + // | s0 - r0 | s0 - r1 | s0 - r3 | + // | | | | | | + // | | r2 | s1 | + // + // After: + // | abs | cr_dif | cs_dif | + // | r0 - s0 | r1 - s0 r2 - s0 | r3 - s0 | + // | | | | | | | + // | | r2 r1 | s1 | + stdout_by_main("Swapping src and rec. This may take few minutes for a large dataset (only regional events will be processed)\n"); + do_swap_src_rec(src_map_all, rec_map_all, data_map_all, src_id2name_all); + int tmp = N_cr_dif_local_data; + N_cr_dif_local_data = N_cs_dif_local_data; + N_cs_dif_local_data = tmp; + } else { + // if we do not swap source and receiver, we need to process cr_dif to include the other source. After that, we have new data structure: + // Before: + // | abs | cs_dif | cr_dif | + // | s0 - r0 | s0 - r1 | s0 - r3 | + // | | | | | | + // | | r2 | s1 | + // + // After: + // | abs | cs_dif | cr_dif | + // | s0 - r0 | s0 - r1 | s0 - r3 s1 - r3 | + // | | | | | | | + // | | r2 | s1 s0 | + do_not_swap_src_rec(src_map_all, rec_map_all, data_map_all, src_id2name_all); + } + + // concatenate resional and teleseismic src/rec points + // + // src_map = src_map_all + src_map_tele + // rec_map = rec_map_all + rec_map_tele + // data_map = data_map_all + data_map_tele + // *_map_tele will be empty after this function + + std::cout << std::endl << "merge regional and teleseismic src/rec points" << std::endl; + + merge_region_and_tele_src(src_map_all, rec_map_all, data_map_all, src_id2name_all, + src_map_tele, rec_map_tele, data_map_tele); + + // abort if number of src_points are less than n_sims + int n_src_points = src_map_all.size(); + if (n_src_points < n_sims){ + std::cout << "Error: number of sources in src_rec_file is less than n_sims. Abort." << std::endl; + MPI_Abort(MPI_COMM_WORLD, 1); + } + + } // end of if (src_rec_file_exist && proc_read_srcrec) + + // wait + synchronize_all_world(); + + + // to all the subdom_main processes of each simultaneous run group + if (src_rec_file_exist) { + + if (world_rank==0) + std::cout << "\nsource assign to simultaneous run groups\n" <>>& data_map_tmp, + std::map& src_map_comm_rec_tmp, + std::vector& src_id2name_comm_rec_tmp){ + + if (proc_store_srcrec) { + + // for earthquake having common receiver differential traveltime, the synthetic traveltime should be computed first at each iteration + for(auto iter = data_map_tmp.begin(); iter != data_map_tmp.end(); iter++){ + for (auto iter2 = iter->second.begin(); iter2 != iter->second.end(); iter2++){ + for (auto& data: iter2->second){ + if (data.is_src_pair){ + // add this source and turn to the next source + src_map_comm_rec_tmp[iter->first] = src_map[iter->first]; + // add this source to the list of sources that will be looped in each iteration + // if the source is not in the list, the synthetic traveltime will not be computed + if (std::find(src_id2name_comm_rec_tmp.begin(), src_id2name_comm_rec_tmp.end(), iter->first) == src_id2name_comm_rec_tmp.end()) + src_id2name_comm_rec_tmp.push_back(iter->first); + + break; + } + } + } + } + + // check if this sim group has common source double difference traveltime + if (src_map_comm_rec_tmp.size() > 0){ + src_pair_exists = true; + } + + } // end of if (proc_store_srcrec) + + // flag if any src_pair exists + allreduce_bool_inplace_inter_sim(&src_pair_exists, 1); // inter-sim + allreduce_bool_inplace(&src_pair_exists, 1); // intra-sim / inter subdom + allreduce_bool_inplace_sub(&src_pair_exists, 1); // intra-subdom + +} + +void InputParams::initialize_adjoint_source(){ + // this funtion should be called by proc_store_srcrec + if (!proc_store_srcrec){ + std::cout << "initialize_adjoint_source function is called non-proc_store_srcrec process. aborting." << std::endl; + exit(1); + } + + for(auto iter = rec_map.begin(); iter != rec_map.end(); iter++){ + iter->second.adjoint_source = _0_CR; + iter->second.adjoint_source_density = _0_CR; + } +} + +void InputParams::set_adjoint_source(std::string name_rec, CUSTOMREAL adjoint_source){ + + // this funtion should be called by proc_store_srcrec + if (!proc_store_srcrec){ + std::cout << "set_adjoint_source function is called non-proc_store_srcrec process. aborting." << std::endl; + exit(1); + } + + if (rec_map.find(name_rec) != rec_map.end()){ + rec_map[name_rec].adjoint_source = adjoint_source; + } else { + std::cout << "error !!!, undefined receiver name when adding adjoint source: " << name_rec << std::endl; + } +} + +void InputParams::set_adjoint_source_density(std::string name_rec, CUSTOMREAL adjoint_source_density){ + + // this funtion should be called by proc_store_srcrec + if (!proc_store_srcrec){ + std::cout << "set_adjoint_source_density function is called non-proc_store_srcrec process. aborting." << std::endl; + exit(1); + } + + if (rec_map.find(name_rec) != rec_map.end()){ + rec_map[name_rec].adjoint_source_density = adjoint_source_density; + } else { + std::cout << "error !!!, undefined receiver name when adding adjoint source: " << name_rec << std::endl; + } +} + +// gather all arrival times to main simultaneous run group +// common source double difference traveltime is also gathered here +// then store them in data_map_all +void InputParams::gather_all_arrival_times_to_main(){ + + if (proc_store_srcrec) { + + for (int id_src = 0; id_src < nsrc_total; id_src++){ + + // id of simulation group for this source + int id_sim_group = select_id_sim_for_src(id_src, n_sims); + + // broadcast source name + std::string name_src; + if (proc_read_srcrec){ + name_src = src_id2name_all[id_src]; + } + broadcast_str_inter_sim(name_src, 0); + + if (id_sim_group==0) { // the simultaneous run group == 0 is the main simultaneous run group + if (id_sim == 0) { + // copy arrival time to data_info_back + for (auto iter = data_map[name_src].begin(); iter != data_map[name_src].end(); iter++){ + for(int i_data = 0; i_data < (int)iter->second.size(); i_data++){ + // store travel time in all datainfo element of each src-rec pair + data_map_all[name_src][iter->first].at(i_data).travel_time = iter->second.at(i_data).travel_time; + // common source double difference traveltime + data_map_all[name_src][iter->first].at(i_data).cs_dif_travel_time = iter->second.at(i_data).cs_dif_travel_time; + } + } + } else { + // do nothing + } + } else { // this source is calculated in the other simultaneous run group than the main + + // the main group receives the arrival time from the other simultaneous run group + if (id_sim == 0) { + // number of receivers + int nrec; + recv_i_single_sim(&nrec, id_sim_group); + + // loop over receivers + for (int id_rec = 0; id_rec < nrec; id_rec++){ + // receive name of receiver + std::string name_rec; + recv_str_sim(name_rec, id_sim_group); /////// + + // receive number of data + int ndata; + recv_i_single_sim(&ndata, id_sim_group); + + // exit if the number of data is not the same with data_map_all + if (ndata != (int)data_map_all[name_src][name_rec].size()){ + std::cout << "ERROR: the number of data calculated sub simultaneous group is not the same with data_map_all" << std::endl; + std::cout << "name_src = " << name_src << ", name_rec = " << name_rec << std::endl; + std::cout << "ndata = " << ndata << ", data_map_all[name_src][name_rec].size() = " << data_map_all[name_src][name_rec].size() << std::endl; + exit(1); // for rec_3 src_0, ndata = 1 data_map_all[][].size() = 3 + } + + // then receive travel time (and common source double difference traveltime) + for (auto& data: data_map_all[name_src][name_rec]) { + recv_cr_single_sim(&(data.travel_time), id_sim_group); + recv_cr_single_sim(&(data.cs_dif_travel_time), id_sim_group); + } + } + + // the non-main simultaneous run group sends the arrival time to the main group + } else if (id_sim == id_sim_group) { + // send number of receivers + int nrec = data_map[name_src].size(); + send_i_single_sim(&nrec, 0); + + for (auto iter = data_map[name_src].begin(); iter != data_map[name_src].end(); iter++){ + // send name of receiver + send_str_sim(iter->first, 0); + + // send number of data + int ndata = iter->second.size(); + send_i_single_sim(&ndata, 0); + + // then send travel time (and common source double difference traveltime) + for (auto& data: iter->second){ + send_cr_single_sim(&(data.travel_time), 0); + send_cr_single_sim(&(data.cs_dif_travel_time), 0); + } + } + } else { + // do nothing + } + } + + + } // end for id_src + + } // end if (proc_store_srcrec) + + synchronize_all_world(); +} + + +// gather tau_opt to main simultaneous run group +void InputParams::gather_rec_info_to_main(){ + + if (proc_store_srcrec) { + + // broadcast total number of recenver to all procs + int nrec_total = rec_map_all.size(); + broadcast_i_single_inter_sim(nrec_total, 0); + + std::vector name_rec_all; + + if (id_sim==0){ + // assigne tau_opt to rec_map_all from its own rec_map + for (auto iter = rec_map.begin(); iter != rec_map.end(); iter++){ + rec_map_all[iter->first].tau_opt = iter->second.tau_opt; + rec_map_all[iter->first].dep = iter->second.dep; + rec_map_all[iter->first].lat = iter->second.lat; + rec_map_all[iter->first].lon = iter->second.lon; + } + + // make a list of receiver names + for (auto iter = rec_map_all.begin(); iter != rec_map_all.end(); iter++){ + name_rec_all.push_back(iter->first); + } + } + + for (int irec = 0; irec < nrec_total; irec++){ + + // broadcast name of receiver + std::string name_rec; + if (id_sim==0){ + name_rec = name_rec_all[irec]; + } + broadcast_str_inter_sim(name_rec, 0); + + int rec_counter = 0; + CUSTOMREAL tau_tmp=0.0; + CUSTOMREAL dep_tmp=0.0; + CUSTOMREAL lat_tmp=0.0; + CUSTOMREAL lon_tmp=0.0; + + // copy value if rec_map[name_rec] exists + if (rec_map.find(name_rec) != rec_map.end()){ + tau_tmp = rec_map[name_rec].tau_opt; + dep_tmp = rec_map[name_rec].dep; + lat_tmp = rec_map[name_rec].lat; + lon_tmp = rec_map[name_rec].lon; + rec_counter = 1; + } + + // reduce counter and tau_tmp + allreduce_rec_map_var(rec_counter); + allreduce_rec_map_var(tau_tmp); + allreduce_rec_map_var(dep_tmp); + allreduce_rec_map_var(lat_tmp); + allreduce_rec_map_var(lon_tmp); + + // assign tau_opt to rec_map_all + if (rec_counter > 0){ + rec_map_all[name_rec].tau_opt = tau_tmp / (CUSTOMREAL)rec_counter; + rec_map_all[name_rec].dep = dep_tmp / (CUSTOMREAL)rec_counter; + rec_map_all[name_rec].lat = lat_tmp / (CUSTOMREAL)rec_counter; + rec_map_all[name_rec].lon = lon_tmp / (CUSTOMREAL)rec_counter; + } + + } // end for irec + } // end of proc_store_srcrec +} + +// gather traveltimes and calculate synthetic common receiver differential traveltime +void InputParams::gather_traveltimes_and_calc_syn_diff(){ + + if (!src_pair_exists) return; // nothing to share + + // gather all synthetic traveltimes to main simultaneous run group + gather_all_arrival_times_to_main(); + + if(subdom_main) { + + int mpi_tag_send=9999; + int mpi_tag_end=9998; + + // main process calculates differences of synthetic data and send them to other processes + if (id_sim==0){ + // int n_total_src_pair = 0; + + // calculate differences of synthetic data + for (auto iter = data_map_all.begin(); iter != data_map_all.end(); iter++){ + for (auto iter2 = iter->second.begin(); iter2 != iter->second.end(); iter2++){ + for (auto& data: iter2->second){ + if (data.is_src_pair){ + data.cr_dif_travel_time = data_map_all[data.name_src_pair[0]][data.name_rec].at(0).travel_time \ + - data_map_all[data.name_src_pair[1]][data.name_rec].at(0).travel_time; + // n_total_src_pair++; + } + } + } + } + + // send differences of synthetic data to other processes + for (int id_src = 0; id_src < nsrc_total; id_src++){ // MNMN: looping over all of data.id_src_pair[0] + + // id of simulation group for this source + int id_sim_group = select_id_sim_for_src(id_src, n_sims); + + std::string name_src = src_id2name_all[id_src]; // list of src names after swap + + // iterate over receivers + for (auto iter = data_map_all[name_src].begin(); iter != data_map_all[name_src].end(); iter++){ + std::string name_rec = iter->first; + + // iterate over data + for (int i_data = 0; i_data < (int)iter->second.size(); i_data++){ + auto& data = iter->second.at(i_data); + + if (data.is_src_pair){ + std::string name_src1 = data.name_src_pair[0]; + std::string name_src2 = data.name_src_pair[1]; + // name_src1 should be the same as name_src for set_cr_dif_to_src_pair (replace otherwise) + if (name_src1 != name_src){ + std::string tmp = name_src1; + name_src1 = name_src2; + name_src2 = tmp; + } + + if (id_sim_group == 0) { + // this source is calculated in the main simultaneous run group + set_cr_dif_to_src_pair(data_map, name_src1, name_src2, name_rec, data.cr_dif_travel_time); + } else { + // send signal with dummy int + int dummy = 0; + MPI_Send(&dummy, 1, MPI_INT, id_sim_group, mpi_tag_send, inter_sim_comm); + + // send name_src1 + send_str_sim(name_src1, id_sim_group); + // send name_src2 + send_str_sim(name_src2, id_sim_group); + // send name_rec + send_str_sim(name_rec, id_sim_group); + // send index of data + send_i_single_sim(&i_data, id_sim_group); + // send travel time difference + send_cr_single_sim(&(data.cr_dif_travel_time), id_sim_group); + } + } + } + } + } // end for id_src + + // send end signal (start from 1 because 0 is main process) + for (int id_sim = 1; id_sim < n_sims; id_sim++){ + // send dummy integer + int dummy = 0; + MPI_Send(&dummy, 1, MPI_INT, id_sim, mpi_tag_end, inter_sim_comm); + } + + // un-main process receives differences of synthetic data from main process + } else if (id_sim!=0) { + while (true) { + + // wait with mpi probe + MPI_Status status; + MPI_Probe(0, MPI_ANY_TAG, inter_sim_comm, &status); + + // receive signal with dummy int + int dummy = 0; + MPI_Recv(&dummy, 1, MPI_INT, 0, MPI_ANY_TAG, inter_sim_comm, &status); + + // if this signal is for sending data + if (status.MPI_TAG == mpi_tag_send) { + + std::string name_src1, name_src2, name_rec; + + // receive src_name1 + recv_str_sim(name_src1, 0); + // receive src_name2 + recv_str_sim(name_src2, 0); + // receive rec_name + recv_str_sim(name_rec, 0); + // receive index of data + int i_data = 0; + recv_i_single_sim(&i_data, 0); + // receive travel time difference + CUSTOMREAL tmp_ttd = 0; + recv_cr_single_sim(&(tmp_ttd), 0); + set_cr_dif_to_src_pair(data_map, name_src1, name_src2, name_rec, tmp_ttd); + + + // if this signal is for terminating the wait loop + } else if (status.MPI_TAG == mpi_tag_end) { + break; + } + + } + } + } + + synchronize_all_world(); + +} + + + +void InputParams::write_station_correction_file(int i_inv){ + if(use_sta_correction && run_mode == DO_INVERSION) { // if apply station correction + station_correction_file_out = output_dir + "/station_correction_file_step_" + int2string_zero_fill(i_inv) +".dat"; + + std::ofstream ofs; + + if (proc_read_srcrec){ // main processor of subdomain && the first id of subdoumains + + ofs.open(station_correction_file_out); + + ofs << "# stname " << " lat " << " lon " << "elevation " << " station correction (s) " << std::endl; + for(auto iter = rec_map_back.begin(); iter != rec_map_back.end(); iter++){ + SrcRecInfo rec = iter->second; + std::string name_rec = rec.name; + + // do not consider swap for teleseismic data + CUSTOMREAL sta_correct = rec_map_all[name_rec].sta_correct; + + ofs << rec.name << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << rec.lat << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << rec.lon << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << rec.dep * -1000.0 << " " + << std::fixed << std::setprecision(6) << std::setw(9) << std::right << std::setfill(' ') << sta_correct << " " + << std::endl; + } + + ofs.close(); + + } + synchronize_all_world(); + } +} + +void InputParams::write_src_rec_file(int i_inv, int i_iter) { + + if (src_rec_file_exist){ + + std::ofstream ofs; + + // gather all arrival time info to the main process (need to call even n_sim=1) + gather_all_arrival_times_to_main(); + + // gather tau_opt, lat, lon, dep info + if (run_mode == SRC_RELOCATION || run_mode == INV_RELOC){ + gather_rec_info_to_main(); + + // modify the source location and ortime + if (proc_read_srcrec){ + for(auto iter = rec_map_all.begin(); iter != rec_map_all.end(); iter++){ + src_map_back[iter->first].lat = iter->second.lat; + src_map_back[iter->first].lon = iter->second.lon; + src_map_back[iter->first].dep = iter->second.dep; + src_map_back[iter->first].year = iter->second.year; + src_map_back[iter->first].month = iter->second.month; + src_map_back[iter->first].day = iter->second.day; + src_map_back[iter->first].hour = iter->second.hour; + src_map_back[iter->first].min = iter->second.min; + src_map_back[iter->first].sec = iter->second.sec + iter->second.tau_opt; + + // correct the output ortime: + SrcRecInfo src = src_map_back[iter->first]; + // step 1, create a time stamp + std::tm timeInfo = {}; + timeInfo.tm_year = src.year - 1900; + timeInfo.tm_mon = src.month - 1; + timeInfo.tm_mday = src.day; + timeInfo.tm_hour = src.hour; + timeInfo.tm_min = src.min; + + // std::cout << "before, src.hour = " << src.hour + // << ", src.min = " << src.min + // << ", src.sec = " << src.sec << std::endl; + + if (src.sec >= - 1.0 && src.sec < 0.0) + timeInfo.tm_sec = static_cast(src.sec) - 1.0; + else + timeInfo.tm_sec = static_cast(src.sec); + + // Convert to time_point + std::time_t rawTime = timegm(&timeInfo); // use timegm for UTC + std::chrono::system_clock::time_point tp = std::chrono::system_clock::from_time_t(rawTime); + + // Get new time info + std::time_t timestamp = std::chrono::system_clock::to_time_t(tp); + std::tm newTimeInfo = *std::gmtime(×tamp); // use gmtime to keep it in UTC + + // step 2, correct the output ortime: + src_map_back[iter->first].year = newTimeInfo.tm_year + 1900; + src_map_back[iter->first].month = newTimeInfo.tm_mon + 1; + src_map_back[iter->first].day = newTimeInfo.tm_mday; + src_map_back[iter->first].hour = newTimeInfo.tm_hour; + src_map_back[iter->first].min = newTimeInfo.tm_min; + + if (src.sec >= - 1.0 && src.sec < 0.0) + src_map_back[iter->first].sec = newTimeInfo.tm_sec + (src.sec + 1.0 - static_cast(src.sec)); + else + src_map_back[iter->first].sec = newTimeInfo.tm_sec + (src.sec - static_cast(src.sec)); + + // std::cout << "after, src.hour = " << src_map_back[iter->first].hour + // << ", src.min = " << src_map_back[iter->first].min + // << ", src.sec = " << src_map_back[iter->first].sec << std::endl; + + } + } + } + + + + // write only by the main processor of subdomain && the first id of subdoumains + if (proc_read_srcrec){ + + if (run_mode == ONLY_FORWARD) + src_rec_file_out = output_dir + "/src_rec_file_forward.dat"; + else if (run_mode == DO_INVERSION){ + // write out source and receiver points with current inversion iteration number + src_rec_file_out = output_dir + "/src_rec_file_step_" + int2string_zero_fill(i_inv) +".dat"; + } else if (run_mode == INV_RELOC){ + src_rec_file_out = output_dir + "/src_rec_file_inv_" + int2string_zero_fill(i_inv) +"_reloc_" + int2string_zero_fill(i_iter)+".dat"; + } else if (run_mode == TELESEIS_PREPROCESS) { + src_rec_file_out = output_dir + "/src_rec_file_teleseis_pre.dat"; + } else if (run_mode == SRC_RELOCATION) { + src_rec_file_out = output_dir + "/src_rec_file_reloc_" + int2string_zero_fill(i_iter)+".dat"; + } else if (run_mode == ONED_INVERSION){ + src_rec_file_out = output_dir + "/src_rec_file_step_" + int2string_zero_fill(i_inv) +".dat"; + } else { + std::cerr << "Error: run_mode is not defined" << std::endl; + exit(1); + } + + // open file + ofs.open(src_rec_file_out); + + for (int i_src = 0; i_src < (int)src_id2name_back.size(); i_src++){ + + std::string name_src = src_id2name_back[i_src]; + SrcRecInfo src = src_map_back[name_src]; + bool is_tele = src.is_out_of_region; // true for teleseismic source + + // format should be the same as input src_rec_file + // source line : id_src year month day hour min sec lat lon dep_km mag num_recs id_event + ofs << std::setw(7) << std::right << std::setfill(' ') << src.id << " " + << src.year << " " << src.month << " " << src.day << " " + << src.hour << " " << src.min << " " + << std::fixed << std::setprecision(2) << std::setw(5) << std::right << std::setfill(' ') << src.sec << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << src.lat << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << src.lon << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << src.dep << " " + << std::fixed << std::setprecision(2) << std::setw(5) << std::right << std::setfill(' ') << src.mag << " " + << std::setw(5) << std::right << std::setfill(' ') << src.n_data << " " + << src.name << " " + << std::fixed << std::setprecision(4) << std::setw(6) << std::right << std::setfill(' ') << 1.0 // the weight of source is assigned to data + << std::endl; + + + // iterate data lines of i_src + for (auto& name_data : rec_id2name_back[i_src]){ + // name_data has one receiver (r0), or a receiver pair (r0+r1), or one source and one receiver (r0+s1) + + std::string name_rec1, name_rec2, name_src2; // receivers' (or source's) name (before swap) + + // data type flag + bool src_rec_data = false; + bool src_pair_data = false; + bool rec_pair_data = false; + + // store reference of data to be written + DataInfo& data = const_cast(data_map_back[name_src][name_data.at(0)].at(0)); // dummy copy + + if (name_data.size() == 2 && name_data.at(1) == "abs"){ // abs data + name_rec1 = name_data.at(0); + src_rec_data = true; + if (get_is_srcrec_swap() && !is_tele) + data = get_data_src_rec(data_map_all[name_rec1][name_src]); + else + data = get_data_src_rec(data_map_all[name_src][name_rec1]); + + } else if (name_data.size() == 3 && name_data.at(2) == "cs"){ // cs_dif data + name_rec1 = name_data.at(0); + name_rec2 = name_data.at(1); + rec_pair_data = true; + if (get_is_srcrec_swap() && !is_tele) // cs_dif data -> cr_dif data + data = get_data_src_pair(data_map_all, name_rec1, name_rec2, name_src); + else // cs_dif data + data = get_data_rec_pair(data_map_all, name_src, name_rec1, name_rec2); + + } else if (name_data.size() == 3 && name_data.at(2) == "cr"){ // cr_dif data + name_rec1 = name_data.at(0); + name_src2 = name_data.at(1); + src_pair_data = true; + if (get_is_srcrec_swap() && !is_tele) // cr_dif -> cs_dif + data = get_data_rec_pair(data_map_all, name_rec1, name_src, name_src2); + else // cr_dif + data = get_data_src_pair(data_map_all, name_src, name_src2, name_rec1); + + } else{ // error data type + std::cerr << "Error: incorrect data type in rec_id2name_back" << std::endl; + exit(1); + } + + + // absolute traveltime data + if (src_rec_data){ + SrcRecInfo rec = rec_map_back[name_rec1]; + CUSTOMREAL travel_time = data.travel_time; + + // receiver line : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arival_time + ofs << std::setw(7) << std::right << std::setfill(' ') << src.id << " " + << std::setw(5) << std::right << std::setfill(' ') << rec.id << " " + << rec.name << " " + << std::fixed << std::setprecision(4) << std::setw(9) << rec.lat << " " + << std::fixed << std::setprecision(4) << std::setw(9) << rec.lon << " " + << std::fixed << std::setprecision(4) << std::setw(9) << -1.0*rec.dep*1000.0 << " " + << data.phase << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << travel_time << " " + << std::fixed << std::setprecision(4) << std::setw(6) << std::right << std::setfill(' ') << data.data_weight + << std::endl; + + // common source differential traveltime + } else if (rec_pair_data){ + // common source differential traveltime data + CUSTOMREAL cs_dif_travel_time; + + if (get_is_srcrec_swap() && !is_tele){ // reverse swap src and rec + cs_dif_travel_time = data.cr_dif_travel_time; + } else {// do not swap + cs_dif_travel_time = data.cs_dif_travel_time; + } + + SrcRecInfo& rec1 = rec_map_back[name_rec1]; + SrcRecInfo& rec2 = rec_map_back[name_rec2]; + + // receiver pair line : id_src id_rec1 name_rec1 lat1 lon1 elevation_m1 id_rec2 name_rec2 lat2 lon2 elevation_m2 phase differential_arival_time + ofs << std::setw(7) << std::right << std::setfill(' ') << src.id << " " + << std::setw(5) << std::right << std::setfill(' ') << rec1.id << " " + << rec1.name << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << rec1.lat << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << rec1.lon << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << -1.0*rec1.dep*1000.0 << " " + << std::setw(5) << std::right << std::setfill(' ') << rec2.id << " " + << rec2.name << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << rec2.lat << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << rec2.lon << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << -1.0*rec2.dep*1000.0 << " " + << data.phase << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << cs_dif_travel_time << " " + << std::fixed << std::setprecision(4) << std::setw(6) << std::right << std::setfill(' ') << data.data_weight + << std::endl; + + // common receiver differential traveltime + } else if (src_pair_data){ + // common receiver differential traveltime data + CUSTOMREAL cr_dif_travel_time; + + if (get_is_srcrec_swap() && !is_tele){ // reverse swap src and rec + cr_dif_travel_time = data.cs_dif_travel_time; + } else {// do not swap + cr_dif_travel_time = data.cr_dif_travel_time; + } + + SrcRecInfo& rec1 = rec_map_back[name_rec1]; + SrcRecInfo& src2 = src_map_back[name_src2]; + + // receiver pair line : id_src id_rec1 name_rec1 lat1 lon1 elevation_m1 id_rec2 name_rec2 lat2 lon2 elevation_m2 phase differential_arival_time + ofs << std::setw(7) << std::right << std::setfill(' ') << src.id << " " + << std::setw(5) << std::right << std::setfill(' ') << rec1.id << " " + << rec1.name << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << rec1.lat << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << rec1.lon << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << -1.0*rec1.dep*1000.0 << " " + << std::setw(5) << std::right << std::setfill(' ') << src2.id << " " + << src2.name << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << src2.lat << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << src2.lon << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << src2.dep << " " + << data.phase << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << cr_dif_travel_time << " " + << std::fixed << std::setprecision(4) << std::setw(6) << std::right << std::setfill(' ') << data.data_weight + << std::endl; + } + + } // end of rec loop + + } // end of for (int i_src = 0; i_src < (int)src_name_list.size(); i_src++) + + // close file + ofs.close(); + + // only for source relocation, output relocated observational data for tomography + if (run_mode == SRC_RELOCATION || run_mode == INV_RELOC) { + if (run_mode == INV_RELOC) + src_rec_file_out = output_dir + "/src_rec_file_inv_" + int2string_zero_fill(i_inv) +"_reloc_" + int2string_zero_fill(i_iter)+"_obs.dat"; + else if (run_mode == SRC_RELOCATION) + src_rec_file_out = output_dir + "/src_rec_file_reloc_" + int2string_zero_fill(i_iter)+"_obs.dat"; + + // open file + ofs.open(src_rec_file_out); + + for (int i_src = 0; i_src < (int)src_id2name_back.size(); i_src++){ + + std::string name_src = src_id2name_back[i_src]; + SrcRecInfo src = src_map_back[name_src]; + bool is_tele = src.is_out_of_region; // true for teleseismic source + + // format should be the same as input src_rec_file + // source line : id_src yearm month day hour min sec lat lon dep_km mag num_recs id_event + ofs << std::setw(7) << std::right << std::setfill(' ') << src.id << " " + << src.year << " " << src.month << " " << src.day << " " + << src.hour << " " << src.min << " " + << std::fixed << std::setprecision(2) << std::setw(5) << std::right << std::setfill(' ') << src.sec << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << src.lat << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << src.lon << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << src.dep << " " + << std::fixed << std::setprecision(2) << std::setw(5) << std::right << std::setfill(' ') << src.mag << " " + << std::setw(5) << std::right << std::setfill(' ') << src.n_data << " " + << src.name << " " + << std::fixed << std::setprecision(4) << std::setw(6) << std::right << std::setfill(' ') << 1.0 // the weight of source is assigned to data + << std::endl; + + // iterate data lines of i_src + for (auto& name_data : rec_id2name_back[i_src]){ + // name_data has one receiver (r0), or a receiver pair (r0+r1), or one source and one receiver (r0+s1) + + std::string name_rec1, name_rec2, name_src2; // receivers' (or source's) name (before swap) + + // data type flag + bool src_rec_data = false; + bool src_pair_data = false; + bool rec_pair_data = false; + + // store reference of data to be written + DataInfo& data = const_cast(data_map_back[name_src][name_data.at(0)].at(0)); // dummy copy + + if (name_data.size() == 2 && name_data.at(1) == "abs"){ // abs data + name_rec1 = name_data.at(0); + src_rec_data = true; + if (get_is_srcrec_swap() && !is_tele) + data = get_data_src_rec(data_map_all[name_rec1][name_src]); // valid, for relocation, sources and receivers are always swapped + else + data = get_data_src_rec(data_map_all[name_src][name_rec1]); // invalid + } else if (name_data.size() == 3 && name_data.at(2) == "cs"){ // cs_dif data + name_rec1 = name_data.at(0); + name_rec2 = name_data.at(1); + rec_pair_data = true; + if (get_is_srcrec_swap() && !is_tele) // cs_dif data -> cr_dif data + data = get_data_src_pair(data_map_all, name_rec1, name_rec2, name_src); // valid, swapped + else // cs_dif data + data = get_data_rec_pair(data_map_all, name_src, name_rec1, name_rec2); // invalid + } else if (name_data.size() == 3 && name_data.at(2) == "cr"){ // cr_dif data + name_rec1 = name_data.at(0); + name_src2 = name_data.at(1); + src_pair_data = true; + if (get_is_srcrec_swap() && !is_tele) // cr_dif -> cs_dif + data = get_data_rec_pair(data_map_all, name_rec1, name_src, name_src2); // These data are not inverted in relocation. But we need to print them out. + else // cr_dif + data = get_data_src_pair(data_map_all, name_src, name_src2, name_rec1); // invalid + + } else{ // error data type + std::cerr << "Error: incorrect data type in rec_id2name_back" << std::endl; + exit(1); + } + + + // original absolute traveltime data + if (src_rec_data){ + + // check mandatory condition for earthquake relocation + if (!get_is_srcrec_swap()) { + std::cerr << "Error: src_rec_data is not swapped in src relocation mode!" << std::endl; + exit(1); + } + + SrcRecInfo rec = rec_map_back[name_rec1]; + CUSTOMREAL travel_time_obs = data.travel_time_obs - rec_map_all[name_src].tau_opt; + + // receiver line : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arival_time + ofs << std::setw(7) << std::right << std::setfill(' ') << src.id << " " + << std::setw(5) << std::right << std::setfill(' ') << rec.id << " " + << rec.name << " " + << std::fixed << std::setprecision(4) << std::setw(9) << rec.lat << " " + << std::fixed << std::setprecision(4) << std::setw(9) << rec.lon << " " + << std::fixed << std::setprecision(4) << std::setw(9) << -1.0*rec.dep*1000.0 << " " + << data.phase << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << travel_time_obs << " " + << std::fixed << std::setprecision(4) << std::setw(6) << std::right << std::setfill(' ') << data.data_weight + << std::endl; + + // original common source differential traveltime (not used in relocation currently, but still need to be printed out) + } else if (rec_pair_data){ + + // check mandatory condition for earthquake relocation + if (!get_is_srcrec_swap()) { + std::cerr << "Error: src_rec_data is not swapped in src relocation mode!" << std::endl; + exit(1); + } + + // common source differential traveltime data + SrcRecInfo& rec1 = rec_map_back[name_rec1]; + SrcRecInfo& rec2 = rec_map_back[name_rec2]; + CUSTOMREAL cs_dif_travel_time_obs = data.cr_dif_travel_time_obs; + + // receiver pair line : id_src id_rec1 name_rec1 lat1 lon1 elevation_m1 id_rec2 name_rec2 lat2 lon2 elevation_m2 phase differential_arival_time + ofs << std::setw(7) << std::right << std::setfill(' ') << src.id << " " + << std::setw(5) << std::right << std::setfill(' ') << rec1.id << " " + << rec1.name << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << rec1.lat << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << rec1.lon << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << -1.0*rec1.dep*1000.0 << " " + << std::setw(5) << std::right << std::setfill(' ') << rec2.id << " " + << rec2.name << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << rec2.lat << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << rec2.lon << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << -1.0*rec2.dep*1000.0 << " " + << data.phase << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << cs_dif_travel_time_obs << " " + << std::fixed << std::setprecision(4) << std::setw(6) << std::right << std::setfill(' ') << data.data_weight + << std::endl; + + // common receiver differential traveltime + } else if (src_pair_data){ // common receiver differential traveltime + // check mandatory condition for earthquake relocation + if (!get_is_srcrec_swap()) { + std::cerr << "Error: src_rec_data is not swapped in src relocation mode!" << std::endl; + exit(1); + } + + // common receiver differential traveltime data + SrcRecInfo& rec1 = rec_map_back[name_rec1]; + SrcRecInfo& src2 = src_map_back[name_src2]; + CUSTOMREAL cr_dif_travel_time_obs = data.cs_dif_travel_time_obs - rec_map_all[name_src].tau_opt + rec_map_all[name_src2].tau_opt; + + + // receiver pair line : id_src id_rec1 name_rec1 lat1 lon1 elevation_m1 id_rec2 name_rec2 lat2 lon2 elevation_m2 phase differential_arival_time + ofs << std::setw(7) << std::right << std::setfill(' ') << src.id << " " + << std::setw(5) << std::right << std::setfill(' ') << rec1.id << " " + << rec1.name << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << rec1.lat << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << rec1.lon << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << -1.0*rec1.dep*1000.0 << " " + << std::setw(5) << std::right << std::setfill(' ') << src2.id << " " + << src2.name << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << src2.lat << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << src2.lon << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << src2.dep << " " + << data.phase << " " + << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << cr_dif_travel_time_obs << " " + << std::fixed << std::setprecision(4) << std::setw(6) << std::right << std::setfill(' ') << data.data_weight + << std::endl; + } + } // end of rec loop + + } // end of src loop + + // close file + ofs.close(); + + } // end of run_mode == SRC_RELOCATION + } // end if (proc_read_srcrec) + + + } // end of src_rec_file_exist + + // wait till the main process finishes to write the output file + synchronize_all_world(); ///////////////////// + +} + + +// check contradictory parameters +void InputParams::check_contradictions(){ + + // if run_mode == 0 then the max_iter should be 1 + if (run_mode == ONLY_FORWARD && max_iter_inv > 1){ + if(myrank == 0){ + std::cout << "Warning: run_mode = 0, max_iter should be 1" << std::endl; + } + max_iter_inv = 1; + } + + if (n_subprocs > 1 && sweep_type != SWEEP_TYPE_LEVEL){ + if(myrank == 0){ + std::cout << "Warning: n_subprocs > 1 but do not use SWEEP_TYPE_LEVEL, sweep_type changes to SWEEP_TYPE_LEVEL" << std::endl; + } + sweep_type = SWEEP_TYPE_LEVEL; + } + + // if run_mode == 4 (1d inversion), only source parallelization is allowed + if (run_mode == 4 && (ndiv_k > 1 || ndiv_j > 1 || ndiv_i > 1 || n_subprocs > 1)){ + if(myrank == 0){ + std::cout << "Error: run_mode = 4, only source parallelization is allowed" << std::endl; + std::cout << "Please set ndiv_rtp: [1,1,1] and nproc_sub: 1 in the input_params.yaml file" << std::endl; + } + exit(1); + } + + // if run_mode == 4, only absolute traveltime data is allowed + if (run_mode == 4){ + if(myrank == 0){ + std::cout << "Notify: since run_mode = 4, only absolute traveltime data is allowed" << std::endl; + std::cout << "use_abs_time is set to be true" << std::endl; + use_abs = true; + std::cout << "use_cs_time is set to be false" << std::endl; + use_cs = false; + std::cout << "use_cr_time is set to be false" << std::endl; + use_cr = false; + } + + } + +#ifdef USE_CUDA + if (use_gpu){ + + if (sweep_type != SWEEP_TYPE_LEVEL || n_subprocs != 1){ + if(world_rank == 0) { + std::cout << "ERROR: In GPU mode, sweep_type must be 1 and n_subprocs must be 1." << std::endl; + std::cout << "Abort." << std::endl; + } + MPI_Finalize(); + exit(1); + } + } +#else + if (use_gpu){ + if(world_rank == 0) { + std::cout << "ERROR: TOMOATT is not compiled with CUDA." << std::endl; + std::cout << "Abort." << std::endl; + } + MPI_Finalize(); + exit(1); + } +#endif +} + + + +// station correction kernel +void InputParams::station_correction_update(CUSTOMREAL stepsize){ + + if (!use_sta_correction) + return; + + // station correction kernel is generated in the main process and sent the value to all other processors + + // step 1, gather all arrival time info to the main process + gather_all_arrival_times_to_main(); + + // update station correction in rank0 (proc_read_srcrec = (id_sim = 0 && id_subdomain = 0 && subdom_main = true && )) + // update rec_map_full, which comprises all the receivers + if (proc_read_srcrec){ + + // step 2 initialize the kernel K_{\hat T_i} + for (auto iter = rec_map_all.begin(); iter != rec_map_all.end(); iter++){ + iter->second.sta_correct_kernel = 0.0; + } + + CUSTOMREAL max_kernel = 0.0; + + // step 3, calculate the kernel + for (auto it_src = data_map_all.begin(); it_src != data_map_all.end(); it_src++){ + for (auto it_rec = it_src->second.begin(); it_rec != it_src->second.end(); it_rec++){ + + for (const auto& data : it_rec->second){ + + // absolute traveltime + if (data.is_src_rec){ + std::cout << "teleseismic data, absolute traveltime is not supported now" << std::endl; + + // common receiver differential traveltime + } else if (data.is_src_pair) { + std::cout << "teleseismic data, common receiver differential traveltime is not supported now" << std::endl; + + // common source differential traveltime + } else if (data.is_rec_pair) { // here is for checking the flag (if data is swapped, is_rec_pair was originally is_src_pair) + std::string name_src = data.name_src; + std::string name_rec1 = data.name_rec_pair[0]; + std::string name_rec2 = data.name_rec_pair[1]; + + CUSTOMREAL syn_dif_time = data.cs_dif_travel_time; + CUSTOMREAL obs_dif_time = data.cs_dif_travel_time_obs; + rec_map_all[name_rec1].sta_correct_kernel += _2_CR *(syn_dif_time - obs_dif_time \ + + rec_map_all[name_rec1].sta_correct - rec_map_all[name_rec2].sta_correct)*data.weight; + rec_map_all[name_rec2].sta_correct_kernel -= _2_CR *(syn_dif_time - obs_dif_time \ + + rec_map_all[name_rec1].sta_correct - rec_map_all[name_rec2].sta_correct)*data.weight; + + max_kernel = std::max(max_kernel,std::abs(rec_map_all[name_rec1].sta_correct_kernel)); + max_kernel = std::max(max_kernel,std::abs(rec_map_all[name_rec2].sta_correct_kernel)); + } + + } + } + } + + // step 4, update station correction + for (auto iter = rec_map_all.begin(); iter!=rec_map_all.end(); iter++){ + iter->second.sta_correct -= iter->second.sta_correct_kernel / max_kernel * stepsize; + } + + } // end of if (proc_read_srcrec) + + // step 5, send the station correction to all procesors. So they can consider station correction when calculating obj and adj source. + if (proc_store_srcrec){ + CUSTOMREAL sta_correct = 0.0; + std::vector rec_map_all_name; + std::string sta_name; + int Nsta = 0; + // for rank0, who has rec_map_all + if (id_sim == 0){ + Nsta = rec_map_all.size(); + for (auto iter = rec_map_all.begin(); iter != rec_map_all.end(); iter++){ + rec_map_all_name.push_back(iter->first); + } + } + broadcast_i_single_inter_sim(Nsta,0); + + // loop over all receivers + for (int i = 0; i < Nsta; i++){ + // broadcast sta_name and sta_correction to all processors + if (id_sim == 0){ + sta_name = rec_map_all_name[i]; + sta_correct = rec_map_all[sta_name].sta_correct; + } + broadcast_str_inter_sim(sta_name,0); + broadcast_cr_single_inter_sim(sta_correct,0); + + // update rec_map + if (rec_map.find(sta_name) != rec_map.end()){ + rec_map[sta_name].sta_correct = sta_correct; + } + } + } +} + +void InputParams::modify_swapped_source_location() { + if (proc_store_srcrec) { + for(auto iter = rec_map.begin(); iter != rec_map.end(); iter++){ + src_map_back[iter->first].lat = iter->second.lat; + src_map_back[iter->first].lon = iter->second.lon; + src_map_back[iter->first].dep = iter->second.dep; + src_map_back[iter->first].sec = iter->second.sec + iter->second.tau_opt; + } + } +} + + +template +void InputParams::allreduce_rec_map_var(T& var){ + + T tmp_var = (T)var; + + if (subdom_main){ + // allreduce sum the variable var of rec_map[name_rec] to all + // some process has rec_map[name_rec], some process does not have it + + // step 1, gather all the variable var + + // allreduce the variable var to the main process + // if T is CUSTOMREAL + if (std::is_same::value){ + CUSTOMREAL v = tmp_var; // for compiler warning + allreduce_cr_sim_single_inplace(v); + tmp_var = v; // for compiler warning + // if T is int + } else if (std::is_same::value){ + int v = tmp_var; // for compiler warning + allreduce_i_sim_single_inplace(v); + tmp_var = v; // for compiler warning + } else { + //error + std::cout << "error in allreduce_rec_map_var" << std::endl; + exit(1); + } + } + + // assign the value to the variable var + var = tmp_var; + +} + + +void InputParams::allreduce_rec_map_vobj_src_reloc(){ + if(proc_store_srcrec){ + // send total number of rec_map_all.size() to all processors + int n_rec_all; + std::vector name_rec_all; + if (proc_read_srcrec){ + n_rec_all = rec_map_all.size(); + for (auto iter = rec_map_all.begin(); iter != rec_map_all.end(); iter++){ + name_rec_all.push_back(iter->first); + } + } + + // broadcast n_rec_all to all processors + broadcast_i_single_inter_sim(n_rec_all,0); + + for (int i_rec = 0; i_rec < n_rec_all; i_rec++){ + // broadcast name_rec_all[i_rec] to all processors + std::string name_rec; + if (id_sim == 0) + name_rec = name_rec_all[i_rec]; + + broadcast_str_inter_sim(name_rec,0); + + // allreduce the vobj_src_reloc of rec_map_all[name_rec] to all processors + if (rec_map.find(name_rec) != rec_map.end()){ + allreduce_rec_map_var(rec_map[name_rec].vobj_src_reloc); + + } else { + CUSTOMREAL dummy = 0; + allreduce_rec_map_var(dummy); + + } + } + } +} + + +void InputParams::allreduce_rec_map_grad_src(){ + if(proc_store_srcrec){ + // send total number of rec_map_all.size() to all processors + int n_rec_all; + std::vector name_rec_all; + if (proc_read_srcrec){ + n_rec_all = rec_map_all.size(); + for (auto iter = rec_map_all.begin(); iter != rec_map_all.end(); iter++){ + name_rec_all.push_back(iter->first); + } + } + + // broadcast n_rec_all to all processors + broadcast_i_single_inter_sim(n_rec_all,0); + + for (int i_rec = 0; i_rec < n_rec_all; i_rec++){ + // broadcast name_rec_all[i_rec] to all processors + std::string name_rec; + if (id_sim == 0) + name_rec = name_rec_all[i_rec]; + + broadcast_str_inter_sim(name_rec,0); + + // allreduce the grad_chi_ijk of rec_map_all[name_rec] to all processors + if (rec_map.find(name_rec) != rec_map.end()){ + allreduce_rec_map_var(rec_map[name_rec].grad_chi_i); + allreduce_rec_map_var(rec_map[name_rec].grad_chi_j); + allreduce_rec_map_var(rec_map[name_rec].grad_chi_k); + allreduce_rec_map_var(rec_map[name_rec].grad_tau); + allreduce_rec_map_var(rec_map[name_rec].Ndata); + } else { + CUSTOMREAL dummy = 0; + allreduce_rec_map_var(dummy); + dummy = 0; + allreduce_rec_map_var(dummy); + dummy = 0; + allreduce_rec_map_var(dummy); + dummy = 0; + allreduce_rec_map_var(dummy); + int dummy_int = 0; + allreduce_rec_map_var(dummy_int); + } + } + } +} + +void InputParams::check_increasing(CUSTOMREAL* arr_inv_grid, int n_grid, std::string name){ + for (int i = 0; i < n_grid-1; i++){ + if(arr_inv_grid[i] >= arr_inv_grid[i+1]){ + std::cout << "ERROR: inversion grid of " << name << " should be monotonically increasing: " << arr_inv_grid[i] << ", " << arr_inv_grid[i+1] << std::endl; + exit(1); + } + } +} + +void InputParams::check_inv_grid(){ + // check point 1, inversion grid should be monotonically increasing + check_increasing(dep_inv, n_inv_r_flex, "depth"); + check_increasing(lat_inv, n_inv_t_flex, "latitude"); + check_increasing(lon_inv, n_inv_p_flex, "longitude"); + if(invgrid_ani){ + check_increasing(dep_inv_ani, n_inv_r_flex_ani, "depth_ani"); + check_increasing(lat_inv_ani, n_inv_t_flex_ani, "latitude_ani"); + check_increasing(lon_inv_ani, n_inv_p_flex_ani, "longitude_ani"); + } + + // check point 2, inversion grid should cover the model + if(myrank == 0 && id_sim ==0){ + std::cout << "checking the inversion grid ..." << std::endl; + std::cout << std::endl; + } + + check_lower_bound(dep_inv, n_inv_r_flex, min_dep, "depth"); + check_upper_bound(dep_inv, n_inv_r_flex, max_dep, "depth"); + check_lower_bound(lat_inv, n_inv_t_flex, min_lat, "latitude"); + check_upper_bound(lat_inv, n_inv_t_flex, max_lat, "latitude"); + check_lower_bound(lon_inv, n_inv_p_flex, min_lon, "longitude"); + check_upper_bound(lon_inv, n_inv_p_flex, max_lon, "longitude"); + if(invgrid_ani){ + check_lower_bound(dep_inv_ani, n_inv_r_flex_ani, min_dep, "depth_ani"); + check_upper_bound(dep_inv_ani, n_inv_r_flex_ani, max_dep, "depth_ani"); + check_lower_bound(lat_inv_ani, n_inv_t_flex_ani, min_lat, "latitude_ani"); + check_upper_bound(lat_inv_ani, n_inv_t_flex_ani, max_lat, "latitude_ani"); + check_lower_bound(lon_inv_ani, n_inv_p_flex_ani, min_lon, "longitude_ani"); + check_upper_bound(lon_inv_ani, n_inv_p_flex_ani, max_lon, "longitude_ani"); + } + +} + +void InputParams::check_lower_bound(CUSTOMREAL*& arr, int& n_grid, CUSTOMREAL lower_bound, std::string name){ + + if (arr[0] > lower_bound){ + + CUSTOMREAL grid2 = std::min(lower_bound, 2*arr[0] - arr[1]); + CUSTOMREAL grid1 = 2*grid2 - arr[0]; + if(myrank == 0 && id_sim ==0){ + std::cout << "lower bound of " << name << " inversion grid " << arr[0] << " is greater than computational domain " + << lower_bound << std::endl; + std::cout << "Two additional inversion grid: " << grid1 << ", " << grid2 << " are added." << std::endl; + std::cout << std::endl; + } + CUSTOMREAL* new_arr = new CUSTOMREAL[n_grid+2]; + new_arr[0] = grid1; + new_arr[1] = grid2; + for (int i = 0; i < n_grid; i++){ + new_arr[i+2] = arr[i]; + } + delete[] arr; + arr = new_arr; + n_grid += 2; + + } else if (arr[0] <= lower_bound && arr[1] > lower_bound){ + + CUSTOMREAL grid1 = 2*arr[0] - arr[1]; + if(myrank == 0 && id_sim ==0){ + std::cout << "sub lower bound of " << name << " inversion grid " << arr[1] << " is greater than computational domain " + << lower_bound << std::endl; + std::cout << "One additional inversion grid: " << grid1 << " is added." << std::endl; + std::cout << std::endl; + } + CUSTOMREAL* new_arr = new CUSTOMREAL[n_grid+1]; + new_arr[0] = grid1; + for (int i = 0; i < n_grid; i++){ + new_arr[i+1] = arr[i]; + } + delete[] arr; + arr = new_arr; + n_grid += 1; + } +} + +void InputParams::check_upper_bound(CUSTOMREAL*& arr, int& n_grid, CUSTOMREAL upper_bound, std::string name){ + if (arr[n_grid-1] < upper_bound){ + + CUSTOMREAL grid1 = std::max(upper_bound, 2*arr[n_grid-1] - arr[n_grid-2]); + CUSTOMREAL grid2 = 2*grid1 - arr[n_grid-1]; + if(myrank == 0 && id_sim ==0){ + std::cout << "upper bound of " << name << " inversion grid " << arr[n_grid-1] << " is less than computational domain " + << upper_bound << std::endl; + std::cout << "Two additional inversion grid: " << grid1 << ", " << grid2 << " are added." << std::endl; + std::cout << std::endl; + } + CUSTOMREAL* new_arr = new CUSTOMREAL[n_grid+2]; + for (int i = 0; i < n_grid; i++){ + new_arr[i] = arr[i]; + } + new_arr[n_grid] = grid1; + new_arr[n_grid+1] = grid2; + delete[] arr; + arr = new_arr; + n_grid += 2; + + } else if (arr[n_grid-1] >= upper_bound && arr[n_grid-2] < upper_bound){ + + CUSTOMREAL grid1 = 2*arr[n_grid-1] - arr[n_grid-2]; + if(myrank == 0 && id_sim ==0){ + std::cout << "sub upper bound of " << name << " inversion grid " << arr[n_grid-2] << " is less than computational domain " + << upper_bound << std::endl; + std::cout << "One additional inversion grid: " << grid1 << " is added." << std::endl; + std::cout << std::endl; + } + CUSTOMREAL* new_arr = new CUSTOMREAL[n_grid+1]; + for (int i = 0; i < n_grid; i++){ + new_arr[i] = arr[i]; + } + new_arr[n_grid] = grid1; + delete[] arr; + arr = new_arr; + n_grid += 1; + } +} diff --git a/src/inv_grid.cpp b/src/inv_grid.cpp new file mode 100644 index 0000000..ccf4a2e --- /dev/null +++ b/src/inv_grid.cpp @@ -0,0 +1,229 @@ +#include "inv_grid.h" + + +// +// utilities for inversion grid setup +// + +#define ON_R 0 +#define ON_T 1 +#define ON_P 2 + + +InvGrid1dBase inv_1d_grid_selector(InputParams& IP, const int id_axis, const int n_points) { + if (id_axis == ON_R) + return InvGrid1d(IP, n_points, IP.get_dep_inv()); // regular grid for radius + else if (id_axis == ON_T) + return InvGrid1d(IP, n_points, IP.get_lat_inv(), IP.get_trapezoid(), n_inv_K_loc, IP.get_dep_inv()); // regular grid for lat + else if (id_axis == ON_P) + return InvGrid1d(IP, n_points, IP.get_lon_inv(), IP.get_trapezoid(), n_inv_K_loc, IP.get_dep_inv()); // regular grid for lat + else { + std::cout << "unknown id_axis" << std::endl; + exit(1); + } +} + + +InvGrid1dBase inv_1d_grid_selector_ani(InputParams& IP, const int id_axis, const int n_points) { + if (id_axis == ON_R) + return InvGrid1d(IP, n_points, IP.get_dep_inv_ani()); // regular grid for radius + else if (id_axis == ON_T) + return InvGrid1d(IP, n_points, IP.get_lat_inv_ani(), IP.get_trapezoid_ani(), n_inv_K_loc_ani, IP.get_dep_inv_ani()); // regular grid for lat + else if (id_axis == ON_P) + return InvGrid1d(IP, n_points, IP.get_lon_inv_ani(), IP.get_trapezoid_ani(), n_inv_K_loc_ani, IP.get_dep_inv_ani()); // regular grid for lat + else { + std::cout << "unknown id_axis" << std::endl; + exit(1); + } +} + + +// +// Inversion grid class definition +// + + +InvGrid::InvGrid(InputParams& IP) { + + // check the inversion grid + IP.check_inv_grid(); + + // read the parameters and store them in this class + get_inv_grid_params(IP); + + // create 1D inversion grid for each dimension. + // t and p grids are not 1D but 2D grids for a trapezoidal definition of the grid. + + // r (radius) grid + r = inv_1d_grid_selector(IP, ON_R, n_inv_K_loc); + // t (latitude) grid + t = inv_1d_grid_selector(IP, ON_T, n_inv_J_loc); + // p (longitude) grid + p = inv_1d_grid_selector(IP, ON_P, n_inv_I_loc); + + // inversion grid for anisotropic parameters + if (IP.get_invgrid_ani()){ + // r (radius) grid + r_ani = inv_1d_grid_selector_ani(IP, ON_R, n_inv_K_loc_ani); + // t (latitude) grid + t_ani = inv_1d_grid_selector_ani(IP, ON_T, n_inv_J_loc_ani); + // p (longitude) grid + p_ani = inv_1d_grid_selector_ani(IP, ON_P, n_inv_I_loc_ani); + } else { + // use the same inversion grid with slowessw + r_ani = r; + t_ani = t; + p_ani = p; + } +} + + +InvGrid::~InvGrid() { +} + +void InvGrid::get_inv_grid_params(InputParams& IP) { + + n_inv_grids = IP.get_n_inversion_grid(); + + // inversion grid for velocity + n_inv_K_loc = IP.get_n_inv_r_flex(); + n_inv_J_loc = IP.get_n_inv_t_flex(); + n_inv_I_loc = IP.get_n_inv_p_flex(); + + // inversion grid for anisotropy + if(IP.get_invgrid_ani()){ + n_inv_K_loc_ani = IP.get_n_inv_r_flex_ani(); + n_inv_J_loc_ani = IP.get_n_inv_t_flex_ani(); + n_inv_I_loc_ani = IP.get_n_inv_p_flex_ani(); + } else { + // use the same inversion grid with slowessw + n_inv_I_loc_ani = n_inv_I_loc; + n_inv_J_loc_ani = n_inv_J_loc; + n_inv_K_loc_ani = n_inv_K_loc; + } +} + + +void InvGrid::write_inversion_grid_to_file(){ + if(world_rank == 0){ + std::ofstream ofs; + + std::string inversion_grid_file_out = output_dir + "/inversion_grid.txt"; + ofs.open(inversion_grid_file_out); + + // inversion grid of velocity + for(int l = 0; l < n_inv_grids; l++){ + ofs << l << " " << n_inv_K_loc << " " << n_inv_J_loc << " " << n_inv_I_loc << std::endl; // number of ivnersion grid + + for(int k = 0; k < n_inv_K_loc; k++){ + ofs << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') + << radius2depth(r.arr[I2V_INV_GRIDS_1DK(k,l)]) << " "; + ofs << std::endl; + for(int j =0; j < n_inv_J_loc; j++) + ofs << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') + << t.arr[I2V_INV_GRIDS_2DJ(j,k,l)]*RAD2DEG << " "; + ofs << std::endl; + for(int i =0; i < n_inv_I_loc; i++) + ofs << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') + << p.arr[I2V_INV_GRIDS_2DI(i,k,l)]*RAD2DEG << " "; + ofs << std::endl; + } + } + // inversion grid of anisotropy + for(int l = 0; l < n_inv_grids; l++){ + ofs << l << " " << n_inv_K_loc_ani << " " << n_inv_J_loc_ani << " " << n_inv_I_loc_ani << std::endl; // number of ivnersion grid + for(int k = 0; k < n_inv_K_loc_ani; k++){ + ofs << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') + << radius2depth(r_ani.arr[I2V_INV_ANI_GRIDS_1DK(k,l)]) << " "; + ofs << std::endl; + for(int j =0; j < n_inv_J_loc_ani; j++) + ofs << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') + << t_ani.arr[I2V_INV_ANI_GRIDS_1DJ(j,k,l)]*RAD2DEG << " "; + ofs << std::endl; + for(int i =0; i < n_inv_I_loc_ani; i++) + ofs << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') + << p_ani.arr[I2V_INV_ANI_GRIDS_1DI(i,k,l)]*RAD2DEG << " "; + ofs << std::endl; + } + } + } +} + +// grid position for radius +InvGrid1d::InvGrid1d(InputParams& IP, const int n_inv_loc, + const CUSTOMREAL* input_pos){ + // set n + n = n_inv_loc*n_inv_grids; + + // allocate memory for the grid + arr = new CUSTOMREAL[n]; + + // create a copy array of input_pos + CUSTOMREAL* arr_input_pos = new CUSTOMREAL[n_inv_loc]; + + // dep (km) -> r (km) + for (int i = 0; i < n_inv_loc; i++) + arr_input_pos[i] = depth2radius(input_pos[i]); + + for (int i = 0; i < n_inv_loc; i++){ + if (i < n_inv_loc-1) + dinv_l = (arr_input_pos[i+1] - arr_input_pos[i]) / n_inv_grids; + else + dinv_l = (arr_input_pos[n_inv_loc-1] - arr_input_pos[n_inv_loc-2]) / n_inv_grids; + + for (int l = 0; l < n_inv_grids; l++) + arr[I2V_INV_GRIDS_1D_GENERIC(i, l, n_inv_loc)] = arr_input_pos[i] + l*dinv_l; + } + + delete[] arr_input_pos; +} + +// grid position for lat and lon +InvGrid1d::InvGrid1d(InputParams& IP, const int n_inv_loc, + const CUSTOMREAL* input_pos, const CUSTOMREAL* input_trapezoid, const int n_inv_loc_k, const CUSTOMREAL* input_dep) { + // set n + n = n_inv_loc*n_inv_loc_k*n_inv_grids; + + // allocate memory for the grid + arr = new CUSTOMREAL[n]; + + // create a copy array of input_pos + CUSTOMREAL* arr_input_pos = new CUSTOMREAL[n_inv_loc]; + + // lat,lon (deg) -> t,p (rad) + for (int i = 0; i < n_inv_loc; i++) + arr_input_pos[i] = input_pos[i]*DEG2RAD; + + // middle point of arr_input_pos + CUSTOMREAL mid_value = 0; + if (n_inv_loc%2 == 0) + mid_value = (arr_input_pos[n_inv_loc/2-1] + arr_input_pos[n_inv_loc/2])/2; + else + mid_value = arr_input_pos[(n_inv_loc-1)/2]; + + for (int i = 0; i < n_inv_loc; i++){ + if (i < n_inv_loc-1) + dinv_l = (arr_input_pos[i+1] - arr_input_pos[i]) / n_inv_grids; + else + dinv_l = (arr_input_pos[n_inv_loc-1] - arr_input_pos[n_inv_loc-2]) / n_inv_grids; + + for (int l = 0; l < n_inv_grids; l++) { + for (int k = 0; k < n_inv_loc_k; k++){ + CUSTOMREAL ratio = 1.0; + if (input_dep[k] < input_trapezoid[1]) + ratio = 1.0; + else if (input_dep[k] >= input_trapezoid[1] && input_dep[k] < input_trapezoid[2]) + ratio = 1.0 + (input_dep[k] - input_trapezoid[1]) / (input_trapezoid[2] - input_trapezoid[1]) * (input_trapezoid[0] - 1.0); + else + ratio = input_trapezoid[0]; + + arr[I2V_INV_GRIDS_2D_GENERIC(i,k,l,n_inv_loc,n_inv_loc_k)] = mid_value + (arr_input_pos[i] + l*dinv_l - mid_value) * ratio; + } + } + } + + delete[] arr_input_pos; +} + + + diff --git a/src/io.cpp b/src/io.cpp new file mode 100644 index 0000000..90509d1 --- /dev/null +++ b/src/io.cpp @@ -0,0 +1,2370 @@ +#include "io.h" + +IO_utils::IO_utils(InputParams& IP) { + if (subdom_main) { + stdout_by_main("--- IO object initialization ---"); + + // check the custom real data type + // if float, custom_real_flag = 2 + // if double, custom_real_flag = 3 + if (std::is_same::value || IP.get_if_single_precision_output()) { + custom_real_flag = 2; + } else if (std::is_same::value) { + custom_real_flag = 3; + } else { + std::cout << "Error: custom real type is not float or double" << std::endl; + std::cout << "Please check the definition of CUSTOMREAL in io.h" << std::endl; + std::cout << "Exiting..." << std::endl; + exit(1); + } + + // initialize an output file for grid data + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + // grid data is output by only simulation group 0 + if(id_sim==0) + h5_create_file_by_group_main(h5_output_grid_fname); // file for grid+whole simulation data + // initialize simulation data file. + if (n_sims > 1){ + // for simultaneous run, data file is created for each simulation group + h5_output_fname = "./out_data_sim_group_" + std::to_string(id_sim) + ".h5"; + xdmf_output_fname = "./out_data_sim_group_"+std::to_string(id_sim)+".xmf"; + h5_output_fname_tmp = "./tmp_db_sim_group_" + std::to_string(id_sim) + ".h5"; + } else { + // otherwise, only one single data file is created for storing model params + h5_output_fname = "./out_data_sim_group_0.h5"; // add _groud_0 to ensure consistency + xdmf_output_fname = "./out_data_sim_group_0.xmf"; + h5_output_fname_tmp = "./tmp_db_sim_group_0.h5"; + } + + // MNMN: below is for initiliazing data file for each simulation group + // if the file is not created in here, hdf5 will try to use preexisting file and dataset structures, + // then error will occur if the dataset size for the later simulation group is larger than the previous one. + + // create data file + h5_create_file_by_group_main(h5_output_fname); + // create temporary data file + h5_create_file_by_group_main(h5_output_fname_tmp); +#else + std::cout << "Error: TOMOATT was not compiled with HDF5" << std::endl; + std::cout << "Exiting..." << std::endl; + exit(1); +#endif + } + } +} + +IO_utils::~IO_utils() { + stdout_by_main("--- IO object finalization ---"); +} + +void IO_utils::reset_source_info(const int& id_sim_src, const std::string& name_sim_src) { + + // set simulation group id and source name for output files/dataset names + set_id_src(id_sim_src); + set_name_src(name_sim_src); + +#ifdef USE_HDF5 + // change group name for source + // h5_group_name_data = "src_" + std::to_string(id_sim_src); + h5_group_name_data = "src_" + name_sim_src; +#endif +} + + +void IO_utils::change_group_name_for_model(){ +#ifdef USE_HDF5 + // change group name for model + h5_group_name_data = "model"; +#endif +} + + +void IO_utils::finalize_data_output_file(){ + if (output_format==OUTPUT_FORMAT_HDF5){ + // close file + if (subdom_main && id_subdomain==0) + finalize_xdmf_file(); + } +} + + +void IO_utils::init_data_output_file() { + if (if_verbose) stdout_by_main("--- initialize data output file ---"); + + // create output file + if (output_format==OUTPUT_FORMAT_HDF5) { +#ifdef USE_HDF5 + // h5_output_fname = "./out_data_sim_"+std::to_string(id_sim_src)+".h5"; + // xdmf_output_fname = "./out_data_sim_"+std::to_string(id_sim_src)+".xmf"; + h5_output_fname = "./out_data_sim_"+name_sim_src+".h5"; + xdmf_output_fname = "./out_data_sim_"+name_sim_src+".xmf"; + + if (subdom_main) { + // write xdmf file + if (id_subdomain == 0) + write_xdmf_file_grid(); + + // create output file + h5_create_file_by_group_main(h5_output_fname); // file for field data + } +#endif + } +} + + + +void IO_utils::write_grid(Grid& grid) { + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + // share grid dimensions + int dims_ngrid[1] = {grid.get_ngrid_total_vis()}; + int dims_conn[2] = {grid.get_nelms_total_vis(), 9}; + + allreduce_i_single(dims_ngrid[0], nnodes_glob); + allreduce_i_single(dims_conn[0], nelms_glob); + + // create xdmf file for visualization of simulation data + if (id_subdomain == 0) + write_xdmf_file_grid(); + + if (id_sim == 0) { + + // open file + h5_open_file_by_group_main(h5_output_grid_fname); + + // make groups Grid and Event + h5_create_group_by_group_main(h5_group_name_grid); + h5_open_group_by_group_main(h5_group_name_grid); + + // create datasets + h5_create_dataset(h5_dset_name_node_coords_x, 1, dims_ngrid, custom_real_flag); + h5_create_dataset(h5_dset_name_node_coords_y, 1, dims_ngrid, custom_real_flag); + h5_create_dataset(h5_dset_name_node_coords_z, 1, dims_ngrid, custom_real_flag); + h5_create_dataset(h5_dset_name_node_coords_p, 1, dims_ngrid, custom_real_flag); + h5_create_dataset(h5_dset_name_node_coords_t, 1, dims_ngrid, custom_real_flag); + h5_create_dataset(h5_dset_name_node_coords_r, 1, dims_ngrid, custom_real_flag); + h5_create_dataset(h5_dset_name_elem_conn, 2, dims_conn, 1); + h5_create_dataset(h5_dset_name_procid, 1, dims_ngrid, 1); + + // close and reopen file from all processes + h5_close_group_by_group_main(); + h5_close_file_by_group_main(); + + h5_open_file_collective(h5_output_grid_fname); + h5_open_group_collective(h5_group_name_grid); // Open group "Grid" + + // write node coordinates + h5_write_array(h5_dset_name_node_coords_x, 1, dims_ngrid, grid.get_nodes_coords_x(), grid.get_offset_nnodes_vis()); + h5_write_array(h5_dset_name_node_coords_y, 1, dims_ngrid, grid.get_nodes_coords_y(), grid.get_offset_nnodes_vis()); + h5_write_array(h5_dset_name_node_coords_z, 1, dims_ngrid, grid.get_nodes_coords_z(), grid.get_offset_nnodes_vis()); + h5_write_array(h5_dset_name_node_coords_p, 1, dims_ngrid, grid.get_nodes_coords_p(), grid.get_offset_nnodes_vis()); + h5_write_array(h5_dset_name_node_coords_t, 1, dims_ngrid, grid.get_nodes_coords_t(), grid.get_offset_nnodes_vis()); + h5_write_array(h5_dset_name_node_coords_r, 1, dims_ngrid, grid.get_nodes_coords_r(), grid.get_offset_nnodes_vis()); + h5_write_array(h5_dset_name_procid, 1, dims_ngrid, grid.get_proc_dump(), grid.get_offset_nnodes_vis()); + + // write element connectivity + //(write here as 1d element to keep compatibility with other spatial discretization data) + h5_write_array(h5_dset_name_elem_conn, 2, dims_conn, grid.get_elms_conn(), grid.get_offset_elms_vis()); + + // close group "Grid" + h5_close_group_collective(); + // close file + h5_close_file_collective(); + } +#else + std::cout << "Error: HDF5 is not enabled.\n"; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII) { + if (id_sim == 0) { + // outut grid to ASCII file + + // get data + CUSTOMREAL* nodes_coords_x = grid.get_nodes_coords_x(); + CUSTOMREAL* nodes_coords_y = grid.get_nodes_coords_y(); + CUSTOMREAL* nodes_coords_z = grid.get_nodes_coords_z(); + CUSTOMREAL* nodes_coords_p = grid.get_nodes_coords_p(); + CUSTOMREAL* nodes_coords_t = grid.get_nodes_coords_t(); + CUSTOMREAL* nodes_coords_r = grid.get_nodes_coords_r(); + int* connectivity = grid.get_elms_conn(); + + // ASCII data collective writing + std::string fname_xyz = output_dir + "/out_grid_xyz.dat"; + std::string fname_rtp = output_dir + "/out_grid_ptr.dat"; + std::string fname_conn = output_dir + "/out_grid_conn.dat"; + + for (int i_rank = 0; i_rank < n_subdomains; i_rank++){ + if (i_rank == myrank){ + std::ofstream outfile_xyz, outfile_rtp, outfile_conn; + if (i_rank == 0){ + outfile_xyz.open(fname_xyz); + outfile_rtp.open(fname_rtp); + outfile_conn.open(fname_conn); + } + else{ + outfile_xyz.open(fname_xyz, std::ios_base::app); // append + outfile_rtp.open(fname_rtp, std::ios_base::app); // append + outfile_conn.open(fname_conn, std::ios_base::app); // append + } + + // set precision + outfile_xyz.precision( ASCII_OUTPUT_PRECISION); + outfile_rtp.precision( ASCII_OUTPUT_PRECISION); + outfile_conn.precision(ASCII_OUTPUT_PRECISION); + + //if (i_rank == 0) { + // // write header + // outfile << "# node coordinates x y z radius(km) lat.(deg.) lon.(deg.)" << std::endl; + //} + + for (int k = 0; k < loc_K_vis; k++){ + for (int j = 0; j < loc_J_vis; j++){ + for (int i = 0; i < loc_I_vis; i++){ + + int idx = I2V_VIS(i,j,k); + //outfile << nodes_coords_x[idx] << " " << nodes_coords_y[idx] << " " << nodes_coords_z[idx] << " " << nodes_coords_p[idx] << " " << nodes_coords_t[idx] << " " << nodes_coords_r[idx] << "\n"; + outfile_xyz << nodes_coords_x[idx] << " " << nodes_coords_y[idx] << " " << nodes_coords_z[idx] << "\n"; + outfile_rtp << nodes_coords_p[idx] << " " << nodes_coords_t[idx] << " " << nodes_coords_r[idx] << "\n"; + + if (i < loc_I_vis-1 \ + && j < loc_J_vis-1 \ + && k < loc_K_vis-1) { + int idx_conn = I2V_ELM_CONN(i,j,k); + for (int iconn = 0; iconn < 9; iconn++){ + outfile_conn << connectivity[idx_conn*9 + iconn] << " "; + } + outfile_conn << "\n"; + } + } + } + } + + outfile_xyz.close(); + outfile_rtp.close(); + outfile_conn.close(); + } + // synchronize + synchronize_all_inter(); + + } // end for i_rank + } // end if id_sim == 0 + } // end if output_format==OUTPUT_FORMAT_ASCII + +} + + +void IO_utils::init_xdmf_file(){ + if (if_verbose) stdout_by_main("--- init xdmf file ---"); + + if (std::is_same::value) { + type_name = "Float"; + type_size = "4"; + } else { + type_name = "Double"; + type_size = "8"; + } + + doc = new tinyxml2::XMLDocument(); // TODO: delete this object somewhere at the end + + // headers + tinyxml2::XMLDeclaration* decl = doc->NewDeclaration(); + doc->InsertFirstChild(decl); + tinyxml2::XMLUnknown* doctype = doc->NewUnknown("DOCTYPE Xdmf SYSTEM \"Xdmf.dtd\" []"); + doc->InsertAfterChild(decl,doctype); + + // Xdmf node + xdmf = doc->InsertEndChild( doc->NewElement( "Xdmf" ) ); + xdmf->ToElement()->SetAttribute("xmlns:xi","http://www.w3.org/2001/XInclude"); + xdmf->ToElement()->SetAttribute("Version", "3.0"); +} + + +void IO_utils::write_xdmf_file_grid() { + // write xdmf file by main process + init_xdmf_file(); + + std::string num_elm = std::to_string(nelms_glob); + std::string num_conn = std::to_string(nelms_glob) + " 9"; + std::string num_nodes = std::to_string(nnodes_glob); + + // write xdmf file + // Domain node + domain = xdmf->InsertEndChild( doc->NewElement( "Domain" ) ); + domain->ToElement()->SetAttribute("name", "Mesh"); + + // Topology node in domain + tinyxml2::XMLNode* topology = domain->InsertEndChild( doc->NewElement( "Topology" ) ); + topology->ToElement()->SetAttribute("TopologyType", "Mixed"); + topology->ToElement()->SetAttribute("NumberOfElements", num_elm.c_str()); + // DataItem node in topology + tinyxml2::XMLNode* dataItem = topology->InsertEndChild( doc->NewElement( "DataItem" ) ); + dataItem->ToElement()->SetAttribute("ItemType", "Uniform"); + dataItem->ToElement()->SetAttribute("Format", "HDF"); + dataItem->ToElement()->SetAttribute("NumberType", "Int"); + dataItem->ToElement()->SetAttribute("Precision", "4"); + dataItem->ToElement()->SetAttribute("Dimensions", num_conn.c_str()); + // set dataset path in dataItem + dataItem->InsertEndChild( doc->NewText( h5_whole_name_conn.c_str() ) ); + + // Geometry node in domain + tinyxml2::XMLNode* geometry = domain->InsertEndChild( doc->NewElement( "Geometry" ) ); + geometry->ToElement()->SetAttribute("GeometryType", "X_Y_Z"); + // DataItem node in geometry + tinyxml2::XMLNode* dataItem_coords[3] = { geometry->InsertEndChild( doc->NewElement( "DataItem" ) ), + geometry->InsertEndChild( doc->NewElement( "DataItem" ) ), + geometry->InsertEndChild( doc->NewElement( "DataItem" ) ) }; + for (int i = 0; i < 3; i++) { + dataItem_coords[i]->ToElement()->SetAttribute("ItemType", "Uniform"); + dataItem_coords[i]->ToElement()->SetAttribute("Format", "HDF"); + dataItem_coords[i]->ToElement()->SetAttribute("NumberType", type_name.c_str()); + dataItem_coords[i]->ToElement()->SetAttribute("Precision", type_size.c_str()); + dataItem_coords[i]->ToElement()->SetAttribute("Dimensions", num_nodes.c_str()); + } + // set dataset path in dataItem + dataItem_coords[0]->InsertEndChild( doc->NewText( h5_whole_name_x.c_str() ) ); + dataItem_coords[1]->InsertEndChild( doc->NewText( h5_whole_name_y.c_str() ) ); + dataItem_coords[2]->InsertEndChild( doc->NewText( h5_whole_name_z.c_str() ) ); + + // write data to file + // Grid model + grid = domain->InsertEndChild( doc->NewElement( "Grid" ) ); + grid->ToElement()->SetAttribute("Name", "Data"); + grid->ToElement()->SetAttribute("GridType", "Tree"); + + // procid Grid + tinyxml2::XMLNode* grid_proc = grid->InsertEndChild( doc->NewElement( "Grid" ) ); + grid_proc->ToElement()->SetAttribute("Name", "procid"); + grid_proc->ToElement()->SetAttribute("GridType", "Uniform"); + + // Topology node in grid + tinyxml2::XMLNode* topology_grid = grid_proc->InsertEndChild( doc->NewElement( "Topology" ) ); + topology_grid->ToElement()->SetAttribute("Reference", "/Xdmf/Domain/Topology"); + // Geometry node in grid + tinyxml2::XMLNode* geometry_grid = grid_proc->InsertEndChild( doc->NewElement( "Geometry" ) ); + geometry_grid->ToElement()->SetAttribute("Reference", "/Xdmf/Domain/Geometry"); + // Attribute node in grid + tinyxml2::XMLNode* attribute_grid = grid_proc->InsertEndChild( doc->NewElement( "Attribute" ) ); + attribute_grid->ToElement()->SetAttribute("Name", "procid"); + attribute_grid->ToElement()->SetAttribute("AttributeType", "Scalar"); + attribute_grid->ToElement()->SetAttribute("Center", "Node"); + // DataItem node in attribute + tinyxml2::XMLNode* dataItem_procid = attribute_grid->InsertEndChild( doc->NewElement( "DataItem" ) ); + dataItem_procid->ToElement()->SetAttribute("ItemType", "Uniform"); + dataItem_procid->ToElement()->SetAttribute("Format", "HDF"); + dataItem_procid->ToElement()->SetAttribute("NumberType", "Int"); + dataItem_procid->ToElement()->SetAttribute("Precision", "4"); + dataItem_procid->ToElement()->SetAttribute("Dimensions", num_nodes.c_str()); + // set dataset path in dataItem + dataItem_procid->InsertEndChild( doc->NewText( h5_whole_name_proc.c_str() ) ); + + // prepare inversion iteration collection + inversions = grid->InsertEndChild( doc->NewElement( "Grid" ) ); + inversions->ToElement()->SetAttribute("Name", "Inversions"); + inversions->ToElement()->SetAttribute("GridType", "Collection"); + inversions->ToElement()->SetAttribute("CollectionType", "Temporal"); + // close file + //finalize_xdmf_file(); +} + + +void IO_utils::update_xdmf_file() { + if (output_format==OUTPUT_FORMAT_HDF5){ + if (subdom_main && id_subdomain==0) + write_xdmf_file(); + } +} + + +void IO_utils::write_xdmf_file() +{ + if (output_format==OUTPUT_FORMAT_HDF5){ + if (subdom_main && id_subdomain==0) { + //xdmf_output_fname = xmfname_vec[i_src]; + std::string fout = output_dir+"/"+xdmf_output_fname; + doc->SaveFile(fout.c_str(), false); // true: compact format + } + } +} + + +void IO_utils::finalize_xdmf_file(){ + if (output_format==OUTPUT_FORMAT_HDF5){ + stdout_by_main("--- finalize xdmf file ---"); + + write_xdmf_file(); + } +} + +#ifdef USE_HDF5 +// function to write data to HDF5 file without merging subdomains +void IO_utils::write_data_h5(Grid& grid, std::string& str_group, std::string& str_dset, + CUSTOMREAL* array, int i_inv, bool model_data, bool for_tmp_db) { + + std::string str_dset_h5 = "dummy"; + if (!for_tmp_db) + str_dset_h5 = str_dset + "_inv_" + int2string_zero_fill(i_inv); + else + str_dset_h5 = str_dset; + + // write true solution to h5 file + if (myrank == 0 && if_verbose) + std::cout << "--- write data " << str_dset << " to h5 file " << h5_output_fname << " ---" << std::endl; + + // open h5 file + h5_open_file_by_group_main(h5_output_fname); + + // make groups Grid and Event + h5_create_group_by_group_main(str_group); + h5_open_group_by_group_main(str_group); + + // create datasets + int dims_ngrid[1] = {grid.get_ngrid_total_vis()}; + //int dims_conn[2] = {grid.get_nelms_total_vis(), 9}; + + allreduce_i_single(dims_ngrid[0], nnodes_glob); + //allreduce_i_single(dims_conn[0], nelms_glob); + + h5_create_dataset(str_dset_h5, 1, dims_ngrid, custom_real_flag); + + // close and reopen file from all processes + h5_close_group_by_group_main(); + h5_close_file_by_group_main(); + + h5_open_file_collective(h5_output_fname); + h5_open_group_collective(str_group); // Open group "Grid" + + // write datasets + h5_write_array(str_dset_h5, 1, dims_ngrid, array, grid.get_offset_nnodes_vis()); + + // close group "Grid" + h5_close_group_collective(); + // close file + h5_close_file_collective(); + + if (!for_tmp_db) { + std::string str_dset_xdmf; + if (!model_data) + str_dset_xdmf = str_dset + "_src_" + name_sim_src; // use different name for xdmf + else + str_dset_xdmf = str_dset; // use different name for xdmf + + // add xdmf file in + insert_data_xdmf(str_group, str_dset_xdmf, str_dset_h5); + } +} + +// function to write data to HDF5 file with merging subdomains +void IO_utils::write_data_merged_h5(Grid& grid,std::string& str_filename, std::string& str_group, std::string& str_dset, + CUSTOMREAL* array, bool inverse_field, bool no_group) { + + // write true solution to h5 file + if (myrank == 0 && if_verbose) + std::cout << "--- write data " << str_dset << " to h5 file " << h5_output_fname << " ---" << std::endl; + + const int ndims = 3; + // allocate temporary array + CUSTOMREAL* array_tmp = new CUSTOMREAL[loc_I_excl_ghost*loc_J_excl_ghost*loc_K_excl_ghost]; + + // get array data except ghost nodes + grid.get_array_for_3d_output(array, array_tmp, inverse_field); + + // open h5 file + h5_open_file_by_group_main(str_filename); + + if (!no_group){ + h5_create_group_by_group_main(str_group); + h5_open_group_by_group_main(str_group); + } + + // dataset size of whole domain + int dims_ngrid[ndims] = {ngrid_k, ngrid_j, ngrid_i}; + // create datasets + h5_create_dataset(str_dset, ndims, dims_ngrid, custom_real_flag, no_group); + + // close and reopen file from all processes + if(!no_group) h5_close_group_by_group_main(); + h5_close_file_by_group_main(); + + h5_open_file_collective(str_filename); + if(!no_group) h5_open_group_collective(str_group); // Open group "Grid" + + // offset info for this subdomain + int offsets[3]; + grid.get_offsets_3d(offsets); + // dimensions of this subdomain + int dims_ngrid_loc[ndims] = {loc_K_excl_ghost, loc_J_excl_ghost, loc_I_excl_ghost}; + + // write datasets + h5_write_array(str_dset, ndims, dims_ngrid_loc, array_tmp, offsets[0], offsets[1], offsets[2], no_group); + + // close group "Grid" + if(!no_group) h5_close_group_collective(); + // close file + h5_close_file_collective(); + + // add xdmf file in + //insert_data_xdmf(str_group, str_dset_xdmf, str_dset); + + delete [] array_tmp; + +} + +#endif // USE_HDF5 + + +void IO_utils::write_data_ascii(Grid& grid, std::string& fname, CUSTOMREAL* data){ + // write data in ascii file + if (myrank == 0 && if_verbose) + std::cout << "--- write data to ascii file " << fname << " ---" << std::endl; + + // independent write + for (int i_rank = 0; i_rank < n_subdomains; i_rank++) { + if (i_rank == myrank){ + std::ofstream fout; + if (i_rank == 0) + fout.open(fname.c_str()); + else + fout.open(fname.c_str(), std::ios_base::app); // append + if (!fout.is_open()) { + std::cout << "ERROR: cannot open file " << fname << std::endl; + exit(1); + } + + // set output precision + fout.precision(ASCII_OUTPUT_PRECISION); + + // iterate over nodes skipping the last layer for ignoring gap filling nodes for h5 output + for (int k = 0; k < loc_K_vis; k++){ + for (int j = 0; j < loc_J_vis; j++){ + for (int i = 0; i < loc_I_vis; i++){ + int idx = I2V_VIS(i,j,k); + fout << data[idx] << "\n"; + } + } + } + + fout.close(); + } + // synchronize + synchronize_all_inter(); + + } // end for i_rank + +} + + +bool IO_utils::node_of_this_subdomain(int* offsets, const int& i, const int& j, const int& k){ + // check if node is in this subdomain + if (i >= offsets[2] && i < offsets[2] + loc_I_excl_ghost && + j >= offsets[1] && j < offsets[1] + loc_J_excl_ghost && + k >= offsets[0] && k < offsets[0] + loc_K_excl_ghost) + return true; + else + return false; +} + +void IO_utils::write_data_merged_ascii(Grid& grid, std::string& fname){ + // write data in ascii file + if (myrank == 0 && if_verbose) + std::cout << "--- write data to ascii file " << fname << " ---" << std::endl; + + // allocate temporary array + CUSTOMREAL* array_eta = new CUSTOMREAL[loc_I_excl_ghost*loc_J_excl_ghost*loc_K_excl_ghost]; + CUSTOMREAL* array_xi = new CUSTOMREAL[loc_I_excl_ghost*loc_J_excl_ghost*loc_K_excl_ghost]; + //CUSTOMREAL* array_zeta = new CUSTOMREAL[loc_I_excl_ghost*loc_J_excl_ghost*loc_K_excl_ghost]; + CUSTOMREAL* array_vel = new CUSTOMREAL[loc_I_excl_ghost*loc_J_excl_ghost*loc_K_excl_ghost]; + + // offset info for this subdomain + int offsets[3]; + grid.get_offsets_3d(offsets); + + // get array data except ghost nodes + grid.get_array_for_3d_output(grid.eta_loc, array_eta, false); + grid.get_array_for_3d_output(grid.xi_loc, array_xi, false); + //grid.get_array_for_3d_output(grid.zeta_loc, array_zeta, false); + grid.get_array_for_3d_output(grid.fun_loc, array_vel, true); + + // create output file + std::ofstream fout; + if (myrank == 0){ + fout.open(fname.c_str()); + fout.close(); + } + + // This way of writing is not parallelized and very slow + // thus user is strongly encouraged to use h5 output + for (int k = 0; k < ngrid_k; k++){ + for (int j = 0; j < ngrid_j; j++){ + for (int i = 0; i < ngrid_i; i++){ + if (node_of_this_subdomain(offsets, i,j,k)){ + // open file + fout.open(fname.c_str(), std::ios_base::app); // append + int idx = I2V_3D(i-offsets[2],j-offsets[1],k-offsets[0]); + // write eta xi zeta vel + fout << array_eta[idx] << " " << array_xi[idx] << " " << 0.0 << " " << array_vel[idx] << "\n"; + fout.close(); + } + // synchronize + synchronize_all_inter(); + } + } + } + + delete [] array_eta; + delete [] array_xi; + //delete [] array_zeta; + delete [] array_vel; + +} + +void IO_utils::write_1dinv_field(CUSTOMREAL* field_1dinv, CUSTOMREAL* r_1dinv, CUSTOMREAL* t_1dinv, int nr_1dinv, int nt_1dinv, std::string& field_name){ + if (myrank == 0) { + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + // open h5 file + std::string fout = output_dir + "/" + h5_output_fname; + hid_t tmp_file_id = H5Fopen(fout.c_str(), H5F_ACC_RDWR, H5P_DEFAULT); + + // try to create and open group "1dinv" + if (!H5Lexists(tmp_file_id, "1dinv", H5P_DEFAULT)) { + file_id_2d = H5Gcreate(tmp_file_id, "1dinv", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + // close group + H5Gclose(file_id_2d); + } + file_id_2d = H5Gopen(tmp_file_id, "1dinv", H5P_DEFAULT); + + // force to use CUSTOMREAL type for 2D fields + int dtype = check_data_type(field_1dinv[0]); + + // create dataset and write + int dims_array[2] = {nr_1dinv, nt_1dinv}; + std::string str_dset = field_name; + + if (H5Lexists(file_id_2d, str_dset.c_str(), H5P_DEFAULT) > 0){ + H5Ldelete(file_id_2d, str_dset.c_str(), H5P_DEFAULT); // delete nit + } + h5_create_and_write_dataset_2d(str_dset, 2, dims_array, dtype, field_1dinv); + + if (H5Lexists(file_id_2d, "r_1dinv", H5P_DEFAULT) > 0){ + H5Ldelete(file_id_2d, "r_1dinv", H5P_DEFAULT); // delete nit + } + str_dset = "r_1dinv"; + h5_create_and_write_dataset_2d(str_dset, 1, &nr_1dinv, dtype, r_1dinv); + + if (H5Lexists(file_id_2d, "t_1dinv", H5P_DEFAULT) > 0){ + H5Ldelete(file_id_2d, "t_1dinv", H5P_DEFAULT); // delete nit + } + str_dset = "t_1dinv"; + h5_create_and_write_dataset_2d(str_dset, 1, &nt_1dinv, dtype, t_1dinv); + + // close groud + H5Gclose(file_id_2d); + + // close h5 file + H5Fclose(tmp_file_id); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::cout << "ERROR: ASCII is not supported for 1dinv field output now" << std::endl; + exit(1); + } + } +} + + +void IO_utils::write_2d_travel_time_field(CUSTOMREAL* T, CUSTOMREAL* r, CUSTOMREAL* t, int nr, int nt, CUSTOMREAL src_dep){ + + if (myrank == 0) { + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + auto str = std::to_string(src_dep); + std::string fname = output_dir + "/" + OUTPUT_DIR_2D + "/2d_travel_time_field_dep_" +str.substr(0,str.find(".")+4)+".h5"; + // create and open h5 file + file_id_2d = H5Fcreate(fname.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + // force to use CUSTOMREAL type for 2D fields + int dtype = check_data_type(T[0]); + + // create dataset and write + int dims_T[2] = {nr, nt}; + std::string str_dset = "T"; + h5_create_and_write_dataset_2d(str_dset, 2, dims_T, dtype, T); + str_dset = "r"; + h5_create_and_write_dataset_2d(str_dset, 1, &nr, dtype, r); + str_dset = "t"; + h5_create_and_write_dataset_2d(str_dset, 1, &nt, dtype, t); + + // close h5 file + H5Fclose(file_id_2d); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + // write out r t and T in ASCII + auto str = std::to_string(src_dep); + std::string fname = output_dir + "/" + OUTPUT_DIR_2D + "/2d_travel_time_field_dep_" +str.substr(0,str.find(".")+4)+".dat"; + std::ofstream fout(fname.c_str()); + + // set precision + fout << std::fixed << std::setprecision(ASCII_OUTPUT_PRECISION); + + for (int i=0; i> r_dummy >> t_dummy >> T[i*nt+j]; + } + } +} + + +std::string IO_utils::create_fname_ascii(std::string& dset_name){ + // std::string fname = output_dir + "/" + dset_name + // + "_src_" + int2string_zero_fill(id_sim_src) + ".dat"; + std::string fname = output_dir + "/" + dset_name \ + + "_src_" + name_sim_src + ".dat"; + return fname; +} + + +std::string IO_utils::create_fname_ascii_model(std::string& dset_name){ + std::string fname = output_dir + "/" + dset_name + ".dat"; + return fname; +} + + +void IO_utils::write_true_solution(Grid& grid) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "true_solution"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_true_solution(), 0, src_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "true_solution"; + std::string fname = create_fname_ascii(dset_name); + write_data_ascii(grid, fname, grid.get_true_solution()); + } +} + + +void IO_utils::write_vel(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "vel"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_vel(),i_inv, model_data); +#else + + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "vel_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_vel()); + } +} + + +std::vector IO_utils::get_grid_data(CUSTOMREAL* data) { + + std::vector parameter(loc_K_vis * loc_J_vis * loc_I_vis); + + for (int k = 0; k < loc_K_vis; k++){ + for (int j = 0; j < loc_J_vis; j++){ + for (int i = 0; i < loc_I_vis; i++){ + int idx = I2V_VIS(i,j,k); + parameter[idx] = data[idx]; + } + } + } + return parameter; +} + +// void IO_utils::write_concerning_parameters(Grid& grid, int i_inv, InputParams& IP) { +// std::string dset_name = "model_parameters_inv_" + int2string_zero_fill(i_inv); +// std::string fname = create_fname_ascii_model(dset_name); + +// if (myrank == 0 ) +// std::cout << "--- write data to ascii file " << fname << " ---" << std::endl; + +// // collective write +// if (subdom_main){ + +// for (int i_rank = 0; i_rank < n_subdomains; i_rank++) { +// if (i_rank == myrank){ +// std::ofstream fout; +// if (i_rank == 0){ +// fout.open(fname.c_str()); +// fout<< std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << "depth" << " " +// << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << "latitude" << " " +// << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << "longitude" << " " +// << std::fixed << std::setprecision(7) << std::setw(9) << std::right << std::setfill(' ') << "slowness" << " " +// << std::fixed << std::setprecision(7) << std::setw(9) << std::right << std::setfill(' ') << "xi" << " " +// << std::fixed << std::setprecision(7) << std::setw(9) << std::right << std::setfill(' ') << "eta" << " " +// << std::fixed << std::setprecision(7) << std::setw(9) << std::right << std::setfill(' ') << "velocity" << " " +// << std::fixed << std::setprecision(5) << std::setw(11) << std::right << std::setfill(' ') << "Traveltime" << " "; +// if (IP.get_run_mode() == DO_INVERSION || IP.get_run_mode() == INV_RELOC) { +// fout << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << "Ks" << " " +// // << std::fixed << std::setprecision(7) << std::setw(9) << std::right << std::setfill(' ') << "Tadj" << " " +// << std::fixed << std::setprecision(7) << std::setw(9) << std::right << std::setfill(' ') << "Ks_update" << " "; +// } +// fout << std::endl; +// } else +// fout.open(fname.c_str(), std::ios_base::app); // append +// if (!fout.is_open()) { +// std::cout << "ERROR: cannot open file " << fname << std::endl; +// exit(1); +// } + +// // iterate over nodes skipping the last layer for ignoring gap filling nodes for h5 output + +// CUSTOMREAL* nodes_coords_p = grid.get_nodes_coords_p(); // dep,lat,lon +// CUSTOMREAL* nodes_coords_t = grid.get_nodes_coords_t(); +// CUSTOMREAL* nodes_coords_r = grid.get_nodes_coords_r(); +// std::vector slowness = get_grid_data(grid.get_fun()); +// std::vector xi = get_grid_data(grid.get_xi()); +// std::vector eta = get_grid_data(grid.get_eta()); +// std::vector Ks, Ks_update; +// if (IP.get_run_mode() == DO_INVERSION || IP.get_run_mode() == INV_RELOC) { +// //std::vector Tadj = get_grid_data(grid.get_Tadj()); +// Ks = get_grid_data(grid.get_Ks()); +// Ks_update = get_grid_data(grid.get_Ks_update()); +// } +// std::vector T = get_grid_data(grid.get_T()); + +// for (int k = 0; k < loc_K_vis; k++){ +// for (int j = 0; j < loc_J_vis; j++){ +// for (int i = 0; i < loc_I_vis; i++){ +// int idx = I2V_VIS(i,j,k); +// fout<< std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << radius2depth(nodes_coords_r[idx]) << " " +// << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << nodes_coords_t[idx] << " " +// << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') << nodes_coords_p[idx] << " " +// << std::fixed << std::setprecision(7) << std::setw(9) << std::right << std::setfill(' ') << slowness[idx] << " " +// << std::fixed << std::setprecision(7) << std::setw(9) << std::right << std::setfill(' ') << xi[idx] << " " +// << std::fixed << std::setprecision(7) << std::setw(9) << std::right << std::setfill(' ') << eta[idx] << " " +// << std::fixed << std::setprecision(7) << std::setw(9) << std::right << std::setfill(' ') << _1_CR/slowness[idx] << " " +// << std::fixed << std::setprecision(5) << std::setw(11) << std::right << std::setfill(' ') << T[idx] << " "; + +// if (IP.get_run_mode() == DO_INVERSION || IP.get_run_mode() == INV_RELOC) { +// fout << std::fixed << std::setprecision(7) << std::setw(12) << std::right << std::setfill(' ') << Ks[idx] << " " +// // << std::fixed << std::setprecision(7) << std::setw(12) << std::right << std::setfill(' ') << Tadj[idx] << " " +// << std::fixed << std::setprecision(7) << std::setw(12) << std::right << std::setfill(' ') << Ks_update[idx] << " "; +// } +// fout << std::endl; +// } +// } +// } +// fout.close(); +// } + + +// } // end for i_rank +// } // end if subdom_main + +// // synchronize +// synchronize_all_inter(); +// } + + +void IO_utils::write_T0v(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "T0v"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_T0v(), i_inv, src_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "T0v_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii(dset_name); + write_data_ascii(grid, fname, grid.get_T0v()); + } +} + + +void IO_utils::write_u(Grid& grid) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "u"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_u(), 0, src_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "u"; + std::string fname = create_fname_ascii(dset_name); + write_data_ascii(grid, fname, grid.get_u()); + } +} + + +void IO_utils::write_tau(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "tau"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_tau(), i_inv, src_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "tau_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii(dset_name); + write_data_ascii(grid, fname, grid.get_tau()); + } +} + +// +//void IO_utils::write_tmp_tau(Grid& grid, int i_iter) { +// if (output_format==OUTPUT_FORMAT_HDF5){ +//#ifdef USE_HDF5 +// std::string h5_dset_name = "tau_iter_" + std::to_string(i_iter); +// write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_tau(), i_iter); +//#else +// std::cout << "ERROR: HDF5 is not enabled" << std::endl; +// exit(1); +//#endif +// } else if (output_format==OUTPUT_FORMAT_ASCII){ +// std::string dset_name = "tau_tmp_iter_" + int2string_zero_fill(i_iter); +// std::string fname = create_fname_ascii(dset_name); +// write_data_ascii(grid, fname, grid.get_tau()); +// } +//} +// + +void IO_utils::write_T(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "time_field"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_T(), i_inv, src_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if(output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "time_field_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii(dset_name); + write_data_ascii(grid, fname, grid.get_T()); + } +} + + +void IO_utils::write_T_tmp(Grid& grid) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + // temporally replice a filename for T_tmp + std::string h5_fname_back = h5_output_fname; + h5_output_fname = h5_output_fname_tmp; + + // create file if not exist + std::string out_file_full = output_dir+"/"+h5_output_fname; + if (!is_file_exist(out_file_full.c_str())) + h5_create_file_by_group_main(h5_output_fname); + + // dataset name + std::string h5_dset_name = "T_tmp"; + bool for_tmp_db = true; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_T(), 0, src_data, for_tmp_db); + + // restore filename + h5_output_fname = h5_fname_back; +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if(output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "T_tmp"; + std::string fname = create_fname_ascii(dset_name); + write_data_ascii(grid, fname, grid.get_T()); + } +} + + +void IO_utils::write_residual(Grid& grid) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "residual"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_residual(), 0, src_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + }else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "residual"; + std::string fname = create_fname_ascii(dset_name); + write_data_ascii(grid, fname, grid.get_residual()); + } + +} + + +void IO_utils::write_adjoint_field(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "adjoint_field"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Tadj(), i_inv, src_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "adjoint_field_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii(dset_name); + write_data_ascii(grid, fname, grid.get_Tadj()); + } +} + + +void IO_utils::write_fun(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "fun"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_fun(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "fun_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_fun()); + } +} + + +void IO_utils::write_xi(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "xi"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_xi(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "xi_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_xi()); + } +} + + +void IO_utils::write_eta(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "eta"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_eta(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "eta_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_eta()); + } +} + + +void IO_utils::write_a(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "fac_a"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_a(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "fac_a_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_a()); + } +} + + +void IO_utils::write_b(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "fac_b"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_b(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "fac_b_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_b()); + } + +} + + +void IO_utils::write_c(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "fac_c"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_c(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "fac_c_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_c()); + } +} + + +void IO_utils::write_f(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "fac_f"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_f(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "fac_f_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_f()); + } +} + + +void IO_utils::write_Ks(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "Ks"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Ks(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "Ks_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_Ks()); + } +} + + +void IO_utils::write_Kxi(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "Kxi"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Kxi(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "Kxi_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_Kxi()); + } +} + + +void IO_utils::write_Keta(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "Keta"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Keta(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "Keta_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_Keta()); + } +} + + +void IO_utils::write_Ks_density(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "Ks_density"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Ks_density(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "Ks_density_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_Ks_density()); + } +} + +void IO_utils::write_Kxi_density(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "Kxi_density"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Kxi_density(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "Kxi_density_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_Kxi_density()); + } +} + +void IO_utils::write_Keta_density(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "Keta_density"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Keta_density(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "Keta_density_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_Keta_density()); + } +} + +void IO_utils::write_Ks_over_Kden(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "Ks_over_Kden"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Ks(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "Ks_over_Kden_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_Ks()); + } +} + +void IO_utils::write_Kxi_over_Kden(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "Kxi_over_Kden"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Kxi(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "Ks_over_Kden_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_Ks()); + } +} + +void IO_utils::write_Keta_over_Kden(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "Keta_over_Kden"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Keta(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "Ks_over_Kden_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_Ks()); + } +} + +void IO_utils::write_Ks_update(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "Ks_update"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Ks_update(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "Ks_update_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_Ks_update()); + } +} + + +void IO_utils::write_Kxi_update(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "Kxi_update"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Kxi_update(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "Kxi_update_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_Kxi_update()); + } +} + + +void IO_utils::write_Keta_update(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "Keta_update"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Keta_update(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "Keta_update_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_Keta_update()); + } +} + +void IO_utils::write_Ks_density_update(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "Ks_density_update"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Ks_density_update(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "Ks_density_update_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_Ks_density_update()); + } +} + +void IO_utils::write_Kxi_density_update(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "Kxi_density_update"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Kxi_density_update(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "Kxi_density_update_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_Kxi_density_update()); + } +} + +void IO_utils::write_Keta_density_update(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "Keta_density_update"; + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Keta_density_update(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "Keta_density_update_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_Keta_density_update()); + } +} + +void IO_utils::write_Ks_descent_dir(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "Ks_descent_dir_local_inv_" + int2string_zero_fill(i_inv); + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Ks_descent_dir(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "Ks_descent_dir_local_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_Ks_descent_dir()); + } + } + + +void IO_utils::write_Kxi_descent_dir(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "Kxi_descent_dir_local_inv_" + int2string_zero_fill(i_inv); + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Kxi_descent_dir(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "Kxi_descent_dir_local_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_Kxi_descent_dir()); + } + } + + +void IO_utils::write_Keta_descent_dir(Grid& grid, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "Keta_descent_dir_local_inv_" + int2string_zero_fill(i_inv); + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_Keta_descent_dir(), i_inv, model_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "Keta_descent_dir_local_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii_model(dset_name); + write_data_ascii(grid, fname, grid.get_Keta_descent_dir()); + } + } + + +void IO_utils::write_T_merged(Grid& grid, InputParams& IP, int i_inv) { + if (!subdom_main) return; + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + std::string h5_dset_name = "time_field"; + std::string h5_dset_name_merged = "time_field_merged_inv_" + int2string_zero_fill(i_inv); + bool inverse_field = false; + write_data_merged_h5(grid, h5_output_fname, h5_group_name_data, h5_dset_name_merged, grid.get_T(), i_inv, inverse_field); + write_data_h5(grid, h5_group_name_data, h5_dset_name, grid.get_T(), i_inv, src_data); +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if(output_format==OUTPUT_FORMAT_ASCII){ + std::string dset_name = "time_field_inv_" + int2string_zero_fill(i_inv); + std::string fname = create_fname_ascii(dset_name); + write_data_ascii(grid, fname, grid.get_T()); + } +} + + +void IO_utils::write_merged_model(Grid& grid, InputParams& IP, std::string fname) { + // this function is called only from simulation group == 0 + if (id_sim == 0 && subdom_main) { + + if (output_format==OUTPUT_FORMAT_HDF5){ +#ifdef USE_HDF5 + // create file + h5_create_file_by_group_main(fname); + + std::string gname_dummy = "dummy"; + std::string dset_name = "vel"; + bool inverse_field = true; + write_data_merged_h5(grid, fname, gname_dummy, dset_name, grid.fun_loc, inverse_field); + dset_name = "eta"; + inverse_field = false; + write_data_merged_h5(grid, fname, gname_dummy, dset_name, grid.eta_loc, inverse_field); + dset_name = "xi"; + inverse_field = false; + write_data_merged_h5(grid, fname, gname_dummy, dset_name, grid.xi_loc, inverse_field); + //dset_name = "zeta"; + //inverse_field = false; + //write_data_merged_h5(grid, fname, gname_dummy, dset_name, grid.zeta_loc, inverse_field); + + +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + } else if (output_format==OUTPUT_FORMAT_ASCII){ + // check if the fname finish with .h5 + if (fname.find(".h5") != std::string::npos) { + // remove .h5 + fname.erase(fname.end()-3, fname.end()); + } + + fname = create_fname_ascii_model(fname); + write_data_merged_ascii(grid, fname); + } + + + } // end id_sim == 0 && subdom_main +} + + +void IO_utils::prepare_grid_inv_xdmf(int i_inv) { + if ((output_format==OUTPUT_FORMAT_HDF5) && id_subdomain==0 && subdom_main){ + std::string str_inv = "inv_" + int2string_zero_fill(i_inv); + + inv_grid = inversions->InsertEndChild(doc->NewElement("Grid")); + inv_grid->ToElement()->SetAttribute("Name", str_inv.c_str()); + inv_grid->ToElement()->SetAttribute("GridType", "Uniform"); + + // Topology node in grid + tinyxml2::XMLNode* topology_grid = inv_grid->InsertEndChild( doc->NewElement( "Topology" ) ); + topology_grid->ToElement()->SetAttribute("Reference", "/Xdmf/Domain/Topology"); + // Geometry node in grid + tinyxml2::XMLNode* geometry_grid = inv_grid->InsertEndChild( doc->NewElement( "Geometry" ) ); + geometry_grid->ToElement()->SetAttribute("Reference", "/Xdmf/Domain/Geometry"); + // insert time + tinyxml2::XMLNode* time = inv_grid->InsertEndChild( doc->NewElement( "Time" ) ); + time->ToElement()->SetAttribute("Value", std::to_string(i_inv).c_str()); + + } +} + + +void IO_utils::insert_data_xdmf(std::string& group_name, std::string& dset_name_xdmf, std::string& dset_name_h5) { + + if (id_subdomain==0 && subdom_main){ // only the main of each subdomain write + std::string num_nodes = std::to_string(nnodes_glob); + + // Attribute node in grid + tinyxml2::XMLNode* attribute = inv_grid->InsertEndChild( doc->NewElement( "Attribute" ) ); + attribute->ToElement()->SetAttribute("Name", dset_name_xdmf.c_str()); + attribute->ToElement()->SetAttribute("AttributeType", "Scalar"); + attribute->ToElement()->SetAttribute("Center", "Node"); + // DataItem node in attribute + tinyxml2::XMLNode* dataItem = attribute->InsertEndChild( doc->NewElement( "DataItem" ) ); + dataItem->ToElement()->SetAttribute("ItemType", "Uniform"); + dataItem->ToElement()->SetAttribute("Format", "HDF"); + dataItem->ToElement()->SetAttribute("NumberType", type_name.c_str()); + dataItem->ToElement()->SetAttribute("Precision", type_size.c_str()); + dataItem->ToElement()->SetAttribute("Dimensions", num_nodes.c_str()); + // set dataset path in dataItem + std::string h5_dset_path = h5_output_fname + ":/" + group_name + "/" + dset_name_h5; + dataItem->InsertEndChild( doc->NewText( h5_dset_path.c_str() ) ); + } +} + + +void IO_utils::read_model(std::string& model_fname, const char* dset_name_in, CUSTOMREAL* darr, \ + int offset_i, int offset_j, int offset_k) { + + std::string dset_name(dset_name_in); + + if (output_format==OUTPUT_FORMAT_HDF5){ + +#ifdef USE_HDF5 + // open h5 file + h5_open_file_collective_input(model_fname); + + if (inter_sub_rank == 0) { + std::cout << "--- read model data " << dset_name << " from h5 file ---" << std::endl; + } + + // prepare temporary buffer in float precision for reading model data + // #TODO: need to be modify here for directly read data in double precision + float* f_darr = new float[loc_I*loc_J*loc_K]; + + // read data + int dims_model[3] = {loc_I, loc_J, loc_K}; + int offset_model[3] = {offset_i, offset_j, offset_k}; + h5_read_array(dset_name, 3, dims_model, f_darr, offset_model, false); + + // copy values to darr + for (int i=0; i (f_darr[I2V(i,j,k)]); + } + } + } + // close file + h5_close_file_collective(); + + // close temporary buffer + delete[] f_darr; + +#else + std::cout << "ERROR: HDF5 is not enabled" << std::endl; + exit(1); +#endif + + } else if (output_format==OUTPUT_FORMAT_ASCII){ + + if (inter_sub_rank == 0) { + std::cout << "--- read model data " << dset_name << " from ASCII file ---" << std::endl; + } + + CUSTOMREAL tmp_eta, tmp_xi, tmp_zeta, tmp_vel; + + // read data + + std::ifstream model_file(model_fname.c_str()); + if (!model_file.is_open()) { + std::cout << "Error: cannot open model file " << model_fname << std::endl; + exit(1); + } + + int line_count = 0; + int i,j,k; + + if (if_test) { + while(model_file >> tmp_eta >> tmp_xi >> tmp_zeta >> tmp_vel) { + k = line_count / (ngrid_i*ngrid_j); + j = (line_count - k*ngrid_i*ngrid_j) / ngrid_i; + i = line_count - k*ngrid_i*ngrid_j - j*ngrid_i; + + if (i>=offset_i && i=offset_j && j=offset_k && k (tmp_xi); + else if (!dset_name.compare(std::string("eta"))) + darr[I2V(i-offset_i,j-offset_j,k-offset_k)] = static_cast (tmp_eta); + else if (!dset_name.compare(std::string("zeta"))) + darr[I2V(i-offset_i,j-offset_j,k-offset_k)] = static_cast (tmp_zeta); + else if (!dset_name.compare(std::string("vel"))) + darr[I2V(i-offset_i,j-offset_j,k-offset_k)] = static_cast (tmp_vel); + } + + line_count++; + } + } else { + while(model_file >> tmp_eta >> tmp_xi >> tmp_zeta >> tmp_vel) { + k = line_count /(ngrid_i*ngrid_j); + j = (line_count - k*ngrid_i*ngrid_j) / ngrid_i; + i = line_count - k*ngrid_i*ngrid_j - j*ngrid_i; + + if (i>=offset_i && i=offset_j && j=offset_k && k (tmp_xi); + else if (!dset_name.compare(std::string("eta"))) + darr[I2V(i-offset_i,j-offset_j,k-offset_k)] = static_cast (tmp_eta); + else if (!dset_name.compare(std::string("zeta"))) + darr[I2V(i-offset_i,j-offset_j,k-offset_k)] = static_cast (tmp_zeta); + else if (!dset_name.compare(std::string("vel"))) + darr[I2V(i-offset_i,j-offset_j,k-offset_k)] = static_cast (tmp_vel); + } + + line_count++; + } + } + } + +} + + +// read travel time data from file +void IO_utils::read_T(Grid& grid) { + if (!subdom_main) return; + + if (output_format == OUTPUT_FORMAT_HDF5) { + // read traveltime field from HDF5 file +#ifdef USE_HDF5 + // h5_group_name_data = "src_" + std::to_string(id_sim_src); + h5_group_name_data = "src_" + name_sim_src; + std::string h5_dset_name = "time_field_inv_" + int2string_zero_fill(0); + read_data_h5(grid, grid.vis_data, h5_group_name_data, h5_dset_name); +#else + std::cerr << "Error: HDF5 is not enabled." << std::endl; + exit(1); +#endif + } else if (output_format == OUTPUT_FORMAT_ASCII) { + // read traveltime field from ASCII file + std::string dset_name = "time_field_inv_" + int2string_zero_fill(0); + std::string filename = create_fname_ascii(dset_name); + + read_data_ascii(grid, filename); + } + + // set to T_loc array from grid.vis_data + grid.set_array_from_vis(grid.T_loc); +} + + +void IO_utils::read_T_tmp(Grid& grid) { + if (!subdom_main) return; + + if (output_format == OUTPUT_FORMAT_HDF5) { + // read traveltime field from HDF5 file +#ifdef USE_HDF5 + // temporally replice a filename for T_tmp + std::string h5_fname_back = h5_output_fname; + h5_output_fname = h5_output_fname_tmp; + + // h5_group_name_data = "src_" + std::to_string(id_sim_src); + h5_group_name_data = "src_" + name_sim_src; + std::string h5_dset_name = "T_tmp"; + + read_data_h5(grid, grid.vis_data, h5_group_name_data, h5_dset_name); + + // recover h5_output_fname + h5_output_fname = h5_fname_back; +#else + std::cerr << "Error: HDF5 is not enabled." << std::endl; + exit(1); +#endif + } else if (output_format == OUTPUT_FORMAT_ASCII) { + // read traveltime field from ASCII file + std::string dset_name = "T_tmp"; + std::string filename = create_fname_ascii(dset_name); + + read_data_ascii(grid, filename); + } + + // set to T_loc array from grid.vis_data + grid.set_array_from_vis(grid.T_loc); +} + + + + + +void IO_utils::read_data_ascii(Grid& grid, std::string& fname){ + // read data in ascii file + if (myrank == 0 && if_verbose) + std::cout << "--- read data from ascii file " << fname << " ---" << std::endl; + + // get offset + int offset_this_rank = grid.get_offset_nnodes_vis(); + int ngrid_this_rank = grid.get_ngrid_total_vis(); + + // collective read + for (int i_rank = 0; i_rank < n_subdomains; i_rank++) { + if (i_rank == myrank) { + std::string line; + std::ifstream in_file(fname); + + int line_count = 0; + + while (std::getline(in_file, line)) { + std::istringstream iss(line); + CUSTOMREAL v_tmp; + if (!(iss >> v_tmp)) { break; } // error + + // set to grid.vis_data + if (line_count >= offset_this_rank && line_count < offset_this_rank + ngrid_this_rank) + grid.vis_data[line_count - offset_this_rank] = v_tmp; + + line_count++; + } + + in_file.close(); + } + + // synchronize + synchronize_all_inter(); + } + +} + + +// +// hdf5 low level utilities +// + +#ifdef USE_HDF5 + + +// read data from hdf5 file, which is in output format of TomoATT +void IO_utils::read_data_h5(Grid& grid, CUSTOMREAL* arr, std::string h5_group_name, std::string h5_dset_name) { + // write true solution to h5 file + if (myrank == 0 && if_verbose) + std::cout << "--- read data " << h5_dset_name << " from h5 file " << h5_output_fname << " ---" << std::endl; + + // open file collective + h5_open_file_collective(h5_output_fname); + + // open group collective + h5_open_group_collective(h5_group_name); + + // get offset + int dims_ngrid[1] = {grid.get_ngrid_total_vis()}; + allreduce_i_single(dims_ngrid[0], nnodes_glob); + int offset_this[1] = {grid.get_offset_nnodes_vis()}; + + // read data from h5 file + h5_read_array(h5_dset_name, 1, dims_ngrid, arr, offset_this, true); + + // close group + h5_close_group_collective(); + // close file + h5_close_file_collective(); +} + + +void IO_utils::h5_create_file_by_group_main(std::string& fname) { + // initialize hdf5 + + // create file by the first rank of this mpi group + if (myrank == 0) { + plist_id = H5Pcreate(H5P_FILE_ACCESS); + //H5Pset_fapl_mpio(plist_id, inter_sub_comm, MPI_INFO_NULL); + + std::string fout = output_dir + "/" + fname; + file_id = H5Fcreate(fout.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, plist_id); + //file_id = H5Fcreate(fname.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + H5Pclose(plist_id); + H5Fclose(file_id); + } + synchronize_all_inter(); +} + +void IO_utils::h5_open_file_by_group_main(std::string& fname){ + // open file by the first rank of first mpi group + if (myrank == 0) { + plist_id = H5Pcreate(H5P_FILE_ACCESS); + std::string fout = output_dir + "/" + fname; + file_id = H5Fopen(fout.c_str(), H5F_ACC_RDWR, plist_id); + } +} + +// this function need to be read by only subdomain rank = 0 +void IO_utils::h5_open_file_collective(std::string& fname){ + // open file by all ranks + plist_id = H5Pcreate(H5P_FILE_ACCESS); + H5Pset_fapl_mpio(plist_id, inter_sub_comm, MPI_INFO_NULL); + std::string fout = output_dir + "/" + fname; + file_id = H5Fopen(fout.c_str(), H5F_ACC_RDWR, plist_id); + H5Pclose(plist_id); +} + + +void IO_utils::h5_open_file_collective_input(std::string& fname){ + // open file by all ranks + plist_id = H5Pcreate(H5P_FILE_ACCESS); + H5Pset_fapl_mpio(plist_id, inter_sub_comm, MPI_INFO_NULL); + std::string fout = fname; + file_id = H5Fopen(fout.c_str(), H5F_ACC_RDWR, plist_id); +} + + +void IO_utils::h5_close_file_by_group_main(){ + if(myrank == 0) { + H5Pclose(plist_id); + H5Fclose(file_id); + } +} + +void IO_utils::h5_close_file_collective(){ + //H5Pclose(plist_id); + H5Fclose(file_id); +} + + +void IO_utils::h5_create_group_by_group_main(std::string& group_name){ + // create group by only main rank + if (myrank == 0) { + // check if group exists + if (!H5Lexists(file_id, group_name.c_str(), H5P_DEFAULT)) { + group_id = H5Gcreate(file_id, group_name.c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + // close group + H5Gclose(group_id); + } + } +} + +void IO_utils::h5_open_group_by_group_main(std::string& group_name){ + // open group by mpi group main + if(myrank==0) + group_id = H5Gopen(file_id, group_name.c_str(), H5P_DEFAULT); +} + +void IO_utils::h5_open_group_collective(std::string& group_name){ + // open group by all ranks + group_id = H5Gopen(file_id, group_name.c_str(), H5P_DEFAULT); +} + + +void IO_utils::h5_close_group_by_group_main(){ + // close group by all ranks + if(myrank==0) + H5Gclose(group_id); +} + +void IO_utils::h5_close_group_collective(){ + // close group by all ranks + H5Gclose(group_id); +} + + +void IO_utils::h5_create_dataset(std::string& dset_name, int ndims, int* dims, int dtype, bool no_group){ + /* + create dataset in a group by all ranks + + dset_name: name of the dataset + ndims: number of dimensions + dims: number of elements in each dimension + dtype: data type 0: bool, 1: int, 2: float, 3: double + no_group: if true, create dataset in the file, not in a group + */ + + if (no_group) + group_id = file_id; // create dataset in the file + + // gather data size from all rank in this simulation group + // subdomain dependent size need to be in the first element of dims + int *dims_all = new int[ndims]; + + // for 1d array + if (ndims != 3) { + for (int i = 0; i < ndims; i++) { + if (i==0) + allreduce_i_single(dims[i], dims_all[i]); + else + dims_all[i] = dims[i]; + } + } else { + for (int i = 0; i < ndims; i++) { + dims_all[i] = dims[i]; + } + } + // dataset is created only by the main rank + // thus the file need to be opened by the main rank + if (myrank == 0) { + // create a dataspace with the fixed size + hsize_t *dims_h5 = new hsize_t[ndims]; + for (int i = 0; i < ndims; i++) { + dims_h5[i] = dims_all[i]; + } + + // check if the dataset exists + if (!H5Lexists(group_id, dset_name.c_str(), H5P_DEFAULT) ) { + space_id = H5Screate_simple(ndims, dims_h5, NULL); + + // create dataset + switch (dtype) + { + case 0: + dset_id = H5Dcreate(group_id, dset_name.c_str(), H5T_NATIVE_HBOOL, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + break; + case 1: + dset_id = H5Dcreate(group_id, dset_name.c_str(), H5T_NATIVE_INT, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + break; + case 2: + dset_id = H5Dcreate(group_id, dset_name.c_str(), H5T_NATIVE_FLOAT, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + break; + case 3: + dset_id = H5Dcreate(group_id, dset_name.c_str(), H5T_NATIVE_DOUBLE, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + break; + } + + // error handle + if (dset_id < 0) { + std::cout << "Error: H5Dcreate for " << dset_name << " failed" << std::endl; + exit(1); + } + + // close dataset + H5Dclose(dset_id); + // close dataspace + H5Sclose(space_id); + } + + delete[] dims_h5; + } + + delete[] dims_all; +} + + +void IO_utils::h5_create_and_write_dataset_2d(std::string& dset_name, int ndims, int* dims, int dtype, CUSTOMREAL* data){ + /* + create dataset in a group by all ranks + + dset_name: name of the dataset + ndims: number of dimensions + dims: number of elements in each dimension + dtype: data type 0: bool, 1: int, 2: float, 3: double + */ + + hid_t space_id_2d=0, dset_id_2d=0; + + // dataset is created only by the main rank + // thus the file need to be opened by the main rank + if (myrank == 0) { + // create a dataspace with the fixed size + hsize_t *dims_h5 = new hsize_t[ndims]; + for (int i = 0; i < ndims; i++) { + dims_h5[i] = dims[i]; + } + space_id_2d = H5Screate_simple(ndims, dims_h5, NULL); + + // create dataset + switch (dtype) + { + case 0: + dset_id_2d = H5Dcreate(file_id_2d, dset_name.c_str(), H5T_NATIVE_HBOOL, space_id_2d, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + status = H5Dwrite(dset_id_2d, H5T_NATIVE_HBOOL, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); + break; + case 1: + dset_id_2d = H5Dcreate(file_id_2d, dset_name.c_str(), H5T_NATIVE_INT, space_id_2d, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + status = H5Dwrite(dset_id_2d, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); + break; + case 2: + dset_id_2d = H5Dcreate(file_id_2d, dset_name.c_str(), H5T_NATIVE_FLOAT, space_id_2d, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + status = H5Dwrite(dset_id_2d, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); + break; + case 3: + dset_id_2d = H5Dcreate(file_id_2d, dset_name.c_str(), H5T_NATIVE_DOUBLE, space_id_2d, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + status = H5Dwrite(dset_id_2d, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); + break; + } + + // error handle + if (dset_id_2d < 0) { + std::cout << "Error: H5Dcreate for " << dset_name << " failed" << std::endl; + exit(1); + } + + // close dataset + H5Dclose(dset_id_2d); + // close dataspace + H5Sclose(space_id_2d); + + delete[] dims_h5; + } + +} + + +void IO_utils::h5_open_dataset(std::string& dset_name){ + // open dataset in a group by all ranks + dset_id = H5Dopen(group_id, dset_name.c_str(), H5P_DEFAULT); + + if (dset_id < 0) { + std::cout << "Error: H5Dopen for " << dset_name << " failed" << std::endl; + exit(1); + } +} + +void IO_utils::h5_open_dataset_no_group(std::string& dset_name){ + // open dataset in a group by all ranks + dset_id = H5Dopen(file_id, dset_name.c_str(), H5P_DEFAULT); + + if (dset_id < 0) { + std::cout << "Error: H5Dopen for " << dset_name << " failed" << std::endl; + exit(1); + } +} + +void IO_utils::h5_close_dataset(){ + // close dataset in a group by all ranks + H5Dclose(dset_id); +} + +template +void IO_utils::h5_write_array(std::string& dset_name, int rank, int* dims_in, T* data, int offset_in, int offset_in2, int offset_in3, bool no_group) { + // write a data array to a dataset by all ranks + + // use group_id as file_id if no_group is true + if (no_group) + group_id = file_id; + + hsize_t* offset = new hsize_t[rank]; + hsize_t* count = new hsize_t[rank]; + hsize_t* stride = new hsize_t[rank]; + hsize_t* block = new hsize_t[rank]; + + if (rank != 3){ + for (int i_rank = 0; i_rank < rank; i_rank++) { + if (i_rank == 0) + offset[i_rank] = offset_in; + else if (i_rank == 1) + offset[i_rank] = offset_in2; + else if (i_rank == 2) + offset[i_rank] = offset_in3; + count[i_rank] = dims_in[i_rank]; + block[i_rank] = 1; + stride[i_rank] = 1; + } + } else { + for (int i_rank = 0; i_rank < rank; i_rank++) { + if (i_rank == 0){ + offset[i_rank] = offset_in; + count[i_rank] = dims_in[0]; + } + else if (i_rank == 1){ + offset[i_rank] = offset_in2; + count[i_rank] = dims_in[1]; + } + else if (i_rank == 2){ + offset[i_rank] = offset_in3; + count[i_rank] = dims_in[2]; + } + + block[i_rank] = 1; + stride[i_rank] = 1; + } + } + + // check data type of array + int dtype = check_data_type(data[0]); + + // open dataset + h5_open_dataset(dset_name); + + // select hyperslab + mem_dspace_id = H5Screate_simple(rank, count, NULL); + file_dspace_id = H5Dget_space(dset_id); + + H5Sselect_hyperslab(file_dspace_id, H5S_SELECT_SET, offset, stride, count, block); + + // create dataset prop list + plist_id_dset = H5Pcreate(H5P_DATASET_XFER); + //H5Pset_buffer(plist_id_dset, BUF_SIZE, NULL, NULL); // this will be important for machine dependent tuning + H5Pset_dxpl_mpio(plist_id_dset, HDF5_IO_MODE); + + // check if this writing is done collectively + H5D_mpio_actual_io_mode_t actualIOMode; + H5Pget_mpio_actual_io_mode(plist_id_dset, &actualIOMode); + + if (actualIOMode == H5D_MPIO_NO_COLLECTIVE) { + if (rank == 0) { + std::cout << "Warning: Collective I/O is not enabled." << std::endl; + } + } + + // write array + switch (dtype) + { + case 0: // write bool + status = H5Dwrite(dset_id, H5T_NATIVE_HBOOL, mem_dspace_id, file_dspace_id, plist_id_dset, data); + break; + case 1: // write int + status = H5Dwrite(dset_id, H5T_NATIVE_INT, mem_dspace_id, file_dspace_id, plist_id_dset, data); + break; + case 2: // write float + status = H5Dwrite(dset_id, H5T_NATIVE_FLOAT, mem_dspace_id, file_dspace_id, plist_id_dset, data); + break; + case 3: // write double + status = H5Dwrite(dset_id, H5T_NATIVE_DOUBLE, mem_dspace_id, file_dspace_id, plist_id_dset, data); + break; + } + + // close dataset prop + H5Pclose(plist_id_dset); + // close dataspace + H5Sclose(mem_dspace_id); + H5Sclose(file_dspace_id); + // close dataset + h5_close_dataset(); + + delete[] offset; + delete[] count; + delete[] stride; + delete[] block; +} + +template +void IO_utils::h5_read_array(std::string& dset_name, int rank, int* dims_in, T* data, int* offset_in, bool in_group) { + + hsize_t* offset = new hsize_t[rank]; + hsize_t* count = new hsize_t[rank]; + hsize_t* stride = new hsize_t[rank]; + hsize_t* block = new hsize_t[rank]; + + if (rank == 3){ // used for reading input model + offset[0] = offset_in[2]; + count[0] = dims_in[2]; + offset[1] = offset_in[1]; + count[1] = dims_in[1]; + offset[2] = offset_in[0]; + count[2] = dims_in[0]; + } else if (rank == 1) { // used for reading output data from TomoATT + offset[0] = offset_in[0]; + count[0] = dims_in[0]; + } + + for (int i_rank = 0; i_rank < rank; i_rank++) { + stride[i_rank] = 1; + block[i_rank] = 1; + } + + // check data type of array + int dtype = check_data_type(data[0]); + + // open dataset + if (!in_group) + h5_open_dataset_no_group(dset_name); + else + h5_open_dataset(dset_name); + + // select hyperslab + mem_dspace_id = H5Screate_simple(rank, count, NULL); + file_dspace_id = H5Dget_space(dset_id); + H5Sselect_hyperslab(file_dspace_id, H5S_SELECT_SET, offset, stride, count, block); + + // create dataset prop list + plist_id_dset = H5Pcreate(H5P_DATASET_XFER); + //H5Pset_buffer(plist_id_dset, BUF_SIZE, NULL, NULL); // this will be important for machine dependent tuning + H5Pset_dxpl_mpio(plist_id_dset, H5FD_MPIO_COLLECTIVE); + + // read array + switch (dtype) + { + case 0: // read bool + status = H5Dread(dset_id, H5T_NATIVE_HBOOL, mem_dspace_id, file_dspace_id, plist_id_dset, data); + break; + case 1: // read int + status = H5Dread(dset_id, H5T_NATIVE_INT, mem_dspace_id, file_dspace_id, plist_id_dset, data); + break; + case 2: // read float + status = H5Dread(dset_id, H5T_NATIVE_FLOAT, mem_dspace_id, file_dspace_id, plist_id_dset, data); + break; + case 3: // read double + status = H5Dread(dset_id, H5T_NATIVE_DOUBLE, mem_dspace_id, file_dspace_id, plist_id_dset, data); + break; + } + + // close dataset prop + H5Pclose(plist_id_dset); + // close dataspace + H5Sclose(mem_dspace_id); + H5Sclose(file_dspace_id); + // close dataset + h5_close_dataset(); + + delete[] offset; + delete[] count; + delete[] stride; + delete[] block; +} + +template +void IO_utils::h5_read_array_simple(std::string& dset_name, T* data) { + + // check data type of array + int dtype = check_data_type(data[0]); + + // open dataset + h5_open_dataset_no_group(dset_name); + + switch (dtype) + { + case 0: // read bool + status = H5Dread(dset_id, H5T_NATIVE_HBOOL, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); + break; + case 1: // read int + status = H5Dread(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); + break; + case 2: // read float + status = H5Dread(dset_id, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); + break; + case 3: // read double + status = H5Dread(dset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); + break; + } + + // close dataset + h5_close_dataset(); + +} + +#endif // USE_HDF5 \ No newline at end of file diff --git a/src/iterator.cpp b/src/iterator.cpp new file mode 100644 index 0000000..56a5bc3 --- /dev/null +++ b/src/iterator.cpp @@ -0,0 +1,3384 @@ +#include "iterator.h" + +// test no valence anymore + +Iterator::Iterator(InputParams& IP, Grid& grid, Source& src, IO_utils& io, const std::string& src_name, \ + bool first_init, bool is_teleseismic_in, bool is_second_run_in) \ + : is_second_run(is_second_run_in) { + + if(n_subprocs > 1) { + + // share necessary values between subprocs + np = loc_I; + nt = loc_J; + nr = loc_K; + dr = grid.dr; + dt = grid.dt; + dp = grid.dp; + + if (first_init) { + + broadcast_i_single_sub(nr,0); + broadcast_i_single_sub(nt,0); + broadcast_i_single_sub(np,0); + broadcast_cr_single_sub(dr,0); + broadcast_cr_single_sub(dt,0); + broadcast_cr_single_sub(dp,0); + + // initialize n_elms for subprocs + if (!subdom_main){ + loc_I = np; + loc_J = nt; + loc_K = nr; + grid.dr = dr; + grid.dt = dt; + grid.dp = dp; + } + } + + // check if teleseismic source + is_teleseismic = is_teleseismic_in; + //broadcast_bool_single_sub(is_teleseismic, 0); // done in IP.get_if_teleseismic() + + // check initialized values + if (if_verbose){ + std::cout << "nr: " << nr << " nt: " << nt << " np: " << np << std::endl; + std::cout << "dr: " << dr << " dt: " << dt << " dp: " << dp << std::endl; + std::cout << "loc_I: " << loc_I << " loc_J: " << loc_J << " loc_K: " << loc_K << std::endl; + } + + + } else { + np = loc_I; + nt = loc_J; + nr = loc_K; + dr = grid.dr; + dt = grid.dt; + dp = grid.dp; + is_teleseismic = is_teleseismic_in; + } + + // // set initial and end indices of level set + // if (!is_teleseismic) { + // st_level = 6; + // ed_level = nr+nt+np-3; + // } else { + // st_level = 0; + // ed_level = nr+nt+np; + // } + // if (IP.get_stencil_type() == UPWIND) { + // st_level = 0; + // ed_level = nr+nt+np-3; + // } + + st_level = 0; + ed_level = nr+nt+np-3; + + // initialize factors etc. + initialize_arrays(IP, io, grid, src, src_name); + + + +} + + +Iterator::~Iterator() { + +#if defined USE_SIMD || defined USE_CUDA + + if (simd_allocated){ + // if use_gpu == false, simd_allocated is also false here + + free(dump_c__);// center of stencil + + free_preloaded_array(vv_iip); + free_preloaded_array(vv_jjt); + free_preloaded_array(vv_kkr); + + // free vv_* preloaded arrays + free_preloaded_array(vv_i__j__k__); + free_preloaded_array(vv_ip1j__k__); + free_preloaded_array(vv_im1j__k__); + free_preloaded_array(vv_i__jp1k__); + free_preloaded_array(vv_i__jm1k__); + free_preloaded_array(vv_i__j__kp1); + free_preloaded_array(vv_i__j__km1); + + if(simd_allocated_3rd || is_teleseismic){ + free_preloaded_array(vv_ip2j__k__); + free_preloaded_array(vv_im2j__k__); + free_preloaded_array(vv_i__jp2k__); + free_preloaded_array(vv_i__jm2k__); + free_preloaded_array(vv_i__j__kp2); + free_preloaded_array(vv_i__j__km2); + } + + free_preloaded_array(vv_fac_a); + free_preloaded_array(vv_fac_b); + free_preloaded_array(vv_fac_c); + free_preloaded_array(vv_fac_f); + free_preloaded_array(vv_fun); + if (!is_teleseismic){ + free_preloaded_array(vv_T0v); + free_preloaded_array(vv_T0r); + free_preloaded_array(vv_T0t); + free_preloaded_array(vv_T0p); + } + if(!use_gpu) + free_preloaded_array(vv_change); + else + free_preloaded_array(vv_change_bl); + } +#endif + +#ifdef USE_CUDA + // free memory on device before host arrays + // otherwise the program crashes + if (use_gpu) { + // free memory on device + cuda_finalize_grid(gpu_grid); + + delete gpu_grid; + } +#endif + +} + + +void Iterator::initialize_arrays(InputParams& IP, IO_utils& io, Grid& grid, Source& src, const std::string& name_sim_src) { + if(if_verbose && myrank == 0) std::cout << "(re) initializing arrays" << std::endl; + + // std::cout << "source lat: " << src.get_src_t()*RAD2DEG << ", source lon: " << src.get_src_p()*RAD2DEG << ", source dep: " << src.get_src_r() << std::endl; + + if (!is_second_run) { // field initialization has already been done in the second run + if (subdom_main) { + if (!is_teleseismic) { + // set initial a b c and calculate a0 b0 c0 f0 + grid.setup_factors(src); + + // calculate T0 T0r T0t T0p and initialize tau + grid.initialize_fields(src, IP); + } else { + // copy T_loc arrival time on domain's boundaries. + grid.initialize_fields_teleseismic(); + + // load 2d traveltime on boundary from file + load_2d_traveltime(IP, src, grid, io); + } + } + } + + // assign processes for each sweeping level + if (IP.get_sweep_type() == SWEEP_TYPE_LEVEL) assign_processes_for_levels(grid, IP); + +#ifdef USE_CUDA + if(use_gpu){ + gpu_grid = new Grid_on_device(); + if (IP.get_stencil_order() == 1){ + cuda_initialize_grid_1st(ijk_for_this_subproc, gpu_grid, loc_I, loc_J, loc_K, dp, dt, dr, \ + vv_i__j__k__, vv_ip1j__k__, vv_im1j__k__, vv_i__jp1k__, vv_i__jm1k__, vv_i__j__kp1, vv_i__j__km1, \ + vv_fac_a, vv_fac_b, vv_fac_c, vv_fac_f, vv_T0v, vv_T0r, vv_T0t, vv_T0p, vv_fun, vv_change_bl); + } else { + cuda_initialize_grid_3rd(ijk_for_this_subproc, gpu_grid, loc_I, loc_J, loc_K, dp, dt, dr, \ + vv_i__j__k__, vv_ip1j__k__, vv_im1j__k__, vv_i__jp1k__, vv_i__jm1k__, vv_i__j__kp1, vv_i__j__km1, \ + vv_ip2j__k__, vv_im2j__k__, vv_i__jp2k__, vv_i__jm2k__, vv_i__j__kp2, vv_i__j__km2, \ + vv_fac_a, vv_fac_b, vv_fac_c, vv_fac_f, vv_T0v, vv_T0r, vv_T0t, vv_T0p, vv_fun, vv_change_bl); + } + + //std::cout << "gpu grid initialization done." << std::endl; + } +#endif + +} + + +// assign intra-node processes for each sweeping level +void Iterator::assign_processes_for_levels(Grid& grid, InputParams& IP) { + // allocate memory for process range + std::vector n_nodes_of_levels; + + // count the number of nodes on each level + for (int level = st_level; level <= ed_level; level++) { + int count_n_nodes = 0; // the number of nodes in this level + + // the range of index k (rr) + int kleft = std::max(0, level - (np-1) - (nt-1)); + int kright = std::min(nr-1, level); + + for (int kk = kleft; kk <= kright; kk++) { + + // the range of index j (tt) + int jleft = std::max(0, level - kk - (np-1)); + int jright = std::min(nt-1, level-kk); + + // now i = level - kk - jj + int n_jlines = jright - jleft + 1; + count_n_nodes += n_jlines; + } // end loop kk + + n_nodes_of_levels.push_back(count_n_nodes); // store the number of nodes of each level + } // end loop level + + + // find max in n_nodes_of_levels + max_n_nodes_plane = 0; + for (size_t i = 0; i < n_nodes_of_levels.size(); i++) + if (n_nodes_of_levels[i] > max_n_nodes_plane) + max_n_nodes_plane = n_nodes_of_levels[i]; + + + int n_grids_this_subproc = 0; // count the number of grids calculated by this subproc + + // assign nodes on each level plane to processes + for (int level = st_level; level <= ed_level; level++) { + + // the range of index k (rr) + int kleft = std::max(0, level - (np-1) - (nt-1)); + int kright = std::min(nr-1, level); + + + std::vector asigned_nodes_on_this_level; + int grid_count = 0; + + // // n grids calculated by each subproc + // int n_grids_each = static_cast(n_nodes_of_levels[level] / n_subprocs); + // int n_grids_by_this = n_grids_each; + // int i_grid_start = n_grids_each*sub_rank; + + // // add modulo for last sub_rank + // if (sub_rank == n_subprocs-1) + // n_grids_by_this += static_cast(n_nodes_of_levels[level] % n_subprocs); + + // determine the beginnig index and the number of node for each subproc + int n_grids_each = static_cast(n_nodes_of_levels[level] / n_subprocs); + int remainder = n_nodes_of_levels[level] % n_subprocs; + + int n_grids_by_this = 0; // the number of grids calculated by this subproc + int i_grid_start = 0; // the starting index of grids calculated by this subproc + if(sub_rank < remainder){ + n_grids_by_this = n_grids_each + 1; + i_grid_start = n_grids_each*sub_rank + sub_rank; + } else{ + n_grids_by_this = n_grids_each; + i_grid_start = n_grids_each*sub_rank + remainder; + } + + // std::cout << "sub_rank " << sub_rank << ", n_grids_by_this: " << n_grids_by_this << ", idx: " << i_grid_start << std::endl; + + for (int kk = kleft; kk <= kright; kk++) { + + // the range of index j (tt) + int jleft = std::max(0, level - kk - (np-1)); + int jright = std::min(nt-1, level-kk); + + for (int jj = jleft; jj <= jright; jj++) { + int ii = level - kk - jj; + + // check if this node should be assigned to this process + if (grid_count >= i_grid_start && grid_count < i_grid_start+n_grids_by_this) { + int tmp_ijk = I2V(ii,jj,kk); + asigned_nodes_on_this_level.push_back(tmp_ijk); + n_grids_this_subproc++; + } + + grid_count++; + + } // end loop jj + } // end loop kk + + // store the node ids of each level + ijk_for_this_subproc.push_back(asigned_nodes_on_this_level); + } // end loop level + + if(if_verbose) + std::cout << "n total grids calculated by sub_rank " << sub_rank << ": " << n_grids_this_subproc << std::endl; + + // std::cout << "n total grids calculated by sub_rank " << sub_rank << ": " << n_grids_this_subproc << std::endl; + + // + // TODO: upwind scheme + sweep parallelization does not support SIMD yet + // + return; + + +#if defined USE_SIMD || defined USE_CUDA + + preload_indices(vv_iip, vv_jjt, vv_kkr, 0, 0, 0); + preload_indices_1d(vv_i__j__k__, 0, 0, 0); + preload_indices_1d(vv_ip1j__k__, 1, 0, 0); + preload_indices_1d(vv_i__jp1k__, 0, 1, 0); + preload_indices_1d(vv_i__j__kp1, 0, 0, 1); + preload_indices_1d(vv_im1j__k__,-1, 0, 0); + preload_indices_1d(vv_i__jm1k__, 0,-1, 0); + preload_indices_1d(vv_i__j__km1, 0, 0,-1); + + if(IP.get_stencil_order() == 3 || is_teleseismic){ + preload_indices_1d(vv_ip2j__k__, 2, 0, 0); + preload_indices_1d(vv_i__jp2k__, 0, 2, 0); + preload_indices_1d(vv_i__j__kp2, 0, 0, 2); + preload_indices_1d(vv_im2j__k__,-2, 0, 0); + preload_indices_1d(vv_i__jm2k__, 0,-2, 0); + preload_indices_1d(vv_i__j__km2, 0, 0,-2); + simd_allocated_3rd = true; + } + + int dump_length = NSIMD; + // stencil dumps + // first orders + dump_c__ = (CUSTOMREAL*) aligned_alloc(ALIGN, dump_length*sizeof(CUSTOMREAL));// center of stencil + + // preload the stencil dumps + vv_fac_a = preload_array(grid.fac_a_loc); + vv_fac_b = preload_array(grid.fac_b_loc); + vv_fac_c = preload_array(grid.fac_c_loc); + vv_fac_f = preload_array(grid.fac_f_loc); + vv_fun = preload_array(grid.fun_loc); + if(!is_teleseismic) { + vv_T0v = preload_array(grid.T0v_loc); + vv_T0r = preload_array(grid.T0r_loc); + vv_T0t = preload_array(grid.T0t_loc); + vv_T0p = preload_array(grid.T0p_loc); + } + if(!use_gpu) + vv_change = preload_array(grid.is_changed); + else + vv_change_bl = preload_array_bl(grid.is_changed); + + // flag for preloading + simd_allocated = true; +#endif // USE_SIMD + +} + +#if defined USE_SIMD || defined USE_CUDA + +template +std::vector> Iterator::preload_array(T* a){ + + std::vector> vvv; + + for (int iswap=0; iswap<8; iswap++){ + int n_levels = ijk_for_this_subproc.size(); + std::vector vv; + + for (int i_level=0; i_level> Iterator::preload_array_bl(bool* a){ + + std::vector> vvv; + + for (int iswap=0; iswap<8; iswap++){ + int n_levels = ijk_for_this_subproc.size(); + std::vector vv; + + for (int i_level=0; i_level +void Iterator::preload_indices(std::vector> &vvvi, \ + std::vector> &vvvj, \ + std::vector> &vvvk, \ + int shift_i, int shift_j, int shift_k) { + + int iip, jjt, kkr; + for (int iswp=0; iswp < 8; iswp++){ + set_sweep_direction(iswp); + + std::vector vvi, vvj, vvk; + + int n_levels = ijk_for_this_subproc.size(); + for (int i_level = 0; i_level < n_levels; i_level++) { + int n_nodes = ijk_for_this_subproc[i_level].size(); + int n_nodes_tmp; + if(!use_gpu) + n_nodes_tmp = n_nodes + ((n_nodes % NSIMD == 0) ? 0 : (NSIMD - n_nodes % NSIMD)); // length needs to be multiple of NSIMD + else + n_nodes_tmp = n_nodes; + + T* vi = (T*) aligned_alloc(ALIGN, n_nodes_tmp*sizeof(T)); + T* vj = (T*) aligned_alloc(ALIGN, n_nodes_tmp*sizeof(T)); + T* vk = (T*) aligned_alloc(ALIGN, n_nodes_tmp*sizeof(T)); + + for (int i_node = 0; i_node < n_nodes; i_node++) { + int tmp_ijk = ijk_for_this_subproc[i_level][i_node]; + V2I(tmp_ijk, iip, jjt, kkr); + if (r_dirc < 0) kkr = loc_K-kkr; //kk-1; + else kkr = kkr-1; //nr-kk; + if (t_dirc < 0) jjt = loc_J-jjt; //jj-1; + else jjt = jjt-1; //nt-jj; + if (p_dirc < 0) iip = loc_I-iip; //ii-1; + else iip = iip-1; //np-ii; + + kkr += shift_k; + jjt += shift_j; + iip += shift_i; + + if (kkr >= loc_K) kkr = 0; + if (jjt >= loc_J) jjt = 0; + if (iip >= loc_I) iip = 0; + + if (kkr < 0) kkr = 0; + if (jjt < 0) jjt = 0; + if (iip < 0) iip = 0; + + vi[i_node] = (T)iip; + vj[i_node] = (T)jjt; + vk[i_node] = (T)kkr; + + } + // assign dummy + for (int i=n_nodes; i +void Iterator::preload_indices_1d(std::vector> &vvv, \ + int shift_i, int shift_j, int shift_k) { + + int iip, jjt, kkr; + for (int iswp=0; iswp < 8; iswp++){ + set_sweep_direction(iswp); + + std::vector vv; + + int n_levels = ijk_for_this_subproc.size(); + for (int i_level = 0; i_level < n_levels; i_level++) { + int n_nodes = ijk_for_this_subproc[i_level].size(); + int n_nodes_tmp; + if(!use_gpu) + n_nodes_tmp = n_nodes + ((n_nodes % NSIMD == 0) ? 0 : (NSIMD - n_nodes % NSIMD)); // length needs to be multiple of NSIMD + else + n_nodes_tmp = n_nodes; + + T* v = (T*) aligned_alloc(ALIGN, n_nodes_tmp*sizeof(T)); + + for (int i_node = 0; i_node < n_nodes; i_node++) { + int tmp_ijk = ijk_for_this_subproc[i_level][i_node]; + V2I(tmp_ijk, iip, jjt, kkr); + if (r_dirc < 0) kkr = loc_K-kkr; //kk-1; + else kkr = kkr-1; //nr-kk; + if (t_dirc < 0) jjt = loc_J-jjt; //jj-1; + else jjt = jjt-1; //nt-jj; + if (p_dirc < 0) iip = loc_I-iip; //ii-1; + else iip = iip-1; //np-ii; + + kkr += shift_k; + jjt += shift_j; + iip += shift_i; + + if (kkr >= loc_K) kkr = 0; + if (jjt >= loc_J) jjt = 0; + if (iip >= loc_I) iip = 0; + + if (kkr < 0) kkr = 0; + if (jjt < 0) jjt = 0; + if (iip < 0) iip = 0; + + v[i_node] = (T)I2V(iip, jjt, kkr); + + } + // assign dummy + for (int i=n_nodes; i -1; iswp--) { + do_sweep(iswp, grid, IP); + +#ifdef FREQ_SYNC_GHOST + // synchronize ghost cells everytime after sweeping of each direction + if (subdom_main){ + if (!is_teleseismic) + grid.send_recev_boundary_data(grid.tau_loc); + else + grid.send_recev_boundary_data(grid.T_loc); + + } +#endif + } + + +#ifndef FREQ_SYNC_GHOST + // synchronize ghost cells everytime after sweeping of all directions + // as the same method with Detrixhe2016 + if (subdom_main){ + if (!is_teleseismic) + grid.send_recev_boundary_data(grid.tau_loc); + else + grid.send_recev_boundary_data(grid.T_loc); + } +#endif + + // calculate the objective function + // if converged, break the loop + if (subdom_main) { + if (!is_teleseismic) + grid.calc_L1_and_Linf_diff(cur_diff_L1, cur_diff_Linf); + else + grid.calc_L1_and_Linf_diff_tele(cur_diff_L1, cur_diff_Linf); + + if(if_test) { + grid.calc_L1_and_Linf_error(cur_err_L1, cur_err_Linf); + //std::cout << "Theoretical difference: " << cur_err_L1 << ' ' << cur_err_Linf << std::endl; + } + } + + // broadcast the diff values + broadcast_cr_single_sub(cur_diff_L1, 0); + broadcast_cr_single_sub(cur_diff_Linf, 0); // dead lock + if (if_test) { + broadcast_cr_single_sub(cur_err_L1, 0); + broadcast_cr_single_sub(cur_err_Linf, 0); + } + + //if (iter_count==0) + // MNMN: please don't leave this line active when pushing your commit. + // MNMN: because std::cout/endl is very slow when called in the loop. + // std::cout << "id_sim, sub_rank, cur_diff_L1, cur_diff_Linf: " << id_sim << ", " << sub_rank << ", " << cur_diff_L1 << ", " << cur_diff_Linf << std::endl; + + // debug store temporal T fields + //io.write_tmp_tau_h5(grid, iter_count); + + + iter_count++; + + //if (cur_diff_L1 < IP.get_conv_tol() && cur_diff_Linf < IP.get_conv_tol()) { // MNMN: let us use only L1 because Linf stop decreasing when using numbers of subdomains. + if (cur_diff_L1 < IP.get_conv_tol()) { + //stdout_by_main("--- iteration converged. ---"); + goto iter_end; + } else if (IP.get_max_iter() <= iter_count) { + stdout_by_main("--- iteration reached to the maximum number of iterations. ---"); + goto iter_end; + } else { + if(myrank==0 && if_verbose) + std::cout << "iteration " << iter_count << ": " << cur_diff_L1 << ", " << cur_diff_Linf << ", " << timer_iter.get_t_delta() << "\n"; + } + } + +iter_end: + if (myrank==0){ + if (if_verbose){ + std::cout << "Converged at iteration " << iter_count << ": " << cur_diff_L1 << ", " << cur_diff_Linf << std::endl; + } + if (if_test) + std::cout << "errors at iteration " << iter_count << ": " << cur_err_L1 << ", " << cur_err_Linf << std::endl; + std::cout << "id_sim: " << id_sim << ", converged at iteration " << iter_count << std::endl; + } + + // calculate T + // teleseismic case will update T_loc, so T = T0*tau is not necessary. + if (subdom_main && !is_teleseismic) grid.calc_T_plus_tau(); + + // corner nodes are not used in the sweeping but used in the interpolation and visualization + if (subdom_main) grid.send_recev_boundary_data_kosumi(grid.T_loc); + + // check the time for iteration + if (inter_sub_rank==0 && subdom_main) { + timer_iter.stop_timer(); + + // output time in file + std::ofstream ofs; + ofs.open("time.txt", std::ios::app); + ofs << "Converged at iteration " << iter_count << ", L1 " << cur_diff_L1 << ", Linf " << cur_diff_Linf << ", total time[s] " << timer_iter.get_t() << std::endl; + + } + +} + + +void Iterator::run_iteration_adjoint(InputParams& IP, Grid& grid, IO_utils& io, int adj_type) { + + if(if_verbose) stdout_by_main("--- start iteration adjoint. ---"); + iter_count = 0; + CUSTOMREAL cur_diff_L1_dummy = HUGE_VAL; + cur_diff_Linf = HUGE_VAL; + + // initialize delta and Tadj_loc (here we use the array tau_old instead of delta for memory saving) + if (subdom_main){ + if (adj_type == 0) init_delta_and_Tadj(grid, IP); // run iteration for adjoint field + if (adj_type == 1) init_delta_and_Tadj_density(grid, IP); // run iteration for the density of adjoint field (adjoint source -> abs(adjoint source)) + } + + + if(if_verbose) std::cout << "checker point 1, myrank: " << myrank << ", id_sim: " << id_sim << ", id_subdomain: " << id_subdomain + << ", subdom_main:" << subdom_main << ", world_rank: " << world_rank << std::endl; + // fix the boundary of the adjoint field + if (subdom_main){ + fix_boundary_Tadj(grid); + } + + // start timer + std::string iter_str = "iteration_adjoint"; + Timer timer_iter(iter_str); + if(if_verbose) stdout_by_main("--- adjoint fast sweeping ... ---"); + + // start iteration + while (true) { + // do sweeping for all direction + for (int iswp = 0; iswp < nswp; iswp++) { + do_sweep_adj(iswp, grid, IP); + +#ifdef FREQ_SYNC_GHOST + // copy the values of communication nodes and ghost nodes + if (subdom_main) + grid.send_recev_boundary_data(grid.tau_loc); +#endif + } + +#ifndef FREQ_SYNC_GHOST + // copy the values of communication nodes and ghost nodes + if (subdom_main) + grid.send_recev_boundary_data(grid.tau_loc); +#endif + + // calculate the objective function + // if converged, break the loop + if (subdom_main) { + if(adj_type == 0) grid.calc_L1_and_Linf_diff_adj(cur_diff_L1_dummy, cur_diff_Linf); + if(adj_type == 1) grid.calc_L1_and_Linf_diff_adj_density(cur_diff_L1_dummy, cur_diff_Linf); + } + + // broadcast the diff values + //broadcast_cr_single_sub(cur_diff_L1, 0); + broadcast_cr_single_sub(cur_diff_Linf, 0); + + // debug store temporal T fields + //io.write_tmp_tau_h5(grid, iter_count); + + // store tau -> Tadj + if (subdom_main){ + if(adj_type == 0) grid.update_Tadj(); + if(adj_type == 1) grid.update_Tadj_density(); + } + + if (cur_diff_Linf < IP.get_conv_tol()) { + //stdout_by_main("--- adjoint iteration converged. ---"); + goto iter_end; + } else if (IP.get_max_iter() <= iter_count) { + stdout_by_main("--- adjoint iteration reached the maximum number of iterations. ---"); + goto iter_end; + } else { + if(myrank==0 && if_verbose) + std::cout << "iteration adj. " << iter_count << ": " << cur_diff_Linf << std::endl; + iter_count++; + } + + + } + +iter_end: + if (myrank==0){ + if (if_verbose) + std::cout << "Converged at adjoint iteration " << iter_count << ": " << cur_diff_Linf << std::endl; + if (if_test) + std::cout << "errors at iteration " << iter_count << ": " << cur_err_Linf << std::endl; + } + + // corner nodes are not used in the sweeping but used in the interpolation and visualization + if (subdom_main) { + if(adj_type == 0) grid.send_recev_boundary_data_kosumi(grid.Tadj_loc); + if(adj_type == 1) grid.send_recev_boundary_data_kosumi(grid.Tadj_density_loc); + } + + + // check the time for iteration + if (inter_sub_rank==0 && subdom_main) timer_iter.stop_timer(); + +} + + + +void Iterator::init_delta_and_Tadj(Grid& grid, InputParams& IP) { + if(if_verbose) std::cout << "initializing delta and Tadj" << std::endl; + + for (int k = 0; k < nr; k++) { + for (int j = 0; j < nt; j++) { + for (int i = 0; i < np; i++) { + grid.tau_old_loc[I2V(i,j,k)] = _0_CR; // use tau_old_loc for delta + grid.tau_loc[I2V(i,j,k)] = _0_CR; // use tau_loc for Tadj_loc (later copy to Tadj_loc) + grid.Tadj_loc[I2V(i,j,k)] = 9999999.9; + } + } + } + + // loop all receivers + for (int irec = 0; irec < IP.n_rec_this_sim_group; irec++) { + + // get receiver information + std::string rec_name = IP.get_rec_name(irec); + auto rec = IP.get_rec_point_bcast(rec_name); + + // "iter->second" is the receiver, with the class SrcRecInfo + if (rec.adjoint_source == 0){ + continue; + } + + CUSTOMREAL delta_lon = grid.get_delta_lon(); + CUSTOMREAL delta_lat = grid.get_delta_lat(); + CUSTOMREAL delta_r = grid.get_delta_r(); + + + // get positions + CUSTOMREAL rec_lon = rec.lon*DEG2RAD; + CUSTOMREAL rec_lat = rec.lat*DEG2RAD; + CUSTOMREAL rec_r = depth2radius(rec.dep); + + // check if the receiver is in this subdomain + if (grid.get_lon_min_loc() <= rec_lon && rec_lon <= grid.get_lon_max_loc() && \ + grid.get_lat_min_loc() <= rec_lat && rec_lat <= grid.get_lat_max_loc() && \ + grid.get_r_min_loc() <= rec_r && rec_r <= grid.get_r_max_loc() ) { + + // descretize receiver position (LOCAL ID) + int i_rec_loc = std::floor((rec_lon - grid.get_lon_min_loc()) / delta_lon); + int j_rec_loc = std::floor((rec_lat - grid.get_lat_min_loc()) / delta_lat); + int k_rec_loc = std::floor((rec_r - grid.get_r_min_loc()) / delta_r); + + if(i_rec_loc +1 >= loc_I) + i_rec_loc = loc_I - 2; + if(j_rec_loc + 1 >= loc_J) + j_rec_loc = loc_J - 2; + if(k_rec_loc + 1 >= loc_K) + k_rec_loc = loc_K - 2; + + // discretized receiver position + CUSTOMREAL dis_rec_lon = grid.p_loc_1d[i_rec_loc]; + CUSTOMREAL dis_rec_lat = grid.t_loc_1d[j_rec_loc]; + CUSTOMREAL dis_rec_r = grid.r_loc_1d[k_rec_loc]; + + // relative position errors + CUSTOMREAL e_lon = std::min(_1_CR,(rec_lon - dis_rec_lon)/delta_lon); + CUSTOMREAL e_lat = std::min(_1_CR,(rec_lat - dis_rec_lat)/delta_lat); + CUSTOMREAL e_r = std::min(_1_CR,(rec_r - dis_rec_r) /delta_r); + + // set delta values + grid.tau_old_loc[I2V(i_rec_loc,j_rec_loc,k_rec_loc)] += rec.adjoint_source*(1.0-e_lon)*(1.0-e_lat)*(1.0-e_r)/(delta_lon*delta_lat*delta_r*my_square(rec_r)*std::cos(rec_lat)); + grid.tau_old_loc[I2V(i_rec_loc,j_rec_loc,k_rec_loc+1)] += rec.adjoint_source*(1.0-e_lon)*(1.0-e_lat)* e_r /(delta_lon*delta_lat*delta_r*my_square(rec_r)*std::cos(rec_lat)); + grid.tau_old_loc[I2V(i_rec_loc,j_rec_loc+1,k_rec_loc)] += rec.adjoint_source*(1.0-e_lon)* e_lat* (1.0-e_r)/(delta_lon*delta_lat*delta_r*my_square(rec_r)*std::cos(rec_lat)); + grid.tau_old_loc[I2V(i_rec_loc,j_rec_loc+1,k_rec_loc+1)] += rec.adjoint_source*(1.0-e_lon)* e_lat* e_r /(delta_lon*delta_lat*delta_r*my_square(rec_r)*std::cos(rec_lat)); + grid.tau_old_loc[I2V(i_rec_loc+1,j_rec_loc,k_rec_loc)] += rec.adjoint_source* e_lon *(1.0-e_lat)*(1.0-e_r)/(delta_lon*delta_lat*delta_r*my_square(rec_r)*std::cos(rec_lat)); + grid.tau_old_loc[I2V(i_rec_loc+1,j_rec_loc,k_rec_loc+1)] += rec.adjoint_source* e_lon *(1.0-e_lat)* e_r /(delta_lon*delta_lat*delta_r*my_square(rec_r)*std::cos(rec_lat)); + grid.tau_old_loc[I2V(i_rec_loc+1,j_rec_loc+1,k_rec_loc)] += rec.adjoint_source* e_lon * e_lat *(1.0-e_r)/(delta_lon*delta_lat*delta_r*my_square(rec_r)*std::cos(rec_lat)); + grid.tau_old_loc[I2V(i_rec_loc+1,j_rec_loc+1,k_rec_loc+1)] += rec.adjoint_source* e_lon * e_lat * e_r /(delta_lon*delta_lat*delta_r*my_square(rec_r)*std::cos(rec_lat)); + } + } // end of loop all receivers + + // communicate tau_old_loc to all processors + grid.send_recev_boundary_data(grid.tau_old_loc); + +} + + +void Iterator::init_delta_and_Tadj_density(Grid& grid, InputParams& IP) { + if(if_verbose) std::cout << "initializing delta and Tadj" << std::endl; + + for (int k = 0; k < nr; k++) { + for (int j = 0; j < nt; j++) { + for (int i = 0; i < np; i++) { + grid.tau_old_loc[I2V(i,j,k)] = _0_CR; // use tau_old_loc for delta + grid.tau_loc[I2V(i,j,k)] = _0_CR; // use tau_loc for Tadj_density_loc (later copy to Tadj_density_loc) + grid.Tadj_density_loc[I2V(i,j,k)] = 9999999.9; + } + } + } + + // loop all receivers + for (int irec = 0; irec < IP.n_rec_this_sim_group; irec++) { + + // get receiver information + std::string rec_name = IP.get_rec_name(irec); + auto rec = IP.get_rec_point_bcast(rec_name); + + // "iter->second" is the receiver, with the class SrcRecInfo + if (rec.adjoint_source_density == 0){ + continue; + } + + CUSTOMREAL delta_lon = grid.get_delta_lon(); + CUSTOMREAL delta_lat = grid.get_delta_lat(); + CUSTOMREAL delta_r = grid.get_delta_r(); + + + // get positions + CUSTOMREAL rec_lon = rec.lon*DEG2RAD; + CUSTOMREAL rec_lat = rec.lat*DEG2RAD; + CUSTOMREAL rec_r = depth2radius(rec.dep); + + // check if the receiver is in this subdomain + if (grid.get_lon_min_loc() <= rec_lon && rec_lon <= grid.get_lon_max_loc() && \ + grid.get_lat_min_loc() <= rec_lat && rec_lat <= grid.get_lat_max_loc() && \ + grid.get_r_min_loc() <= rec_r && rec_r <= grid.get_r_max_loc() ) { + + // descretize receiver position (LOCAL ID) + int i_rec_loc = std::floor((rec_lon - grid.get_lon_min_loc()) / delta_lon); + int j_rec_loc = std::floor((rec_lat - grid.get_lat_min_loc()) / delta_lat); + int k_rec_loc = std::floor((rec_r - grid.get_r_min_loc()) / delta_r); + + if(i_rec_loc +1 >= loc_I) + i_rec_loc = loc_I - 2; + if(j_rec_loc + 1 >= loc_J) + j_rec_loc = loc_J - 2; + if(k_rec_loc + 1 >= loc_K) + k_rec_loc = loc_K - 2; + + // discretized receiver position + CUSTOMREAL dis_rec_lon = grid.p_loc_1d[i_rec_loc]; + CUSTOMREAL dis_rec_lat = grid.t_loc_1d[j_rec_loc]; + CUSTOMREAL dis_rec_r = grid.r_loc_1d[k_rec_loc]; + + // relative position errors + CUSTOMREAL e_lon = std::min(_1_CR,(rec_lon - dis_rec_lon)/delta_lon); + CUSTOMREAL e_lat = std::min(_1_CR,(rec_lat - dis_rec_lat)/delta_lat); + CUSTOMREAL e_r = std::min(_1_CR,(rec_r - dis_rec_r) /delta_r); + + // set delta values + grid.tau_old_loc[I2V(i_rec_loc,j_rec_loc,k_rec_loc)] += rec.adjoint_source_density*(1.0-e_lon)*(1.0-e_lat)*(1.0-e_r)/(delta_lon*delta_lat*delta_r*my_square(rec_r)*std::cos(rec_lat)); + grid.tau_old_loc[I2V(i_rec_loc,j_rec_loc,k_rec_loc+1)] += rec.adjoint_source_density*(1.0-e_lon)*(1.0-e_lat)* e_r /(delta_lon*delta_lat*delta_r*my_square(rec_r)*std::cos(rec_lat)); + grid.tau_old_loc[I2V(i_rec_loc,j_rec_loc+1,k_rec_loc)] += rec.adjoint_source_density*(1.0-e_lon)* e_lat* (1.0-e_r)/(delta_lon*delta_lat*delta_r*my_square(rec_r)*std::cos(rec_lat)); + grid.tau_old_loc[I2V(i_rec_loc,j_rec_loc+1,k_rec_loc+1)] += rec.adjoint_source_density*(1.0-e_lon)* e_lat* e_r /(delta_lon*delta_lat*delta_r*my_square(rec_r)*std::cos(rec_lat)); + grid.tau_old_loc[I2V(i_rec_loc+1,j_rec_loc,k_rec_loc)] += rec.adjoint_source_density* e_lon *(1.0-e_lat)*(1.0-e_r)/(delta_lon*delta_lat*delta_r*my_square(rec_r)*std::cos(rec_lat)); + grid.tau_old_loc[I2V(i_rec_loc+1,j_rec_loc,k_rec_loc+1)] += rec.adjoint_source_density* e_lon *(1.0-e_lat)* e_r /(delta_lon*delta_lat*delta_r*my_square(rec_r)*std::cos(rec_lat)); + grid.tau_old_loc[I2V(i_rec_loc+1,j_rec_loc+1,k_rec_loc)] += rec.adjoint_source_density* e_lon * e_lat *(1.0-e_r)/(delta_lon*delta_lat*delta_r*my_square(rec_r)*std::cos(rec_lat)); + grid.tau_old_loc[I2V(i_rec_loc+1,j_rec_loc+1,k_rec_loc+1)] += rec.adjoint_source_density* e_lon * e_lat * e_r /(delta_lon*delta_lat*delta_r*my_square(rec_r)*std::cos(rec_lat)); + } + } // end of loop all receivers + + // communicate tau_old_loc to all processors + grid.send_recev_boundary_data(grid.tau_old_loc); + +} + +void Iterator::fix_boundary_Tadj(Grid& grid) { + + if (!is_teleseismic){ + // r, theta boundary + if (grid.i_first()) + for (int ir = 0; ir < nr; ir++) + for (int it = 0; it < nt; it++) + grid.tau_loc[I2V(0,it,ir)] = _0_CR; + if (grid.i_last()) + for (int ir = 0; ir < nr; ir++) + for (int it = 0; it < nt; it++) + grid.tau_loc[I2V(np-1,it,ir)] = _0_CR; + // r, phi boundary + if (grid.j_first()) + for (int ir = 0; ir < nr; ir++) + for (int ip = 0; ip < np; ip++) + grid.tau_loc[I2V(ip,0,ir)] = _0_CR; + if (grid.j_last()) + for (int ir = 0; ir < nr; ir++) + for (int ip = 0; ip < np; ip++) + grid.tau_loc[I2V(ip,nt-1,ir)] = _0_CR; + // theta, phi boundary + if (grid.k_first()) + for (int it = 0; it < nt; it++) + for (int ip = 0; ip < np; ip++) + grid.tau_loc[I2V(ip,it,0)] = _0_CR; + if (grid.k_last()) + for (int it = 0; it < nt; it++) + for (int ip = 0; ip < np; ip++) + grid.tau_loc[I2V(ip,it,nr-1)] = _0_CR; + } else { + for (int ir = 0; ir < nr; ir++) + for (int it = 0; it < nt; it++) + for (int ip = 0; ip < np; ip++) + calculate_boundary_nodes_adj(grid,ip,it,ir); + } + +} + + +void Iterator::calculate_stencil_1st_order_upwind(Grid&grid, int&iip, int&jjt, int&kkr){ + + bool check_out = false; + int iip_out = 24; + int jjt_out = 29; + int kkr_out = 38; + // preparations + + int ii = I2V(iip, jjt, kkr); + int ii_mp = I2V(iip-1, jjt, kkr); + int ii_pp = I2V(iip+1, jjt, kkr); + int ii_mt = I2V(iip , jjt-1, kkr); + int ii_pt = I2V(iip , jjt+1, kkr); + int ii_mr = I2V(iip , jjt, kkr-1); + int ii_pr = I2V(iip , jjt, kkr+1); + + count_cand = 0; + // forward and backward partial differential discretization + // T_p = (T0*tau)_p = T0p*tau + T0v*tau_p = ap*tau(iip, jjt, kkr)+bp; + // T_t = (T0*tau)_t = T0t*tau + T0v*tau_t = at*tau(iip, jjt, kkr)+bt; + // T_r = (T0*tau)_r = T0r*tau + T0v*tau_r = ar*tau(iip, jjt, kkr)+br; + if (iip > 0){ + ap1 = grid.T0p_loc[ii] + grid.T0v_loc[ii]/dp; + bp1 = -grid.T0v_loc[ii]/dp*grid.tau_loc[ii_mp]; + } + if (iip < np-1){ + ap2 = grid.T0p_loc[ii] - grid.T0v_loc[ii]/dp; + bp2 = grid.T0v_loc[ii]/dp*grid.tau_loc[ii_pp]; + } + + if (jjt > 0){ + at1 = grid.T0t_loc[ii] + grid.T0v_loc[ii]/dt; + bt1 = -grid.T0v_loc[ii]/dt*grid.tau_loc[ii_mt]; + } + if (jjt < nt-1){ + at2 = grid.T0t_loc[ii] - grid.T0v_loc[ii]/dt; + bt2 = grid.T0v_loc[ii]/dt*grid.tau_loc[ii_pt]; + } + + if (kkr > 0){ + ar1 = grid.T0r_loc[ii] + grid.T0v_loc[ii]/dr; + br1 = -grid.T0v_loc[ii]/dr*grid.tau_loc[ii_mr]; + } + if (kkr < nr-1){ + ar2 = grid.T0r_loc[ii] - grid.T0v_loc[ii]/dr; + br2 = grid.T0v_loc[ii]/dr*grid.tau_loc[ii_pr]; + } + bc_f2 = grid.fac_b_loc[ii]*grid.fac_c_loc[ii] - std::pow(grid.fac_f_loc[ii],_2_CR); + + // start to find candidate solutions + + // first catalog: characteristic travels through tetrahedron in 3D volume (8 cases) + for (int i_case = 0; i_case < 8; i_case++){ + + // determine discretization of T_p,T_t,T_r + switch (i_case) { + case 0: // characteristic travels from -p, -t, -r + if (iip == 0 || jjt == 0 || kkr == 0) + continue; + ap = ap1; bp = bp1; + at = at1; bt = bt1; + ar = ar1; br = br1; + break; + case 1: // characteristic travels from -p, -t, +r + if (iip == 0 || jjt == 0 || kkr == nr-1) + continue; + ap = ap1; bp = bp1; + at = at1; bt = bt1; + ar = ar2; br = br2; + break; + case 2: // characteristic travels from -p, +t, -r + if (iip == 0 || jjt == nt-1 || kkr == 0) + continue; + ap = ap1; bp = bp1; + at = at2; bt = bt2; + ar = ar1; br = br1; + break; + case 3: // characteristic travels from -p, +t, +r + if (iip == 0 || jjt == nt-1 || kkr == nr-1) + continue; + ap = ap1; bp = bp1; + at = at2; bt = bt2; + ar = ar2; br = br2; + break; + case 4: // characteristic travels from +p, -t, -r + if (iip == np-1 || jjt == 0 || kkr == 0) + continue; + ap = ap2; bp = bp2; + at = at1; bt = bt1; + ar = ar1; br = br1; + break; + case 5: // characteristic travels from +p, -t, +r + if (iip == np-1 || jjt == 0 || kkr == nr-1) + continue; + ap = ap2; bp = bp2; + at = at1; bt = bt1; + ar = ar2; br = br2; + break; + case 6: // characteristic travels from +p, +t, -r + if (iip == np-1 || jjt == nt-1 || kkr == 0) + continue; + ap = ap2; bp = bp2; + at = at2; bt = bt2; + ar = ar1; br = br1; + break; + case 7: // characteristic travels from +p, +t, +r + if (iip == np-1 || jjt == nt-1 || kkr == nr-1) + continue; + ap = ap2; bp = bp2; + at = at2; bt = bt2; + ar = ar2; br = br2; + break; + } + + // plug T_p, T_t, T_r into eikonal equation, solving the quadratic equation with respect to tau(iip,jjt,kkr) + // that is a*(ar*tau+br)^2 + b*(at*tau+bt)^2 + c*(ap*tau+bp)^2 - 2*f*(at*tau+bt)*(ap*tau+bp) = s^2 + eqn_a = grid.fac_a_loc[ii] * std::pow(ar, _2_CR) + grid.fac_b_loc[ii] * std::pow(at, _2_CR) + + grid.fac_c_loc[ii] * std::pow(ap, _2_CR) - _2_CR*grid.fac_f_loc[ii] * at * ap; + eqn_b = _2_CR*grid.fac_a_loc[ii] * ar * br + _2_CR*grid.fac_b_loc[ii] * at * bt + + _2_CR*grid.fac_c_loc[ii] * ap * bp - _2_CR*grid.fac_f_loc[ii] * (at*bp + bt*ap); + eqn_c = grid.fac_a_loc[ii] * std::pow(br, _2_CR) + grid.fac_b_loc[ii] * std::pow(bt, _2_CR) + + grid.fac_c_loc[ii] * std::pow(bp, _2_CR) - _2_CR*grid.fac_f_loc[ii] * bt * bp + - std::pow(grid.fun_loc[ii], _2_CR); + eqn_Delta = std::pow(eqn_b, _2_CR) - _4_CR * eqn_a * eqn_c; + + if (eqn_Delta >= 0){ // one or two real solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_tau = (-eqn_b + std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + case 1: + tmp_tau = (-eqn_b - std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + } + + // check the causality condition: the characteristic passing through (iip,jjt,kkr) is in between used three sides + // characteristic direction is (dr/dt, dtheta/dt, tphi/dt) = (H_p1,H_p2,H_p3), p1 = T_r, p2 = T_t, p3 = T_p + T_r = ar*tmp_tau + br; + T_t = at*tmp_tau + bt; + T_p = ap*tmp_tau + bp; + + charact_r = grid.fac_a_loc[ii]*T_r; + charact_t = grid.fac_b_loc[ii]*T_t - grid.fac_f_loc[ii]*T_p; + charact_p = grid.fac_c_loc[ii]*T_p - grid.fac_f_loc[ii]*T_t; + + is_causality = false; + switch (i_case){ + case 0: //characteristic travels from -p, -t, -r + if (charact_p >= 0 && charact_t >= 0 && charact_r >= 0 && tmp_tau > 0){ + // the additional constrains is only valid for weak anisotropy. it ensures correctness near the source. + is_causality = true; + } + break; + case 1: //characteristic travels from -p, -t, +r + if (charact_p >= 0 && charact_t >= 0 && charact_r <= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 2: //characteristic travels from -p, +t, -r + if (charact_p >= 0 && charact_t <= 0 && charact_r >= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 3: //characteristic travels from -p, +t, +r + if (charact_p >= 0 && charact_t <= 0 && charact_r <= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 4: //characteristic travels from +p, -t, -r + if (charact_p <= 0 && charact_t >= 0 && charact_r >= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 5: //characteristic travels from +p, -t, +r + if (charact_p <= 0 && charact_t >= 0 && charact_r <= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 6: //characteristic travels from +p, +t, -r + if (charact_p <= 0 && charact_t <= 0 && charact_r >= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 7: //characteristic travels from +p, +t, +r + if (charact_p <= 0 && charact_t <= 0 && charact_r <= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_tau; + count_cand += 1; + } + + if (check_out && iip == iip_out && jjt == jjt_out && kkr == kkr_out){ + std::cout << "body case, i_case, i_solution, is_causality, tau, T0, tau*t0: " + << i_case << ", " << i_solution << ", " << is_causality << ", " << tmp_tau << ", " + << grid.T0v_loc[I2V(iip,jjt,kkr)] << ", " << grid.T0v_loc[I2V(iip,jjt,kkr)]*tmp_tau + << ", " << std::endl; + switch (i_case) { + case 0: //characteristic travels from -p, -t, -r + std::cout << "-r: " << grid.T0v_loc[I2V(iip,jjt,kkr-1)]*grid.tau_loc[I2V(iip, jjt, kkr-1)] << ", " + << "-t: " << grid.T0v_loc[I2V(iip,jjt-1,kkr)]*grid.tau_loc[I2V(iip, jjt-1, kkr)] << ", " + << "-p: " << grid.T0v_loc[I2V(iip-1,jjt,kkr)]*grid.tau_loc[I2V(iip-1, jjt, kkr)] << ", " + << std::endl; + break; + case 1: //characteristic travels from -p, -t, +r + std::cout << "+r: " << grid.T0v_loc[I2V(iip,jjt,kkr+1)]*grid.tau_loc[I2V(iip, jjt, kkr+1)] << ", " + << "-t: " << grid.T0v_loc[I2V(iip,jjt-1,kkr)]*grid.tau_loc[I2V(iip, jjt-1, kkr)] << ", " + << "-p: " << grid.T0v_loc[I2V(iip-1,jjt,kkr)]*grid.tau_loc[I2V(iip-1, jjt, kkr)] << ", " + << std::endl; + break; + case 2: //characteristic travels from -p, +t, -r + std::cout << "-r: " << grid.T0v_loc[I2V(iip,jjt,kkr-1)]*grid.tau_loc[I2V(iip, jjt, kkr-1)] << ", " + << "+t: " << grid.T0v_loc[I2V(iip,jjt+1,kkr)]*grid.tau_loc[I2V(iip, jjt+1, kkr)] << ", " + << "-p: " << grid.T0v_loc[I2V(iip-1,jjt,kkr)]*grid.tau_loc[I2V(iip-1, jjt, kkr)] << ", " + << std::endl; + break; + case 3: //characteristic travels from -p, +t, +r + std::cout << "+r: " << grid.T0v_loc[I2V(iip,jjt,kkr+1)]*grid.tau_loc[I2V(iip, jjt, kkr+1)] << ", " + << "+t: " << grid.T0v_loc[I2V(iip,jjt+1,kkr)]*grid.tau_loc[I2V(iip, jjt+1, kkr)] << ", " + << "-p: " << grid.T0v_loc[I2V(iip-1,jjt,kkr)]*grid.tau_loc[I2V(iip-1, jjt, kkr)] << ", " + << std::endl; + break; + case 4: //characteristic travels from +p, -t, -r + std::cout << "-r: " << grid.T0v_loc[I2V(iip,jjt,kkr-1)]*grid.tau_loc[I2V(iip, jjt, kkr-1)] << ", " + << "-t: " << grid.T0v_loc[I2V(iip,jjt-1,kkr)]*grid.tau_loc[I2V(iip, jjt-1, kkr)] << ", " + << "+p: " << grid.T0v_loc[I2V(iip+1,jjt,kkr)]*grid.tau_loc[I2V(iip+1, jjt, kkr)] << ", " + << std::endl; + break; + case 5: //characteristic travels from +p, -t, +r + std::cout << "+r: " << grid.T0v_loc[I2V(iip,jjt,kkr+1)]*grid.tau_loc[I2V(iip, jjt, kkr+1)] << ", " + << "-t: " << grid.T0v_loc[I2V(iip,jjt-1,kkr)]*grid.tau_loc[I2V(iip, jjt-1, kkr)] << ", " + << "+p: " << grid.T0v_loc[I2V(iip+1,jjt,kkr)]*grid.tau_loc[I2V(iip+1, jjt, kkr)] << ", " + << std::endl; + break; + case 6: //characteristic travels from +p, +t, -r + std::cout << "-r: " << grid.T0v_loc[I2V(iip,jjt,kkr-1)]*grid.tau_loc[I2V(iip, jjt, kkr-1)] << ", " + << "+t: " << grid.T0v_loc[I2V(iip,jjt+1,kkr)]*grid.tau_loc[I2V(iip, jjt+1, kkr)] << ", " + << "+p: " << grid.T0v_loc[I2V(iip+1,jjt,kkr)]*grid.tau_loc[I2V(iip+1, jjt, kkr)] << ", " + << std::endl; + break; + case 7: //characteristic travels from +p, +t, +r + std::cout << "+r: " << grid.T0v_loc[I2V(iip,jjt,kkr+1)]*grid.tau_loc[I2V(iip, jjt, kkr+1)] << ", " + << "+t: " << grid.T0v_loc[I2V(iip,jjt+1,kkr)]*grid.tau_loc[I2V(iip, jjt+1, kkr)] << ", " + << "+p: " << grid.T0v_loc[I2V(iip+1,jjt,kkr)]*grid.tau_loc[I2V(iip+1, jjt, kkr)] << ", " + << std::endl; + break; + } + + } + + + } + + } + } + + + // second catalog: characteristic travels through triangles in 2D volume (12 cases) + // case: 1-4 + // characteristic on r-t plane, force H_p3 = H_(T_p) = 0, that is, c*T_p-f*T_t = 0 + // plug the constraint into eikonal equation, we have the equation: a*T_r^2 + (bc-f^2)/c*T_t^2 = s^2 + for (int i_case = 0; i_case < 4; i_case++){ + switch (i_case){ + case 0: //characteristic travels from -t, -r + if (jjt == 0 || kkr == 0){ + continue; + } + at = at1; bt = bt1; + ar = ar1; br = br1; + break; + case 1: //characteristic travels from -t, +r + if (jjt == 0 || kkr == nr-1){ + continue; + } + at = at1; bt = bt1; + ar = ar2; br = br2; + break; + case 2: //characteristic travels from +t, -r + if (jjt == nt-1 || kkr == 0){ + continue; + } + at = at2; bt = bt2; + ar = ar1; br = br1; + break; + case 3: //characteristic travels from +t, +r + if (jjt == nt-1 || kkr == nr-1){ + continue; + } + at = at2; bt = bt2; + ar = ar2; br = br2; + break; + } + + // plug T_t, T_r into eikonal equation, solve the quadratic equation: a*(ar*tau+br)^2 + (bc-f^2)/c*(at*tau+bt)^2 = s^2 + eqn_a = grid.fac_a_loc[ii] * std::pow(ar, _2_CR) + bc_f2/grid.fac_c_loc[ii] * std::pow(at, _2_CR); + eqn_b = _2_CR*grid.fac_a_loc[ii] * ar * br + _2_CR*bc_f2/grid.fac_c_loc[ii] * at * bt; + eqn_c = grid.fac_a_loc[ii] * std::pow(br, _2_CR) + bc_f2/grid.fac_c_loc[ii] * std::pow(bt, _2_CR) + - std::pow(grid.fun_loc[ii], _2_CR); + eqn_Delta = std::pow(eqn_b, _2_CR) - _4_CR * eqn_a * eqn_c; + + if (eqn_Delta >= 0){ // one or two real solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_tau = (-eqn_b + std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + case 1: + tmp_tau = (-eqn_b - std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + } + + // check the causality condition: + T_r = ar*tmp_tau + br; + T_t = at*tmp_tau + bt; + + charact_r = grid.fac_a_loc[ii]*T_r; + charact_t = bc_f2/grid.fac_c_loc[ii]*T_t; + + is_causality = false; + switch (i_case){ + case 0: //characteristic travels from -t, -r + if (charact_t >= 0 && charact_r >= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 1: //characteristic travels from -t, +r + if (charact_t >= 0 && charact_r <= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 2: //characteristic travels from +t, -r + if (charact_t <= 0 && charact_r >= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 3: //characteristic travels from +t, +r + if (charact_t <= 0 && charact_r <= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_tau; + count_cand += 1; + } + + if (check_out && iip == iip_out && jjt == jjt_out && kkr == kkr_out){ + std::cout << "surface case, i_case, i_solution, is_causality, tau, T0, tau*t0: " + << i_case << ", " << i_solution << ", " << is_causality << ", " << tmp_tau << ", " + << grid.T0v_loc[I2V(iip,jjt,kkr)] << ", " << grid.T0v_loc[I2V(iip,jjt,kkr)]*tmp_tau + << ", " << std::endl; + switch (i_case) { + case 0: //characteristic travels from -t, -r + std::cout << "-r: " << grid.T0v_loc[I2V(iip,jjt,kkr-1)]*grid.tau_loc[I2V(iip, jjt, kkr-1)] << ", " + << "-t: " << grid.T0v_loc[I2V(iip,jjt-1,kkr)]*grid.tau_loc[I2V(iip, jjt-1, kkr)] << ", " + << std::endl; + break; + case 1: //characteristic travels from -t, +r + std::cout << "+r: " << grid.T0v_loc[I2V(iip,jjt,kkr+1)]*grid.tau_loc[I2V(iip, jjt, kkr+1)] << ", " + << "-t: " << grid.T0v_loc[I2V(iip,jjt-1,kkr)]*grid.tau_loc[I2V(iip, jjt-1, kkr)] << ", " + << std::endl; + break; + case 2: //characteristic travels from +t, -r + std::cout << "-r: " << grid.T0v_loc[I2V(iip,jjt,kkr-1)]*grid.tau_loc[I2V(iip, jjt, kkr-1)] << ", " + << "+t: " << grid.T0v_loc[I2V(iip,jjt+1,kkr)]*grid.tau_loc[I2V(iip, jjt+1, kkr)] << ", " + << std::endl; + break; + case 3: //characteristic travels from +t, +r + std::cout << "+r: " << grid.T0v_loc[I2V(iip,jjt,kkr+1)]*grid.tau_loc[I2V(iip, jjt, kkr+1)] << ", " + << "+t: " << grid.T0v_loc[I2V(iip,jjt+1,kkr)]*grid.tau_loc[I2V(iip, jjt+1, kkr)] << ", " + << std::endl; + break; + } + } + + } + } + + } + + // case: 5-8 + // characteristic on r-p plane, force H_p2 = H_(T_t) = 0, that is, b*T_t-f*T_p = 0 + // plug the constraint into eikonal equation, we have the equation: a*T_r^2 + (bc-f^2)/b*T_p^2 = s^2 + for (int i_case = 4; i_case < 8; i_case++){ + switch (i_case){ + case 4: //characteristic travels from -p, -r + if (iip == 0 || kkr == 0){ + continue; + } + ap = ap1; bp = bp1; + ar = ar1; br = br1; + break; + case 5: //characteristic travels from -p, +r + if (iip == 0 || kkr == nr-1){ + continue; + } + ap = ap1; bp = bp1; + ar = ar2; br = br2; + break; + case 6: //characteristic travels from +p, -r + if (iip == np-1 || kkr == 0){ + continue; + } + ap = ap2; bp = bp2; + ar = ar1; br = br1; + break; + case 7: //characteristic travels from +p, +r + if (iip == np-1 || kkr == nr-1){ + continue; + } + ap = ap2; bp = bp2; + ar = ar2; br = br2; + break; + } + + // plug T_p, T_r into eikonal equation, solve the quadratic equation: a*(ar*tau+br)^2 + (bc-f^2)/b*(ap*tau+bp)^2 = s^2 + eqn_a = grid.fac_a_loc[ii] * std::pow(ar, _2_CR) + bc_f2/grid.fac_b_loc[ii] * std::pow(ap, _2_CR); + eqn_b = _2_CR*grid.fac_a_loc[ii] * ar * br + _2_CR*bc_f2/grid.fac_b_loc[ii] * ap * bp; + eqn_c = grid.fac_a_loc[ii] * std::pow(br, _2_CR) + bc_f2/grid.fac_b_loc[ii] * std::pow(bp, _2_CR) + - std::pow(grid.fun_loc[ii], _2_CR); + eqn_Delta = std::pow(eqn_b, _2_CR) - _4_CR * eqn_a * eqn_c; + + if (eqn_Delta >= 0){ // one or two real solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_tau = (-eqn_b + std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + case 1: + tmp_tau = (-eqn_b - std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + } + + // check the causality condition: + T_r = ar*tmp_tau + br; + T_p = ap*tmp_tau + bp; + + charact_r = grid.fac_a_loc[ii]*T_r; + charact_p = bc_f2/grid.fac_b_loc[ii]*T_p; + + is_causality = false; + switch (i_case){ + case 4: //characteristic travels from -p, -r + if (charact_p >= 0 && charact_r >= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 5: //characteristic travels from -p, +r + if (charact_p >= 0 && charact_r <= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 6: //characteristic travels from +p, -r + if (charact_p <= 0 && charact_r >= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 7: //characteristic travels from +p, +r + if (charact_p <= 0 && charact_r <= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_tau; + count_cand += 1; + } + + if (check_out && iip == iip_out && jjt == jjt_out && kkr == kkr_out){ + std::cout << "surface, case, i_case, i_solution, is_causality, tau, T0, tau*t0: " + << i_case << ", " << i_solution << ", " << is_causality << ", " << tmp_tau << ", " + << grid.T0v_loc[I2V(iip,jjt,kkr)] << ", " << grid.T0v_loc[I2V(iip,jjt,kkr)]*tmp_tau + << ", " << std::endl; + switch (i_case) { + case 4: // characteristic travels from -p, -r + std::cout << "-r: " << grid.T0v_loc[I2V(iip,jjt,kkr-1)]*grid.tau_loc[I2V(iip, jjt, kkr-1)] << ", " + << "-p: " << grid.T0v_loc[I2V(iip-1,jjt,kkr)]*grid.tau_loc[I2V(iip-1, jjt, kkr)] << ", " + << std::endl; + break; + case 5: // characteristic travels from -p, +r + std::cout << "+r: " << grid.T0v_loc[I2V(iip,jjt,kkr+1)]*grid.tau_loc[I2V(iip, jjt, kkr+1)] << ", " + << "-p: " << grid.T0v_loc[I2V(iip-1,jjt,kkr)]*grid.tau_loc[I2V(iip-1, jjt, kkr)] << ", " + << std::endl; + break; + case 6: // characteristic travels from +p, -r + std::cout << "-r: " << grid.T0v_loc[I2V(iip,jjt,kkr-1)]*grid.tau_loc[I2V(iip, jjt, kkr-1)] << ", " + << "+p: " << grid.T0v_loc[I2V(iip+1,jjt,kkr)]*grid.tau_loc[I2V(iip+1, jjt, kkr)] << ", " + << std::endl; + break; + case 7: // characteristic travels from +p, +r + std::cout << "+r: " << grid.T0v_loc[I2V(iip,jjt,kkr+1)]*grid.tau_loc[I2V(iip, jjt, kkr+1)] << ", " + << "+p: " << grid.T0v_loc[I2V(iip+1,jjt,kkr)]*grid.tau_loc[I2V(iip+1, jjt, kkr)] << ", " + << std::endl; + break; + } + } + + } + } + } + + // case: 9-12 + // characteristic on t-p plane, force H_p1 = H_(T_t) = 0, that is, T_r = 0 + // plug the constraint into eikonal equation, we have the equation: b*T_t^2 + c*T_p^2 - 2f*T_t*T_p = s^2 + for (int i_case = 8; i_case < 12; i_case++){ + switch (i_case){ + case 8: //characteristic travels from -p, -t + if (iip == 0 || jjt == 0){ + continue; + } + ap = ap1; bp = bp1; + at = at1; bt = bt1; + break; + case 9: //characteristic travels from -p, +t + if (iip == 0 || jjt == nt-1){ + continue; + } + ap = ap1; bp = bp1; + at = at2; bt = bt2; + break; + case 10: //characteristic travels from +p, -t + if (iip == np-1 || jjt == 0){ + continue; + } + ap = ap2; bp = bp2; + at = at1; bt = bt1; + break; + case 11: //characteristic travels from +p, +t + if (iip == np-1 || jjt == nt-1){ + continue; + } + ap = ap2; bp = bp2; + at = at2; bt = bt2; + break; + } + + // plug T_p, T_t into eikonal equation, solve the quadratic equation: b*(at*tau+bt)^2 + c*(ap*tau+bp)^2 - 2f*(at*tau+bt)*(ap*tau+bp) = s^2 + eqn_a = grid.fac_b_loc[ii] * std::pow(at, _2_CR) + + grid.fac_c_loc[ii] * std::pow(ap, _2_CR) - _2_CR*grid.fac_f_loc[ii] * at * ap; + eqn_b = _2_CR*grid.fac_b_loc[ii] * at * bt + + _2_CR*grid.fac_c_loc[ii] * ap * bp - _2_CR*grid.fac_f_loc[ii] * (at*bp + bt*ap); + eqn_c = grid.fac_b_loc[ii] * std::pow(bt, _2_CR) + + grid.fac_c_loc[ii] * std::pow(bp, _2_CR) - _2_CR*grid.fac_f_loc[ii] * bt * bp + - std::pow(grid.fun_loc[ii], _2_CR); + eqn_Delta = std::pow(eqn_b, _2_CR) - _4_CR * eqn_a * eqn_c; + + if (eqn_Delta >= 0){ // one or two real solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_tau = (-eqn_b + std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + case 1: + tmp_tau = (-eqn_b - std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + } + + // check the causality condition: + T_t = at*tmp_tau + bt; + T_p = ap*tmp_tau + bp; + + charact_t = grid.fac_b_loc[ii]*T_t - grid.fac_f_loc[ii]*T_p; + charact_p = grid.fac_c_loc[ii]*T_p - grid.fac_f_loc[ii]*T_t; + + is_causality = false; + switch (i_case){ + case 8: //characteristic travels from -p, -t + if (charact_p >= 0 && charact_t >= 0 && tmp_tau > 0){ + + is_causality = true; + } + break; + case 9: //characteristic travels from -p, +t + if (charact_p >= 0 && charact_t <= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 10: //characteristic travels from +p, -t + if (charact_p <= 0 && charact_t >= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 11: //characteristic travels from +p, +t + if (charact_p <= 0 && charact_t <= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_tau; + count_cand += 1; + } + + if (check_out && iip == iip_out && jjt == jjt_out && kkr == kkr_out){ + std::cout << "surface case, i_case, i_solution, is_causality, tau, T0, tau*t0: " + << i_case << ", " << i_solution << ", " << is_causality << ", " << tmp_tau << ", " + << grid.T0v_loc[I2V(iip,jjt,kkr)] << ", " << grid.T0v_loc[I2V(iip,jjt,kkr)]*tmp_tau + << ", " << std::endl; + switch (i_case) { + case 8: // characteristic travels from -p, -t + std::cout << "-t: " << grid.T0v_loc[I2V(iip,jjt-1,kkr)]*grid.tau_loc[I2V(iip, jjt-1, kkr)] << ", " + << "-p: " << grid.T0v_loc[I2V(iip-1,jjt,kkr)]*grid.tau_loc[I2V(iip-1, jjt, kkr)] << ", " + << std::endl; + break; + case 9: // characteristic travels from -p, +t + std::cout << "+t: " << grid.T0v_loc[I2V(iip,jjt+1,kkr)]*grid.tau_loc[I2V(iip, jjt+1, kkr)] << ", " + << "-p: " << grid.T0v_loc[I2V(iip-1,jjt,kkr)]*grid.tau_loc[I2V(iip-1, jjt, kkr)] << ", " + << std::endl; + break; + case 10: // characteristic travels from +p, -t + std::cout << "-t: " << grid.T0v_loc[I2V(iip,jjt-1,kkr)]*grid.tau_loc[I2V(iip, jjt-1, kkr)] << ", " + << "+p: " << grid.T0v_loc[I2V(iip+1,jjt,kkr)]*grid.tau_loc[I2V(iip+1, jjt, kkr)] << ", " + << std::endl; + break; + case 11: // characteristic travels from +p, +t + std::cout << "+t: " << grid.T0v_loc[I2V(iip,jjt+1,kkr)]*grid.tau_loc[I2V(iip, jjt+1, kkr)] << ", " + << "+p: " << grid.T0v_loc[I2V(iip+1,jjt,kkr)]*grid.tau_loc[I2V(iip+1, jjt, kkr)] << ", " + << "T_t: " << T_t << ", T_p: " << T_p << ", " + << std::endl; + // // T_t = (T0v * tau)_t = + // std::cout << " check T_t. " << std::endl; + // std::cout << "T_+ = T0v_loc[I2V(iip,jjt+1,kkr)] * tau_loc[I2V(iip,jjt+1,kkr)]:" << grid.T0v_loc[I2V(iip,jjt+1,kkr)]*grid.tau_loc[I2V(iip, jjt+1, kkr)] << std::endl; + // std::cout << "T = T0v_loc[I2V(iip,jjt,kkr)] * tmp_tau :" << grid.T0v_loc[I2V(iip,jjt,kkr)]*tmp_tau << std::endl; + // std::cout << "T_t_1 = (T_+ - T)/dt = " + // << (grid.T0v_loc[I2V(iip,jjt+1,kkr)]*grid.tau_loc[I2V(iip, jjt+1, kkr)] + // - grid.T0v_loc[I2V(iip,jjt,kkr)]*tmp_tau) / grid.dt << std::endl; + // std::cout << "T_t_2 = T0v * (tau_+ - tau)/dt + T0t * tau " << std::endl; + // std::cout << "T0v_+ : " << grid.T0v_loc[I2V(iip,jjt+1,kkr)] << std::endl; + // std::cout << "T0v : " << grid.T0v_loc[I2V(iip ,jjt,kkr)] << std::endl; + // std::cout << "tau_+ : " << grid.tau_loc[I2V(iip, jjt+1, kkr)] << std::endl; + // std::cout << "tau : " << tmp_tau << std::endl; + // std::cout << "T0t : " << grid.T0t_loc[I2V(iip,jjt,kkr)] << std::endl; + // std::cout << "T_t_2 = " + // << grid.T0v_loc[I2V(iip,jjt,kkr)] * (grid.tau_loc[I2V(iip, jjt+1, kkr)] - tmp_tau) / grid.dt + // + grid.T0t_loc[I2V(iip,jjt,kkr)] * tmp_tau << std::endl; + // break; + } + } + + } + } + } + + + // third catalog: characteristic travels through lines in 1D volume (6 cases) + // case: 1-2 + // characteristic travels along r-axis, force H_p2, H_p3 = 0, that is, T_p = T_t = 0 + // plug the constraint into eikonal equation, we have the equation: a*T_r^2 = s^2 + for (int i_case = 0; i_case < 2; i_case++){ + switch (i_case){ + case 0: //characteristic travels from -r + if (kkr == 0){ + continue; + } + ar = ar1; br = br1; + break; + case 1: //characteristic travels from +r + if (kkr == nr-1){ + continue; + } + ar = ar2; br = br2; + break; + } + + // plug T_t, T_r into eikonal equation, solve the quadratic equation: a*(ar*tau+br)^2 = s^2 + // simply, we have two solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_tau = ( std::sqrt(std::pow(grid.fun_loc[ii], _2_CR)/grid.fac_a_loc[ii]) - br)/ar; + break; + case 1: + tmp_tau = (-std::sqrt(std::pow(grid.fun_loc[ii], _2_CR)/grid.fac_a_loc[ii]) - br)/ar; + break; + } + + // check the causality condition: + + is_causality = false; + switch (i_case){ + case 0: //characteristic travels from -r (we can simply compare the traveltime, which is the same as check the direction of characteristic) + if (tmp_tau * grid.T0v_loc[ii] > grid.tau_loc[ii_mr] * grid.T0v_loc[ii_mr] + && tmp_tau > grid.tau_loc[ii_mr]/_2_CR && tmp_tau > 0){ // this additional condition ensures the causality near the source + is_causality = true; + } + break; + case 1: //characteristic travels from +r + if (tmp_tau * grid.T0v_loc[ii] > grid.tau_loc[ii_pr] * grid.T0v_loc[ii_pr] + && tmp_tau > grid.tau_loc[ii_pr]/_2_CR && tmp_tau > 0){ + is_causality = true; + } + break; + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_tau; + count_cand += 1; + } + + if (check_out && iip == iip_out && jjt == jjt_out && kkr == kkr_out){ + std::cout << "line case, i_case, i_solution, is_causality, tau, T0, tau*t0: " + << i_case << ", " << i_solution << ", " << is_causality << ", " << tmp_tau << ", " + << grid.T0v_loc[I2V(iip,jjt,kkr)] << ", " << grid.T0v_loc[I2V(iip,jjt,kkr)]*tmp_tau + << ", " << std::endl; + switch (i_case) { + case 0: //characteristic travels from -r + std::cout << "-r: " << grid.T0v_loc[I2V(iip,jjt,kkr-1)]*grid.tau_loc[I2V(iip, jjt, kkr-1)] << ", " << std::endl; + break; + case 1: //characteristic travels from +r + std::cout << "+r: " << grid.T0v_loc[I2V(iip,jjt,kkr+1)]*grid.tau_loc[I2V(iip, jjt, kkr+1)] << ", " << std::endl; + break; + } + } + + } + + } + + // case: 3-4 + // characteristic travels along t-axis, force H_p1, H_p3 = 0, that is, T_r = 0; c*T_p-f*T_t = 0 + // plug the constraint into eikonal equation, we have the equation: (bc-f^2)/c*T_t^2 = s^2 + for (int i_case = 2; i_case < 4; i_case++){ + switch (i_case){ + case 2: //characteristic travels from -t + if (jjt == 0){ + continue; + } + at = at1; bt = bt1; + break; + case 3: //characteristic travels from +t + if (jjt == nt-1){ + continue; + } + at = at2; bt = bt2; + break; + } + + // plug T_p, T_r into eikonal equation, solve the quadratic equation: (bc-f^2)/c*(at*tau+bt)^2 = s^2 + // simply, we have two solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_tau = ( std::sqrt(std::pow(grid.fun_loc[ii], _2_CR)*grid.fac_c_loc[ii]/bc_f2) - bt)/at; + break; + case 1: + tmp_tau = (-std::sqrt(std::pow(grid.fun_loc[ii], _2_CR)*grid.fac_c_loc[ii]/bc_f2) - bt)/at; + break; + } + + // check the causality condition: + + is_causality = false; + switch (i_case){ + case 2: //characteristic travels from -t (we can simply compare the traveltime, which is the same as check the direction of characteristic) + if (tmp_tau * grid.T0v_loc[ii] > grid.tau_loc[ii_mt] * grid.T0v_loc[ii_mt] + && tmp_tau > grid.tau_loc[ii_mt]/_2_CR && tmp_tau > 0){ // this additional condition ensures the causality near the source + is_causality = true; + } + break; + case 3: //characteristic travels from +t + if (tmp_tau * grid.T0v_loc[ii] > grid.tau_loc[ii_pt] * grid.T0v_loc[ii_pt] + && tmp_tau > grid.tau_loc[ii_pt]/_2_CR && tmp_tau > 0){ + is_causality = true; + } + break; + + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_tau; + count_cand += 1; + } + + if (check_out && iip == iip_out && jjt == jjt_out && kkr == kkr_out){ + std::cout << "line case, i_case, i_solution, is_causality, tau, T0, tau*t0: " + << i_case << ", " << i_solution << ", " << is_causality << ", " << tmp_tau << ", " + << grid.T0v_loc[I2V(iip,jjt,kkr)] << ", " << grid.T0v_loc[I2V(iip,jjt,kkr)]*tmp_tau + << ", " << std::endl; + switch (i_case) { + case 2: //characteristic travels from -t + std::cout << "-t: " << grid.T0v_loc[I2V(iip,jjt-1,kkr)]*grid.tau_loc[I2V(iip, jjt-1, kkr)] << ", " << std::endl; + break; + case 3: //characteristic travels from +t + std::cout << "+t: " << grid.T0v_loc[I2V(iip,jjt+1,kkr)]*grid.tau_loc[I2V(iip, jjt+1, kkr)] << ", " << std::endl; + break; + } + } + + } + } + + // case: 5-6 + // characteristic travels along p-axis, force H_p1, H_p2 = 0, that is, T_r = 0; b*T_t-f*T_p = 0 + // plug the constraint into eikonal equation, we have the equation: (bc-f^2)/b*T_p^2 = s^2 + for (int i_case = 4; i_case < 6; i_case++){ + switch (i_case){ + case 4: //characteristic travels from -p + if (iip == 0){ + continue; + } + ap = ap1; bp = bp1; + break; + case 5: //characteristic travels from +p + if (iip == np-1){ + continue; + } + ap = ap2; bp = bp2; + break; + + } + + // plug T_t, T_r into eikonal equation, solve the quadratic equation: (bc-f^2)/b*(ap*tau+bp)^2 = s^2 + // simply, we have two solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_tau = ( std::sqrt(std::pow(grid.fun_loc[ii], _2_CR)*grid.fac_b_loc[ii]/bc_f2) - bp)/ap; + break; + case 1: + tmp_tau = (-std::sqrt(std::pow(grid.fun_loc[ii], _2_CR)*grid.fac_b_loc[ii]/bc_f2) - bp)/ap; + break; + } + + // check the causality condition: + + is_causality = false; + switch (i_case){ + case 4: //characteristic travels from -p (we can simply compare the traveltime, which is the same as check the direction of characteristic) + if (tmp_tau * grid.T0v_loc[ii] > grid.tau_loc[ii_mp] * grid.T0v_loc[ii_mp] + && tmp_tau > grid.tau_loc[ii_mp]/_2_CR && tmp_tau > 0){ // this additional condition ensures the causality near the source + is_causality = true; + } + break; + case 5: //characteristic travels from +p + if (tmp_tau * grid.T0v_loc[ii] > grid.tau_loc[ii_pp] * grid.T0v_loc[ii_pp] + && tmp_tau > grid.tau_loc[ii_pp]/_2_CR && tmp_tau > 0){ + is_causality = true; + } + break; + + } + + if (check_out && iip == iip_out && jjt == jjt_out && kkr == kkr_out){ + std::cout << "line case, i_case, i_solution, is_causality, tau, T0, tau*t0: " + << i_case << ", " << i_solution << ", " << is_causality << ", " << tmp_tau << ", " + << grid.T0v_loc[I2V(iip,jjt,kkr)] << ", " << grid.T0v_loc[I2V(iip,jjt,kkr)]*tmp_tau + << ", " << std::endl; + switch (i_case) { + case 4: //characteristic travels from -p + std::cout << "-p: " << grid.T0v_loc[I2V(iip-1,jjt,kkr)]*grid.tau_loc[I2V(iip-1, jjt, kkr)] << ", " << std::endl; + + // T_p = (T0v * tau)_p = + std::cout << " check T_p. " << std::endl; + std::cout << "T_- = T0v_loc[I2V(iip-1,jjt,kkr)] * tau_loc[I2V(iip-1,jjt,kkr)]:" << grid.T0v_loc[I2V(iip-1,jjt,kkr)]*grid.tau_loc[I2V(iip-1, jjt, kkr)] << std::endl; + std::cout << "T = T0v_loc[I2V(iip,jjt,kkr)] * tmp_tau :" << grid.T0v_loc[I2V(iip,jjt,kkr)]*tmp_tau << std::endl; + std::cout << "T_p_1 = (T - T_-)/dp = " + << (grid.T0v_loc[I2V(iip,jjt,kkr)]*tmp_tau + - grid.T0v_loc[I2V(iip-1,jjt,kkr)]*grid.tau_loc[I2V(iip-1, jjt, kkr)]) / grid.dp << std::endl; + std::cout << "T_p_2 = T0v * (tau - tau_-)/dt + T0t * tau " << std::endl; + std::cout << "T0v : " << grid.T0v_loc[I2V(iip,jjt,kkr)] << std::endl; + std::cout << "T0v_- : " << grid.T0v_loc[I2V(iip-1,jjt,kkr)] << std::endl; + std::cout << "grid.dp: " << grid.dp << std::endl; + std::cout << "tau : " << tmp_tau << std::endl; + std::cout << "tau_- : " << grid.tau_loc[I2V(iip-1, jjt, kkr)] << std::endl; + std::cout << "T0p : " << grid.T0p_loc[I2V(iip,jjt,kkr)] << std::endl; + std::cout << "T_p_2 = " + << grid.T0v_loc[I2V(iip,jjt,kkr)] * (tmp_tau - grid.tau_loc[I2V(iip-1, jjt, kkr)]) / grid.dp + + grid.T0t_loc[I2V(iip,jjt,kkr)] * tmp_tau << std::endl; + break; + + + break; + case 5: //characteristic travels from +p + std::cout << "+p: " << grid.T0v_loc[I2V(iip+1,jjt,kkr)]*grid.tau_loc[I2V(iip+1, jjt, kkr)] << ", " << std::endl; + break; + } + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_tau; + count_cand += 1; + } + } + } + + // final, choose the minimum candidate solution as the updated value + for (int i_cand = 0; i_cand < count_cand; i_cand++){ + grid.tau_loc[I2V(iip, jjt, kkr)] = std::min(grid.tau_loc[I2V(iip, jjt, kkr)], canditate[i_cand]); + + if (check_out && iip == iip_out && jjt == jjt_out && kkr == kkr_out){ + std::cout << "tau_loc: " << grid.tau_loc[I2V(iip, jjt, kkr)] << ", i_cand: " << i_cand << ", cand: " << canditate[i_cand] << std::endl; + } + + if (grid.tau_loc[I2V(iip, jjt, kkr)] < 0 ){ + std::cout << "error, tau_loc < 0. iip: " << iip << ", jjt: " << jjt << ", kkr: " << kkr << std::endl; + exit(1); + } + + } + + + + if (check_out && iip == iip_out && jjt == jjt_out && kkr == kkr_out){ + std::cout << "tau_loc: " << grid.tau_loc[I2V(iip, jjt, kkr)] + << ", T_loc: " << grid.T0v_loc[I2V(iip,jjt,kkr)] * grid.tau_loc[I2V(iip, jjt, kkr)] + << std::endl; + } +} + +void Iterator::calculate_stencil_1st_order(Grid& grid, int& iip, int& jjt, int&kkr){ + sigr = SWEEPING_COEFF*std::sqrt(grid.fac_a_loc[I2V(iip, jjt, kkr)])*grid.T0v_loc[I2V(iip, jjt, kkr)]; + sigt = SWEEPING_COEFF*std::sqrt(grid.fac_b_loc[I2V(iip, jjt, kkr)])*grid.T0v_loc[I2V(iip, jjt, kkr)]; + sigp = SWEEPING_COEFF*std::sqrt(grid.fac_c_loc[I2V(iip, jjt, kkr)])*grid.T0v_loc[I2V(iip, jjt, kkr)]; + coe = _1_CR/((sigr/dr)+(sigt/dt)+(sigp/dp)); + + pp1 = (grid.tau_loc[I2V(iip , jjt , kkr )] - grid.tau_loc[I2V(iip-1, jjt , kkr )])/dp; + pp2 = (grid.tau_loc[I2V(iip+1, jjt , kkr )] - grid.tau_loc[I2V(iip , jjt , kkr )])/dp; + + pt1 = (grid.tau_loc[I2V(iip , jjt , kkr )] - grid.tau_loc[I2V(iip , jjt-1, kkr )])/dt; + pt2 = (grid.tau_loc[I2V(iip , jjt+1, kkr )] - grid.tau_loc[I2V(iip , jjt , kkr )])/dt; + + pr1 = (grid.tau_loc[I2V(iip , jjt , kkr )] - grid.tau_loc[I2V(iip , jjt , kkr-1)])/dr; + pr2 = (grid.tau_loc[I2V(iip , jjt , kkr+1)] - grid.tau_loc[I2V(iip , jjt , kkr )])/dr; + + // LF Hamiltonian + Htau = calc_LF_Hamiltonian(grid, pp1, pp2, pt1, pt2, pr1, pr2, iip, jjt, kkr); + + grid.tau_loc[I2V(iip, jjt, kkr)] += coe*(grid.fun_loc[I2V(iip, jjt, kkr)] - Htau) \ + + coe*(sigr*(pr2-pr1)/_2_CR + sigt*(pt2-pt1)/_2_CR + sigp*(pp2-pp1)/_2_CR); + +} + + +void Iterator::calculate_stencil_3rd_order(Grid& grid, int& iip, int& jjt, int&kkr){ + sigr = SWEEPING_COEFF*std::sqrt(grid.fac_a_loc[I2V(iip, jjt, kkr)])*grid.T0v_loc[I2V(iip, jjt, kkr)]; + sigt = SWEEPING_COEFF*std::sqrt(grid.fac_b_loc[I2V(iip, jjt, kkr)])*grid.T0v_loc[I2V(iip, jjt, kkr)]; + sigp = SWEEPING_COEFF*std::sqrt(grid.fac_c_loc[I2V(iip, jjt, kkr)])*grid.T0v_loc[I2V(iip, jjt, kkr)]; + coe = _1_CR/((sigr/dr)+(sigt/dt)+(sigp/dp)); + + + // direction p + if (iip == 1) { + pp1 = (grid.tau_loc[I2V(iip,jjt,kkr)] \ + - grid.tau_loc[I2V(iip-1,jjt,kkr)]) / dp; + + wp2 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.tau_loc[I2V(iip, jjt,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip+1,jjt,kkr)] \ + + grid.tau_loc[I2V(iip+2,jjt,kkr)]) ) \ + + / (eps + my_square( grid.tau_loc[I2V(iip-1,jjt,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip, jjt,kkr)] \ + + grid.tau_loc[I2V(iip+1,jjt,kkr)]) )) ); + + pp2 = (_1_CR - wp2) * ( grid.tau_loc[I2V(iip+1,jjt,kkr)] \ + - grid.tau_loc[I2V(iip-1,jjt,kkr)]) / _2_CR / dp \ + + wp2 * ( - _3_CR * grid.tau_loc[I2V(iip,jjt,kkr)] \ + + _4_CR * grid.tau_loc[I2V(iip+1,jjt,kkr)] \ + - grid.tau_loc[I2V(iip+2,jjt,kkr)] ) / _2_CR / dp; + + } else if (iip == np-2) { + wp1 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.tau_loc[I2V(iip, jjt,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip-1,jjt,kkr)] \ + + grid.tau_loc[I2V(iip-2,jjt,kkr)]) ) \ + + / (eps + my_square( grid.tau_loc[I2V(iip+1,jjt,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip, jjt,kkr)] \ + + grid.tau_loc[I2V(iip-1,jjt,kkr)]) )) ); + + pp1 = (_1_CR - wp1) * ( grid.tau_loc[I2V(iip+1,jjt,kkr)] \ + - grid.tau_loc[I2V(iip-1,jjt,kkr)]) / _2_CR / dp \ + + wp1 * ( + _3_CR * grid.tau_loc[I2V(iip,jjt,kkr)] \ + - _4_CR * grid.tau_loc[I2V(iip-1,jjt,kkr)] \ + + grid.tau_loc[I2V(iip-2,jjt,kkr)] ) / _2_CR / dp; + + pp2 = (grid.tau_loc[I2V(iip+1,jjt,kkr)] - grid.tau_loc[I2V(iip,jjt,kkr)]) / dp; + + } else { + wp1 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.tau_loc[I2V(iip, jjt,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip-1,jjt,kkr)] \ + + grid.tau_loc[I2V(iip-2,jjt,kkr)]) ) \ + + / (eps + my_square( grid.tau_loc[I2V(iip+1,jjt,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip, jjt,kkr)] \ + + grid.tau_loc[I2V(iip-1,jjt,kkr)]) )) ); + + pp1 = (_1_CR - wp1) * ( grid.tau_loc[I2V(iip+1,jjt,kkr)] \ + - grid.tau_loc[I2V(iip-1,jjt,kkr)]) / _2_CR / dp \ + + wp1 * ( + _3_CR * grid.tau_loc[I2V(iip,jjt,kkr)] \ + - _4_CR * grid.tau_loc[I2V(iip-1,jjt,kkr)] \ + + grid.tau_loc[I2V(iip-2,jjt,kkr)] ) / _2_CR / dp; + + wp2 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.tau_loc[I2V(iip, jjt,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip+1,jjt,kkr)] \ + + grid.tau_loc[I2V(iip+2,jjt,kkr)]) ) \ + + / (eps + my_square( grid.tau_loc[I2V(iip-1,jjt,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip, jjt,kkr)] \ + + grid.tau_loc[I2V(iip+1,jjt,kkr)]) )) ); + + pp2 = (_1_CR - wp2) * ( grid.tau_loc[I2V(iip+1,jjt,kkr)] \ + - grid.tau_loc[I2V(iip-1,jjt,kkr)]) / _2_CR / dp \ + + wp2 * ( - _3_CR * grid.tau_loc[I2V(iip ,jjt,kkr)] \ + + _4_CR * grid.tau_loc[I2V(iip+1,jjt,kkr)] \ + - grid.tau_loc[I2V(iip+2,jjt,kkr)] ) / _2_CR / dp; + + } + + // direction t + if (jjt == 1) { + pt1 = (grid.tau_loc[I2V(iip,jjt ,kkr)] \ + - grid.tau_loc[I2V(iip,jjt-1,kkr)]) / dt; + + wt2 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.tau_loc[I2V(iip, jjt,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip,jjt+1,kkr)] \ + + grid.tau_loc[I2V(iip,jjt+2,kkr)]) ) \ + + / (eps + my_square( grid.tau_loc[I2V(iip,jjt-1,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip, jjt,kkr)] \ + + grid.tau_loc[I2V(iip,jjt+1,kkr)]) )) ); + + pt2 = (_1_CR - wt2) * ( grid.tau_loc[I2V(iip,jjt+1,kkr)] \ + - grid.tau_loc[I2V(iip,jjt-1,kkr)]) / _2_CR / dt \ + + wt2 * ( - _3_CR * grid.tau_loc[I2V(iip,jjt,kkr)] \ + + _4_CR * grid.tau_loc[I2V(iip,jjt+1,kkr)] \ + - grid.tau_loc[I2V(iip,jjt+2,kkr)] ) / _2_CR / dt; + + } else if (jjt == nt-2) { + wt1 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.tau_loc[I2V(iip, jjt,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip,jjt-1,kkr)] \ + + grid.tau_loc[I2V(iip,jjt-2,kkr)]) ) \ + + / (eps + my_square( grid.tau_loc[I2V(iip,jjt+1,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip, jjt,kkr)] \ + + grid.tau_loc[I2V(iip,jjt-1,kkr)]) )) ); + + pt1 = (_1_CR - wt1) * ( grid.tau_loc[I2V(iip,jjt+1,kkr)] \ + - grid.tau_loc[I2V(iip,jjt-1,kkr)]) / _2_CR / dt \ + + wt1 * ( + _3_CR * grid.tau_loc[I2V(iip,jjt,kkr)] \ + - _4_CR * grid.tau_loc[I2V(iip,jjt-1,kkr)] \ + + grid.tau_loc[I2V(iip,jjt-2,kkr)] ) / _2_CR / dt; + + pt2 = (grid.tau_loc[I2V(iip,jjt+1,kkr)] - grid.tau_loc[I2V(iip,jjt,kkr)]) / dt; + + } else { + wt1 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.tau_loc[I2V(iip, jjt,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip,jjt-1,kkr)] \ + + grid.tau_loc[I2V(iip,jjt-2,kkr)]) ) \ + + / (eps + my_square( grid.tau_loc[I2V(iip,jjt+1,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip, jjt,kkr)] \ + + grid.tau_loc[I2V(iip,jjt-1,kkr)]) )) ); + + pt1 = (_1_CR - wt1) * ( grid.tau_loc[I2V(iip,jjt+1,kkr)] \ + - grid.tau_loc[I2V(iip,jjt-1,kkr)]) / _2_CR / dt \ + + wt1 * ( + _3_CR * grid.tau_loc[I2V(iip,jjt,kkr)] \ + - _4_CR * grid.tau_loc[I2V(iip,jjt-1,kkr)] \ + + grid.tau_loc[I2V(iip,jjt-2,kkr)] ) / _2_CR / dt; + + wt2 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.tau_loc[I2V(iip, jjt,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip,jjt+1,kkr)] \ + + grid.tau_loc[I2V(iip,jjt+2,kkr)]) ) \ + + / (eps + my_square( grid.tau_loc[I2V(iip,jjt-1,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip, jjt,kkr)] \ + + grid.tau_loc[I2V(iip,jjt+1,kkr)]) )) ); + + pt2 = (_1_CR - wt2) * ( grid.tau_loc[I2V(iip,jjt+1,kkr)] \ + - grid.tau_loc[I2V(iip,jjt-1,kkr)]) / _2_CR / dt \ + + wt2 * ( - _3_CR * grid.tau_loc[I2V(iip,jjt,kkr)] \ + + _4_CR * grid.tau_loc[I2V(iip,jjt+1,kkr)] \ + - grid.tau_loc[I2V(iip,jjt+2,kkr)] ) / _2_CR / dt; + + } + + // direction r + if (kkr == 1) { + pr1 = (grid.tau_loc[I2V(iip,jjt,kkr )] \ + - grid.tau_loc[I2V(iip,jjt,kkr-1)]) / dr; + + wr2 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.tau_loc[I2V(iip,jjt,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip,jjt,kkr+1)] \ + + grid.tau_loc[I2V(iip,jjt,kkr+2)]) ) \ + + / (eps + my_square( grid.tau_loc[I2V(iip,jjt,kkr-1)] \ + -_2_CR*grid.tau_loc[I2V(iip, jjt,kkr)] \ + + grid.tau_loc[I2V(iip,jjt,kkr+1)]) )) ); + + pr2 = (_1_CR - wr2) * ( grid.tau_loc[I2V(iip,jjt,kkr+1)] \ + - grid.tau_loc[I2V(iip,jjt,kkr-1)]) / _2_CR / dr \ + + wr2 * ( - _3_CR * grid.tau_loc[I2V(iip,jjt,kkr)] \ + + _4_CR * grid.tau_loc[I2V(iip,jjt,kkr+1)] \ + - grid.tau_loc[I2V(iip,jjt,kkr+2)] ) / _2_CR / dr; + + } else if (kkr == nr - 2) { + wr1 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.tau_loc[I2V(iip,jjt,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip,jjt,kkr-1)] \ + + grid.tau_loc[I2V(iip,jjt,kkr-2)]) ) \ + + / (eps + my_square( grid.tau_loc[I2V(iip,jjt,kkr+1)] \ + -_2_CR*grid.tau_loc[I2V(iip,jjt,kkr)] \ + + grid.tau_loc[I2V(iip,jjt,kkr-1)]) )) ); + + pr1 = (_1_CR - wr1) * ( grid.tau_loc[I2V(iip,jjt,kkr+1)] \ + - grid.tau_loc[I2V(iip,jjt,kkr-1)]) / _2_CR / dr \ + + wr1 * ( + _3_CR * grid.tau_loc[I2V(iip,jjt,kkr)] \ + - _4_CR * grid.tau_loc[I2V(iip,jjt,kkr-1)] \ + + grid.tau_loc[I2V(iip,jjt,kkr-2)] ) / _2_CR / dr; + + pr2 = (grid.tau_loc[I2V(iip,jjt,kkr+1)] - grid.tau_loc[I2V(iip,jjt,kkr)]) / dr; + + } else { + wr1 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.tau_loc[I2V(iip,jjt,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip,jjt,kkr-1)] \ + + grid.tau_loc[I2V(iip,jjt,kkr-2)]) ) \ + + / (eps + my_square( grid.tau_loc[I2V(iip,jjt,kkr+1)] \ + -_2_CR*grid.tau_loc[I2V(iip,jjt,kkr)] \ + + grid.tau_loc[I2V(iip,jjt,kkr-1)]) )) ); + + pr1 = (_1_CR - wr1) * ( grid.tau_loc[I2V(iip,jjt,kkr+1)] \ + - grid.tau_loc[I2V(iip,jjt,kkr-1)]) / _2_CR / dr \ + + wr1 * ( + _3_CR * grid.tau_loc[I2V(iip,jjt,kkr)] \ + - _4_CR * grid.tau_loc[I2V(iip,jjt,kkr-1)] \ + + grid.tau_loc[I2V(iip,jjt,kkr-2)] ) / _2_CR / dr; + + wr2 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.tau_loc[I2V(iip,jjt,kkr)] \ + -_2_CR*grid.tau_loc[I2V(iip,jjt,kkr+1)] \ + + grid.tau_loc[I2V(iip,jjt,kkr+2)]) ) \ + + / (eps + my_square( grid.tau_loc[I2V(iip,jjt,kkr-1)] \ + -_2_CR*grid.tau_loc[I2V(iip, jjt,kkr)] \ + + grid.tau_loc[I2V(iip,jjt,kkr+1)]) )) ); + + pr2 = (_1_CR - wr2) * ( grid.tau_loc[I2V(iip,jjt,kkr+1)] \ + - grid.tau_loc[I2V(iip,jjt,kkr-1)]) / _2_CR / dr \ + + wr2 * ( - _3_CR * grid.tau_loc[I2V(iip,jjt,kkr)] \ + + _4_CR * grid.tau_loc[I2V(iip,jjt,kkr+1)] \ + - grid.tau_loc[I2V(iip,jjt,kkr+2)] ) / _2_CR / dr; + + } + + // LF Hamiltonian + Htau = calc_LF_Hamiltonian(grid, pp1, pp2, pt1, pt2, pr1, pr2, iip, jjt, kkr); + + // update tau + grid.tau_loc[I2V(iip,jjt,kkr)] += coe * ((grid.fun_loc[I2V(iip,jjt,kkr)] - Htau) + (sigr*(pr2-pr1) + sigt*(pt2-pt1) + sigp*(pp2-pp1))/_2_CR); + +} + + +void Iterator::calculate_stencil_adj(Grid& grid, int& iip, int& jjt, int& kkr){ + //CUSTOMREAL tmpr1 = (grid.r_loc_1d[kkr-1]+grid.r_loc_1d[kkr])/_2_CR; + //CUSTOMREAL tmpr2 = (grid.r_loc_1d[kkr+1]+grid.r_loc_1d[kkr])/_2_CR; + CUSTOMREAL tmpt1 = (grid.t_loc_1d[jjt-1]+grid.t_loc_1d[jjt])/_2_CR; + CUSTOMREAL tmpt2 = (grid.t_loc_1d[jjt] +grid.t_loc_1d[jjt+1])/_2_CR; + + CUSTOMREAL a1 = - (_1_CR+grid.zeta_loc[I2V(iip,jjt,kkr-1)]+grid.zeta_loc[I2V(iip,jjt,kkr)]) * (grid.T_loc[I2V(iip,jjt,kkr)]-grid.T_loc[I2V(iip,jjt,kkr-1)]) / dr; + CUSTOMREAL a1m = (a1 - std::abs(a1))/_2_CR; + CUSTOMREAL a1p = (a1 + std::abs(a1))/_2_CR; + + CUSTOMREAL a2 = - (_1_CR+grid.zeta_loc[I2V(iip,jjt,kkr)]+grid.zeta_loc[I2V(iip,jjt,kkr+1)]) * (grid.T_loc[I2V(iip,jjt,kkr+1)]-grid.T_loc[I2V(iip,jjt,kkr)]) / dr; + CUSTOMREAL a2m = (a2 - std::abs(a2))/_2_CR; + CUSTOMREAL a2p = (a2 + std::abs(a2))/_2_CR; + + CUSTOMREAL b1 = - (_1_CR-grid.xi_loc[ I2V(iip,jjt-1,kkr)]-grid.xi_loc[ I2V(iip,jjt,kkr)]) / my_square(grid.r_loc_1d[kkr]) * (grid.T_loc[I2V(iip,jjt,kkr)]-grid.T_loc[I2V(iip,jjt-1,kkr)]) / dt \ + - ( grid.eta_loc[I2V(iip,jjt-1,kkr)]+grid.eta_loc[I2V(iip,jjt,kkr)]) / (my_square(grid.r_loc_1d[kkr])*std::cos(tmpt1)) / (_4_CR*dp) \ + * ((grid.T_loc[I2V(iip+1,jjt-1,kkr)]-grid.T_loc[I2V(iip-1,jjt-1,kkr)]) \ + + (grid.T_loc[I2V(iip+1,jjt,kkr)] -grid.T_loc[I2V(iip-1,jjt,kkr)])); + CUSTOMREAL b1m = (b1 - std::abs(b1))/_2_CR; + CUSTOMREAL b1p = (b1 + std::abs(b1))/_2_CR; + + CUSTOMREAL b2 = - (_1_CR-grid.xi_loc[ I2V(iip,jjt,kkr)]-grid.xi_loc[ I2V(iip,jjt+1,kkr)]) / my_square(grid.r_loc_1d[kkr]) * (grid.T_loc[I2V(iip,jjt+1,kkr)]-grid.T_loc[I2V(iip,jjt,kkr)]) / dt \ + - ( grid.eta_loc[I2V(iip,jjt,kkr)]+grid.eta_loc[I2V(iip,jjt+1,kkr)]) / (my_square(grid.r_loc_1d[kkr])*std::cos(tmpt2)) / (_4_CR*dp) \ + * ((grid.T_loc[I2V(iip+1,jjt,kkr)]-grid.T_loc[I2V(iip-1,jjt,kkr)]) \ + + (grid.T_loc[I2V(iip+1,jjt+1,kkr)]-grid.T_loc[I2V(iip-1,jjt+1,kkr)])); + CUSTOMREAL b2m = (b2 - std::abs(b2))/_2_CR; + CUSTOMREAL b2p = (b2 + std::abs(b2))/_2_CR; + + CUSTOMREAL c1 = - (_1_CR+grid.xi_loc[I2V(iip-1,jjt,kkr)]+grid.xi_loc[I2V(iip,jjt,kkr)]) / (my_square(grid.r_loc_1d[kkr])*my_square(std::cos(grid.t_loc_1d[jjt]))) \ + * (grid.T_loc[I2V(iip,jjt,kkr)]-grid.T_loc[I2V(iip-1,jjt,kkr)]) / dp \ + - (grid.eta_loc[I2V(iip-1,jjt,kkr)]+grid.eta_loc[I2V(iip,jjt,kkr)]) / (my_square(grid.r_loc_1d[kkr])*std::cos(grid.t_loc_1d[jjt])) / (_4_CR*dt) \ + * ((grid.T_loc[I2V(iip-1,jjt+1,kkr)]-grid.T_loc[I2V(iip-1,jjt-1,kkr)]) \ + + (grid.T_loc[I2V(iip, jjt+1,kkr)]-grid.T_loc[I2V(iip, jjt-1,kkr)])); + CUSTOMREAL c1m = (c1 - std::abs(c1))/_2_CR; + CUSTOMREAL c1p = (c1 + std::abs(c1))/_2_CR; + + CUSTOMREAL c2 = - (_1_CR+grid.xi_loc[I2V(iip,jjt,kkr)]+grid.xi_loc[I2V(iip+1,jjt,kkr)]) / (my_square(grid.r_loc_1d[kkr])*my_square(std::cos(grid.t_loc_1d[jjt]))) \ + * (grid.T_loc[I2V(iip+1,jjt,kkr)]-grid.T_loc[I2V(iip,jjt,kkr)]) / dp \ + - (grid.eta_loc[I2V(iip,jjt,kkr)]+grid.eta_loc[I2V(iip+1,jjt,kkr)]) / (my_square(grid.r_loc_1d[kkr])*std::cos(grid.t_loc_1d[jjt])) / (_4_CR*dt) \ + * ((grid.T_loc[I2V(iip,jjt+1,kkr)]-grid.T_loc[I2V(iip,jjt-1,kkr)]) \ + + (grid.T_loc[I2V(iip+1,jjt+1,kkr)]-grid.T_loc[I2V(iip+1,jjt-1,kkr)])); + CUSTOMREAL c2m = (c2 - std::abs(c2))/_2_CR; + CUSTOMREAL c2p = (c2 + std::abs(c2))/_2_CR; + + // additional terms of divergence in spherical cooridinate + CUSTOMREAL d = - _2_CR * (_1_CR+_2_CR*grid.zeta_loc[I2V(iip,jjt,kkr)]) / grid.r_loc_1d[kkr] \ + * (grid.T_loc[I2V(iip,jjt,kkr+1)]-grid.T_loc[I2V(iip,jjt,kkr-1)]) / _2_CR / dr \ + + (_1_CR-_2_CR*grid.xi_loc[I2V(iip,jjt,kkr)]) * std::sin(grid.t_loc_1d[jjt]) / (my_square(grid.r_loc_1d[kkr])*std::cos(grid.t_loc_1d[jjt])) \ + * (grid.T_loc[I2V(iip,jjt+1,kkr)]-grid.T_loc[I2V(iip,jjt-1,kkr)]) / _2_CR / dt \ + + _2_CR * grid.eta_loc[I2V(iip,jjt,kkr)] * std::sin(grid.t_loc_1d[jjt]) / (my_square(grid.r_loc_1d[kkr])*my_square(std::cos(grid.t_loc_1d[jjt]))) \ + * (grid.T_loc[I2V(iip+1,jjt,kkr)]-grid.T_loc[I2V(iip-1,jjt,kkr)]) / _2_CR / dp; + + // stabilize the calculation on the boundary + // if (kkr == 1 && grid.k_first() && a1p > 0 ){ + // a1m = -a1p; + // a1p = 0; + // } + + // coe + CUSTOMREAL coe = (a2p-a1m)/dr + (b2p-b1m)/dt + (c2p-c1m)/dp; + + if (isZeroAdj(coe)) { // here the traveltime is larger than surrounding + grid.tau_loc[I2V(iip,jjt,kkr)] = _0_CR; + } else { + // hamiltonian + CUSTOMREAL Hadj = (a1p*grid.tau_loc[I2V(iip,jjt,kkr-1)] - a2m*grid.tau_loc[I2V(iip,jjt,kkr+1)]) / dr \ + + (b1p*grid.tau_loc[I2V(iip,jjt-1,kkr)] - b2m*grid.tau_loc[I2V(iip,jjt+1,kkr)]) / dt \ + + (c1p*grid.tau_loc[I2V(iip-1,jjt,kkr)] - c2m*grid.tau_loc[I2V(iip+1,jjt,kkr)]) / dp; + + grid.tau_loc[I2V(iip,jjt,kkr)] = (grid.tau_old_loc[I2V(iip,jjt,kkr)] + Hadj) / (coe + d); + } +} + +// no multiplicative factorization +void Iterator::calculate_stencil_1st_order_upwind_tele(Grid&grid, int&iip, int&jjt, int&kkr){ + + // preparations + + count_cand = 0; + // forward and backward partial differential discretization + // T_p = ap*T(iip, jjt, kkr)+bp; two cases: 1/dp * T(iip,jjt,kkr) - T(iip-1,jjt,kkr)/dp or -1/dp * T(iip,jjt,kkr) + T(iip+1,jjt,kkr)/dp + // T_t = at*T(iip, jjt, kkr)+bt; + // T_r = ar*T(iip, jjt, kkr)+br; + if (iip > 0){ + ap1 = _1_CR/dp; + bp1 = -grid.T_loc[I2V(iip-1, jjt, kkr)]/dp; + } + if (iip < np-1){ + ap2 = -_1_CR/dp; + bp2 = grid.T_loc[I2V(iip+1, jjt, kkr)]/dp; + } + + if (jjt > 0){ + at1 = _1_CR/dt; + bt1 = -grid.T_loc[I2V(iip, jjt-1, kkr)]/dt; + } + if (jjt < nt-1){ + at2 = -_1_CR/dt; + bt2 = grid.T_loc[I2V(iip, jjt+1, kkr)]/dt; + } + + if (kkr > 0){ + ar1 = _1_CR/dr; + br1 = -grid.T_loc[I2V(iip, jjt, kkr-1)]/dr; + } + if (kkr < nr-1){ + ar2 = -_1_CR/dr; + br2 = grid.T_loc[I2V(iip, jjt, kkr+1)]/dr; + } + bc_f2 = grid.fac_b_loc[I2V(iip,jjt,kkr)]*grid.fac_c_loc[I2V(iip,jjt,kkr)] - std::pow(grid.fac_f_loc[I2V(iip,jjt,kkr)],_2_CR); + + // start to find candidate solutions + + // first catalog: characteristic travels through tetrahedron in 3D volume (8 cases) + for (int i_case = 0; i_case < 8; i_case++){ + + // determine discretization of T_p,T_t,T_r + switch (i_case) { + case 0: // characteristic travels from -p, -t, -r + if (iip == 0 || jjt == 0 || kkr == 0) + continue; + ap = ap1; bp = bp1; + at = at1; bt = bt1; + ar = ar1; br = br1; + break; + case 1: // characteristic travels from -p, -t, +r + if (iip == 0 || jjt == 0 || kkr == nr-1) + continue; + ap = ap1; bp = bp1; + at = at1; bt = bt1; + ar = ar2; br = br2; + break; + case 2: // characteristic travels from -p, +t, -r + if (iip == 0 || jjt == nt-1 || kkr == 0) + continue; + ap = ap1; bp = bp1; + at = at2; bt = bt2; + ar = ar1; br = br1; + break; + case 3: // characteristic travels from -p, +t, +r + if (iip == 0 || jjt == nt-1 || kkr == nr-1) + continue; + ap = ap1; bp = bp1; + at = at2; bt = bt2; + ar = ar2; br = br2; + break; + case 4: // characteristic travels from +p, -t, -r + if (iip == np-1 || jjt == 0 || kkr == 0) + continue; + ap = ap2; bp = bp2; + at = at1; bt = bt1; + ar = ar1; br = br1; + break; + case 5: // characteristic travels from +p, -t, +r + if (iip == np-1 || jjt == 0 || kkr == nr-1) + continue; + ap = ap2; bp = bp2; + at = at1; bt = bt1; + ar = ar2; br = br2; + break; + case 6: // characteristic travels from +p, +t, -r + if (iip == np-1 || jjt == nt-1 || kkr == 0) + continue; + ap = ap2; bp = bp2; + at = at2; bt = bt2; + ar = ar1; br = br1; + break; + case 7: // characteristic travels from +p, +t, +r + if (iip == np-1 || jjt == nt-1 || kkr == nr-1) + continue; + ap = ap2; bp = bp2; + at = at2; bt = bt2; + ar = ar2; br = br2; + break; + } + + // plug T_p, T_t, T_r into eikonal equation, solving the quadratic equation with respect to tau(iip,jjt,kkr) + // that is a*(ar*T+br)^2 + b*(at*T+bt)^2 + c*(ap*T+bp)^2 - 2*f*(at*T+bt)*(ap*T+bp) = s^2 + eqn_a = grid.fac_a_loc[I2V(iip,jjt,kkr)] * std::pow(ar, _2_CR) + grid.fac_b_loc[I2V(iip,jjt,kkr)] * std::pow(at, _2_CR) + + grid.fac_c_loc[I2V(iip,jjt,kkr)] * std::pow(ap, _2_CR) - _2_CR*grid.fac_f_loc[I2V(iip,jjt,kkr)] * at * ap; + eqn_b = _2_CR*grid.fac_a_loc[I2V(iip,jjt,kkr)] * ar * br + _2_CR*grid.fac_b_loc[I2V(iip,jjt,kkr)] * at * bt + + _2_CR*grid.fac_c_loc[I2V(iip,jjt,kkr)] * ap * bp - _2_CR*grid.fac_f_loc[I2V(iip,jjt,kkr)] * (at*bp + bt*ap); + eqn_c = grid.fac_a_loc[I2V(iip,jjt,kkr)] * std::pow(br, _2_CR) + grid.fac_b_loc[I2V(iip,jjt,kkr)] * std::pow(bt, _2_CR) + + grid.fac_c_loc[I2V(iip,jjt,kkr)] * std::pow(bp, _2_CR) - _2_CR*grid.fac_f_loc[I2V(iip,jjt,kkr)] * bt * bp + - std::pow(grid.fun_loc[I2V(iip,jjt,kkr)], _2_CR); + eqn_Delta = std::pow(eqn_b, _2_CR) - _4_CR * eqn_a * eqn_c; + + if (eqn_Delta >= 0){ // one or two real solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_T = (-eqn_b + std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + case 1: + tmp_T = (-eqn_b - std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + } + + // check the causality condition: the characteristic passing through (iip,jjt,kkr) is in between used three sides + // characteristic direction is (dr/dt, dtheta/dt, tphi/dt) = (H_p1,H_p2,H_p3), p1 = T_r, p2 = T_t, p3 = T_p + T_r = ar*tmp_T + br; + T_t = at*tmp_T + bt; + T_p = ap*tmp_T + bp; + + charact_r = grid.fac_a_loc[I2V(iip,jjt,kkr)]*T_r; + charact_t = grid.fac_b_loc[I2V(iip,jjt,kkr)]*T_t - grid.fac_f_loc[I2V(iip,jjt,kkr)]*T_p; + charact_p = grid.fac_c_loc[I2V(iip,jjt,kkr)]*T_p - grid.fac_f_loc[I2V(iip,jjt,kkr)]*T_t; + + is_causality = false; + switch (i_case){ + case 0: //characteristic travels from -p, -t, -r + if (charact_p >= 0 && charact_t >= 0 && charact_r >= 0 && tmp_T > 0){ + is_causality = true; + } + break; + case 1: //characteristic travels from -p, -t, +r + if (charact_p >= 0 && charact_t >= 0 && charact_r <= 0 && tmp_T > 0){ + is_causality = true; + } + break; + case 2: //characteristic travels from -p, +t, -r + if (charact_p >= 0 && charact_t <= 0 && charact_r >= 0 && tmp_T > 0){ + is_causality = true; + } + break; + case 3: //characteristic travels from -p, +t, +r + if (charact_p >= 0 && charact_t <= 0 && charact_r <= 0 && tmp_T > 0){ + is_causality = true; + } + break; + case 4: //characteristic travels from +p, -t, -r + if (charact_p <= 0 && charact_t >= 0 && charact_r >= 0 && tmp_T > 0){ + is_causality = true; + } + break; + case 5: //characteristic travels from +p, -t, +r + if (charact_p <= 0 && charact_t >= 0 && charact_r <= 0 && tmp_T > 0){ + is_causality = true; + } + break; + case 6: //characteristic travels from +p, +t, -r + if (charact_p <= 0 && charact_t <= 0 && charact_r >= 0 && tmp_T > 0){ + is_causality = true; + } + break; + case 7: //characteristic travels from +p, +t, +r + if (charact_p <= 0 && charact_t <= 0 && charact_r <= 0 && tmp_T > 0){ + is_causality = true; + } + break; + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_T; + count_cand += 1; + // if (iip == 1 && jjt ==1 && kkr ==1){ + // std::cout << "id_sim: " << id_sim << ", cd volumn icase " << i_case << ": " << canditate[count_cand-1] << std::endl; + // } + } + + } + + } + } + + // second catalog: characteristic travels through triangles in 2D volume (12 cases) + // case: 1-4 + // characteristic on r-t plane, force H_p3 = H_(T_p) = 0, that is, c*T_p-f*T_t = 0 + // plug the constraint into eikonal equation, we have the equation: a*T_r^2 + (bc-f^2)/c*T_t^2 = s^2 + for (int i_case = 0; i_case < 4; i_case++){ + switch (i_case){ + case 0: //characteristic travels from -t, -r + if (jjt == 0 || kkr == 0){ + continue; + } + at = at1; bt = bt1; + ar = ar1; br = br1; + break; + case 1: //characteristic travels from -t, +r + if (jjt == 0 || kkr == nr-1){ + continue; + } + at = at1; bt = bt1; + ar = ar2; br = br2; + break; + case 2: //characteristic travels from +t, -r + if (jjt == nt-1 || kkr == 0){ + continue; + } + at = at2; bt = bt2; + ar = ar1; br = br1; + break; + case 3: //characteristic travels from +t, +r + if (jjt == nt-1 || kkr == nr-1){ + continue; + } + at = at2; bt = bt2; + ar = ar2; br = br2; + break; + } + + // plug T_t, T_r into eikonal equation, solve the quadratic equation: a*(ar*tau+br)^2 + (bc-f^2)/c*(at*tau+bt)^2 = s^2 + eqn_a = grid.fac_a_loc[I2V(iip,jjt,kkr)] * std::pow(ar, _2_CR) + bc_f2/grid.fac_c_loc[I2V(iip,jjt,kkr)] * std::pow(at, _2_CR); + eqn_b = _2_CR*grid.fac_a_loc[I2V(iip,jjt,kkr)] * ar * br + _2_CR*bc_f2/grid.fac_c_loc[I2V(iip,jjt,kkr)] * at * bt; + eqn_c = grid.fac_a_loc[I2V(iip,jjt,kkr)] * std::pow(br, _2_CR) + bc_f2/grid.fac_c_loc[I2V(iip,jjt,kkr)] * std::pow(bt, _2_CR) + - std::pow(grid.fun_loc[I2V(iip,jjt,kkr)], _2_CR); + eqn_Delta = std::pow(eqn_b, _2_CR) - _4_CR * eqn_a * eqn_c; + + if (eqn_Delta >= 0){ // one or two real solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_T = (-eqn_b + std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + case 1: + tmp_T = (-eqn_b - std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + } + + // check the causality condition: + T_r = ar*tmp_T + br; + T_t = at*tmp_T + bt; + + charact_r = grid.fac_a_loc[I2V(iip,jjt,kkr)]*T_r; + charact_t = bc_f2/grid.fac_c_loc[I2V(iip,jjt,kkr)]*T_t; + + is_causality = false; + switch (i_case){ + case 0: //characteristic travels from -t, -r + if (charact_t >= 0 && charact_r >= 0 && tmp_T > 0){ + is_causality = true; + } + break; + case 1: //characteristic travels from -t, +r + if (charact_t >= 0 && charact_r <= 0 && tmp_T > 0){ + is_causality = true; + } + break; + case 2: //characteristic travels from +t, -r + if (charact_t <= 0 && charact_r >= 0 && tmp_T > 0){ + is_causality = true; + } + break; + case 3: //characteristic travels from +t, +r + if (charact_t <= 0 && charact_r <= 0 && tmp_T > 0){ + is_causality = true; + } + break; + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_T; + count_cand += 1; + // if (iip == 1 && jjt ==1 && kkr ==1){ + // std::cout << "id_sim: " << id_sim << ", cd plane icase " << i_case << ": " << canditate[count_cand-1] << std::endl; + // } + } + + } + } + + } + + // case: 5-8 + // characteristic on r-p plane, force H_p2 = H_(T_t) = 0, that is, b*T_t-f*T_p = 0 + // plug the constraint into eikonal equation, we have the equation: a*T_r^2 + (bc-f^2)/b*T_p^2 = s^2 + for (int i_case = 4; i_case < 8; i_case++){ + switch (i_case){ + case 4: //characteristic travels from -p, -r + if (iip == 0 || kkr == 0){ + continue; + } + ap = ap1; bp = bp1; + ar = ar1; br = br1; + break; + case 5: //characteristic travels from -p, +r + if (iip == 0 || kkr == nr-1){ + continue; + } + ap = ap1; bp = bp1; + ar = ar2; br = br2; + break; + case 6: //characteristic travels from +p, -r + if (iip == np-1 || kkr == 0){ + continue; + } + ap = ap2; bp = bp2; + ar = ar1; br = br1; + break; + case 7: //characteristic travels from +p, +r + if (iip == np-1 || kkr == nr-1){ + continue; + } + ap = ap2; bp = bp2; + ar = ar2; br = br2; + break; + } + + // plug T_p, T_r into eikonal equation, solve the quadratic equation: a*(ar*tau+br)^2 + (bc-f^2)/b*(ap*tau+bp)^2 = s^2 + eqn_a = grid.fac_a_loc[I2V(iip,jjt,kkr)] * std::pow(ar, _2_CR) + bc_f2/grid.fac_b_loc[I2V(iip,jjt,kkr)] * std::pow(ap, _2_CR); + eqn_b = _2_CR*grid.fac_a_loc[I2V(iip,jjt,kkr)] * ar * br + _2_CR*bc_f2/grid.fac_b_loc[I2V(iip,jjt,kkr)] * ap * bp; + eqn_c = grid.fac_a_loc[I2V(iip,jjt,kkr)] * std::pow(br, _2_CR) + bc_f2/grid.fac_b_loc[I2V(iip,jjt,kkr)] * std::pow(bp, _2_CR) + - std::pow(grid.fun_loc[I2V(iip,jjt,kkr)], _2_CR); + eqn_Delta = std::pow(eqn_b, _2_CR) - _4_CR * eqn_a * eqn_c; + + if (eqn_Delta >= 0){ // one or two real solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_T = (-eqn_b + std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + case 1: + tmp_T = (-eqn_b - std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + } + + // check the causality condition: + T_r = ar*tmp_T + br; + T_p = ap*tmp_T + bp; + + charact_r = grid.fac_a_loc[I2V(iip,jjt,kkr)]*T_r; + charact_p = bc_f2/grid.fac_b_loc[I2V(iip,jjt,kkr)]*T_p; + + is_causality = false; + switch (i_case){ + case 4: //characteristic travels from -p, -r + if (charact_p >= 0 && charact_r >= 0 && tmp_T > 0){ + is_causality = true; + } + break; + case 5: //characteristic travels from -p, +r + if (charact_p >= 0 && charact_r <= 0 && tmp_T > 0){ + is_causality = true; + } + break; + case 6: //characteristic travels from +p, -r + if (charact_p <= 0 && charact_r >= 0 && tmp_T > 0){ + is_causality = true; + } + break; + case 7: //characteristic travels from +p, +r + if (charact_p <= 0 && charact_r <= 0 && tmp_T > 0){ + is_causality = true; + } + break; + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_T; + count_cand += 1; + // if (iip == 1 && jjt ==1 && kkr ==1){ + // std::cout << "id_sim: " << id_sim << ", cd plane icase " << i_case << ": " << canditate[count_cand-1] << std::endl; + // } + } + + } + } + } + + // case: 9-12 + // characteristic on t-p plane, force H_p1 = H_(T_t) = 0, that is, T_r = 0 + // plug the constraint into eikonal equation, we have the equation: b*T_t^2 + c*T_p^2 - 2f*T_t*T_p = s^2 + for (int i_case = 8; i_case < 12; i_case++){ + switch (i_case){ + case 8: //characteristic travels from -p, -t + if (iip == 0 || jjt == 0){ + continue; + } + ap = ap1; bp = bp1; + at = at1; bt = bt1; + break; + case 9: //characteristic travels from -p, +t + if (iip == 0 || jjt == nt-1){ + continue; + } + ap = ap1; bp = bp1; + at = at2; bt = bt2; + break; + case 10: //characteristic travels from +p, -t + if (iip == np-1 || jjt == 0){ + continue; + } + ap = ap2; bp = bp2; + at = at1; bt = bt1; + break; + case 11: //characteristic travels from +p, +t + if (iip == np-1 || jjt == nt-1){ + continue; + } + ap = ap2; bp = bp2; + at = at2; bt = bt2; + break; + } + + // plug T_p, T_t into eikonal equation, solve the quadratic equation: b*(at*tau+bt)^2 + c*(ap*tau+bp)^2 - 2f*(at*tau+bt)*(ap*tau+bp) = s^2 + eqn_a = grid.fac_b_loc[I2V(iip,jjt,kkr)] * std::pow(at, _2_CR) + + grid.fac_c_loc[I2V(iip,jjt,kkr)] * std::pow(ap, _2_CR) - _2_CR*grid.fac_f_loc[I2V(iip,jjt,kkr)] * at * ap; + eqn_b = _2_CR*grid.fac_b_loc[I2V(iip,jjt,kkr)] * at * bt + + _2_CR*grid.fac_c_loc[I2V(iip,jjt,kkr)] * ap * bp - _2_CR*grid.fac_f_loc[I2V(iip,jjt,kkr)] * (at*bp + bt*ap); + eqn_c = grid.fac_b_loc[I2V(iip,jjt,kkr)] * std::pow(bt, _2_CR) + + grid.fac_c_loc[I2V(iip,jjt,kkr)] * std::pow(bp, _2_CR) - _2_CR*grid.fac_f_loc[I2V(iip,jjt,kkr)] * bt * bp + - std::pow(grid.fun_loc[I2V(iip,jjt,kkr)], _2_CR); + eqn_Delta = std::pow(eqn_b, _2_CR) - _4_CR * eqn_a * eqn_c; + + if (eqn_Delta >= 0){ // one or two real solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_T = (-eqn_b + std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + case 1: + tmp_T = (-eqn_b - std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + } + + // check the causality condition: + T_t = at*tmp_T + bt; + T_p = ap*tmp_T + bp; + + charact_t = grid.fac_b_loc[I2V(iip,jjt,kkr)]*T_t - grid.fac_f_loc[I2V(iip,jjt,kkr)]*T_p; + charact_p = grid.fac_c_loc[I2V(iip,jjt,kkr)]*T_p - grid.fac_f_loc[I2V(iip,jjt,kkr)]*T_t; + + is_causality = false; + switch (i_case){ + case 8: //characteristic travels from -p, -t + if (charact_p >= 0 && charact_t >= 0 && tmp_T > 0){ + is_causality = true; + } + break; + case 9: //characteristic travels from -p, +t + if (charact_p >= 0 && charact_t <= 0 && tmp_T > 0){ + is_causality = true; + } + break; + case 10: //characteristic travels from +p, -t + if (charact_p <= 0 && charact_t >= 0 && tmp_T > 0){ + is_causality = true; + } + break; + case 11: //characteristic travels from +p, +t + if (charact_p <= 0 && charact_t <= 0 && tmp_T > 0){ + is_causality = true; + } + break; + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_T; + count_cand += 1; + // if (iip == 1 && jjt ==1 && kkr ==1){ + // std::cout << "id_sim: " << id_sim << ", cd plane icase " << i_case << ": " << canditate[count_cand-1] << std::endl; + // } + } + + } + } + } + + // third catalog: characteristic travels through lines in 1D volume (6 cases) + // case: 1-2 + // characteristic travels along r-axis, force H_p2, H_p3 = 0, that is, T_p = T_t = 0 + // plug the constraint into eikonal equation, we have the equation: a*T_r^2 = s^2 + for (int i_case = 0; i_case < 2; i_case++){ + switch (i_case){ + case 0: //characteristic travels from -r + if (kkr == 0){ + continue; + } + ar = ar1; br = br1; + break; + case 1: //characteristic travels from +r + if (kkr == nr-1){ + continue; + } + ar = ar2; br = br2; + break; + } + + // plug T_t, T_r into eikonal equation, solve the quadratic equation: a*(ar*tau+br)^2 = s^2 + // simply, we have two solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_T = ( std::sqrt(std::pow(grid.fun_loc[I2V(iip,jjt,kkr)], _2_CR)/grid.fac_a_loc[I2V(iip,jjt,kkr)]) - br)/ar; + break; + case 1: + tmp_T = (-std::sqrt(std::pow(grid.fun_loc[I2V(iip,jjt,kkr)], _2_CR)/grid.fac_a_loc[I2V(iip,jjt,kkr)]) - br)/ar; + break; + } + + // check the causality condition: + + is_causality = false; + switch (i_case){ + case 0: //characteristic travels from -r (we can simply compare the traveltime, which is the same as check the direction of characteristic) + if (tmp_T >= grid.T_loc[I2V(iip,jjt,kkr-1)] && tmp_T > 0){ // this additional condition ensures the causality near the source + is_causality = true; + } + break; + case 1: //characteristic travels from +r + if (tmp_T >= grid.T_loc[I2V(iip,jjt,kkr+1)] && tmp_T > 0){ + is_causality = true; + } + break; + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_T; + count_cand += 1; + // if (iip == 1 && jjt ==1 && kkr ==1){ + // std::cout << "id_sim: " << id_sim << ", cd line icase " << i_case << ": " << canditate[count_cand-1] << std::endl; + // } + } + + } + + } + + // case: 3-4 + // characteristic travels along t-axis, force H_p1, H_p3 = 0, that is, T_r = 0; c*T_p-f*T_t = 0 + // plug the constraint into eikonal equation, we have the equation: (bc-f^2)/c*T_t^2 = s^2 + for (int i_case = 2; i_case < 4; i_case++){ + switch (i_case){ + case 2: //characteristic travels from -t + if (jjt == 0){ + continue; + } + at = at1; bt = bt1; + break; + case 3: //characteristic travels from +t + if (jjt == nt-1){ + continue; + } + at = at2; bt = bt2; + break; + } + + // plug T_p, T_r into eikonal equation, solve the quadratic equation: (bc-f^2)/c*(at*tau+bt)^2 = s^2 + // simply, we have two solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_T = ( std::sqrt(std::pow(grid.fun_loc[I2V(iip,jjt,kkr)], _2_CR)*grid.fac_c_loc[I2V(iip,jjt,kkr)]/bc_f2) - bt)/at; + break; + case 1: + tmp_T = (-std::sqrt(std::pow(grid.fun_loc[I2V(iip,jjt,kkr)], _2_CR)*grid.fac_c_loc[I2V(iip,jjt,kkr)]/bc_f2) - bt)/at; + break; + } + + // check the causality condition: + + is_causality = false; + switch (i_case){ + case 2: //characteristic travels from -t (we can simply compare the traveltime, which is the same as check the direction of characteristic) + if (tmp_T >= grid.T_loc[I2V(iip,jjt-1,kkr)] && tmp_T > 0){ // this additional condition ensures the causality near the source + is_causality = true; + } + break; + case 3: //characteristic travels from +t + if (tmp_T >= grid.T_loc[I2V(iip,jjt+1,kkr)] && tmp_T > 0){ + is_causality = true; + } + break; + + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_T; + count_cand += 1; + // if (iip == 1 && jjt ==1 && kkr ==1){ + // std::cout << "id_sim: " << id_sim << ", cd line icase " << i_case << ": " << canditate[count_cand-1] << std::endl; + // } + } + + } + } + + // case: 5-6 + // characteristic travels along p-axis, force H_p1, H_p2 = 0, that is, T_r = 0; b*T_t-f*T_p = 0 + // plug the constraint into eikonal equation, we have the equation: (bc-f^2)/b*T_p^2 = s^2 + for (int i_case = 4; i_case < 6; i_case++){ + switch (i_case){ + case 4: //characteristic travels from -p + if (iip == 0){ + continue; + } + ap = ap1; bp = bp1; + break; + case 5: //characteristic travels from +p + if (iip == np-1){ + continue; + } + ap = ap2; bp = bp2; + break; + + } + + // plug T_t, T_r into eikonal equation, solve the quadratic equation: (bc-f^2)/b*(ap*tau+bp)^2 = s^2 + // simply, we have two solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_T = ( std::sqrt(std::pow(grid.fun_loc[I2V(iip,jjt,kkr)], _2_CR)*grid.fac_b_loc[I2V(iip,jjt,kkr)]/bc_f2) - bp)/ap; + break; + case 1: + tmp_T = (-std::sqrt(std::pow(grid.fun_loc[I2V(iip,jjt,kkr)], _2_CR)*grid.fac_b_loc[I2V(iip,jjt,kkr)]/bc_f2) - bp)/ap; + break; + } + + // check the causality condition: + + is_causality = false; + switch (i_case){ + case 4: //characteristic travels from -p (we can simply compare the traveltime, which is the same as check the direction of characteristic) + if (tmp_T >= grid.T_loc[I2V(iip-1,jjt,kkr)] && tmp_T > 0){ // this additional condition ensures the causality near the source + is_causality = true; + } + break; + case 5: //characteristic travels from +p + if (tmp_T >= grid.T_loc[I2V(iip+1,jjt,kkr)] && tmp_T > 0){ + is_causality = true; + } + break; + + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_T; + count_cand += 1; + // if (iip == 1 && jjt ==1 && kkr ==1){ + // std::cout << "id_sim: " << id_sim << ", cd line icase " << i_case << ": " << canditate[count_cand-1] << std::endl; + // } + } + } + } + + // final, choose the minimum candidate solution as the updated value + for (int i_cand = 0; i_cand < count_cand; i_cand++){ + grid.T_loc[I2V(iip, jjt, kkr)] = std::min(grid.T_loc[I2V(iip, jjt, kkr)], canditate[i_cand]); + } + + // if (iip == 1 && jjt ==1 && kkr ==1){ + // std::cout << "id_sim: " << id_sim << ", ckp 2, " + // << "T values: " << grid.T_loc[I2V(iip, jjt, kkr)] << ", " + // << grid.T_loc[I2V(iip-1, jjt, kkr)] << ", " + // << grid.T_loc[I2V(iip+1, jjt, kkr)] << ", " + // << grid.T_loc[I2V(iip, jjt-1, kkr)] << ", " + // << grid.T_loc[I2V(iip, jjt+1, kkr)] << ", " + // << grid.T_loc[I2V(iip, jjt, kkr-1)] << ", " + // << grid.T_loc[I2V(iip, jjt, kkr+1)] << std::endl; + // } +} + + +void Iterator::calculate_stencil_1st_order_tele(Grid& grid, int& iip, int& jjt, int&kkr){ + sigr = SWEEPING_COEFF_TELE*std::sqrt(grid.fac_a_loc[I2V(iip, jjt, kkr)]); + sigt = SWEEPING_COEFF_TELE*std::sqrt(grid.fac_b_loc[I2V(iip, jjt, kkr)]); + sigp = SWEEPING_COEFF_TELE*std::sqrt(grid.fac_c_loc[I2V(iip, jjt, kkr)]); + coe = _1_CR/((sigr/dr)+(sigt/dt)+(sigp/dp)); + + pp1 = (grid.T_loc[I2V(iip , jjt , kkr )] - grid.T_loc[I2V(iip-1, jjt , kkr )])/dp; + pp2 = (grid.T_loc[I2V(iip+1, jjt , kkr )] - grid.T_loc[I2V(iip , jjt , kkr )])/dp; + pt1 = (grid.T_loc[I2V(iip , jjt , kkr )] - grid.T_loc[I2V(iip , jjt-1, kkr )])/dt; + pt2 = (grid.T_loc[I2V(iip , jjt+1, kkr )] - grid.T_loc[I2V(iip , jjt , kkr )])/dt; + pr1 = (grid.T_loc[I2V(iip , jjt , kkr )] - grid.T_loc[I2V(iip , jjt , kkr-1)])/dr; + pr2 = (grid.T_loc[I2V(iip , jjt , kkr+1)] - grid.T_loc[I2V(iip , jjt , kkr )])/dr; + + // LF Hamiltonian + Htau = calc_LF_Hamiltonian_tele(grid, pp1, pp2, pt1, pt2, pr1, pr2, iip, jjt, kkr); + + grid.T_loc[I2V(iip, jjt, kkr)] += coe*(grid.fun_loc[I2V(iip, jjt, kkr)] - Htau) \ + + coe*(sigr*(pr2-pr1)/_2_CR + sigt*(pt2-pt1)/_2_CR + sigp*(pp2-pp1)/_2_CR); + +} + + +void Iterator::calculate_stencil_3rd_order_tele(Grid& grid, int& iip, int& jjt, int&kkr){ + sigr = SWEEPING_COEFF_TELE*std::sqrt(grid.fac_a_loc[I2V(iip, jjt, kkr)]); + sigt = SWEEPING_COEFF_TELE*std::sqrt(grid.fac_b_loc[I2V(iip, jjt, kkr)]); + sigp = SWEEPING_COEFF_TELE*std::sqrt(grid.fac_c_loc[I2V(iip, jjt, kkr)]); + coe = _1_CR/((sigr/dr)+(sigt/dt)+(sigp/dp)); + + // direction p + if (iip == 1) { + pp1 = (grid.T_loc[I2V(iip, jjt,kkr)] \ + - grid.T_loc[I2V(iip-1,jjt,kkr)]) / dp; + + wp2 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.T_loc[I2V(iip, jjt,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip+1,jjt,kkr)] \ + + grid.T_loc[I2V(iip+2,jjt,kkr)]) ) \ + + / (eps + my_square( grid.T_loc[I2V(iip-1,jjt,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip, jjt,kkr)] \ + + grid.T_loc[I2V(iip+1,jjt,kkr)]) )) ); + + pp2 = (_1_CR - wp2) * ( grid.T_loc[I2V(iip+1,jjt,kkr)] \ + - grid.T_loc[I2V(iip-1,jjt,kkr)]) / _2_CR / dp \ + + wp2 * ( - _3_CR * grid.T_loc[I2V(iip,jjt,kkr)] \ + + _4_CR * grid.T_loc[I2V(iip+1,jjt,kkr)] \ + - grid.T_loc[I2V(iip+2,jjt,kkr)] ) / _2_CR / dp; + + } else if (iip == np-2) { + wp1 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.T_loc[I2V(iip, jjt,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip-1,jjt,kkr)] \ + + grid.T_loc[I2V(iip-2,jjt,kkr)]) ) \ + + / (eps + my_square( grid.T_loc[I2V(iip+1,jjt,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip, jjt,kkr)] \ + + grid.T_loc[I2V(iip-1,jjt,kkr)]) )) ); + + pp1 = (_1_CR - wp1) * ( grid.T_loc[I2V(iip+1,jjt,kkr)] \ + - grid.T_loc[I2V(iip-1,jjt,kkr)]) / _2_CR / dp \ + + wp1 * ( + _3_CR * grid.T_loc[I2V(iip,jjt,kkr)] \ + - _4_CR * grid.T_loc[I2V(iip-1,jjt,kkr)] \ + + grid.T_loc[I2V(iip-2,jjt,kkr)] ) / _2_CR / dp; + + pp2 = (grid.T_loc[I2V(iip+1,jjt,kkr)] \ + - grid.T_loc[I2V(iip, jjt,kkr)]) / dp; + + } else { + wp1 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.T_loc[I2V(iip, jjt,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip-1,jjt,kkr)] \ + + grid.T_loc[I2V(iip-2,jjt,kkr)]) ) \ + + / (eps + my_square( grid.T_loc[I2V(iip+1,jjt,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip, jjt,kkr)] \ + + grid.T_loc[I2V(iip-1,jjt,kkr)]) )) ); + + pp1 = (_1_CR - wp1) * ( grid.T_loc[I2V(iip+1,jjt,kkr)] \ + - grid.T_loc[I2V(iip-1,jjt,kkr)]) / _2_CR / dp \ + + wp1 * ( + _3_CR * grid.T_loc[I2V(iip,jjt,kkr)] \ + - _4_CR * grid.T_loc[I2V(iip-1,jjt,kkr)] \ + + grid.T_loc[I2V(iip-2,jjt,kkr)] ) / _2_CR / dp; + + wp2 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.T_loc[I2V(iip, jjt,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip+1,jjt,kkr)] \ + + grid.T_loc[I2V(iip+2,jjt,kkr)]) ) \ + + / (eps + my_square( grid.T_loc[I2V(iip-1,jjt,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip, jjt,kkr)] \ + + grid.T_loc[I2V(iip+1,jjt,kkr)]) )) ); + + pp2 = (_1_CR - wp2) * ( grid.T_loc[I2V(iip+1,jjt,kkr)] \ + - grid.T_loc[I2V(iip-1,jjt,kkr)]) / _2_CR / dp \ + + wp2 * ( - _3_CR * grid.T_loc[I2V(iip ,jjt,kkr)] \ + + _4_CR * grid.T_loc[I2V(iip+1,jjt,kkr)] \ + - grid.T_loc[I2V(iip+2,jjt,kkr)] ) / _2_CR / dp; + + } + + // direction t + if (jjt == 1) { + pt1 = (grid.T_loc[I2V(iip,jjt ,kkr)] \ + - grid.T_loc[I2V(iip,jjt-1,kkr)]) / dt; + + wt2 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.T_loc[I2V(iip, jjt,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip,jjt+1,kkr)] \ + + grid.T_loc[I2V(iip,jjt+2,kkr)]) ) \ + + / (eps + my_square( grid.T_loc[I2V(iip,jjt-1,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip, jjt,kkr)] \ + + grid.T_loc[I2V(iip,jjt+1,kkr)]) )) ); + + pt2 = (_1_CR - wt2) * ( grid.T_loc[I2V(iip,jjt+1,kkr)] \ + - grid.T_loc[I2V(iip,jjt-1,kkr)]) / _2_CR / dt \ + + wt2 * ( - _3_CR * grid.T_loc[I2V(iip,jjt,kkr)] \ + + _4_CR * grid.T_loc[I2V(iip,jjt+1,kkr)] \ + - grid.T_loc[I2V(iip,jjt+2,kkr)] ) / _2_CR / dt; + + } else if (jjt == nt-2) { + wt1 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.T_loc[I2V(iip, jjt,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip,jjt-1,kkr)] \ + + grid.T_loc[I2V(iip,jjt-2,kkr)]) ) \ + + / (eps + my_square( grid.T_loc[I2V(iip,jjt+1,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip, jjt,kkr)] \ + + grid.T_loc[I2V(iip,jjt-1,kkr)]) )) ); + + pt1 = (_1_CR - wt1) * ( grid.T_loc[I2V(iip,jjt+1,kkr)] \ + - grid.T_loc[I2V(iip,jjt-1,kkr)]) / _2_CR / dt \ + + wt1 * ( + _3_CR * grid.T_loc[I2V(iip,jjt,kkr)] \ + - _4_CR * grid.T_loc[I2V(iip,jjt-1,kkr)] \ + + grid.T_loc[I2V(iip,jjt-2,kkr)] ) / _2_CR / dt; + + pt2 = (grid.T_loc[I2V(iip,jjt+1,kkr)] \ + - grid.T_loc[I2V(iip,jjt, kkr)]) / dt; + + } else { + wt1 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.T_loc[I2V(iip, jjt,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip,jjt-1,kkr)] \ + + grid.T_loc[I2V(iip,jjt-2,kkr)]) ) \ + + / (eps + my_square( grid.T_loc[I2V(iip,jjt+1,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip, jjt,kkr)] \ + + grid.T_loc[I2V(iip,jjt-1,kkr)]) )) ); + + pt1 = (_1_CR - wt1) * ( grid.T_loc[I2V(iip,jjt+1,kkr)] \ + - grid.T_loc[I2V(iip,jjt-1,kkr)]) / _2_CR / dt \ + + wt1 * ( + _3_CR * grid.T_loc[I2V(iip,jjt,kkr)] \ + - _4_CR * grid.T_loc[I2V(iip,jjt-1,kkr)] \ + + grid.T_loc[I2V(iip,jjt-2,kkr)] ) / _2_CR / dt; + + wt2 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.T_loc[I2V(iip, jjt,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip,jjt+1,kkr)] \ + + grid.T_loc[I2V(iip,jjt+2,kkr)]) ) \ + + / (eps + my_square( grid.T_loc[I2V(iip,jjt-1,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip, jjt,kkr)] \ + + grid.T_loc[I2V(iip,jjt+1,kkr)]) )) ); + + pt2 = (_1_CR - wt2) * ( grid.T_loc[I2V(iip,jjt+1,kkr)] \ + - grid.T_loc[I2V(iip,jjt-1,kkr)]) / _2_CR / dt \ + + wt2 * ( - _3_CR * grid.T_loc[I2V(iip,jjt,kkr)] \ + + _4_CR * grid.T_loc[I2V(iip,jjt+1,kkr)] \ + - grid.T_loc[I2V(iip,jjt+2,kkr)] ) / _2_CR / dt; + + } + + // direction r + if (kkr == 1) { + pr1 = (grid.T_loc[I2V(iip,jjt,kkr )] \ + - grid.T_loc[I2V(iip,jjt,kkr-1)]) / dr; + + wr2 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.T_loc[I2V(iip,jjt,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip,jjt,kkr+1)] \ + + grid.T_loc[I2V(iip,jjt,kkr+2)]) ) \ + + / (eps + my_square( grid.T_loc[I2V(iip,jjt,kkr-1)] \ + -_2_CR*grid.T_loc[I2V(iip, jjt,kkr)] \ + + grid.T_loc[I2V(iip,jjt,kkr+1)]) )) ); + + pr2 = (_1_CR - wr2) * ( grid.T_loc[I2V(iip,jjt,kkr+1)] \ + - grid.T_loc[I2V(iip,jjt,kkr-1)]) / _2_CR / dr \ + + wr2 * ( - _3_CR * grid.T_loc[I2V(iip,jjt,kkr)] \ + + _4_CR * grid.T_loc[I2V(iip,jjt,kkr+1)] \ + - grid.T_loc[I2V(iip,jjt,kkr+2)] ) / _2_CR / dr; + + } else if (kkr == nr - 2) { + wr1 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.T_loc[I2V(iip,jjt,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip,jjt,kkr-1)] \ + + grid.T_loc[I2V(iip,jjt,kkr-2)]) ) \ + + / (eps + my_square( grid.T_loc[I2V(iip,jjt,kkr+1)] \ + -_2_CR*grid.T_loc[I2V(iip,jjt,kkr)] \ + + grid.T_loc[I2V(iip,jjt,kkr-1)]) )) ); + + pr1 = (_1_CR - wr1) * ( grid.T_loc[I2V(iip,jjt,kkr+1)] \ + - grid.T_loc[I2V(iip,jjt,kkr-1)]) / _2_CR / dr \ + + wr1 * ( + _3_CR * grid.T_loc[I2V(iip,jjt,kkr)] \ + - _4_CR * grid.T_loc[I2V(iip,jjt,kkr-1)] \ + + grid.T_loc[I2V(iip,jjt,kkr-2)] ) / _2_CR / dr; + + pr2 = (grid.T_loc[I2V(iip,jjt,kkr+1)] \ + - grid.T_loc[I2V(iip,jjt,kkr)]) / dr; + + } else { + wr1 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.T_loc[I2V(iip,jjt,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip,jjt,kkr-1)] \ + + grid.T_loc[I2V(iip,jjt,kkr-2)]) ) \ + + / (eps + my_square( grid.T_loc[I2V(iip,jjt,kkr+1)] \ + -_2_CR*grid.T_loc[I2V(iip,jjt,kkr)] \ + + grid.T_loc[I2V(iip,jjt,kkr-1)]) )) ); + + pr1 = (_1_CR - wr1) * ( grid.T_loc[I2V(iip,jjt,kkr+1)] \ + - grid.T_loc[I2V(iip,jjt,kkr-1)]) / _2_CR / dr \ + + wr1 * ( + _3_CR * grid.T_loc[I2V(iip,jjt,kkr)] \ + - _4_CR * grid.T_loc[I2V(iip,jjt,kkr-1)] \ + + grid.T_loc[I2V(iip,jjt,kkr-2)] ) / _2_CR / dr; + + wr2 = _1_CR/(_1_CR+_2_CR*my_square((eps + my_square( grid.T_loc[I2V(iip,jjt,kkr)] \ + -_2_CR*grid.T_loc[I2V(iip,jjt,kkr+1)] \ + + grid.T_loc[I2V(iip,jjt,kkr+2)]) ) \ + + / (eps + my_square( grid.T_loc[I2V(iip,jjt,kkr-1)] \ + -_2_CR*grid.T_loc[I2V(iip, jjt,kkr)] \ + + grid.T_loc[I2V(iip,jjt,kkr+1)]) )) ); + + pr2 = (_1_CR - wr2) * ( grid.T_loc[I2V(iip,jjt,kkr+1)] \ + - grid.T_loc[I2V(iip,jjt,kkr-1)]) / _2_CR / dr \ + + wr2 * ( - _3_CR * grid.T_loc[I2V(iip,jjt,kkr)] \ + + _4_CR * grid.T_loc[I2V(iip,jjt,kkr+1)] \ + - grid.T_loc[I2V(iip,jjt,kkr+2)] ) / _2_CR / dr; + + } + + // LF Hamiltonian + Htau = calc_LF_Hamiltonian_tele(grid, pp1, pp2, pt1, pt2, pr1, pr2, iip, jjt, kkr); + + // update tau + grid.T_loc[I2V(iip,jjt,kkr)] += coe * (grid.fun_loc[I2V(iip,jjt,kkr)] - Htau) \ + + coe * (sigr*(pr2-pr1)/_2_CR + sigt*(pt2-pt1)/_2_CR + sigp*(pp2-pp1)/_2_CR); + + // check value + // if(kkr==1 && jjt==1 && iip==1){ + // std::cout << sigr << " " << sigt << " " << sigp << " " << coe << " " + // << grid.fun_loc[I2V(iip,jjt,kkr)] << " " << Htau << " " << grid.T_loc[I2V(iip,jjt,kkr)] << " " + // << std::endl; + // } +} + + +inline CUSTOMREAL Iterator::calc_LF_Hamiltonian(Grid& grid, \ + CUSTOMREAL& pp1, CUSTOMREAL& pp2, \ + CUSTOMREAL& pt1, CUSTOMREAL& pt2, \ + CUSTOMREAL& pr1, CUSTOMREAL& pr2, \ + int& iip, int& jjt, int& kkr) { + // LF Hamiltonian + return sqrt( + grid.fac_a_loc[I2V(iip,jjt,kkr)] * my_square(grid.T0r_loc[I2V(iip,jjt,kkr)] * grid.tau_loc[I2V(iip,jjt,kkr)] + grid.T0v_loc[I2V(iip,jjt,kkr)] * (pr1+pr2)/_2_CR) \ + + grid.fac_b_loc[I2V(iip,jjt,kkr)] * my_square(grid.T0t_loc[I2V(iip,jjt,kkr)] * grid.tau_loc[I2V(iip,jjt,kkr)] + grid.T0v_loc[I2V(iip,jjt,kkr)] * (pt1+pt2)/_2_CR) \ + + grid.fac_c_loc[I2V(iip,jjt,kkr)] * my_square(grid.T0p_loc[I2V(iip,jjt,kkr)] * grid.tau_loc[I2V(iip,jjt,kkr)] + grid.T0v_loc[I2V(iip,jjt,kkr)] * (pp1+pp2)/_2_CR) \ + - _2_CR*grid.fac_f_loc[I2V(iip,jjt,kkr)] * (grid.T0t_loc[I2V(iip,jjt,kkr)] * grid.tau_loc[I2V(iip,jjt,kkr)] + grid.T0v_loc[I2V(iip,jjt,kkr)] * (pt1+pt2)/_2_CR) \ + * (grid.T0p_loc[I2V(iip,jjt,kkr)] * grid.tau_loc[I2V(iip,jjt,kkr)] + grid.T0v_loc[I2V(iip,jjt,kkr)] * (pp1+pp2)/_2_CR) \ + ); + +} + + +inline CUSTOMREAL Iterator::calc_LF_Hamiltonian_tele(Grid& grid, \ + CUSTOMREAL& pp1, CUSTOMREAL& pp2, \ + CUSTOMREAL& pt1, CUSTOMREAL& pt2, \ + CUSTOMREAL& pr1, CUSTOMREAL& pr2, \ + int& iip, int& jjt, int& kkr) { + // LF Hamiltonian for teleseismic source + return std::sqrt( + grid.fac_a_loc[I2V(iip,jjt,kkr)] * my_square((pr1+pr2)/_2_CR) \ + + grid.fac_b_loc[I2V(iip,jjt,kkr)] * my_square((pt1+pt2)/_2_CR) \ + + grid.fac_c_loc[I2V(iip,jjt,kkr)] * my_square((pp1+pp2)/_2_CR) \ + - _2_CR*grid.fac_f_loc[I2V(iip,jjt,kkr)] * ((pt1+pt2)/_2_CR) \ + * ((pp1+pp2)/_2_CR) \ + ); + +} + + +void Iterator::calculate_boundary_nodes(Grid& grid){ + CUSTOMREAL v0, v1; + + //plane + for (int jjt = 0; jjt < nt; jjt++){ + for (int iip = 0; iip < np; iip++){ + v0 = _2_CR * grid.tau_loc[I2V(iip,jjt,1)] - grid.tau_loc[I2V(iip,jjt,2)]; + v1 = grid.tau_loc[I2V(iip,jjt,2)]; + grid.tau_loc[I2V(iip,jjt,0)] = std::max({v0,v1}); + v0 = _2_CR * grid.tau_loc[I2V(iip,jjt,nr-2)] - grid.tau_loc[I2V(iip,jjt,nr-3)]; + v1 = grid.tau_loc[I2V(iip,jjt,nr-3)]; + grid.tau_loc[I2V(iip,jjt,nr-1)] = std::max({v0,v1}); + } + } + + for (int kkr = 0; kkr < nr; kkr++){ + for (int iip = 0; iip < np; iip++){ + v0 = _2_CR * grid.tau_loc[I2V(iip,1,kkr)] - grid.tau_loc[I2V(iip,2,kkr)]; + v1 = grid.tau_loc[I2V(iip,2,kkr)]; + grid.tau_loc[I2V(iip,0,kkr)] = std::max({v0,v1}); + v0 = _2_CR * grid.tau_loc[I2V(iip,nt-2,kkr)] - grid.tau_loc[I2V(iip,nt-3,kkr)]; + v1 = grid.tau_loc[I2V(iip,nt-3,kkr)]; + grid.tau_loc[I2V(iip,nt-1,kkr)] = std::max({v0,v1}); + } + } + + for (int kkr = 0; kkr < nr; kkr++){ + for (int jjt = 0; jjt < nt; jjt++){ + v0 = _2_CR * grid.tau_loc[I2V(1,jjt,kkr)] - grid.tau_loc[I2V(2,jjt,kkr)]; + v1 = grid.tau_loc[I2V(2,jjt,kkr)]; + grid.tau_loc[I2V(0,jjt,kkr)] = std::max({v0,v1}); + v0 = _2_CR * grid.tau_loc[I2V(np-2,jjt,kkr)] - grid.tau_loc[I2V(np-3,jjt,kkr)]; + v1 = grid.tau_loc[I2V(np-3,jjt,kkr)]; + grid.tau_loc[I2V(np-1,jjt,kkr)] = std::max({v0,v1}); + } + } + +} + + +void Iterator::calculate_boundary_nodes_tele(Grid& grid, int& iip, int& jjt, int& kkr){ + CUSTOMREAL v0, v1; + + if (grid.is_changed[I2V(iip,jjt,kkr)]) { + + // Bottom + if (kkr == 0 && grid.k_first()){ + v0 = _2_CR * grid.T_loc[I2V(iip,jjt,1)] - grid.T_loc[I2V(iip,jjt,2)]; + v1 = grid.T_loc[I2V(iip,jjt,2)]; + grid.T_loc[I2V(iip,jjt,0)] = std::max({v0,v1}); + } + + // Top + if (kkr == nr-1 && grid.k_last()){ + v0 = _2_CR * grid.T_loc[I2V(iip,jjt,nr-2)] - grid.T_loc[I2V(iip,jjt,nr-3)]; + v1 = grid.T_loc[I2V(iip,jjt,nr-3)]; + grid.T_loc[I2V(iip,jjt,nr-1)] = std::max({v0,v1}); + } + + // South + if (jjt == 0 && grid.j_first()) { + v0 = _2_CR * grid.T_loc[I2V(iip,1,kkr)] - grid.T_loc[I2V(iip,2,kkr)]; + v1 = grid.T_loc[I2V(iip,2,kkr)]; + grid.T_loc[I2V(iip,0,kkr)] = std::max({v0,v1}); + } + + // North + if (jjt == nt-1 && grid.j_last()) { + v0 = _2_CR * grid.T_loc[I2V(iip,nt-2,kkr)] - grid.T_loc[I2V(iip,nt-3,kkr)]; + v1 = grid.T_loc[I2V(iip,nt-3,kkr)]; + grid.T_loc[I2V(iip,nt-1,kkr)] = std::max({v0,v1}); + } + + // West + if (iip == 0 && grid.i_first()) { + v0 = _2_CR * grid.T_loc[I2V(1,jjt,kkr)] - grid.T_loc[I2V(2,jjt,kkr)]; + v1 = grid.T_loc[I2V(2,jjt,kkr)]; + grid.T_loc[I2V(0,jjt,kkr)] = std::max({v0,v1}); + } + + // East + if (iip == np-1 && grid.i_last()){ + v0 = _2_CR * grid.T_loc[I2V(np-2,jjt,kkr)] - grid.T_loc[I2V(np-3,jjt,kkr)]; + v1 = grid.T_loc[I2V(np-3,jjt,kkr)]; + grid.T_loc[I2V(np-1,jjt,kkr)] = std::max({v0,v1}); + } + + } // end if is_changed +} + + +void Iterator::calculate_boundary_nodes_adj(Grid& grid, int& iip, int& jjt, int& kkr){ + // West + if (iip == 0 && grid.i_first()) { + grid.tau_loc[I2V(0,jjt,kkr)] = _0_CR; + } + + // East + if (iip == np-1 && grid.i_last()) { + grid.tau_loc[I2V(np-1,jjt,kkr)] = _0_CR; + } + + // South + if (jjt == 0 && grid.j_first()) { + grid.tau_loc[I2V(iip,0,kkr)] = _0_CR; + } + + // North + if (jjt == nt-1 && grid.j_last()) { + grid.tau_loc[I2V(iip,nt-1,kkr)] = _0_CR; + } + + // Bottom + if (kkr == 0 && grid.k_first()) { + grid.tau_loc[I2V(iip,jjt,0)] = _0_CR; + } + + // Top + if (kkr == nr-1 && grid.k_last()) { + grid.tau_loc[I2V(iip,jjt,nr-1)] = _0_CR; + } +} + + +void Iterator::set_sweep_direction(int iswp) { + // set sweep direction + if (iswp == 0) { + r_dirc = -1; + t_dirc = -1; + p_dirc = -1; + } else if (iswp == 1) { + r_dirc = -1; + t_dirc = -1; + p_dirc = 1; + } else if (iswp == 2) { + r_dirc = -1; + t_dirc = 1; + p_dirc = -1; + } else if (iswp == 3) { + r_dirc = -1; + t_dirc = 1; + p_dirc = 1; + } else if (iswp == 4) { + r_dirc = 1; + t_dirc = -1; + p_dirc = -1; + } else if (iswp == 5) { + r_dirc = 1; + t_dirc = -1; + p_dirc = 1; + } else if (iswp == 6) { + r_dirc = 1; + t_dirc = 1; + p_dirc = -1; + } else if (iswp == 7) { + r_dirc = 1; + t_dirc = 1; + p_dirc = 1; + } +} + diff --git a/src/iterator_legacy.cpp b/src/iterator_legacy.cpp new file mode 100644 index 0000000..0c8a57c --- /dev/null +++ b/src/iterator_legacy.cpp @@ -0,0 +1,490 @@ +#include "iterator_legacy.h" + + +Iterator_legacy:: Iterator_legacy(InputParams& IP, Grid& grid, Source& src, IO_utils& io, const std::string& src_name, \ + bool first_init, bool is_teleseismic_in, bool is_second_run_in) \ + : Iterator(IP, grid, src, io, src_name, first_init, is_teleseismic_in, is_second_run_in) { + // do nothing +} + +void Iterator_legacy::do_sweep_adj(int iswp, Grid& grid, InputParams& IP) { + if (subdom_main) { + // set sweep direction + set_sweep_direction(iswp); + + int r_start, t_start, p_start, r_end, t_end, p_end; + + // set loop range + if (r_dirc < 0) { + r_start = nr-2; + r_end = 0; + } else { + r_start = 1; + r_end = nr-1; + } + if (t_dirc < 0) { + t_start = nt-2; + t_end = 0; + } else { + t_start = 1; + t_end = nt-1; + } + if (p_dirc < 0) { + p_start = np-2; + p_end = 0; + } else { + p_start = 1; + p_end = np-1; + } + + for (int kkr = r_start; kkr != r_end; kkr+=r_dirc) { + for (int jjt = t_start; jjt != t_end; jjt+=t_dirc) { + for (int iip = p_start; iip != p_end; iip+=p_dirc) { + // calculate stencils + calculate_stencil_adj(grid, iip, jjt, kkr); + } + } + } + + } // end if subdom_main + +} + + +Iterator_legacy_tele::Iterator_legacy_tele(InputParams& IP, Grid& grid, Source& src, IO_utils& io, const std::string& src_name, \ + bool first_init, bool is_teleseismic_in, bool is_second_run_in) \ + : Iterator(IP, grid, src, io, src_name, first_init, is_teleseismic_in, is_second_run_in) { + // do nothing +} + + +void Iterator_legacy_tele::do_sweep_adj(int iswp, Grid& grid, InputParams& IP) { + if (subdom_main) { + if(if_verbose) std::cout << "sweeping: " << iswp << std::endl; + // set sweep direction + set_sweep_direction(iswp); + + int r_start, t_start, p_start, r_end, t_end, p_end; + + // set loop range + if (r_dirc < 0) { + r_start = nr-1; + r_end = -1; + } else { + r_start = 0; + r_end = nr; + } + if (t_dirc < 0) { + t_start = nt-1; + t_end = -1; + } else { + t_start = 0; + t_end = nt; + } + if (p_dirc < 0) { + p_start = np-1; + p_end = -1; + } else { + p_start = 0; + p_end = np; + } + + for (int kkr = r_start; kkr != r_end; kkr+=r_dirc) { + for (int jjt = t_start; jjt != t_end; jjt+=t_dirc) { + for (int iip = p_start; iip != p_end; iip+=p_dirc) { + if (iip != 0 && jjt != 0 && kkr != 0 \ + && iip != np-1 && jjt != nt-1 && kkr != nr-1) { + // calculate stencils + calculate_stencil_adj(grid, iip, jjt, kkr); + } else { + calculate_boundary_nodes_adj(grid, iip, jjt, kkr); + } + } + } + } + + } // end if subdom_main +} + + +Iterator_legacy_1st_order::Iterator_legacy_1st_order(InputParams& IP, Grid& grid, Source& src, IO_utils& io, const std::string& src_name, \ + bool first_init, bool is_teleseismic_in, bool is_second_run_in) \ + : Iterator_legacy(IP, grid, src, io, src_name, first_init, is_teleseismic_in, is_second_run_in) { + // initialization is done in the base class +} + + +void Iterator_legacy_1st_order::do_sweep(int iswp, Grid& grid, InputParams& IP) { + if (subdom_main) { + + // set sweep direction + set_sweep_direction(iswp); + + // set loop range + int r_start, t_start, p_start, r_end, t_end, p_end; + + if (r_dirc < 0) { + r_start = nr-2; + r_end = 0; + } else { + r_start = 1; + r_end = nr-1; + } + if (t_dirc < 0) { + t_start = nt-2; + t_end = 0; + } else { + t_start = 1; + t_end = nt-1; + } + if (p_dirc < 0) { + p_start = np-2; + p_end = 0; + } else { + p_start = 1; + p_end = np-1; + } + + for (int kkr = r_start; kkr != r_end; kkr+=r_dirc) { + for (int jjt = t_start; jjt != t_end; jjt+=t_dirc) { + for (int iip = p_start; iip != p_end; iip+=p_dirc) { + if (grid.is_changed[I2V(iip, jjt, kkr)]) { + // 1st order, calculate stencils + calculate_stencil_1st_order(grid, iip, jjt, kkr); + } + } + } + } + + // update boundary + //calculate_boundary_nodes_maxmin(grid); + calculate_boundary_nodes(grid); + + } // end if subdom_main +} + + + +Iterator_legacy_3rd_order::Iterator_legacy_3rd_order(InputParams& IP, Grid& grid, Source& src, IO_utils& io, const std::string& src_name, \ + bool first_init, bool is_teleseismic_in, bool is_second_run_in) \ + : Iterator_legacy(IP, grid, src, io, src_name, first_init, is_teleseismic_in, is_second_run_in) { + // initialization is done in the base class +} + + +void Iterator_legacy_3rd_order::do_sweep(int iswp, Grid& grid, InputParams& IP) { + // std::cout << "cp1.5, my world rank is: " << world_rank << std::endl; + if (subdom_main) { + + // set sweep direction + set_sweep_direction(iswp); + + // set loop range + int r_start, t_start, p_start, r_end, t_end, p_end; + + if (r_dirc < 0) { + r_start = nr-2; + r_end = 0; + } else { + r_start = 1; + r_end = nr-1; + } + if (t_dirc < 0) { + t_start = nt-2; + t_end = 0; + } else { + t_start = 1; + t_end = nt-1; + } + if (p_dirc < 0) { + p_start = np-2; + p_end = 0; + } else { + p_start = 1; + p_end = np-1; + } + + for (int kkr = r_start; kkr != r_end; kkr+=r_dirc) { + for (int jjt = t_start; jjt != t_end; jjt+=t_dirc) { + for (int iip = p_start; iip != p_end; iip+=p_dirc) { + if (grid.is_changed[I2V(iip, jjt, kkr)]) { + // 1st order, calculate stencils + calculate_stencil_3rd_order(grid, iip, jjt, kkr); + } + } + } + } + + // update boundary + calculate_boundary_nodes(grid); + // std::cout << "cp2, my world rank is: " << world_rank << std::endl; + // for (int i_proc = 0; i_proc < world_nprocs; i_proc++){ + // std::cout << "my world rank is: " << world_rank << ", i_proc is: " << i_proc + // << ", world_nprocs: " << world_nprocs << std::endl; + + // if (i_proc == world_rank ){ + // for (int kkr = r_start; kkr != r_end; kkr+=r_dirc) { + // for (int jjt = t_start; jjt != t_end; jjt+=t_dirc) { + // for (int iip = p_start; iip != p_end; iip+=p_dirc) { + + // std::cout << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') + // << grid.tau_loc[I2V(iip,jjt,kkr)]*grid.T0v_loc[I2V(iip,jjt,kkr)]; + // } + // std::cout << std::endl; + // } + // std::cout << std::endl; + // } + // } + // synchronize_all_world(); + // } + + } // end if subdom_main +} + + +Iterator_legacy_1st_order_upwind::Iterator_legacy_1st_order_upwind(InputParams& IP, Grid& grid, Source& src, IO_utils& io, const std::string& src_name, \ + bool first_init, bool is_teleseismic_in, bool is_second_run_in) \ + : Iterator_legacy(IP, grid, src, io, src_name, first_init, is_teleseismic_in, is_second_run_in) { + // initialization is done in the base class +} + +void Iterator_legacy_1st_order_upwind::do_sweep(int iswp, Grid& grid, InputParams& IP) { + if (subdom_main) { + + // set sweep direction + set_sweep_direction(iswp); + + // set loop range + int r_start, t_start, p_start, r_end, t_end, p_end; + + if (r_dirc < 0) { + r_start = nr-1; + r_end = -1; + } else { + r_start = 0; + r_end = nr; + } + if (t_dirc < 0) { + t_start = nt-1; + t_end = -1; + } else { + t_start = 0; + t_end = nt; + } + if (p_dirc < 0) { + p_start = np-1; + p_end = -1; + } else { + p_start = 0; + p_end = np; + } + + for (int kkr = r_start; kkr != r_end; kkr+=r_dirc) { + for (int jjt = t_start; jjt != t_end; jjt+=t_dirc) { + for (int iip = p_start; iip != p_end; iip+=p_dirc) { + if (grid.is_changed[I2V(iip, jjt, kkr)]) { + // 1st order, calculate stencils + calculate_stencil_1st_order_upwind(grid, iip, jjt, kkr); + } + } + } + } + // std::cout << "cp2, my world rank is: " << world_rank << std::endl; + // for (int i_proc = 0; i_proc < world_nprocs; i_proc++){ + // std::cout << "my world rank is: " << world_rank << ", i_proc is: " << i_proc + // << ", world_nprocs: " << world_nprocs << std::endl; + + // if (i_proc == world_rank ){ + // for (int kkr = r_start; kkr != r_end; kkr+=r_dirc) { + // for (int jjt = t_start; jjt != t_end; jjt+=t_dirc) { + // for (int iip = p_start; iip != p_end; iip+=p_dirc) { + + // std::cout << std::fixed << std::setprecision(4) << std::setw(9) << std::right << std::setfill(' ') + // << grid.tau_loc[I2V(iip,jjt,kkr)]*grid.T0v_loc[I2V(iip,jjt,kkr)]; + // } + // std::cout << std::endl; + // } + // std::cout << std::endl; + // } + // } + // // synchronize_all_world(); + // } + + + // no boundary process is needed for 1st order upwind method + // // update boundary + // calculate_boundary_nodes(grid); + + } // end if subdom_main +} + + + +Iterator_legacy_1st_order_tele::Iterator_legacy_1st_order_tele(InputParams& IP, Grid& grid, Source& src, IO_utils& io, const std::string& src_name, \ + bool first_init, bool is_teleseismic_in, bool is_second_run_in) \ + : Iterator_legacy_tele(IP, grid, src, io, src_name, first_init, is_teleseismic_in, is_second_run_in) { + // initialization is done in the base class +} + +// overloading virtual function +void Iterator_legacy_1st_order_tele::do_sweep(int iswp, Grid& grid, InputParams& IP) { + if (subdom_main) { + + // set sweep direction + set_sweep_direction(iswp); + + // set loop range + int r_start, t_start, p_start, r_end, t_end, p_end; + + if (r_dirc < 0) { + r_start = nr-1; + r_end = -1; + } else { + r_start = 0; + r_end = nr; + } + if (t_dirc < 0) { + t_start = nt-1; + t_end = -1; + } else { + t_start = 0; + t_end = nt; + } + if (p_dirc < 0) { + p_start = np-1; + p_end = -1; + } else { + p_start = 0; + p_end = np; + } + + for (int kkr = r_start; kkr != r_end; kkr+=r_dirc) { + for (int jjt = t_start; jjt != t_end; jjt+=t_dirc) { + for (int iip = p_start; iip != p_end; iip+=p_dirc) { + // this if statement is not necessary because always only the outer layer + // is !is_changed in teleseismic case + //if (grid.is_changed[I2V(iip, jjt, kkr)]) { + if (iip != 0 && iip != np-1 && jjt != 0 && jjt != nt-1 && kkr != 0 && kkr != nr-1) { + // 1st order, calculate stencils + calculate_stencil_1st_order_tele(grid, iip, jjt, kkr); + } else { + // update boundary + calculate_boundary_nodes_tele(grid, iip, jjt, kkr); + } + } + } + } + + } // end if subdom_main +} + + + +Iterator_legacy_3rd_order_tele::Iterator_legacy_3rd_order_tele(InputParams& IP, Grid& grid, Source& src, IO_utils& io, const std::string& src_name, \ + bool first_init, bool is_teleseismic_in, bool is_second_run_in) \ + : Iterator_legacy_tele(IP, grid, src, io, src_name, first_init, is_teleseismic_in, is_second_run_in) { + // initialization is done in the base class +} + + +void Iterator_legacy_3rd_order_tele::do_sweep(int iswp, Grid& grid, InputParams& IP) { + if (subdom_main) { + + // set sweep direction + set_sweep_direction(iswp); + + // set loop range + int r_start, t_start, p_start, r_end, t_end, p_end; + + if (r_dirc < 0) { + r_start = nr-1; + r_end = -1; + } else { + r_start = 0; + r_end = nr; + } + if (t_dirc < 0) { + t_start = nt-1; + t_end = -1; + } else { + t_start = 0; + t_end = nt; + } + if (p_dirc < 0) { + p_start = np-1; + p_end = -1; + } else { + p_start = 0; + p_end = np; + } + + for (int kkr = r_start; kkr != r_end; kkr+=r_dirc) { + for (int jjt = t_start; jjt != t_end; jjt+=t_dirc) { + for (int iip = p_start; iip != p_end; iip+=p_dirc) { + if (iip != 0 && iip != np-1 && jjt != 0 && jjt != nt-1 && kkr != 0 && kkr != nr-1) { + // calculate stencils and update tau + calculate_stencil_3rd_order_tele(grid, iip, jjt, kkr); + } else { + // update boundary + calculate_boundary_nodes_tele(grid, iip, jjt, kkr); + } + } + } + } + } // end if subdom_main +} + +Iterator_legacy_1st_order_upwind_tele::Iterator_legacy_1st_order_upwind_tele(InputParams& IP, Grid& grid, Source& src, IO_utils& io, const std::string& src_name, \ + bool first_init, bool is_teleseismic_in, bool is_second_run_in) \ + : Iterator_legacy_tele(IP, grid, src, io, src_name, first_init, is_teleseismic_in, is_second_run_in) { + // initialization is done in the base class +} + +void Iterator_legacy_1st_order_upwind_tele::do_sweep(int iswp, Grid& grid, InputParams& IP) { + if (subdom_main) { + // set sweep direction + set_sweep_direction(iswp); + + // set loop range + int r_start, t_start, p_start, r_end, t_end, p_end; + + if (r_dirc < 0) { + r_start = nr-1; + r_end = -1; + } else { + r_start = 0; + r_end = nr; + } + if (t_dirc < 0) { + t_start = nt-1; + t_end = -1; + } else { + t_start = 0; + t_end = nt; + } + if (p_dirc < 0) { + p_start = np-1; + p_end = -1; + } else { + p_start = 0; + p_end = np; + } + + for (int kkr = r_start; kkr != r_end; kkr+=r_dirc) { + for (int jjt = t_start; jjt != t_end; jjt+=t_dirc) { + for (int iip = p_start; iip != p_end; iip+=p_dirc) { + // this if statement is not necessary because always only the outer layer + // is !is_changed in teleseismic case + // if (grid.is_changed[I2V(iip, jjt, kkr)]) { + // if (iip != 0 && iip != np-1 && jjt != 0 && jjt != nt-1 && kkr != 0 && kkr != nr-1) { + // 1st order, calculate stencils + if (iip != 0 && iip != np-1 && jjt != 0 && jjt != nt-1 && kkr != 0) { // top layer is not fixed, otherwise, the top layer will be 2000 + calculate_stencil_1st_order_upwind_tele(grid, iip, jjt, kkr); // no need to consider the boundary for upwind scheme + } + } + } + } + + } // end if subdom_main +} + diff --git a/src/iterator_level.cpp b/src/iterator_level.cpp new file mode 100644 index 0000000..56a19d0 --- /dev/null +++ b/src/iterator_level.cpp @@ -0,0 +1,1108 @@ +#include "iterator_level.h" + +#ifdef USE_SIMD +#include "vectorized_sweep.h" +#endif + + +Iterator_level::Iterator_level(InputParams& IP, Grid& grid, Source& src, IO_utils& io, const std::string& src_name, bool first_init, bool is_teleseismic_in, bool is_second_run_in) \ + : Iterator(IP, grid, src, io, src_name, first_init, is_teleseismic_in, is_second_run_in) { + // do nothing +} + + +void Iterator_level::do_sweep_adj(int iswp, Grid& grid, InputParams& IP){ + + // set sweep direction + set_sweep_direction(iswp); + + int iip, jjt, kkr; + int n_levels = ijk_for_this_subproc.size(); + + for (int i_level = 0; i_level < n_levels; i_level++) { + size_t n_nodes = ijk_for_this_subproc[i_level].size(); + + for (size_t i_node = 0; i_node < n_nodes; i_node++) { + + V2I(ijk_for_this_subproc[i_level][i_node], iip, jjt, kkr); + + if (r_dirc < 0) kkr = nr-1-kkr; + else kkr = kkr; + if (t_dirc < 0) jjt = nt-1-jjt; + else jjt = jjt; + if (p_dirc < 0) iip = np-1-iip; + else iip = iip; + + if(iip < 0 || jjt < 0 || kkr < 0 || iip >= np || jjt >= nt || kkr >= nr) { + std::cout << "ERROR: iip = " << iip << ", jjt = " << jjt << ", kkr = " << kkr << std::endl; + } + + // + // calculate stencils + // + if (iip != 0 && jjt != 0 && kkr != 0 \ + && iip != np-1 && jjt != nt-1 && kkr != nr-1) { + // calculate stencils + calculate_stencil_adj(grid, iip, jjt, kkr); + } else { + calculate_boundary_nodes_adj(grid, iip, jjt, kkr); + } + + } // end ijk + + // mpi synchronization + synchronize_all_sub(); + + } // end loop i_level + +} + + +Iterator_level_tele::Iterator_level_tele(InputParams& IP, Grid& grid, Source& src, IO_utils& io, const std::string& src_name, bool first_init, bool is_teleseismic_in, bool is_second_run_in) \ + : Iterator(IP, grid, src, io, src_name, first_init, is_teleseismic_in, is_second_run_in) { + // do nothing +} + + +void Iterator_level_tele::do_sweep_adj(int iswp, Grid& grid, InputParams& IP){ + // set sweep direction + set_sweep_direction(iswp); + + int iip, jjt, kkr; + int n_levels = ijk_for_this_subproc.size(); + + for (int i_level = 0; i_level < n_levels; i_level++) { + size_t n_nodes = ijk_for_this_subproc[i_level].size(); + + for (size_t i_node = 0; i_node < n_nodes; i_node++) { + + V2I(ijk_for_this_subproc[i_level][i_node], iip, jjt, kkr); + + if (r_dirc < 0) kkr = nr-1-kkr; + else kkr = kkr; + if (t_dirc < 0) jjt = nt-1-jjt; + else jjt = jjt; + if (p_dirc < 0) iip = np-1-iip; + else iip = iip; + + // + // calculate stencils + // + if (iip != 0 && jjt != 0 && kkr != 0 \ + && iip != np-1 && jjt != nt-1 && kkr != nr-1) { + // calculate stencils + calculate_stencil_adj(grid, iip, jjt, kkr); + } else { + calculate_boundary_nodes_adj(grid, iip, jjt, kkr); + } + } // end ijk + + // mpi synchronization + synchronize_all_sub(); + + } // end loop i_level + +} + + +// ERROR index!!!!!!!!!!!!! +Iterator_level_1st_order::Iterator_level_1st_order(InputParams& IP, Grid& grid, Source& src, IO_utils& io, const std::string& src_name, bool first_init, bool is_teleseismic_in, bool is_second_run_in) \ + : Iterator_level(IP, grid, src, io, src_name, first_init, is_teleseismic_in, is_second_run_in) { + // initialization is done in the base class +} + + +void Iterator_level_1st_order::do_sweep(int iswp, Grid& grid, InputParams& IP){ + + if(!use_gpu){ + +#if !defined USE_SIMD + + // set sweep direction + set_sweep_direction(iswp); + + int iip, jjt, kkr; + int n_levels = ijk_for_this_subproc.size(); + + for (int i_level = 0; i_level < n_levels; i_level++) { + size_t n_nodes = ijk_for_this_subproc[i_level].size(); + + for (size_t i_node = 0; i_node < n_nodes; i_node++) { + + V2I(ijk_for_this_subproc[i_level][i_node], iip, jjt, kkr); + + if (r_dirc < 0) kkr = nr-kkr; //kk-1; + else kkr = kkr-1; //nr-kk; + if (t_dirc < 0) jjt = nt-jjt; //jj-1; + else jjt = jjt-1; //nt-jj; + if (p_dirc < 0) iip = np-iip; //ii-1; + else iip = iip-1; //np-ii; + + // + // calculate stencils + // + if (grid.is_changed[I2V(iip, jjt, kkr)]) { + calculate_stencil_1st_order(grid, iip, jjt, kkr); + } // is_changed == true + } // end ijk + + // mpi synchronization + synchronize_all_sub(); + + } // end loop i_level + +#elif USE_AVX512 || USE_AVX + + // preload constants + __mT v_DP_inv = _mmT_set1_pT(1.0/dp); + __mT v_DT_inv = _mmT_set1_pT(1.0/dt); + __mT v_DR_inv = _mmT_set1_pT(1.0/dr); + __mT v_DP_inv_half = _mmT_set1_pT(1.0/dp*0.5); + __mT v_DT_inv_half = _mmT_set1_pT(1.0/dt*0.5); + __mT v_DR_inv_half = _mmT_set1_pT(1.0/dr*0.5); + + // store stencil coefs + __mT v_pp1; + __mT v_pp2; + __mT v_pt1; + __mT v_pt2; + __mT v_pr1; + __mT v_pr2; + + int n_levels = ijk_for_this_subproc.size(); + for (int i_level = 0; i_level < n_levels; i_level++) { + int n_nodes = ijk_for_this_subproc.at(i_level).size(); + + int num_iter = n_nodes / NSIMD + (n_nodes % NSIMD == 0 ? 0 : 1); + + // make alias to preloaded data + __mT* v_iip = (__mT*) vv_iip.at(iswp).at(i_level); + __mT* v_jjt = (__mT*) vv_jjt.at(iswp).at(i_level); + __mT* v_kkr = (__mT*) vv_kkr.at(iswp).at(i_level); + + __mT* v_fac_a = (__mT*) vv_fac_a.at(iswp).at(i_level); + __mT* v_fac_b = (__mT*) vv_fac_b.at(iswp).at(i_level); + __mT* v_fac_c = (__mT*) vv_fac_c.at(iswp).at(i_level); + __mT* v_fac_f = (__mT*) vv_fac_f.at(iswp).at(i_level); + __mT* v_T0v = (__mT*) vv_T0v.at(iswp).at(i_level); + __mT* v_T0r = (__mT*) vv_T0r.at(iswp).at(i_level); + __mT* v_T0t = (__mT*) vv_T0t.at(iswp).at(i_level); + __mT* v_T0p = (__mT*) vv_T0p.at(iswp).at(i_level); + __mT* v_fun = (__mT*) vv_fun.at(iswp).at(i_level); + __mT* v_change = (__mT*) vv_change.at(iswp).at(i_level); + + // alias for dumped index + int* dump_ijk = vv_i__j__k__.at(iswp).at(i_level); + int* dump_ip1jk = vv_ip1j__k__.at(iswp).at(i_level); + int* dump_im1jk = vv_im1j__k__.at(iswp).at(i_level); + int* dump_ijp1k = vv_i__jp1k__.at(iswp).at(i_level); + int* dump_ijm1k = vv_i__jm1k__.at(iswp).at(i_level); + int* dump_ijkp1 = vv_i__j__kp1.at(iswp).at(i_level); + int* dump_ijkm1 = vv_i__j__km1.at(iswp).at(i_level); + + // load data of all nodes in one level on temporal aligned array + for (int _i_vec = 0; _i_vec < num_iter; _i_vec++) { + + int i_vec = _i_vec * NSIMD; + __mT v_c__ = load_mem_gen_to_mTd(grid.tau_loc, &dump_ijk[i_vec]); + __mT v_p__ = load_mem_gen_to_mTd(grid.tau_loc, &dump_ip1jk[i_vec]); + __mT v_m__ = load_mem_gen_to_mTd(grid.tau_loc, &dump_im1jk[i_vec]); + __mT v__p_ = load_mem_gen_to_mTd(grid.tau_loc, &dump_ijp1k[i_vec]); + __mT v__m_ = load_mem_gen_to_mTd(grid.tau_loc, &dump_ijm1k[i_vec]); + __mT v___p = load_mem_gen_to_mTd(grid.tau_loc, &dump_ijkp1[i_vec]); + __mT v___m = load_mem_gen_to_mTd(grid.tau_loc, &dump_ijkm1[i_vec]); + + // loop over all nodes in one level + vect_stencil_1st_pre_simd(v_iip[_i_vec], v_jjt[_i_vec], v_kkr[_i_vec], \ + v_c__, \ + v_p__, v_m__, v__p_, v__m_, v___p, v___m, \ + v_pp1, v_pp2, v_pt1, v_pt2, v_pr1, v_pr2, \ + v_DP_inv, v_DT_inv, v_DR_inv, \ + v_DP_inv_half, v_DT_inv_half, v_DR_inv_half, \ + loc_I, loc_J, loc_K); + + // calculate updated value on c + vect_stencil_1st_3rd_apre_simd(v_c__, v_fac_a[_i_vec], v_fac_b[_i_vec], v_fac_c[_i_vec], v_fac_f[_i_vec], \ + v_T0v[_i_vec], v_T0p[_i_vec] , v_T0t[_i_vec] , v_T0r[_i_vec] , v_fun[_i_vec] , v_change[_i_vec], \ + v_pp1, v_pp2, v_pt1, v_pt2, v_pr1, v_pr2, \ + v_DP_inv, v_DT_inv, v_DR_inv); + + // store v_c__ to dump_c__ + _mmT_store_pT(dump_c__, v_c__); + + + for (int i = 0; i < NSIMD; i++) { + if(i_vec+i>=n_nodes) break; + + grid.tau_loc[dump_ijk[i_vec+i]] = dump_c__[i]; + } + + + + } // end of i_vec loop + + // mpi synchronization + synchronize_all_sub(); + + } // end of i_level loop + +#elif USE_ARM_SVE + + svbool_t pg; + // + __mT v_DP_inv = svdup_f64(1.0/dp); + __mT v_DT_inv = svdup_f64(1.0/dt); + __mT v_DR_inv = svdup_f64(1.0/dr); + __mT v_DP_inv_half = svdup_f64(1.0/dp*0.5); + __mT v_DT_inv_half = svdup_f64(1.0/dt*0.5); + __mT v_DR_inv_half = svdup_f64(1.0/dr*0.5); + + // store stencil coefs + __mT v_pp1; + __mT v_pp2; + __mT v_pt1; + __mT v_pt2; + __mT v_pr1; + __mT v_pr2; + + __mT v_c__ ; + __mT v_p__ ; + __mT v_m__ ; + __mT v__p_ ; + __mT v__m_ ; + __mT v___p ; + __mT v___m ; + + __mT v_iip_ ; + __mT v_jjt_ ; + __mT v_kkr_ ; + __mT v_fac_a_ ; + __mT v_fac_b_ ; + __mT v_fac_c_ ; + __mT v_fac_f_ ; + __mT v_T0v_ ; + __mT v_T0r_ ; + __mT v_T0t_ ; + __mT v_T0p_ ; + __mT v_fun_ ; + __mT v_change_; + + + // measure time for only loop + //auto start = std::chrono::high_resolution_clock::now(); + + int n_levels = ijk_for_this_subproc.size(); + for (int i_level = 0; i_level < n_levels; i_level++) { + int n_nodes = ijk_for_this_subproc.at(i_level).size(); + //std::cout << "n_nodes = " << n_nodes << std::endl; + + int num_iter = n_nodes / NSIMD + (n_nodes % NSIMD == 0 ? 0 : 1); + + // make alias to preloaded data + CUSTOMREAL* v_iip = vv_iip.at(iswp).at(i_level); + CUSTOMREAL* v_jjt = vv_jjt.at(iswp).at(i_level); + CUSTOMREAL* v_kkr = vv_kkr.at(iswp).at(i_level); + + CUSTOMREAL* v_fac_a = vv_fac_a.at(iswp).at(i_level); + CUSTOMREAL* v_fac_b = vv_fac_b.at(iswp).at(i_level); + CUSTOMREAL* v_fac_c = vv_fac_c.at(iswp).at(i_level); + CUSTOMREAL* v_fac_f = vv_fac_f.at(iswp).at(i_level); + CUSTOMREAL* v_T0v = vv_T0v.at(iswp).at(i_level); + CUSTOMREAL* v_T0r = vv_T0r.at(iswp).at(i_level); + CUSTOMREAL* v_T0t = vv_T0t.at(iswp).at(i_level); + CUSTOMREAL* v_T0p = vv_T0p.at(iswp).at(i_level); + CUSTOMREAL* v_fun = vv_fun.at(iswp).at(i_level); + CUSTOMREAL* v_change = vv_change.at(iswp).at(i_level); + + // alias for dumped index + uint64_t* dump_ijk = vv_i__j__k__.at(iswp).at(i_level); + uint64_t* dump_ip1jk = vv_ip1j__k__.at(iswp).at(i_level); + uint64_t* dump_im1jk = vv_im1j__k__.at(iswp).at(i_level); + uint64_t* dump_ijp1k = vv_i__jp1k__.at(iswp).at(i_level); + uint64_t* dump_ijm1k = vv_i__jm1k__.at(iswp).at(i_level); + uint64_t* dump_ijkp1 = vv_i__j__kp1.at(iswp).at(i_level); + uint64_t* dump_ijkm1 = vv_i__j__km1.at(iswp).at(i_level); + + // load data of all nodes in one level on temporal aligned array + for (int _i_vec = 0; _i_vec < num_iter; _i_vec++) { + int i_vec = _i_vec * NSIMD; + + pg = svwhilelt_b64(i_vec, n_nodes); + + v_c__ = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_ijk[i_vec]); + v_p__ = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_ip1jk[i_vec]); + v_m__ = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_im1jk[i_vec]); + v__p_ = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_ijp1k[i_vec]); + v__m_ = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_ijm1k[i_vec]); + v___p = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_ijkp1[i_vec]); + v___m = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_ijkm1[i_vec]); + + // load v_iip, v_jjt, v_kkr + v_iip_ = svld1_vnum_f64(pg, v_iip , _i_vec); + v_jjt_ = svld1_vnum_f64(pg, v_jjt , _i_vec); + v_kkr_ = svld1_vnum_f64(pg, v_kkr , _i_vec); + v_fac_a_ = svld1_vnum_f64(pg, v_fac_a , _i_vec); + v_fac_b_ = svld1_vnum_f64(pg, v_fac_b , _i_vec); + v_fac_c_ = svld1_vnum_f64(pg, v_fac_c , _i_vec); + v_fac_f_ = svld1_vnum_f64(pg, v_fac_f , _i_vec); + v_T0v_ = svld1_vnum_f64(pg, v_T0v , _i_vec); + v_T0r_ = svld1_vnum_f64(pg, v_T0r , _i_vec); + v_T0t_ = svld1_vnum_f64(pg, v_T0t , _i_vec); + v_T0p_ = svld1_vnum_f64(pg, v_T0p , _i_vec); + v_fun_ = svld1_vnum_f64(pg, v_fun , _i_vec); + v_change_= svld1_vnum_f64(pg, v_change, _i_vec); + + // loop over all nodes in one level + vect_stencil_1st_pre_simd(pg, v_iip_, v_jjt_, v_kkr_, \ + v_c__, \ + v_p__, v_m__, v__p_, v__m_, v___p, v___m, \ + v_pp1, v_pp2, v_pt1, v_pt2, v_pr1, v_pr2, \ + v_DP_inv, v_DT_inv, v_DR_inv, \ + v_DP_inv_half, v_DT_inv_half, v_DR_inv_half, \ + loc_I, loc_J, loc_K); + + // calculate updated value on c + vect_stencil_1st_3rd_apre_simd(pg, v_c__, v_fac_a_, v_fac_b_, v_fac_c_, v_fac_f_, \ + v_T0v_, v_T0p_, v_T0t_, v_T0r_, v_fun_, v_change_, \ + v_pp1, v_pp2, v_pt1, v_pt2, v_pr1, v_pr2, \ + v_DP_inv, v_DT_inv, v_DR_inv); + + // store v_c__ to dump_c__ + svst1_scatter_u64index_f64(pg, grid.tau_loc, svld1_u64(pg,&dump_ijk[i_vec]), v_c__); + + + } // end of i_vec loop + + // mpi synchronization + synchronize_all_sub(); + + } // end of i_level loop + +#endif // ifndef USE_SIMD + + } // end of if !use_gpu + else { // if use_gpu + +#if defined USE_CUDA + + // copy tau to device + cuda_copy_tau_to_device(gpu_grid, grid.tau_loc); + + // run iteration + cuda_run_iteration_forward(gpu_grid, iswp); + + // copy tau to host + cuda_copy_tau_to_host(gpu_grid, grid.tau_loc); + +#else // !defiend USE_CUDA + // exit code + std::cout << "Error: USE_CUDA is not defined" << std::endl; + exit(1); +#endif + + } // end of if use_gpu + + // update boundary + if (subdom_main) { + calculate_boundary_nodes(grid); + } +} + + +// ERROR index!!!!!!!!!!!!! +Iterator_level_3rd_order::Iterator_level_3rd_order(InputParams& IP, Grid& grid, Source& src, IO_utils& io, const std::string& src_name, bool first_init, bool is_teleseismic_in, bool is_second_run_in) \ + : Iterator_level(IP, grid, src, io, src_name, first_init, is_teleseismic_in, is_second_run_in) { + // initialization is done in the base class +} + + +void Iterator_level_3rd_order::do_sweep(int iswp, Grid& grid, InputParams& IP){ + + if(!use_gpu) { + +#if !defined USE_SIMD + + // set sweep direction + set_sweep_direction(iswp); + + int iip, jjt, kkr; + int n_levels = ijk_for_this_subproc.size(); + + for (int i_level = 0; i_level < n_levels; i_level++) { + size_t n_nodes = ijk_for_this_subproc[i_level].size(); + + for (size_t i_node = 0; i_node < n_nodes; i_node++) { + + V2I(ijk_for_this_subproc[i_level][i_node], iip, jjt, kkr); + + if (r_dirc < 0) kkr = nr-kkr; //kk-1; + else kkr = kkr-1; //nr-kk; + if (t_dirc < 0) jjt = nt-jjt; //jj-1; + else jjt = jjt-1; //nt-jj; + if (p_dirc < 0) iip = np-iip; //ii-1; + else iip = iip-1; //np-ii; + + // + // calculate stencils + // + if (grid.is_changed[I2V(iip, jjt, kkr)]) { + calculate_stencil_3rd_order(grid, iip, jjt, kkr); + } // is_changed == true + } // end ijk + + // mpi synchronization + synchronize_all_sub(); + + } // end loop i_level + +#elif USE_AVX512 || USE_AVX + + // + __mT v_DP_inv = _mmT_set1_pT(1.0/dp); + __mT v_DT_inv = _mmT_set1_pT(1.0/dt); + __mT v_DR_inv = _mmT_set1_pT(1.0/dr); + __mT v_DP_inv_half = _mmT_set1_pT(1.0/dp*0.5); + __mT v_DT_inv_half = _mmT_set1_pT(1.0/dt*0.5); + __mT v_DR_inv_half = _mmT_set1_pT(1.0/dr*0.5); + + // store stencil coefs + __mT v_pp1 = _mmT_set1_pT(0.0); + __mT v_pp2 = _mmT_set1_pT(0.0); + __mT v_pt1 = _mmT_set1_pT(0.0); + __mT v_pt2 = _mmT_set1_pT(0.0); + __mT v_pr1 = _mmT_set1_pT(0.0); + __mT v_pr2 = _mmT_set1_pT(0.0); + + // measure time for only loop + //auto start = std::chrono::high_resolution_clock::now(); + + int n_levels = ijk_for_this_subproc.size(); + for (int i_level = 0; i_level < n_levels; i_level++) { + int n_nodes = ijk_for_this_subproc.at(i_level).size(); + //std::cout << "n_nodes = " << n_nodes << std::endl; + + int num_iter = n_nodes / NSIMD + (n_nodes % NSIMD == 0 ? 0 : 1); + + // make alias to preloaded data + __mT* v_iip = (__mT*) vv_iip.at(iswp).at(i_level); + __mT* v_jjt = (__mT*) vv_jjt.at(iswp).at(i_level); + __mT* v_kkr = (__mT*) vv_kkr.at(iswp).at(i_level); + + __mT* v_fac_a = (__mT*) vv_fac_a.at(iswp).at(i_level); + __mT* v_fac_b = (__mT*) vv_fac_b.at(iswp).at(i_level); + __mT* v_fac_c = (__mT*) vv_fac_c.at(iswp).at(i_level); + __mT* v_fac_f = (__mT*) vv_fac_f.at(iswp).at(i_level); + __mT* v_T0v = (__mT*) vv_T0v.at(iswp).at(i_level); + __mT* v_T0r = (__mT*) vv_T0r.at(iswp).at(i_level); + __mT* v_T0t = (__mT*) vv_T0t.at(iswp).at(i_level); + __mT* v_T0p = (__mT*) vv_T0p.at(iswp).at(i_level); + __mT* v_fun = (__mT*) vv_fun.at(iswp).at(i_level); + __mT* v_change = (__mT*) vv_change.at(iswp).at(i_level); + + // alias for dumped index + int* dump_ijk = vv_i__j__k__.at(iswp).at(i_level); + int* dump_ip1jk = vv_ip1j__k__.at(iswp).at(i_level); + int* dump_im1jk = vv_im1j__k__.at(iswp).at(i_level); + int* dump_ijp1k = vv_i__jp1k__.at(iswp).at(i_level); + int* dump_ijm1k = vv_i__jm1k__.at(iswp).at(i_level); + int* dump_ijkp1 = vv_i__j__kp1.at(iswp).at(i_level); + int* dump_ijkm1 = vv_i__j__km1.at(iswp).at(i_level); + int* dump_ip2jk = vv_ip2j__k__.at(iswp).at(i_level); + int* dump_im2jk = vv_im2j__k__.at(iswp).at(i_level); + int* dump_ijp2k = vv_i__jp2k__.at(iswp).at(i_level); + int* dump_ijm2k = vv_i__jm2k__.at(iswp).at(i_level); + int* dump_ijkp2 = vv_i__j__kp2.at(iswp).at(i_level); + int* dump_ijkm2 = vv_i__j__km2.at(iswp).at(i_level); ///////////////////////////////////// + + // load data of all nodes in one level on temporal aligned array + for (int _i_vec = 0; _i_vec < num_iter; _i_vec++) { + + int i_vec = _i_vec * NSIMD; + __mT v_c__ = load_mem_gen_to_mTd(grid.tau_loc, &dump_ijk [i_vec]); + __mT v_p__ = load_mem_gen_to_mTd(grid.tau_loc, &dump_ip1jk[i_vec]); + __mT v_m__ = load_mem_gen_to_mTd(grid.tau_loc, &dump_im1jk[i_vec]); + __mT v__p_ = load_mem_gen_to_mTd(grid.tau_loc, &dump_ijp1k[i_vec]); + __mT v__m_ = load_mem_gen_to_mTd(grid.tau_loc, &dump_ijm1k[i_vec]); + __mT v___p = load_mem_gen_to_mTd(grid.tau_loc, &dump_ijkp1[i_vec]); + __mT v___m = load_mem_gen_to_mTd(grid.tau_loc, &dump_ijkm1[i_vec]); + __mT v_pp____ = load_mem_gen_to_mTd(grid.tau_loc, &dump_ip2jk[i_vec]); + __mT v_mm____ = load_mem_gen_to_mTd(grid.tau_loc, &dump_im2jk[i_vec]); + __mT v___pp__ = load_mem_gen_to_mTd(grid.tau_loc, &dump_ijp2k[i_vec]); + __mT v___mm__ = load_mem_gen_to_mTd(grid.tau_loc, &dump_ijm2k[i_vec]); + __mT v_____pp = load_mem_gen_to_mTd(grid.tau_loc, &dump_ijkp2[i_vec]); + __mT v_____mm = load_mem_gen_to_mTd(grid.tau_loc, &dump_ijkm2[i_vec]); + + // loop over all nodes in one level + vect_stencil_3rd_pre_simd(v_iip[_i_vec], v_jjt[_i_vec], v_kkr[_i_vec], \ + v_c__, \ + v_p__, v_m__, v__p_, v__m_, v___p, v___m, \ + v_pp____, v_mm____, v___pp__, v___mm__, v_____pp, v_____mm, \ + v_pp1, v_pp2, v_pt1, v_pt2, v_pr1, v_pr2, \ + v_DP_inv, v_DT_inv, v_DR_inv, \ + v_DP_inv_half, v_DT_inv_half, v_DR_inv_half, \ + loc_I, loc_J, loc_K); + + // calculate updated value on c + vect_stencil_1st_3rd_apre_simd(v_c__, v_fac_a[_i_vec], v_fac_b[_i_vec], v_fac_c[_i_vec], v_fac_f[_i_vec], \ + v_T0v[_i_vec], v_T0p[_i_vec] , v_T0t[_i_vec] , v_T0r[_i_vec] , v_fun[_i_vec] , v_change[_i_vec], \ + v_pp1, v_pp2, v_pt1, v_pt2, v_pr1, v_pr2, \ + v_DP_inv, v_DT_inv, v_DR_inv); + + // store v_c__ to dump_c__ + _mmT_store_pT(dump_c__, v_c__); + + + for (int i = 0; i < NSIMD; i++) { + if(i_vec+i>=n_nodes) break; + + grid.tau_loc[dump_ijk[i_vec+i]] = dump_c__[i]; + } + + + + } // end of i_vec loop + + // mpi synchronization + synchronize_all_sub(); // dead lock + + } // end of i_level loop + +#elif USE_ARM_SVE + // + svbool_t pg; + + __mT v_DP_inv = svdup_f64(1.0/dp); + __mT v_DT_inv = svdup_f64(1.0/dt); + __mT v_DR_inv = svdup_f64(1.0/dr); + __mT v_DP_inv_half = svdup_f64(1.0/dp*0.5); + __mT v_DT_inv_half = svdup_f64(1.0/dt*0.5); + __mT v_DR_inv_half = svdup_f64(1.0/dr*0.5); + + // store stencil coefs + __mT v_pp1; + __mT v_pp2; + __mT v_pt1; + __mT v_pt2; + __mT v_pr1; + __mT v_pr2; + + __mT v_c__ ; + __mT v_p__ ; + __mT v_m__ ; + __mT v__p_ ; + __mT v__m_ ; + __mT v___p ; + __mT v___m ; + __mT v_pp____; + __mT v_mm____; + __mT v___pp__; + __mT v___mm__; + __mT v_____pp; + __mT v_____mm; + + __mT v_iip_ ; + __mT v_jjt_ ; + __mT v_kkr_ ; + __mT v_fac_a_ ; + __mT v_fac_b_ ; + __mT v_fac_c_ ; + __mT v_fac_f_ ; + __mT v_T0v_ ; + __mT v_T0r_ ; + __mT v_T0t_ ; + __mT v_T0p_ ; + __mT v_fun_ ; + __mT v_change_; + + + // measure time for only loop + //auto start = std::chrono::high_resolution_clock::now(); + + int n_levels = ijk_for_this_subproc.size(); + for (int i_level = 0; i_level < n_levels; i_level++) { + int n_nodes = ijk_for_this_subproc.at(i_level).size(); + //std::cout << "n_nodes = " << n_nodes << std::endl; + + int num_iter = n_nodes / NSIMD + (n_nodes % NSIMD == 0 ? 0 : 1); + + // make alias to preloaded data + CUSTOMREAL* v_iip = vv_iip.at(iswp).at(i_level); + CUSTOMREAL* v_jjt = vv_jjt.at(iswp).at(i_level); + CUSTOMREAL* v_kkr = vv_kkr.at(iswp).at(i_level); + + CUSTOMREAL* v_fac_a = vv_fac_a.at(iswp).at(i_level); + CUSTOMREAL* v_fac_b = vv_fac_b.at(iswp).at(i_level); + CUSTOMREAL* v_fac_c = vv_fac_c.at(iswp).at(i_level); + CUSTOMREAL* v_fac_f = vv_fac_f.at(iswp).at(i_level); + CUSTOMREAL* v_T0v = vv_T0v.at(iswp).at(i_level); + CUSTOMREAL* v_T0r = vv_T0r.at(iswp).at(i_level); + CUSTOMREAL* v_T0t = vv_T0t.at(iswp).at(i_level); + CUSTOMREAL* v_T0p = vv_T0p.at(iswp).at(i_level); + CUSTOMREAL* v_fun = vv_fun.at(iswp).at(i_level); + CUSTOMREAL* v_change = vv_change.at(iswp).at(i_level); + + // alias for dumped index + uint64_t* dump_ijk = vv_i__j__k__.at(iswp).at(i_level); + uint64_t* dump_ip1jk = vv_ip1j__k__.at(iswp).at(i_level); + uint64_t* dump_im1jk = vv_im1j__k__.at(iswp).at(i_level); + uint64_t* dump_ijp1k = vv_i__jp1k__.at(iswp).at(i_level); + uint64_t* dump_ijm1k = vv_i__jm1k__.at(iswp).at(i_level); + uint64_t* dump_ijkp1 = vv_i__j__kp1.at(iswp).at(i_level); + uint64_t* dump_ijkm1 = vv_i__j__km1.at(iswp).at(i_level); + uint64_t* dump_ip2jk = vv_ip2j__k__.at(iswp).at(i_level); + uint64_t* dump_im2jk = vv_im2j__k__.at(iswp).at(i_level); + uint64_t* dump_ijp2k = vv_i__jp2k__.at(iswp).at(i_level); + uint64_t* dump_ijm2k = vv_i__jm2k__.at(iswp).at(i_level); + uint64_t* dump_ijkp2 = vv_i__j__kp2.at(iswp).at(i_level); + uint64_t* dump_ijkm2 = vv_i__j__km2.at(iswp).at(i_level); + + // load data of all nodes in one level on temporal aligned array + for (int _i_vec = 0; _i_vec < num_iter; _i_vec++) { + int i_vec = _i_vec * NSIMD; + + pg = svwhilelt_b64(i_vec, n_nodes); + + v_c__ = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_ijk [i_vec]); + v_p__ = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_ip1jk[i_vec]); + v_m__ = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_im1jk[i_vec]); + v__p_ = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_ijp1k[i_vec]); + v__m_ = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_ijm1k[i_vec]); + v___p = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_ijkp1[i_vec]); + v___m = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_ijkm1[i_vec]); + v_pp____ = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_ip2jk[i_vec]); + v_mm____ = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_im2jk[i_vec]); + v___pp__ = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_ijp2k[i_vec]); + v___mm__ = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_ijm2k[i_vec]); + v_____pp = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_ijkp2[i_vec]); + v_____mm = load_mem_gen_to_mTd(pg, grid.tau_loc, &dump_ijkm2[i_vec]); + + // load v_iip, v_jjt, v_kkr + v_iip_ = svld1_vnum_f64(pg, v_iip , _i_vec); + v_jjt_ = svld1_vnum_f64(pg, v_jjt , _i_vec); + v_kkr_ = svld1_vnum_f64(pg, v_kkr , _i_vec); + v_fac_a_ = svld1_vnum_f64(pg, v_fac_a , _i_vec); + v_fac_b_ = svld1_vnum_f64(pg, v_fac_b , _i_vec); + v_fac_c_ = svld1_vnum_f64(pg, v_fac_c , _i_vec); + v_fac_f_ = svld1_vnum_f64(pg, v_fac_f , _i_vec); + v_T0v_ = svld1_vnum_f64(pg, v_T0v , _i_vec); + v_T0r_ = svld1_vnum_f64(pg, v_T0r , _i_vec); + v_T0t_ = svld1_vnum_f64(pg, v_T0t , _i_vec); + v_T0p_ = svld1_vnum_f64(pg, v_T0p , _i_vec); + v_fun_ = svld1_vnum_f64(pg, v_fun , _i_vec); + v_change_= svld1_vnum_f64(pg, v_change, _i_vec); + + // loop over all nodes in one level + vect_stencil_3rd_pre_simd(pg, v_iip_, v_jjt_, v_kkr_, \ + v_c__, \ + v_p__, v_m__, v__p_, v__m_, v___p, v___m, \ + v_pp____, v_mm____, v___pp__, v___mm__, v_____pp, v_____mm, \ + v_pp1, v_pp2, v_pt1, v_pt2, v_pr1, v_pr2, \ + v_DP_inv, v_DT_inv, v_DR_inv, \ + v_DP_inv_half, v_DT_inv_half, v_DR_inv_half, \ + loc_I, loc_J, loc_K); + + //// calculate updated value on c + vect_stencil_1st_3rd_apre_simd(pg, v_c__, v_fac_a_, v_fac_b_, v_fac_c_, v_fac_f_, \ + v_T0v_, v_T0p_, v_T0t_, v_T0r_, v_fun_, v_change_, \ + v_pp1, v_pp2, v_pt1, v_pt2, v_pr1, v_pr2, \ + v_DP_inv, v_DT_inv, v_DR_inv); + + // store v_c__ to dump_c__ + svst1_scatter_u64index_f64(pg, grid.tau_loc, svld1_u64(pg,&dump_ijk[i_vec]), v_c__); + } // end of i_vec loop + + // mpi synchronization + synchronize_all_sub(); + + } // end of i_level loop + +#endif // ifndef USE_SIMD + + } // end of if !use_gpu + else { // if use_gpu + +#if defined USE_CUDA + + // copy tau to device + cuda_copy_tau_to_device(gpu_grid, grid.tau_loc); + + // run iteration + cuda_run_iteration_forward(gpu_grid, iswp); + + // copy tau to host + cuda_copy_tau_to_host(gpu_grid, grid.tau_loc); + +#else // !defiend USE_CUDA + // exit code + std::cout << "Error: USE_CUDA is not defined" << std::endl; + exit(1); +#endif + + } // end of if use_gpu + + // update boundary + if (subdom_main) { + calculate_boundary_nodes(grid); + } + +} + + +Iterator_level_1st_order_upwind::Iterator_level_1st_order_upwind(InputParams& IP, Grid& grid, Source& src, IO_utils& io, const std::string& src_name, bool first_init, bool is_teleseismic_in, bool is_second_run_in) \ + : Iterator_level(IP, grid, src, io, src_name, first_init, is_teleseismic_in, is_second_run_in) { + // initialization is done in the base class +} + +void Iterator_level_1st_order_upwind::do_sweep(int iswp, Grid& grid, InputParams& IP){ + + // set sweep direction + set_sweep_direction(iswp); + + int iip, jjt, kkr; + int n_levels = ijk_for_this_subproc.size(); + + for (int i_level = 0; i_level < n_levels; i_level++) { + size_t n_nodes = ijk_for_this_subproc[i_level].size(); + + for (size_t i_node = 0; i_node < n_nodes; i_node++) { + + V2I(ijk_for_this_subproc[i_level][i_node], iip, jjt, kkr); + + if (r_dirc < 0) kkr = nr-1-kkr; + else kkr = kkr; + if (t_dirc < 0) jjt = nt-1-jjt; + else jjt = jjt; + if (p_dirc < 0) iip = np-1-iip; + else iip = iip; + + // + // calculate stencils + // + if (grid.is_changed[I2V(iip, jjt, kkr)]) { + calculate_stencil_1st_order_upwind(grid, iip, jjt, kkr); + } // is_changed == true + } // end ijk + + // mpi synchronization + synchronize_all_sub(); + + } // end loop i_level +} + +// ERROR index!!!!!!!!!!!!! +Iterator_level_1st_order_tele::Iterator_level_1st_order_tele(InputParams& IP, Grid& grid, Source& src, IO_utils& io, const std::string& src_name, bool first_init, bool is_teleseismic_in, bool is_second_run_in) \ + : Iterator_level_tele(IP, grid, src, io, src_name, first_init, is_teleseismic_in, is_second_run_in) { + // initialization is done in the base class +} + +void Iterator_level_1st_order_tele::do_sweep(int iswp, Grid& grid, InputParams& IP){ + + if(!use_gpu) { + +//#if !defined USE_SIMD + + // set sweep direction + set_sweep_direction(iswp); + + int iip, jjt, kkr; + int n_levels = ijk_for_this_subproc.size(); + + for (int i_level = 0; i_level < n_levels; i_level++) { + size_t n_nodes = ijk_for_this_subproc[i_level].size(); + + for (size_t i_node = 0; i_node < n_nodes; i_node++) { + + V2I(ijk_for_this_subproc[i_level][i_node], iip, jjt, kkr); + + if (r_dirc < 0) kkr = nr-kkr-1; + //else kkr = kkr; + if (t_dirc < 0) jjt = nt-jjt-1; + //else jjt = jjt; + if (p_dirc < 0) iip = np-iip-1; + //else iip = iip; + + // + // calculate stencils + // + if (iip != 0 && iip != np-1 && jjt != 0 && jjt != nt-1 && kkr != 0 && kkr != nr-1) { + // calculate stencils + calculate_stencil_1st_order_tele(grid, iip, jjt, kkr); + } else { + // update boundary + calculate_boundary_nodes_tele(grid, iip, jjt, kkr); + } + } // end ijk + + // mpi synchronization + synchronize_all_sub(); + + } // end loop i_level + +/* +#elif USE_AVX512 || USE_AVX + + // preload constants + __mT v_DP_inv = _mmT_set1_pT(1.0/dp); + __mT v_DT_inv = _mmT_set1_pT(1.0/dt); + __mT v_DR_inv = _mmT_set1_pT(1.0/dr); + __mT v_DP_inv_half = _mmT_set1_pT(1.0/dp*0.5); + __mT v_DT_inv_half = _mmT_set1_pT(1.0/dt*0.5); + __mT v_DR_inv_half = _mmT_set1_pT(1.0/dr*0.5); + + // store stencil coefs + __mT v_pp1; + __mT v_pp2; + __mT v_pt1; + __mT v_pt2; + __mT v_pr1; + __mT v_pr2; + + int n_levels = ijk_for_this_subproc.size(); + for (int i_level = 0; i_level < n_levels; i_level++) { + int n_nodes = ijk_for_this_subproc.at(i_level).size(); + + int num_iter = n_nodes / NSIMD + (n_nodes % NSIMD == 0 ? 0 : 1); + + // make alias to preloaded data + __mT* v_iip = (__mT*) vv_iip.at(iswp).at(i_level); + __mT* v_jjt = (__mT*) vv_jjt.at(iswp).at(i_level); + __mT* v_kkr = (__mT*) vv_kkr.at(iswp).at(i_level); + + __mT* v_fac_a = (__mT*) vv_fac_a.at(iswp).at(i_level); + __mT* v_fac_b = (__mT*) vv_fac_b.at(iswp).at(i_level); + __mT* v_fac_c = (__mT*) vv_fac_c.at(iswp).at(i_level); + __mT* v_fac_f = (__mT*) vv_fac_f.at(iswp).at(i_level); + __mT* v_fun = (__mT*) vv_fun.at(iswp).at(i_level); + __mT* v_change = (__mT*) vv_change.at(iswp).at(i_level); + + // alias for dumped index + int* dump_ijk = vv_i__j__k__.at(iswp).at(i_level); + int* dump_ip1jk = vv_ip1j__k__.at(iswp).at(i_level); + int* dump_im1jk = vv_im1j__k__.at(iswp).at(i_level); + int* dump_ijp1k = vv_i__jp1k__.at(iswp).at(i_level); + int* dump_ijm1k = vv_i__jm1k__.at(iswp).at(i_level); + int* dump_ijkp1 = vv_i__j__kp1.at(iswp).at(i_level); + int* dump_ijkm1 = vv_i__j__km1.at(iswp).at(i_level); + int* dump_ip2jk = vv_ip2j__k__.at(iswp).at(i_level); + int* dump_im2jk = vv_im2j__k__.at(iswp).at(i_level); + int* dump_ijp2k = vv_i__jp2k__.at(iswp).at(i_level); + int* dump_ijm2k = vv_i__jm2k__.at(iswp).at(i_level); + int* dump_ijkp2 = vv_i__j__kp2.at(iswp).at(i_level); + int* dump_ijkm2 = vv_i__j__km2.at(iswp).at(i_level); + + // load data of all nodes in one level on temporal aligned array + for (int _i_vec = 0; _i_vec < num_iter; _i_vec++) { + + int i_vec = _i_vec * NSIMD; + __mT v_c__ = load_mem_gen_to_mTd(grid.T_loc, &dump_ijk[i_vec]); + __mT v_p__ = load_mem_gen_to_mTd(grid.T_loc, &dump_ip1jk[i_vec]); + __mT v_m__ = load_mem_gen_to_mTd(grid.T_loc, &dump_im1jk[i_vec]); + __mT v__p_ = load_mem_gen_to_mTd(grid.T_loc, &dump_ijp1k[i_vec]); + __mT v__m_ = load_mem_gen_to_mTd(grid.T_loc, &dump_ijm1k[i_vec]); + __mT v___p = load_mem_gen_to_mTd(grid.T_loc, &dump_ijkp1[i_vec]); + __mT v___m = load_mem_gen_to_mTd(grid.T_loc, &dump_ijkm1[i_vec]); + __mT v_pp____ = load_mem_gen_to_mTd(grid.T_loc, &dump_ip2jk[i_vec]); + __mT v_mm____ = load_mem_gen_to_mTd(grid.T_loc, &dump_im2jk[i_vec]); + __mT v___pp__ = load_mem_gen_to_mTd(grid.T_loc, &dump_ijp2k[i_vec]); + __mT v___mm__ = load_mem_gen_to_mTd(grid.T_loc, &dump_ijm2k[i_vec]); + __mT v_____pp = load_mem_gen_to_mTd(grid.T_loc, &dump_ijkp2[i_vec]); + __mT v_____mm = load_mem_gen_to_mTd(grid.T_loc, &dump_ijkm2[i_vec]); + + + // loop over all nodes in one level (this routine for teleseismic is same with that for local) + vect_stencil_1st_pre_simd(v_iip[_i_vec], v_jjt[_i_vec], v_kkr[_i_vec], \ + v_c__, \ + v_p__, v_m__, v__p_, v__m_, v___p, v___m, \ + v_pp1, v_pp2, v_pt1, v_pt2, v_pr1, v_pr2, \ + v_DP_inv, v_DT_inv, v_DR_inv, \ + v_DP_inv_half, v_DT_inv_half, v_DR_inv_half, \ + loc_I, loc_J, loc_K); + + // calculate updated value on c + vect_stencil_1st_3rd_apre_simd_tele(v_c__, v_fac_a[_i_vec], v_fac_b[_i_vec], v_fac_c[_i_vec], v_fac_f[_i_vec], \ + v_fun[_i_vec], v_change[_i_vec], \ + v_pp1, v_pp2, v_pt1, v_pt2, v_pr1, v_pr2, \ + v_DP_inv, v_DT_inv, v_DR_inv); + + // calculate the values on boudaries + calculate_boundary_nodes_tele_simd(v_iip[_i_vec], v_jjt[_i_vec], v_kkr[_i_vec], \ + v_c__, \ + v_p__, v_m__, v__p_, v__m_, v___p, v___m, \ + v_pp____, v_mm____, v___pp__, v___mm__, v_____pp, v_____mm, \ + v_change[_i_vec], \ + loc_I, loc_J, loc_K); + + // store v_c__ to dump_c__ + _mmT_store_pT(dump_c__, v_c__); + + for (int i = 0; i < NSIMD; i++) { + if(i_vec+i>=n_nodes) break; + + grid.tau_loc[dump_ijk[i_vec+i]] = dump_c__[i]; + } + + + + } // end of i_vec loop + + // mpi synchronization + synchronize_all_sub(); + + } // end of i_level loop + + + +#elif USE_ARM_SVE + +#endif // ifndef USE_SIMD +*/ + + } // end of if !use_gpu + else { // if use_gpu + +#if defined USE_CUDA + + //// copy tau to device + //cuda_copy_tau_to_device(gpu_grid, grid.tau_loc); + + //// run iteration + //cuda_run_iteration_forward_tele(gpu_grid, iswp); + + //// copy tau to host + //cuda_copy_tau_to_host(gpu_grid, grid.tau_loc); + +#else // !defiend USE_CUDA + // exit code + std::cout << "Error: USE_CUDA is not defined" << std::endl; + exit(1); +#endif + + } // end of if use_gpu + + +} + +// ERROR index!!!!!!!!!!!!! +Iterator_level_3rd_order_tele::Iterator_level_3rd_order_tele(InputParams& IP, Grid& grid, Source& src, IO_utils& io, const std::string& src_name, bool first_init, bool is_teleseismic_in, bool is_second_run_in) \ + : Iterator_level_tele(IP, grid, src, io, src_name, first_init, is_teleseismic_in, is_second_run_in) { + // initialization is done in the base class +} + + +void Iterator_level_3rd_order_tele::do_sweep(int iswp, Grid& grid, InputParams& IP){ + + if(!use_gpu) { + +//#if !defined USE_SIMD + + // set sweep direction + set_sweep_direction(iswp); + + int iip, jjt, kkr; + int n_levels = ijk_for_this_subproc.size(); + + for (int i_level = 0; i_level < n_levels; i_level++) { + size_t n_nodes = ijk_for_this_subproc[i_level].size(); + + for (size_t i_node = 0; i_node < n_nodes; i_node++) { + + V2I(ijk_for_this_subproc[i_level][i_node], iip, jjt, kkr); + + if (r_dirc < 0) kkr = nr-kkr-1; + //else kkr = kkr; + if (t_dirc < 0) jjt = nt-jjt-1; + //else jjt = jjt; + if (p_dirc < 0) iip = np-iip-1; + //else iip = iip; + + // + // calculate stencils + // + if (iip != 0 && iip != np-1 && jjt != 0 && jjt != nt-1 && kkr != 0 && kkr != nr-1) { + // calculate stencils + calculate_stencil_3rd_order_tele(grid, iip, jjt, kkr); + } else { + // update boundary + calculate_boundary_nodes_tele(grid, iip, jjt, kkr); + } + } // end ijk + + // mpi synchronization + synchronize_all_sub(); /////////////////////////////////////// + + } // end loop i_level + +//#elif USE_AVX512 || USE_AVX +// +//#elif USE_ARM_SVE +// +//#endif // ifndef USE_SIMD + + } // end of if !use_gpu + else { // if use_gpu + +#if defined USE_CUDA + + //// copy tau to device + //cuda_copy_tau_to_device(gpu_grid, grid.tau_loc); + + //// run iteration + //cuda_run_iteration_forward_tele(gpu_grid, iswp); + + //// copy tau to host + //cuda_copy_tau_to_host(gpu_grid, grid.tau_loc); + +#else // !defiend USE_CUDA + // exit code + std::cout << "Error: USE_CUDA is not defined" << std::endl; + exit(1); +#endif + + } // end of if use_gpu + + +} + + +Iterator_level_1st_order_upwind_tele::Iterator_level_1st_order_upwind_tele(InputParams& IP, Grid& grid, Source& src, IO_utils& io, const std::string& src_name, bool first_init, bool is_teleseismic_in, bool is_second_run_in) \ + : Iterator_level_tele(IP, grid, src, io, src_name, first_init, is_teleseismic_in, is_second_run_in) { + // initialization is done in the base class +} + +void Iterator_level_1st_order_upwind_tele::do_sweep(int iswp, Grid& grid, InputParams& IP){ + + // set sweep direction + set_sweep_direction(iswp); + + int iip, jjt, kkr; + int n_levels = ijk_for_this_subproc.size(); + + for (int i_level = 0; i_level < n_levels; i_level++) { + size_t n_nodes = ijk_for_this_subproc[i_level].size(); + + for (size_t i_node = 0; i_node < n_nodes; i_node++) { + + V2I(ijk_for_this_subproc[i_level][i_node], iip, jjt, kkr); + + if (r_dirc < 0) kkr = nr-1-kkr; + else kkr = kkr; + if (t_dirc < 0) jjt = nt-1-jjt; + else jjt = jjt; + if (p_dirc < 0) iip = np-1-iip; + else iip = iip; + + // + // calculate stencils + // + // if (iip != 0 && iip != np-1 && jjt != 0 && jjt != nt-1 && kkr != 0) { // top layer is not fixed, otherwise, the top layer will be 2000 + // calculate_stencil_1st_order_upwind_tele(grid, iip, jjt, kkr); // no need to consider the boundary for upwind scheme + // } + + calculate_stencil_1st_order_upwind_tele(grid, iip, jjt, kkr); + } // end ijk + + // mpi synchronization + synchronize_all_sub(); + + } // end loop i_level +} diff --git a/src/oneD_inversion.cpp b/src/oneD_inversion.cpp new file mode 100644 index 0000000..15c6efc --- /dev/null +++ b/src/oneD_inversion.cpp @@ -0,0 +1,1367 @@ +#include "oneD_inversion.h" + +// ############################################### +// ######## OneDInversion class ########## +// ############################################### + +OneDInversion::OneDInversion(InputParams& IP, Grid& grid) { + // constructor + // std::cout << "OneDInversion constructor" << std::endl; + + // generate 2D mesh for forward modeling and inversion + generate_2d_mesh(IP); + + // allocate arrays (slowness, fac_a, fac_b, tau, ...) + allocate_arrays(); + + // initialize arrays (slowness, fac_a, fac_b, tau, ...) + load_1d_model(grid); +} + + +OneDInversion::~OneDInversion() { + // destructor + // std::cout << "OneDInversion destructor" << std::endl; + deallocate_arrays(); +} + + +int OneDInversion::I2V_1DINV(const int& it, const int& ir) { + // convert 2D index to 1D index + return ir*nt_1dinv+it; +} + + +void OneDInversion::generate_2d_mesh(InputParams& IP) { + // generate 2D mesh for forward modeling and inversion + // std::cout << "generate_2d_mesh" << std::endl; + + // obtain the maximum epicenter distance + CUSTOMREAL tmin_3d = IP.get_min_lat(); + CUSTOMREAL tmax_3d = IP.get_max_lat(); + CUSTOMREAL pmin_3d = IP.get_min_lon(); + CUSTOMREAL pmax_3d = IP.get_max_lon(); + CUSTOMREAL rmin_3d = radius2depth(IP.get_max_dep()); + CUSTOMREAL rmax_3d = radius2depth(IP.get_min_dep()); + CUSTOMREAL max_distance; + Epicentral_distance_sphere(tmin_3d, pmin_3d, tmax_3d, pmax_3d, max_distance); + + // determine r_1dinv and t_1dinv: + // r_1dinv: from rmin_3d to rmax_3d + // t_1dinv: from -0.2*max_distance to 1.2*max_distance + // dr_1dinv = dr/2; + // dt_1dinv = dt/2; + dr_1dinv = (rmax_3d-rmin_3d)/(ngrid_k-1)/2; + dt_1dinv = (tmax_3d-tmin_3d)/(ngrid_j-1)/2; + nr_1dinv = std::floor((rmax_3d-rmin_3d)/dr_1dinv)+1; + nt_1dinv = std::floor(1.4*max_distance/dt_1dinv)+1; + // initialize arrays + r_1dinv = allocateMemory(nr_1dinv, 4000); + t_1dinv = allocateMemory(nt_1dinv, 4001); + // fill arrays + for(int i=0; i(nr_1dinv*nt_1dinv, 4000); + fac_a_1dinv = allocateMemory(nr_1dinv*nt_1dinv, 4001); + fac_b_1dinv = allocateMemory(nr_1dinv*nt_1dinv, 4002); + + // parameters on grid nodes (for eikonal solver and adjoint solver) + tau_1dinv = allocateMemory(nr_1dinv*nt_1dinv, 4003); + tau_old_1dinv = allocateMemory(nr_1dinv*nt_1dinv, 4004); + T_1dinv = allocateMemory(nr_1dinv*nt_1dinv, 4005); + Tadj_1dinv = allocateMemory(nr_1dinv*nt_1dinv, 4006); + Tadj_density_1dinv = allocateMemory(nr_1dinv*nt_1dinv, 4006); + T0v_1dinv = allocateMemory(nr_1dinv*nt_1dinv, 4007); + T0r_1dinv = allocateMemory(nr_1dinv*nt_1dinv, 4008); + T0t_1dinv = allocateMemory(nr_1dinv*nt_1dinv, 4009); + is_changed_1dinv = allocateMemory(nr_1dinv*nt_1dinv, 4010); + delta_1dinv = allocateMemory(nr_1dinv*nt_1dinv, 4011); + + // parameters on grid nodes (for inversion) + Ks_1dinv = allocateMemory(nr_1dinv, 4011); + Ks_density_1dinv = allocateMemory(nr_1dinv, 4012); + Ks_over_Kden_1dinv = allocateMemory(nr_1dinv, 4013); + Ks_multigrid_1dinv = allocateMemory(nr_1dinv, 4014); + Ks_multigrid_previous_1dinv = allocateMemory(nr_1dinv, 4015); + +} + + +void OneDInversion::load_1d_model(Grid& grid) { + + // 1. ---------------- load slowness ---------------- + CUSTOMREAL *model_1d_input; + model_1d_input = allocateMemory(loc_K, 4000); + for(int k=0; k(nr_1dinv, 4000); + linear_interpolation_1d_sorted(grid.r_loc_1d, model_1d_input, loc_K, r_1dinv, tmp_slowness, nr_1dinv); + for (int ir = 0; ir < nr_1dinv; ir++){ + for (int it = 0; it < nt_1dinv; it++){ + slowness_1dinv[I2V_1DINV(it,ir)] = tmp_slowness[ir]; + } + } + + // 2. ---------------- initilize fac_a and fac_b ---------------- + // initialize other field + for (int ir = 0; ir < nr_1dinv; ir++){ + for (int it = 0; it < nt_1dinv; it++){ + fac_a_1dinv[I2V_1DINV(it,ir)] = _1_CR; + fac_b_1dinv[I2V_1DINV(it,ir)] = _1_CR/my_square(r_1dinv[ir]); + } + } + + delete[] model_1d_input; + delete[] tmp_slowness; +} + + +void OneDInversion::deallocate_arrays(){ + + // grid parameters + delete[] r_1dinv; + delete[] t_1dinv; + + // parameters on grid nodes (for model) + delete[] slowness_1dinv; + delete[] fac_a_1dinv; + delete[] fac_b_1dinv; + + // parameters on grid nodes (for eikonal solver and adjoint solver) + delete[] tau_1dinv; + delete[] tau_old_1dinv; + delete[] T_1dinv; + delete[] Tadj_1dinv; + delete[] Tadj_density_1dinv; + delete[] T0v_1dinv; + delete[] T0r_1dinv; + delete[] T0t_1dinv; + delete[] is_changed_1dinv; + delete[] delta_1dinv; + + // parameters on grid nodes (for inversion) + delete[] Ks_1dinv; + delete[] Ks_density_1dinv; + delete[] Ks_over_Kden_1dinv; + delete[] Ks_multigrid_1dinv; + delete[] Ks_multigrid_previous_1dinv; + +} + +// ######################################################## +// ######## main member function ######## +// ######## run_simulation_one_step_1dinv ######## +// ######## and sub functions ######## +// ######################################################## + +std::vector OneDInversion::run_simulation_one_step_1dinv(InputParams& IP, IO_utils& io, const int& i_inv) { + + // begin from here + if(world_rank == 0) + std::cout << "computing traveltime field, adjoint field and kernel for 1d inversion ..." << std::endl; + + // initialize misfit kernel + initialize_kernel_1d(); + + // iterate over sources + for (int i_src = 0; i_src < IP.n_src_this_sim_group; i_src++){ + + const std::string name_sim_src = IP.get_src_name(i_src); + + if (myrank == 0){ + std::cout << "id_sim: " << id_sim << ", calculating source (" << i_src+1 << "/" << IP.n_src_this_sim_group + << "), name: " + << name_sim_src << ", lat: " << IP.src_map[name_sim_src].lat + << ", lon: " << IP.src_map[name_sim_src].lon << ", dep: " << IP.src_map[name_sim_src].dep + << std::endl; + } + + ///////////////// run forward ////////////////// + + // solver 2d eikonal equation for the i-th source for traveltime field + eikonal_solver_2d(IP, i_src); // now traveltime field has been stored in T_1dinv. + + // calculate synthetic traveltime and adjoint source + calculate_synthetic_traveltime_and_adjoint_source(IP, i_src); // now data in data_map, the data.traveltime has been updated. + + if(IP.get_if_output_source_field() && (IP.get_if_output_in_process() || i_inv >= IP.get_max_iter_inv() - 2 || i_inv == 0)){ + // write out the traveltime field + write_T_1dinv(io, IP.get_src_name(i_src), i_inv); + } + + ///////////////// run adjoint ////////////////// + + // solver for 2d adjoint field + int adj_type = 0; // 0: adjoint_field, 1: adjoint_density + adjoint_solver_2d(IP, i_src, adj_type); // now adjoint field has been stored in Tadj_1dinv. + adj_type = 1; + adjoint_solver_2d(IP, i_src, adj_type); // now adjoint field has been stored in Tadj_density_1dinv. + + if(IP.get_if_output_source_field() && (IP.get_if_output_in_process() || i_inv >= IP.get_max_iter_inv() - 2 || i_inv == 0)){ + // write out the adjoint field + write_Tadj_1dinv(io, IP.get_src_name(i_src), i_src); + } + + // calculate event sensitivity kernel + calculate_kernel_1d(); + } + // synchronize all processes + synchronize_all_world(); + + // gather all the traveltime to the main process and distribute to all processes + // for calculating cr_dif + IP.gather_traveltimes_and_calc_syn_diff(); + + // calculate objective function and residual + Receiver rec; + std::vector obj_residual = rec.calculate_obj_and_residual(IP); + + // return current objective function value + return obj_residual; +} + + +void OneDInversion::eikonal_solver_2d(InputParams& IP, int& i_src){ + + // get the source r + const std::string name_sim_src = IP.get_src_name(i_src); + CUSTOMREAL src_r = IP.get_src_radius(name_sim_src); + // source in the 2D grid is r = src_r, t = 0; + + // initialize T0v_1dinv, T0r_1dinv, T0t_1dinv, tau_1dinv, tau_old_1dinv is_changed_1dinv + initialize_eikonal_array(src_r); + + // fast sweeping method for 2d space + FSM_2d(); +} + + +void OneDInversion::initialize_eikonal_array(CUSTOMREAL src_r) { + // discretize the src position + CUSTOMREAL src_t_dummy = _0_CR; + int src_r_i = std::floor((src_r - r_1dinv[0])/dr_1dinv); + int src_t_i = std::floor((src_t_dummy - t_1dinv[0])/dt_1dinv); + + // error of discretized source position + CUSTOMREAL src_r_err = std::min(_1_CR, (src_r - r_1dinv[src_r_i])/dr_1dinv); + CUSTOMREAL src_t_err = std::min(_1_CR, (src_t_dummy - t_1dinv[src_t_i])/dt_1dinv); + + // check precision error for floor + if (src_r_err == _1_CR) { + src_r_err = _0_CR; + src_r_i++; + } + if (src_t_err == _1_CR) { + src_t_err = _0_CR; + src_t_i++; + } + + // initialize the initial fields + CUSTOMREAL a0 = (_1_CR - src_r_err)*(_1_CR - src_t_err)*fac_a_1dinv[I2V_1DINV(src_t_i ,src_r_i )] \ + + (_1_CR - src_r_err)* src_t_err *fac_a_1dinv[I2V_1DINV(src_t_i+1,src_r_i )] \ + + src_r_err*(_1_CR - src_t_err)*fac_a_1dinv[I2V_1DINV(src_t_i ,src_r_i+1)] \ + + src_r_err* src_t_err *fac_a_1dinv[I2V_1DINV(src_t_i+1,src_r_i+1)]; + + CUSTOMREAL b0 = (_1_CR - src_r_err)*(_1_CR - src_t_err)*fac_b_1dinv[I2V_1DINV(src_t_i ,src_r_i )] \ + + (_1_CR - src_r_err)* src_t_err *fac_b_1dinv[I2V_1DINV(src_t_i+1,src_r_i )] \ + + src_r_err *(_1_CR - src_t_err)*fac_b_1dinv[I2V_1DINV(src_t_i ,src_r_i+1)] \ + + src_r_err * src_t_err *fac_b_1dinv[I2V_1DINV(src_t_i+1,src_r_i+1)]; + + CUSTOMREAL slowness0 = (_1_CR - src_r_err)*(_1_CR - src_t_err)*slowness_1dinv[I2V_1DINV(src_t_i ,src_r_i )] \ + + (_1_CR - src_r_err)* src_t_err *slowness_1dinv[I2V_1DINV(src_t_i+1,src_r_i )] \ + + src_r_err *(_1_CR - src_t_err)*slowness_1dinv[I2V_1DINV(src_t_i ,src_r_i+1)] \ + + src_r_err * src_t_err *slowness_1dinv[I2V_1DINV(src_t_i+1,src_r_i+1)]; + + + for (int ir = 0; ir < nr_1dinv; ir++){ + for (int it = 0; it < nt_1dinv; it++){ + + int irt = I2V_1DINV(it,ir); + T0v_1dinv[irt] = slowness0 * std::sqrt((_1_CR/a0) * my_square((r_1dinv[ir]-src_r)) + + _1_CR/b0 * my_square((t_1dinv[it]-src_t_dummy))); + + if (isZero(T0v_1dinv[irt])) { + T0r_1dinv[irt] = _0_CR; + T0t_1dinv[irt] = _0_CR; + } else { + T0r_1dinv[irt] = my_square(slowness0) * (_1_CR/a0 * (r_1dinv[ir]-src_r)) / T0v_1dinv[irt]; + T0t_1dinv[irt] = my_square(slowness0) * (_1_CR/b0 * (t_1dinv[it]-src_t_dummy)) / T0v_1dinv[irt]; + } + + if (std::abs((r_1dinv[ir]-src_r)/dr_1dinv) <= _1_CR-0.1 \ + && std::abs((t_1dinv[it]-src_t_dummy)/dt_1dinv) <= _1_CR-0.1) { + tau_1dinv[irt] = TAU_INITIAL_VAL; + is_changed_1dinv[irt] = false; + } else { + tau_1dinv[irt] = TAU_INF_VAL; // upwind scheme, initial tau should be large enough + is_changed_1dinv[irt] = true; + } + tau_old_1dinv[irt] = _0_CR; + } + } +} + + +void OneDInversion::FSM_2d() { + if (myrank==0) + std::cout << "Running 2d eikonal solver..." << std::endl; + + CUSTOMREAL L1_dif =1000000000; + CUSTOMREAL Linf_dif=1000000000; + + int iter = 0; + + while (true) { + + // update tau_old + std::memcpy(tau_old_1dinv, tau_1dinv, sizeof(CUSTOMREAL)*nr_1dinv*nt_1dinv); + + int r_start, r_end; + int t_start, t_end; + int r_dirc, t_dirc; + + // sweep direction + for (int iswp = 0; iswp < 4; iswp++){ + if (iswp == 0){ + r_start = nr_1dinv-1; + r_end = -1; + t_start = nt_1dinv-1; + t_end = -1; + r_dirc = -1; + t_dirc = -1; + } else if (iswp==1){ + r_start = nr_1dinv-1; + r_end = -1; + t_start = 0; + t_end = nt_1dinv; + r_dirc = -1; + t_dirc = 1; + } else if (iswp==2){ + r_start = 0; + r_end = nr_1dinv; + t_start = nt_1dinv-1; + t_end = -1; + r_dirc = 1; + t_dirc = -1; + } else { + r_start = 0; + r_end = nr_1dinv; + t_start = 0; + t_end = nt_1dinv; + r_dirc = 1; + t_dirc = 1; + } + + for (int ir = r_start; ir != r_end; ir += r_dirc) { + for (int it = t_start; it != t_end; it += t_dirc) { + + if (is_changed_1dinv[I2V_1DINV(it,ir)]){ + calculate_stencil(it,ir); + } + } + } + } // end of iswp + + // calculate L1 and Linf error + L1_dif = _0_CR; + Linf_dif= _0_CR; + + for (int ii = 0; ii < nr_1dinv*nt_1dinv; ii++){ + L1_dif += std::abs(tau_1dinv[ii]-tau_old_1dinv[ii]); + Linf_dif = std::max(Linf_dif, std::abs(tau_1dinv[ii]-tau_old_1dinv[ii])); + } + L1_dif /= nr_1dinv*nt_1dinv; + + + // check convergence + if (std::abs(L1_dif) < TOL_2D_SOLVER && std::abs(Linf_dif) < TOL_2D_SOLVER){ + if (myrank==0) + std::cout << "Eikonal solver converged at iteration " << iter << std::endl; + break; + } else if (iter > MAX_ITER_2D_SOLVER){ + if (myrank==0) + std::cout << "Eikonal solver reached the maximum iteration at iteration " << iter << std::endl; + break; + } else { + if (myrank==0 && if_verbose) + std::cout << "Iteration " << iter << ": L1 dif = " << L1_dif << ", Linf dif = " << Linf_dif << std::endl; + iter++; + } + } // end of wile + + for (int ii = 0; ii < nr_1dinv*nt_1dinv; ii++){ + T_1dinv[ii] = tau_1dinv[ii]*T0v_1dinv[ii]; + } + +} + + +void OneDInversion::calculate_stencil(const int& it, const int& ir) { + + count_cand = 0; + ii = I2V_1DINV(it,ir); + ii_nr = I2V_1DINV(it,ir-1); + ii_pr = I2V_1DINV(it,ir+1); + ii_nt = I2V_1DINV(it-1,ir); + ii_pt = I2V_1DINV(it+1,ir); + + + // (T0*tau)_r = ar*tau(iix,iiy)+br; (T0*tau)_t = at*tau(iix,iiy)+bt + if (it > 0){ + at1 = T0t_1dinv[ii] + T0v_1dinv[ii]/dt_1dinv; + bt1 = -T0v_1dinv[ii]/dt_1dinv*tau_1dinv[ii_nt]; + } + if (it < nt_1dinv-1){ + at2 = T0t_1dinv[ii] - T0v_1dinv[ii]/dt_1dinv; + bt2 = T0v_1dinv[ii]/dt_1dinv*tau_1dinv[ii_pt]; + } + if (ir > 0){ + ar1 = T0r_1dinv[ii] + T0v_1dinv[ii]/dr_1dinv; + br1 = -T0v_1dinv[ii]/dr_1dinv*tau_1dinv[ii_nr]; + } + if (ir < nr_1dinv-1){ + ar2 = T0r_1dinv[ii] - T0v_1dinv[ii]/dr_1dinv; + br2 = T0v_1dinv[ii]/dr_1dinv*tau_1dinv[ii_pr]; + } + + // start to find candidate solutions + + // first catalog: characteristic travels through sector in 2D volume (4 cases) + for (int i_case = 0; i_case < 4; i_case++){ + // determine discretization of T_t,T_r + switch (i_case) { + case 0: // characteristic travels from -t, -r + if (it == 0 || ir == 0) + continue; + at = at1; bt = bt1; + ar = ar1; br = br1; + break; + case 1: // characteristic travels from -t, +r + if (it == 0 || ir == nr_1dinv-1) + continue; + at = at1; bt = bt1; + ar = ar2; br = br2; + break; + case 2: // characteristic travels from +t, -r + if (it == nt_1dinv-1 || ir == 0) + continue; + at = at2; bt = bt2; + ar = ar1; br = br1; + break; + case 3: // characteristic travels from +t, +r + if (it == nt_1dinv-1 || ir == nr_1dinv-1) + continue; + at = at2; bt = bt2; + ar = ar2; br = br2; + break; + } + + // plug T_t, T_r into eikonal equation, solving the quadratic equation with respect to tau(iip,jjt,kkr) + // that is a*(ar*tau+br)^2 + b*(at*tau+bt)^2 = s^2 + eqn_a = fac_a_1dinv[ii] * std::pow(ar, _2_CR) + fac_b_1dinv[ii] * std::pow(at, _2_CR); + eqn_b = fac_a_1dinv[ii] * _2_CR * ar * br + fac_b_1dinv[ii] * _2_CR * at * bt; + eqn_c = fac_a_1dinv[ii] * std::pow(br, _2_CR) + fac_b_1dinv[ii] * std::pow(bt, _2_CR) - std::pow(slowness_1dinv[ii], _2_CR); + eqn_Delta = std::pow(eqn_b, _2_CR) - _4_CR * eqn_a * eqn_c; + + if (eqn_Delta >= 0){ // one or two real solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_tau = (-eqn_b + std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + case 1: + tmp_tau = (-eqn_b - std::sqrt(eqn_Delta))/(_2_CR*eqn_a); + break; + } + + // check the causality condition: the characteristic passing through (it,ir) is in between used two sides + // characteristic direction is (dr/dt, dtheta/dt, tphi/dt) = (H_p1,H_p2,H_p3), p1 = T_r, p2 = T_t, p3 = T_p + T_r = ar*tmp_tau + br; + T_t = at*tmp_tau + bt; + + charact_r = T_r; + charact_t = T_t; + + is_causality = false; + switch (i_case){ + case 0: //characteristic travels from -t, -r + if (charact_t >= 0 && charact_r >= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 1: //characteristic travels from -t, +r + if (charact_t >= 0 && charact_r <= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 2: //characteristic travels from +t, -r + if (charact_t <= 0 && charact_r >= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + case 3: //characteristic travels from +t, +r + if (charact_t <= 0 && charact_r <= 0 && tmp_tau > 0){ + is_causality = true; + } + break; + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_tau; + count_cand += 1; + } + } + } + } + + // second catalog: characteristic travels through lines in 1D volume (4 cases) + // case: 1-2 + // characteristic travels along r-axis, force H_p2, H_p3 = 0, that is, T_t = 0 + // plug the constraint into eikonal equation, we have the equation: a*T_r^2 = s^2 + for (int i_case = 0; i_case < 2; i_case++){ + switch (i_case){ + case 0: //characteristic travels from -r + if (ir == 0){ + continue; + } + ar = ar1; br = br1; + break; + case 1: //characteristic travels from +r + if (ir == nr_1dinv-1){ + continue; + } + ar = ar2; br = br2; + break; + } + + // plug T_t, T_r into eikonal equation, solve the quadratic equation: (ar*tau+br)^2 = s^2 + // simply, we have two solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_tau = ( std::sqrt(std::pow(slowness_1dinv[ii],_2_CR)/fac_a_1dinv[ii]) - br)/ar; + break; + case 1: + tmp_tau = (-std::sqrt(std::pow(slowness_1dinv[ii],_2_CR)/fac_a_1dinv[ii]) - br)/ar; + break; + } + + // check the causality condition: + + is_causality = false; + switch (i_case){ + case 0: //characteristic travels from -r (we can simply compare the traveltime, which is the same as check the direction of characteristic) + if (tmp_tau * T0v_1dinv[ii] > tau_1dinv[ii_nr] * T0v_1dinv[ii_nr] + && tmp_tau > tau_1dinv[ii_nr]/_2_CR && tmp_tau > 0){ // this additional condition ensures the causality near the source + is_causality = true; + } + break; + case 1: //characteristic travels from +r + if (tmp_tau * T0v_1dinv[ii] > tau_1dinv[ii_pr] * T0v_1dinv[ii_pr] + && tmp_tau > tau_1dinv[ii_pr]/_2_CR && tmp_tau > 0){ + is_causality = true; + } + break; + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_tau; + count_cand += 1; + } + } + + } + + + // case: 3-4 + // characteristic travels along t-axis, force H_p1, H_p3 = 0, that is, T_r = 0; + // plug the constraint into eikonal equation, we have the equation: T_t^2 = s^2 + for (int i_case = 2; i_case < 4; i_case++){ + switch (i_case){ + case 2: //characteristic travels from -t + if (it == 0){ + continue; + } + at = at1; bt = bt1; + break; + case 3: //characteristic travels from +t + if (it == nt_1dinv-1){ + continue; + } + at = at2; bt = bt2; + break; + } + + // plug T_t into eikonal equation, solve the quadratic equation: b*(at*tau+bt)^2 = s^2 + // simply, we have two solutions + for (int i_solution = 0; i_solution < 2; i_solution++){ + // solutions + switch (i_solution){ + case 0: + tmp_tau = ( std::sqrt(std::pow(slowness_1dinv[ii],_2_CR)/fac_b_1dinv[ii]) - bt)/at; + break; + case 1: + tmp_tau = (-std::sqrt(std::pow(slowness_1dinv[ii],_2_CR)/fac_b_1dinv[ii]) - bt)/at; + break; + } + + // check the causality condition: + + is_causality = false; + switch (i_case){ + case 2: //characteristic travels from -t (we can simply compare the traveltime, which is the same as check the direction of characteristic) + if (tmp_tau * T0v_1dinv[ii] > tau_1dinv[ii_nt] * T0v_1dinv[ii_nt] + && tmp_tau > tau_1dinv[ii_nt]/_2_CR && tmp_tau > 0){ // this additional condition ensures the causality near the source + is_causality = true; + } + break; + case 3: //characteristic travels from +t + if (tmp_tau * T0v_1dinv[ii] > tau_1dinv[ii_pt] * T0v_1dinv[ii_pt] + && tmp_tau > tau_1dinv[ii_pt]/_2_CR && tmp_tau > 0){ + is_causality = true; + } + break; + } + + // if satisfying the causility condition, retain it as a canditate solution + if (is_causality) { + canditate[count_cand] = tmp_tau; + count_cand += 1; + } + } + } + + // final, choose the minimum candidate solution as the updated value + for (int i_cand = 0; i_cand < count_cand; i_cand++){ + tau_1dinv[ii] = std::min(tau_1dinv[ii], canditate[i_cand]); + if (tau_1dinv[ii] < 0 ){ + std::cout << "error, tau_loc < 0. ir: " << ir << ", it: " << it << std::endl; + exit(1); + } + } + +} + + +void OneDInversion::calculate_synthetic_traveltime_and_adjoint_source(InputParams& IP, int& i_src) { + + // get the (r,t,p) of the real source + const std::string name_src = IP.get_src_name(i_src); + // CUSTOMREAL src_r = IP.get_src_radius(name_src); + CUSTOMREAL src_lon = IP.get_src_lon( name_src); // in radian + CUSTOMREAL src_lat = IP.get_src_lat( name_src); // in radian + + // rec.adjoint_source = 0 && rec.adjoint_source_density = 0 + IP.initialize_adjoint_source(); + + // loop all data + for (auto it_rec = IP.data_map[name_src].begin(); it_rec != IP.data_map[name_src].end(); ++it_rec) { + for (auto& data: it_rec->second){ + + ///////////////// calculate synthetic traveltime ////////////////// + + const std::string name_rec = data.name_rec; + // get position of the receiver + CUSTOMREAL rec_r = depth2radius(IP.rec_map[name_rec].dep); + CUSTOMREAL rec_lon = IP.rec_map[name_rec].lon*DEG2RAD; // in radian + CUSTOMREAL rec_lat = IP.rec_map[name_rec].lat*DEG2RAD; // in radian + + // calculate epicentral distance + CUSTOMREAL distance =0.0; + Epicentral_distance_sphere(src_lat, src_lon, rec_lat, rec_lon, distance); + + // 2d interporlation, to find the traveltime at (distance, rec_r) on the field of T_1dinv on the mesh meshgrid(t_1dinv, r_1dinv) + CUSTOMREAL traveltime = interpolate_2d_traveltime(distance, rec_r); + data.travel_time = traveltime; + + // for common source differentail arrival time, calculate differential time in addition + if (data.is_rec_pair) { + const std::string name_rec2 = data.name_rec_pair[1]; + CUSTOMREAL rec_r2 = depth2radius(IP.rec_map[name_rec2].dep); + CUSTOMREAL rec_lon2 = IP.rec_map[name_rec2].lon*DEG2RAD; // in radian + CUSTOMREAL rec_lat2 = IP.rec_map[name_rec2].lat*DEG2RAD; // in radian + + // calculate epicentral distance + CUSTOMREAL distance2 =0.0; + Epicentral_distance_sphere(src_lat, src_lon, rec_lat2, rec_lon2, distance2); + + // 2d interporlation, to find the traveltime at (distance, rec_r) on the field of T_1dinv on the mesh meshgrid(t_1dinv, r_1dinv) + CUSTOMREAL traveltime2 = interpolate_2d_traveltime(distance2, rec_r2); + data.cs_dif_travel_time = traveltime - traveltime2; + } + + + /////////////// calculate adjoint source (only consider absolute traveltime for 1d inversion) ///////////////////////// + + + // calculate adjoint source + if (data.is_src_rec){ + CUSTOMREAL syn_time = data.travel_time; + CUSTOMREAL obs_time = data.travel_time_obs; + + // assign local weight + CUSTOMREAL local_weight = _1_CR; + + // evaluate residual_weight_abs (If run_mode == DO_INVERSION, tau_opt always equal 0. But when run_mode == INV_RELOC, we need to consider the change of ortime of earthquakes (swapped receiver)) + CUSTOMREAL local_residual = abs(syn_time - obs_time + IP.rec_map[name_rec].tau_opt); + CUSTOMREAL* res_weight = IP.get_residual_weight_abs(); + + if (local_residual < res_weight[0]) local_weight *= res_weight[2]; + else if (local_residual > res_weight[1]) local_weight *= res_weight[3]; + else local_weight *= ((local_residual - res_weight[0])/(res_weight[1] - res_weight[0]) * (res_weight[3] - res_weight[2]) + res_weight[2]); + + // evaluate distance_weight_abs + CUSTOMREAL local_dis = _0_CR; + Epicentral_distance_sphere(IP.get_rec_point(name_rec).lat*DEG2RAD, IP.get_rec_point(name_rec).lon*DEG2RAD, IP.get_src_point(name_src).lat*DEG2RAD, IP.get_src_point(name_src).lon*DEG2RAD, local_dis); + local_dis *= R_earth; // rad to km + CUSTOMREAL* dis_weight = IP.get_distance_weight_abs(); + + if (local_dis < dis_weight[0]) local_weight *= dis_weight[2]; + else if (local_dis > dis_weight[1]) local_weight *= dis_weight[3]; + else local_weight *= ((local_dis - dis_weight[0])/(dis_weight[1] - dis_weight[0]) * (dis_weight[3] - dis_weight[2]) + dis_weight[2]); + + // assign adjoint source + CUSTOMREAL adjoint_source = IP.get_rec_point(name_rec).adjoint_source + (syn_time - obs_time + IP.rec_map[name_rec].tau_opt) * data.weight * local_weight; + IP.set_adjoint_source(name_rec, adjoint_source); // set adjoint source to rec_map[name_rec] + + // assign adjoint source density + CUSTOMREAL adjoint_source_density = IP.get_rec_point(name_rec).adjoint_source_density + _1_CR; + IP.set_adjoint_source_density(name_rec, adjoint_source_density); + } + } + } +} + + +CUSTOMREAL OneDInversion::interpolate_2d_traveltime(const CUSTOMREAL& distance, const CUSTOMREAL& r) { + + int r_index = std::floor((r - r_1dinv[0])/dr_1dinv); + int t_index = std::floor((distance - t_1dinv[0])/dt_1dinv); + + // error of discretized source position + CUSTOMREAL r_err = std::min(_1_CR, (r - r_1dinv[r_index])/dr_1dinv); + CUSTOMREAL t_err = std::min(_1_CR, (distance - t_1dinv[t_index])/dt_1dinv); + + // check precision error for floor + if (r_err == _1_CR) { + r_err = _0_CR; + r_err++; + } + if (t_err == _1_CR) { + t_err = _0_CR; + t_err++; + } + + if(t_index < 0 || t_index > nt_1dinv-2 || r_index < 0 || r_index > nr_1dinv-2){ + std::cout << "error, out of range. t_index: " << t_index << ", r_index: " << r_index << std::endl; + exit(1); + } + + // initialize the initial fields + CUSTOMREAL traveltime = (_1_CR - r_err)*(_1_CR - t_err)*T_1dinv[I2V_1DINV(t_index ,r_index )] \ + + (_1_CR - r_err)* t_err *T_1dinv[I2V_1DINV(t_index+1,r_index )] \ + + r_err *(_1_CR - t_err)*T_1dinv[I2V_1DINV(t_index ,r_index+1)] \ + + r_err * t_err *T_1dinv[I2V_1DINV(t_index+1,r_index+1)]; + + return traveltime; +} + + +void OneDInversion::adjoint_solver_2d(InputParams& IP, const int& i_src, const int& adj_type){ + + // initialize adjoint arrays: Tadj_1dinv, is_changed_1dinv, delta_1dinv + initialize_adjoint_array(IP, i_src, adj_type); + + // fast sweeping method for 2d space + FSM_2d_adjoint(adj_type); + +} + + +void OneDInversion::initialize_adjoint_array(InputParams& IP, const int& i_src, const int& adj_type) { + // adj_type: 0, adjoint_source; 1, adjoint_source_density + + // initialize adjoint field + for (int ir = 0; ir < nr_1dinv; ir++){ + for (int it = 0; it < nt_1dinv; it++){ + tau_1dinv[I2V_1DINV(it,ir)] = _0_CR; + } + } + + // initialize is_changed_1dinv + for (int ir = 0; ir < nr_1dinv; ir++){ + for (int it = 0; it < nt_1dinv; it++){ + is_changed_1dinv[I2V_1DINV(it,ir)] = true; + } + } + for (int ir = 0; ir < nr_1dinv; ir++){ // boundary are false + is_changed_1dinv[I2V_1DINV(0,ir)] = false; + is_changed_1dinv[I2V_1DINV(nt_1dinv-1,ir)] = false; + } + for (int it = 0; it < nt_1dinv; it++){ + is_changed_1dinv[I2V_1DINV(it,0)] = false; + is_changed_1dinv[I2V_1DINV(it,nr_1dinv-1)] = false; + } + + // initialize delta_1dinv + for (int ir = 0; ir < nr_1dinv; ir++){ + for (int it = 0; it < nt_1dinv; it++){ + delta_1dinv[I2V_1DINV(it,ir)] = _0_CR; + } + } + + // loop all receivers to assign adjoint source + + // get the (r,t,p) of the real source + const std::string name_src = IP.get_src_name(i_src); + // CUSTOMREAL src_r = IP.get_src_radius(name_src); + CUSTOMREAL src_lon = IP.get_src_lon( name_src); // in radian + CUSTOMREAL src_lat = IP.get_src_lat( name_src); // in radian + + // loop all receivers + for (int irec = 0; irec < IP.n_rec_this_sim_group; irec++) { + + // get receiver information + std::string name_rec = IP.get_rec_name(irec); + CUSTOMREAL adjoint_source; + if (adj_type == 0){ + adjoint_source = IP.rec_map[name_rec].adjoint_source; + } else if (adj_type == 1) { + adjoint_source = IP.rec_map[name_rec].adjoint_source_density; + } else { + std::cout << "error, adj_type is not defined." << std::endl; + exit(1); + } + + CUSTOMREAL rec_r = depth2radius(IP.rec_map[name_rec].dep); + CUSTOMREAL rec_lon = IP.rec_map[name_rec].lon*DEG2RAD; // in radian + CUSTOMREAL rec_lat = IP.rec_map[name_rec].lat*DEG2RAD; // in radian + + if (adjoint_source == 0){ + continue; + } + + // descretize receiver position + CUSTOMREAL distance =0.0; + Epicentral_distance_sphere(src_lat, src_lon, rec_lat, rec_lon, distance); + int r_index = std::floor((rec_r - r_1dinv[0])/dr_1dinv); + int t_index = std::floor((distance - t_1dinv[0])/dt_1dinv); + + // error of discretized source position + CUSTOMREAL r_err = std::min(_1_CR, (rec_r - r_1dinv[r_index])/dr_1dinv); + CUSTOMREAL t_err = std::min(_1_CR, (distance - t_1dinv[t_index])/dt_1dinv); + + // check precision error for floor + if (r_err == _1_CR) { + r_err = _0_CR; + r_err++; + } + if (t_err == _1_CR) { + t_err = _0_CR; + t_err++; + } + + if(t_index < 0 || t_index > nt_1dinv-2 || r_index < 0 || r_index > nr_1dinv-2){ + std::cout << "error, out of range. t_index: " << t_index << ", r_index: " << r_index << std::endl; + exit(1); + } + + // assign to delta function + delta_1dinv[I2V_1DINV(t_index ,r_index )] += adjoint_source*(1.0-r_err)*(1.0-t_err)/(dr_1dinv*dt_1dinv*rec_r); + delta_1dinv[I2V_1DINV(t_index+1,r_index )] += adjoint_source*(1.0-r_err)* t_err /(dr_1dinv*dt_1dinv*rec_r); + delta_1dinv[I2V_1DINV(t_index ,r_index+1)] += adjoint_source* r_err *(1.0-t_err)/(dr_1dinv*dt_1dinv*rec_r); + delta_1dinv[I2V_1DINV(t_index+1,r_index+1)] += adjoint_source* r_err * t_err /(dr_1dinv*dt_1dinv*rec_r); + } + +} + + +void OneDInversion::FSM_2d_adjoint(const int& adj_type) { + if (myrank==0) + std::cout << "Running 2d adjoint solver..." << std::endl; + + CUSTOMREAL L1_dif =1000000000; + CUSTOMREAL Linf_dif=1000000000; + + int iter = 0; + + while (true) { + + // update tau_old + std::memcpy(tau_old_1dinv, tau_1dinv, sizeof(CUSTOMREAL)*nr_1dinv*nt_1dinv); + + int r_start, r_end; + int t_start, t_end; + int r_dirc, t_dirc; + + // sweep direction + for (int iswp = 0; iswp < 4; iswp++){ + if (iswp == 0){ + r_start = nr_1dinv-1; + r_end = -1; + t_start = nt_1dinv-1; + t_end = -1; + r_dirc = -1; + t_dirc = -1; + } else if (iswp==1){ + r_start = nr_1dinv-1; + r_end = -1; + t_start = 0; + t_end = nt_1dinv; + r_dirc = -1; + t_dirc = 1; + } else if (iswp==2){ + r_start = 0; + r_end = nr_1dinv; + t_start = nt_1dinv-1; + t_end = -1; + r_dirc = 1; + t_dirc = -1; + } else { + r_start = 0; + r_end = nr_1dinv; + t_start = 0; + t_end = nt_1dinv; + r_dirc = 1; + t_dirc = 1; + } + + for (int ir = r_start; ir != r_end; ir += r_dirc) { + for (int it = t_start; it != t_end; it += t_dirc) { + + if (is_changed_1dinv[I2V_1DINV(it,ir)]) + calculate_stencil_adj(it,ir); + + } + } + } // end of iswp + + // calculate L1 and Linf error + L1_dif = _0_CR; + Linf_dif= _0_CR; + + for (int ii = 0; ii < nr_1dinv*nt_1dinv; ii++){ + L1_dif += std::abs(tau_1dinv[ii]-tau_old_1dinv[ii]); + Linf_dif = std::max(Linf_dif, std::abs(tau_1dinv[ii]-tau_old_1dinv[ii])); + } + L1_dif /= nr_1dinv*nt_1dinv; + + + // check convergence + if (std::abs(L1_dif) < TOL_2D_SOLVER && std::abs(Linf_dif) < TOL_2D_SOLVER){ + if (myrank==0) + std::cout << "Adjoint solver converged at iteration " << iter << std::endl; + break; + } else if (iter > MAX_ITER_2D_SOLVER){ + if (myrank==0) + std::cout << "Adjoint solver reached the maximum iteration at Iteration " << iter << std::endl; + break; + } else { + if (myrank==0 && if_verbose) + std::cout << "Iteration " << iter << ": L1 dif = " << L1_dif << ", Linf dif = " << Linf_dif << std::endl; + iter++; + } + } // end of wile + + if (adj_type == 0){ + for (int ii = 0; ii < nr_1dinv*nt_1dinv; ii++){ + Tadj_1dinv[ii] = tau_1dinv[ii]; + } + } else if (adj_type == 1){ + for (int ii = 0; ii < nr_1dinv*nt_1dinv; ii++){ + Tadj_density_1dinv[ii] = tau_1dinv[ii]; + } + } else { + std::cout << "error, adj_type is not defined." << std::endl; + exit(1); + } +} + + +void OneDInversion::calculate_stencil_adj(const int& it, const int& ir) { + // function \nabla \cdot ( P (-\nabla T) M ) = \sum delta * adj + // matrix: + // | a 0 | + // | 0 b | + + // related coefficients + CUSTOMREAL a1 = - (T_1dinv[I2V_1DINV(it ,ir )] - T_1dinv[I2V_1DINV(it ,ir-1)]) / dr_1dinv * (fac_a_1dinv[I2V_1DINV(it ,ir )] + fac_a_1dinv[I2V_1DINV(it ,ir-1)])/2.0; + CUSTOMREAL a1m = (a1 - std::abs(a1))/2.0; + CUSTOMREAL a1p = (a1 + std::abs(a1))/2.0; + + CUSTOMREAL a2 = - (T_1dinv[I2V_1DINV(it ,ir+1)] - T_1dinv[I2V_1DINV(it ,ir )]) / dr_1dinv * (fac_a_1dinv[I2V_1DINV(it ,ir )] + fac_a_1dinv[I2V_1DINV(it ,ir+1)])/2.0; + CUSTOMREAL a2m = (a2 - std::abs(a2))/2.0; + CUSTOMREAL a2p = (a2 + std::abs(a2))/2.0; + + CUSTOMREAL b1 = - (T_1dinv[I2V_1DINV(it ,ir )] - T_1dinv[I2V_1DINV(it-1,ir )]) / dt_1dinv * (fac_b_1dinv[I2V_1DINV(it ,ir )] + fac_b_1dinv[I2V_1DINV(it-1,ir )])/2.0; + CUSTOMREAL b1m = (b1 - std::abs(b1))/2.0; + CUSTOMREAL b1p = (b1 + std::abs(b1))/2.0; + + CUSTOMREAL b2 = - (T_1dinv[I2V_1DINV(it+1,ir )] - T_1dinv[I2V_1DINV(it ,ir )]) / dt_1dinv * (fac_b_1dinv[I2V_1DINV(it+1,ir )] + fac_b_1dinv[I2V_1DINV(it ,ir )])/2.0; + CUSTOMREAL b2m = (b2 - std::abs(b2))/2.0; + CUSTOMREAL b2p = (b2 + std::abs(b2))/2.0; + + CUSTOMREAL coe = (a2p - a1m)/dr_1dinv + (b2p - b1m)/dt_1dinv; + + if (isZero(coe)){ + tau_1dinv[I2V_1DINV(it,ir)] = 0.0; + } else { + // Hamiltonian + CUSTOMREAL Hadj = (a1p * tau_1dinv[I2V_1DINV(it,ir-1)] - a2m * tau_1dinv[I2V_1DINV(it,ir+1)])/dr_1dinv + + (b1p * tau_1dinv[I2V_1DINV(it-1,ir)] - b2m * tau_1dinv[I2V_1DINV(it+1,ir)])/dt_1dinv; + + tau_1dinv[I2V_1DINV(it,ir)] = (delta_1dinv[I2V_1DINV(it,ir)] + Hadj) / coe; + } +} + + +void OneDInversion::initialize_kernel_1d() { + for (int ir=0; ir= IP.get_max_iter_inv() - 2 || i_inv == 0)) { + // // store kernel only in the first src datafile + // io.change_group_name_for_model(); + + // write_Ks_1dinv(io, i_inv); + // } + + // update kernel by rank 0 + if (id_sim==0){ + // kernel processing (multi-grid parameterization, density normalization) + kernel_processing_1dinv(grid); + + // model_update + model_update_1dinv(i_inv); + + // write slowness + if(IP.get_if_output_in_process() || i_inv >= IP.get_max_iter_inv() - 2 || i_inv == 0){ + write_vel_1dinv(io, i_inv); + } + + } + + // broadcast new slowness + broadcast_cr_inter_sim(slowness_1dinv, nr_1dinv*nt_1dinv, 0); + + // generate 3d model from the 1d model + generate_3d_model(grid); + +} + + +void OneDInversion::kernel_processing_1dinv(Grid& grid) { + + // density normalization + density_normalization_1dinv(); + + // multi-grid parameterization + multi_grid_parameterization_1dinv(grid); + +} + + +void OneDInversion::density_normalization_1dinv() { + // kernel density normalization + for (int ir=0; irr.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)], grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)])) { + kdr = ii_invr; + ratio_r = calc_ratio_between(r_1dinv[ir], grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)], grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)]); + break; + } + } + // continue if r is out of the inversion grid + if (ratio_r < _0_CR) continue; + + CUSTOMREAL dtdr = dt_1dinv * r_1dinv[ir] * dr_1dinv; + + grid.Ks_inv_loc[I2V_INV_KNL(ref_idx_p,ref_idx_t,kdr )] += (_1_CR-ratio_r) * Ks_over_Kden_1dinv[ir] * dtdr; + grid.Ks_inv_loc[I2V_INV_KNL(ref_idx_p,ref_idx_t,kdr+1)] += (ratio_r) * Ks_over_Kden_1dinv[ir] * dtdr; + + } + + // part 2, project Ks_inv_loc back to r_1dinv + for (int ir = 0; ir < nr_1dinv; ir++) { + ratio_r = -_1_CR; + for (int ii_invr = 0; ii_invr < n_inv_K_loc-1; ii_invr++){ + // increasing or decreasing order + if (in_between(r_1dinv[ir], grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)], grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)])) { + kdr = ii_invr; + ratio_r = calc_ratio_between(r_1dinv[ir], grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr,i_grid)], grid.inv_grid->r.arr[I2V_INV_GRIDS_1DK(ii_invr+1,i_grid)]); + break; + } + } + // continue if r is out of the inversion grid + if (ratio_r < _0_CR) continue; + + CUSTOMREAL dtdr = dt_1dinv * r_1dinv[ir] * dr_1dinv; + + Ks_multigrid_1dinv[ir] += (_1_CR-ratio_r) * grid.Ks_inv_loc[I2V_INV_KNL(ref_idx_p,ref_idx_t,kdr )] * dtdr; + Ks_multigrid_1dinv[ir] += (ratio_r) * grid.Ks_inv_loc[I2V_INV_KNL(ref_idx_p,ref_idx_t,kdr+1)] * dtdr; + } + } + + // normalize Ks_miltigrid + CUSTOMREAL Linf_Ks = _0_CR; + for(int ir = 0; ir < nr_1dinv; ir++) { + Linf_Ks = std::max(Linf_Ks, std::abs(Ks_multigrid_1dinv[ir])); + } + if(isZero(Linf_Ks)){ + std::cout << "ERROR!!! max value of kernel = 0. Please check data and input parameter" << std::endl; + exit(1); + } + for(int ir = 0; ir < nr_1dinv; ir++) { + Ks_multigrid_1dinv[ir] /= Linf_Ks; + } +} + + +void OneDInversion::model_update_1dinv(const int& i_inv ) { + + // determine step size + determine_step_size_1dinv(i_inv); + + // update model + for (int it=0; it= old_v_obj) { + step_length_init = std::max((CUSTOMREAL)0.0001, step_length_init*step_length_decay); + if(myrank == 0 && id_sim == 0){ + std::cout << std::endl; + std::cout << "The obj keep increases, from " << old_v_obj << " to " << v_obj + << ", the step length decreases from " << step_length_init/step_length_decay + << " to " << step_length_init << std::endl; + std::cout << std::endl; + } + } + } else { + if(myrank == 0 && id_sim == 0){ + std::cout << std::endl; + std::cout << "At the first iteration, the step length is " << step_length_init << std::endl; + std::cout << std::endl; + } + } + } else if (step_method == GRADIENT_DEFINED){ + // Option 2: we modulate the step length according to the angle between the previous and current gradient directions. + // If the angle is less than XX degree, which means the model update direction is successive, we should enlarge the step size + // Otherwise, the step length should decrease + if(i_inv != 0){ + // calculate the angle between the previous and current gradient directions + CUSTOMREAL angle = 0; + for (int ir = 0; ir < nr_1dinv; ir++){ + angle += Ks_multigrid_1dinv[ir] * Ks_multigrid_previous_1dinv[ir]; + } + angle = std::acos(angle/(norm_1dinv(Ks_multigrid_1dinv, nr_1dinv)*norm_1dinv(Ks_multigrid_previous_1dinv, nr_1dinv)))*RAD2DEG; + + if (angle > step_length_gradient_angle){ + CUSTOMREAL old_step_length = step_length_init; + step_length_init = std::max((CUSTOMREAL)0.0001, step_length_init * step_length_down); + if(myrank == 0 && id_sim == 0){ + std::cout << std::endl; + std::cout << "The angle between two update darections is " << angle + << ". Because the angle is greater than " << step_length_gradient_angle << " degree, the step length decreases from " + << old_step_length << " to " << step_length_init << std::endl; + std::cout << std::endl; + } + } else if (angle <= step_length_gradient_angle) { + CUSTOMREAL old_step_length = step_length_init; + step_length_init = std::min((CUSTOMREAL)0.02, step_length_init * step_length_up); + if(myrank == 0 && id_sim == 0){ + std::cout << std::endl; + std::cout << "The angle between two update darections is " << angle + << ". Because the angle is less than " << step_length_gradient_angle << " degree, the step length increases from " + << old_step_length << " to " << step_length_init << std::endl; + std::cout << std::endl; + } + } + } else { + if(myrank == 0 && id_sim == 0){ + std::cout << std::endl; + std::cout << "At the first iteration, the step length is " << step_length_init << std::endl; + std::cout << std::endl; + } + } + } else { + std::cout << std::endl; + std::cout << "No supported method for step size change, step keep the same: " << step_length_init << std::endl; + std::cout << std::endl; + } +} + + +CUSTOMREAL OneDInversion::norm_1dinv(const CUSTOMREAL* vec, const int& n) { + CUSTOMREAL norm = 0.0; + for (int i = 0; i < n; i++){ + norm += vec[i]*vec[i]; + } + norm = std::sqrt(norm); + + return norm; +} + + +void OneDInversion::generate_3d_model(Grid& grid){ + + // 1. ---------------- load slowness ---------------- + CUSTOMREAL *tmp_slowness; + tmp_slowness = allocateMemory(nr_1dinv, 4000); + for (int ir = 0; ir < nr_1dinv; ir++){ + tmp_slowness[ir] = slowness_1dinv[I2V_1DINV(0,ir)]; + } + // 1d interpolation + // interpolate slowness from (r_1dinv, slowness_1dinv) to (grid.r_loc_1d, *) + CUSTOMREAL *model_1d_output; + model_1d_output = allocateMemory(loc_K, 4000); + linear_interpolation_1d_sorted(r_1dinv, tmp_slowness, nr_1dinv, grid.r_loc_1d, model_1d_output, loc_K); + + // 1d model to 3d model + for (int k = 0; k < loc_K; k++) { + for (int j = 0; j < loc_J; j++) { + for (int i = 0; i < loc_I; i++) { + grid.fun_loc[I2V(i,j,k)] = model_1d_output[k]; + } + } + } +} + +// ######################################################## +// ######## HDF5 output functions ####### +// ######################################################## + +void OneDInversion::write_T_1dinv(IO_utils& io, const std::string& name_src, const int& i_inv) { + std::string field_name = "time_field_1dinv_" + name_src + "_inv_" + int2string_zero_fill(i_inv); + io.write_1dinv_field(T_1dinv, r_1dinv, t_1dinv, nr_1dinv, nt_1dinv, field_name); +} + + +void OneDInversion::write_Tadj_1dinv(IO_utils& io, const std::string& name_src, const int& i_inv) { + std::string field_name = "adjoint_field_1dinv_" + name_src + "_inv_" + int2string_zero_fill(i_inv); + io.write_1dinv_field(Tadj_1dinv, r_1dinv, t_1dinv, nr_1dinv, nt_1dinv, field_name); +} + + +void OneDInversion::write_vel_1dinv(IO_utils& io, const int& i_inv) { + std::string field_name = "vel_1dinv_inv_" + int2string_zero_fill(i_inv); + CUSTOMREAL *vel_1dinv; + vel_1dinv = allocateMemory(nr_1dinv*nt_1dinv, 4000); + for (int ii = 0; ii < nr_1dinv*nt_1dinv; ii++){ + vel_1dinv[ii] = _1_CR/slowness_1dinv[ii]; + } + io.write_1dinv_field(vel_1dinv, r_1dinv, t_1dinv, nr_1dinv, nt_1dinv, field_name); + delete[] vel_1dinv; +} + diff --git a/src/receiver.cpp b/src/receiver.cpp new file mode 100644 index 0000000..3d5df5a --- /dev/null +++ b/src/receiver.cpp @@ -0,0 +1,1579 @@ +#include "receiver.h" + + +Receiver::Receiver() { +} + + +Receiver::~Receiver() { +} + +void Receiver::interpolate_and_store_arrival_times_at_rec_position(InputParams& IP, Grid& grid, const std::string& name_sim_src) { + if(subdom_main){ + + int mykey_send=9999; + int mykey_end=9998; + int key = 0; + + // share the traveltime values on the corner points of the subdomains for interpolation + // this is not necessary for sweeping (as the stencil is closs shape) + grid.send_recev_boundary_data(grid.T_loc); + grid.send_recev_boundary_data_kosumi(grid.T_loc); + + if (proc_store_srcrec){ + // routine for processes which have the source and receiver data + + // calculate the travel time of the receiver by interpolation + for (auto it_rec = IP.data_map[name_sim_src].begin(); it_rec != IP.data_map[name_sim_src].end(); ++it_rec) { + for (auto& data: it_rec->second){ + + if (data.is_src_rec){ // absolute traveltime + // send receivr name as a starting signal for interpolation + + // send dummy integer with key + broadcast_i_single(mykey_send, 0); + broadcast_str(data.name_rec, 0); + + // store travel time on single receiver and double receivers (what is double receivers? by CHEN Jing) + // store travel time from name_sim_src(src_name) to it_rec->first(rec_name) + data.travel_time = interpolate_travel_time(grid, IP, name_sim_src, it_rec->first); + } else if (data.is_rec_pair) { + // store travel time from name_sim_src(src_name) to rec1_name and rec2_name + // calculate travel times for two receivers + broadcast_i_single(mykey_send, 0); + broadcast_str(data.name_rec_pair[0], 0); + CUSTOMREAL travel_time = interpolate_travel_time(grid, IP, name_sim_src, data.name_rec_pair[0]); + + broadcast_i_single(mykey_send, 0); + broadcast_str(data.name_rec_pair[1], 0); + CUSTOMREAL travel_time_2 = interpolate_travel_time(grid, IP, name_sim_src, data.name_rec_pair[1]); + + // Because name_sim_src = data.name_src; it_rec->first = name_rec = name_rec_pair[0] + // Thus data.travel_time is travel_time + data.travel_time = travel_time; + + // calculate and store travel time difference + data.cs_dif_travel_time = travel_time - travel_time_2; + } else if (data.is_src_pair) { + // store travel time from name_sim_src(src1_name) to it_rec->first(rec_name) + broadcast_i_single(mykey_send, 0); + broadcast_str(data.name_rec, 0); + data.travel_time = interpolate_travel_time(grid, IP, name_sim_src, it_rec->first); + + } else { + std::cout << "error type of data" << std::endl; + } + } + } + + // send a endind signal to the processes which do not have the source receiver data + broadcast_i_single(mykey_end, 0); + + } else { + // routine for processes which do not have the source and receiver data + + // waiting the communication from the proc_store_srcrec + while (true) { + + // receive dummy integer + broadcast_i_single(key, 0); + + // check the tag + if (key == mykey_send) { + std::string name_rec; + broadcast_str(name_rec, 0); + + CUSTOMREAL dummy_time = interpolate_travel_time(grid, IP, name_sim_src, name_rec); + (void) dummy_time; // avoid compiler warning + + } else if (key == mykey_end) { + // receive dummy integer + break; + } else { + std::cout << "error in the tag" << std::endl; + } + + } + } + } // end subdomain + + synchronize_all(); +} + + +void Receiver::calculate_adjoint_source(InputParams& IP, const std::string& name_sim_src) { + + // #TODO: run this function only by proc_store_srcrec + if (proc_store_srcrec) { + + // rec.adjoint_source = 0 && rec.adjoint_source_density = 0 + IP.initialize_adjoint_source(); + + // loop all data related to this source MNMN: use reference(auto&) to avoid copy + for (auto it_src = IP.data_map[name_sim_src].begin(); it_src != IP.data_map[name_sim_src].end(); ++it_src) { + bool is_tele = IP.src_map[name_sim_src].is_out_of_region; + + for (auto& data: it_src->second){ + // + // absolute traveltime + // + if (data.is_src_rec){ + if (!IP.get_use_abs()){ // if we do not use abs data, ignore to consider the total obj and adjoint source + continue; + } + + + std::string name_src = data.name_src; + std::string name_rec = data.name_rec; + CUSTOMREAL syn_time = data.travel_time; + CUSTOMREAL obs_time = data.travel_time_obs; + + // assign local weight + CUSTOMREAL local_weight = _1_CR; + + // evaluate residual_weight_abs (If run_mode == DO_INVERSION, tau_opt always equal 0. But when run_mode == INV_RELOC, we need to consider the change of ortime of earthquakes (swapped receiver)) + CUSTOMREAL local_residual = abs(syn_time - obs_time + IP.rec_map[name_rec].tau_opt); + CUSTOMREAL* res_weight = IP.get_residual_weight_abs(); + + if (local_residual < res_weight[0]) local_weight *= res_weight[2]; + else if (local_residual > res_weight[1]) local_weight *= res_weight[3]; + else local_weight *= ((local_residual - res_weight[0])/(res_weight[1] - res_weight[0]) * (res_weight[3] - res_weight[2]) + res_weight[2]); + + + // evaluate distance_weight_abs + CUSTOMREAL local_dis = _0_CR; + Epicentral_distance_sphere(IP.get_rec_point(name_rec).lat*DEG2RAD, IP.get_rec_point(name_rec).lon*DEG2RAD, IP.get_src_point(name_src).lat*DEG2RAD, IP.get_src_point(name_src).lon*DEG2RAD, local_dis); + local_dis *= R_earth; // rad to km + CUSTOMREAL* dis_weight = IP.get_distance_weight_abs(); + + if (local_dis < dis_weight[0]) local_weight *= dis_weight[2]; + else if (local_dis > dis_weight[1]) local_weight *= dis_weight[3]; + else local_weight *= ((local_dis - dis_weight[0])/(dis_weight[1] - dis_weight[0]) * (dis_weight[3] - dis_weight[2]) + dis_weight[2]); + + // assign adjoint source + CUSTOMREAL adjoint_source = IP.get_rec_point(name_rec).adjoint_source + (syn_time - obs_time + IP.rec_map[name_rec].tau_opt) * data.weight * local_weight; + IP.set_adjoint_source(name_rec, adjoint_source); // set adjoint source to rec_map[name_rec] + + // assign adjoint source density + CUSTOMREAL adjoint_source_density = IP.get_rec_point(name_rec).adjoint_source_density + _1_CR; + IP.set_adjoint_source_density(name_rec, adjoint_source_density); + + // + // common receiver differential traveltime && we use this data + // + } else if (data.is_src_pair) { + if (!((IP.get_use_cr() && !IP.get_is_srcrec_swap()) || + (IP.get_use_cs() && IP.get_is_srcrec_swap()))) + continue; // if we do not use this data (cr + not swap) or (cs + swap) or (cs + tele), ignore to consider the adjoint source + + std::string name_src1 = data.name_src_pair[0]; + std::string name_src2 = data.name_src_pair[1]; + std::string name_rec = data.name_rec; + + CUSTOMREAL syn_dif_time = data.cr_dif_travel_time; + CUSTOMREAL obs_dif_time = data.cr_dif_travel_time_obs; + + // assign local weight + CUSTOMREAL local_weight = _1_CR; + + // evaluate residual_weight_abs + CUSTOMREAL local_residual = abs(syn_dif_time - obs_dif_time); + CUSTOMREAL* res_weight; + if (IP.get_is_srcrec_swap()) res_weight = IP.get_residual_weight_cs(); + else res_weight = IP.get_residual_weight_cr(); + + if (local_residual < res_weight[0]) local_weight *= res_weight[2]; + else if (local_residual > res_weight[1]) local_weight *= res_weight[3]; + else local_weight *= ((local_residual - res_weight[0])/(res_weight[1] - res_weight[0]) * (res_weight[3] - res_weight[2]) + res_weight[2]); + + + // evaluate distance_weight_abs + CUSTOMREAL local_azi1 = _0_CR; + Azimuth_sphere(IP.get_rec_point(name_rec).lat*DEG2RAD, IP.get_rec_point(name_rec).lon*DEG2RAD, IP.get_src_point(name_src1).lat*DEG2RAD, IP.get_src_point(name_src1).lon*DEG2RAD, local_azi1); + CUSTOMREAL local_azi2 = _0_CR; + Azimuth_sphere(IP.get_rec_point(name_rec).lat*DEG2RAD, IP.get_rec_point(name_rec).lon*DEG2RAD, IP.get_src_point(name_src2).lat*DEG2RAD, IP.get_src_point(name_src2).lon*DEG2RAD, local_azi2); + CUSTOMREAL local_azi = abs(local_azi1 - local_azi2)*RAD2DEG; + if(local_azi > 180.0) local_azi = 360.0 - local_azi; + + + CUSTOMREAL* azi_weight; + if (IP.get_is_srcrec_swap()) azi_weight = IP.get_azimuthal_weight_cs(); + else azi_weight = IP.get_azimuthal_weight_cr(); + + if (local_azi < azi_weight[0]) local_weight *= azi_weight[2]; + else if (local_azi > azi_weight[1]) local_weight *= azi_weight[3]; + else local_weight *= ((local_azi - azi_weight[0])/(azi_weight[1] - azi_weight[0]) * (azi_weight[3] - azi_weight[2]) + azi_weight[2]); + + + // assign adjoint source + CUSTOMREAL adjoint_source = IP.get_rec_point(name_rec).adjoint_source + (syn_dif_time - obs_dif_time) * data.weight * local_weight; + IP.set_adjoint_source(name_rec, adjoint_source); + + // assign adjoint source density + CUSTOMREAL adjoint_source_density = IP.get_rec_point(name_rec).adjoint_source_density + _1_CR; + IP.set_adjoint_source_density(name_rec, adjoint_source_density); + + + // DEGUG: error check + if (name_sim_src == name_src1){ + continue; + } else if (name_sim_src == name_src2) { // after modification, this case does not occur. since name_sim_src = data.name_src = data.name_src_pair[0] + // thus, this part indicate an error. + std::cout << "cs_dif data strcuture error occur. name_sim_src: " << name_sim_src + << ", data.name_src: " << data.name_src + << ", data.name_src_pair[0]: " << data.name_src_pair[0] + << std::endl; + } else { + std::cout << "error match of data in function: calculate_adjoint_source() " << std::endl; + } + + // + // common source differential traveltime + // + } else if (data.is_rec_pair) { + if (!((IP.get_use_cs() && !IP.get_is_srcrec_swap()) || + (IP.get_use_cr() && IP.get_is_srcrec_swap()) || + (IP.get_use_cs() && is_tele ))) + continue; // if we do not use this data (cs + not swap) or (cr + swap), ignore to consider the total obj and adjoint source + + std::string name_src = data.name_src; + std::string name_rec1 = data.name_rec_pair[0]; + std::string name_rec2 = data.name_rec_pair[1]; + + CUSTOMREAL syn_dif_time = data.cs_dif_travel_time; + CUSTOMREAL obs_dif_time = data.cs_dif_travel_time_obs; + + if(is_tele){ // station correction for teleseismic data + syn_dif_time = syn_dif_time + IP.rec_map[name_rec1].sta_correct - IP.rec_map[name_rec2].sta_correct; + } + + // assign local weight + CUSTOMREAL local_weight = _1_CR; + + // evaluate residual_weight_abs (see the remark in absolute traveltime data for considering tau_opt here) + CUSTOMREAL local_residual = abs(syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt); + CUSTOMREAL* res_weight; + if (IP.get_is_srcrec_swap() && !is_tele) res_weight = IP.get_residual_weight_cr(); + else res_weight = IP.get_residual_weight_cs(); + + if (local_residual < res_weight[0]) local_weight *= res_weight[2]; + else if (local_residual > res_weight[1]) local_weight *= res_weight[3]; + else local_weight *= ((local_residual - res_weight[0])/(res_weight[1] - res_weight[0]) * (res_weight[3] - res_weight[2]) + res_weight[2]); + + + // evaluate distance_weight_abs + CUSTOMREAL local_azi1 = _0_CR; + Azimuth_sphere(IP.get_rec_point(name_rec1).lat*DEG2RAD, IP.get_rec_point(name_rec1).lon*DEG2RAD, IP.get_src_point(name_src).lat*DEG2RAD, IP.get_src_point(name_src).lon*DEG2RAD, local_azi1); + CUSTOMREAL local_azi2 = _0_CR; + Azimuth_sphere(IP.get_rec_point(name_rec2).lat*DEG2RAD, IP.get_rec_point(name_rec2).lon*DEG2RAD, IP.get_src_point(name_src).lat*DEG2RAD, IP.get_src_point(name_src).lon*DEG2RAD, local_azi2); + CUSTOMREAL local_azi = abs(local_azi1 - local_azi2)*RAD2DEG; + if(local_azi > 180.0) local_azi = 360.0 - local_azi; + + + CUSTOMREAL* azi_weight; + if (IP.get_is_srcrec_swap() && !is_tele) azi_weight = IP.get_azimuthal_weight_cr(); + else azi_weight = IP.get_azimuthal_weight_cs(); + + if (local_azi < azi_weight[0]) local_weight *= azi_weight[2]; + else if (local_azi > azi_weight[1]) local_weight *= azi_weight[3]; + else local_weight *= ((local_azi - azi_weight[0])/(azi_weight[1] - azi_weight[0]) * (azi_weight[3] - azi_weight[2]) + azi_weight[2]); + + + // assign adjoint source + CUSTOMREAL adjoint_source; + adjoint_source = IP.get_rec_point(name_rec1).adjoint_source + (syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt) * data.weight * local_weight; + IP.set_adjoint_source(name_rec1, adjoint_source); + + adjoint_source = IP.get_rec_point(name_rec2).adjoint_source - (syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt) * data.weight * local_weight; + IP.set_adjoint_source(name_rec2, adjoint_source); + + // assign adjoint source density + CUSTOMREAL adjoint_source_density; + adjoint_source_density = IP.get_rec_point(name_rec1).adjoint_source_density + _1_CR; + IP.set_adjoint_source_density(name_rec1, adjoint_source_density); + + adjoint_source_density = IP.get_rec_point(name_rec2).adjoint_source_density + _1_CR; + IP.set_adjoint_source_density(name_rec2, adjoint_source_density); + } + + } // end of loop over data + } // end loop receivers + + } // end proc_store_srcrec + + synchronize_all(); +} + + +std::vector Receiver:: calculate_obj_and_residual(InputParams& IP) { + + CUSTOMREAL obj = 0.0; + CUSTOMREAL obj_abs = 0.0; + CUSTOMREAL obj_cs_dif = 0.0; + CUSTOMREAL obj_cr_dif = 0.0; + CUSTOMREAL obj_tele = 0.0; + CUSTOMREAL res = 0.0; + CUSTOMREAL res_sq = 0.0; + CUSTOMREAL res_abs = 0.0; + CUSTOMREAL res_abs_sq = 0.0; + CUSTOMREAL res_cs_dif = 0.0; + CUSTOMREAL res_cs_dif_sq = 0.0; + CUSTOMREAL res_cr_dif = 0.0; + CUSTOMREAL res_cr_dif_sq = 0.0; + CUSTOMREAL res_tele = 0.0; + CUSTOMREAL res_tele_sq = 0.0; + + std::vector obj_residual; + + if (proc_store_srcrec) { + + for (int i_src = 0; i_src < (int)IP.src_id2name.size(); i_src++){ + + const std::string name_sim_src = IP.src_id2name[i_src]; + + // loop all data related to this source MNMN: use reference(auto&) to avoid copy + for (auto it_src = IP.data_map[name_sim_src].begin(); it_src != IP.data_map[name_sim_src].end(); ++it_src) { + for (auto& data: it_src->second){ + + + if (data.dual_data) continue; // dual data is not used for calculating obj and residual + + // + // absolute traveltime + // + if (data.is_src_rec){ + + // error check (data.name_src_pair must be equal to name_sim1 and name_sim2) + if (data.name_src != name_sim_src) continue; + + std::string name_src = data.name_src; + std::string name_rec = data.name_rec; + CUSTOMREAL syn_time = data.travel_time; + CUSTOMREAL obs_time = data.travel_time_obs; + + bool is_tele = (IP.get_src_point(name_src).is_out_of_region || IP.get_rec_point(name_rec).is_out_of_region); + if (is_tele){ + syn_time = syn_time + IP.rec_map[name_rec].sta_correct; // station correction for teleseismic data + } + + // contribute misfit of specific type of data + res += 1.0 * (syn_time - obs_time + IP.rec_map[name_rec].tau_opt); + res_sq += 1.0 * my_square(syn_time - obs_time + IP.rec_map[name_rec].tau_opt); + + if (is_tele){ + obj_tele += 1.0 * my_square(syn_time - obs_time + IP.rec_map[name_rec].tau_opt) * data.weight; + res_tele += 1.0 * (syn_time - obs_time + IP.rec_map[name_rec].tau_opt); + res_tele_sq += 1.0 * my_square(syn_time - obs_time + IP.rec_map[name_rec].tau_opt); + + if(!IP.get_use_abs()) + continue; // if we do not use abs data, ignore to consider the total obj + obj += 1.0 * my_square(syn_time - obs_time + IP.rec_map[name_rec].tau_opt) * data.weight; + } else{ + obj_abs += 1.0 * my_square(syn_time - obs_time + IP.rec_map[name_rec].tau_opt) * data.weight; + res_abs += 1.0 * (syn_time - obs_time + IP.rec_map[name_rec].tau_opt); + res_abs_sq += 1.0 * my_square(syn_time - obs_time + IP.rec_map[name_rec].tau_opt); + + if (!IP.get_use_abs()) + continue; // if we do not use abs data, ignore to consider the total obj + obj += 1.0 * my_square(syn_time - obs_time + IP.rec_map[name_rec].tau_opt) * data.weight; + } + + + + } else if (data.is_src_pair) { + + std::string name_src1 = data.name_src_pair[0]; + std::string name_src2 = data.name_src_pair[1]; + std::string name_rec = data.name_rec; + + // error check (data.name_src_pair must be equal to name_sim1 and name_sim2) + if (name_sim_src != name_src1 && name_sim_src != name_src2) continue; + + CUSTOMREAL syn_dif_time = data.cr_dif_travel_time; + CUSTOMREAL obs_dif_time = data.cr_dif_travel_time_obs; + + bool is_tele = (IP.get_src_point(name_src1).is_out_of_region || \ + IP.get_src_point(name_src2).is_out_of_region || \ + IP.get_rec_point(name_rec).is_out_of_region); + + // contribute misfit of specific type of data + res += 1.0 * (syn_dif_time - obs_dif_time); + res_sq += 1.0 * my_square(syn_dif_time - obs_dif_time); + + if (is_tele){ + obj_tele += 1.0 * my_square(syn_dif_time - obs_dif_time)*data.weight; + res_tele += 1.0 * (syn_dif_time - obs_dif_time); + res_tele_sq += 1.0 * my_square(syn_dif_time - obs_dif_time); + + if(!IP.get_use_cr()) + continue; // if we do not use cr data, ignore to consider the total obj + obj += 1.0 * my_square(syn_dif_time - obs_dif_time)*data.weight; + } else{ + obj_cr_dif += 1.0 * my_square(syn_dif_time - obs_dif_time)*data.weight; + res_cr_dif += 1.0 * (syn_dif_time - obs_dif_time); + res_cr_dif_sq += 1.0 * my_square(syn_dif_time - obs_dif_time); + + if (!((IP.get_use_cr() && !IP.get_is_srcrec_swap()) || (IP.get_use_cs() && IP.get_is_srcrec_swap()))) + continue; // if we do not use this data (cr + not swap) or (cs + swap), ignore to consider the total obj and adjoint source + obj += 1.0 * my_square(syn_dif_time - obs_dif_time)*data.weight; + } + + } else if (data.is_rec_pair) { + + std::string name_src = data.name_src; + std::string name_rec1 = data.name_rec_pair[0]; + std::string name_rec2 = data.name_rec_pair[1]; + + CUSTOMREAL syn_dif_time = data.cs_dif_travel_time; + CUSTOMREAL obs_dif_time = data.cs_dif_travel_time_obs; + + bool is_tele = (IP.get_src_point(name_src).is_out_of_region || \ + IP.get_rec_point(name_rec1).is_out_of_region || \ + IP.get_rec_point(name_rec2).is_out_of_region); + if(is_tele){ + syn_dif_time = syn_dif_time + IP.rec_map[name_rec1].sta_correct - IP.rec_map[name_rec2].sta_correct; // station correction for teleseismic data + } + + // contribute misfit of specific type of data + res += 1.0 * (syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt); + res_sq += 1.0 * my_square(syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt); + + if (is_tele){ + obj_tele += 1.0 * my_square(syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt)*data.weight; + res_tele += 1.0 * (syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt); + res_tele_sq += 1.0 * my_square(syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt); + + if(!IP.get_use_cs()) + continue; // if we do not use cs data, ignore to consider the total obj + obj += 1.0 * my_square(syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt) * data.weight; + + } else{ + obj_cs_dif += 1.0 * my_square(syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt)*data.weight; + res_cs_dif += 1.0 * (syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt); + res_cs_dif_sq += 1.0 * my_square(syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt); + + if (!((IP.get_use_cs() && !IP.get_is_srcrec_swap()) || (IP.get_use_cr() && IP.get_is_srcrec_swap()))) + continue; // if we do not use this data (cs + not swap) or (cr + swap), ignore to consider the total obj and adjoint source + obj += 1.0 * my_square(syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt) * data.weight; + } + } + + } // end of loop over data + } // end loop receivers + } // end loop sources + } // end proc_store_srcrec + + broadcast_cr_single_sub(obj,0); + broadcast_cr_single_sub(obj_abs,0); + broadcast_cr_single_sub(obj_cs_dif,0); + broadcast_cr_single_sub(obj_cr_dif,0); + broadcast_cr_single_sub(obj_tele,0); + broadcast_cr_single_sub(res,0); + broadcast_cr_single_sub(res_sq,0); + broadcast_cr_single_sub(res_abs,0); + broadcast_cr_single_sub(res_abs_sq,0); + broadcast_cr_single_sub(res_cs_dif,0); + broadcast_cr_single_sub(res_cs_dif_sq,0); + broadcast_cr_single_sub(res_cr_dif,0); + broadcast_cr_single_sub(res_cr_dif_sq,0); + broadcast_cr_single_sub(res_tele,0); + broadcast_cr_single_sub(res_tele_sq,0); + + broadcast_cr_single(obj,0); + broadcast_cr_single(obj_abs,0); + broadcast_cr_single(obj_cs_dif,0); + broadcast_cr_single(obj_cr_dif,0); + broadcast_cr_single(obj_tele,0); + broadcast_cr_single(res,0); + broadcast_cr_single(res_sq,0); + broadcast_cr_single(res_abs,0); + broadcast_cr_single(res_abs_sq,0); + broadcast_cr_single(res_cs_dif,0); + broadcast_cr_single(res_cs_dif_sq,0); + broadcast_cr_single(res_cr_dif,0); + broadcast_cr_single(res_cr_dif_sq,0); + broadcast_cr_single(res_tele,0); + broadcast_cr_single(res_tele_sq,0); + + obj_residual = {obj, obj_abs, obj_cs_dif, obj_cr_dif, obj_tele, res, res_sq, res_abs, res_abs_sq, res_cs_dif, res_cs_dif_sq, res_cr_dif, res_cr_dif_sq, res_tele, res_tele_sq}; + + for(int i = 0; i < (int)obj_residual.size(); i++){ + allreduce_cr_sim_single_inplace(obj_residual[i]); + } + + return obj_residual; +} + + +bool Receiver::check_if_receiver_is_in_this_subdomain(Grid& grid, const CUSTOMREAL& rec_lon, const CUSTOMREAL& rec_lat, const CUSTOMREAL& rec_r) { + + bool is_in_subdomain = false; + + if (grid.get_lon_min_loc() <= rec_lon && rec_lon < grid.get_lon_max_loc() && \ + grid.get_lat_min_loc() <= rec_lat && rec_lat < grid.get_lat_max_loc() && \ + grid.get_r_min_loc() <= rec_r && rec_r < grid.get_r_max_loc() ) { + + // check if the receiver is on the upper boundary of the subdomain + // if so, the interpolation will be failed because *_rec_p1 cannot be defined. + if (isZero(rec_lon - grid.get_lon_max_loc()) + || isZero(rec_lat - grid.get_lat_max_loc()) + || isZero(rec_r - grid.get_r_max_loc())) { + is_in_subdomain = false; + } else { + is_in_subdomain = true; + } + } + + return is_in_subdomain; +} + + +CUSTOMREAL Receiver::interpolate_travel_time(Grid& grid, InputParams& IP, std::string name_src, std::string name_rec) { + // calculate the travel time of the receiver by 3d linear interpolation + + // get the reference for a receiver + const SrcRecInfo rec = IP.get_rec_point_bcast(name_rec); + + // copy some parameters + CUSTOMREAL delta_lon = grid.get_delta_lon(); + CUSTOMREAL delta_lat = grid.get_delta_lat(); + CUSTOMREAL delta_r = grid.get_delta_r(); + + // store receiver position in radian + CUSTOMREAL rec_lon = rec.lon*DEG2RAD; + CUSTOMREAL rec_lat = rec.lat*DEG2RAD; + CUSTOMREAL rec_r = depth2radius(rec.dep); // r in km + + // check if the receiver is in this subdomain + bool is_in_subdomain = check_if_receiver_is_in_this_subdomain(grid, rec_lon, rec_lat, rec_r); + + // check the rank where the source is located + int rec_rank = -1; + int n_subdom_rec = 0; + bool* rec_flags = new bool[nprocs]; + allgather_bool_single(&is_in_subdomain, rec_flags); + for (int i = 0; i < nprocs; i++) { + if (rec_flags[i]) { + rec_rank = i; + //break; // this break means that the first subdomain is used if the receiver is in multiple subdomains (ghost layer) + n_subdom_rec++; + } + } + delete[] rec_flags; + // check if the receiver is in the global domain + if (rec_rank == -1) { + std::cout << "Error: the receiver is not in the global domain" << std::endl; + // print rec + std::cout << "name_src: " << name_src << " name_rec: " << name_rec << " depth: " << rec.dep << " lat: " << rec.lat << " lon: " << rec.lon << std::endl; + // print boundary + //std::cout << "lon min max rec: " << grid.get_lon_min_loc() << " " << grid.get_lon_max_loc() << " " << rec_lon << std::endl; + //std::cout << "lat min max rec: " << grid.get_lat_min_loc() << " " << grid.get_lat_max_loc() << " " << rec_lat << std::endl; + //std::cout << "r min max rec: " << grid.get_r_min_loc() << " " << grid.get_r_max_loc() << " " << rec_r << std::endl; + + std::cout << "lon+bound min max rec: " << (grid.get_lon_min_loc() - delta_lon)*RAD2DEG << " " << (grid.get_lon_max_loc() + delta_lon)*RAD2DEG << " " << rec_lon*RAD2DEG << std::endl; + std::cout << "lat+bound min max rec: " << (grid.get_lat_min_loc() - delta_lat)*RAD2DEG << " " << (grid.get_lat_max_loc() + delta_lat)*RAD2DEG << " " << rec_lat*RAD2DEG << std::endl; + std::cout << "r+bound min max rec: " << radius2depth(grid.get_r_min_loc() - delta_r ) << " " << radius2depth(grid.get_r_max_loc() + delta_r ) << " " << radius2depth(rec_r)<< std::endl; + exit(1); + } + + CUSTOMREAL vinterp = 0.0; + + if (is_in_subdomain) { + // calculate the interpolated travel time and broadcast it + + // descretize source position (LOCAL) ID) + int i_rec = std::floor((rec_lon - grid.get_lon_min_loc()) / delta_lon); + int j_rec = std::floor((rec_lat - grid.get_lat_min_loc()) / delta_lat); + int k_rec = std::floor((rec_r - grid.get_r_min_loc()) / delta_r); + + // discretized receiver position + CUSTOMREAL dis_rec_lon = grid.p_loc_1d[i_rec]; + CUSTOMREAL dis_rec_lat = grid.t_loc_1d[j_rec]; + CUSTOMREAL dis_rec_r = grid.r_loc_1d[k_rec]; + + // relative position errors + CUSTOMREAL e_lon = std::min({_1_CR,(rec_lon - dis_rec_lon)/delta_lon}); + CUSTOMREAL e_lat = std::min({_1_CR,(rec_lat - dis_rec_lat)/delta_lat}); + CUSTOMREAL e_r = std::min({_1_CR,(rec_r - dis_rec_r) /delta_r}); + + // numerical precision error of std::floor + if (e_lon >= _1_CR) { + e_lon = e_lon - _1_CR; + i_rec++; + } else if (e_lon < 0) { + e_lon = e_lon + _1_CR; + i_rec--; + } + + if (e_lat == _1_CR) { + e_lat = 0.0; + j_rec++; + } else if (e_lat < 0) { + e_lat = e_lat + _1_CR; + j_rec--; + } + + if (e_r == _1_CR) { + e_r = 0.0; + k_rec++; + } else if (e_r < 0) { + e_r = e_r + _1_CR; + k_rec--; + } + +// if(if_verbose){ +// std::cout << "(rec_lon - dis_rec_lon)/dlon: " << (rec_lon - dis_rec_lon)/delta_lon << std::endl; +// std::cout << "(rec_lat - dis_rec_lat)/dlat: " << (rec_lat - dis_rec_lat)/delta_lat << std::endl; +// std::cout << "(rec_r - dis_rec_r )/dr: " << (rec_r - dis_rec_r )/delta_r << std::endl; +// std::cout << "rec_lon, dis_rec_lon, delta_lon: " << rec_lon << " " << dis_rec_lon << " " << delta_lon << std::endl; +// std::cout << "rec_lat, dis_rec_lat, delta_lat: " << rec_lat << " " << dis_rec_lat << " " << delta_lat << std::endl; +// std::cout << "rec_r, dis_rec_r, delta_r : " << rec_r << ", " << dis_rec_r << ", " << delta_r << std::endl; +// std::cout << "loc_K. k_rec: " << loc_K << "," << k_rec << std::endl; +// std::cout << "r_loc_1d[loc_K-1]: " << grid.r_loc_1d[loc_K-1] << std::endl; +// } + + int i_rec_p1 = i_rec + 1; + int j_rec_p1 = j_rec + 1; + int k_rec_p1 = k_rec + 1; + + // exclude the points if they are out of the domain + if (i_rec_p1 > loc_I-1 \ + || j_rec_p1 > loc_J-1 \ + || k_rec_p1 > loc_K-1) { + // exit(1) as the source is out of the domain + std::cout << "Error: the receiver is out of the domain" << std::endl; + std::cout << "name_src: " << name_src << " name_rec: " << name_rec << " depth: " << rec.dep << " lat: " << rec.lat << " lon: " << rec.lon << std::endl; + std::cout << "lon min max rec: " << grid.get_lon_min_loc()*RAD2DEG << " " << grid.get_lon_max_loc()*RAD2DEG << " " << rec_lon*RAD2DEG << std::endl; + std::cout << "lat min max rec: " << grid.get_lat_min_loc()*RAD2DEG << " " << grid.get_lat_max_loc()*RAD2DEG << " " << rec_lat*RAD2DEG << std::endl; + std::cout << "r min max rec: " << radius2depth(grid.get_r_min_loc()) << " " << radius2depth(grid.get_r_max_loc()) << " " << radius2depth(rec_r) << std::endl; + std::cout << "i_rec: " << i_rec << " j_rec: " << j_rec << " k_rec: " << k_rec << std::endl; + std::cout << "i_rec_p1: " << i_rec_p1 << " j_rec_p1: " << j_rec_p1 << " k_rec_p1: " << k_rec_p1 << std::endl; + std::cout << "loc_I-1: " << loc_I-1 << " loc_J-1: " << loc_J-1 << " loc_K-1: " << loc_K-1 << std::endl; + //finalize_mpi(); + exit(1); + } + + + vinterp = (_1_CR - e_lon) * (_1_CR - e_lat) * (_1_CR - e_r) * grid.T_loc[I2V(i_rec, j_rec, k_rec)] \ + + e_lon * (_1_CR - e_lat) * (_1_CR - e_r) * grid.T_loc[I2V(i_rec_p1,j_rec, k_rec)] \ + + (_1_CR - e_lon) * e_lat * (_1_CR - e_r) * grid.T_loc[I2V(i_rec, j_rec_p1,k_rec)] \ + + (_1_CR - e_lon) * (_1_CR - e_lat) * e_r * grid.T_loc[I2V(i_rec, j_rec, k_rec_p1)] \ + + e_lon * e_lat * (_1_CR - e_r) * grid.T_loc[I2V(i_rec_p1,j_rec_p1,k_rec)] \ + + e_lon * (_1_CR - e_lat) * e_r * grid.T_loc[I2V(i_rec_p1,j_rec, k_rec_p1)] \ + + (_1_CR - e_lon) * e_lat * e_r * grid.T_loc[I2V(i_rec, j_rec_p1,k_rec_p1)] \ + + e_lon * e_lat * e_r * grid.T_loc[I2V(i_rec_p1,j_rec_p1,k_rec_p1)]; + + //std::cout << "DEBUG near and vinterp : " << grid.T_loc[I2V(i_rec,j_rec,k_rec)] << ", " << vinterp << std::endl; + // std::cout << "times: " << grid.T_loc[I2V(i_rec, j_rec, k_rec)] << ", " + // << grid.T_loc[I2V(i_rec_p1,j_rec, k_rec)] << ", " + // << grid.T_loc[I2V(i_rec, j_rec_p1,k_rec)] << ", " + // << grid.T_loc[I2V(i_rec, j_rec, k_rec_p1)] << ", " + // << grid.T_loc[I2V(i_rec_p1,j_rec_p1,k_rec)] << ", " + // << grid.T_loc[I2V(i_rec_p1,j_rec, k_rec_p1)] << ", " + // << grid.T_loc[I2V(i_rec, j_rec_p1,k_rec_p1)] << ", " + // << grid.T_loc[I2V(i_rec_p1,j_rec_p1,k_rec_p1)] << ", " + // << std::endl; + // std::cout << "rec: " << rec.name << ", lat: " << rec_lat + // << ", lon: " << rec_lon << ", dep: " << rec.dep + // << ", time: " << vinterp + // << std::endl; + + // broadcast interpolated travel time + //broadcast_cr_single(vinterp, rec_rank); + allreduce_cr_inplace(&vinterp, 1); + + } else { + // receive the calculated traveltime + //broadcast_cr_single(vinterp, rec_rank); + allreduce_cr_inplace(&vinterp, 1); + } + + // use an averaged value if the receiver is in multiple subdomains + vinterp /= n_subdom_rec; + + // return the calculated travel time + return vinterp; +} + + + +void Receiver::init_vars_src_reloc(InputParams& IP){ + if (proc_store_srcrec) { + + // calculate gradient of travel time at each receiver (swapped source) + for (auto iter = IP.rec_map.begin(); iter != IP.rec_map.end(); iter++) { + if (!iter->second.is_stop){ + iter->second.grad_tau = _0_CR; + } + iter->second.grad_chi_i = _0_CR; + iter->second.grad_chi_j = _0_CR; + iter->second.grad_chi_k = _0_CR; + iter->second.Ndata = 0; + iter->second.sum_weight = _0_CR; // what does it mean? + iter->second.vobj_src_reloc_old = iter->second.vobj_src_reloc; + iter->second.vobj_src_reloc = _0_CR; + + iter->second.vobj_grad_norm_src_reloc = _0_CR; + } + + } +} + +void Receiver::calculate_T_gradient(InputParams& IP, Grid& grid, const std::string& name_sim_src){ + + if (subdom_main){ + int mykey_send = 9998; + int mykey_end = 9999; + int key = 0; + + if(proc_store_srcrec){ + // calculate gradient of travel time at each receiver (swapped source) + for (auto iter = IP.data_map[name_sim_src].begin(); iter != IP.data_map[name_sim_src].end(); iter++){ + for (auto& data: iter->second) { + // case 1: absolute traveltime for reloc + if (data.is_src_rec && IP.get_use_abs_reloc()){ // abs data && we use it + std::string name_rec = data.name_rec; + + if(IP.rec_map[name_rec].is_stop) continue; // if this receiver (swapped source) is already located + + // otherwise + CUSTOMREAL DTijk[3]; + + // send dummy integer + broadcast_i_single(mykey_send, 0); + // send reeiver name + broadcast_str(name_rec, 0); + + calculate_T_gradient_one_rec(grid, IP, name_rec, DTijk); + data.DTi = DTijk[0]; + data.DTj = DTijk[1]; + data.DTk = DTijk[2]; + + + // case 2: common receiver (swapped source) double difference (double source, or double swapped receiver) for reloc + } else if (data.is_rec_pair && IP.get_use_cr_reloc()) { // common receiver data (swapped common source) and we use it. + std::string name_rec1 = data.name_rec_pair[0]; + std::string name_rec2 = data.name_rec_pair[1]; + + if(IP.rec_map[name_rec1].is_stop && IP.rec_map[name_rec2].is_stop) continue; // if both receivers (swapped sources) are already located + + // otherwise + CUSTOMREAL DTijk[3]; + + // send dummy integer + broadcast_i_single(mykey_send, 0); + // send reeiver name + broadcast_str(name_rec1, 0); + calculate_T_gradient_one_rec(grid, IP, name_rec1, DTijk); + data.DTi_pair[0] = DTijk[0]; + data.DTj_pair[0] = DTijk[1]; + data.DTk_pair[0] = DTijk[2]; + + // send dummy integer + broadcast_i_single(mykey_send, 0); + // send reeiver name + broadcast_str(name_rec2, 0); + calculate_T_gradient_one_rec(grid, IP, name_rec2, DTijk); + data.DTi_pair[1] = DTijk[0]; + data.DTj_pair[1] = DTijk[1]; + data.DTk_pair[1] = DTijk[2]; + + } else if (data.is_src_pair && IP.get_use_cs_reloc()) { // common source data (swapped common receiver) and we use it. + std::string name_src1 = data.name_src_pair[0]; + std::string name_src2 = data.name_src_pair[1]; + std::string name_rec = data.name_rec; + + if(IP.rec_map[name_rec].is_stop) continue; // if this receiver (swapped source) is already located + + // otherwise + CUSTOMREAL DTijk[3]; + + // send dummy integer + broadcast_i_single(mykey_send, 0); + // send reeiver name + broadcast_str(name_rec, 0); + calculate_T_gradient_one_rec(grid, IP, name_rec, DTijk); + data.DTi = DTijk[0]; + data.DTj = DTijk[1]; + data.DTk = DTijk[2]; + } else { + // we have some other types of data or we have three above-mentioned data but we do not use them + continue; + // std::cout << "unsupported data type for earthquake location" << std::endl; + // exit(0); + } + } + } // end loop over data + + // send dummy integer to end the idle loop + broadcast_i_single(mykey_end, 0); + + } else { + while (true) { + // receive dummy integer + broadcast_i_single(key, 0); + + if (key==mykey_send) { + // receive receiver name + std::string name_rec; + broadcast_str(name_rec, 0); + // join in the calculation + CUSTOMREAL DTijk_dummy[3]; + calculate_T_gradient_one_rec(grid, IP, name_rec, DTijk_dummy); + } else if (key==mykey_end) { + break; + } else { + std::cout << "Error: Receiver::calculate_T_gradient: key is not correct" << std::endl; + std::cout << "received key is " << key << std::endl; + exit(1); + } + } + } // end if proc_store_srcrec + } // end subdom_main + +} + + +void Receiver::calculate_T_gradient_one_rec(Grid& grid, InputParams& IP, std::string rec_name, CUSTOMREAL* DTijk){ + + // calculate the travel time of the receiver by 3d linear interpolation + + // get the reference for a receiver + const SrcRecInfo rec = IP.get_rec_point_bcast(rec_name); + + // copy some parameters + CUSTOMREAL delta_lon = grid.get_delta_lon(); + CUSTOMREAL delta_lat = grid.get_delta_lat(); + CUSTOMREAL delta_r = grid.get_delta_r(); + + // store receiver position in radian + CUSTOMREAL rec_lon = rec.lon*DEG2RAD; + CUSTOMREAL rec_lat = rec.lat*DEG2RAD; + CUSTOMREAL rec_r = depth2radius(rec.dep); // r in km + + // check if the receiver is in this subdomain + bool is_in_subdomain = check_if_receiver_is_in_this_subdomain(grid, rec_lon, rec_lat, rec_r); + + // check the rank where the source is located + int rec_rank = -1; + bool* rec_flags = new bool[nprocs]; + allgather_bool_single(&is_in_subdomain, rec_flags); + for (int i = 0; i < nprocs; i++) { + if (rec_flags[i]) { + rec_rank = i; + //break; // this break means that the first subdomain is used if the receiver is in multiple subdomains (ghost layer) + } + } + + // count the number of subdomains where the receiver is located + int ndoms_rec = 0; + for (int i = 0; i < nprocs; i++) { + if (rec_flags[i]) { + ndoms_rec++; + } + } + + // check if the receiver is in the global domain + if (rec_rank == -1) { + std::cout << "Error: the receiver is not in the global domain" << std::endl; + // print rec + std::cout << " id_rec: " << rec.id << " name: " << rec.name << " depth: " << rec.dep << " lat: " << rec.lat << " lon: " << rec.lon << std::endl; + std::cout << "lon+bound min max rec: " << (grid.get_lon_min_loc() - delta_lon)*RAD2DEG << " " << (grid.get_lon_max_loc() + delta_lon)*RAD2DEG << " " << rec_lon*RAD2DEG << std::endl; + std::cout << "lat+bound min max rec: " << (grid.get_lat_min_loc() - delta_lat)*RAD2DEG << " " << (grid.get_lat_max_loc() + delta_lat)*RAD2DEG << " " << rec_lat*RAD2DEG << std::endl; + std::cout << "r+bound min max rec: " << radius2depth(grid.get_r_min_loc() - delta_r ) << " " << radius2depth(grid.get_r_max_loc() + delta_r ) << " " << radius2depth(rec_r)<< std::endl; + exit(1); + } + + CUSTOMREAL DTi = 0.0, DTj = 0.0, DTk = 0.0; + + if (is_in_subdomain) { + + // descretized source position (LOCAL) ID) + int i_rec = std::floor((rec_lon - grid.get_lon_min_loc()) / delta_lon); + int j_rec = std::floor((rec_lat - grid.get_lat_min_loc()) / delta_lat); + int k_rec = std::floor((rec_r - grid.get_r_min_loc()) / delta_r); + + // std::cout << "lon: " << rec.lon << ", lat: " << rec.lat << ", dep: " << rec.dep << std::endl; + // std::cout << "i_rec: " << i_rec << ", j_rec: " << j_rec << ", k_rec: " << k_rec << std::endl; + + // discretized receiver position + CUSTOMREAL dis_rec_lon = grid.p_loc_1d[i_rec]; + CUSTOMREAL dis_rec_lat = grid.t_loc_1d[j_rec]; + CUSTOMREAL dis_rec_r = grid.r_loc_1d[k_rec]; + + // relative position errors + CUSTOMREAL e_lon = std::min({_1_CR,(rec_lon - dis_rec_lon)/delta_lon}); + CUSTOMREAL e_lat = std::min({_1_CR,(rec_lat - dis_rec_lat)/delta_lat}); + CUSTOMREAL e_r = std::min({_1_CR,(rec_r - dis_rec_r) /delta_r}); + + // numerical precision errors on std::floor + if (e_lon >= _1_CR) { + e_lon = e_lon - _1_CR; + i_rec++; + } else if (e_lon < 0) { + e_lon = e_lon + _1_CR; + i_rec--; + } + + if (e_lat == _1_CR) { + e_lat = 0.0; + j_rec++; + } else if (e_lat < 0) { + e_lat = e_lat + _1_CR; + j_rec--; + } + + if (e_r == _1_CR) { + e_r = 0.0; + k_rec++; + } else if (e_r < 0) { + e_r = e_r + _1_CR; + k_rec--; + } + + int i_rec_p1 = i_rec + 1; + int j_rec_p1 = j_rec + 1; + int k_rec_p1 = k_rec + 1; + int i_rec_m1 = i_rec - 1; + int j_rec_m1 = j_rec - 1; + int k_rec_m1 = k_rec - 1; + int i_rec_p1p1 = i_rec + 2; + int j_rec_p1p1 = j_rec + 2; + int k_rec_p1p1 = k_rec + 2; + + // treatment for the nodes on the bounary + // if not, sources cannot go over the subdomain boundary + if (i_rec == 0) + i_rec_m1 += 1; + if (j_rec == 0) + j_rec_m1 += 1; + if (k_rec == 0) + k_rec_m1 += 1; + if (i_rec_p1 == loc_I-1) + i_rec_p1p1 -= 1; + if (j_rec_p1 == loc_J-1) + j_rec_p1p1 -= 1; + if (k_rec_p1 == loc_K-1) + k_rec_p1p1 -= 1; + + CUSTOMREAL DT1, DT2, DT3, DT4, DT5, DT6, DT7, DT8; + DT1 = (grid.T_loc[I2V(i_rec, j_rec, k_rec_p1)] - grid.T_loc[I2V(i_rec, j_rec, k_rec_m1)]) / _2_CR / delta_r; + DT2 = (grid.T_loc[I2V(i_rec_p1, j_rec, k_rec_p1)] - grid.T_loc[I2V(i_rec_p1, j_rec, k_rec_m1)]) / _2_CR / delta_r; + DT3 = (grid.T_loc[I2V(i_rec, j_rec_p1, k_rec_p1)] - grid.T_loc[I2V(i_rec, j_rec_p1, k_rec_m1)]) / _2_CR / delta_r; + DT4 = (grid.T_loc[I2V(i_rec_p1, j_rec_p1, k_rec_p1)] - grid.T_loc[I2V(i_rec_p1, j_rec_p1, k_rec_m1)]) / _2_CR / delta_r; + DT5 = (grid.T_loc[I2V(i_rec, j_rec, k_rec_p1p1)] - grid.T_loc[I2V(i_rec, j_rec, k_rec)]) / _2_CR / delta_r; + DT6 = (grid.T_loc[I2V(i_rec_p1, j_rec, k_rec_p1p1)] - grid.T_loc[I2V(i_rec_p1, j_rec, k_rec)]) / _2_CR / delta_r; + DT7 = (grid.T_loc[I2V(i_rec, j_rec_p1, k_rec_p1p1)] - grid.T_loc[I2V(i_rec, j_rec_p1, k_rec)]) / _2_CR / delta_r; + DT8 = (grid.T_loc[I2V(i_rec_p1, j_rec_p1, k_rec_p1p1)] - grid.T_loc[I2V(i_rec_p1, j_rec_p1, k_rec)]) / _2_CR / delta_r; + + DTk = (_1_CR - e_lon) * (_1_CR - e_lat) * (_1_CR - e_r) * DT1 + + e_lon * (_1_CR - e_lat) * (_1_CR - e_r) * DT2 + + (_1_CR - e_lon) * e_lat * (_1_CR - e_r) * DT3 + + e_lon * e_lat * (_1_CR - e_r) * DT4 + + (_1_CR - e_lon) * (_1_CR - e_lat) * e_r * DT5 + + e_lon * (_1_CR - e_lat) * e_r * DT6 + + (_1_CR - e_lon) * e_lat * e_r * DT7 + + e_lon * e_lat * e_r * DT8; + + DT1 = (grid.T_loc[I2V(i_rec, j_rec_p1, k_rec )] - grid.T_loc[I2V(i_rec, j_rec_m1, k_rec )]) / _2_CR / delta_lat; + DT2 = (grid.T_loc[I2V(i_rec_p1, j_rec_p1, k_rec )] - grid.T_loc[I2V(i_rec_p1, j_rec_m1, k_rec )]) / _2_CR / delta_lat; + DT3 = (grid.T_loc[I2V(i_rec, j_rec_p1p1, k_rec )] - grid.T_loc[I2V(i_rec, j_rec, k_rec )]) / _2_CR / delta_lat; + DT4 = (grid.T_loc[I2V(i_rec_p1, j_rec_p1p1, k_rec )] - grid.T_loc[I2V(i_rec_p1, j_rec, k_rec )]) / _2_CR / delta_lat; + DT5 = (grid.T_loc[I2V(i_rec, j_rec_p1, k_rec_p1)] - grid.T_loc[I2V(i_rec, j_rec_m1, k_rec_p1)]) / _2_CR / delta_lat; + DT6 = (grid.T_loc[I2V(i_rec_p1, j_rec_p1, k_rec_p1)] - grid.T_loc[I2V(i_rec_p1, j_rec_m1, k_rec_p1)]) / _2_CR / delta_lat; + DT7 = (grid.T_loc[I2V(i_rec, j_rec_p1p1, k_rec_p1)] - grid.T_loc[I2V(i_rec, j_rec, k_rec_p1)]) / _2_CR / delta_lat; + DT8 = (grid.T_loc[I2V(i_rec_p1, j_rec_p1p1, k_rec_p1)] - grid.T_loc[I2V(i_rec_p1, j_rec, k_rec_p1)]) / _2_CR / delta_lat; + + DTj = (_1_CR - e_lon) * (_1_CR - e_lat) * (_1_CR - e_r) * DT1 + + e_lon * (_1_CR - e_lat) * (_1_CR - e_r) * DT2 + + (_1_CR - e_lon) * e_lat * (_1_CR - e_r) * DT3 + + e_lon * e_lat * (_1_CR - e_r) * DT4 + + (_1_CR - e_lon) * (_1_CR - e_lat) * e_r * DT5 + + e_lon * (_1_CR - e_lat) * e_r * DT6 + + (_1_CR - e_lon) * e_lat * e_r * DT7 + + e_lon * e_lat * e_r * DT8; + + DT1 = (grid.T_loc[I2V(i_rec_p1, j_rec , k_rec )] - grid.T_loc[I2V(i_rec_m1, j_rec , k_rec )]) / _2_CR / delta_lon; + DT2 = (grid.T_loc[I2V(i_rec_p1p1, j_rec , k_rec )] - grid.T_loc[I2V(i_rec, j_rec , k_rec )]) / _2_CR / delta_lon; + DT3 = (grid.T_loc[I2V(i_rec_p1, j_rec_p1, k_rec )] - grid.T_loc[I2V(i_rec_m1, j_rec_p1, k_rec )]) / _2_CR / delta_lon; + DT4 = (grid.T_loc[I2V(i_rec_p1p1, j_rec_p1, k_rec )] - grid.T_loc[I2V(i_rec, j_rec_p1, k_rec )]) / _2_CR / delta_lon; + DT5 = (grid.T_loc[I2V(i_rec_p1, j_rec , k_rec_p1)] - grid.T_loc[I2V(i_rec_m1, j_rec , k_rec_p1)]) / _2_CR / delta_lon; + DT6 = (grid.T_loc[I2V(i_rec_p1p1, j_rec , k_rec_p1)] - grid.T_loc[I2V(i_rec, j_rec , k_rec_p1)]) / _2_CR / delta_lon; + DT7 = (grid.T_loc[I2V(i_rec_p1, j_rec_p1, k_rec_p1)] - grid.T_loc[I2V(i_rec_m1, j_rec_p1, k_rec_p1)]) / _2_CR / delta_lon; + DT8 = (grid.T_loc[I2V(i_rec_p1p1, j_rec_p1, k_rec_p1)] - grid.T_loc[I2V(i_rec, j_rec_p1, k_rec_p1)]) / _2_CR / delta_lon; + + DTi = (_1_CR - e_lon) * (_1_CR - e_lat) * (_1_CR - e_r) * DT1 + + e_lon * (_1_CR - e_lat) * (_1_CR - e_r) * DT2 + + (_1_CR - e_lon) * e_lat * (_1_CR - e_r) * DT3 + + e_lon * e_lat * (_1_CR - e_r) * DT4 + + (_1_CR - e_lon) * (_1_CR - e_lat) * e_r * DT5 + + e_lon * (_1_CR - e_lat) * e_r * DT6 + + (_1_CR - e_lon) * e_lat * e_r * DT7 + + e_lon * e_lat * e_r * DT8; + // std::cout << grid.T_loc[I2V(i_rec + 1, j_rec , k_rec )] << ", " << grid.T_loc[I2V(i_rec - 1, j_rec , k_rec )] + // << ", " << _2_CR * delta_lon << std::endl; + // std::cout << DT1 << "," << DT2 << "," << DT3 << "," << DT4 << "," << DT5 << "," << DT6 << "," << DT7 << "," << DT8 <first].is_stop) continue; // keep the completed tau_opt + +// iter->second.tau_opt /= iter->second.sum_weight; + +// //std::cout << "DEBUG1: id_sim" << id_sim << ", name: " << iter->first << ", ortime: " << iter->second.tau_opt < Receiver::calculate_obj_reloc(InputParams& IP, int i_iter){ + + CUSTOMREAL obj = 0.0; + CUSTOMREAL obj_abs = 0.0; + CUSTOMREAL obj_cs_dif = 0.0; + CUSTOMREAL obj_cr_dif = 0.0; + CUSTOMREAL obj_tele = 0.0; + CUSTOMREAL res = 0.0; + CUSTOMREAL res_sq = 0.0; + CUSTOMREAL res_abs = 0.0; + CUSTOMREAL res_abs_sq = 0.0; + CUSTOMREAL res_cs_dif = 0.0; + CUSTOMREAL res_cs_dif_sq = 0.0; + CUSTOMREAL res_cr_dif = 0.0; + CUSTOMREAL res_cr_dif_sq = 0.0; + CUSTOMREAL res_tele = 0.0; + CUSTOMREAL res_tele_sq = 0.0; + + // sum obj_residual from all sources + std::vector obj_residual; + + if (proc_store_srcrec) { + + for (auto it_src = IP.data_map.begin(); it_src != IP.data_map.end(); it_src++) { + std::string name_src = it_src->first; + for (auto it_rec = IP.data_map[name_src].begin(); it_rec != IP.data_map[name_src].end(); it_rec++) { + for (const auto& data: it_rec->second){ + + if (data.dual_data) continue; // dual data is not used for calculating obj and residual + + // case 1: absolute traveltime for reloc + if (data.is_src_rec){ // abs data && we use it + std::string name_rec = data.name_rec; + + // assign obj + if (IP.get_use_abs_reloc()){ + IP.rec_map[name_rec].vobj_src_reloc += data.weight_reloc * my_square(data.travel_time - data.travel_time_obs + IP.rec_map[name_rec].tau_opt); + obj += data.weight_reloc * my_square(data.travel_time - data.travel_time_obs + IP.rec_map[name_rec].tau_opt); + } + // assign obj + obj_abs += data.weight_reloc * my_square(data.travel_time - data.travel_time_obs + IP.rec_map[name_rec].tau_opt); + + // assign residual + res += (data.travel_time - data.travel_time_obs + IP.rec_map[name_rec].tau_opt); + res_sq += my_square(data.travel_time - data.travel_time_obs + IP.rec_map[name_rec].tau_opt); + + res_abs += (data.travel_time - data.travel_time_obs + IP.rec_map[name_rec].tau_opt); + res_abs_sq += my_square(data.travel_time - data.travel_time_obs + IP.rec_map[name_rec].tau_opt); + + // case 2: common receiver (swapped source) double difference (double source, or double swapped receiver) for reloc + } else if (data.is_rec_pair ) { // common receiver data (swapped common source) + + std::string name_rec1 = data.name_rec_pair[0]; + std::string name_rec2 = data.name_rec_pair[1]; + + // if(IP.rec_map[name_rec1].is_stop && IP.rec_map[name_rec2].is_stop) continue; + + // assign obj (for EQ1, obj+1, for EQ2, obj+1, and for total obj also +1) + if (IP.get_use_cr_reloc()){ + IP.rec_map[name_rec1].vobj_src_reloc+= 1.0 * data.weight_reloc * my_square(data.cs_dif_travel_time - data.cs_dif_travel_time_obs + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt); + IP.rec_map[name_rec2].vobj_src_reloc+= 1.0 * data.weight_reloc * my_square(data.cs_dif_travel_time - data.cs_dif_travel_time_obs + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt); + obj += 1.0 * data.weight_reloc * my_square(data.cs_dif_travel_time - data.cs_dif_travel_time_obs + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt); + } + + // assign obj + obj_cs_dif += 1.0 * data.weight_reloc * my_square(data.cs_dif_travel_time - data.cs_dif_travel_time_obs + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt); + + // assign residual + res += 1.0 * (data.cs_dif_travel_time - data.cs_dif_travel_time_obs + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt); + res_sq += 1.0 * my_square(data.cs_dif_travel_time - data.cs_dif_travel_time_obs + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt); + + res_cs_dif += 1.0 * (data.cs_dif_travel_time - data.cs_dif_travel_time_obs + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt); + res_cs_dif_sq += 1.0 * my_square(data.cs_dif_travel_time - data.cs_dif_travel_time_obs + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt); + + // } + + } else if (data.is_src_pair) { // we only record the obj of this kind of data + std::string name_rec = data.name_rec; + + // if(IP.rec_map[name_rec].is_stop) continue; + + // assign obj + if (IP.get_use_cs_reloc()){ + IP.rec_map[name_rec].vobj_src_reloc += 1.0 * data.weight_reloc * my_square(data.cr_dif_travel_time - data.cr_dif_travel_time_obs); + obj += 1.0 * data.weight_reloc * my_square(data.cr_dif_travel_time - data.cr_dif_travel_time_obs); + } + + // assign obj + obj_cr_dif += 1.0 * data.weight_reloc * my_square(data.cr_dif_travel_time - data.cr_dif_travel_time_obs); + + // assign residual + res += 1.0 * (data.cr_dif_travel_time - data.cr_dif_travel_time_obs); + res_sq += 1.0 * my_square(data.cr_dif_travel_time - data.cr_dif_travel_time_obs); + + res_cr_dif += 1.0 * (data.cr_dif_travel_time - data.cr_dif_travel_time_obs); + res_cr_dif_sq += 1.0 * my_square(data.cr_dif_travel_time - data.cr_dif_travel_time_obs); + + } else { // unsupported data (swapped common receiver, or others) + continue; + } + } + + } + } // end of loop over all sources + + // sum the obj from all sources (swapped receivers) + IP.allreduce_rec_map_vobj_src_reloc(); + + } // end of if (proc_store_srcrec) + + synchronize_all_world(); + + broadcast_cr_single(obj,0); + broadcast_cr_single(obj_abs,0); + broadcast_cr_single(obj_cs_dif,0); + broadcast_cr_single(obj_cr_dif,0); + broadcast_cr_single(obj_tele,0); + broadcast_cr_single(res,0); + broadcast_cr_single(res_sq,0); + broadcast_cr_single(res_abs,0); + broadcast_cr_single(res_abs_sq,0); + broadcast_cr_single(res_cs_dif,0); + broadcast_cr_single(res_cs_dif_sq,0); + broadcast_cr_single(res_cr_dif,0); + broadcast_cr_single(res_cr_dif_sq,0); + broadcast_cr_single(res_tele,0); + broadcast_cr_single(res_tele_sq,0); + + broadcast_cr_single_sub(obj,0); + broadcast_cr_single_sub(obj_abs,0); + broadcast_cr_single_sub(obj_cs_dif,0); + broadcast_cr_single_sub(obj_cr_dif,0); + broadcast_cr_single_sub(obj_tele,0); + broadcast_cr_single_sub(res,0); + broadcast_cr_single_sub(res_sq,0); + broadcast_cr_single_sub(res_abs,0); + broadcast_cr_single_sub(res_abs_sq,0); + broadcast_cr_single_sub(res_cs_dif,0); + broadcast_cr_single_sub(res_cs_dif_sq,0); + broadcast_cr_single_sub(res_cr_dif,0); + broadcast_cr_single_sub(res_cr_dif_sq,0); + broadcast_cr_single_sub(res_tele,0); + broadcast_cr_single_sub(res_tele_sq,0); + + + obj_residual = {obj, obj_abs, obj_cs_dif, obj_cr_dif, obj_tele, res, res_sq, res_abs, res_abs_sq, res_cs_dif, res_cs_dif_sq, res_cr_dif, res_cr_dif_sq, res_tele, res_tele_sq}; + + for(int i = 0; i < (int)obj_residual.size(); i++){ + allreduce_cr_sim_single_inplace(obj_residual[i]); + } + + if (proc_store_srcrec) { + for (auto iter = IP.rec_map.begin(); iter != IP.rec_map.end(); iter++){ + CUSTOMREAL obj = iter->second.vobj_src_reloc; + CUSTOMREAL old_obj = iter->second.vobj_src_reloc_old; + if (i_iter != 0 && old_obj < obj){ // if obj increase, decrease the step length of this (swapped) source + // std::cout << "before, step_length_max: " << iter->second.step_length_max << "step_length_decay: " << step_length_decay << std::endl; + iter->second.step_length_max *= step_length_decay_src_reloc; + // std::cout << "after, step_length_max: " << iter->second.step_length_max << "step_length_decay: " << step_length_decay << std::endl; + } + // std::cout << "id_sim: " << id_sim << ", name: " << iter->first << ", obj: " << obj << ", old obj: " << old_obj << ", step_length_max: " << iter->second.step_length_max + // << ", step_length_decay: " << step_length_decay + // << std::endl; + } + } + + return obj_residual; +} + + +// calculate the gradient of the objective function +void Receiver::calculate_grad_obj_src_reloc(InputParams& IP, const std::string& name_sim_src) { + + if(proc_store_srcrec){ + // calculate gradient of travel time at each receiver (swapped source) + for (auto iter = IP.data_map[name_sim_src].begin(); iter != IP.data_map[name_sim_src].end(); iter++){ + for (const auto& data: iter->second) { + // case 1: absolute traveltime for reloc + if (data.is_src_rec && IP.get_use_abs_reloc()){ // abs data && we use it + std::string name_rec = data.name_rec; + + if(IP.rec_map[name_rec].is_stop) continue; // if this receiver (swapped source) is already located + + CUSTOMREAL syn_time = data.travel_time; + CUSTOMREAL obs_time = data.travel_time_obs; + + // local weight + CUSTOMREAL local_weight = 1.0; + + // evaluate residual_weight_abs_reloc + CUSTOMREAL local_residual = abs(syn_time - obs_time + IP.rec_map[name_rec].tau_opt); + CUSTOMREAL* res_weight = IP.get_residual_weight_abs_reloc(); + + if (local_residual < res_weight[0]) local_weight *= res_weight[2]; + else if (local_residual > res_weight[1]) local_weight *= res_weight[3]; + else local_weight *= ((local_residual - res_weight[0])/(res_weight[1] - res_weight[0]) * (res_weight[3] - res_weight[2]) + res_weight[2]); + + // evaluate distance_weight_abs_reloc + CUSTOMREAL local_dis = 0.0; + Epicentral_distance_sphere(IP.get_rec_point(name_rec).lat*DEG2RAD, IP.get_rec_point(name_rec).lon*DEG2RAD, IP.get_src_point(name_sim_src).lat*DEG2RAD, IP.get_src_point(name_sim_src).lon*DEG2RAD, local_dis); + local_dis *= R_earth; // rad to km + CUSTOMREAL* dis_weight = IP.get_distance_weight_abs_reloc(); + + if (local_dis < dis_weight[0]) local_weight *= dis_weight[2]; + else if (local_dis > dis_weight[1]) local_weight *= dis_weight[3]; + else local_weight *= ((local_dis - dis_weight[0])/(dis_weight[1] - dis_weight[0]) * (dis_weight[3] - dis_weight[2]) + dis_weight[2]); + + // assign kernel + IP.rec_map[name_rec].grad_chi_k += (syn_time - obs_time + IP.rec_map[name_rec].tau_opt) * data.DTk * data.weight_reloc * local_weight; + IP.rec_map[name_rec].grad_chi_j += (syn_time - obs_time + IP.rec_map[name_rec].tau_opt) * data.DTj * data.weight_reloc * local_weight; + IP.rec_map[name_rec].grad_chi_i += (syn_time - obs_time + IP.rec_map[name_rec].tau_opt) * data.DTi * data.weight_reloc * local_weight; + IP.rec_map[name_rec].grad_tau += (syn_time - obs_time + IP.rec_map[name_rec].tau_opt) * data.weight_reloc * local_weight; + + // count the data + IP.rec_map[name_rec].Ndata += 1; + // case 2: common receiver (swapped source) double difference (double source, or double swapped receiver) for reloc + } else if (data.is_rec_pair && IP.get_use_cr_reloc()) { // common receiver data (swapped common source) and we use it. + std::string name_rec1 = data.name_rec_pair[0]; + std::string name_rec2 = data.name_rec_pair[1]; + + if(IP.rec_map[name_rec1].is_stop && IP.rec_map[name_rec2].is_stop) continue; // if both receivers (swapped sources) are already located + + CUSTOMREAL syn_dif_time = data.cs_dif_travel_time; + CUSTOMREAL obs_dif_time = data.cs_dif_travel_time_obs; + + // assign local weight + CUSTOMREAL local_weight = 1.0; + + // evaluate residual_weight_abs + CUSTOMREAL local_residual = abs(syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt); + CUSTOMREAL* res_weight = IP.get_residual_weight_cr_reloc(); // common receiver when not swapped + + if (local_residual < res_weight[0]) local_weight *= res_weight[2]; + else if (local_residual > res_weight[1]) local_weight *= res_weight[3]; + else local_weight *= ((local_residual - res_weight[0])/(res_weight[1] - res_weight[0]) * (res_weight[3] - res_weight[2]) + res_weight[2]); + + // evaluate distance_weight_abs + CUSTOMREAL local_azi1 = 0.0; + Azimuth_sphere(IP.get_rec_point(name_rec1).lat*DEG2RAD, IP.get_rec_point(name_rec1).lon*DEG2RAD, IP.get_src_point(name_sim_src).lat*DEG2RAD, IP.get_src_point(name_sim_src).lon*DEG2RAD, local_azi1); + CUSTOMREAL local_azi2 = 0.0; + Azimuth_sphere(IP.get_rec_point(name_rec2).lat*DEG2RAD, IP.get_rec_point(name_rec2).lon*DEG2RAD, IP.get_src_point(name_sim_src).lat*DEG2RAD, IP.get_src_point(name_sim_src).lon*DEG2RAD, local_azi2); + CUSTOMREAL local_azi = abs(local_azi1 - local_azi2)*RAD2DEG; + if(local_azi > 180.0) local_azi = 360.0 - local_azi; + + CUSTOMREAL* azi_weight = IP.get_azimuthal_weight_cr_reloc(); + + if (local_azi < azi_weight[0]) local_weight *= azi_weight[2]; + else if (local_azi > azi_weight[1]) local_weight *= azi_weight[3]; + else local_weight *= ((local_azi - azi_weight[0])/(azi_weight[1] - azi_weight[0]) * (azi_weight[3] - azi_weight[2]) + azi_weight[2]); + + // assign kernel + if(!IP.rec_map[name_rec1].is_stop){ + IP.rec_map[name_rec1].grad_chi_k += (syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt) * data.DTk_pair[0] * data.weight_reloc * local_weight; + IP.rec_map[name_rec1].grad_chi_j += (syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt) * data.DTj_pair[0] * data.weight_reloc * local_weight; + IP.rec_map[name_rec1].grad_chi_i += (syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt) * data.DTi_pair[0] * data.weight_reloc * local_weight; + IP.rec_map[name_rec1].grad_tau += (syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt) * data.weight_reloc * local_weight; + IP.rec_map[name_rec1].Ndata += 1; + } + if(!IP.rec_map[name_rec2].is_stop){ + IP.rec_map[name_rec2].grad_chi_k -= (syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt) * data.DTk_pair[1] * data.weight_reloc * local_weight; + IP.rec_map[name_rec2].grad_chi_j -= (syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt) * data.DTj_pair[1] * data.weight_reloc * local_weight; + IP.rec_map[name_rec2].grad_chi_i -= (syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt) * data.DTi_pair[1] * data.weight_reloc * local_weight; + IP.rec_map[name_rec2].grad_tau -= (syn_dif_time - obs_dif_time + IP.rec_map[name_rec1].tau_opt - IP.rec_map[name_rec2].tau_opt) * data.weight_reloc * local_weight; + IP.rec_map[name_rec2].Ndata += 1; + } + + // case 3: common source (swapped receiver) double difference (double receiver, or double swapped source) for reloc + } else if (data.is_src_pair && IP.get_use_cs_reloc()) { // common receiver data (swapped common source) and we use it. + std::string name_src1 = data.name_src_pair[0]; + std::string name_src2 = data.name_src_pair[1]; + std::string name_rec = data.name_rec; + + if(IP.rec_map[name_rec].is_stop) continue; // if both receivers (swapped sources) are already located + + CUSTOMREAL syn_dif_time = data.cr_dif_travel_time; + CUSTOMREAL obs_dif_time = data.cr_dif_travel_time_obs; + + // assign local weight + CUSTOMREAL local_weight = 1.0; + + // evaluate residual_weight_abs + CUSTOMREAL local_residual = abs(syn_dif_time - obs_dif_time); // common swapped source, so ortime is cancelled. + CUSTOMREAL* res_weight = IP.get_residual_weight_cs_reloc(); // common receiver when not swapped + + if (local_residual < res_weight[0]) local_weight *= res_weight[2]; + else if (local_residual > res_weight[1]) local_weight *= res_weight[3]; + else local_weight *= ((local_residual - res_weight[0])/(res_weight[1] - res_weight[0]) * (res_weight[3] - res_weight[2]) + res_weight[2]); + + // evaluate distance_weight_abs + CUSTOMREAL local_azi1 = 0.0; + Azimuth_sphere(IP.get_rec_point(name_rec).lat*DEG2RAD, IP.get_rec_point(name_rec).lon*DEG2RAD, IP.get_src_point(name_src1).lat*DEG2RAD, IP.get_src_point(name_src2).lon*DEG2RAD, local_azi1); + CUSTOMREAL local_azi2 = 0.0; + Azimuth_sphere(IP.get_rec_point(name_rec).lat*DEG2RAD, IP.get_rec_point(name_rec).lon*DEG2RAD, IP.get_src_point(name_src1).lat*DEG2RAD, IP.get_src_point(name_src2).lon*DEG2RAD, local_azi2); + CUSTOMREAL local_azi = abs(local_azi1 - local_azi2)*RAD2DEG; + if(local_azi > 180.0) local_azi = 360.0 - local_azi; + + CUSTOMREAL* azi_weight = IP.get_azimuthal_weight_cs_reloc(); + + if (local_azi < azi_weight[0]) local_weight *= azi_weight[2]; + else if (local_azi > azi_weight[1]) local_weight *= azi_weight[3]; + else local_weight *= ((local_azi - azi_weight[0])/(azi_weight[1] - azi_weight[0]) * (azi_weight[3] - azi_weight[2]) + azi_weight[2]); + + // assign kernel (we only consider the DTijk of first source (swapped receiver), because only the DTijk of the first source is calculated) + IP.rec_map[name_rec].grad_chi_k += (syn_dif_time - obs_dif_time) * data.DTk * data.weight_reloc * local_weight; + IP.rec_map[name_rec].grad_chi_j += (syn_dif_time - obs_dif_time) * data.DTj * data.weight_reloc * local_weight; + IP.rec_map[name_rec].grad_chi_i += (syn_dif_time - obs_dif_time) * data.DTi * data.weight_reloc * local_weight; + IP.rec_map[name_rec].grad_tau += 0; // common swapped source, so ortime is cancelled. + IP.rec_map[name_rec].Ndata += 1; + + // The DTijk of the second source (swapped receiver) will be considered when the loop goes to the other common receiver data with the other source as the key value + + } else { // unsupported data (swapped common receiver, or others) + continue; + } + } + } // end of loop over all data_map for this src + } // end of if(proc_store_srcrec) +} + +void Receiver::update_source_location(InputParams& IP, Grid& grid) { + + if (proc_store_srcrec) { + // get list of receivers from input parameters + for(auto iter = IP.rec_map.begin(); iter != IP.rec_map.end(); iter++){ + + std::string name_rec = iter->first; + + if (IP.rec_map[name_rec].is_stop){ // do not relocation + // do nothing + } else if (IP.rec_map[name_rec].Ndata < min_Ndata_reloc) { + IP.rec_map[name_rec].is_stop = true; + } else { + // Here grad_dep_km is the kernel of obj with respect to the depth (unit is km) * rescaling_dep. The same for lat,lon,ortime + CUSTOMREAL grad_dep_km = 0.0; + if (abs(max_change_dep - abs(IP.rec_map[name_rec].change_dep)) < 0.001) + grad_dep_km = 0.0; + else + grad_dep_km = - IP.rec_map[name_rec].grad_chi_k * rescaling_dep; // over rescaling_dep is rescaling + + CUSTOMREAL grad_lat_km = 0.0; + if (abs(max_change_lat - abs(IP.rec_map[name_rec].change_lat)) < 0.001) + grad_lat_km = 0.0; + else + grad_lat_km = IP.rec_map[name_rec].grad_chi_j/(R_earth) * rescaling_lat; + + CUSTOMREAL grad_lon_km = 0.0; + if (abs(max_change_lon - abs(IP.rec_map[name_rec].change_lon)) < 0.001) + grad_lon_km = 0.0; + else + grad_lon_km = IP.rec_map[name_rec].grad_chi_i/(R_earth * cos(IP.rec_map[name_rec].lat * DEG2RAD)) * rescaling_lon; + + CUSTOMREAL grad_ortime = 0.0; + if (abs(max_change_ortime - abs(IP.rec_map[name_rec].change_tau)) < 0.001) + grad_ortime = 0.0; + else + grad_ortime = IP.rec_map[name_rec].grad_tau * rescaling_ortime; + + CUSTOMREAL norm_grad; + norm_grad = std::sqrt(my_square(grad_dep_km) + my_square(grad_lat_km) + my_square(grad_lon_km) + my_square(grad_ortime)); + + // if norm is smaller than a threshold, stop update + if (norm_grad < TOL_SRC_RELOC){ + IP.rec_map[name_rec].is_stop = true; + continue; + } + + CUSTOMREAL step_length; + step_length = 0.5 * IP.rec_map[name_rec].vobj_src_reloc/my_square(norm_grad); + + // rescale update value for perturbation of dep/rescaling_dep, lat/rescaling_lat, lon/rescaling_lon, time/rescaling_ortime + CUSTOMREAL update_dep = step_length * grad_dep_km; + CUSTOMREAL update_lat = step_length * grad_lat_km; + CUSTOMREAL update_lon = step_length * grad_lon_km; + CUSTOMREAL update_ortime = step_length * grad_ortime; + + CUSTOMREAL update_max = -1.0; + CUSTOMREAL downscale = 1.0; + update_max = std::max(update_max,abs(update_dep)); + update_max = std::max(update_max,abs(update_lat)); + update_max = std::max(update_max,abs(update_lon)); + update_max = std::max(update_max,abs(update_ortime)); + if (update_max > IP.rec_map[name_rec].step_length_max){ // make sure update_max * downscale = min(step_length_max, update_max) + downscale = IP.rec_map[name_rec].step_length_max / update_max; + } + + // update value for dep (km), lat (km), lon (km), ortime (s) + CUSTOMREAL update_dep_km = - update_dep * downscale * rescaling_dep; + CUSTOMREAL update_lat_km = - update_lat * downscale * rescaling_lat; // / R_earth * RAD2DEG; + CUSTOMREAL update_lon_km = - update_lon * downscale * rescaling_lon; // / (R_earth * cos(IP.rec_map[name_rec].lat * DEG2RAD)) * RAD2DEG; + CUSTOMREAL update_ortime_s = - update_ortime * downscale * rescaling_ortime; + + + // limit the update for dep, lat, lon + if (abs(IP.rec_map[name_rec].change_dep + update_dep_km) > max_change_dep){ + if (IP.rec_map[name_rec].change_dep + update_dep_km > 0) + update_dep_km = max_change_dep - IP.rec_map[name_rec].change_dep; + else + update_dep_km = - max_change_dep - IP.rec_map[name_rec].change_dep; + + } + if (abs(IP.rec_map[name_rec].change_lat + update_lat_km) > max_change_lat){ + if (IP.rec_map[name_rec].change_lat + update_lat_km > 0) + update_lat_km = max_change_lat - IP.rec_map[name_rec].change_lat; + else + update_lat_km = - max_change_lat - IP.rec_map[name_rec].change_lat; + } + if (abs(IP.rec_map[name_rec].change_lon + update_lon_km) > max_change_lon){ + if (IP.rec_map[name_rec].change_lon + update_lon_km > 0) + update_lon_km = max_change_lon - IP.rec_map[name_rec].change_lon; + else + update_lon_km = - max_change_lon - IP.rec_map[name_rec].change_lon; + } + if (abs(IP.rec_map[name_rec].change_tau + update_ortime_s) > max_change_ortime){ + if (IP.rec_map[name_rec].change_tau + update_ortime_s > 0) + update_ortime_s = max_change_ortime - IP.rec_map[name_rec].change_tau; + else + update_ortime_s = - max_change_ortime - IP.rec_map[name_rec].change_tau; + } + // remark: in the case of local search for ortime, change of ortime need to be checked as above + // in the case of global search for ortime, update_ortime is always zero (because grad_ortime = 0), thus always satisfied + + // earthquake should be below the surface (0 km) + if (IP.rec_map[name_rec].dep + update_dep_km < 0){ + // update_dep_km = - IP.rec_map[name_rec].dep; + update_dep_km = - 2.0 * IP.rec_map[name_rec].dep - update_dep_km; + } + + + // update value for dep (km), lat (degree), lon (degree) + IP.rec_map[name_rec].vobj_grad_norm_src_reloc = norm_grad; + + IP.rec_map[name_rec].dep += update_dep_km; + IP.rec_map[name_rec].lat += update_lat_km / R_earth * RAD2DEG; + IP.rec_map[name_rec].lon += update_lon_km /(R_earth * cos(IP.rec_map[name_rec].lat * DEG2RAD)) * RAD2DEG; + IP.rec_map[name_rec].tau_opt += update_ortime_s; + + IP.rec_map[name_rec].change_dep += update_dep_km; + IP.rec_map[name_rec].change_lat += update_lat_km; + IP.rec_map[name_rec].change_lon += update_lon_km; + IP.rec_map[name_rec].change_tau += update_ortime_s; + + + // if (IP.rec_map[name_rec].step_length_max < TOL_step_length){ + // IP.rec_map[name_rec].is_stop = true; + // } + + + + + // detect nan and inf then exit the program + if (std::isnan(IP.rec_map[name_rec].dep) || std::isinf(IP.rec_map[name_rec].dep) || + std::isnan(IP.rec_map[name_rec].lat) || std::isinf(IP.rec_map[name_rec].lat) || + std::isnan(IP.rec_map[name_rec].lon) || std::isinf(IP.rec_map[name_rec].lon)){ + std::cout << "Error: nan or inf detected in source relocation!" << std::endl; + std::cout << "id_sim: " << id_sim + << ", src name: " << name_rec + << ", obj: " << IP.rec_map[name_rec].vobj_src_reloc + << ", lat: " << IP.rec_map[name_rec].lat + << ", lon: " << IP.rec_map[name_rec].lon + << ", dep: " << IP.rec_map[name_rec].dep + << ", ortime: " << IP.rec_map[name_rec].tau_opt + << ", is_stop: " << IP.rec_map[name_rec].is_stop + << ", grad_dep_km(pert): " << grad_dep_km + << ", grad_lat_km(pert): " << grad_lat_km + << ", grad_lon_km(pert): " << grad_lon_km + << ", vobj_src_reloc: " << IP.rec_map[name_rec].vobj_src_reloc + << std::endl; + + exit(1); + } + + // check if the new receiver position is within the domain + // if not then set the receiver position to the closest point on the domain + + // gap to boundary + CUSTOMREAL boundary_gap_lon = _0_5_CR * grid.get_delta_lon() * RAD2DEG; + CUSTOMREAL boundary_gap_lat = _0_5_CR * grid.get_delta_lat() * RAD2DEG; + CUSTOMREAL boundary_gap_r = _0_5_CR * grid.get_delta_r(); + + if (IP.rec_map[name_rec].lon < IP.get_min_lon()*RAD2DEG){ + IP.rec_map[name_rec].lon = IP.get_min_lon()*RAD2DEG + boundary_gap_lon; + // report to user + std::cout << "Warning: source/receiver " << name_rec << " is out of domain in longitude, set the location near min_lon boundary: " << IP.get_min_lon()*RAD2DEG + boundary_gap_lon << std::endl; + } + if (IP.rec_map[name_rec].lon > IP.get_max_lon()*RAD2DEG){ + IP.rec_map[name_rec].lon = IP.get_max_lon()*RAD2DEG - boundary_gap_lon; + // report to user + std::cout << "Warning: source/receiver " << name_rec << " is out of domain in longitude, set the location near max_lon boundary: " << IP.get_max_lon()*RAD2DEG - boundary_gap_lon << std::endl; + } + if (IP.rec_map[name_rec].lat < IP.get_min_lat()*RAD2DEG){ + IP.rec_map[name_rec].lat = IP.get_min_lat()*RAD2DEG + boundary_gap_lat; + // report to user + std::cout << "Warning: source/receiver " << name_rec << " is out of domain in latitude, set the location near min_lat boundary: " << IP.get_min_lat()*RAD2DEG + boundary_gap_lat << std::endl; + } + if (IP.rec_map[name_rec].lat > IP.get_max_lat()*RAD2DEG){ + IP.rec_map[name_rec].lat = IP.get_max_lat()*RAD2DEG - boundary_gap_lat; + // report to user + std::cout << "Warning: source/receiver " << name_rec << " is out of domain in latitude, set the location near max_lat boundary: " << IP.get_max_lat()*RAD2DEG - boundary_gap_lat << std::endl; + } + if (IP.rec_map[name_rec].dep < IP.get_min_dep()){ + IP.rec_map[name_rec].dep = IP.get_min_dep() + boundary_gap_r; + // report to user + std::cout << "Warning: source/receiver " << name_rec << " is out of domain in depth, set the location near min_dep boundary: " << IP.get_min_dep() + boundary_gap_r << std::endl; + } + if (IP.rec_map[name_rec].dep > IP.get_max_dep()){ + IP.rec_map[name_rec].dep = IP.get_max_dep() - boundary_gap_r; + // report to user + std::cout << "Warning: source/receiver " << name_rec << " is out of domain in depth, set the location near max_dep boundary: " << IP.get_max_dep() - boundary_gap_r << std::endl; + } + } + + // share the flag of stop within the same simultanoue run group + //allreduce_bool_single_inplace(IP.rec_map[name_rec].is_stop); // this is done in src_rec->broadcast_rec_info_intra_sim + + } // end iter loopvobj_grad_norm_src_reloc + } // end if(proc_store_srcrec) + + //IP.allreduce_rec_map_vobj_grad_norm_src_reloc(); + +} diff --git a/src/source.cpp b/src/source.cpp new file mode 100644 index 0000000..d64b02d --- /dev/null +++ b/src/source.cpp @@ -0,0 +1,187 @@ +#include "source.h" + +void Source::set_source_position(InputParams &IP, Grid &grid, bool& is_teleseismic, const std::string& name_sim_src, bool for_2d_solver) { + + + if (subdom_main) { + if(if_verbose) stdout_by_main("--- start source initialization ---"); + + // copy some parameters + delta_lon = grid.get_delta_lon(); + delta_lat = grid.get_delta_lat(); + delta_r = grid.get_delta_r(); + + // set source position + if(!for_2d_solver){ + src_lon = IP.get_src_lon( name_sim_src); // in radian + src_lat = IP.get_src_lat( name_sim_src); // in radian + src_r = IP.get_src_radius(name_sim_src); // radious + } else { + // 2d src database (src_map_2d) is accessible from dedicated getters. + src_lon = IP.get_src_lon_2d( name_sim_src); // in radian + src_lat = IP.get_src_lat_2d( name_sim_src); // in radian + src_r = IP.get_src_radius_2d(name_sim_src); // radious + } + } + + // further initialization is not needed for teleseismic source + if (is_teleseismic) return; + + if (subdom_main) { + // descretize source position (LOCAL ID) + i_src_loc = std::floor((src_lon - grid.get_lon_min_loc()) / grid.get_delta_lon()); + j_src_loc = std::floor((src_lat - grid.get_lat_min_loc()) / grid.get_delta_lat()); + k_src_loc = std::floor((src_r - grid.get_r_min_loc()) / grid.get_delta_r()) ; + + if(i_src_loc +1 >= loc_I) + i_src_loc = loc_I - 2; + if(j_src_loc + 1 >= loc_J) + j_src_loc = loc_J - 2; + if(k_src_loc + 1 >= loc_K) + k_src_loc = loc_K - 2; + + // check if the source is in this subdomain (including the ghost nodes) + if (grid.get_lon_min_loc() <= src_lon && src_lon <= grid.get_lon_max_loc() && \ + grid.get_lat_min_loc() <= src_lat && src_lat <= grid.get_lat_max_loc() && \ + grid.get_r_min_loc() <= src_r && src_r <= grid.get_r_max_loc() ) { + is_in_subdomain = true; + } else { + // this flag should be reinitialized here + // because the src object is now reused by multiple events + // thus the flag is not reinitialized in the constructor + is_in_subdomain = false; + } + + // check the rank where the source is located + src_flags = new bool[nprocs]; + allgather_bool_single(&is_in_subdomain, src_flags); + int n_dom_src_tmp = 0; + for (int i = 0; i < nprocs; i++) { + if (src_flags[i]) { + src_rank = i; + n_dom_src_tmp++; + //break; + } + } + n_dom_src = n_dom_src_tmp; + + delete[] src_flags; + + + if (is_in_subdomain){ + // discretized source position (Global) + dis_src_lon = grid.p_loc_1d[i_src_loc]; + dis_src_lat = grid.t_loc_1d[j_src_loc]; + dis_src_r = grid.r_loc_1d[k_src_loc]; + + // position error + error_lon = (src_lon - dis_src_lon); + error_lat = (src_lat - dis_src_lat); + error_r = (src_r - dis_src_r); + + // relative position error + dis_src_err_lon = std::min(error_lon / grid.get_delta_lon(), _1_CR); + dis_src_err_lat = std::min(error_lat / grid.get_delta_lat(), _1_CR); + dis_src_err_r = std::min(error_r / grid.get_delta_r() , _1_CR); + + // precision error for std::floor + // if (dis_src_err_lon == _1_CR){ + // // i_src_loc shoud be +1 + // dis_src_err_lon = _0_CR; + // i_src_loc++; + // } + // if (dis_src_err_lat == _1_CR){ + // // j_src_loc shoud be +1 + // dis_src_err_lat = _0_CR; + // j_src_loc++; + // } + // if (dis_src_err_r == _1_CR){ + // // k_src_loc shoud be +1 + // dis_src_err_r = _0_CR; + // k_src_loc++; + // } + + // std::cout << "src_lon, dis_src_lon, dis_src_err_lon : " << src_lon*RAD2DEG << ", " << dis_src_lon*RAD2DEG << ", " << dis_src_err_lon << std::endl; + // std::cout << "src_lat, dis_src_lat, dis_src_err_lat : " << src_lat*RAD2DEG << ", " << dis_src_lat*RAD2DEG << ", " << dis_src_err_lat << std::endl; + // std::cout << "src_r, dis_src_r, dis_src_err_r : " << src_r << ", " << dis_src_r << ", " << dis_src_err_r << std::endl; + + if (if_verbose){ + std::cout << "src positions lon lat r : " << src_lon << " " << src_lat << " " << src_r << std::endl; + std::cout << "src positions lon(deg) lat(deg) depth(km): " << src_lon*RAD2DEG << " " << src_lat*RAD2DEG << " " << radius2depth(src_r) << std::endl; + std::cout << "src discretized position id i j k : " << i_src_loc << " " << j_src_loc << " " << k_src_loc << std::endl; + std::cout << "src discretized position lon lat r : " << dis_src_lon << " " << dis_src_lat << " " << dis_src_r << std::endl; + std::cout << "src position bias lon lat r : " << error_lon << " " << error_lat << " " << error_r << std::endl; + std::cout << "src relative position bias lon lat r : " << dis_src_err_lon << " " << dis_src_err_lat << " " << dis_src_err_r << std::endl; + std::cout << "delta lon lat r : " << delta_lon << " " << delta_lat << " " << delta_r << std::endl; + } + if(if_verbose) std::cout << "source is in the subdomain of rank " << myrank << std::endl; + if(if_verbose) std::cout << "local index of the source: " << i_src_loc << " " << j_src_loc << " " << k_src_loc << std::endl; + } + + if(if_verbose) stdout_by_main("--- end source initialization ---"); + } +} + + +Source::~Source() { +} + + +CUSTOMREAL Source::get_fac_at_source(CUSTOMREAL *loc_array, bool check) { + + // calculate factor by the rank where the source is located and broadcast to all + + CUSTOMREAL fac = 0.0; + + if (is_in_subdomain) { + fac = (_1_CR - dis_src_err_r)*(_1_CR - dis_src_err_lat)*(_1_CR - dis_src_err_lon) * get_fac_at_point(loc_array,0,0,0) \ + + (_1_CR - dis_src_err_r)*(_1_CR - dis_src_err_lat)* dis_src_err_lon * get_fac_at_point(loc_array,1,0,0) \ + + (_1_CR - dis_src_err_r)* dis_src_err_lat *(_1_CR - dis_src_err_lon) * get_fac_at_point(loc_array,0,1,0) \ + + (_1_CR - dis_src_err_r)* dis_src_err_lat * dis_src_err_lon * get_fac_at_point(loc_array,1,1,0) \ + + dis_src_err_r *(_1_CR - dis_src_err_lat)*(_1_CR - dis_src_err_lon) * get_fac_at_point(loc_array,0,0,1) \ + + dis_src_err_r *(_1_CR - dis_src_err_lat)* dis_src_err_lon * get_fac_at_point(loc_array,1,0,1) \ + + dis_src_err_r * dis_src_err_lat *(_1_CR - dis_src_err_lon) * get_fac_at_point(loc_array,0,1,1) \ + + dis_src_err_r * dis_src_err_lat * dis_src_err_lon * get_fac_at_point(loc_array,1,1,1); + } else { + // do nothing + } + + //if (check && fac<0 && src_rank==myrank){ + if (check && is_in_subdomain){ + std::cout << "src positions lon lat r : " << src_lon << " " << src_lat << " " << src_r << std::endl; + std::cout << "src positions lon(deg) lat(deg) depth(km): " << src_lon*RAD2DEG << " " << src_lat*RAD2DEG << " " << radius2depth(src_r) << std::endl; + std::cout << "src discretized position id i j k : " << i_src_loc << " " << j_src_loc << " " << k_src_loc << std::endl; + std::cout << "src discretized position lon lat r : " << dis_src_lon << " " << dis_src_lat << " " << dis_src_r << std::endl; + std::cout << "src position bias lon lat r : " << error_lon << " " << error_lat << " " << error_r << std::endl; + std::cout << "src relative position bias lon lat r : " << dis_src_err_lon << " " << dis_src_err_lat << " " << dis_src_err_r << std::endl; + std::cout << "delta lon lat r : " << delta_lon << " " << delta_lat << " " << delta_r << std::endl; + std::cout << "source is in the subdomain of rank " << myrank << std::endl; + + // check loc_array value + std::cout << "loc_array value: " << std::endl; + std::cout << get_fac_at_point(loc_array,0,0,0) << ' ' << get_fac_at_point(loc_array,1,0,0) << ' ' << get_fac_at_point(loc_array,0,1,0) << ' ' << get_fac_at_point(loc_array,1,1,0) << std::endl; + std::cout << get_fac_at_point(loc_array,0,0,1) << ' ' << get_fac_at_point(loc_array,1,0,1) << ' ' << get_fac_at_point(loc_array,0,1,1) << ' ' << get_fac_at_point(loc_array,1,1,1) << std::endl; + std::cout << "fac: " << fac << std::endl; + + //exit(1); + } + + //broadcast_cr_single(fac, src_rank); + // std::cout << "interp: " << dis_src_err_r << ' ' << dis_src_err_lat << ' ' << dis_src_err_lon << ' ' << get_fac_at_point(loc_array,0,0,0) << std::endl; + + allreduce_cr_inplace(&fac, 1); + fac /= n_dom_src; + + if (check) + std::cout << "n_dom_src: " << n_dom_src << ", fac at last: " << fac << std::endl; + + + return fac; + + +} + + +CUSTOMREAL Source::get_fac_at_point(CUSTOMREAL* loc_array, int iplus, int jplus, int kplus){ + return loc_array[I2V(i_src_loc+iplus, j_src_loc+jplus, k_src_loc+kplus)]; +} \ No newline at end of file diff --git a/src/src_rec.cpp b/src/src_rec.cpp new file mode 100644 index 0000000..cf71a3b --- /dev/null +++ b/src/src_rec.cpp @@ -0,0 +1,1751 @@ +#include "src_rec.h" + + +// +// functions for processing src_rec_file +// + +void parse_src_rec_file(std::string& src_rec_file, \ + std::map& src_map, \ + std::map& rec_map, \ + std::map>>& data_map, \ + std::vector& src_name_list, \ + std::vector>>& srcrec_name_list){ + + // start timer + std::string timer_name = "parse_src_rec_file"; + Timer timer(timer_name); + + std::ifstream ifs; // dummy for all processes except world_rank 0 + std::stringstream ss_whole; // for parsing the whole file + std::stringstream ss; // for parsing each line + + // only world_rank 0 reads the file + //if (sim_rank == 0){ + ifs.open(src_rec_file); + // abort if file does not exist + if (!ifs.is_open()){ + std::cerr << "Error: src_rec_file " << src_rec_file << " does not exist!" << std::endl; + MPI_Abort(MPI_COMM_WORLD, 1); + } + ss_whole << ifs.rdbuf(); + ifs.close(); + //} + + std::string line; + int cc = 0; // count the number of lines + int i_src_now = 0; // count the number of srcs + int ndata_tmp = 0; // count the number of receivers or differential traveltime data for each source + src_map.clear(); + rec_map.clear(); + data_map.clear(); + + std::string src_name; + CUSTOMREAL src_weight = 1.0; + CUSTOMREAL rec_weight = 1.0; + int src_id = -1; + + // temporary receiver name list for each source + // this stores station name and the data type ("abs", "cr" or "cs") for each data line. + std::vector> rec_name_list; + + while (true) { + + bool end_of_file = false; + bool skip_this_line = false; + + line.clear(); // clear the line before use + + // read a line + //if (sim_rank == 0){ + if (!std::getline(ss_whole, line)) + end_of_file = true; + //} + + // broadcast end_of_file + //broadcast_bool_single(end_of_file, 0); + + if (end_of_file) + break; + + // skip comment and empty lines + if (sim_rank == 0){ + if (line[0] == '#' || line.empty()) + skip_this_line = true; + } + + //broadcast_bool_single(skip_this_line, 0); + + if (skip_this_line) + continue; + + // parse the line + //int ntokens = 0; + std::string token; + std::vector tokens; + + //if (sim_rank==0){ + // erase the trailing space + line.erase(line.find_last_not_of(" \n\r\t")+1); + + // parse the line with arbitrary number of spaces + ss.clear(); // clear the stringstream before use + ss << line; + + while (std::getline(ss, token, ' ')) { + if (token.size() > 0) // skip the first spaces and multiple spaces + tokens.push_back(token); + } + + // length of tokens + //ntokens = tokens.size(); + //} + + // broadcast ntokens + //broadcast_i_single(ntokens, 0); + // broadcast tokens + //for (int i=0; i(std::stod(tokens[6])); + src.lat = static_cast(std::stod(tokens[7])); // in degree + src.lon = static_cast(std::stod(tokens[8])); // in degree + src.dep = static_cast(std::stod(tokens[9])); // source in km + src.mag = static_cast(std::stod(tokens[10])); + src.n_data = std::stoi(tokens[11]); + src.name = tokens[12]; + cc++; + + // check if tokens[13] exists, then read weight + if (tokens.size() > 13) + src_weight = static_cast(std::stod(tokens[13])); + else + src_weight = 1.0; // default weight + + // new source detected by its name + // TODO: add error check for duplicated source name (but different event info) + // if (src_map.find(src.name) == src_map.end()) + // src_map[src.name] = src; + + // whether the src.name exists or not, overwrite it. (it can overwrite the src_info in the cr_dif data, whose source infomation (e.g., ortime, Ndata) is incomplete.) + src_map[src.name] = src; + + src_id = src.id; + src_name = src.name; + + ndata_tmp = src.n_data; + src_name_list.push_back(src_name); // store order of sources in the file + + // source with no receiver is allowed (cc = 1, ndata_tmp = 0) + if (cc > ndata_tmp) { + // go to the next source + cc = 0; + i_src_now++; + + // store the receiver name list for the source + srcrec_name_list.push_back(rec_name_list); + // clear the temporary receiver name list + rec_name_list.clear(); + + // timer + if (i_src_now % 1000 == 0 && world_rank == 0) { + std::cout << "reading source " << i_src_now << " finished in " << timer.get_t() << " seconds. dt = " << timer.get_t_delta() << " seconds. \n"; + } + } + + } else { // read receiver(s) and travel time info + + // read single receiver or differential traveltime data + if (tokens.size() < 11) { + // store receiver name of onle receiver line in src rec file + std::vector rec_name_list_one_line; + + SrcRecInfo rec; + + rec.id = std::stoi(tokens[1]); + rec.name = tokens[2]; + rec.lat = static_cast(std::stod(tokens[3])); // in degree + rec.lon = static_cast(std::stod(tokens[4])); // in degree + rec.dep = static_cast(-1.0*std::stod(tokens[5])/1000.0); // convert elevation in meter to depth in km + + // new receiver detected by its name + if(rec_map.find(rec.name) == rec_map.end()) + rec_map[rec.name] = rec; + + // store temporary receiver name list for each source + rec_name_list_one_line.push_back(rec.name); + rec_name_list_one_line.push_back("abs"); + + // traveltime data + DataInfo data; + if (tokens.size() > 8) + rec_weight = static_cast(std::stod(tokens[8])); + else + rec_weight = 1.0; // default weight + + data.data_weight = src_weight * rec_weight; + data.weight = data.data_weight * abs_time_local_weight; + data.weight_reloc= data.data_weight * abs_time_local_weight_reloc; + data.phase = tokens[6]; + + data.is_src_rec = true; + data.id_src = src_id; + data.name_src = src_name; + data.id_rec = rec.id; + data.name_rec = rec.name; + data.travel_time_obs = static_cast(std::stod(tokens[7])); // store read data + + data_map[data.name_src][data.name_rec].push_back(data); + + // store receiver name of onle receiver line in src rec file + rec_name_list.push_back(rec_name_list_one_line); + + cc++; + + } else { + // read common source differential traveltime (cs_dif) or common receiver differential traveltime (cr_dif) + + std::vector rec_name_list_one_line; + + // read differential traveltime + SrcRecInfo rec; + rec.id = std::stoi(tokens[1]); + rec.name = tokens[2]; + rec.lat = static_cast(std::stod(tokens[3])); // in degree + rec.lon = static_cast(std::stod(tokens[4])); // in degree + rec.dep = static_cast(-1.0*std::stod(tokens[5])/1000.0); // convert elevation in meter to depth in km + + // new receiver detected by its name + if(rec_map.find(rec.name) == rec_map.end()) + rec_map[rec.name] = rec; + + // store temporary receiver name list for each source + rec_name_list_one_line.push_back(rec.name); + + + // differential traveltime data + DataInfo data; + if (tokens.size() > 13) + rec_weight = static_cast(std::stod(tokens[13])); + else + rec_weight = 1.0; // default weight + + data.data_weight = src_weight * rec_weight; + data.phase = tokens[11]; + + //data.id_src_single = src_id; + //data.name_src_single = src_name; + // use common variables with src-rec data + data.id_src = src_id; + data.name_src = src_name; + + // store the id and name of the first receiver (just used for key of the data_map) + data.id_rec = rec.id; + data.name_rec = rec.name; + + // determine this data is cr_dif or cs_dif + bool is_cr_dif = tokens[11].find("cr")!=std::string::npos; + + if (is_cr_dif) { + // cr_dif data + SrcRecInfo src2; + src2.id = std::stoi(tokens[6]); + src2.name = tokens[7]; + src2.lat = static_cast(std::stod(tokens[8])); // in degree + src2.lon = static_cast(std::stod(tokens[9])); // in degree + src2.dep = static_cast(std::stod(tokens[10])); // convert elevation in meter to depth in km + + // new source detected by its name + if (src_map.find(src2.name) == src_map.end()) + src_map[src2.name] = src2; + + // store temporary receiver(source) name list for each source + rec_name_list_one_line.push_back(src2.name); + rec_name_list_one_line.push_back("cr"); + // common receiver differential traveltime data + data.is_src_pair = true; + data.id_src_pair = {src_id, src2.id}; + data.name_src_pair = {src_name, src2.name}; + data.cr_dif_travel_time_obs = static_cast(std::stod(tokens[12])); // store read data + + data.weight = data.data_weight * cr_dif_time_local_weight; + data.weight_reloc = data.data_weight * cr_dif_time_local_weight_reloc; + data_map[data.name_src_pair[0]][data.name_rec].push_back(data); // USE ONE-DATAMAP-FOR-ONE-SRCREC-LINE + } else { + // cs_dif data + SrcRecInfo rec2; + rec2.id = std::stoi(tokens[6]); + rec2.name = tokens[7]; + rec2.lat = static_cast(std::stod(tokens[8])); // in degree + rec2.lon = static_cast(std::stod(tokens[9])); // in degree + rec2.dep = static_cast(-1.0*std::stod(tokens[10])/1000.0); // convert elevation in meter to depth in km + + // new receiver detected by its name + if(rec_map.find(rec2.name) == rec_map.end()) + rec_map[rec2.name] = rec2; + + // store temporary receiver name list for each source + rec_name_list_one_line.push_back(rec2.name); + rec_name_list_one_line.push_back("cs"); + + // common source differential traveltime data + data.is_rec_pair = true; + data.id_rec_pair = {rec.id, rec2.id}; + data.name_rec_pair = {rec.name, rec2.name}; + data.cs_dif_travel_time_obs = static_cast(std::stod(tokens[12])); // store read data + + data.weight = data.data_weight * cs_dif_time_local_weight; + data.weight_reloc = data.data_weight * cs_dif_time_local_weight_reloc; + data_map[data.name_src][data.name_rec_pair[0]].push_back(data); // USE ONE-DATAMAP-FOR-ONE-SRCREC-LINE + } + + // store receiver name of one receiver line in src rec file + rec_name_list.push_back(rec_name_list_one_line); + + cc++; + } + + if (cc > ndata_tmp) { + // go to the next source + cc = 0; + i_src_now++; + + // store the receiver name list for the source + srcrec_name_list.push_back(rec_name_list); + // clear the temporary receiver name list + rec_name_list.clear(); + + // timer + if (i_src_now % 1000 == 0 && world_rank == 0) { + std::cout << "reading source " << i_src_now << " finished in " << timer.get_t() << " seconds. dt = " << timer.get_t_delta() << " seconds. \n"; + } + } + } + + } catch (std::invalid_argument& e) { + std::cout << "Error: invalid argument in src_rec_file. Abort." << std::endl; + std::cout << "problematic line: \n\n" << line << std::endl; + std::cout << "Please carefully check whether n_data is consistent with the number of data of this earthquake." << std::endl << std::endl; + exit(1); + //MPI_Abort(MPI_COMM_WORLD, 1); + } + + /* + // print for DEBUG + for (auto& t : tokens) { + std::cout << t << "---"; + } + std::cout << std::endl; + */ + + } // end of while loop + + // indicate the number of sources and receivers, data_info + if (world_rank == 0){ + std::cout << "\nReading src_rec_file finished." << std::endl; + std::cout << "number of sources: " << src_map.size() << std::endl; + std::cout << "number of receivers: " << rec_map.size() << std::endl; + // std::cout << "number of data: " << data_map.size() << "\n" << std::endl; + } + + // indicate elapsed time + std::cout << "Total elapsed time for reading src_rec_file: " << timer.get_t() << " seconds.\n"; + + // check new version of src rec data + if (if_verbose){ + for(auto iter = src_map.begin(); iter != src_map.end(); iter++){ + std::cout << "source id: " << iter->second.id + << ", source name: " << iter->second.name + << std::endl; + } + + for(auto iter = rec_map.begin(); iter != rec_map.end(); iter++){ + std::cout << "receiver id: " << iter->second.id + << ", receiver name: " << iter->second.name + << std::endl; + } + + for (auto iter = data_map.begin(); iter != data_map.end(); iter++){ + for (auto iter2 = iter->second.begin(); iter2 != iter->second.end(); iter2++){ + for (const auto& data : iter2->second) { + if (data.is_src_rec) { + std::cout << "source name: " << data.name_src + << ", receiver name: " << data.name_rec + << ", traveltime: " << data.travel_time_obs + << std::endl; + } else if (data.is_rec_pair) { + std::cout << "source name: " << data.name_src + << ", receiver pair name: " << data.name_rec_pair[0] + << ", " << data.name_rec_pair[1] + << ", traveltime: " << data.cs_dif_travel_time_obs + << std::endl; + } else if (data.is_src_pair) { + std::cout << "source pair name: " << data.name_src_pair[0] + << ", " << data.name_src_pair[1] + << ", receiver name: " << data.name_rec + << ", traveltime: " << data.cr_dif_travel_time_obs + << std::endl; + } else { + std::cout << "error type of data" << std::endl; + } + } + } + } + + } +} + + +void parse_sta_correction_file(std::string& sta_correction_file, \ + std::map& rec_map){ + + // read station correction file + std::ifstream ifs; + std::stringstream ss, ss_whole; + + if (sim_rank == 0){ + ifs.open(sta_correction_file); + if (!ifs.is_open()){ + std::cout << "Error: cannot open sta_correction_file. Abort." << std::endl; + MPI_Abort(MPI_COMM_WORLD, 1); + } + ss_whole << ifs.rdbuf(); + ifs.close(); + } + + std::string line; + + while(true){ + bool end_of_file = false; + bool skip_this_line = false; + + line.clear(); + + // read a line + //if (sim_rank == 0){ + if (!std::getline(ss_whole,line)){ + end_of_file = true; + } + //} + + //broadcast_bool_single(end_of_file, 0); + + if (end_of_file){ + break; + } + + // skip this line if it is a comment line + //if (sim_rank == 0){ + if (line[0] == '#' || line.empty()){ + skip_this_line = true; + } + //} + + //broadcast_bool_single(skip_this_line, 0); + + if (skip_this_line) { + continue; + } + + // parse the line + //int ntokens = 0; + std::string token; + std::vector tokens; + + //if (sim_rank == 0){ + // erase the last space + line.erase(line.find_last_not_of(" \n\r\t")+1); + + // parse the line with arbitrary number of spaces + ss.clear(); + ss << line; + + while (std::getline(ss,token,' ')) { + if (token.size() > 0) + tokens.push_back(token); + } + // number of tokens + //ntokens = tokens.size(); + //} + + // broadcast ntokens + //broadcast_i_single(ntokens, 0); + // broadcast tokens + //for (int i=0; i(std::stod(tokens[1])); // in degree + // tmp_rec.lon = static_cast(std::stod(tokens[2])); // in degree + // tmp_rec.dep = static_cast(-1.0*std::stod(tokens[3])/1000.0); // convert elevation in meter to depth in km + // tmp_rec.sta_correct = static_cast(std::stod(tokens[4])); + // tmp_rec.sta_correct_kernel = 0.0; + // rec_map[tmp_sta_name] = tmp_rec; + std::cout << "Did not find station " << tmp_sta_name << " in the src_rec file. Omit this station correction." << std::endl; + } else { + // pre exist station + rec_map[tmp_sta_name].sta_correct = static_cast(std::stod(tokens[4])); + rec_map[tmp_sta_name].sta_correct_kernel = 0.0; + } + } catch (std::invalid_argument& e) { + std::cout << "Error: invalid argument in sta_correction_file. Abort." << std::endl; + std::cout << "problematic line: \n\n" << line << std::endl; + + exit(1); + //MPI_Abort(MPI_COMM_WORLD, 1); + } + } +} + + +void separate_region_and_tele_src_rec_data(std::map &src_map_back, + std::map &rec_map_back, + std::map>> &data_map_back, + std::map &src_map, + std::map &rec_map, + std::map>> &data_map, + std::map &src_map_tele, + std::map &rec_map_tele, + std::map>> &data_map_tele, + std::map &data_type, + int &N_abs_local_data, + int &N_cr_dif_local_data, + int &N_cs_dif_local_data, + int &N_teleseismic_data, + int &N_data, + const CUSTOMREAL min_lat, const CUSTOMREAL max_lat, + const CUSTOMREAL min_lon, const CUSTOMREAL max_lon, + const CUSTOMREAL min_dep, const CUSTOMREAL max_dep, + bool have_tele_data){ + // check if the source is inside the simulation boundary + + // initialize vectors for teleseismic events + rec_map_tele.clear(); + src_map_tele.clear(); + data_map_tele.clear(); + + // clear original src, rec, data + src_map.clear(); + rec_map.clear(); + data_map.clear(); + + // divide source list + // + // src_map_back ____> src_map + // \___> src_map_tele (teleseismic events) + // + for(auto iter = src_map_back.begin(); iter != src_map_back.end(); iter++){ + SrcRecInfo src = iter->second; + if (src.lat < min_lat || src.lat > max_lat \ + || src.lon < min_lon || src.lon > max_lon \ + || src.dep < min_dep || src.dep > max_dep){ + + // out of region (teleseismic events) + src.is_out_of_region = true; + src_map_tele[iter->first] = src; + + // set a flag on backup data (for output) + src_map_back[iter->first].is_out_of_region = true; + + } else { + // within region (local events) + src.is_out_of_region = false; + src_map[iter->first] = src; + + } + } + + // check receiver location + for(auto iter = rec_map_back.begin(); iter != rec_map_back.end(); iter++){ + SrcRecInfo rec = iter->second; + if (rec.lat < min_lat || rec.lat > max_lat \ + || rec.lon < min_lon || rec.lon > max_lon \ + || rec.dep < min_dep || rec.dep > max_dep){ + + std::cout << "ERROR: receiver " << rec.name + << ", lat: " << rec.lat + << ", lon: " << rec.lon + << ", dep: " << rec.dep + << " is out of region. Please check the src_rec file." << std::endl; + exit(1); + } + } + + // divide receiver and data list + // + // rec_map_back ____> rec_map + // \___> rec_map_tele + // data_map_back____> data_map + // \___> data_map_tele + // + // iterate over event + for (auto it_src = data_map_back.begin(); it_src != data_map_back.end(); it_src++){ + std::string name_src = it_src->first; + // iterate over stations + for (auto it_rec = it_src->second.begin(); it_rec != it_src->second.end(); it_rec++){ + // loop over all data belongs to each source-receiver combination + for (auto& data: it_rec->second){ + + // absolute traveltime + if(data.is_src_rec){ + std::string name_src = data.name_src; + std::string name_rec = data.name_rec; + + // if name_src is out of region + if(src_map_tele.find(name_src) != src_map_tele.end()){ + total_teleseismic_data_weight += data.data_weight; + data.weight = data.data_weight * teleseismic_weight; + total_teleseismic_data_weight_reloc += data.data_weight; + data.weight_reloc = data.data_weight * teleseismic_weight_reloc; + data_map_tele[name_src][name_rec].push_back(data); + rec_map_tele[name_rec] = rec_map_back[name_rec]; + data_type["tele"] = 1; + + // if name_src is in the region + } else { + total_abs_local_data_weight += data.data_weight; + total_abs_local_data_weight_reloc += data.data_weight; + + data_map[name_src][name_rec].push_back(data); + rec_map[name_rec] = rec_map_back[name_rec]; + data_type["abs"] = 1; + } + + // common receiver differential traveltime + } else if (data.is_src_pair){ + std::string name_src1 = data.name_src_pair[0]; + std::string name_src2 = data.name_src_pair[1]; + std::string name_rec = data.name_rec; + + // if both sources are out of region + if(src_map_tele.find(name_src1) != src_map_tele.end() \ + && src_map_tele.find(name_src2) != src_map_tele.end()){ + total_teleseismic_data_weight += data.data_weight; + data.weight = data.data_weight * teleseismic_weight; + total_teleseismic_data_weight_reloc += data.data_weight; + data.weight_reloc = data.data_weight * teleseismic_weight_reloc; + + data_map_tele[name_src1][name_rec].push_back(data); + rec_map_tele[name_rec] = rec_map_back[name_rec]; + data_type["tele"] = 1; + + // if both sources is in the region + } else if (src_map.find(name_src1) != src_map.end() \ + && src_map.find(name_src2) != src_map.end() ) { + total_cr_dif_local_data_weight += data.data_weight; + total_cr_dif_local_data_weight_reloc += data.data_weight; + data_map[name_src1][name_rec].push_back(data); + rec_map[name_rec] = rec_map_back[name_rec]; + data_type["cr_dif"] = 1; + + } else { + std::cout << "ERROR data: common receiver differential time, but one teleseismic source, one local source"; + exit(1); + } + + // common source differential traveltime + } else if (data.is_rec_pair){ + std::string name_src = data.name_src; + std::string name_rec1 = data.name_rec_pair[0]; + std::string name_rec2 = data.name_rec_pair[1]; + + // if name_src is out of region + if(src_map_tele.find(name_src) != src_map_tele.end() ){ + total_teleseismic_data_weight += data.data_weight; + data.weight = data.data_weight * teleseismic_weight; + total_teleseismic_data_weight_reloc += data.data_weight; + data.weight_reloc = data.data_weight * teleseismic_weight_reloc; + data_map_tele[name_src][name_rec1].push_back(data); + rec_map_tele[name_rec1] = rec_map_back[name_rec1]; + rec_map_tele[name_rec2] = rec_map_back[name_rec2]; + data_type["tele"] = 1; + + // if name_src is in the region + } else { + total_cs_dif_local_data_weight += data.data_weight; + total_cs_dif_local_data_weight_reloc += data.data_weight; + data_map[name_src][name_rec1].push_back(data); + rec_map[name_rec1] = rec_map_back[name_rec1]; + rec_map[name_rec2] = rec_map_back[name_rec2]; + data_type["cs_dif"] = 1; + } + } + + } // end loop std::vector + } // end it_rec + } // end it_src + + if((!have_tele_data) && (src_map_tele.size() > 0)){ + std::cout << "ERROR: have_tele_data is false, but there are earthquakes out of study region:" << std::endl; + for(auto iter = src_map_tele.begin(); iter != src_map_tele.end(); iter++){ + std::cout << "source name: " << iter->second.name + << ", lat: " << iter->second.lat + << ", lon: " << iter->second.lon + << ", dep: " << iter->second.dep + << std::endl; + } + std::cout << "Please set have_tele_data in InputParams.yaml to be TRUE, or remove above earthquakes" << std::endl; + exit(1); + } + + if((!have_tele_data) && (rec_map_tele.size() > 0)){ + std::cout << "ERROR: have_tele_data is false, but there are stations out of study region:" << std::endl; + for(auto iter = rec_map_tele.begin(); iter != rec_map_tele.end(); iter++){ + std::cout << "receiver name: " << iter->second.name + << ", lat: " << iter->second.lat + << ", lon: " << iter->second.lon + << ", dep: " << iter->second.dep + << std::endl; + } + std::cout << "Please set have_tele_data in InputParams.yaml to be TRUE, or remove above stations" << std::endl; + exit(1); + } + + + // + // balance the data weight + // + if (balance_data_weight){ + for(auto it_src = data_map.begin(); it_src != data_map.end(); it_src++){ + for(auto it_rec = it_src->second.begin(); it_rec != it_src->second.end(); it_rec++){ + for(auto& data: it_rec->second){ + // absolute traveltime + if(data.is_src_rec){ + data.weight = data.weight / total_abs_local_data_weight * (total_abs_local_data_weight + total_cr_dif_local_data_weight + total_cs_dif_local_data_weight); + // common receiver differential traveltime + } else if (data.is_src_pair){ + data.weight = data.weight / total_cr_dif_local_data_weight * (total_abs_local_data_weight + total_cr_dif_local_data_weight + total_cs_dif_local_data_weight); + // common source differential traveltime + } else if (data.is_rec_pair){ + data.weight = data.weight / total_cs_dif_local_data_weight * (total_abs_local_data_weight + total_cr_dif_local_data_weight + total_cs_dif_local_data_weight); + } + } + } + } + + // teleseismic data + for(auto it_src = data_map_tele.begin(); it_src != data_map_tele.end(); it_src++){ + for(auto it_rec = it_src->second.begin(); it_rec != it_src->second.end(); it_rec++){ + for (auto& data: it_rec->second){ + data.weight = data.weight / total_teleseismic_data_weight; + } + } + } + } + + if (balance_data_weight_reloc){ + for(auto it_src = data_map.begin(); it_src != data_map.end(); it_src++){ + for(auto it_rec = it_src->second.begin(); it_rec != it_src->second.end(); it_rec++){ + for(auto& data: it_rec->second){ + // absolute traveltime + if(data.is_src_rec){ + data.weight_reloc = data.weight_reloc / total_abs_local_data_weight_reloc * (total_abs_local_data_weight_reloc + total_cr_dif_local_data_weight_reloc + total_cs_dif_local_data_weight_reloc); + + // common receiver differential traveltime + } else if (data.is_src_pair){ + data.weight_reloc = data.weight_reloc / total_cr_dif_local_data_weight_reloc * (total_abs_local_data_weight_reloc + total_cr_dif_local_data_weight_reloc + total_cs_dif_local_data_weight_reloc); + + // common source differential traveltime + } else if (data.is_rec_pair){ + data.weight_reloc = data.weight_reloc / total_cs_dif_local_data_weight_reloc * (total_abs_local_data_weight_reloc + total_cr_dif_local_data_weight_reloc + total_cs_dif_local_data_weight_reloc); + } + } + } + } + } + + // + // count the number of data + // + // local data + for(auto it_src = data_map.begin(); it_src != data_map.end(); it_src++){ + for(auto it_rec = it_src->second.begin(); it_rec != it_src->second.end(); it_rec++){ + for (auto& data: it_rec->second){ + // absolute traveltime + if(data.is_src_rec){ + N_abs_local_data += 1; + + // common receiver differential traveltime + } else if (data.is_src_pair){ + N_cr_dif_local_data += 1; + + // common source differential traveltime + } else if (data.is_rec_pair){ + N_cs_dif_local_data += 1; + } + } + } + } + + // teleseismic data + for(auto it_src = data_map_tele.begin(); it_src != data_map_tele.end(); it_src++){ + for(auto it_rec = it_src->second.begin(); it_rec != it_src->second.end(); it_rec++){ + N_teleseismic_data += it_rec->second.size(); // add the number of data + } + } + + // N_data is the total number of data + N_data = N_abs_local_data + N_cr_dif_local_data + N_cs_dif_local_data + N_teleseismic_data; + + + // check new version of src rec data + if (if_verbose){ + std::cout << "local data: " << std::endl; + + for(auto iter = src_map.begin(); iter != src_map.end(); iter++){ + std::cout << "source id: " << iter->second.id + << ", source name: " << iter->second.name + << std::endl; + } + + for(auto iter = rec_map.begin(); iter != rec_map.end(); iter++){ + std::cout << "receiver id: " << iter->second.id + << ", receiver name: " << iter->second.name + << std::endl; + } + + for (auto iter = data_map.begin(); iter != data_map.end(); iter++){ + for (auto iter2 = iter->second.begin(); iter2 != iter->second.end(); iter2++){ + for (const auto& data : iter2->second) { + if (data.is_src_rec) { + std::cout << "source name: " << data.name_src + << ", receiver name: " << data.name_rec + << ", traveltime: " << data.travel_time_obs + << std::endl; + } else if (data.is_rec_pair) { + std::cout << "source name: " << data.name_src + << ", receiver pair name: " << data.name_rec_pair[0] + << ", " << data.name_rec_pair[1] + << ", traveltime: " << data.cs_dif_travel_time_obs + << std::endl; + } else if (data.is_src_pair) { + std::cout << "source pair name: " << data.name_src_pair[0] + << ", " << data.name_src_pair[1] + << ", receiver name: " << data.name_rec + << ", traveltime: " << data.cr_dif_travel_time_obs + << std::endl; + } else { + std::cout << "error type of data" << std::endl; + } + } + } + } + + std::cout << std::endl << "tele data: " << std::endl; + + for(auto iter = src_map_tele.begin(); iter != src_map_tele.end(); iter++){ + std::cout << "source id: " << iter->second.id + << ", source name: " << iter->second.name + << std::endl; + } + + for(auto iter = rec_map_tele.begin(); iter != rec_map_tele.end(); iter++){ + std::cout << "receiver id: " << iter->second.id + << ", receiver name: " << iter->second.name + << std::endl; + } + + for (auto iter = data_map_tele.begin(); iter != data_map_tele.end(); iter++){ + for (auto iter2 = iter->second.begin(); iter2 != iter->second.end(); iter2++){ + for (const auto& data : iter2->second) { + if (data.is_src_rec) { + std::cout << "source name: " << data.name_src + << ", receiver name: " << data.name_rec + << ", traveltime: " << data.travel_time_obs + << std::endl; + } else if (data.is_rec_pair) { + std::cout << "source name: " << data.name_src + << ", receiver pair name: " << data.name_rec_pair[0] + << ", " << data.name_rec_pair[1] + << ", traveltime: " << data.cs_dif_travel_time_obs + << std::endl; + } else if (data.is_src_pair) { + std::cout << "source pair name: " << data.name_src_pair[0] + << ", " << data.name_src_pair[1] + << ", receiver name: " << data.name_rec + << ", traveltime: " << data.cr_dif_travel_time_obs + << std::endl; + } else { + std::cout << "error type of data" << std::endl; + } + } + } + } + } + +} + + +void do_swap_src_rec(std::map &src_map, \ + std::map &rec_map, \ + std::map>> &data_map, + std::vector &src_name_list) { + + // swap src/rec points + // at this moment, all the sources are divided into src_points (regional) and tele_src_points (teleseismic) + + // Start timer + std::string timer_name = "swap_src_rec"; + Timer timer(timer_name); + + std::map tmp_src_rec_map = src_map; + src_map = rec_map; + rec_map = tmp_src_rec_map; + + std::map>> tmp_data_map;// = data_map; + + // for each element of src_map, count the number of rec_map with the same value of + + for (auto it_src = data_map.begin(); it_src != data_map.end(); it_src++){ // loop over src + for (auto it_rec = it_src->second.begin(); it_rec != it_src->second.end(); it_rec++){ // loop over rec + for (const auto& data: it_rec->second){ // loop over datainfo + + DataInfo tmp_data = data; + + if (tmp_data.is_src_rec){ + // absolute traveltime -> absolute traveltime + // | abs | | abs | + // | s0 - r0 | -> | r0 - s0 | + // | | | | + // | | | | + + tmp_data.id_src = data.id_rec; + tmp_data.name_src = data.name_rec; + tmp_data.id_rec = data.id_src; + tmp_data.name_rec = data.name_src; + tmp_data.dual_data = false; // is not a dual data. contribute both objective function and kernel + tmp_data_map[tmp_data.name_src][tmp_data.name_rec].push_back(tmp_data); + + + } else if (tmp_data.is_rec_pair) { + // common source differential traveltime -> common receiver differential traveltime + // | cs_dif | | cr_dif | + // | s0 - r1 | -> | r1 - s0 r2 - s0 | + // | | | | | | | + // | r2 | | r2 r1 | + + tmp_data.is_rec_pair = false; + tmp_data.is_src_pair = true; + + tmp_data.id_src_pair = data.id_rec_pair; + tmp_data.name_src_pair = data.name_rec_pair; + + tmp_data.id_rec = data.id_src; + tmp_data.name_rec = data.name_src; + + tmp_data.cr_dif_travel_time_obs = data.cs_dif_travel_time_obs; + + tmp_data.id_rec_pair = {-1, -1}; + tmp_data.name_rec_pair = {"unknown", "unknown"}; + + // one data + tmp_data.dual_data = false; // one is not a dual data. contribute both objective function and kernel + tmp_data.name_src = tmp_data.name_src_pair[0]; + tmp_data.id_src = tmp_data.id_src_pair[0]; + tmp_data_map[tmp_data.name_src][tmp_data.name_rec].push_back(tmp_data); + + // the other data + // Note: name_src = cr_dif time always represent time(src, rec1) - time(src,rec2). Thus, -1.0 is necessary + // Meanwhile, name_src(key) must equal data.name_src_pair[0] and data.name_src + tmp_data.dual_data = true; // the other is a dual data. contribute kernel only + tmp_data.name_src_pair = {data.name_rec_pair[1],data.name_rec_pair[0]}; + tmp_data.cr_dif_travel_time_obs = -1.0 * data.cs_dif_travel_time_obs; + tmp_data.name_src = tmp_data.name_src_pair[0]; + tmp_data.id_src = tmp_data.id_src_pair[0]; + tmp_data_map[tmp_data.name_src][tmp_data.name_rec].push_back(tmp_data); + + + } else if (tmp_data.is_src_pair) { + // common receiver differential traveltime -> common source differential traveltime + // | cr_dif | | cs_dif | + // | s0 - r3 | -> | r3 - s0 | + // | | | | | | + // | s1 | | s1 | + + tmp_data.is_src_pair = false; + tmp_data.is_rec_pair = true; + + tmp_data.id_rec_pair = data.id_src_pair; + tmp_data.name_rec_pair = data.name_src_pair; + + tmp_data.id_src = data.id_rec; + tmp_data.name_src = data.name_rec; + + tmp_data.cs_dif_travel_time_obs = data.cr_dif_travel_time_obs; + + tmp_data.id_src_pair = {-1, -1}; + tmp_data.name_src_pair = {"unknown", "unknown"}; + + // only need one data for common source dif + tmp_data.dual_data = false; // one is not a dual data. contribute both objective function and kernel + tmp_data.name_rec = tmp_data.name_rec_pair[0]; + tmp_data.id_rec = tmp_data.id_rec_pair[0]; + tmp_data_map[tmp_data.name_src][tmp_data.name_rec].push_back(tmp_data); + + } + + } + } + } + + // replace data_map with swapped data map + // TODO tmp_data_map has strange elements here + data_map = tmp_data_map; + + // set n_data (number of receivers for each source) + for (auto it_src = src_map.begin(); it_src != src_map.end(); it_src++){ + it_src->second.n_data = data_map[it_src->second.name].size(); + } + + // swap total_data_weight + CUSTOMREAL tmp = total_cr_dif_local_data_weight; + total_cr_dif_local_data_weight = total_cs_dif_local_data_weight; + total_cs_dif_local_data_weight = tmp; + + // create new src_id2name_all from swapped src_map + src_name_list.clear(); + for (auto iter = src_map.begin(); iter != src_map.end(); iter++){ + src_name_list.push_back(iter->first); + } + + // check new version of src rec data + if (if_verbose){ + std::cout << "do swap sources and receivers" << std::endl; + + for(auto iter = src_map.begin(); iter != src_map.end(); iter++){ + std::cout << "source id: " << iter->second.id + << ", source name: " << iter->second.name + << std::endl; + } + + for(auto iter = rec_map.begin(); iter != rec_map.end(); iter++){ + std::cout << "receiver id: " << iter->second.id + << ", receiver name: " << iter->second.name + << std::endl; + } + + for(auto it_src = data_map.begin(); it_src != data_map.end(); it_src++){ + for(auto it_rec = it_src->second.begin(); it_rec != it_src->second.end(); it_rec++){ + for(const auto& data: it_rec->second){ + + if (data.is_src_rec){ + std::cout << "key: it_src, it_rec: " << it_src->first << ", " << it_rec->first + << ", absolute traveltime: " << data.travel_time_obs + << ", source name: " << data.name_src + << ", receiver name: " << data.name_rec + << std::endl; + } else if (data.is_rec_pair){ + std::cout << "key: it_src, it_rec: " << it_src->first << ", " << it_rec->first + << ", common source differential traveltime: " << data.cs_dif_travel_time_obs + << ", source name: " << data.name_src + << ", receiver pair name: " << data.name_rec_pair[0] + << ", " << data.name_rec_pair[1] + << std::endl; + } else if (data.is_src_pair){ + std::cout << "key: it_src, it_rec: " << it_src->first << ", " << it_rec->first + << ", common receiver differential traveltime: " << data.cr_dif_travel_time_obs + << ", source pair name: " << data.name_src_pair[0] + << ", " << data.name_src_pair[1] + << ", receiver name: " << data.name_rec + << std::endl; + } + } + } + } + std::cout << "data map size: " << data_map.size() << std::endl; + } + + // indicate elapsed time + std::cout << "Total elapsed time for swapping src rec: " << timer.get_t() << " seconds.\n"; +} + +// do not swap source and receiver, process common receiver differential traveltime data +void do_not_swap_src_rec(std::map &src_map, \ + std::map &rec_map, \ + std::map>> &data_map, + std::vector &src_name_list) { + + // do not swap src/rec points + + // Start timer + std::string timer_name = "do_not_swap_src_rec"; + Timer timer(timer_name); + + std::map>> tmp_data_map;// = data_map; + + // for each element of src_map, count the number of rec_map with the same value of + + for (auto it_src = data_map.begin(); it_src != data_map.end(); it_src++){ // loop over src + for (auto it_rec = it_src->second.begin(); it_rec != it_src->second.end(); it_rec++){ // loop over rec + for (const auto& data: it_rec->second){ // loop over datainfo + + DataInfo tmp_data = data; + + // common receiver differential traveltime + if (tmp_data.is_src_pair) { + // keep the original data, meanwhile, add cr_dif data with the other source + // | cr_dif | | cr_dif | + // | s0 - r3 | -> | s0 - r3 s1 - r3 | + // | | | | | | | + // | s1 | | s1 s0 | + tmp_data.dual_data = false; // one is not a dual data. contribute both objective function and kernel + tmp_data_map[tmp_data.name_src_pair[0]][tmp_data.name_rec].push_back(tmp_data); // original data + + // the other data with the other source. + // Note: name_src = cr_dif time always represent time(src1, rec) - time(src2,rec). Thus, -1 is necessary + // Meanwhile, name_src(key) must equal name_src_pair[0] + tmp_data.dual_data = true; // the other is a dual data. contribute kernel only + tmp_data.name_src = data.name_src_pair[1]; + tmp_data.id_src = data.id_src_pair[1]; + tmp_data.name_src_pair = {data.name_src_pair[1],data.name_src_pair[0]}; + tmp_data.id_src_pair = {data.id_src_pair[1],data.id_src_pair[0]}; + tmp_data.cr_dif_travel_time_obs = -1.0 * data.cr_dif_travel_time_obs; + tmp_data_map[tmp_data.name_src][tmp_data.name_rec].push_back(tmp_data); + + } else { // abs and cs_dif data does not change + // abs data and cs_dif data remain unchanged + // | abs | cs_dif | + // | s0 - r0 | s0 - r1 | + // | | | | + // | | r2 | + tmp_data.dual_data = false; // one is not a dual data. contribute both objective function and kernel + tmp_data_map[tmp_data.name_src][tmp_data.name_rec].push_back(tmp_data); + } + + } + } + } + + // replace data_map with swapped data map + // TODO tmp_data_map has strange elements here + data_map = tmp_data_map; + + + // create new src_id2name_all from swapped src_map + src_name_list.clear(); + for (auto iter = src_map.begin(); iter != src_map.end(); iter++){ + src_name_list.push_back(iter->first); + } + + // check new version of src rec data + if (if_verbose){ + std::cout << "do not swap sources and receivers" << std::endl; + + for(auto iter = src_map.begin(); iter != src_map.end(); iter++){ + std::cout << "source id: " << iter->second.id + << ", source name: " << iter->second.name + << std::endl; + } + + for(auto iter = rec_map.begin(); iter != rec_map.end(); iter++){ + std::cout << "receiver id: " << iter->second.id + << ", receiver name: " << iter->second.name + << std::endl; + } + + for(auto it_src = data_map.begin(); it_src != data_map.end(); it_src++){ + for(auto it_rec = it_src->second.begin(); it_rec != it_src->second.end(); it_rec++){ + for(const auto& data: it_rec->second){ + + if (data.is_src_rec){ + std::cout << "key: it_src, it_rec: " << it_src->first << ", " << it_rec->first + << ", absolute traveltime: " << data.travel_time_obs + << ", source name: " << data.name_src + << ", receiver name: " << data.name_rec + << std::endl; + } else if (data.is_rec_pair){ + std::cout << "key: it_src, it_rec: " << it_src->first << ", " << it_rec->first + << ", common source differential traveltime: " << data.cs_dif_travel_time_obs + << ", source name: " << data.name_src + << ", receiver pair name: " << data.name_rec_pair[0] + << ", " << data.name_rec_pair[1] + << std::endl; + } else if (data.is_src_pair){ + std::cout << "key: it_src, it_rec: " << it_src->first << ", " << it_rec->first + << ", common receiver differential traveltime: " << data.cr_dif_travel_time_obs + << ", source pair name: " << data.name_src_pair[0] + << ", " << data.name_src_pair[1] + << ", receiver name: " << data.name_rec + << std::endl; + } + } + } + } + std::cout << "data map size: " << data_map.size() << std::endl; + } + + // indicate elapsed time + std::cout << "Total elapsed time for not swapping src rec: " << timer.get_t() << " seconds.\n"; +} + + + +// merge the teleseismic data lsit into the local data list +void merge_region_and_tele_src(std::map &src_map, + std::map &rec_map, + std::map>> &data_map, + std::vector &src_name_list, + std::map &src_map_tele, + std::map &rec_map_tele, + std::map>> &data_map_tele){ + if(src_map_tele.size() > 0) { + for (auto iter = src_map_tele.cbegin(); iter != src_map_tele.cend();){ + src_map[iter->first] = iter->second; + // erase pushed data + src_map_tele.erase(iter++); + } + + for (auto iter = rec_map_tele.cbegin(); iter != rec_map_tele.cend();){ + rec_map[iter->first] = iter->second; + // erase pushed data + rec_map_tele.erase(iter++); + } + + //data_map.insert(data_map_tele.begin(), data_map_tele.end()); + // instead of insert, we use manual loop to avoid unefficent memory allocation + for (auto iter = data_map_tele.cbegin(); iter != data_map_tele.cend();){ + for (auto iter2 = iter->second.cbegin(); iter2 != iter->second.cend();){ + if (data_map[iter->first][iter2->first].size()==0) { + data_map[iter->first][iter2->first] = iter2->second; + // erase pushed data + data_map_tele[iter->first].erase(iter2++); + } else { + data_map[iter->first][iter2->first].insert(data_map[iter->first][iter2->first].end(), iter2->second.begin(), iter2->second.end()); + // erase pushed data + data_map_tele[iter->first].erase(iter2++); + } + + } + // erase pushed data + data_map_tele.erase(iter++); + } + } + + // create new src_id2name_all from merged src_map + src_name_list.clear(); + for (auto iter = src_map.begin(); iter != src_map.end(); iter++){ + src_name_list.push_back(iter->first); + } + + // give new event id (accourding to the name) + int id_count = 0; + for (auto iter = src_map.begin(); iter != src_map.end(); iter ++){ + iter->second.id = id_count; + id_count += 1; + } + + if (if_verbose){ + std::cout << "merge region and tele src" << std::endl; + + for(auto iter = src_map.begin(); iter != src_map.end(); iter++){ + std::cout << "source id: " << iter->second.id + << ", source name: " << iter->second.name + << std::endl; + } + + for(auto iter = rec_map.begin(); iter != rec_map.end(); iter++){ + std::cout << "receiver id: " << iter->second.id + << ", receiver name: " << iter->second.name + << std::endl; + } + + for(auto it_src = data_map.begin(); it_src != data_map.end(); it_src++){ + for(auto it_rec = it_src->second.begin(); it_rec != it_src->second.end(); it_rec++){ + for(const auto& data: it_rec->second){ + + if (data.is_src_rec){ + std::cout << "key: it_src, it_rec: " << it_src->first << ", " << it_rec->first + << ", absolute traveltime: " << data.travel_time_obs + << ", source name: " << data.name_src + << ", receiver name: " << data.name_rec + << std::endl; + } else if (data.is_rec_pair){ + std::cout << "key: it_src, it_rec: " << it_src->first << ", " << it_rec->first + << ", common source differential traveltime: " << data.cs_dif_travel_time_obs + << ", source name: " << data.name_src + << ", receiver pair name: " << data.name_rec_pair[0] + << ", " << data.name_rec_pair[1] + << std::endl; + } else if (data.is_src_pair){ + std::cout << "key: it_src, it_rec: " << it_src->first << ", " << it_rec->first + << ", common receiver differential traveltime: " << data.cr_dif_travel_time_obs + << ", source pair name: " << data.name_src_pair[0] + << ", " << data.name_src_pair[1] + << ", receiver name: " << data.name_rec + << std::endl; + } + } + } + } + std::cout << "data map size: " << data_map.size() << std::endl; + } +} + + +// distribute the source/receiver list and data list to all the processors +void distribute_src_rec_data(std::map& src_map, \ + std::map& rec_map, \ + std::map>>& data_map, \ + std::vector& src_name_list, \ + std::map& src_map_this_sim, \ + std::map& rec_map_this_sim, \ + std::map>>& data_map_this_sim, \ + std::vector& src_name_list_this_sim, \ + std::vector& rec_name_list_this_sim){ + + + // this process is done by only the processes which stores the data. + if (proc_store_srcrec) { + + // number of total sources + int n_src = 0; + + // number of total sources + if (proc_read_srcrec) + n_src = src_map.size(); + + // broadcast the number of sources to all the processors + broadcast_i_single_inter_sim(n_src, 0); // inter simulutaneous run group + + // store the total number of sources + nsrc_total = n_src; + + // assign sources to each simulutaneous run group + for (int i_src = 0; i_src < n_src; i_src++) { + // id of simulutaneous run group to which the i_src-th source belongs + int dst_id_sim = select_id_sim_for_src(i_src, n_sims); + + // broadcast the source name + std::string src_name; + if (id_sim == 0 && subdom_main){ + src_name = src_name_list[i_src]; + } + + broadcast_str_inter_sim(src_name, 0); // inter simulutaneous run group + if (id_sim==0){ // sender + + if (dst_id_sim == id_sim){ // this source belongs to this simulutaneous run group + + // src + src_map_this_sim[src_name] = src_map[src_name]; + // data + for (auto iter = data_map[src_name].begin(); iter != data_map[src_name].end(); iter++){ + // rec by data + rec_map_this_sim[iter->first] = rec_map[iter->first]; + rec_name_list_this_sim.push_back(iter->first); + + for (auto& data : iter->second){ + data_map_this_sim[src_name][iter->first].push_back(data); + + // store the second receiver for rec_pair + if (data.is_rec_pair){ + rec_map_this_sim[data.name_rec_pair[1]] = rec_map[data.name_rec_pair[1]]; + rec_name_list_this_sim.push_back(data.name_rec_pair[1]); + } + } + } + + // add the source name to the source name list + src_name_list_this_sim.push_back(src_name); + + } else { // this source belongs to non-main simulutaneous run group + // send src + send_src_info_inter_sim(src_map[src_name], dst_id_sim); + + // send number of receivers belonging to src + int n_rec = data_map[src_name].size(); + send_i_single_sim(&n_rec, dst_id_sim); + + if (n_rec > 0){ + + // send data_map[name_i_src] to the main process of dst_id_sim + for (auto iter = data_map[src_name].begin(); iter != data_map[src_name].end(); iter++){ + + // send rec_map[name_i_rec] to the main process of dst_id_sim + send_rec_info_inter_sim(rec_map[iter->first], dst_id_sim); + + // send data_map[name_i_src].size() to the main process of dst_id_sim + int n_data = iter->second.size(); + send_i_single_sim(&n_data, dst_id_sim); + // send data + for (auto& data : iter->second) { + send_data_info_inter_sim(data, dst_id_sim); + + // send the second receiver for rec_pair + if (data.is_rec_pair) + send_rec_info_inter_sim(rec_map[data.name_rec_pair[1]], dst_id_sim); + } + + } + } // if (n_data > 0) + + } + } else { // receive + if (dst_id_sim == id_sim){ + + // receive src/rec_points from the main process of dst_id_sim + + // prepare SrcRecInfo object for receiving the contents + SrcRecInfo tmp_SrcInfo; + // receive src + recv_src_info_inter_sim(tmp_SrcInfo, 0); + + // add the received src_map to the src_map + src_map_this_sim[tmp_SrcInfo.name] = tmp_SrcInfo; + + // recv number of receivers belonging to src + int n_rec = 0; + recv_i_single_sim(&n_rec, 0); + + // receive data_info from the main process of dst_id_sim + for (int i_srcrec = 0; i_srcrec < n_rec; i_srcrec++){ + + // recv data_map[name_i_src].size() from the main process of dst_id_sim + SrcRecInfo tmp_RecInfo; + recv_rec_info_inter_sim(tmp_RecInfo, 0); + + rec_map_this_sim[tmp_RecInfo.name] = tmp_RecInfo; + rec_name_list_this_sim.push_back(tmp_RecInfo.name); + + int n_data = 0; + recv_i_single_sim(&n_data, 0); + + for (int i_data = 0; i_data < n_data; i_data++){ + // prepare DataInfo object for receiving the contents + DataInfo tmp_DataInfo; + // receive data_info from the main process of dst_id_sim + recv_data_info_inter_sim(tmp_DataInfo, 0); + // add the received data_info to the data_info + data_map_this_sim[tmp_DataInfo.name_src][tmp_DataInfo.name_rec].push_back(tmp_DataInfo); + + // store the second receiver for rec_pair + if (tmp_DataInfo.is_rec_pair){ + recv_rec_info_inter_sim(rec_map_this_sim[tmp_DataInfo.name_rec_pair[1]], 0); + rec_name_list_this_sim.push_back(tmp_DataInfo.name_rec_pair[1]); + } + } + + } // end of for i_srcrec + + // add the source name to the source name list + src_name_list_this_sim.push_back(src_name); + + } else { + // do nothing + } + + } // end of if (id_sim==0) + + } // end of for i_src + + + // make rec_name_list_this_sim unique using unique + std::sort(rec_name_list_this_sim.begin(), rec_name_list_this_sim.end()); + rec_name_list_this_sim.erase(std::unique(rec_name_list_this_sim.begin(), rec_name_list_this_sim.end()), rec_name_list_this_sim.end()); + + } // end of if (proc_store_srcrec) + + // check IP.src_ids_this_sim for this rank + if (myrank==0 && if_verbose) { + std::cout << id_sim << "assigned src id(name) : "; + for (auto iter = src_map_this_sim.begin(); iter != src_map_this_sim.end(); iter++){ + std::cout << iter->second.id << "(" << iter->second.name << ") "; + } + std::cout << std::endl; + } + +} + + +void prepare_src_map_for_2d_solver(std::map& src_map_all, \ + std::map& src_map, \ + std::vector& src_id2name_2d, \ + std::map& src_map_2d) { + // + // src_id2name_2d: list of src name assigned to this simultaneous run group + // src_map_2d: src map assigned to this simultaneous run group + + if (proc_store_srcrec) { + + std::map tmp_src_map_unique; + std::vector tmp_src_name_list_unique; + + // at first, make a depth-unique source list in the main process from src_map_tele + if (proc_read_srcrec) { + + for (auto iter = src_map_all.begin(); iter != src_map_all.end(); iter++){ + + // skip if this is not a teleseismic source + if (!iter->second.is_out_of_region) + continue; + + std::string tmp_name = iter->second.name; + + // check if there is no element in tmp_src_map_unique with the same iter->second.depth + bool if_unique = true; + for (auto iter2 = tmp_src_map_unique.begin(); iter2 != tmp_src_map_unique.end(); iter2++){ + if (iter2->second.dep == iter->second.dep){ + if_unique = false; + break; + } + } + + if (if_unique) { + tmp_src_map_unique[tmp_name] = iter->second; + tmp_src_name_list_unique.push_back(tmp_name); + } + } + } + + // broadcast the number of unique sources to all processes + int n_src_unique = 0; + if (proc_read_srcrec) n_src_unique = tmp_src_map_unique.size(); + broadcast_i_single_inter_sim(n_src_unique, 0); // inter simulutaneous run group + + // iterate over all the unique sources + for (int i_src_unique = 0; i_src_unique < n_src_unique; i_src_unique++){ + int dst_id_sim = select_id_sim_for_src(i_src_unique, n_sims); + + if (id_sim==0){ + if (dst_id_sim==id_sim){ + // store + src_map_2d[tmp_src_name_list_unique[i_src_unique]] = tmp_src_map_unique[tmp_src_name_list_unique[i_src_unique]]; + src_id2name_2d.push_back(tmp_src_name_list_unique[i_src_unique]); + } else { + // send to dst_id_sim + send_src_info_inter_sim(tmp_src_map_unique[tmp_src_name_list_unique[i_src_unique]], dst_id_sim); + } + } else { + if (dst_id_sim==id_sim){ + // receive from 0 + SrcRecInfo tmp_src; + recv_src_info_inter_sim(tmp_src, 0); + src_map_2d[tmp_src.name] = tmp_src; + src_id2name_2d.push_back(tmp_src.name); + } else { + // do nothing + } + } + } + } // end of if (proc_store_srcrec) + + // print the number of sources ssigned to this simultaneous run group + for (int i_sim=0; i_sim < n_sims; i_sim++){ + if (id_sim==i_sim && subdom_main && id_subdomain==0){ + std::cout << "id_sim = " << id_sim << " : " << src_map_2d.size() << " 2d-sources assigned." << std::endl; + } + synchronize_all_world(); + } + +} + + +// +// Belows are the function for send/receiving SrcRecInfo, DataInfo object +// so when you add the member in those class, it will be necessary to modify +// the functions below for sharing the new member. +// + +void send_src_info_inter_sim(SrcRecInfo &src, int dest){ + + send_i_single_sim(&src.id, dest); + send_i_single_sim(&src.year , dest); + send_i_single_sim(&src.month, dest); + send_i_single_sim(&src.day , dest); + send_i_single_sim(&src.hour , dest); + send_i_single_sim(&src.min , dest); + send_cr_single_sim(&src.sec, dest); + send_cr_single_sim(&src.lat, dest); + send_cr_single_sim(&src.lon, dest); + send_cr_single_sim(&src.dep, dest); + send_cr_single_sim(&src.mag, dest); + send_i_single_sim(&src.n_data, dest); + send_str_sim(src.name, dest); + send_bool_single_sim(&src.is_out_of_region, dest); + +} + +void recv_src_info_inter_sim(SrcRecInfo &src, int orig){ + + recv_i_single_sim(&src.id, orig); + recv_i_single_sim(&src.year , orig); + recv_i_single_sim(&src.month, orig); + recv_i_single_sim(&src.day , orig); + recv_i_single_sim(&src.hour , orig); + recv_i_single_sim(&src.min , orig); + recv_cr_single_sim(&src.sec, orig); + recv_cr_single_sim(&src.lat, orig); + recv_cr_single_sim(&src.lon, orig); + recv_cr_single_sim(&src.dep, orig); + recv_cr_single_sim(&src.mag, orig); + recv_i_single_sim(&src.n_data, orig); + recv_str_sim(src.name, orig); + recv_bool_single_sim(&src.is_out_of_region, orig); +} + + +void broadcast_src_info_intra_sim(SrcRecInfo& src, int orig){ + broadcast_i_single(src.id, orig); + //broadcast_i_single(src.year , orig); + //broadcast_i_single(src.month, orig); + //broadcast_i_single(src.day , orig); + //broadcast_i_single(src.hour , orig); + //broadcast_i_single(src.min , orig); + //broadcast_cr_single(src.sec, orig); + broadcast_cr_single(src.lat, orig); + broadcast_cr_single(src.lon, orig); + broadcast_cr_single(src.dep, orig); + //broadcast_cr_single(src.mag, orig); + broadcast_i_single(src.n_data, orig); + broadcast_str(src.name, orig); + broadcast_bool_single(src.is_out_of_region, orig); +} + + +void send_rec_info_inter_sim(SrcRecInfo &rec, int dest){ + + send_i_single_sim(&rec.id, dest); + send_str_sim(rec.name, dest); + send_cr_single_sim(&rec.lon, dest); + send_cr_single_sim(&rec.lat, dest); + send_cr_single_sim(&rec.dep, dest); +} + + +void recv_rec_info_inter_sim(SrcRecInfo &rec, int orig){ + + recv_i_single_sim(&rec.id, orig); + recv_str_sim(rec.name, orig); + recv_cr_single_sim(&rec.lon, orig); + recv_cr_single_sim(&rec.lat, orig); + recv_cr_single_sim(&rec.dep, orig); +} + + +void broadcast_rec_info_intra_sim(SrcRecInfo& rec, int orig){ + broadcast_i_single(rec.id, orig); + broadcast_str(rec.name, orig); + broadcast_cr_single(rec.lon, orig); + broadcast_cr_single(rec.lat, orig); + broadcast_cr_single(rec.dep, orig); + broadcast_cr_single(rec.adjoint_source, orig); + broadcast_cr_single(rec.adjoint_source_density, orig); + broadcast_bool_single(rec.is_stop, orig); +} + +void send_data_info_inter_sim(DataInfo &data, int dest){ + + send_cr_single_sim(&data.data_weight, dest); + send_cr_single_sim(&data.weight, dest); + send_cr_single_sim(&data.weight_reloc, dest); + send_str_sim(data.phase, dest); + + send_i_single_sim(&data.id_src, dest); + send_str_sim(data.name_src, dest); + send_i_single_sim(&data.id_rec, dest); + send_str_sim(data.name_rec, dest); + + send_bool_single_sim(&data.is_src_rec, dest); + send_bool_single_sim(&data.is_rec_pair, dest); + send_bool_single_sim(&data.is_src_pair, dest); + + send_bool_single_sim(&data.dual_data, dest); + + if (data.is_src_rec){ + send_cr_single_sim(&data.travel_time_obs, dest); + } + + if (data.is_rec_pair){ + //send_i_single_sim(&data.id_src_single, dest); + //send_str_sim(data.name_src_single, dest); + for (int ipair=0; ipair<2; ipair++){ + send_i_single_sim(&data.id_rec_pair[ipair], dest); + send_str_sim(data.name_rec_pair[ipair], dest); + } + send_cr_single_sim(&data.cs_dif_travel_time_obs, dest); + } + + if (data.is_src_pair){ + send_i_single_sim(&data.id_rec, dest); + send_str_sim(data.name_rec, dest); + for (int ipair=0; ipair<2; ipair++){ + send_i_single_sim(&data.id_src_pair[ipair], dest); + send_str_sim(data.name_src_pair[ipair], dest); + } + send_cr_single_sim(&data.cr_dif_travel_time_obs, dest); + } +} + + +void recv_data_info_inter_sim(DataInfo &data, int orig){ + + recv_cr_single_sim(&data.data_weight, orig); + recv_cr_single_sim(&data.weight, orig); + recv_cr_single_sim(&data.weight_reloc, orig); + recv_str_sim(data.phase, orig); + + recv_i_single_sim(&data.id_src, orig); + recv_str_sim(data.name_src, orig); + recv_i_single_sim(&data.id_rec, orig); + recv_str_sim(data.name_rec, orig); + + recv_bool_single_sim(&data.is_src_rec, orig); + recv_bool_single_sim(&data.is_rec_pair, orig); + recv_bool_single_sim(&data.is_src_pair, orig); + + recv_bool_single_sim(&data.dual_data, orig); + + if (data.is_src_rec){ + recv_cr_single_sim(&data.travel_time_obs, orig); + } + + if (data.is_rec_pair){ + //recv_i_single_sim(&data.id_src_single, orig); + //recv_str_sim(data.name_src_single, orig); + for (int ipair=0; ipair<2; ipair++){ + recv_i_single_sim(&data.id_rec_pair[ipair], orig); + recv_str_sim(data.name_rec_pair[ipair], orig); + } + recv_cr_single_sim(&data.cs_dif_travel_time_obs, orig); + } + + if (data.is_src_pair){ + recv_i_single_sim(&data.id_rec, orig); + recv_str_sim(data.name_rec, orig); + for (int ipair=0; ipair<2; ipair++){ + recv_i_single_sim(&data.id_src_pair[ipair], orig); + recv_str_sim(data.name_src_pair[ipair], orig); + } + recv_cr_single_sim(&data.cr_dif_travel_time_obs, orig); + } + +} diff --git a/test/.DS_Store b/test/.DS_Store new file mode 100644 index 0000000..3180ea1 Binary files /dev/null and b/test/.DS_Store differ diff --git a/test/clean_test.sh b/test/clean_test.sh new file mode 100755 index 0000000..39bcabe --- /dev/null +++ b/test/clean_test.sh @@ -0,0 +1,36 @@ +# target directory to be cleaned +TARGET_DIR=$1 + +if [ -z $TARGET_DIR ]; then + echo "Usage: $0 " + exit 1 +fi + +if [ ! -d $TARGET_DIR ]; then + echo "Target directory $TARGET_DIR does not exist" exit 1 +fi + +# .h5 files +find $TARGET_DIR -name "*.h5" -exec rm {} \; +# erase test_model_* +find $TARGET_DIR -name "test_model_*" -exec rm {} \; +# erase OUTPUT_FILES directory +find $TARGET_DIR -name "OUTPUT_FILES" -exec rm -rf {} \; +# erase src_rec_test* +find $TARGET_DIR -name "src_rec_test*" -exec rm {} \; +# erase objective_function.txt +find $TARGET_DIR -name "objective_function.txt" -exec rm {} \; +# erase files in fortran_code/ega5/output/ +find $TARGET_DIR/fortran_code/ega5/output -name "*" -exec rm {} \; +# erase files in fortran_code/a.out +find $TARGET_DIR/fortran_code/a.out -name "*" -exec rm {} \; +# erase files in fortran_code/ega5/output/tele_traveltime_field +find $TARGET_DIR/fortran_code/ega5/output/tele_traveltime_field -name "*" -exec rm {} \; +# erase cuda_device_info.txt +find $TARGET_DIR -name "cuda_device_info.txt" -exec rm {} \; +# erase error_message_*.txt +find $TARGET_DIR -name "error_message_*.txt" -exec rm {} \; +# erase time*.txt +find $TARGET_DIR -name "time*.txt" -exec rm {} \; +# erase log +find $TARGET_DIR -name "log" -exec rm {} \; \ No newline at end of file diff --git a/test/inversion_small/README.md b/test/inversion_small/README.md new file mode 100644 index 0000000..18cbaf5 --- /dev/null +++ b/test/inversion_small/README.md @@ -0,0 +1,28 @@ +# Inversion test + +This is an example for inversion calculation with small grid. + +![](img/result_fun.png) + +1. Run all cells of `make_test_model.ipynb` or python script `make_test_mode.py` for creating necessary input files: + - source, receiver file (src_rec_test.dat) + - true model (test_model_true.h5) + - initial model (test_model_init.h5) + +2. then run TOMOATT forward with `input_params_pre.yml` for calculating the true arrival times at the stations. +The calculated travel time at the stations is saved in the file `src_rec_test_out.dat` +Following command will run the forward simulation with the true model +``` bash +mpirun --oversubscribe -n 8 ../../build/bin/TOMOATT -i input_params_pre.yml +``` +Volumetric output data is saved in the file `OUTPUT_FILES/out_data_sim_0.h5`. +This file may be visualized by paraview with opening the index file `OUTPUT_FILES/out_data_sim_0.xmf`. + +3. run TOMOATT in inversion mode with `input_params.yml`, by the command +``` bash +mpirun --oversubscribe -n 8 ../../build/bin/TOMOATT -i input_params.yml +``` +The volumetric output data is again saved in the file `OUTPUT_FILES/out_data_sim_0.h5`. + + +4. The final output data is stored in OUTPUT_FILES/final_model.h5. This file may be visualized by e.g. check_3d_out.ipynb \ No newline at end of file diff --git a/test/inversion_small/check_3d_out.ipynb b/test/inversion_small/check_3d_out.ipynb new file mode 100644 index 0000000..bde0716 --- /dev/null +++ b/test/inversion_small/check_3d_out.ipynb @@ -0,0 +1,122 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'vel_true')" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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dne7lzLaM0ZW3HMfmyDmfm98oz0zxP2RTA9xbx9JGeW6zXUMjNcXMdqjxuszPrqZWO7j3xl3Z82TcePYGzEqK+ueMOqBDzEWABlmrHMwPOJuLzO+eHFjHYSoUdLZmvK11zlwr2PQbqxzsNtPutsjudcqiBnf27DlrHdH3eskdPruz6YXcg2OYpFRuFMD7t++e7vxxhtVU1OjZcuWdd03fvx45zYf+chHdMstt0iS7r777p52sUuv37HnnntOt99+u4455pis++fMmaNHHnlE999/v9auXau3335bZ511Vq87CADAvqSlpSXr1tHR/QJiDz/8sKZMmaJzzjlHBxxwgCZNmqQ777xzQPrYq8HBrl27dP755+vOO+/Mmt7YuXOn7rrrLt100006+eSTNXnyZC1btkxPP/201q9f32edBgBgoPXVaYWamhpVVlZ23err67vd3+uvv64lS5bokEMO0apVq3TJJZfo61//un72s5/1+2vt1WmFuro6nXrqqZo+fbq+//3vd93f2NioVCql6dOnd903YcIEjR07VuvWrdPxxx+/13N1dHRkjZpaWlp60yUAAPpVXxVeampqUkVFRdf9yWT3p5R839eUKVO0YMECSdKkSZP00ksvaenSpZo9e3av+5GPHg8OGhoa9MILL+i5557bq625uVmJREIjRozIur+qqkrNzc3dPl99fb2++93v9rQbAAAMqCBkyebg79tWVFRkDQ5yGT16tI444ois+w4//HD96le/6nUf8tWjIVBTU5Muv/xy/fu//7vKyowKOHmaN2+edu7c2XVramrqk+cFAKCUTZs2TRs3bsy679VXX9W4ceP6fd89mjlobGzU9u3b9fGPf7zrvkwmoyeffFL/9m//plWrVqmzs1M7duzImj3Ytm2bqquru33OZDKZc0oFAIBi0VenFfI1Z84cnXDCCVqwYIE+//nP69lnn9Udd9yhO+64o+sx8+bN01tvvaWf//znXfdt2LBB0nvXB/71r3/Vhg0blEgk9pqFcOnR4OCUU07Riy++mHXfhRdeqAkTJuib3/ymampqFI/HtXr1ap199tmSpI0bN2rLli2qra3tya4U+J6CXKWZU1ZU0Yi7hS3JbLTb27tjRdGO3LGk6B4jrtXm3rnX7o6DeSnj4ARGaVUjyhdNuONc0XajtGynu11G2dzAKJkcuJvlG98Y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KJSiPq0wd+5czZ49W1OmTNFxxx2nRYsWqa2tTRdeeGGhu1ZUdu3apU2bNnX9vHnzZm3YsEEjR47U2LFjdcUVV+j73/++DjnkEI0fP17XXHONxowZozPOOKNwnS4SdXV1WrFihR566CENHz6861xuZWWlysvLVVlZqYsuukhz587VyJEjVVFRocsuu0y1tbU6/vjjC9z7wps3b55mzpypsWPHqrW1VStWrNCaNWu0atUqjp1h+PDhXde2vG/o0KHaf//9u+7n+KFgCh2XsPzkJz8Jxo4dGyQSieC4444L1q9fX+guFZ0//OEPgaS9brNnzw6C4L044zXXXBNUVVUFyWQyOOWUU4KNGzcWttNForvjJilYtmxZ12P27NkT/Ou//muw3377BUOGDAnOPPPMYOvWrYXrdBH5l3/5l2DcuHFBIpEIRo0aFZxyyinB7373u652jl3PfDDKGAQcPxSOFwRBUKBxCQAAKEJFe80BAAAoDAYHAAAgC4MDAACQhcEBAADIwuAAAABkYXAAAACyMDgAAABZGBwAAIAsDA4AAEAWBgcAACALgwMAAJDl/wPBdITsqw+j2QAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgcAAAGzCAYAAAC7ErTFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAABG9klEQVR4nO3de3hU1b3/8c/MZGYSkIRLIQEJGG9cFJCCImLrjZZa8fHCUUuxUou2tXgB6tPT9CcFaQvaVkXPQRCLUNuD8UrVnipFKlCPIIrlPKIVL2CJyMUbBAJJJrP37w81x5FkfWeycxvyfj3PPDqz9tp7zZ49w8pa+7u+Id/3fQEAAHwq3NoNAAAAbQudAwAAkILOAQAASEHnAAAApKBzAAAAUtA5AAAAKegcAACAFHQOAABACjoHAAAgBZ0DoJWsWrVKoVBIq1atau2mAEAKOgdAFnnttdc0c+ZMvfPOO63dFACHMToHQBZ57bXXdPPNN9M5ANCs6BwAhynf93Xw4MHWbgaALETnAEjTI488olAopNWrVx9Sds899ygUCmnTpk2SpNdff13/9m//pq5duyo3N1fDhw/XE088Eej4S5Ys0SWXXCJJOuussxQKhVLuWTjqqKM0duxYLV++XMOHD1deXp7uuecevfPOOwqFQlqyZMkh+wyFQpo5c2bKa9u3b9f3vvc9FRYWKh6P64QTTtB9990XqO0AsktOazcAyBbnnXeejjjiCD300EM644wzUsoefPBBnXDCCTrxxBP16quvatSoUTryyCP105/+VB07dtRDDz2kCy+8UI8++qguuuiiRh3/q1/9qq6//nrddddd+tnPfqYBAwZIUt1/JWnz5s0aP368fvCDH+jqq69Wv379MjrGrl27dOqppyoUCunaa69V9+7d9dRTT2nSpEmqqKjQlClTGtV2AFnGB5C28ePH+z169PBra2vrXtuxY4cfDof9WbNm+b7v++ecc44/aNAgv6qqqm4bz/P80047zT/uuOPqXnv22Wd9Sf6zzz6b9vEffvjhBuv07dvXl+Q//fTTKa9v3brVl+QvXrz4kDqS/BkzZtQ9nzRpkt+zZ0//gw8+SNnuW9/6ll9QUOAfOHAg7bYCyF5MKwAZuOyyy7R79+6U8MNHHnlEnufpsssu00cffaS//e1vuvTSS7Vv3z598MEH+uCDD/Thhx9qzJgxevPNN7V9+/Zma19JSYnGjBnTqLq+7+vRRx/V+eefL9/369r+wQcfaMyYMdq7d69efvnlJm4xgLaIaQUgA9/4xjdUUFCgBx98UOecc46kT6YUTjrpJB1//PFav369fN/X9OnTNX369Hr3sXv3bh155JHN0r6SkpJG133//fe1Z88eLVy4UAsXLqx3m927dzd6/wCyB50DIAPxeFwXXnihli1bprvvvlu7du3S//zP/2j27NmSJM/zJEk33nhjg3/BH3vssc3Wvry8vENeC4VC9W6bTCZTnn/W9ssvv1wTJ06st87gwYMDthBANqBzAGTosssu0+9//3utXLlS//znP+X7vi677DJJ0tFHHy1JikajGj16dJMfu6F/6F26dOkiSdqzZ0/K6//6179Snnfv3l2dOnVSMplslrYDyB7ccwBkaPTo0eratasefPBBPfjggzrllFPqhvN79OihM888U/fcc4927NhxSN33338/0LE7duwo6dB/6F3y8/P1pS99SWvWrEl5/e677055HolENG7cOD366KN1IZmfF7TtALIHIwdAhqLRqC6++GKVlZWpsrJSv/3tb1PK582bp9NPP12DBg3S1VdfraOPPlq7du3S2rVr9e677+p///d/G33sk046SZFIRLfeeqv27t2reDyus88+Wz169HDWu+qqq3TLLbfoqquu0vDhw7VmzRq98cYbh2x3yy236Nlnn9WIESN09dVXa+DAgfroo4/08ssv65lnntFHH33U6LYDyCKtGywBZKcVK1b4kvxQKOSXl5cfUv7222/7V1xxhV9UVORHo1H/yCOP9MeOHes/8sgjdds0JpTR933/3nvv9Y8++mg/Eomk1O/bt69/3nnn1VvnwIED/qRJk/yCggK/U6dO/qWXXurv3r37kFBG3/f9Xbt2+ZMnT/aLi4v9aDTqFxUV+eecc46/cOHCjNoJIHuFfN/3W7d7AgAA2hLuOQAAACm45wBoAw4ePKi9e/c6t+natatisVgLtQhAe0bnAGgDHnzwQV155ZXObZ599lmdeeaZLdMgAO0a9xwAbcCOHTv06quvOrcZNmxY3ZoFANCc6BwAAIAU3JAIAABStLl7DjzP03vvvadOnTo1aqlYAED74fu+9u3bp169eikcbr6/d6uqqlRTUxN4P7FYTLm5uU3QoubV5joH7733noqLi1u7GQCA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6bnPX7Xj/Nd47uu+1mib52XPX7StqT3dkEjnAACANLSnew6YVgAAACkYOQAAIA1MKwAAgBTtaVqBzgEAAGnwA44cZFPngHsOAABACkYOAABIgy87+6lVP1vQOahPyP0RWimXrVh4z7GOgSQlow3vIBwz1gnINdYJsNYhsFIa19a6y61vjpFy2VrHQHH3+/Nz3fW9uPuS9xznXrI/O3ONi2ZN2WxcV0ase1Wt+9wdTLrL9ybznOV7wh2c5eY6BoaqsPvajAZMuVzlu6/dPcY6Bns89/vf57nP375kboNl1mdjffbmcHcWDYc3J08hhVghEQAAtEeMHAAAkAaiFQAAQArPDynUTtY5YFoBAIA2avv27br88svVrVs35eXladCgQXrppZca3H7Hjh369re/reOPP17hcFhTpkxp1HHpHAAAkAbfD/7IxMcff6xRo0YpGo3qqaee0muvvabbbrtNXbp0abBOdXW1unfvrptuuklDhgxp9HtlWgEAgDS09D0Ht956q4qLi7V48eK610pKSpx1jjrqKN15552SpPvuuy/zRn6KzkE9zKged0STjOypSkbdB/DiDQ/oeHnunYc8d9c0bIUqGimPQ7XucDCza2yFgVopl61QxQ7uUMdkrvvD8+JWmKnx2QUMdQySstlKu5uodb/3g0Yo477ahkPpJOnjREdneW7ICIM1VEXc7evgu1M+R4xgxaQxkGqlrLZCET9MHuEs/7jWff5c5/9Arfu6r0m6P/tk0vrRcxcjMxUVFSnP4/G44vFDQ2GfeOIJjRkzRpdccolWr16tI488Uj/60Y909dVXN3sbmVYAACANn40cBHlIUnFxsQoKCuoec+bMqfd4W7Zs0fz583Xcccdp+fLluuaaa3T99dfr97//fbO/V0YOAABIQ1NFK5SXlys/P7/u9fpGDSTJ8zwNHz5cs2fPliQNHTpUmzZt0oIFCzRx4sRGtyMdjBwAAJCGprohMT8/P+XRUOegZ8+eGjhwYMprAwYM0LZt25r7rdI5AACgLRo1apQ2b96c8tobb7yhvn37NvuxmVYAACANn/z1HyRaIbPtp06dqtNOO02zZ8/WpZdeqvXr12vhwoVauHBh3TalpaXavn277r///rrXNm7cKEnav3+/3n//fW3cuFGxWOyQUQgXOgcAAKShpUMZTz75ZC1btkylpaWaNWuWSkpK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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# final model\n", + "fpath_final_model = './OUTPUT_FILES/final_model.h5'\n", + "fpath_true_model = \"./test_model_true.h5\"\n", + "\n", + "import h5py\n", + "\n", + "# read vel, xi, eta dataset \n", + "with h5py.File(fpath_final_model, 'r') as f:\n", + " vel = f['vel'][:]\n", + " xi = f['xi'][:]\n", + " eta = f['eta'][:]\n", + " #zeta = f['zeta'][:]\n", + "\n", + "# read true model\n", + "with h5py.File(fpath_true_model, 'r') as f:\n", + " vel_true = f['vel'][:]\n", + " xi_true = f['xi'][:]\n", + " eta_true = f['eta'][:]\n", + " #zeta_true = f['zeta'][:]\n", + "# plot\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "# plot vel\n", + "plt.figure()\n", + "plt.imshow(vel[5,:,:], origin='lower', aspect='auto')\n", + "plt.colorbar()\n", + "plt.title('vel')\n", + "\n", + "# plot xi\n", + "#plt.figure()\n", + "#plt.imshow(xi[:,:,10], origin='lower', aspect='auto')\n", + "#plt.colorbar()\n", + "#plt.title('xi')\n", + "#\n", + "## plot eta\n", + "#plt.figure()\n", + "#plt.imshow(eta[:,:,10], origin='lower', aspect='auto')\n", + "#plt.colorbar()\n", + "#plt.title('eta')\n", + "\n", + "# plot vel_true\n", + "plt.figure()\n", + "plt.imshow(vel_true[5,:,:], origin='lower', aspect='auto')\n", + "plt.colorbar()\n", + "plt.title('vel_true')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + }, + "vscode": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/inversion_small/data_post_process.py b/test/inversion_small/data_post_process.py new file mode 100644 index 0000000..c267e47 --- /dev/null +++ b/test/inversion_small/data_post_process.py @@ -0,0 +1,71 @@ +# This script shows how to recompose the output data for further analysis +# As the result data is collectively written out by each process, the data is composed on subgrid basis. +# the data needs to be reindexed and reassembled to a global grid. + +import numpy as np +import sys + +sys.path.append("../../utils/") +from tomoatt_data_retrieval import get_data_from_h5 + + +# +# plot calculated travel time field + +# number of grids +nx = 50 +ny = 50 +nz = 10 + +# number of subgrid +ndiv_x = 2 +ndiv_y = 2 +ndiv_z = 1 + +# read data +_src_id = 0 +_inv_id = 0 + +# filling 0 for digit +inv_id = str(_inv_id).zfill(4) +src_id = str(_src_id).zfill(4) + +# file name +#fname_data = "OUTPUT_FILES/T_res_inv_{}_src_{}.dat".format(inv_id, src_id) +fname_data = "OUTPUT_FILES/out_data_sim_{}.h5".format(_src_id) +# path for grid data +fname_grid = "OUTPUT_FILES/out_data_grid.h5" +# name dataset to be read +dataset_name = "/Data/fun_inv_{}".format(inv_id) + +data, r, t, p = get_data_from_h5(fname_data, fname_grid, dataset_name, nz, ny, nx, ndiv_z, ndiv_y, ndiv_x, verbose=True) + +# plot +import matplotlib.pyplot as plt + +fig, axs = plt.subplots(3, 1, figsize=(15, 5)) + +#axs[0].imshow(data[5,:,:], cmap='jet', interpolation='bilinear') +ir_slice=5 +axs[0].pcolormesh(p[ir_slice,0,:], t[ir_slice,:,0], data[ir_slice,:,:], shading='auto') +axs[0].set_title('lon-lat') +axs[0].set_xlabel('longitude') +axs[0].set_ylabel('latitude') +axs[0].set_aspect(1) + +it_slice=15 +axs[1].pcolormesh(p[0,it_slice,:], r[:,it_slice,0], data[:,it_slice,:], shading='auto') +axs[1].set_title('r-lon') +axs[1].set_xlabel('longitude') +axs[1].set_ylabel('latitude') +axs[1].set_aspect(10) + +ip_slice=15 +axs[2].pcolormesh(t[0,:,ip_slice], r[:,0,ip_slice], data[:,:,ip_slice], shading='auto') +axs[2].set_title('r-lat') +axs[2].set_xlabel('longitude') +axs[2].set_ylabel('latitude') +axs[2].set_aspect(10) + +plt.tight_layout() +plt.show() \ No newline at end of file diff --git a/test/inversion_small/example_to_check_result_with_pytomoatt.ipynb b/test/inversion_small/example_to_check_result_with_pytomoatt.ipynb new file mode 100644 index 0000000..dc6dafb --- /dev/null +++ b/test/inversion_small/example_to_check_result_with_pytomoatt.ipynb @@ -0,0 +1,4268 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(10, 50, 50)\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# read true model from hdf5 file\n", + "ftrue = \"./test_model_true.h5\"\n", + "\n", + "import h5py\n", + "\n", + "with h5py.File(ftrue, 'r') as f:\n", + " eta_true = f['eta'][:]\n", + " xi_true = f['xi'][:]\n", + " zeta_true = f['zeta'][:]\n", + " vel_true = f['vel'][:]\n", + "\n", + "# check the shape of the arrays\n", + "print(eta_true.shape)\n", + "\n", + "# plot\n", + "import matplotlib.pyplot as plt\n", + "plt.imshow(eta_true[0,:,:], cmap='seismic')\n", + "# inverse y\n", + "plt.gca().invert_yaxis()\n", + "# color bar\n", + "plt.colorbar()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/mnagaso/.pyenv/versions/3.10.8/lib/python3.10/abc.py:106: FutureWarning: xarray subclass Dataset should explicitly define __slots__\n", + " cls = super().__new__(mcls, name, bases, namespace, **kwargs)\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAksAAAHHCAYAAACvJxw8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB04UlEQVR4nO3deXgURf4/8HfPnTskhASQS0EOAdEgGGWFBZYgeLDigaKIsuIBiOAFrgqe4IkXcngguvDDxWs9WBRBcNWIEEFQMZ4ICiEg5CDHzGSmfn/wzeiYTH2SdJJOyPv1PPMoU101NT2dSaW6692GUkqBiIiIiKpks7oDRERERI0ZB0tEREREGhwsEREREWlwsERERESkwcESERERkQYHS0REREQaHCwRERERaXCwRERERKTBwRIRERGRBgdLVC2zZ8+GYRhWd4PqyQsvvADDMLBz506ru0JE1OhwsETNymeffYbrrrsO6enpcDqd4gDwueeeQ/fu3eHxeNClSxc8+eST1X4tr9eLW2+9FW3atEFUVBT69++PNWvWmH0LR53PP/8c55xzDpKSkhAdHY2ePXviiSeeEOu9/vrryMzMRJs2beB2u3HMMcfg/PPPx5dfflnl9kVFRbjlllvQqVMnuN1utG3bFueffz5KSkpC2+zduxczZszAX//6V8TFxcEwDKxfv76u3mqN7dixA8OHD0dsbCySkpJw2WWXYf/+/WHb7NmzB5deeim6du2KuLg4JCYmol+/fli6dCl4NyuiuuGwugNEDWnVqlV49tln0bt3bxx77LH49ttvI267aNEiXHPNNRg9ejSmT5+O//3vf7j++utRUlKCW2+9VXyt8ePH45VXXsENN9yALl264IUXXsCIESPwwQcfYMCAAXX5tpqs9957D2effTZOOukk3HHHHYiNjcUPP/yAX375Ray7fft2tGjRAlOnTkXLli2Rm5uL559/Hv369UNWVhZOPPHE0LYFBQUYOHAgfvnlF0ycOBGdO3fG/v378b///Q9erxfR0dEAgJycHDzwwAPo0qULevXqhaysrHp775JffvkFZ5xxBhISEnD//ffj8OHDePjhh7F9+3Z89tlncLlcAIADBw7gl19+wfnnn4/27dvD7/djzZo1GD9+PHJycnD//fdb9h6IjhqKqBpmzZqljobDJTc3V5WUlCillJo0aVLE91RSUqKSk5PVyJEjw54fO3asiomJUQcPHtS+zsaNGxUA9dBDD4WeKy0tVccdd5zKyMgw+S5+d/jw4TppZ8mSJQqA+umnn+qkveooKChQqamp6u9//7sKBAJ10mZubq5yOBzq6quvDnv+2muvVYmJierHH3/U1i8sLFS//fabUkqplStXKgDqgw8+qJO+/REAtWTJEu021157rYqKilI///xz6Lk1a9YoAGrRokXia5x11lkqJiZGlZeXm+0uUbPH03BUyUcffYRTTjkFHo8Hxx13HBYtWhRx23/9619IT09HVFQUkpKSMGbMGOzevTtsm0GDBqFnz57Izs7GaaedhqioKHTq1AkLFy6s77dSSWpqKqKiosTtPvjgA/z222+47rrrwp6fNGkSiouL8c4772jrv/LKK7Db7Zg4cWLoOY/HgwkTJiArK6vSPqqOiuuKNmzYgOuuuw6tWrXCMcccAwD4+eefcd1116Fr166IiopCcnIyLrjggiqvQfrqq68wePBgREVF4ZhjjsG9996LYDBY4/6YtXz5cuzbtw/33XcfbDYbiouLTfejVatWiI6ORn5+fui5/Px8LFmyBBMnTkSnTp3g8/ng9XqrrB8XF4ekpKRqv151jv/aevXVV3HWWWehffv2oeeGDh2K448/Hv/+97/F+h07dkRJSQl8Pl+d9IeoOeNpOAqzfft2DBs2DCkpKZg9ezbKy8sxa9YspKamVtr2vvvuwx133IELL7wQ//jHP7B//348+eSTOOOMM7BlyxYkJiaGtj106BBGjBiBCy+8EBdffDH+/e9/49prr4XL5cKVV16p7VNBQQH8fr/Yd4/Hg9jY2Bq/56ps2bIFANC3b9+w59PT02Gz2bBlyxZceuml2vrHH3884uPjw57v168fAGDr1q1o165drfp23XXXISUlBXfeeSeKi4sBAJs2bcInn3yCMWPG4JhjjsHOnTuxYMECDBo0CF9//XXoNFNubi7++te/ory8HDNmzEBMTAwWL15crQEkcOQ6rKKiompt27JlS235+++/j/j4ePz6668YNWoUvv32W8TExOCyyy7DvHnz4PF4qvU6+fn58Pv9yM3NxWOPPYbCwkIMGTIkVP7RRx+hrKwMnTt3xvnnn4833ngDwWAQGRkZmD9/Pvr06VOt1/mzmhz/NfXrr78iLy+v0vEHHDmGVq1aVen50tJS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g2rBggXqlltuUV26dAkLYxw4cKBq06aNatWqlZoyZYp68skn1YABAxQAtXjx4gZ9fzt37lT33HOPuueee1T//v0VgNC//7zyaP78+QqAOv/889Uzzzyjxo0bpwBUWulUEdj551VTF1xwgXI4HOrmm29WixYtUqeddppyOBxqw4YN1ar/ZxUr0TZt2lSpbNy4ccput6upU6eqRYsWqfHjx6tjjjlGJScnh60S3LNnj0pOTlYtWrRQs2fPVg899JDq0qVL6PNtyFBKpZS68sorFQB14YUXqvnz56sLLrhAAVAzZ84M265iReQftWrVSl188cXqgQceUIsXL1Y333yzSkpKUh6PR3388cdh265bt07Z7XbVtWtX9eijj6pZs2apuLg4dfzxx6uioqKwbSuOhzFjxigA6sorrww990fVPf6rgmqEUu7atUslJyer4447Tj3xxBPq/vvvVy1atFC9evUKWwk3depU1bdvX3X77berxYsXq7lz56pTTjlFAVBTpkzRvgYRVQ8HS1TJhg0bVHp6unK5XOrYY49VCxcujJjg/eqrr6oBAwaomJgYFRMTo7p166YmTZqkcnJyQtsMHDhQnXDCCWrz5s0qIyNDeTwe1aFDB/XUU0815NtSSin1wQcfRFzqPnDgwErbL168WHXt2lW5XC513HHHqXnz5qlgMBi2TaTBTmlpqbrppptUWlqacrvd6pRTTlGrV6+u9Bo33nijMgxD7dixQ9t33WDp0KFD6oorrlAtW7ZUsbGxKjMzU33zzTeqQ4cOlSIVtm3bpgYOHKg8Ho9q27atuueee9Rzzz1nyWDJ5/Op2bNnqw4dOiin06k6d+6s5s2bV2m7qgZLs2bNUn379lUtWrRQDodDtWnTRo0ZM0Zt27atytdas2aNOvXUU5XH41FJSUnqsssuU3v37q20XaTjo7bHf1WqM1hSSqkvv/xSDRs2TEVHR6vExEQ1duxYlZubG7bNe++9p8466yzVpk0b5XQ6VVxcnDr99NPVkiVLKh2rRFQ7hlK80yLVr0GDBuHAgQMRb3Da3PXr1w8dOnTAypUrre4KERFVgRd4E1mosLAQX3zxBZYuXWp1V4iIKAIOlogsFB8fH/E+ZURE1DhwNRwRERGRBq9ZIiIiItLgzBIRERGRBgdLRERERBpH/QXewWAQe/bsQVxcHAzDsLo7RETUiCml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cdZZZyEuLg4nnHACTjrppLBHdezevRtTp07FsmXL4PHos35qYubMmSgoKAg9du/eXWdtExER1RWlzD+AI79P//h7b+bMmda+sUbi+OOPx1133YVvv/0W//vf/7B//35cccUVtWqrVoOlG264Afn5+di4cSOioqKwevVqLF26FF26dMGbb75ZrTays7ORl5eHk08+GQ6HAw6HAxs2bMATTzwBh8OB1NRU+Hw+5Ofnh9Xbt28f0tLSIrbrdrsRHx8f9iAiIjpa/fl3ntvtrnK7li1bwm63V1pVrvu9mpaWpt2+4r/SNn++gLy8vBwHDx7U/j6vC5999hluuOEG/P3vf8e3336LCy64oFbt1GqwtG7dOjz66KPo27cvbDYbOnTogEsvvRQPPvgg5syZU602hgwZgu3bt2Pr1q2hR9++fTF27NjQ/zudTqxduzZUJycnB7t27UJGRkZtuk1ERNRoBJUy/agJl8uF9PT0sN+rwWAQa9eujfh7NSMjI2x7AFizZk1o+06dOiEtLS1sm8LCQmzcuDG0TUZGBvLz85GdnR3aZt26dQgGg+jfv3+N3kN1fPvtt5g1axaOP/54nH766dixYwceeOAB7Nu3DytWrKhVm7W6Zqm4uDh0/rFFixbYv38/jj/+ePTq1Quff/55tdqIi4tDz549w56LiYlBcnJy6PkJEyZg+vTpSEpKQnx8PKZMmYKMjIxqr4QjIiJqrBTkyxql+jU1ffp0XH755ejbty/69euHxx57DMXFxaHTU+PGjUPbtm1DEx9Tp07FwIED8cgjj2DkyJFYsWIFNm/ejMWLFwNAKB/x3nvvRZcuXdCpUyfccccdaNOmDUaNGgUA6N69O4YPH46rrroKCxcuhN/vx+TJkzFmzJg6XwkHHFkMdsopp2DSpEkYM2ZMpeupaqNWg6WuXbsiJycHHTt2xIknnohFixahY8eOWLhwIVq3bm26UxXmzZsHm82G0aNHw+v1IjMzE08//XSdtU9ERNScXHTRRdi/fz/uvPNO5Obmok+fPli9enVoQLFr1y7Y/hAdcdppp2H58uW4/fbbcdttt6FLly544403wiY7brnlFhQXF2PixInIz8/HgAEDsHr16rDrkZctW4bJkydjyJAhod/rTzzxRL28x5ycHHTp0qVO26xRzlKFf/3rXygvL8f48eORnZ2N4cOH47fffoPL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JxgMYs+ePYiLizP9l3h1FRYWol27dti9ezfi4+Mb5DWPdtyndYv7s+5xn9Ytq/anUgpFRUVo06YNbLb6WwNVVlYGn89nuh2XywWPx1MHPSKdo35myWaz4ZhjjrHktePj4/mlWce4T+sW92fd4z6tW1bsz/qaUfojj8fDQU4TwugAIiIiIg0OloiIiIg0OFiqB263G7NmzYLb7ba6K0cN7tO6xf1Z97hP6xb3JzUmR/0F3kRERERmcGaJiIiISIODJSIiIiINDpaIiIiINDhYIiIiItLgYKmW5syZg1NOOQVxcXFo1aoVRo0ahZycnLBtrr76ahx33HGIiopCSkoKzj33XHzzzTcW9bjxq84+raCUwplnngnDMPDGG280bEebkOrs00GDBsEwjLDHNddcY1GPG7fqHqNZWVkYPHgwYmJiEB8fjzPOOAOlpaUW9Ljxk/bpzp07Kx2fFY+VK1da2HNqTjhYqqUNGzZg0qRJ+PTTT7FmzRr4/X4MGzYMxcXFoW3S09OxZMkS7NixA++++y6UUhg2bBgCAd4puirV2acVHnvssQa7fU1TVt19etVVV2Hv3r2hx4MPPmhRjxu36uzPrKwsDB8+HMOGDcNnn32GTZs2YfLkyfV664ymTNqn7dq1Czs29+7di7vuuguxsbE488wzLe49NRuK6kReXp4CoDZs2BBxmy+++EIBUN9//30D9qzpirRPt2zZotq2bav27t2rAKjXX3/dmg42QVXt04EDB6qpU6da16kmrKr92b9/f3X77bdb2KumrTrfpX369FFXXnllA/aKmjv+qVNHCgoKAABJSUlVlhcXF2PJkiXo1KkT2rVr15Bda7Kq2qclJSW45JJLMH/+fKSlpVnVtSYr0nG6bNkytGzZEj179sTMmTNRUlJiRfeanD/vz7y8PGzcuBGtWrXCaaedhtTUVAwcOBAfffSRld1sUqTv0uzsbGzduhUTJkxoyG5RM8dQyjoQDAZxzjnnID8/v9KX4tNPP41bbrkFxcXF6Nq1K9555x0cd9xxFvW06Yi0T6+++moEAgE8++yzAADDMPD6669j1KhRFvW06Yi0TxcvXowOHTqgTZs22LZtG2699Vb069cPr732moW9bfyq2p+ffvopMjIykJSUhIcffhh9+vTBiy++iKeffhpffvklunTpYnGvGzfdd2mF6667DuvXr8fXX3/dwL2jZs3qqa2jwTXXXKM6dOigdu/eXaksPz9fffvtt2rDhg3q7LPPVieffLIqLS21oJdNS1X79D//+Y/q3LmzKioqCj0HnoarNt1x+kdr167l6eJqqGp/fvzxxwqAmjlzZti2vXr1UjNmzGjoLjY50jFaUlKiEhIS1MMPP9zAPaPmjoMlkyZNmqSOOeYY9eOPP4rber1eFR0drZYvX94APWu6Iu3TqVOnKsMwlN1uDz0AKJvNpgYOHGhNZ5uImhynhw8fVgDU6tWrG6BnTVOk/fnjjz8qAOqll14Ke/7CCy9Ul1xySUN2scmpzjH64osvKqfTqfLy8hqwZ0RKOayc1WrKlFKYMmUKXn/9daxfvx6dOnWqVh2lFLxebwP0sOmR9umMGTPwj3/8I+y5Xr16Yd68eTj77LMbsqtNRm2O061btwIAWrduXc+9a3qk/dmxY0e0adOmUpzAt99+y5VbEdTkGH3uuedwzjnnICUlpQF7SARwsFRLkyZNwvLly/Gf//wHcXFxyM3NBQAkJCQgKioKP/74I15++WUMGzYMKSkp+OWXXzB37lxERUVhxIgRFve+cZL2aVpaWpUXdbdv375ag4DmSNqnP/zwA5YvX44RI0YgOTkZ27Ztw7Rp03DGGWegd+/eFve+8ZH2p2EYuPnmmzFr1iyceOKJ6NOnD5YuXYpvvvkGr7zyisW9b5ykfVrh+++/x4cffohVq1ZZ1VVqziyc1WrSAFT5WLJkiVJKqV9//VWdeeaZqlWrVsrpdKpjjjlGXXLJJeqbb76xtuONmLRPI9XhNUuRSft0165d6owzzlBJSUnK7Xarzp07q5tvvlkVFBRY2/FGqrrH6Jw5c9QxxxyjoqOjVUZGhvrf//5nTYebgOru05kzZ6p27dqpQCBgTUepWeNqOCIiIiIN5iwRERERaXCwRERERKTBwRIRERGRBgdLRERERBocLBERERFpcLBEREREpMHBEhEREZEGB0tER6FBgwbhhhtusLobRERHBQ6WiIiIiDQ4WCIiIiLS4GCJ6Ch36NAhjBs3Di1atEB0dDTOPPNMfPfdd6HyF154AYmJiXj33XfRvXt3xMbGYvjw4di7d6+FvSYiajw4WCI6yo0fPx6bN2/Gm2++iaysLCilMGLECPj9/tA2JSUlePjhh/HSSy/hww8/xK5du3DTTTdZ2GsiosbDYXUHiKj+fPfdd3jzzTfx8ccf47TTTgMALFu2DO3atcMbb7yBCy64AADg9/uxcOFCHHfccQCAyZMn4+6777as30REjQlnloiOYjt27IDD4UD//v1DzyUnJ6Nr167YsWNH6Lno6OjQQAkAWrdujby8vAbtKxFRY8XBEhHB6XSG/dswDCilLOoNEVHjwsES0VGse/fuKC8vx8aNG0PP/fbbb8jJyUGPHj0s7BkRUdPBwRLRUaxLly4499xzcdVVV+Gjjz7CF198gUsvvRRt27bFueeea3X3iIiaBA6WiI5yS5YsQXp6Os466yxkZGRAKYVVq1ZVOvVGRERVMxQvTCAiIiKKiDNLRERERBocLBERERFpcLBEREREpMHBEhEREZEGB0tEREREGhwsEREREWlwsERERESkwcESERERkQYHS0REREQaHCwRERERaXCwRERERKTBwRIRERGRxv8H8U3KaBh15JQAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# read the calculate values\n", + "\n", + "fres_data = \"OUTPUT_FILES/out_data_sim.h5\"\n", + "fres_grid = \"OUTPUT_FILES/out_data_grid.h5\"\n", + "\n", + "from pytomoatt.data import *\n", + "attdata = ATTData.read(fres_data,\n", + " './input_params.yml',\n", + " fres_grid, \n", + " format='hdf5')\n", + "\n", + "ax = attdata.to_xarray()\n", + "\n", + "ax['eta_inv_0029'][0,:,:].plot(x='lon', y='lat')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset>\n",
+       "Dimensions:       (r: 10, t: 50, p: 50)\n",
+       "Coordinates:\n",
+       "    dep           (r) float64 10.0 7.778 5.556 3.333 ... -5.556 -7.778 -10.0\n",
+       "    rad           (r) float64 6.361e+03 6.363e+03 ... 6.379e+03 6.381e+03\n",
+       "    lat           (t) float64 37.7 37.79 37.89 37.98 ... 42.02 42.11 42.21 42.3\n",
+       "    lon           (p) float64 22.7 22.79 22.89 22.98 ... 27.02 27.11 27.21 27.3\n",
+       "Dimensions without coordinates: r, t, p\n",
+       "Data variables: (12/90)\n",
+       "    eta_inv_0001  (r, t, p) float64 3.094e-05 3.827e-05 ... 2.974e-07 2.096e-07\n",
+       "    eta_inv_0002  (r, t, p) float64 6.748e-05 8.346e-05 ... 6.182e-07 4.369e-07\n",
+       "    eta_inv_0003  (r, t, p) float64 9.108e-05 0.0001125 ... 8.88e-07 6.293e-07\n",
+       "    eta_inv_0004  (r, t, p) float64 9e-05 0.0001106 ... 1.108e-06 7.869e-07\n",
+       "    eta_inv_0005  (r, t, p) float64 4.428e-05 5.273e-05 ... 1.251e-06 8.914e-07\n",
+       "    eta_inv_0006  (r, t, p) float64 -4.276e-05 -5.687e-05 ... 8.875e-07\n",
+       "    ...            ...\n",
+       "    xi_inv_0025   (r, t, p) float64 -2.307e-05 -6.187e-05 ... -2.291e-06\n",
+       "    xi_inv_0026   (r, t, p) float64 -3.233e-05 -7.32e-05 ... -2.331e-06\n",
+       "    xi_inv_0027   (r, t, p) float64 -2.429e-05 -6.387e-05 ... -2.312e-06\n",
+       "    xi_inv_0028   (r, t, p) float64 -3.359e-05 -7.502e-05 ... -2.342e-06\n",
+       "    xi_inv_0029   (r, t, p) float64 -2.636e-05 -6.656e-05 ... -2.325e-06\n",
+       "    xi_inv_0030   (r, t, p) float64 -3.402e-05 -7.566e-05 ... -2.352e-06
" + ], + "text/plain": [ + "\n", + "Dimensions: (r: 10, t: 50, p: 50)\n", + "Coordinates:\n", + " dep (r) float64 10.0 7.778 5.556 3.333 ... -5.556 -7.778 -10.0\n", + " rad (r) float64 6.361e+03 6.363e+03 ... 6.379e+03 6.381e+03\n", + " lat (t) float64 37.7 37.79 37.89 37.98 ... 42.02 42.11 42.21 42.3\n", + " lon (p) float64 22.7 22.79 22.89 22.98 ... 27.02 27.11 27.21 27.3\n", + "Dimensions without coordinates: r, t, p\n", + "Data variables: (12/90)\n", + " eta_inv_0001 (r, t, p) float64 3.094e-05 3.827e-05 ... 2.974e-07 2.096e-07\n", + " eta_inv_0002 (r, t, p) float64 6.748e-05 8.346e-05 ... 6.182e-07 4.369e-07\n", + " eta_inv_0003 (r, t, p) float64 9.108e-05 0.0001125 ... 8.88e-07 6.293e-07\n", + " eta_inv_0004 (r, t, p) float64 9e-05 0.0001106 ... 1.108e-06 7.869e-07\n", + " eta_inv_0005 (r, t, p) float64 4.428e-05 5.273e-05 ... 1.251e-06 8.914e-07\n", + " eta_inv_0006 (r, t, p) float64 -4.276e-05 -5.687e-05 ... 8.875e-07\n", + " ... ...\n", + " xi_inv_0025 (r, t, p) float64 -2.307e-05 -6.187e-05 ... -2.291e-06\n", + " xi_inv_0026 (r, t, p) float64 -3.233e-05 -7.32e-05 ... -2.331e-06\n", + " xi_inv_0027 (r, t, p) float64 -2.429e-05 -6.387e-05 ... -2.312e-06\n", + " xi_inv_0028 (r, t, p) float64 -3.359e-05 -7.502e-05 ... -2.342e-06\n", + " xi_inv_0029 (r, t, p) float64 -2.636e-05 -6.656e-05 ... -2.325e-06\n", + " xi_inv_0030 (r, t, p) float64 -3.402e-05 -7.566e-05 ... -2.352e-06" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ax" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# calculate the RMAE for each step for vel xi eta\n", + "\n", + "rmae_vel = []\n", + "rmae_xi = []\n", + "rmae_eta = []\n", + "\n", + "n_steps = 30\n", + "\n", + "for i in range(1,n_steps+1):\n", + " # get value from ax\n", + " vel = ax['vel_inv_{}'.format(str(i).zfill(4))][:,:,:].data\n", + " xi = ax['xi_inv_{}'.format(str(i).zfill(4))][:,:,:].data\n", + " eta = ax['eta_inv_{}'.format(str(i).zfill(4))][:,:,:].data\n", + "\n", + " # calculate rmae\n", + " r_vel = np.sum(np.abs(vel - vel_true))/np.sum(np.abs(vel_true)) * 100\n", + " r_xi = np.sum(np.abs(xi - xi_true))/np.sum(np.abs(xi_true)) * 100\n", + " r_eta = np.sum(np.abs(eta - eta_true))/np.sum(np.abs(eta_true)) * 100\n", + "\n", + " # append to list\n", + " rmae_vel.append(r_vel)\n", + " rmae_xi.append(r_xi)\n", + " rmae_eta.append(r_eta)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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fOYzw9KBrq4ubd68uXC8detWbdy4UU1NTZozZ47WrFmjVatWacmSJTr55JN12223KZFI6LLLLhuW1wcAAAAAAJjQ/DXOiLFqvbYLW7Zs0Y4dO2RZlt555x0df/zxI9SxwzekUE2SXnvtNW3btk3pdLqk/mMf+5ir+/zXf/2XVqxYUThes2aNJGnVqlVav369LrnkEu3du1c333yzdu3apRNPPFG/+c1v+ixeAAAAAAAAgAoMY9BTMKspnU7rM5/5jC655BItXLhQX/ziF/XKK68M+8zI4eI6VHv77bd1wQUX6JVXXpFhGLJtW5KzYIGkiiuDDuS0004r3KM/q1ev1urVq912FQAAAAAAAOPE1772NcViMd1+++2qq6vTr3/9a11++eV66KGHqt21ilw/U+3LX/6y5s+frz179qimpkZ//vOf9cQTT2jJkiV67LHHRqCLI6O9vV1tbW1aunRptbsCAAAAAAAwqT322GO67bbb9POf/1yRSEQej0c///nP9eSTT+onP/lJtbtXkWEfaphYmebmZv3+97/XCSecoGg0queee04LFy7U73//e1133XV68cUXR6qvIyIejysajSoWiykSiVS7OwAAAAAAAIclmUxq69atmj9/vkKhULW7M+YM9Pm4yYlcj1QzTVP19fWSnIBtxw7nQXdz587Vpk2b3N4OAAAAAAAAGHdcP1PtuOOO00svvaT58+dr2bJl+u53v6tAIKC77rpLCxYsGIk+AgAAAAAAAGOK61Dt61//uhKJhCTpm9/8pv77f//vOvXUUzVlyhTdf//9w95BAAAAAAAAYKxxHaqtXLmyUD7yyCP1xhtvaP/+/WpsbCysAAoAAAAAAABMZK5DtUqampqG4zYAAAAAAADAuOA6VEsmk/rxj3+sRx99VHv27JFlWSXn//SnPw1b5wAAAAAAAICxyHWo9oUvfEGPPPKILr74Yp188slM+QQAAAAAAMCk4zpUe+ihh/TrX/9ap5xyykj0Z9S0t7ervb1dpmlWuysAAAAAAAAYZzxuL5g5c6bq6+tHoi+j6qqrrtJrr72m559/vtpdAQAAAAAAwDjjOlT7/ve/r69+9at69913R6I/AAAAAAAAwJjnOlRbsmSJksmkFixYoPr6ejU1NZVsAAAAAAAAwHB77LHHZBiGDh48WO2uSBrCM9U+9alPafv27fq7v/s7TZ8+nYUKAAAAAAAAMOm4DtWefvppPfPMM1q0aNFI9AcAAAAAAACTlGVZ+s53vqO77rpLu3bt0tFHH62bbrpJS5Ys0YoVKyRJjY2NkqRVq1Zp/fr1+s1vfqNvf/vbevXVV+X1erV8+XL96Ec/0hFHHDGifXUdqh1zzDHq6ekZib4AAAAAAABgmNm2rZ5sdbKcsC/sapbjunXr9C//8i+68847ddRRR+mJJ57QZz7zGf32t7/Vv/3bv+miiy7Spk2bFIlEFA6HJUmJREJr1qzRCSecoK6uLt1888264IILtHHjRnk8rp98NmiGbdu2mwseeeQRrV27Vn/7t3+r448/Xn6/v+R8JBIZ1g6OtHg8rmg0qlgsNu76DgAAAAAAUC6ZTGrr1q2aP3++QqGQujPdWnbvsqr05dlPP6saf82g2qZSKTU1Nel3v/udli9fXqj/4he/qO7ubl155ZVasWKFDhw4oIaGhn7v09HRoalTp+qVV17Rcccd1+d8+edTzE1O5Hqk2tlnny1JOuOMM0rqbduWYRgyTdPtLQEAAAAAADDJbd68Wd3d3frIRz5SUp9Op/XBD36w3+veeust3XzzzXr22WfV0dEhy7IkSdu2basYqg0X16Hao48+OhL9AAAAAAAAwAgI+8J69tPPVu21B6urq0uS9PDDD2vmzJkl54LBoLZs2VLxuvPOO09z587VT3/6U7W2tsqyLB133HFKp9ND7/gguArVMpmMvvnNbxbmtY5n7e3tam9vZ2QdAAAAAACY0AzDGPQUzGpqa2tTMBjUtm3b9Jd/+Zd9zr/33nuSVJLl7Nu3T5s2bdJPf/pTnXrqqZKkP/zhD6PSX1ehmt/v18svvzxSfRlVV111la666qrCXFkAAAAAAABUT319va6//npde+21sixLf/EXf6FYLKannnpKkUhEZ555pgzD0EMPPaRzzz1X4XBYjY2NmjJliu666y7NmDFD27Zt0w033DAq/XW9BMJnPvMZ/Z//839Goi8AAAAAAACYxL71rW/ppptu0rp163Tsscfq7LPP1sMPP6z58+dr5syZWrt2rW644QZNnz5dq1evlsfj0X333acXXnhBxx13nK699lrdeuuto9JX16t/Xn311br77rt11FFHafHixaqtrS05/4Mf/GBYOzjSWP0TAAAAAABMJAOtbokqrv756quv6qSTTpIk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N910kySpvr5e69ev12uvvaYf/ehH+ulPf6of/vCHkqRLLrlE1113nT7wgQ8UXu+SSy7p069EIqGVK1eqsbFRzz//vH75y1/qd7/7XZ/Xf/TRR7VlyxY9+uij+ud//metX7++ENIBAACMV0z/BAAAGOOamprk9XpVX19fMv1y3bp1uvTSSwvPWTvqqKN0++236y//8i/1k5/8RKFQSJJ0+umn67rrriu559e//vVCed68ebr++ut133336Stf+YrC4bDq6urk8/kGnO557733KplM6u6771Ztba0k6Y477tB5552n73znO5o+fbokqbGxUXfccYe8Xq+OOeYYffSjH9WGDRt0xRVXDMvnAwAAUA2EagAAAOPUSy+9pJdffln33HNPoc62bVmWpa1bt+rYY4+VJC1ZsqTPtffff79uv/12bdmyRV1dXcpms4pEIq5e//XXX9eiRYsKgZoknXLKKbIsS5s2bSqEah/4wAfk9XoLbWbMmKFXXnnF1WsBAACMNYRqAAAA41RXV5f+5//8n/qrv/qrPufmzJlTKBeHXpL0zDPP6NJLL9XatWu1cuVKRaNR3Xffffr+978/Iv30+/0lx4ZhyLKsEXktAACA0UKoBgAAMA4EAgGZpllSd9JJJ+m1117TkUce6epeTz/9tObOnauvfe1rhbp33333kK9X7thjj9X69euVSCQKwd1TTz0lj8ejhQsXuuoTAADAeMNCBQAAAOPAvHnz9MQTT2j79u3q6OiQ5Kzg+fTTT2v16tXauHGj3nrrLf3qV7/qs1BAuaOOOkrbtm3Tfffdpy1btuj222/XAw880Of1tm7dqo0bN6qjo0OpVKrPfS699FKFQiGtWrVKr776qh599FFdffXV+uxnP1uY+gkAADBREaoBAACMA9/85jf1zjvv6IgjjtDUqVMlSSeccIIef/xxvfnmmzr11FP1wQ9+UDfffLNaW1sHvNfHPvYxXXvttVq9erVOPPFEPf3004VVQfMuuuginX322VqxYoWmTp2qX/ziF33uU1NTo9/+9rfav3+/li5dqosvvlhnnHGG7rjjjuF74wAAAGOUYdu2Xe1OAAAAAAAAAOMJI9UAAAAAAAAAlwjVAAAAAAAAAJcI1QAAAAAAAACXCNUAAAAAAAAAlwjVAAAAAAAAAJcI1QAAAAAAAACXCNUAAAAAAAAAlwjVAAAAAAAAAJcI1QAAAAAAAACXCNUAAAAAAAAAlwjVAAAAAAAAAJcI1QAAAAAAAACX/j/hFLDsl/fFKQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#plot rmae_* arrays\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "\n", + "plt.figure(figsize=(15, 5))\n", + "plt.plot(rmae_vel, label='vel')\n", + "plt.plot(rmae_xi, label='xi')\n", + "plt.plot(rmae_eta, label='eta')\n", + "\n", + "# y log\n", + "plt.yscale('log')\n", + "\n", + "# x axis is iteration number\n", + "plt.xlabel('iteration')\n", + "plt.ylabel('rmae %')\n", + "plt.legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/inversion_small/img/result_fun.png b/test/inversion_small/img/result_fun.png new file mode 100644 index 0000000..ba741b6 Binary files /dev/null and b/test/inversion_small/img/result_fun.png differ diff --git a/test/inversion_small/input_params.yml b/test/inversion_small/input_params.yml new file mode 100644 index 0000000..2628ff5 --- /dev/null +++ b/test/inversion_small/input_params.yml @@ -0,0 +1,259 @@ +version: 3 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-10, 10] # depth in km + min_max_lat: [37.7, 42.3] # latitude in degree + min_max_lon: [22.7, 27.3] # longitude in degree + n_rtp: [10, 50, 50] # number of nodes in depth,latitude,longitude direction + +################################################# +# traveltime data file path # +################################################# +source: + src_rec_file: OUTPUT_FILES/src_rec_file_forward.dat # source receiver file path + swap_src_rec: true # swap source and receiver + +################################################# +# initial model file path # +################################################# +model: + init_model_path: ./test_model_init.h5 # path to initial model file +# model_1d_name: dummy_model_1d_name # 1D model name used in teleseismic 2D solver (iasp91, ak135, user_defined is available), defined in include/1d_model.h + +################################################# +# parallel computation settings # +################################################# +parallel: # parameters for parallel computation + n_sims: 1 # number of simultanoues runs (parallel the sources) + ndiv_rtp: [1, 1, 1] # number of subdivision on each direction (parallel the computional domain) + nproc_sub: 1 # number of processors for sweep parallelization (parallel the fast sweep method) + use_gpu: false # true if use gpu (EXPERIMENTAL) + +############################################ +# output file setting # +############################################ +output_setting: + output_dir: ./OUTPUT_FILES/ # path to output director (default is ./OUTPUT_FILES/) + output_source_field: true # output the calculated field of all sources + output_model_dat: false # output model_parameters_inv_0000.dat (data in text format) or not. + output_final_model: true # output merged final model (final_model.h5) or not. + output_in_process: true # output model at each inv iteration or not. + output_in_process_data: true # output src_rec_file at each inv iteration or not. + single_precision_output: false # output results in single precision or not. + verbose_output_level: 1 # output internal parameters, if no, only model parameters are out. + output_file_format: 0 + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion + earthquake relocation +run_mode: 1 + +################################################### +# model update parameters setting # +################################################### +model_update: + max_iterations: 3 # maximum number of inversion iterations + optim_method: 0 # optimization method. 0 : grad_descent, 1 : halve-stepping, 2 : lbfgs (EXPERIMENTAL) + + #common parameters for all optim methods + step_length: 0.01 # the initial step length of model perturbation. 0.01 means maximum 1% perturbation for each iteration. + + # parameters for optim_method 0 (gradient_descent) + optim_method_0: + step_method: 1 # the method to modulate step size. 0: according to objective function; 1: according to gradient direction + # if step_method:0. if objective function increase, step size -> step length * step_length_decay. + step_length_decay: 0.9 # default: 0.9 + # if step_method:1. if the angle between the current and the previous gradients is greater than step_length_gradient_angle, step size -> step length * step_length_change[0]. + # otherwise, step size -> step length * step_length_change[1]. + step_length_gradient_angle: 120 # default: 120.0 + step_length_change: [0.5, 1.2] # default: [0.5,1.2] + # Kdensity_coe is used to rescale the final kernel: kernel -> kernel / pow(density of kernel, Kdensity_coe). if Kdensity_coe > 0, the region with less data will be enhanced during the inversion + # e.g., if Kdensity_coe = 0, kernel remains upchanged; if Kdensity_coe = 1, kernel is normalized. 0.5 or less is recommended if really required. + Kdensity_coe: 0 # default: 0.0, range: 0.0 - 1.0 + + # parameters for optim_method 1 (halve-stepping) or 2 (lbfgs) + optim_method_1_2: + max_sub_iterations: 20 # maximum number of each sub-iteration + regularization_weight: 0.5 # weight value for regularization (lbfgs mode only) + coefs_regulalization_rtp: [1, 1, 1] # regularization coefficients for rtp (lbfgs mode only) + + # smoothing + smoothing: + smooth_method: 0 # 0: multiparametrization, 1: laplacian smoothing (EXPERIMENTAL) + l_smooth_rtp: [1, 0.0174533, 0.0174533] # smoothing coefficients for laplacian smoothing + + # parameters for smooth method 0 (multigrid model parametrization) + # inversion grid can be viewed in OUTPUT_FILES/inversion_grid.txt + n_inversion_grid: 5 # number of inversion grid sets + + # settings for flexible inversion grid + dep_inv: [-10, -7.5, -5, -2.5, 0, 2.5, 5, 7.5, 10] # inversion grid for vel in depth (km) + lat_inv: [37.7, 38.16, 38.62, 39.08, 39.54, 40.0, 40.46, 40.92, 41.38, 41.84, 42.3] # inversion grid for vel in latitude (degree) + lon_inv: [22.7, 23.06, 23.42, 23.78, 24.14, 24.5, 24.86, 25.22, 25.58, 25.94, 26.3, 26.66, 27.02, 27.3] # inversion grid for vel in longitude (degree) + trapezoid: [1, 0, 50] # usually set as [1.0, 0.0, 50.0] (default) + + # if we want to use another inversion grid for inverting anisotropy, set invgrid_ani: true (default: false) + invgrid_ani: false + # settings for flexible inversion grid for anisotropy + dep_inv_ani: [] # inversion grid for ani in depth (km) + lat_inv_ani: [] # inversion grid for ani in latitude (degree) + lon_inv_ani: [] # inversion grid for ani in longitude (degree) + trapezoid_ani: [1, 0, 50] # usually set as [1.0, 0.0, 50.0] (default) + + # Carefully change trapezoid and trapezoid_ani, if you really want to use trapezoid inversion grid, increasing the inversion grid spacing with depth to account for the worse data coverage in greater depths. + # The trapezoid_ inversion grid with index (i,j,k) in longitude, latitude, and depth is defined as: + # if dep_inv[k] < trapezoid[1], lon = lon_inv[i]; + # lat = lat_inv[j]; + # dep = dep_inv[k]; + # if trapezoid[1] <= dep_inv[k] < trapezoid[2], lon = mid_lon_inv+(lon_inv[i]-mid_lon_inv)*(dep_inv[k]-trapezoid[1])/(trapezoid[2]-trapezoid[1])*trapezoid[0]; + # lat = mid_lat_inv+(lat_inv[i]-mid_lat_inv)*(dep_inv[k]-trapezoid[1])/(trapezoid[2]-trapezoid[1])*trapezoid[0]; + # dep = dep_inv[k]; + # if trapezoid[2] <= dep_inv[k], lon = mid_lon_inv+(lon_inv[i]-mid_lon_inv)*trapezoid[0]; + # lat = mid_lat_inv+(lat_inv[i]-mid_lat_inv)*trapezoid[0]; + # dep = dep_inv[k]; + # The shape of trapezoid inversion gird (x) looks like: + # + # lon_inv[0] [1] [2] [3] [4] + # |<-------- (lon_inv[end] - lon_inv[0]) ---->| + # dep_inv[0] | x x x x x | + # | | + # dep_inv[1] | x x x x x | + # | | + # dep_inv[2] = trapezoid[1] / x x x x x \ + # / \ + # dep_inv[3] / x x x x x \ + # / \ + # dep_inv[4] = trapezoid[2] / x x x x x \ + # | | + # dep_inv[5] | x x x x x | + # | | + # dep_inv[6] | x x x x x | + # |<---- trapezoid[0]* (lon_inv[end] - lon_inv[0]) ------>| + + # inversion grid volume rescale (kernel -> kernel / volume of inversion grid mesh), + # this precondition may be carefully applied if the sizes of inversion grids are unbalanced + invgrid_volume_rescale: true + + # path to station correction file (under development) + use_sta_correction: false + # sta_correction_file: dummy_sta_correction_file # station correction file path + step_length_sc: 0.001 # step length relate to the update of station correction terms + + + # In the following data subsection, XXX_weight means a weight is assigned to the data, influencing the objective function and gradient + # XXX_weight : [d1,d2,w1,w2] means: + # if XXX < d1, weight = w1 + # if d1 <= XXX < d2, weight = w1 + (XXX-d1)/(d2-d1)*(w2-w1), (linear interpolation) + # if d2 <= XXX , weight = w2 + # You can easily set w1 = w2 = 1.0 to normalize the weight related to XXX. + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time: true # 'true' for using absolute traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1, 3, 1, 1] # XXX is the absolute traveltime residual (second) = abs(t^{obs}_{n,i} - t^{syn}_{n,j}) + distance_weight: [50, 150, 1, 1] # XXX is epicenter distance (km) between the source and receiver related to the data + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + use_cs_time: false # 'true' for using common source differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1, 3, 1, 0.1] # XXX is the common source differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{n,j} - t^{syn}_{n,i} + t^{syn}_{n,j}). + azimuthal_weight: [15, 30, 1, 0.1] # XXX is the azimuth difference between two separate stations related to the common source. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time: false # 'true' for using common receiver differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1, 3, 1, 0.1] # XXX is the common receiver differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{m,i} - t^{syn}_{n,i} + t^{syn}_{m,i}) + azimuthal_weight: [15, 30, 1, 0.1] # XXX is the azimuth difference between two separate sources related to the common receiver. + + # -------------- global weight of different types of data (to balance the weight of different data) -------------- + global_weight: + balance_data_weight: true # yes: over the total weight of the each type of the data. no: use original weight (below weight for each type of data needs to be set) + abs_time_weight: 1 # weight of absolute traveltime data after balance, default: 1.0 + cs_dif_time_local_weight: 1 # weight of common source differential traveltime data after balance, default: 1.0 + cr_dif_time_local_weight: 1 # weight of common receiver differential traveltime data after balance, default: 1.0 + teleseismic_weight: 1 # weight of teleseismic data after balance, default: 1.0 (exclude in this version) + + # -------------- inversion parameters -------------- + update_slowness : true # update slowness (velocity) or not. default: true + update_azi_ani : true # update azimuthal anisotropy (xi, eta) or not. default: false + + # -------------- for teleseismic inversion (under development) -------------- + # depth_taper : [d1,d2] means: + # if XXX < d1, kernel <- kernel * 0.0 + # if d1 <= XXX < d2, kernel <- kernel * (XXX-d1)/(d2-d1), (linear interpolation) + # if d2 <= XXX , kernel <- kernel * 1.0 + # You can easily set d1 = -200, d1 = -100 to remove this taper. + depth_taper : [-200, -100] + +################################################# +# relocation parameters setting # +################################################# +relocation: # update earthquake hypocenter and origin time (when run_mode : 2 and 3) + min_Ndata: 4 # if the number of data of the earthquake is less than , the earthquake will not be relocated. defaut value: 4 + + # relocation_strategy + step_length : 0.01 # initial step length of relocation perturbation. 0.01 means maximum 1% perturbation for each iteration. + step_length_decay : 0.9 # if objective function increase, step size -> step length * step_length_decay. default: 0.9 + rescaling_dep_lat_lon_ortime : [10, 10, 10, 1] # The perturbation is related to . Unit: km,km,km,second + max_change_dep_lat_lon_ortime : [5, 5, 5, 0.5] # the change of dep,lat,lon,ortime do not exceed max_change. Unit: km,km,km,second + max_iterations : 100 # maximum number of iterations for relocation + tol_gradient : 0.0001 # if the norm of gradient is smaller than the tolerance, the iteration of relocation terminates + + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time : true # 'yes' for using absolute traveltime data to update ortime and location; 'no' for not using (no need to set parameters in this section) + residual_weight : [1, 3, 1, 0.1] # XXX is the absolute traveltime residual (second) = abs(t^{obs}_{n,i} - t^{syn}_{n,j}) + distance_weight : [50, 150, 1, 0.1] # XXX is epicenter distance (km) between the source and receiver related to the data + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + use_cs_time : false # 'yes' for using common source differential traveltime data to update ortime and location; 'no' for not using (no need to set parameters in this section) + residual_weight : [1, 3, 1, 1] # XXX is the common source differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{n,j} - t^{syn}_{n,i} + t^{syn}_{n,j}). + azimuthal_weight : [100, 200, 1, 1] # XXX is the azimuth difference between two separate stations related to the common source. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time : true # 'yes' for using common receiver differential traveltime data to update ortime and location; 'no' for not using (no need to set parameters in this section) + residual_weight : [1, 3, 1, 0.1] # XXX is the common receiver differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{m,i} - t^{syn}_{n,i} + t^{syn}_{m,i}) + azimuthal_weight : [10, 30, 1, 0.1] # XXX is the azimuth difference between two separate sources related to the common receiver. + + + # -------------- global weight of different types of data (to balance the weight of different data) -------------- + global_weight: + balance_data_weight: false # yes: over the total weight of the each type of the data. no: use original weight (below weight for each type of data needs to be set) + abs_time_local_weight: 1 # weight of absolute traveltime data for relocation after balance, default: 1.0 + cs_dif_time_local_weight: 1 # weight of common source differential traveltime data for relocation after balance, default: 1.0 + cr_dif_time_local_weight: 1 # weight of common receiver differential traveltime data for relocation after balance, default: 1.0 + +#################################################################### +# inversion strategy for tomography and relocation # +#################################################################### +inversion_strategy: # update model parameters and earthquake hypocenter iteratively (when run_mode : 3) + + inv_mode : 0 # 0 for update model parameters and relocation iteratively. 1 for update model parameters and relocation simultaneously. + + # for inv_mode : 0, parameters below are required + inv_mode_0: # update model for steps, then update location for steps, and repeat the process for loops. + model_update_N_iter : 1 + relocation_N_iter : 1 + max_loop : 10 + + # for inv_mode : 1, parameters below are required + inv_mode_1: # update model and location simultaneously for loops. + max_loop : 10 + +# keep these setting unchanged, unless you are familiar with the eikonal solver in this code +calculation: + convergence_tolerance: 0.0001 # threshold value for checking the convergence for each forward/adjoint run + max_iterations: 500 # number of maximum iteration for each forward/adjoint run + stencil_order: 1 # order of stencil, 1 or 3 + stencil_type: 1 # 0: , 1: first-order upwind scheme (only sweep_type 0 is supported) + sweep_type: 1 # 0: legacy, 1: cuthill-mckee with shm parallelization + diff --git a/test/inversion_small/input_params_flexible_inv_grid.yml b/test/inversion_small/input_params_flexible_inv_grid.yml new file mode 100644 index 0000000..c400e49 --- /dev/null +++ b/test/inversion_small/input_params_flexible_inv_grid.yml @@ -0,0 +1,188 @@ +version: 3 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-10.0, 10.0] # depth in km + min_max_lat: [37.7, 42.3] # latitude in degree + min_max_lon: [22.7, 27.3] # longitude in degree + n_rtp: [10, 50, 50] # number of nodes + +source: + src_rec_file: OUTPUT_FILES/src_rec_file_forward.dat # source receiver file (if found, src_dep_lat_lon is ignored) + swap_src_rec: true # swap source and receiver (1: yes, 0: no) + +model: + init_model_path: ./test_model_init.h5 # path to initial model file (ignored if init_model_type is '1d_*') + +parallel: # parameters for parallel computation + n_sims: 1 # number of simultaneous run + ndiv_rtp: [1, 1, 1] # number of subdomains + nproc_sub: 2 # number of subprocess used for each subdomain + +output_setting: + output_dir: ./OUTPUT_FILES/ # path to output director (default is ./OUTPUT_FILES/) + output_source_field: false # output the calculated field of all sources + output_model_dat: false # output model_parameters_inv_0000.dat or not. + output_final_model: true # output merged final model or not. + output_in_process: true # output model at each inv iteration or not. + single_precision_output: false # output results in single precision or not. + verbose_output_level: 0 # output internal parameters, if 0, only model parameters are out. Higher level, more internal parameters are output. default: 0 + output_file_format: 0 # in/output file format, if 0: HDF5, if 1: ASCII + + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion+earthquake relocation +run_mode: 1 + + +################################################### +# model update parameters setting # +################################################### +model_update: # update model parameters (when run_mode : 1 and 3) + max_iterations: 20 # maximum number of inversion iterations + optim_method: 1 # optimization method. 0 : grad_descent, 1 : halve-stepping, 2 : lbfgs (EXPERIMENTAL) + + # common parameters for all optim methods + step_length: 0.03 # step length of model perturbation at each iteration. 0.01 means maximum 1% perturbation for each iteration. + + # parameters for optim_method 0 (grad_descent) + optim_method_0: + step_length_decay: 0.7 # if objective function increase, step size -> step length * step_length_decay. default: 0.9 + step_length_sc: 0.001 # ... # use it also ? + + # parameters for optim_method 1 (halve-stepping) or 2 (lbfgs) + optim_method_1_2: + max_sub_iterations: 10 # maximum number of each sub-iteration + regularization_weight: 100 # weight value for regularization (lbfgs mode only) + + # smoothing + smoothing: + smooth_method: 0 # 0: multiparametrization, 1: laplacian smoothing (EXPERIMENTAL) + l_smooth_rtp: [1, 1, 1] # smoothing coefficients for laplacian smoothing + + # parameters for smooth method 0 (multigrid model parametrization) + n_inversion_grid: 5 # number of inversion grid sets + + # inversion grid type + type_invgrid_dep: 1 # 0: uniform inversion grid, 1: flexible grid + type_invgrid_lat: 0 # 0: uniform inversion grid, 1: flexible grid + type_invgrid_lon: 0 # 0: uniform inversion grid, 1: flexible grid + + # settings for uniform inversion grid (if type_*_inv : 0) + n_inv_dep_lat_lon: [5, 10, 10] # number of the base inversion grid points (ignored if type_*_inv : 1) + min_max_dep_inv: [-10.0, 10.0] # depth in km (Radius of the earth is defined in config.h/R_earth) (ignored if type_dep_inv : 1) + min_max_lat_inv: [37.7, 42.3] # latitude in degree + min_max_lon_inv: [22.7, 27.3] # longitude in degree + + # settings for flexible inversion grid (if type_*_inv : 1) + dep_inv: [-15, -10, -5, 0, 5, 10, 15] # depth in km (Radius of the earth is defined in config.h/R_earth) + lat_inv: [] # latitude in degree (ignored if type_lat_inv : 0) + lon_inv: [] # longitude in degree (ignored if type_lon_inv : 0) + + # path to station correction file + use_sta_correction: false + sta_correction_file: dummy_sta_correction_file # station correction file path + + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time: true # 'true' for using absolute traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. wt = residual_weight[2] for res < residual_weight[0]. wt = residual_weight[3] for res > residual_weight[1], and linear weight in between. + distance_weight: [50.0, 150.0, 1.0, 0.1] # weight of epicenter distance. wt = distance_weight[2] for dis < distance_weight[0]. wt = distance_weight[3] for dis > distance_weight[1], and linear weight in between. + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + use_cs_time: true # 'true' for using common source differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. + azimuthal_weight: [15.0, 30.0, 1.0, 0.1] # weight of azimuth between two stations. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time: true # 'true' for using common receiver differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. + azimuthal_weight: [15.0, 30.0, 1.0, 0.1] # weight of azimuth between two earthquakes. + + # -------------- global weight of different types of data (to balance the weight of different data) -------------- + global_weight: + balance_data_weight: true # yes: over the total weight of the each type of the data. the obj of different data means the average data misfit; no: use original weight (below weight for each type of data needs to be set) + abs_time_weight: 1.0 # weight of absolute traveltime data, default: 1.0 + cs_dif_time_local_weight: 1.0 # weight of common source differential traveltime data, default: 1.0 + cr_dif_time_local_weight: 1.0 # weight of common receiver differential traveltime data, default: 1.0 + teleseismic_weight: 1.0 # weight of teleseismic data, default: 1.0 (exclude in this version) + + # -------------- inversion parameters (exclude in this version) -------------- + update_slowness: true # update slowness (velocity) or not. default: true + update_azi_ani: false # update azimuthal anisotropy (xi, eta) or not. default: false + update_rad_ani: false # update radial anisotropy (in future) or not. default: false + + # -------------- for teleseismic inversion (exclude in this version) -------------- + depth_taper: [-200.0, -100.0] # kernel weight : depth. --> 0: -inf ~ taper[0]; 0 ~ 1 : taper[0] ~ taper[1]; 1 : taper[1] ~ inf + +################################################# +# relocation parameters setting # +################################################# +relocation: # update earthquake hypocenter and origin time (when run_mode : 1) + + # relocation_strategy + step_length: 0.01 # step length of relocation perturbation at each iteration. 0.01 means maximum 1% perturbation for each iteration. + step_length_decay: 0.9 # if objective function increase, step size -> step length * step_length_decay. default: 0.9 + rescaling_dep_lat_lon_ortime: [10.0, 10.0, 10.0, 1.0] # The perturbation is related to . Unit: km,km,km,second + max_change_dep_lat_lon_ortime: [5.0, 5.0, 5.0, 0.5] # the change of dep,lat,lon,ortime do not exceed max_change. Unit: km,km,km,second + max_iterations: 100 # maximum number of iterations for relocation + tol_gradient: 0.0001 # threshold value for checking the convergence for each iteration + + # params keeped for current version of relocation but may not be required + ortime_local_search: true # true: do local search for origin time; false: do not do local search for origin time + ref_ortime_change: 0.5 # reference value for origin time change (unit: second). If the change of origin time is larger than ref_ortime_change, do local search for origin time. + step_length_ortime_rescale: 0.1 # step length for rescaling origin time + + + # more option for using different types of data is under development (following) + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time: yes # 'yes' for using absolute traveltime data to update model parameters; 'no' for not using (no need to set parameters in this section) + residual_weight: [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. wt = residual_weight[2] for res < residual_weight[0]. wt = residual_weight[3] for res > residual_weight[1], and linear weight in between. + distance_weight: [50.0, 150.0, 1.0, 0.1] # weight of epicenter distance. wt = distance_weight[2] for dis < distance_weight[0]. wt = distance_weight[3] for dis > distance_weight[1], and linear weight in between. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time: true # 'yes' for using common receiver differential traveltime data to update model parameters; 'no' for not using (no need to set parameters in this section) + residual_weight: [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. + azimuthal_weight: [10.0, 30.0, 1.0, 0.1] # weight of azimuth (deg.) between two earthquakes. + + +#################################################################### +# inversion strategy for tomography and relocation # +#################################################################### +inversion_strategy: # update model parameters and earthquake hypocenter iteratively (when run_mode : 3) + + inv_mode: 0 # 0 for update model parameters and relocation iteratively. (other options for future work) + + # for inv_mode : 0, parameters below are required + inv_mode_0: # Fristly, do relocation; Subsequently, do relocation every N steps; Finally, do relocation + relocation_first: true # true: do relocation first; false: do not relocation first. default: true + relocation_first_iterations: 10 # maximum number of iterations for relocation in the beginning. default: 10 + relocation_every_N_steps: 5 # subsequently, do relocation every N steps of updating model parameters. The iteration of relocation follows in Section + relocation_final: true # true: do relocation finally; false: do not relocation finally. default: true + relocation_final_iterations: 10 # maximum number of iterations for relocation in the beginning. default: 10 + + + +# --- parameters for core solver --------------------------------------------------------- +# --- please do not change the following parameters unless you know what you are doing --- + +######################################################################## +# Scheme of Eikonal solver (fast sweeping method) # +######################################################################## +calculation: + convergence_tolerance: 1e-4 + max_iterations: 200 + stencil_order: 3 # 1 or 3 + sweep_type: 1 # 0: legacy, 1: cuthill-mckee with shm parallelization diff --git a/test/inversion_small/input_params_pre.yml b/test/inversion_small/input_params_pre.yml new file mode 100644 index 0000000..581a869 --- /dev/null +++ b/test/inversion_small/input_params_pre.yml @@ -0,0 +1,57 @@ +version: 3 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-10.0, 10.0] # depth in km + min_max_lat: [37.7, 42.3] # latitude in degree + min_max_lon: [22.7, 27.3] # longitude in degree + n_rtp: [10, 50, 50] # number of nodes + +source: + src_rec_file: src_rec_test.dat # source receiver file (if found, src_dep_lat_lon is ignored) + swap_src_rec: true # swap source and receiver (1: yes, 0: no) + +model: + init_model_path: ./test_model_true.h5 # path to initial model file (ignored if init_model_type is '1d_*') + +parallel: # parameters for parallel computation + n_sims: 1 # number of simultaneous run + ndiv_rtp: [1, 1, 1] # number of subdomains + nproc_sub: 1 # number of subprocess used for each subdomain + +output_setting: + output_dir: ./OUTPUT_FILES/ # path to output director (default is ./OUTPUT_FILES/) + output_source_field: true # output the calculated field of all sources + output_model_dat: false # output model_parameters_inv_0000.dat or not. + output_final_model: true # output merged final model or not. + output_in_process: true # output model at each inv iteration or not. + single_precision_output: false # output results in single precision or not. + verbose_output_level: 0 # output internal parameters, if 0, only model parameters are out. Higher level, more internal parameters are output. default: 0 + output_file_format: 0 # in/output file format, if 0: HDF5, if 1: ASCII + + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion+earthquake relocation +run_mode: 0 + +# --- parameters for core solver --------------------------------------------------------- +# --- please do not change the following parameters unless you know what you are doing --- + +######################################################################## +# Scheme of Eikonal solver (fast sweeping method) # +######################################################################## +calculation: + convergence_tolerance: 1e-4 + max_iterations: 500 + stencil_order: 1 # 1 or 3 + stencil_type : 1 # 0: , 1: first-order upwind scheme (only sweep_type 0 is supported) + sweep_type: 1 # 0: legacy, 1: cuthill-mckee with shm parallelization + diff --git a/test/inversion_small/make_test_model.ipynb b/test/inversion_small/make_test_model.ipynb new file mode 100644 index 0000000..3fc066d --- /dev/null +++ b/test/inversion_small/make_test_model.ipynb @@ -0,0 +1,347 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# notebook for create init and true test model" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "depminmax 10.0 -10.0\n", + "17640\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import math\n", + "\n", + "# grid\n", + "R_earth = 6371.0\n", + "\n", + "rr1=6361 \n", + "rr2=6381\n", + "tt1=(38.0-0.3)/180*math.pi\n", + "tt2=(42.0+0.3)/180*math.pi\n", + "pp1=(23.0-0.3)/180*math.pi\n", + "pp2=(27.0+0.3)/180*math.pi\n", + "\n", + "n_rtp = [10,50,50]\n", + "dr = (rr2-rr1)/(n_rtp[0]-1)\n", + "dt = (tt2-tt1)/(n_rtp[1]-1)\n", + "dp = (pp2-pp1)/(n_rtp[2]-1)\n", + "rr = np.array([rr1 + x*dr for x in range(n_rtp[0])])\n", + "tt = np.array([tt1 + x*dt for x in range(n_rtp[1])])\n", + "pp = np.array([pp1 + x*dp for x in range(n_rtp[2])])\n", + "\n", + "# initial model\n", + "gamma = 0.0\n", + "s0 = 1.0/6.0\n", + "slow_p=0.06\n", + "ani_p=0.04\n", + "\n", + "eta_init = np.zeros(n_rtp)\n", + "xi_init = np.zeros(n_rtp)\n", + "zeta_init = np.zeros(n_rtp)\n", + "fun_init = np.zeros(n_rtp)\n", + "vel_init = np.zeros(n_rtp)\n", + "\n", + "# true model\n", + "eta_true = np.zeros(n_rtp)\n", + "xi_true = np.zeros(n_rtp)\n", + "zeta_true = np.zeros(n_rtp)\n", + "fun_true = np.zeros(n_rtp)\n", + "vel_true = np.zeros(n_rtp)\n", + "\n", + "c=0\n", + "for ir in range(n_rtp[0]):\n", + " for it in range(n_rtp[1]):\n", + " for ip in range(n_rtp[2]):\n", + " # already initialized above\n", + " #eta_init[ir,it,ip] = 0.0\n", + " #xi_init[ir,it,ip] = 0.0\n", + " zeta_init[ir,it,ip] = gamma*math.sqrt(eta_init[ir,it,ip]**2 + xi_init[ir,it,ip]**2)\n", + " fun_init[ir,it,ip] = s0\n", + " vel_init[ir,it,ip] = 1.0/s0\n", + "\n", + " # true model\n", + " if (tt[it] >= 38.0/180.0*math.pi and tt[it] <= 42.0/180.0*math.pi \\\n", + " and pp[ip] >= 23.0/180.0*math.pi and pp[ip] <= 27.0/180.0*math.pi):\n", + " c+=1\n", + " sigma = math.sin(2.0*math.pi*(tt[it]-38.0/180.0*math.pi)/(4.0/180.0*math.pi))*math.sin(2.0*math.pi*(pp[ip]-23.0/180.0*math.pi)/(4.0/180.0*math.pi))\n", + " else:\n", + " sigma = 0.0\n", + "\n", + " if sigma < 0:\n", + " psi = 60.0/180.0*math.pi\n", + " elif sigma > 0:\n", + " psi = 120.0/180.0*math.pi\n", + " else:\n", + " psi = 0.0\n", + "\n", + " eta_true[ir,it,ip] = ani_p*abs(sigma)*math.sin(2.0*psi)\n", + " xi_true[ir,it,ip] = ani_p*abs(sigma)*math.cos(2.0*psi)\n", + " zeta_true[ir,it,ip] = gamma*math.sqrt(eta_true[ir,it,ip]**2 + xi_true[ir,it,ip]**2)\n", + " fun_true[ir,it,ip] = s0/(1.0+sigma*slow_p)\n", + " vel_true[ir,it,ip] = 1.0/fun_true[ir,it,ip] \n", + "\n", + "\n", + "#r_earth = 6378.1370\n", + "print(\"depminmax {} {}\".format(R_earth-rr1,R_earth-rr2))\n", + "print(c)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# write out in hdf5 format\n", + "import h5py\n", + "\n", + "fout_init = h5py.File('test_model_init.h5', 'w')\n", + "fout_true = h5py.File('test_model_true.h5', 'w')\n", + "\n", + "# write out the arrays eta_init, xi_init, zeta_init, fun_init, a_init, b_init, c_init, f_init\n", + "fout_init.create_dataset('eta', data=eta_init)\n", + "fout_init.create_dataset('xi', data=xi_init)\n", + "fout_init.create_dataset('zeta', data=zeta_init)\n", + "fout_init.create_dataset('vel', data=vel_init)\n", + "\n", + "# writeout the arrays eta_true, xi_true, zeta_true, fun_true, a_true, b_true, c_true, f_true\n", + "fout_true.create_dataset('eta', data=eta_true)\n", + "fout_true.create_dataset('xi', data=xi_true)\n", + "fout_true.create_dataset('zeta', data=zeta_true)\n", + "fout_true.create_dataset('vel', data=vel_true)\n", + "\n", + "fout_init.close()\n", + "fout_true.close()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# prepare src station file\n", + "\n", + "The following code creates a src_rec_file for the inversion, which describes the source and receiver positions and arrival times.\n", + "Format is as follows:\n", + "\n", + "```\n", + " 26 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- src  : id_src year month day hour min sec lat lon dep_km mag num_recs id_event\n", + " 26 1 PCBI 1.8900 98.9253 1000.0000 P 10.40 18.000 <- arrival : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arrival_time_sec\n", + " 26 2 MRPI 1.6125 99.3172 1100.0000 P 50.84 19.400\n", + " 26 3 HUTI 2.3153 98.9711 1600.0000 P 57.84 19.200\n", + " ....\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "random.seed(1145141919810)\n", + "\n", + "# dummys\n", + "year_dummy = 1998\n", + "month_dummy = 1\n", + "day_dummy = 1\n", + "hour_dummy = 0\n", + "minute_dummy = 0\n", + "second_dummy = 0\n", + "mag_dummy = 3.0\n", + "id_dummy = 1000\n", + "st_name_dummy = 'AAAA'\n", + "phase_dummy = 'P'\n", + "dist_dummy = 100.0\n", + "arriv_t_dummy = 0.0\n", + "\n", + "tt1deg = tt1 * 180.0/math.pi\n", + "tt2deg = tt2 * 180.0/math.pi\n", + "pp1deg = pp1 * 180.0/math.pi\n", + "pp2deg = pp2 * 180.0/math.pi\n", + "\n", + "\n", + "n_srcs = [20,20,20]\n", + "n_src = n_srcs[0]*n_srcs[1]*n_srcs[2]\n", + "n_rec = [30 for x in range(n_src)]\n", + "\n", + "\n", + "lines = []\n", + "\n", + "nij_src = math.sqrt(n_src)\n", + "nij_rec = math.sqrt(n_rec[0])\n", + "\n", + "pos_src=[]\n", + "pos_rec=[]\n", + "\n", + "\n", + "# create receiver coordinates\n", + "elev_recs=[]\n", + "lon_recs=[]\n", + "lat_recs=[]\n", + "rec_names=[]\n", + "for i in range(n_rec[0]):\n", + " #elev_recs.append(random.uniform(-100.0,-100.0)) # elevation in m\n", + " #elev_recs.append(0) # elevation in m\n", + " #lon_recs .append(random.uniform(pp1deg*1.1,pp2deg*0.9))\n", + " #lat_recs .append(random.uniform(tt1deg*1.1,tt2deg*0.9))\n", + " rec_names.append(i)\n", + " # regularly\n", + " elev_recs.append(0.0)\n", + " tmp_ilon = i%nij_rec\n", + " tmp_ilat = int(i/nij_rec)\n", + " lon_recs.append(pp1deg + tmp_ilon*(pp2deg-pp1deg)/nij_rec)\n", + " lat_recs.append(tt1deg + tmp_ilat*(tt2deg-tt1deg)/nij_rec)\n", + "\n", + "\n", + "\n", + "# create source coordinates\n", + "for ir in range(n_srcs[0]):\n", + " for it in range(n_srcs[1]):\n", + " for ip in range(n_srcs[2]):\n", + " i_src = ir*n_srcs[1]*n_srcs[2] + it*n_srcs[2] + ip\n", + " # define one point in the domain (rr1 bottom, rr2 top)\n", + " # random\n", + " #dep = random.uniform((R_earth-rr1)*0.5,(R_earth-rr1)*0.98)\n", + " #lon = random.uniform(pp1deg,pp2deg)\n", + " #lat = random.uniform(tt1deg,tt2deg)\n", + "\n", + " # regular\n", + " dep = (R_earth-rr1)/n_srcs[0]*ir\n", + " lon = pp1deg + ip*(pp2deg-pp1deg)/n_srcs[2]\n", + " lat = tt1deg + it*(tt2deg-tt1deg)/n_srcs[1]\n", + "\n", + " # put independent name for each source\n", + " id_dummy = \"src_\"+str(i_src)\n", + " \n", + " src = [i_src, year_dummy, month_dummy, day_dummy, hour_dummy, minute_dummy, second_dummy, lat, lon, dep, mag_dummy, n_rec[i_src], id_dummy]\n", + " lines.append(src)\n", + "\n", + " pos_src.append([lon,lat,dep])\n", + "\n", + "\n", + " # create dummy station\n", + " for i_rec in range(n_rec[i_src]):\n", + " elev_rec = elev_recs[i_rec]\n", + " lon_rec = lon_recs[i_rec]\n", + " lat_rec = lat_recs[i_rec]\n", + " st_name_dummy = \"rec_\"+str(rec_names[i_rec])\n", + "\n", + " rec = [i_src, i_rec, st_name_dummy, lat_rec, lon_rec, elev_rec, phase_dummy, dist_dummy, arriv_t_dummy]\n", + " lines.append(rec)\n", + " \n", + " pos_rec.append([lon_rec,lat_rec,elev_rec])\n", + "\n", + "\n", + "# write out ev_arrivals file\n", + "fname = 'src_rec_test.dat'\n", + "\n", + "with open(fname, 'w') as f:\n", + " for line in lines:\n", + " for elem in line:\n", + " f.write('{} '.format(elem))\n", + " f.write('\\n')\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# draw src and rec positions\n", + "import matplotlib.pyplot as plt\n", + "\n", + "for i_src in range(n_src):\n", + " plt.scatter(pos_src[i_src][1],pos_src[i_src][0],c='r',marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# plot receivers\n", + "for i_rec in range(n_rec[0]):\n", + " plt.scatter(pos_rec[i_rec][1],pos_rec[i_rec][0],c='b',marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8 (main, Dec 18 2022, 17:23:16) [GCC 12.2.0]" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "c8112a80bcc57e66f52aa6c921b20667122cfa5e8b1ad09e9dfbd3a3ba336bd6" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/inversion_small/make_test_model.py b/test/inversion_small/make_test_model.py new file mode 100644 index 0000000..710e0d1 --- /dev/null +++ b/test/inversion_small/make_test_model.py @@ -0,0 +1,240 @@ +# %% [markdown] +# # notebook for create init and true test model + +# %% +import numpy as np +import math + +# grid +R_earth = 6371.0 + +rr1=6361 +rr2=6381 +tt1=(38.0-0.3)/180*math.pi +tt2=(42.0+0.3)/180*math.pi +pp1=(23.0-0.3)/180*math.pi +pp2=(27.0+0.3)/180*math.pi + +n_rtp = [10,50,50] +dr = (rr2-rr1)/(n_rtp[0]-1) +dt = (tt2-tt1)/(n_rtp[1]-1) +dp = (pp2-pp1)/(n_rtp[2]-1) +rr = np.array([rr1 + x*dr for x in range(n_rtp[0])]) +tt = np.array([tt1 + x*dt for x in range(n_rtp[1])]) +pp = np.array([pp1 + x*dp for x in range(n_rtp[2])]) + +# initial model +gamma = 0.0 +s0 = 1.0/6.0 +slow_p=0.06 +ani_p=0.04 + +eta_init = np.zeros(n_rtp) +xi_init = np.zeros(n_rtp) +zeta_init = np.zeros(n_rtp) +fun_init = np.zeros(n_rtp) +vel_init = np.zeros(n_rtp) + +# true model +eta_true = np.zeros(n_rtp) +xi_true = np.zeros(n_rtp) +zeta_true = np.zeros(n_rtp) +fun_true = np.zeros(n_rtp) +vel_true = np.zeros(n_rtp) + +c=0 +for ir in range(n_rtp[0]): + for it in range(n_rtp[1]): + for ip in range(n_rtp[2]): + # already initialized above + #eta_init[ir,it,ip] = 0.0 + #xi_init[ir,it,ip] = 0.0 + zeta_init[ir,it,ip] = gamma*math.sqrt(eta_init[ir,it,ip]**2 + xi_init[ir,it,ip]**2) + fun_init[ir,it,ip] = s0 + vel_init[ir,it,ip] = 1.0/s0 + + # true model + if (tt[it] >= 38.0/180.0*math.pi and tt[it] <= 42.0/180.0*math.pi \ + and pp[ip] >= 23.0/180.0*math.pi and pp[ip] <= 27.0/180.0*math.pi): + c+=1 + sigma = math.sin(2.0*math.pi*(tt[it]-38.0/180.0*math.pi)/(4.0/180.0*math.pi))*math.sin(2.0*math.pi*(pp[ip]-23.0/180.0*math.pi)/(4.0/180.0*math.pi)) + else: + sigma = 0.0 + + if sigma < 0: + psi = 60.0/180.0*math.pi + elif sigma > 0: + psi = 120.0/180.0*math.pi + else: + psi = 0.0 + + eta_true[ir,it,ip] = ani_p*abs(sigma)*math.sin(2.0*psi) + xi_true[ir,it,ip] = ani_p*abs(sigma)*math.cos(2.0*psi) + zeta_true[ir,it,ip] = gamma*math.sqrt(eta_true[ir,it,ip]**2 + xi_true[ir,it,ip]**2) + fun_true[ir,it,ip] = s0/(1.0+sigma*slow_p) + vel_true[ir,it,ip] = 1.0/fun_true[ir,it,ip] + + +#r_earth = 6378.1370 +print("depminmax {} {}".format(R_earth-rr1,R_earth-rr2)) +print(c) + + +# %% +# write out in hdf5 format +import h5py + +fout_init = h5py.File('test_model_init.h5', 'w') +fout_true = h5py.File('test_model_true.h5', 'w') + +# write out the arrays eta_init, xi_init, zeta_init, fun_init, a_init, b_init, c_init, f_init +fout_init.create_dataset('eta', data=eta_init) +fout_init.create_dataset('xi', data=xi_init) +fout_init.create_dataset('zeta', data=zeta_init) +fout_init.create_dataset('vel', data=vel_init) + +# writeout the arrays eta_true, xi_true, zeta_true, fun_true, a_true, b_true, c_true, f_true +fout_true.create_dataset('eta', data=eta_true) +fout_true.create_dataset('xi', data=xi_true) +fout_true.create_dataset('zeta', data=zeta_true) +fout_true.create_dataset('vel', data=vel_true) + +fout_init.close() +fout_true.close() + + +# %% [markdown] +# # prepare src station file +# +# The following code creates a src_rec_file for the inversion, which describes the source and receiver positions and arrival times. +# Format is as follows: +# +# ``` +# 26 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- src  : id_src year month day hour min sec lat lon dep_km mag num_recs id_event +# 26 1 PCBI 1.8900 98.9253 1000.0000 P 10.40 18.000 <- arrival : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arrival_time_sec +# 26 2 MRPI 1.6125 99.3172 1100.0000 P 50.84 19.400 +# 26 3 HUTI 2.3153 98.9711 1600.0000 P 57.84 19.200 +# .... +# +# ``` + +# %% +import random +random.seed(1145141919810) + +# dummys +year_dummy = 1998 +month_dummy = 1 +day_dummy = 1 +hour_dummy = 0 +minute_dummy = 0 +second_dummy = 0 +mag_dummy = 3.0 +id_dummy = 1000 +st_name_dummy = 'AAAA' +phase_dummy = 'P' +arriv_t_dummy = 0.0 +weight_dummy = 0.444 + +tt1deg = tt1 * 180.0/math.pi +tt2deg = tt2 * 180.0/math.pi +pp1deg = pp1 * 180.0/math.pi +pp2deg = pp2 * 180.0/math.pi + + +n_srcs = [10,20,20] +#n_srcs = [2,1,1] +n_src = n_srcs[0]*n_srcs[1]*n_srcs[2] +n_rec = [30 for x in range(n_src)] + +lines = [] + +nij_rec = math.sqrt(n_rec[0]) + +pos_src=[] +pos_rec=[] + + +# create receiver coordinates +elev_recs=[] +lon_recs=[] +lat_recs=[] +rec_names=[] +for i in range(n_rec[0]): + #elev_recs.append(random.uniform(-100.0,-100.0)) # elevation in m + #elev_recs.append(0) # elevation in m + #lon_recs .append(random.uniform(pp1deg*1.1,pp2deg*0.9)) + #lat_recs .append(random.uniform(tt1deg*1.1,tt2deg*0.9)) + rec_names.append(i) + # regularly + elev_recs.append(0.0) + tmp_ilon = i%nij_rec + tmp_ilat = int(i/nij_rec) + lon_recs.append(pp1deg + tmp_ilon*(pp2deg-pp1deg)/nij_rec) + lat_recs.append(tt1deg + tmp_ilat*(tt2deg-tt1deg)/nij_rec) + + + +# create source coordinates +for ir in range(n_srcs[0]): + for it in range(n_srcs[1]): + for ip in range(n_srcs[2]): + i_src = ir*n_srcs[1]*n_srcs[2] + it*n_srcs[2] + ip + # define one point in the domain (rr1 bottom, rr2 top) + # random + #dep = random.uniform((R_earth-rr1)*0.5,(R_earth-rr1)*0.98) + #lon = random.uniform(pp1deg,pp2deg) + #lat = random.uniform(tt1deg,tt2deg) + + # regular + dep = (R_earth-rr1)/n_srcs[0]*ir + lon = pp1deg + ip*(pp2deg-pp1deg)/n_srcs[2] + lat = tt1deg + it*(tt2deg-tt1deg)/n_srcs[1] + + # put independent name for each source + id_dummy = "src_"+str(i_src) + + src = [i_src, year_dummy, month_dummy, day_dummy, hour_dummy, minute_dummy, second_dummy, lat, lon, dep, mag_dummy, n_rec[i_src], id_dummy, weight_dummy] + lines.append(src) + + pos_src.append([lon,lat,dep]) + + + # create dummy station + for i_rec in range(n_rec[i_src]): + elev_rec = elev_recs[i_rec] + lon_rec = lon_recs[i_rec] + lat_rec = lat_recs[i_rec] + st_name_dummy = "rec_"+str(rec_names[i_rec]) + + rec = [i_src, i_rec, st_name_dummy, lat_rec, lon_rec, elev_rec, phase_dummy, arriv_t_dummy, weight_dummy] + lines.append(rec) + + pos_rec.append([lon_rec,lat_rec,elev_rec]) + + +# write out ev_arrivals file +fname = 'src_rec_test.dat' + +with open(fname, 'w') as f: + for line in lines: + for elem in line: + f.write('{} '.format(elem)) + f.write('\n') + + +# # %% +# # draw src and rec positions +# import matplotlib.pyplot as plt + +# for i_src in range(n_src): +# plt.scatter(pos_src[i_src][1],pos_src[i_src][0],c='r',marker='o') + +# # %% +# # plot receivers +# for i_rec in range(n_rec[0]): +# plt.scatter(pos_rec[i_rec][1],pos_rec[i_rec][0],c='b',marker='o') + + + + diff --git a/test/inversion_small/run_this_example.sh b/test/inversion_small/run_this_example.sh new file mode 100755 index 0000000..5366e6e --- /dev/null +++ b/test/inversion_small/run_this_example.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +python make_test_model.py + +# get number of sweep parallel processes from input variable (default 1) +nproc_sweep=${1:-1} +# get number of processes for domain decomposition +nproc_dd=${2:-1} +# calculate the total number of processes +nproc_total=$((nproc_sweep*nproc_dd*nproc_dd*nproc_dd)) + +# echo the number of processes +echo "Number of sweep parallel processes: $nproc_sweep" +echo "Number of processes for domain decomposition: $nproc_dd" +echo "Total number of processes: $nproc_total" + +# modify the input_params_pre.yml file +# nproc_sub: (integer) # number of processors for sweep parallelization (parallel the fast sweep method) +pta setpar input_params_pre.yml parallel.nproc_sub ${nproc_sweep} +# ndiv_rtp: [1, 1, 1] # number of subdivision on each direction (parallel the computional domain) +pta setpar input_params_pre.yml parallel.ndiv_rtp ${nproc_dd},${nproc_dd},${nproc_dd} + +# nproc_sub: (integer) # number of processors for sweep parallelization (parallel the fast sweep method) +pta setpar input_params.yml parallel.nproc_sub ${nproc_sweep} +# ndiv_rtp: [1, 1, 1] # number of subdivision on each direction (parallel the computional domain) +pta setpar input_params.yml parallel.ndiv_rtp ${nproc_dd},${nproc_dd},${nproc_dd} + +# run for preparing true travel times +mpirun --oversubscribe -n $nproc_total ../../build/bin/TOMOATT -i input_params_pre.yml + +# run for inversion +mpirun --oversubscribe -n $nproc_total ../../build/bin/TOMOATT -i input_params.yml +#mpirun -n 8 ../../build/bin/TOMOATT -i input_params_flexible_inv_grid.yml + +# then final model can be plot by e.g. check_3d_out.ipynb +#paraview OUTPUT_FILES/out_data_sim.xmf diff --git a/test/old_tests/.DS_Store b/test/old_tests/.DS_Store new file mode 100644 index 0000000..151dcef Binary files /dev/null and b/test/old_tests/.DS_Store differ diff --git a/test/old_tests/heterogeneous_inv_test/input_params.yml b/test/old_tests/heterogeneous_inv_test/input_params.yml new file mode 100644 index 0000000..6947204 --- /dev/null +++ b/test/old_tests/heterogeneous_inv_test/input_params.yml @@ -0,0 +1,50 @@ +version : 2 + +domain : + min_max_dep : [-10.0, 10.0] # depth in km + min_max_lat : [37.7,42.3] # latitude in degree + min_max_lon : [22.7,27.3] # longitude in degree + n_rtp : [10,50,50] # number of nodes + +source : + src_rec_file : 'OUTPUT_FILES/src_rec_file_forward.dat' # source receiver file (if found, src_dep_lat_lon is ignored) + swap_src_rec : 1 # swap source and receiver (1: yes, 0: no) + +model : + init_model_path : './test_model_init.h5' # path to initial model file (ignored if init_model_type is '1d_*') + +inversion : + run_mode : 1 # 0 for forward simulation only, 1 for inversion + optim_method : 2 # optimization method. 0 : "grad_descent", 1 : "halve-stepping", 2 : "lbfgs", + max_iterations_inv : 20 # maximum number of inversion iterations + step_size : 0.01 # step size for inversion + + # parameters for multiparametric inversion + n_inversion_grid : 5 # number of inversion grid sets + n_inv_dep_lat_lon : [5,20,20] # number of the base inversion grid points + min_max_dep_inv : [-10.0, 10.0] # depth in km with R = 6371.0 + min_max_lat_inv : [37.7,43.3] # latitude in degree + min_max_lon_inv : [22.7,28.3] # longitude in degree + + # parameter for halving-stepping or lbfgs + max_sub_iterations : 10 # maximum number of sub-iterations + #regularization_weight : 0.0 # regularization weight + smooth_method: 0 + #l_smooth_rtp : [20,20,20] # + +parallel : + n_sims : 1 # number of simultaneous run + ndiv_rtp : [1,2,2] # number of subdomains + nproc_sub : 2 # number of subprocess used for each subdomain + +calculation : + convergence_tolerance : 1e-4 + max_iterations : 200 + stencil_order : 3 # 1 or 3 + sweep_type : 1 # 0: legacy, 1: cuthill-mckee with shm parallelization + +output_setting : + is_output_source_field : 0 # output the calculated field of all sources 1 for yes; 0 for no; default: 1 + is_verbose_output : 0 # output internal parameters, if no, only model parameters are out. 1 for yes; 0 for no; default: 0 + is_output_model_dat : 0 # output model_parameters_inv_0000.dat or not. 1 for yes; 0 for no; default: 1 + is_output_in_process : 1 # output the model parameters in each iteration. 1 for yes; 0 for no; default: 1 diff --git a/test/old_tests/heterogeneous_inv_test/input_params_pre.yml b/test/old_tests/heterogeneous_inv_test/input_params_pre.yml new file mode 100644 index 0000000..d460c93 --- /dev/null +++ b/test/old_tests/heterogeneous_inv_test/input_params_pre.yml @@ -0,0 +1,34 @@ +version : 2 + +domain : + min_max_dep : [-10.0, 10.0] # depth in km + min_max_lat : [37.7,42.3] # latitude in degree + min_max_lon : [22.7,27.3] # longitude in degree + n_rtp : [10,50,50] # number of nodes + +source : + src_rec_file : 'src_rec_test.dat' # source receiver file (if found, src_dep_lat_lon is ignored) + swap_src_rec : 1 # swap source and receiver (1: yes, 0: no) + +model : + init_model_path : './test_model_true.h5' # path to initial model file (ignored if init_model_type is '1d_*') + +inversion : + run_mode : 0 # 0 for forward simulation only, 1 for inversion + n_inversion_grid : 1 + +parallel : + n_sims : 1 # number of simultaneous run + ndiv_rtp : [1,2,2] # number of subdomains + nproc_sub : 2 # number of subprocess used for each subdomain + +calculation : + convergence_tolerance : 1e-4 + max_iterations : 500 + stencil_order : 3 # 1 or 3 + sweep_type : 1 # 0: legacy, 1: cuthill-mckee with shm parallelization + +output_setting : + is_output_source_field : 0 # output the calculated field of all sources 1 for yes; 0 for no; default: 1 + is_verbose_output : 0 # output internal parameters, if no, only model parameters are out. 1 for yes; 0 for no; default: 0 + is_output_model_dat : 0 # output model_parameters_inv_0000.dat or not. 1 for yes; 0 for no; default: 1 diff --git a/test/old_tests/heterogeneous_inv_test/make_test_model.ipynb b/test/old_tests/heterogeneous_inv_test/make_test_model.ipynb new file mode 100644 index 0000000..b849024 --- /dev/null +++ b/test/old_tests/heterogeneous_inv_test/make_test_model.ipynb @@ -0,0 +1,441 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# notebook for create init and true test model" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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YGdnh127dmHhwoWws7ODt7c3z7kJubq6ol27dkhNTTX59zcLThOQy+WIiIjAtm3bjPfp9Xps27YNUVFRIiazfiEhIfDx8al37rVaLRISEnju75AgCJg+fTo2bdqE7du3IyQkpN7jERERsLe3r3fOz5w5g4yMDJ7zJqLX61FVVcVzbQKDBw/G8ePHceTIEeOtR48eGDt2rPH/85ybTmlpKc6fPw9fX1/Tf3/f9TBlEgRBENavXy8oFAph9erVwsmTJ4UpU6YIrq6uglqtFjuaxSspKREOHz4sHD58WAAgLFiwQDh8+LBw8eJFQRAE4eOPPxZcXV2F3377TTh27JgwYsQIISQkRKioqBA5uWWaOnWqoFKphJ07dwq5ubnGW3l5ufGYF154QQgMDBS2b98uHDp0SIiKihKioqJETG25Zs+eLezatUtIS0sTjh07JsyePVuQSCTC1q1bBUHguW4O186iEgSe86Y0a9YsYefOnUJaWpqwb98+ITo6WvDw8BDy8/MFQTDtuWbBaUJff/21EBgYKMjlcqFXr17CgQMHxI5kFXbs2CEAuO72zDPPCIJgmCr+9ttvC97e3oJCoRAGDx4snDlzRtzQFuxG5xqAsGrVKuMxFRUVwosvvii4ubkJjo6OwiOPPCLk5uaKF9qCPfvss0JQUJAgl8sFT09PYfDgwcZyIwg8183h/xccnvOmM3r0aMHX11eQy+VCq1athNGjRwupqanGx015riWCIAh3fx2IiIiIyHxwDA4RERFZHRYcIiIisjosOERERGR1WHCIiIjI6rDgEBERkdVhwSEiIiKrw4JDREREVocFh4iIiKwOCw4RERFZHRYcIiIisjosOERERGR1WHCIiIjI6vwf+rnrG2B8EHIAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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QUNDA37961/jqquuwv79+/3+WTPBIaJzeuCBB7B///5+e+bkezk5Odi9ezcsFgveffdd3HXXXdi0aZPcYQWlmpoa/PznP8e6desQHh4udzhB74YbbvD+/xMnTkRhYSGGDRuGt99+GxEREX59bW5R+UBCQgK0Wu1Zld+NjY1ISUmRKarQIH2+/Ox9b9GiRVizZg0+//xzpKene7+ekpICu92O1tbWfvfnZ37p9Ho9Ro4ciYKCAixfvhx5eXn405/+xM/aD8rLy9HU1ITJkydDp9NBp9Nh06ZNeP7556HT6ZCcnMzP3I9MJhNGjx6NY8eO+f2/byY4PqDX61FQUID169d7v+ZyubB+/XoUFRXJGFnwGz58OFJSUvp99larFaWlpfzsL5Eoili0aBFWr16NDRs2YPjw4f2+X1BQgLCwsH6f+eHDh1FdXc3P3EdcLhdsNhs/az+4/vrrsW/fPuzevdt7mzJlCubOnev9//mZ+097ezuOHz+O1NRU///3fdllyiSKoiiuWrVKNBgM4sqVK8WDBw+KCxcuFE0mk2g2m+UOTfXa2trEXbt2ibt27RIBiM8995y4a9cu8eTJk6IoiuLTTz8tmkwm8YMPPhD37t0r3nrrreLw4cPFrq4umSNXp/vuu080Go3ixo0bxYaGBu+ts7PTe597771XzMzMFDds2CDu2LFDLCoqEouKimSMWr0ee+wxcdOmTWJlZaW4d+9e8bHHHhMFQRA//fRTURT5WQdC31NUosjP3JceeughcePGjWJlZaX41VdficXFxWJCQoLY1NQkiqJ/P2smOD70wgsviJmZmaJerxenTZsmbtu2Te6QgsLnn38uAjjrdtddd4mi6D4q/sQTT4jJycmiwWAQr7/+evHw4cPyBq1iA33WAMS///3v3vt0dXWJ999/vxgXFydGRkaK3/72t8WGhgb5glaxH/3oR+KwYcNEvV4vJiYmitdff703uRFFftaB8PUEh5+579xxxx1iamqqqNfrxaFDh4p33HGHeOzYMe/3/flZC6Ioipe/DkRERESkHKzBISIioqDDBIeIiIiCDhMcIiIiCjpMcIiIiCjoMMEhIiKioMMEh4iIiIIOExwiIiIKOkxwiIiIKOgwwSEiIqKgwwSHiIiIgg4THCIiIgo6THCIiIgo6Px/oczYqPli5s0AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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QUNDA37961/jqquuwv79+/3+WTPBIaJzeuCBB7B///5+e+bkezk5Odi9ezcsFgveffdd3HXXXdi0aZPcYQWlmpoa/PznP8e6desQHh4udzhB74YbbvD+/xMnTkRhYSGGDRuGt99+GxEREX59bW5R+UBCQgK0Wu1Zld+NjY1ISUmRKarQIH2+/Ox9b9GiRVizZg0+//xzpKene7+ekpICu92O1tbWfvfnZ37p9Ho9Ro4ciYKCAixfvhx5eXn405/+xM/aD8rLy9HU1ITJkydDp9NBp9Nh06ZNeP7556HT6ZCcnMzP3I9MJhNGjx6NY8eO+f2/byY4PqDX61FQUID169d7v+ZyubB+/XoUFRXJGFnwGz58OFJSUvp99larFaWlpfzsL5Eoili0aBFWr16NDRs2YPjw4f2+X1BQgLCwsH6f+eHDh1FdXc3P3EdcLhdsNhs/az+4/vrrsW/fPuzevdt7mzJlCubOnev9//mZ+097ezuOHz+O1NRU///3fdllyiSKoiiuWrVKNBgM4sqVK8WDBw+KCxcuFE0mk2g2m+UOTfXa2trEXbt2ibt27RIBiM8995y4a9cu8eTJk6IoiuLTTz8tmkwm8YMPPhD37t0r3nrrreLw4cPFrq4umSNXp/vuu080Go3ixo0bxYaGBu+ts7PTe597771XzMzMFDds2CDu2LFDLCoqEouKimSMWr0ee+wxcdOmTWJlZaW4d+9e8bHHHhMFQRA//fRTURT5WQdC31NUosjP3JceeughcePGjWJlZaX41VdficXFxWJCQoLY1NQkiqJ/P2smOD70wgsviJmZmaJerxenTZsmbtu2Te6QgsLnn38uAjjrdtddd4mi6D4q/sQTT4jJycmiwWAQr7/+evHw4cPyBq1iA33WAMS///3v3vt0dXWJ999/vxgXFydGRkaK3/72t8WGhgb5glaxH/3oR+KwYcNEvV4vJiYmitdff703uRFFftaB8PUEh5+579xxxx1iamqqqNfrxaFDh4p33HGHeOzYMe/3/flZC6Ioipe/DkRERESkHKzBISIioqDDBIeIiIiCDhMcIiIiCjpMcIiIiCjoMMEhIiKioMMEh4iIiIIOExwiIiIKOkxwiIiIKOgwwSEiIqKgwwSHiIiIgg4THCIiIgo6THCIiIgo6Px/oczYqPli5s0AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "depminmax 10.0 -10.0\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import math\n", + "\n", + "# grid\n", + "R_earth = 6371.0\n", + "\n", + "rr1=6361 \n", + "rr2=6381\n", + "tt1=(38.0-0.3)/180*math.pi\n", + "tt2=(42.0+0.3)/180*math.pi\n", + "pp1=(23.0-0.3)/180*math.pi\n", + "pp2=(27.0+0.3)/180*math.pi\n", + "\n", + "n_rtp = [50,50,50]\n", + "dr = (rr2-rr1)/(n_rtp[0]-1)\n", + "dt = (tt2-tt1)/(n_rtp[1]-1)\n", + "dp = (pp2-pp1)/(n_rtp[2]-1)\n", + "rr = np.array([rr1 + x*dr for x in range(n_rtp[0])])\n", + "tt = np.array([tt1 + x*dt for x in range(n_rtp[1])])\n", + "pp = np.array([pp1 + x*dp for x in range(n_rtp[2])])\n", + "\n", + "# initial model\n", + "gamma = 0.0\n", + "s0 = 1.0/6.0\n", + "slow_p=0.06\n", + "ani_p=0.04\n", + "n_sign_rtp = [1,2,2] # number of sign wave in each direction\n", + "\n", + "eta_init = np.zeros(n_rtp)\n", + "xi_init = np.zeros(n_rtp)\n", + "zeta_init = np.zeros(n_rtp)\n", + "fun_init = np.zeros(n_rtp)\n", + "vel_init = np.zeros(n_rtp)\n", + "\n", + "# true model\n", + "eta_true = np.zeros(n_rtp)\n", + "xi_true = np.zeros(n_rtp)\n", + "zeta_true = np.zeros(n_rtp)\n", + "fun_true = np.zeros(n_rtp)\n", + "vel_true = np.zeros(n_rtp)\n", + "\n", + "\n", + "def make_1d_sign_wave(n_sign_rtp, rr, tt, pp):\n", + " \"\"\"\n", + " make 1d sign wave for each direction following n_sign_rtp\n", + " n_sign_rtp: frequency of sign wave in each direction\n", + " \"\"\"\n", + "\n", + " n_r = rr.shape[0]\n", + " n_t = tt.shape[0]\n", + " n_p = pp.shape[0]\n", + "\n", + " r_1d = np.zeros(n_r)\n", + " t_1d = np.zeros(n_t)\n", + " p_1d = np.zeros(n_p)\n", + "\n", + " for ir in range(n_r):\n", + " r_1d[ir] = math.sin(2.*n_sign_rtp[0]*math.pi*ir/(n_r-1))\n", + "\n", + " for it in range(n_t):\n", + " t_1d[it] = math.sin(2.*n_sign_rtp[1]*math.pi*it/(n_t-1))\n", + "\n", + " for ip in range(n_p):\n", + " p_1d[ip] = math.sin(2.*n_sign_rtp[2]*math.pi*ip/(n_p-1))\n", + " \n", + " \n", + "\n", + " # plot 1d sign wave\n", + " import matplotlib.pyplot as plt\n", + " plt.figure()\n", + " plt.plot(r_1d)\n", + " plt.figure()\n", + " plt.plot(t_1d)\n", + " plt.figure()\n", + " plt.plot(p_1d)\n", + " plt.show()\n", + "\n", + " return r_1d, t_1d, p_1d\n", + "\n", + "# make 1d sign wave for each direction following n_sign_rtp\n", + "r_1d, t_1d, p_1d = make_1d_sign_wave(n_sign_rtp, rr, tt, pp)\n", + "\n", + "for ir in range(n_rtp[0]):\n", + " for it in range(n_rtp[1]):\n", + " for ip in range(n_rtp[2]):\n", + " # already initialized above\n", + " #eta_init[ir,it,ip] = 0.0\n", + " #xi_init[ir,it,ip] = 0.0\n", + " zeta_init[ir,it,ip] = gamma*math.sqrt(eta_init[ir,it,ip]**2 + xi_init[ir,it,ip]**2)\n", + " fun_init[ir,it,ip] = s0\n", + " vel_init[ir,it,ip] = 1.0/s0\n", + "\n", + " # true model\n", + " sigma = r_1d[ir]*t_1d[it]*p_1d[ip] \n", + "\n", + " if sigma < 0:\n", + " psi = 60.0/180.0*math.pi\n", + " elif sigma > 0:\n", + " psi = 120.0/180.0*math.pi\n", + " else:\n", + " psi = 0.0\n", + "\n", + " eta_true[ir,it,ip] = ani_p*abs(sigma)*math.sin(2.0*psi)\n", + " xi_true[ir,it,ip] = ani_p*abs(sigma)*math.cos(2.0*psi)\n", + " zeta_true[ir,it,ip] = gamma*math.sqrt(eta_true[ir,it,ip]**2 + xi_true[ir,it,ip]**2)\n", + " fun_true[ir,it,ip] = s0/(1.0+sigma*slow_p)\n", + " vel_true[ir,it,ip] = 1.0/fun_true[ir,it,ip] \n", + "\n", + "\n", + "#r_earth = 6378.1370\n", + "print(\"depminmax {} {}\".format(R_earth-rr1,R_earth-rr2))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# write out in hdf5 format\n", + "import h5py\n", + "\n", + "fout_init = h5py.File('test_model_init.h5', 'w')\n", + "fout_true = h5py.File('test_model_true.h5', 'w')\n", + "\n", + "# write out the arrays eta_init, xi_init, zeta_init, fun_init, a_init, b_init, c_init, f_init\n", + "fout_init.create_dataset('eta', data=eta_init)\n", + "fout_init.create_dataset('xi', data=xi_init)\n", + "fout_init.create_dataset('zeta', data=zeta_init)\n", + "fout_init.create_dataset('vel', data=vel_init)\n", + "\n", + "# writeout the arrays eta_true, xi_true, zeta_true, fun_true, a_true, b_true, c_true, f_true\n", + "fout_true.create_dataset('eta', data=eta_true)\n", + "fout_true.create_dataset('xi', data=xi_true)\n", + "fout_true.create_dataset('zeta', data=zeta_true)\n", + "fout_true.create_dataset('vel', data=vel_true)\n", + "\n", + "fout_init.close()\n", + "fout_true.close()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# prepare src station file\n", + "\n", + "The following code creates a src_rec_file for the inversion, which describes the source and receiver positions and arrival times.\n", + "Format is as follows:\n", + "\n", + "```\n", + " 26 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- src  : id_src year month day hour min sec lat lon dep_km mag num_recs id_event\n", + " 26 1 PCBI 1.8900 98.9253 1000.0000 P 10.40 18.000 <- arrival : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arrival_time_sec\n", + " 26 2 MRPI 1.6125 99.3172 1100.0000 P 50.84 19.400\n", + " 26 3 HUTI 2.3153 98.9711 1600.0000 P 57.84 19.200\n", + " ....\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "random.seed(1145141919810)\n", + "\n", + "# dummys\n", + "year_dummy = 1998\n", + "month_dummy = 1\n", + "day_dummy = 1\n", + "hour_dummy = 0\n", + "minute_dummy = 0\n", + "second_dummy = 0\n", + "mag_dummy = 3.0\n", + "id_dummy = 1000\n", + "st_name_dummy = 'AAAA'\n", + "phase_dummy = 'P'\n", + "dist_dummy = 100.0\n", + "arriv_t_dummy = 0.0\n", + "\n", + "tt1deg = tt1 * 180.0/math.pi\n", + "tt2deg = tt2 * 180.0/math.pi\n", + "pp1deg = pp1 * 180.0/math.pi\n", + "pp2deg = pp2 * 180.0/math.pi\n", + "\n", + "\n", + "n_srcs = [10,20,20]\n", + "n_src = n_srcs[0]*n_srcs[1]*n_srcs[2]\n", + "n_recs = [10,10]\n", + "n_rec = n_recs[0]*n_recs[1]\n", + "\n", + "lines = []\n", + "\n", + "pos_src=[]\n", + "pos_rec=[]\n", + "\n", + "\n", + "# create receiver coordinates\n", + "elev_recs=[]\n", + "lon_recs=[]\n", + "lat_recs=[]\n", + "rec_names=[]\n", + "n_rec_2 = 0\n", + "for i in range(n_recs[0]):\n", + " for j in range(n_recs[1]):\n", + "\n", + " if (i >= n_recs[0]/4 or j >= n_recs[1]/4) and (j % 4 != 0 or i % 4 != 0):\n", + " continue\n", + "\n", + " n_rec_2 += 1\n", + "\n", + " id_rec = i*n_recs[1]+j\n", + " #elev_recs.append(random.uniform(-100.0,-100.0)) # elevation in m\n", + " #elev_recs.append(0) # elevation in m\n", + " #lon_recs .append(random.uniform(pp1deg*1.1,pp2deg*0.9))\n", + " #lat_recs .append(random.uniform(tt1deg*1.1,tt2deg*0.9))\n", + " rec_names.append(id_rec)\n", + " # regularly\n", + " elev_recs.append(0.0)\n", + " lon_recs.append(pp1deg + i*(pp2deg-pp1deg)/n_recs[0])\n", + " lat_recs.append(tt1deg + j*(tt2deg-tt1deg)/n_recs[1])\n", + "\n", + "\n", + "\n", + "# create source coordinates\n", + "c=0\n", + "for ir in range(n_srcs[0]):\n", + " for it in range(n_srcs[1]):\n", + " for ip in range(n_srcs[2]):\n", + "\n", + " # make the number of sources one-fourth if the position is right hand side\n", + " if (ip >= n_srcs[2]/4 or it >=n_srcs[1]/4) and (ip%4 != 0 or it%4 != 0):\n", + " continue\n", + " \n", + " if ir == 0:\n", + " c+=1\n", + "\n", + " i_src = ir*n_srcs[1]*n_srcs[2] + it*n_srcs[2] + ip\n", + " # define one point in the domain (rr1 bottom, rr2 top)\n", + " # random\n", + " #dep = random.uniform((R_earth-rr1)*0.5,(R_earth-rr1)*0.98)\n", + " #lon = random.uniform(pp1deg,pp2deg)\n", + " #lat = random.uniform(tt1deg,tt2deg)\n", + "\n", + " # regular\n", + " dep = (R_earth-rr1)/n_srcs[0]*ir\n", + " lon = pp1deg + ip*(pp2deg-pp1deg)/n_srcs[2]\n", + " lat = tt1deg + it*(tt2deg-tt1deg)/n_srcs[1]\n", + "\n", + " \n", + " src = [i_src, year_dummy, month_dummy, day_dummy, hour_dummy, minute_dummy, second_dummy, lat, lon, dep, mag_dummy, n_rec_2, id_dummy]\n", + " lines.append(src)\n", + "\n", + " pos_src.append([lon,lat,dep])\n", + "\n", + "\n", + " # create dummy station\n", + " for i_rec in range(n_rec_2):\n", + " \n", + " elev_rec = elev_recs[i_rec]\n", + " lon_rec = lon_recs[i_rec]\n", + " lat_rec = lat_recs[i_rec]\n", + " st_name_dummy = rec_names[i_rec]\n", + " \n", + " rec = [i_src, i_rec, st_name_dummy, lat_rec, lon_rec, elev_rec, phase_dummy, dist_dummy, arriv_t_dummy]\n", + " lines.append(rec)\n", + " \n", + " pos_rec.append([lon_rec,lat_rec,elev_rec])\n", + "\n", + "\n", + "# write out ev_arrivals file\n", + "fname = 'src_rec_test.dat'\n", + "\n", + "with open(fname, 'w') as f:\n", + " for line in lines:\n", + " for elem in line:\n", + " f.write('{} '.format(elem))\n", + " f.write('\\n')\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjQAAAGdCAYAAAAFcOm4AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAzXElEQVR4nO3de3RUZZr+/asIEgIkoWnIyQoQQUEbwVZjBpHIzzAB2lEO2h7XKI4DyiQq4gmcVjz06thM94jYNvb0LEM7NqACEYZpYMIpBgVUhImMEkmIA2gCiE0VBIiQPO8feVNSoQKpZCc7T/L9rLWX1K5dz7Nv7lXWRe1DeYwxRgAAABbr5PYOAAAANBeBBgAAWI9AAwAArEegAQAA1iPQAAAA6xFoAACA9Qg0AADAegQaAABgvc5u74ATampq9M033yg6Oloej8ft3QEAAI1gjNHRo0eVlJSkTp2a9x1Luwg033zzjZKTk93eDQAA0AT79u2T1+tt1hhhBZqcnBwtW7ZMu3btUlRUlK699lr9+te/1qBBg4K227x5s/75n/9ZW7duVUREhK644gqtWbNGUVFRIcd97rnn9PzzzwetGzRokHbt2tWo/YqOjpZU+xcSExMTTkkAAMAlfr9fycnJgc/x5ggr0BQUFCgrK0upqak6ffq0nn76aWVmZurzzz9X9+7dJdWGmbFjx2rWrFl69dVX1blzZ/3P//zPeb9K+slPfqK1a9f+sGOdG79rdYeZYmJiCDQAAFjGidNFwgo0q1evDnq8YMECxcXFadu2bUpPT5ckPfroo3r44Yc1c+bMwHb1v8EJuSOdOyshISGc3QEAAJDUzKucfD6fJKlXr16SpIMHD2rr1q2Ki4vTtddeq/j4eF1//fXatGnTecfavXu3kpKSdNFFF+nuu+/W3r17m7NrAACgA2lyoKmpqdH06dM1YsQIDRkyRJK0Z88eSbXnxEyZMkWrV6/WlVdeqYyMDO3evbvBsdLS0rRgwQKtXr1a8+fPV1lZmUaOHKmjR4+G3L6qqkp+vz9oAQAAHVeTA01WVpZ27typxYsXB9bV1NRIkh544AHdd999+ulPf6qXX35ZgwYN0htvvNHgWOPGjdPPf/5zDR06VGPGjNFf/vIXHTlyRO+8807I7XNychQbGxtYuMIJAICOrUmBJjs7WytXrtSGDRuCLrNKTEyUJF122WVB21966aVhHULq2bOnLrnkEpWUlIR8ftasWfL5fIFl3759TagCAAC0F2EFGmOMsrOzlZeXp/Xr1yslJSXo+f79+yspKUnFxcVB67/88kv169ev0fMcO3ZMpaWlgYBUX2RkZOCKJq5sAgAAYQWarKwsvfXWW1q4cKGio6NVUVGhiooKnThxQlLtZVdPPPGE5s2bpyVLlqikpETPPPOMdu3apfvvvz8wTkZGhn73u98FHj/++OMqKCjQV199pQ8//FATJ05URESE7rzzTofKBAAA7VlYl23Pnz9fkjRq1Kig9bm5uZo8ebIkafr06Tp58qQeffRRfffddxo2bJjy8/M1YMCAwPalpaX69ttvA4/379+vO++8U4cPH1afPn103XXXacuWLerTp08TywIAAB2Jxxhj3N6J5vL7/YqNjZXP53P28FN1tVRYKJWXS4mJ0siRUkSEc+Oj5dFDu9E/+9FD+7VgD538/G4Xv+XUIpYtkx55RNq//4d1Xq/0yivSpEnu7Rcajx7ajf7Zjx7az6Ie8g1NKMuWSbfeKtX/q6m7NfOSJW2ukaiHHtqN/tmPHtqvFXro5Oc3gaa+6mqpf//gNHomj6c2nZaV8bVpW0UP7Ub/7EcP7ddKPXTy87tZP33QLhUWNtxAqTap7ttXux3aJnpoN/pnP3poPwt7SKCpr7zc2e3Q+uih3eif/eih/SzsIYGmvgZu5tfk7dD66KHd6J/96KH9LOwh59DUV3fc8Ouvzz4RSuLYrw3ood3on/3oof1aqYecQ9OSIiJqL0eTfjiTu07d47lzeRO2ZfTQbvTPfvTQfhb2kEATyqRJtZejXXhh8Hqvl0sNbUEP7Ub/7EcP7WdZDznkdC7c4dJ+9NBu9M9+9NB+ltwpmEADAABcwTk0AAAAZyDQAAAA6xFoAACA9Qg0AADAegQaAABgPQINAACwHoEGAABYj0ADAACsR6ABAADWI9AAAADrEWgAAID1CDQAAMB6BBoAAGA9Ag0AALAegQYAAFiPQAMAAKxHoAEAANYj0AAAAOsRaAAAgPUINAAAwHoEGgAAYD0CDQAAsB6BBgAAWI9AAwAArBdWoMnJyVFqaqqio6MVFxenCRMmqLi4+KztNm/erBtuuEHdu3dXTEyM0tPTdeLEiXOO/dprr6l///7q2rWr0tLS9NFHH4VXCQAA6LDCCjQFBQXKysrSli1blJ+fr1OnTikzM1OVlZWBbTZv3qyxY8cqMzNTH330kT7++GNlZ2erU6eGp3r77bc1Y8YMzZ49W59++qmGDRumMWPG6ODBg02vDAAAdBgeY4xp6osPHTqkuLg4FRQUKD09XZL0N3/zN/rbv/1bvfjii40eJy0tTampqfrd734nSaqpqVFycrIeeughzZw587yv9/v9io2Nlc/nU0xMTNOKAQAArcrJz+9mnUPj8/kkSb169ZIkHTx4UFu3blVcXJyuvfZaxcfH6/rrr9emTZsaHOP777/Xtm3bNHr06B92qlMnjR49Wps3bw75mqqqKvn9/qAFAAB0XE0ONDU1NZo+fbpGjBihIUOGSJL27NkjSXruuec0ZcoUrV69WldeeaUyMjK0e/fukON8++23qq6uVnx8fND6+Ph4VVRUhHxNTk6OYmNjA0tycnJTywAAAO1AkwNNVlaWdu7cqcWLFwfW1dTUSJIeeOAB3XffffrpT3+ql19+WYMGDdIbb7zR/L39/82aNUs+ny+w7Nu3z7GxAQCAfTo35UXZ2dlauXKl3n//fXm93sD6xMRESdJll10WtP2ll16qvXv3hhyrd+/eioiI0IEDB4LWHzhwQAkJCSFfExkZqcjIyKbsOgAAaIfC+obGGKPs7Gzl5eVp/fr1SklJCXq+f//+SkpKOutS7i+//FL9+vULOWaXLl101VVXad26dYF1NTU1WrdunYYPHx7O7gEAgA4qrG9osrKytHDhQi1fvlzR0dGBc1xiY2MVFRUlj8ejJ554QrNnz9awYcN0xRVX6E9/+pN27dqlJUuWBMbJyMjQxIkTlZ2dLUmaMWOG7r33Xl199dW65pprNHfuXFVWVuq+++5zsFQAANBehRVo5s+fL0kaNWpU0Prc3FxNnjxZkjR9+nSdPHlSjz76qL777jsNGzZM+fn5GjBgQGD70tJSffvtt4HHt99+uw4dOqRnn31WFRUVuuKKK7R69eqzThQGAAAIpVn3oWkruA8NAAD2aTP3oQEAAGgLCDQAAMB6BBoAAGA9Ag0AALAegQYAAFiPQAMAAKxHoAEAANYj0AAAAOsRaAAAgPUINAAAwHoEGgAAYD0CDQAAsB6BBgAAWI9AAwAArEegAQAA1iPQAAAA6xFoAACA9Qg0AADAegQaAABgPQINAACwHoEGAABYj0ADAACsR6ABAADWI9AAAADrEWgAAID1CDQAAMB6BBoAAGA9Ag0AALAegQYAAFiPQAMAAKxHoAEAANYj0AAAAOsRaAAAgPUINAAAwHoEGgAAYL2wAk1OTo5SU1MVHR2tuLg4TZgwQcXFxUHbjBo1Sh6PJ2h58MEHzznu5MmTz3rN2LFjw68GAAB0SJ3D2bigoEBZWVlKTU3V6dOn9fTTTyszM1Off/65unfvHthuypQpeuGFFwKPu3Xrdt6xx44dq9zc3MDjyMjIcHYNAAB0YGEFmtWrVwc9XrBggeLi4rRt2zalp6cH1nfr1k0JCQlh7UhkZGTYr2lx1dVSYaFUXi4lJkojR0oREW7vFcJBD+1G/+xHD+1nSQ+bdQ6Nz+eTJPXq1Sto/Z///Gf17t1bQ4YM0axZs3T8+PHzjrVx40bFxcVp0KBBmjZtmg4fPtzgtlVVVfL7/UGL45Ytk/r3l/7f/5Puuqv2v/37166HHeih3eif/eih/WzqoWmi6upqc+ONN5oRI0YErf/DH/5gVq9ebYqKisxbb71lLrzwQjNx4sRzjrVo0SKzfPlyU1RUZPLy8syll15qUlNTzenTp0NuP3v2bCPprMXn8zW1nGBLlxrj8RgjBS8eT+2ydKkz86Dl0EO70T/70UP7tUIPfT6fY5/fHmOMaUoQmjZtmlatWqVNmzbJ6/U2uN369euVkZGhkpISDRgwoFFj79mzRwMGDNDatWuVkZFx1vNVVVWqqqoKPPb7/UpOTpbP51NMTEz4xZypuro2fe7fH/p5j0fyeqWysjb5lRtED21H/+xHD+3XSj30+/2KjY115PO7SYecsrOztXLlSm3YsOGcYUaS0tLSJEklJSWNHv+iiy5S7969G3xNZGSkYmJighbHFBY23ECpNp/u21e7Hdomemg3+mc/emg/C3sY1knBxhg99NBDysvL08aNG5WSknLe1+zYsUOSlJiY2Oh59u/fr8OHD4f1GseUlzu7HVofPbQb/bMfPbSfhT0M6xuarKwsvfXWW1q4cKGio6NVUVGhiooKnThxQpJUWlqqF198Udu2bdNXX32lFStW6J577lF6erqGDh0aGGfw4MHKy8uTJB07dkxPPPGEtmzZoq+++krr1q3T+PHjNXDgQI0ZM8bBUhupsSHKjbCFxqGHdqN/9qOH9rOxh+GccKMQJ+JKMrm5ucYYY/bu3WvS09NNr169TGRkpBk4cKB54oknzjrZ58zXHD9+3GRmZpo+ffqYCy64wPTr189MmTLFVFRUNHq/nDypyJw+bYzXG/pEqLqToZKTa7dD20QP7Ub/7EcP7ddKPXTy8zvsQ07nkpycrIKCgrDGiYqK0po1a8LZjZYVESG98op06621Jz2dWbPHU/vfuXM5ka0to4d2o3/2o4f2s7CH/JZTKJMmSUuWSBdeGLze661dP2mSO/uFxqOHdqN/9qOH9rOsh02+bLstcfKyryCW3B0R50AP7Ub/7EcP7deCPXTy85tAAwAAXOH6fWgAAADaEgINAACwHoEGAABYj0ADAACsR6ABAADWI9AAAADrEWgAAID1CDQAAMB6BBoAAGA9Ag0AALAegQYAAFiPQAMAAKxHoAEAANYj0AAAAOsRaAAAgPUINAAAwHoEGgAAYD0CDQAAsB6BBgAAWI9AAwAArEegAQAA1iPQAAAA6xFoAACA9Qg0AADAegQaAABgPQINAACwHoEGAABYj0ADAACsR6ABAADWI9AAAADrEWgAAID1wgo0OTk5Sk1NVXR0tOLi4jRhwgQVFxcHbTNq1Ch5PJ6g5cEHHzznuMYYPfvss0pMTFRUVJRGjx6t3bt3h18NAADokMIKNAUFBcrKytKWLVuUn5+vU6dOKTMzU5WVlUHbTZkyReXl5YFlzpw55xx3zpw5mjdvnl5//XVt3bpV3bt315gxY3Ty5MnwKwIAAB1O53A2Xr16ddDjBQsWKC4uTtu2bVN6enpgfbdu3ZSQkNCoMY0xmjt3rn7xi19o/PjxkqQ333xT8fHxeu+993THHXeEs4sAAKADatY5ND6fT5LUq1evoPV//vOf1bt3bw0ZMkSzZs3S8ePHGxyjrKxMFRUVGj16dGBdbGys0tLStHnz5pCvqaqqkt/vD1oAAEDHFdY3NGeqqanR9OnTNWLECA0ZMiSw/q677lK/fv2UlJSkoqIiPfXUUyouLtayZctCjlNRUSFJio+PD1ofHx8feK6+nJwcPf/8803ddQAA0M40OdBkZWVp586d2rRpU9D6qVOnBv58+eWXKzExURkZGSotLdWAAQOavqdnmDVrlmbMmBF47Pf7lZyc7MjYAADAPk065JSdna2VK1dqw4YN8nq959w2LS1NklRSUhLy+bpzbQ4cOBC0/sCBAw2ehxMZGamYmJigBQAAdFxhBRpjjLKzs5WXl6f169crJSXlvK/ZsWOHJCkxMTHk8ykpKUpISNC6desC6/x+v7Zu3arhw4eHs3sAAKCDCivQZGVl6a233tLChQsVHR2tiooKVVRU6MSJE5Kk0tJSvfjii9q2bZu++uorrVixQvfcc4/S09M1dOjQwDiDBw9WXl6eJMnj8Wj69On65S9/qRUrVuizzz7TPffco6SkJE2YMMG5SgEAQLsV1jk08+fPl1R787wz5ebmavLkyerSpYvWrl2ruXPnqrKyUsnJybrlllv0i1/8Imj74uLiwBVSkvTkk0+qsrJSU6dO1ZEjR3Tddddp9erV6tq1axPLAgAAHYnHGGPc3onm8vv9io2Nlc/n43waAAAs4eTnN7/lBAAArEegAQAA1iPQAAAA6xFoAACA9Qg0AADAegQaAABgPQINAACwHoEGAABYj0ADAACsR6ABAADWI9AAAADrEWgAAID1CDQAAMB6BBoAAGA9Ag0AALAegQYAAFiPQAMAAKxHoAEAANYj0AAAAOsRaAAAgPUINAAAwHoEGgAAYD0CDQAAsB6BBgAAWI9AAwAArEegAQAA1iPQAAAA6xFoAACA9Qg0AADAegQaAABgvc5u70CbVl0tFRZK5eVSYqI0cqQUEeH2XiEc9NBu9M9+9NB+lvSQQNOQZcukRx6R9u//YZ3XK73yijRpknv7hcajh3ajf/ajh/azqIceY4xxeyeay+/3KzY2Vj6fTzExMc0fcNky6dZbpfp/NR5P7X+XLGlzjUQ99NBu9M9+9NB+rdBDJz+/CTT1VVdL/fsHp9EzeTy16bSsrE1+5QbRQ9vRP/vRQ/u1Ug+d/PzmpOD6CgsbbqBUm1T37avdDm0TPbQb/bMfPbSfhT0MK9Dk5OQoNTVV0dHRiouL04QJE1RcXBxyW2OMxo0bJ4/Ho/fee++c406ePFkejydoGTt2bDi75pzycme3Q+ujh3ajf/ajh/azsIdhBZqCggJlZWVpy5Ytys/P16lTp5SZmanKysqztp07d648dcfZGmHs2LEqLy8PLIsWLQpn15yTmOjsdmh99NBu9M9+9NB+FvYwrKucVq9eHfR4wYIFiouL07Zt25Senh5Yv2PHDv32t7/VJ598osRGFhsZGamEhIRwdqdljBxZe1zw66/PPhFK+uG44ciRrb9vaBx6aDf6Zz96aD8Le9isc2h8Pp8kqVevXoF1x48f11133aXXXnstrICyceNGxcXFadCgQZo2bZoOHz7c4LZVVVXy+/1Bi2MiImovR5N+OJO7Tt3juXM5ka0to4d2o3/2o4f2s7GHpomqq6vNjTfeaEaMGBG0furUqeb+++8PPJZk8vLyzjnWokWLzPLly01RUZHJy8szl156qUlNTTWnT58Ouf3s2bONpLMWn8/X1HLOtnSpMV6vMbXZtHZJTq5dDzvQQ7vRP/vRQ/u1cA99Pp9jn99Nvmx72rRpWrVqlTZt2iSv1ytJWrFihR577DFt375dPXr0kCR5PB7l5eVpwoQJjR57z549GjBggNauXauMjIyznq+qqlJVVVXgsd/vV3JysnP3oaljyd0RcQ700G70z3700H4t2EMnL9tu0p2Cs7OztXLlSr3//vuBMCNJ69evV2lpqXr27Bm0/S233KKRI0dq48aNjRr/oosuUu/evVVSUhIy0ERGRioyMrIpux6eiAhp1KiWnwcthx7ajf7Zjx7az5IehhVojDF66KGHlJeXp40bNyolJSXo+ZkzZ+of//Efg9Zdfvnlevnll3XTTTc1ep79+/fr8OHDjT6hGAAAdGxhBZqsrCwtXLhQy5cvV3R0tCoqKiRJsbGxioqKUkJCQsgTgfv27RsUfgYPHqycnBxNnDhRx44d0/PPP69bbrlFCQkJKi0t1ZNPPqmBAwdqzJgxzSwPAAB0BGFd5TR//nz5fD6NGjVKiYmJgeXtt98Oa9Li4uLAFVIREREqKirSzTffrEsuuUT333+/rrrqKhUWFrbOYSUAAGC9sA85hSvUa85cFxUVpTVr1oQ9LgAAQB1+ywkAAFiPQAMAAKxHoAEAANYj0AAAAOsRaAAAgPUINAAAwHoEGgAAYD0CDQAAsB6BBgAAWI9AAwAArEegAQAA1iPQAAAA6xFoAACA9Qg0AADAegQaAABgPQINAACwHoEGAABYj0ADAACsR6ABAADWI9AAAADrEWgAAID1CDQAAMB6BBoAAGA9Ag0AALAegQYAAFiPQAMAAKxHoAEAANYj0AAAAOsRaAAAgPUINAAAwHoEGgAAYD0CDQAAsB6BBgAAWI9AAwAArEegAQAA1gsr0OTk5Cg1NVXR0dGKi4vThAkTVFxcHHJbY4zGjRsnj8ej995775zjGmP07LPPKjExUVFRURo9erR2794dzq4BAIAOLKxAU1BQoKysLG3ZskX5+fk6deqUMjMzVVlZeda2c+fOlcfjadS4c+bM0bx58/T6669r69at6t69u8aMGaOTJ0+Gs3sAAKCD8hhjTFNffOjQIcXFxamgoEDp6emB9Tt27NDf/d3f6ZNPPlFiYqLy8vI0YcKEkGMYY5SUlKTHHntMjz/+uCTJ5/MpPj5eCxYs0B133HHe/fD7/YqNjZXP51NMTExTywEAAK3Iyc/vZp1D4/P5JEm9evUKrDt+/Ljuuusuvfbaa0pISDjvGGVlZaqoqNDo0aMD62JjY5WWlqbNmzeHfE1VVZX8fn/QAgAAOq4mB5qamhpNnz5dI0aM0JAhQwLrH330UV177bUaP358o8apqKiQJMXHxwetj4+PDzxXX05OjmJjYwNLcnJyE6sAAADtQeemvjArK0s7d+7Upk2bAutWrFih9evXa/v27Y7sXENmzZqlGTNmBB77/X5CDQAAHViTvqHJzs7WypUrtWHDBnm93sD69evXq7S0VD179lTnzp3VuXNtXrrllls0atSokGPVHZY6cOBA0PoDBw40eMgqMjJSMTExQQsAAOi4wgo0xhhlZ2crLy9P69evV0pKStDzM2fOVFFRkXbs2BFYJOnll19Wbm5uyDFTUlKUkJCgdevWBdb5/X5t3bpVw4cPD7McAADQEYV1yCkrK0sLFy7U8uXLFR0dHTjHJTY2VlFRUUpISAj5rUrfvn2Dws/gwYOVk5OjiRMnyuPxaPr06frlL3+piy++WCkpKXrmmWeUlJTU4JVRAAAAZwor0MyfP1+Szjp8lJubq8mTJzd6nOLi4sAVUpL05JNPqrKyUlOnTtWRI0d03XXXafXq1eratWs4uwcAADqoZt2Hpq3gPjQAANinzdyHBgAAoC0g0AAAAOsRaAAAgPUINAAAwHoEGgAAYD0CDQAAsB6BBgAAWI9AAwAArEegAQAA1iPQAAAA6xFoAACA9Qg0AADAegQaAABgPQINAACwHoEGAABYj0ADAACsR6ABAADWI9AAAADrEWgAAID1CDQAAMB6BBoAAGA9Ag0AALBeZ7d3oE2rrpYKC6XycikxURo5UoqIYD6b5nSjRjiH/tmPHtrPlh6adsDn8xlJxufzOTfo0qXGeL3GSD8sXm/t+pbQ3udzY043aoRz6J/96KH9WriHTn5+E2hCWbrUGI8nuIFS7TqPx/k3Y3ufz4053agRzqF/9qOH9muFHjr5+e0xxhh3vyNqPr/fr9jYWPl8PsXExDRvsOpqqX9/af/+0M97PJLXK5WVOfOVW3ufz4053agRzqF/9qOH9mulHjr5+c1JwfUVFjbcQKk2n+7bV7sd87XNOd2oEc6hf/ajh/azsIcEmvrKy53drqPP58acbtQI59A/+9FD+1nYQwJNfYmJzm7X0edzY043aoRz6J/96KH9LOwh59DUV3fc8Ouva79Sq6+lzvdor/O5MacbNcI59M9+9NB+rdRDzqFpSRER0iuv1P7Z4wl+ru7x3LnOvQnb+3xuzOlGjXAO/bMfPbSfjT1s9nVSbUCr3YcmObl175nSnuZzY043aoRz6J/96KH9WriHXLZdj6OHnM7U3u9qy52C0dbRP/vRQ/u1YA+d/Pwm0AAAAFe4dg5NTk6OUlNTFR0drbi4OE2YMEHFxcVB2zzwwAMaMGCAoqKi1KdPH40fP167du0657iTJ0+Wx+MJWsaOHRt+NQAAoEMKK9AUFBQoKytLW7ZsUX5+vk6dOqXMzExVVlYGtrnqqquUm5urL774QmvWrJExRpmZmaqurj7n2GPHjlV5eXlgWbRoUdMqAgAAHU6zDjkdOnRIcXFxKigoUHp6eshtioqKNGzYMJWUlGjAgAEht5k8ebKOHDmi9957r0n7wSEnAADs02Yu2/b5fJKkXr16hXy+srJSubm5SklJUXJy8jnH2rhxo+Li4jRo0CBNmzZNhw8fbnDbqqoq+f3+oAUAAHRcTQ40NTU1mj59ukaMGKEhQ4YEPff73/9ePXr0UI8ePbRq1Srl5+erS5cuDY41duxYvfnmm1q3bp1+/etfq6CgQOPGjWvwMFVOTo5iY2MDy/nCEgAAaN+afMhp2rRpWrVqlTZt2iSv1xv0nM/n08GDB1VeXq7f/OY3+vrrr/XBBx+oa9eujRp7z549GjBggNauXauMjIyznq+qqlJVVVXgsd/vV3JyMoecAACwiOuHnLKzs7Vy5Upt2LDhrDAjSbGxsbr44ouVnp6uJUuWaNeuXcrLy2v0+BdddJF69+6tkpKSkM9HRkYqJiYmaAEAAB1X53A2NsbooYceUl5enjZu3KiUlJRGvcYYE/SNyvns379fhw8fVmIb+tErAADQdoX1DU1WVpbeeustLVy4UNHR0aqoqFBFRYVOnDghqfZQUU5OjrZt26a9e/fqww8/1M9//nNFRUXpZz/7WWCcwYMHB76xOXbsmJ544glt2bJFX331ldatW6fx48dr4MCBGjNmjIOlAgCA9iqsb2jmz58vSRo1alTQ+tzcXE2ePFldu3ZVYWGh5s6dq7/+9a+Kj49Xenq6PvzwQ8XFxQW2Ly4uDlwhFRERoaKiIv3pT3/SkSNHlJSUpMzMTL344ouKjIxsZnnN1N5v089PHwAA2otm/xpUG9BqP07p9bbuDym2p/ncmNONGgEAjcaPU9bj+I31li2Tbr219iPwTHU/mb5kiTRpUvPn6SjzuTGnGzUCAMLCj1PW42igqa6W+veX9u8P/bzHI3m9UlmZM4cu2vt8bszpRo0AgLC5ftl2u1ZY2PAHoVT7L/59+2q3Y762OacbNQIAXEWgqa+83NntOvp8bszpRo0AAFcRaOpr7L1vnLpHTnufz4053agRAOAqzqGpr+78i6+/PvuEUqnlzvdor/O5MacbNQIAwsY5NC0pIkJ65ZXaP9ddEVOn7vHcuc59ELb3+dyY040aAQCuItCEMmlS7WW9F14YvN7rbZnLfdv7fG7M6UaNAADXcMjpXNr7XW25UzAAwEXch6aeFgs0AACgxXAODQAAwBkINAAAwHoEGgAAYD0CDQAAsB6BBgAAWI9AAwAArEegAQAA1iPQAAAA6xFoAACA9Tq7vQNtWnu/TT8/fQAAaCcINA1Ztkx65BFp//4f1nm9tb/i3BI/bNje53NjTjdqBAC4gt9yCmXZMunWW6X6fzUeT+1/nf615vY+nxtzulEjACAs/DhlPY4GmupqqX//4H/Vn8njqf1XflmZM4cu2vt8bszpRo0AgLDx45QtqbCw4Q9CqfZf/Pv21W7HfG1zTjdqBAC4ikBTX3m5s9t19PncmNONGgEAriLQ1JeY6Ox2HX0+N+Z0o0YAgKs4h6a+uvMvvv767BNKpZY736O9zufGnG7UCAAIG+fQtKSIiNrLeqUfroipU/d47lznPgjb+3xuzOlGjQAAVxFoQpk0qfay3gsvDF7v9bbM5b7tfT435nSjRgCAazjkdC7t/a623CkYAOAi7kNTT4sFGgAA0GI4hwYAAOAMBBoAAGA9Ag0AALAegQYAAFgvrECTk5Oj1NRURUdHKy4uThMmTFBxcXHQNg888IAGDBigqKgo9enTR+PHj9euXbvOOa4xRs8++6wSExMVFRWl0aNHa/fu3eFXAwAAOqSwAk1BQYGysrK0ZcsW5efn69SpU8rMzFRlZWVgm6uuukq5ubn64osvtGbNGhljlJmZqerq6gbHnTNnjubNm6fXX39dW7duVffu3TVmzBidPHmy6ZUBAIAOo1mXbR86dEhxcXEqKChQenp6yG2Kioo0bNgwlZSUaMCAAWc9b4xRUlKSHnvsMT3++OOSJJ/Pp/j4eC1YsEB33HHHefeDy7YBALBPm7ls2+fzSZJ69eoV8vnKykrl5uYqJSVFycnJIbcpKytTRUWFRo8eHVgXGxurtLQ0bd68OeRrqqqq5Pf7gxYAANBxNTnQ1NTUaPr06RoxYoSGDBkS9Nzvf/979ejRQz169NCqVauUn5+vLl26hBynoqJCkhQfHx+0Pj4+PvBcfTk5OYqNjQ0sDYUlAADQMTQ50GRlZWnnzp1avHjxWc/dfffd2r59uwoKCnTJJZfotttuc/R8mFmzZsnn8wWWffv2OTZ2kOpqaeNGadGi2v+e4zwg5mujc7pRIwCg9ZkmyMrKMl6v1+zZs+e821ZVVZlu3bqZhQsXhny+tLTUSDLbt28PWp+enm4efvjhRu2Pz+czkozP52vU9o2ydKkxXq8x0g+L11u7viW09/ncmNONGgEAjebk53dY39AYY5Sdna28vDytX79eKSkpjXqNMUZVVVUhn09JSVFCQoLWrVsXWOf3+7V161YNHz48nN1zzrJl0q23Svv3B6//+uva9cuWMV9bn9ONGgEA7gkn/UybNs3ExsaajRs3mvLy8sBy/PhxY0ztty2/+tWvzCeffGL+7//+z3zwwQfmpptuMr169TIHDhwIjDNo0CCzbNmywOOXXnrJ9OzZ0yxfvtwUFRWZ8ePHm5SUFHPixIlG7Zej39CcPn32v+rPXDweY5KTa7dzQnufz4053agRABA2176hmT9/vnw+n0aNGqXExMTA8vbbb0uSunbtqsLCQv3sZz/TwIEDdfvttys6Oloffvih4uLiAuMUFxcHrpCSpCeffFIPPfSQpk6dqtTUVB07dkyrV69W165dHQltYSksPPtf9WcyRtq3r3Y75mubc7pRIwDAVZ3D2dic55Y1SUlJ+stf/hL2OB6PRy+88IJeeOGFcHanZZSXO7tdR5/PjTndqBEA4Cp+y6m+xERnt+vo87kxpxs1AgBc1aw7BbcVjt4puLpa6t+/9uTRUH81Ho/k9UplZVJERPPm6gjzuTGnGzUCAMLWZu4U3C5FREivvFL7Z48n+Lm6x3PnOvdB2N7nc2NON2oEALiKQBPKpEnSkiXShRcGr/d6a9dPmsR8bX1ON2oEALiGQ07nUl1deyVMeXnt+RYjR7bsv+rb+3xuzOlGjQCARnHy85tAAwAAXME5NAAAAGcg0AAAAOsRaAAAgPUINAAAwHoEGgAAYD0CDQAAsB6BBgAAWI9AAwAArEegAQAA1uvs9g60ae39Nv389AHaOvpnP3poP1t6aNoBn89nJBmfz+fcoEuXGuP1GiP9sHi9tetbQnufz4053agRzqF/9qOH9mvhHjr5+U2gCWXpUmM8nuAGSrXrPB7n34ztfT435nSjRjiH/tmPHtqvFXro5Oc3P05ZX3W11L+/tH9/6Oc9HsnrlcrKnPnKrb3P58acbtQI59A/+9FD+7VSD/lxypZUWNhwA6XafLpvX+12zNc253SjRjiH/tmPHtrPwh4SaOorL3d2u44+nxtzulEjnEP/7EcP7WdhDwk09SUmOrtdR5/PjTndqBHOoX/2o4f2s7CHnENTX91xw6+/rv1Krb6WOt+jvc7nxpxu1Ajn0D/70UP7tVIPOYemJUVESK+8Uvtnjyf4ubrHc+c69yZs7/O5MacbNcI59M9+9NB+Nvaw2ddJtQGtdh+a5OTWvWdKe5rPjTndqBHOoX/2o4f2a+Eectl2PY4ecjpTe7+rLXcKRltH/+xHD+3Xgj108vObQAMAAFzBOTQAAABnINAAAADrEWgAAID1CDQAAMB6BBoAAGA9Ag0AALAegQYAAFiPQAMAAKxHoAEAANbr7PYOOKHuZsd+v9/lPQEAAI1V97ntxI8WtItAc/ToUUlScnKyy3sCAADCdfToUcXGxjZrjHbxW041NTX65ptvFB0dLU/9nzlvh/x+v5KTk7Vv374O89tV1NwxapY6Zt3UTM3t2bnqNsbo6NGjSkpKUqdOzTsLpl18Q9OpUyd5vV63d6PVxcTEdKg3hUTNHUlHrJuaO4aOWLPUcN3N/WamDicFAwAA6xFoAACA9Qg0FoqMjNTs2bMVGRnp9q60GmruODpi3dTcMXTEmqXWq7tdnBQMAAA6Nr6hAQAA1iPQAAAA6xFoAACA9Qg0AADAegQaF82fP19Dhw4N3Gxo+PDhWrVqVeD5iooK/f3f/70SEhLUvXt3XXnllVq6dOl5x33ttdfUv39/de3aVWlpafroo49asoywtUTdzz33nDweT9AyePDgli6l0c5Xc2lpqSZOnKg+ffooJiZGt912mw4cOHDecdtyr1ui5rbe5/peeukleTweTZ8+PbDu5MmTysrK0o9//GP16NFDt9xyy3nrNsbo2WefVWJioqKiojR69Gjt3r27hfe+aZyqefLkyWf1euzYsS28900Xqu5/+7d/06hRoxQTEyOPx6MjR440aqy2/L4+k1M1O/W+JtC4yOv16qWXXtK2bdv0ySef6IYbbtD48eP1v//7v5Kke+65R8XFxVqxYoU+++wzTZo0Sbfddpu2b9/e4Jhvv/22ZsyYodmzZ+vTTz/VsGHDNGbMGB08eLC1yjqvlqhbkn7yk5+ovLw8sGzatKk1ymmUc9VcWVmpzMxMeTwerV+/Xh988IG+//573XTTTaqpqWlwzLbe65aoWWrbfT7Txx9/rD/84Q8aOnRo0PpHH31U//mf/6l3331XBQUF+uabbzRp0qRzjjVnzhzNmzdPr7/+urZu3aru3btrzJgxOnnyZEuWEDYna5aksWPHBvV60aJFLbXrzdJQ3cePH9fYsWP19NNPN3qstv6+ruNkzZJD72uDNuVHP/qR+fd//3djjDHdu3c3b775ZtDzvXr1Mn/84x8bfP0111xjsrKyAo+rq6tNUlKSycnJaZkddkhz6549e7YZNmxYS+6i4+pqXrNmjenUqZPx+XyB544cOWI8Ho/Jz89v8PU29rq5NdvS56NHj5qLL77Y5Ofnm+uvv9488sgjxpjaGi+44ALz7rvvBrb94osvjCSzefPmkGPV1NSYhIQE8y//8i+BdUeOHDGRkZFm0aJFLVpHOJys2Rhj7r33XjN+/PgW3uvma6juM23YsMFIMn/961/PO54N72una3bqfc03NG1EdXW1Fi9erMrKSg0fPlySdO211+rtt9/Wd999p5qaGi1evFgnT57UqFGjQo7x/fffa9u2bRo9enRgXadOnTR69Ght3ry5NcoImxN119m9e7eSkpJ00UUX6e6779bevXtboYLw1a+5qqpKHo8n6KZTXbt2VadOnRr8V4ptvXai5jo29DkrK0s33nhjUH8kadu2bTp16lTQ+sGDB6tv374N9q2srEwVFRVBr4mNjVVaWlqb6rWTNdfZuHGj4uLiNGjQIE2bNk2HDx9ukX1vjobqbgpb3tdO1lzHifd1u/hxSpt99tlnGj58uE6ePKkePXooLy9Pl112mSTpnXfe0e23364f//jH6ty5s7p166a8vDwNHDgw5FjffvutqqurFR8fH7Q+Pj5eu3btavFawuFk3ZKUlpamBQsWaNCgQSovL9fzzz+vkSNHaufOnYqOjm6tss6poZr79Omj7t2766mnntKvfvUrGWM0c+ZMVVdXq7y8PORYtvTayZolO/q8ePFiffrpp/r444/Peq6iokJdunRRz549g9bHx8eroqIi5Hh160P1uqHXtDana5ZqDzdNmjRJKSkpKi0t1dNPP61x48Zp8+bNioiIcLqEJjlX3U1hw/va6Zol597XBBqXDRo0SDt27JDP59OSJUt07733qqCgQJdddpmeeeYZHTlyRGvXrlXv3r313nvv6bbbblNhYaEuv/xyt3e9WZyue9y4cYE/Dx06VGlpaerXr5/eeecd3X///a1V1jmdq+Z3331X06ZN07x589SpUyfdeeeduvLKK9Wpk91fojpdc1vv8759+/TII48oPz9fXbt2dXt3WkVL1XzHHXcE/nz55Zdr6NChGjBggDZu3KiMjAzH5mkqeu1czY69r5t90AqOysjIMFOnTjUlJSVGktm5c+dZzz/wwAMhX1tVVWUiIiJMXl5e0Pp77rnH3HzzzS21y45oTt0Nufrqq83MmTOd3E1H1dV8pkOHDgWOOcfHx5s5c+aEfK2tvW5OzQ1pS33Oy8szkkxERERgkWQ8Ho+JiIgwa9euDXleQd++fc2//uu/hhyztLTUSDLbt28PWp+enm4efvjhFqqk8Vqi5ob07t3bvP766w7ufdOdr+7Tp08Htm3s+SRt/X3dEjU3pCnva7v/+dcO1dTUqKqqSsePH5eks/61GhER0eBVIF26dNFVV12ldevWBY23bt26wPkpbVVz6g7l2LFjKi0tVWJioqP76aS6ms/Uu3dv9ezZU+vXr9fBgwd18803h3ytrb1uTs2htLU+Z2Rk6LPPPtOOHTsCy9VXX62777478OcLLrggqG/FxcXau3dvg31LSUlRQkJC0Gv8fr+2bt3aJnrdEjWHsn//fh0+fNiaXjflsFhbf1+3RM2hNPl93aToBEfMnDnTFBQUmLKyMlNUVGRmzpxpPB6P+e///m/z/fffm4EDB5qRI0earVu3mpKSEvOb3/zGeDwe81//9V+BMW644Qbz6quvBh4vXrzYREZGmgULFpjPP//cTJ061fTs2dNUVFS4UWJILVH3Y489ZjZu3GjKysrMBx98YEaPHm169+5tDh486EaJZzlXzcYY88Ybb5jNmzebkpIS8x//8R+mV69eZsaMGUFj2Nbrlqi5rfc5lPpXgTz44IOmb9++Zv369eaTTz4xw4cPN8OHDw96zaBBg8yyZcsCj1966SXTs2dPs3z5clNUVGTGjx9vUlJSzIkTJ1qrjLA0t+ajR4+axx9/3GzevNmUlZWZtWvXmiuvvNJcfPHF5uTJk61ZSljq111eXm62b99u/vjHPxpJ5v333zfbt283hw8fDmxj2/u6Pidqdup9TaBx0T/8wz+Yfv36mS5dupg+ffqYjIyMwP/sjTHmyy+/NJMmTTJxcXGmW7duZujQoWddztyvXz8ze/bsoHWvvvqq6du3r+nSpYu55pprzJYtW1qjnEZribpvv/12k5iYaLp06WIuvPBCc/vtt5uSkpLWKum8zlfzU089ZeLj480FF1xgLr74YvPb3/7W1NTUBI1hW69boua23udQ6v8P/8SJE+af/umfzI9+9CPTrVs3M3HiRFNeXh70GkkmNzc38LimpsY888wzJj4+3kRGRpqMjAxTXFzcShWEr7k1Hz9+3GRmZpo+ffqYCy64wPTr189MmTKlzX6o16lf9+zZs42ks5Yze2vb+7o+J2p26n3tMcYYR74jAgAAcAnn0AAAAOsRaAAAgPUINAAAwHoEGgAAYD0CDQAAsB6BBgAAWI9AAwAArEegAQAA1iPQAAAA6xFoAACA9Qg0AADAegQaAABgvf8P04yFjksl7T4AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# draw src and rec positions\n", + "import matplotlib.pyplot as plt\n", + "\n", + "n_src_2d = c#n_srcs[0]*n_srcs[1]*n_srcs[2]\n", + "\n", + "for i_src in range(n_src_2d):\n", + " plt.scatter(pos_src[i_src][1],pos_src[i_src][0],c='r',marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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1iPQAAAA6xFoAACA9Qg0AADAegQaAABgPQINAACwHoEGAABYj0ADAACsR6ABAADWI9AAAADrBRVoCgsLNXr0aMXHx8vlcmnKlCmqrq4O6DNhwgQ5HI6A7b777jvjuMYYPfnkk0pOTlZcXJxycnK0c+fO4KsBAABRKahAU15eLrfbrc2bN6u0tFQnTpxQbm6u6uvrA/rdc889qqur828LFy4847gLFy7U4sWL9corr6iyslK9e/fWxIkTdfz48eArAgAAUad7MJ3XrFkT8Hrp0qVyuVyqqqpSVlaWv71Xr15KSko6pzGNMVq0aJEef/xxTZ48WZL02muvKTExUe+8845uvfXWYKYIAACiUIfuofF6vZKkfv36BbT/6U9/Uv/+/TV8+HDNnz9fR48ebXOM3bt3y+PxKCcnx9/mdDqVmZmpioqKVo9paGiQz+cL2AAAQPQK6hOaUzU1NamgoEDjxo3T8OHD/e233367Bg4cqJSUFG3btk2PPvqoqqurVVxc3Oo4Ho9HkpSYmBjQnpiY6N/XUmFhoZ5++un2Th0AAESYdgcat9ut7du3a9OmTQHts2bN8v/58ssvV3JysrKzs1VbW6uMjIz2z/QU8+fP19y5c/2vfT6f0tLSQjI2AACwT7suOeXn52vVqlVav369UlNTz9g3MzNTklRTU9Pq/pP32uzfvz+gff/+/W3ehxMbG6uEhISADQAARK+gAo0xRvn5+SopKVFZWZnS09PPeszWrVslScnJya3uT09PV1JSktatW+dv8/l8qqys1JgxY4KZHgAAiFJBBRq3263XX39dy5YtU3x8vDwejzwej44dOyZJqq2t1TPPPKOqqip99dVXWrlypWbMmKGsrCyNGDHCP86wYcNUUlIiSXI4HCooKNCzzz6rlStX6rPPPtOMGTOUkpKiKVOmhK5SAAAQsYK6h2bJkiWSmr8871RFRUWaOXOmevToobVr12rRokWqr69XWlqapk+frscffzygf3V1tf8JKUl65JFHVF9fr1mzZunw4cO65pprtGbNGvXs2bOdZQEAgGjiMMaYcE+io3w+n5xOp7xeL/fTAABgiVC+f/O7nAAAgPUINAAAwHoEGgAAYD0CDQAAsB6BBgAAWI9AAwAArEegAQAA1iPQAAAA6xFoAACA9Qg0AADAegQaAABgPQINAACwHoEGAABYj0ADAACs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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot receivers\n", + "for i_rec in range(n_rec_2):\n", + " plt.scatter(pos_rec[i_rec][1],pos_rec[i_rec][0],c='b',marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "17" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n_rec_2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "c8112a80bcc57e66f52aa6c921b20667122cfa5e8b1ad09e9dfbd3a3ba336bd6" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion/README.md b/test/old_tests/inversion/README.md new file mode 100644 index 0000000..2028979 --- /dev/null +++ b/test/old_tests/inversion/README.md @@ -0,0 +1,14 @@ +# Inversion test + +This is a test setup for inversion calculation. + +1. Run all cells of `make_test_model.ipynb` for creating + - source, receiver file + - true model + - initial model + +2. then run TOMOATT forward with `input_params_pre.yml` for calculating the true arrival times at the stations +-> this will output src_rec_result.dat file which includes the arrival time at each station + +3. run TOMOATT in inversion mode with `input_params.yml`. + \ No newline at end of file diff --git a/test/old_tests/inversion/check_obj_func.ipynb b/test/old_tests/inversion/check_obj_func.ipynb new file mode 100644 index 0000000..4c85914 --- /dev/null +++ b/test/old_tests/inversion/check_obj_func.ipynb @@ -0,0 +1,66 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# check the change of objective values\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "fpath='objective_function.txt'\n", + "\n", + "objs=[]\n", + "\n", + "with open(fpath) as f:\n", + " lines = f.readlines()\n", + "\n", + " for l in lines:\n", + " if(l.startswith('i_inv')):\n", + " continue\n", + " objs.append(float(l.strip().split(',')[1]))\n", + "\n", + "\n", + "plt.xlabel('iteration')\n", + "plt.ylabel('objective function value')\n", + "plt.plot(objs)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "vscode": { + "interpreter": { + "hash": "fbd0b2a7df497f398d93ab2f589d8a5daa3108cfb7ff2b90736653cca3aeadc0" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion/check_src_rec_file.ipynb b/test/old_tests/inversion/check_src_rec_file.ipynb new file mode 100644 index 0000000..42ca8e0 --- /dev/null +++ b/test/old_tests/inversion/check_src_rec_file.ipynb @@ -0,0 +1,185 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# read src_rec file and check its arrival time and distance from src to rec\n", + "import numpy as np\n", + "\n", + "def read_src_rec_file(fpath):\n", + "\n", + " with open(fpath, \"r\") as f:\n", + " lines = f.readlines()\n", + "\n", + " # list to store src lon lat\n", + " src_pos = []\n", + " # list to store rec lon lat\n", + " rec_pos_tmp=[]\n", + " rec_pos = []\n", + "\n", + " for line in lines:\n", + " # src line if there are 13 elements\n", + " if len(line.split()) == 13:\n", + " # store source lon lat dep\n", + " stlon = float(line.split()[8])\n", + " stlat = float(line.split()[7])\n", + " src_pos.append([stlon, stlat])\n", + "\n", + " nrec = float(line.split()[11])\n", + " # rec line if there are 9 elements\n", + " elif len(line.split()) == 9:\n", + " # store receiver lon lat dep\n", + " rclon = float(line.split()[4])\n", + " rclat = float(line.split()[3])\n", + " rctime= float(line.split()[8])\n", + " # calc epicentral distance from src\n", + " dist = np.sqrt((stlon-rclon)**2 + (stlat-rclat)**2)\n", + " rec_pos_tmp.append([rclon, rclat, rctime, dist])\n", + "\n", + " nrec-=1\n", + " else:\n", + " raise ValueError(\"src_rec_test_out.dat file is not correct\")\n", + "\n", + " if nrec==0:\n", + " rec_pos.append(rec_pos_tmp)\n", + " # remove all rec_pos_tmp\n", + " rec_pos_tmp = []\n", + "\n", + "\n", + "\n", + " src_pos = np.array(src_pos)\n", + " rec_pos = np.array(rec_pos)\n", + "\n", + " return src_pos, rec_pos" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "src_pos_true, rec_pos_true = read_src_rec_file(\"./src_rec_test_out.dat\")\n", + "src_pos_try, rec_pos_try = read_src_rec_file(\"./src_rec_test_out_out.dat\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot rec_pos for each src_pos with color by 3rd element\n", + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "def plot_srcrec(src_pos, rec_pos):\n", + "\n", + " # selected source\n", + " id_src = 1\n", + " \n", + " fig, axs = plt.subplots(2,1,figsize=(10,10))\n", + " \n", + " # plot arrival time\n", + " # src\n", + " axs[0].scatter(src_pos[id_src,0], src_pos[id_src,1], c='r', marker='o', s=100)\n", + " # rec\n", + " axs[0].scatter(rec_pos[id_src][:,0], rec_pos[id_src][:,1], c=rec_pos[id_src][:,2], s=10, marker='o')\n", + " \n", + " # colorbar\n", + " cbar = plt.colorbar(axs[0].scatter(rec_pos[id_src][:,0], rec_pos[id_src][:,1], c=rec_pos[id_src][:,2], s=100, marker='o'))\n", + " cbar.set_label('arrival time')\n", + " \n", + " # plot epicentral distance\n", + " # src\n", + " axs[1].scatter(src_pos[id_src,0], src_pos[id_src,1], c='r', marker='o', s=100)\n", + " # rec\n", + " axs[1].scatter(rec_pos[id_src][:,0], rec_pos[id_src][:,1], c=rec_pos[id_src][:,3], s=100, marker='o')\n", + " \n", + " # colorbar\n", + " cbar = plt.colorbar(axs[1].scatter(rec_pos[id_src][:,0], rec_pos[id_src][:,1], c=rec_pos[id_src][:,3], s=10, marker='o'))\n", + " cbar.set_label('epicentral distance')\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_srcrec(src_pos_true, rec_pos_true)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_srcrec(src_pos_try, rec_pos_try)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rec_pos_diff = rec_pos_true[:][:][2]-rec_pos_try[:][:][2]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rec_pos_diff.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rec_pos_true.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + }, + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion/input_params.yml b/test/old_tests/inversion/input_params.yml new file mode 100644 index 0000000..1d81708 --- /dev/null +++ b/test/old_tests/inversion/input_params.yml @@ -0,0 +1,51 @@ +version : 2 + +domain : + #min_max_dep : [-2.863,17.137] # depth in km + min_max_dep : [-10.0, 10.0] # depth in km + min_max_lat : [37.7,42.3] # latitude in degree + min_max_lon : [22.7,27.3] # longitude in degree + n_rtp : [10,50,50] # number of nodes + +source : + #src_dep_lat_lon : [5.0,40.0,24.0] # source depth in km, latitude, longitude in degree + #src_dep_lat_lon : [5750.6370,46.0,36.0] # source depth in km, latitude, longitude in degree + src_rec_file : 'src_rec_test_out.dat' # source receiver file (if found, src_dep_lat_lon is ignored) + swap_src_rec : 1 # swap source and receiver (1: yes, 0: no) + +model : + init_model_type : '' # 'fd' (input file) or '1d_ak135' + init_model_path : './test_model_init.h5' # path to initial model file (ignored if init_model_type is '1d_*') + +inversion : + run_mode : 1 # 0 for forward simulation only, 1 for inversion + optim_method : 0 # optimization method. 0 : "grad_descent", 2 : "lbfgs", 1 : "halve-stepping" + smooth_method : 0 # 0: multigrid parametrization, 1: laplacian smoothing with CG + max_iterations_inv : 100 # maximum number of inversion iterations + step_size : 0.01 # step size for inversion + # parameters for multiparametric inversion + n_inversion_grid : 5 # number of inversion grid sets + n_inv_dep_lat_lon : [5,10,10] # number of the base inversion grid points + min_max_dep_inv : [-10.0, 10.0] # depth in km with R = 6371.0 + min_max_lat_inv : [37.7,42.3] # latitude in degree + min_max_lon_inv : [22.7,27.3] # longitude in degree + # parameters for laplacian smoothing + l_smooth_rtp : [10,10,10] # smoothing coefficients for each direction + regularization_weight : 1.0 # regularization weight NOTWORKING + # parameter for halving-stepping or lbfgs + max_sub_iterations : 100 # maximum number of sub-iterations + + +parallel : + n_sims : 1 # number of simultaneous run + ndiv_rtp : [1,2,2] # number of subdomains + nproc_sub : 2 # number of subprocess used for each subdomain + use_gpu : 0 # 0: CPU, 1: GPU + +calculation : + convergence_tolerance : 1e-6 + max_iterations : 200 + stencil_order : 3 # 1 or 3 + sweep_type : 2 # 0: legacy, 1: cuthill-mckee with shm parallelization + + diff --git a/test/old_tests/inversion/input_params_pre.yml b/test/old_tests/inversion/input_params_pre.yml new file mode 100644 index 0000000..be3d80d --- /dev/null +++ b/test/old_tests/inversion/input_params_pre.yml @@ -0,0 +1,36 @@ +version : 2 + +domain : + #min_max_dep : [-2.863,17.137] # depth in km + min_max_dep : [-10.0, 10.0] # depth in km + min_max_lat : [37.7,42.3] # latitude in degree + min_max_lon : [22.7,27.3] # longitude in degree + n_rtp : [10,50,50] # number of nodes + +source : + #src_dep_lat_lon : [5.0,40.0,24.0] # source depth in km, latitude, longitude in degree + #src_dep_lat_lon : [5750.6370,46.0,36.0] # source depth in km, latitude, longitude in degree + src_rec_file : 'src_rec_test.dat' # source receiver file (if found, src_dep_lat_lon is ignored) + swap_src_rec : 1 # swap source and receiver (1: yes, 0: no) + +model : + init_model_type : '' # 'fd' (input file) or '1d_ak135' + init_model_path : './test_model_true.h5' # path to initial model file (ignored if init_model_type is '1d_*') + +inversion : + run_mode : 0 # 0 for forward simulation only, 1 for inversion + n_inversion_grid : 1 + + +parallel : + n_sims : 1 # number of simultaneous run + ndiv_rtp : [2,1,2] # number of subdomains + nproc_sub : 2 # number of subprocess used for each subdomain + +calculation : + convergence_tolerance : 1e-6 + max_iterations : 200 + stencil_order : 3 # 1 or 3 + sweep_type : 2 # 0: legacy, 1: cuthill-mckee with shm parallelization + + diff --git a/test/old_tests/inversion/make_test_model.ipynb b/test/old_tests/inversion/make_test_model.ipynb new file mode 100644 index 0000000..2cf7156 --- /dev/null +++ b/test/old_tests/inversion/make_test_model.ipynb @@ -0,0 +1,348 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# notebook for create init and true test model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import math\n", + "\n", + "# grid\n", + "#R_earth = 6378.1370\n", + "R_earth = 6371.0\n", + "\n", + "rr1=6361 \n", + "rr2=6381\n", + "tt1=(38.0-0.3)/180*math.pi\n", + "tt2=(42.0+0.3)/180*math.pi\n", + "pp1=(23.0-0.3)/180*math.pi\n", + "pp2=(27.0+0.3)/180*math.pi\n", + "\n", + "n_rtp = [10,50,50]\n", + "n_rtp.reverse()\n", + "dr = (rr2-rr1)/(n_rtp[2]-1)\n", + "dt = (tt2-tt1)/(n_rtp[1]-1)\n", + "dp = (pp2-pp1)/(n_rtp[0]-1)\n", + "rr = np.array([rr1 + x*dr for x in range(n_rtp[2])])\n", + "tt = np.array([tt1 + x*dt for x in range(n_rtp[1])])\n", + "pp = np.array([pp1 + x*dp for x in range(n_rtp[0])])\n", + "\n", + "# initial model\n", + "gamma = 0.0\n", + "s0 = 1.0/6.0\n", + "slow_p=0.06\n", + "ani_p=0.04\n", + "\n", + "eta_init = np.zeros(n_rtp)\n", + "xi_init = np.zeros(n_rtp)\n", + "zeta_init = np.zeros(n_rtp)\n", + "fun_init = np.zeros(n_rtp)\n", + "vel_init = np.zeros(n_rtp)\n", + "a_init = np.zeros(n_rtp)\n", + "b_init = np.zeros(n_rtp)\n", + "c_init = np.zeros(n_rtp)\n", + "f_init = np.zeros(n_rtp)\n", + "\n", + "# true model\n", + "eta_true = np.zeros(n_rtp)\n", + "xi_true = np.zeros(n_rtp)\n", + "zeta_true = np.zeros(n_rtp)\n", + "fun_true = np.zeros(n_rtp)\n", + "vel_true = np.zeros(n_rtp)\n", + "a_true = np.zeros(n_rtp)\n", + "b_true = np.zeros(n_rtp)\n", + "c_true = np.zeros(n_rtp)\n", + "f_true = np.zeros(n_rtp)\n", + "\n", + "c=0\n", + "for ir in range(n_rtp[2]):\n", + " for it in range(n_rtp[1]):\n", + " for ip in range(n_rtp[0]):\n", + " #eta_init[ip,it,ir] = 0.0\n", + " #xi_init[ip,it,ir] = 0.0\n", + " zeta_init[ip,it,ir] = gamma*math.sqrt(eta_init[ip,it,ir]**2 + xi_init[ip,it,ir]**2)\n", + " fun_init[ip,it,ir] = s0\n", + " vel_init[ip,it,ir] = 1.0/s0\n", + " a_init[ip,it,ir] = 1.0 + 2.0*zeta_init[ip,it,ir]\n", + " b_init[ip,it,ir] = 1.0 - 2.0*xi_init[ip,it,ir]\n", + " c_init[ip,it,ir] = 1.0 + 2.0*xi_init[ip,it,ir]\n", + " f_init[ip,it,ir] = -2.0 * eta_init[ip,it,ir]\n", + "\n", + " # true model\n", + " if (tt[it] >= 38.0/180.0*math.pi and tt[it] <= 42.0/180.0*math.pi \\\n", + " and pp[ip] >= 23.0/180.0*math.pi and pp[ip] <= 27.0/180.0*math.pi):\n", + " c+=1\n", + " sigma = math.sin(2.0*math.pi*(tt[it]-38.0/180.0*math.pi)/(4.0/180.0*math.pi))*math.sin(2.0*math.pi*(pp[ip]-23.0/180.0*math.pi)/(4.0/180.0*math.pi))\n", + " else:\n", + " sigma = 0.0\n", + "\n", + " if sigma < 0:\n", + " psi = 60.0/180.0*math.pi\n", + " elif sigma > 0:\n", + " psi = 120.0/180.0*math.pi\n", + " else:\n", + " psi = 0.0\n", + "\n", + " eta_true[ip,it,ir] = ani_p*abs(sigma)*math.sin(2.0*psi)\n", + " xi_true[ip,it,ir] = ani_p*abs(sigma)*math.cos(2.0*psi)\n", + " zeta_true[ip,it,ir] = gamma*math.sqrt(eta_true[ip,it,ir]**2 + xi_true[ip,it,ir]**2)\n", + " fun_true[ip,it,ir] = s0/(1.0+sigma*slow_p)\n", + " vel_true[ip,it,ir] = 1.0/fun_true[ip,it,ir] \n", + " a_true[ip,it,ir] = 1.0 + 2.0*zeta_true[ip,it,ir]\n", + " b_true[ip,it,ir] = 1.0 - 2.0*xi_true[ip,it,ir]\n", + " c_true[ip,it,ir] = 1.0 + 2.0*xi_true[ip,it,ir]\n", + " f_true[ip,it,ir] = -2.0 * eta_true[ip,it,ir]\n", + "\n", + "\n", + "\n", + "#r_earth = 6378.1370\n", + "print(\"depminmax {} {}\".format(R_earth-rr1,R_earth-rr2))\n", + "print(c)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# write out\n", + "import h5py\n", + "\n", + "fout_init = h5py.File('test_model_init.h5', 'w')\n", + "fout_true = h5py.File('test_model_true.h5', 'w')\n", + "\n", + "# write out the arrays eta_init, xi_init, zeta_init, fun_init, a_init, b_init, c_init, f_init\n", + "fout_init.create_dataset('eta', data=eta_init.T)\n", + "fout_init.create_dataset('xi', data=xi_init.T)\n", + "fout_init.create_dataset('zeta', data=zeta_init.T)\n", + "fout_init.create_dataset('fun', data=fun_init.T)\n", + "fout_init.create_dataset('fac_a', data=a_init.T)\n", + "fout_init.create_dataset('fac_b', data=b_init.T)\n", + "fout_init.create_dataset('fac_c', data=c_init.T)\n", + "fout_init.create_dataset('fac_f', data=f_init.T)\n", + "fout_init.create_dataset('vel', data=vel_init.T)\n", + "\n", + "# writeout the arrays eta_true, xi_true, zeta_true, fun_true, a_true, b_true, c_true, f_true\n", + "fout_true.create_dataset('eta', data=eta_true.T)\n", + "fout_true.create_dataset('xi', data=xi_true.T)\n", + "fout_true.create_dataset('zeta', data=zeta_true.T)\n", + "fout_true.create_dataset('fun', data=fun_true.T)\n", + "fout_true.create_dataset('fac_a', data=a_true.T)\n", + "fout_true.create_dataset('fac_b', data=b_true.T)\n", + "fout_true.create_dataset('fac_c', data=c_true.T)\n", + "fout_true.create_dataset('fac_f', data=f_true.T)\n", + "fout_true.create_dataset('vel', data=vel_true.T)\n", + "\n", + "fout_init.close()\n", + "fout_true.close()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# prepare src station file\n", + "\n", + "```\n", + " 26 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- src  : id_src year month day hour min sec lat lon dep_km mag num_recs id_event\n", + " 26 1 PCBI 1.8900 98.9253 1000.0000 P 10.40 18.000 <- arrival : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arrival_time_sec\n", + " 26 2 MRPI 1.6125 99.3172 1100.0000 P 50.84 19.400\n", + " 26 3 HUTI 2.3153 98.9711 1600.0000 P 57.84 19.200\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "random.seed(1145141919810)\n", + "\n", + "# dummys\n", + "year_dummy = 1998\n", + "month_dummy = 1\n", + "day_dummy = 1\n", + "hour_dummy = 0\n", + "minute_dummy = 0\n", + "second_dummy = 0\n", + "mag_dummy = 3.0\n", + "id_dummy = 1000\n", + "st_name_dummy = 'AAAA'\n", + "phase_dummy = 'P'\n", + "dist_dummy = 100.0\n", + "arriv_t_dummy = 0.0\n", + "\n", + "tt1deg = tt1 * 180.0/math.pi\n", + "tt2deg = tt2 * 180.0/math.pi\n", + "pp1deg = pp1 * 180.0/math.pi\n", + "pp2deg = pp2 * 180.0/math.pi\n", + "\n", + "\n", + "n_src = 500\n", + "n_rec = [30 for x in range(n_src)]\n", + "\n", + "\n", + "lines = []\n", + "\n", + "nij_src = math.sqrt(n_src)\n", + "nij_rec = math.sqrt(n_rec[0])\n", + "\n", + "pos_src=[]\n", + "pos_rec=[]\n", + "\n", + "\n", + "# create receiver coordinates\n", + "elev_recs=[]\n", + "lon_recs=[]\n", + "lat_recs=[]\n", + "rec_names=[]\n", + "for i in range(n_rec[0]):\n", + " #elev_recs.append(random.uniform(-100.0,-100.0)) # elevation in m\n", + " #elev_recs.append(0) # elevation in m\n", + " #lon_recs .append(random.uniform(pp1deg*1.1,pp2deg*0.9))\n", + " #lat_recs .append(random.uniform(tt1deg*1.1,tt2deg*0.9))\n", + " rec_names.append(i)\n", + " # regularly\n", + " elev_recs.append(0.0)\n", + " tmp_ilon = i%nij_rec\n", + " tmp_ilat = int(i/nij_rec)\n", + " lon_recs.append(pp1deg + tmp_ilon*(pp2deg-pp1deg)/nij_rec)\n", + " lat_recs.append(tt1deg + tmp_ilat*(tt2deg-tt1deg)/nij_rec)\n", + "\n", + "\n", + "\n", + "# create dummy src\n", + "for i_src in range(n_src):\n", + " # define one point in the domain (rr1 bottom, rr2 top)\n", + " # random\n", + " #dep = random.uniform((R_earth-rr1)*0.5,(R_earth-rr1)*0.98)\n", + " #lon = random.uniform(pp1deg,pp2deg)\n", + " #lat = random.uniform(tt1deg,tt2deg)\n", + "\n", + " # regularl\n", + " dep = (R_earth-rr1)*0.9\n", + " tmp_ilon = i_src%nij_src\n", + " tmp_ilat = int(i_src/nij_src)\n", + " lon = pp1deg + tmp_ilon*(pp2deg-pp1deg)/nij_src\n", + " lat = tt1deg + tmp_ilat*(tt2deg-tt1deg)/nij_src\n", + "\n", + " src = [i_src, year_dummy, month_dummy, day_dummy, hour_dummy, minute_dummy, second_dummy, lat, lon, dep, mag_dummy, n_rec[i_src], id_dummy]\n", + " lines.append(src)\n", + "\n", + " pos_src.append([lon,lat,dep])\n", + "\n", + "\n", + " # create dummy station\n", + " for i_rec in range(n_rec[i_src]):\n", + " #elev_rec = 0.0 #random.uniform(0.0,-10.0) # elevation in m\n", + " #lon_rec = random.uniform(pp1deg,pp2deg)\n", + " #lat_rec = random.uniform(tt1deg,tt2deg)\n", + " # regularly\n", + " #elev_rec = -10.0\n", + " #tmp_ilon = i_rec%nij_rec\n", + " #tmp_ilat = int(i_rec/nij_rec)\n", + " #lon_rec = pp1deg + tmp_ilon*(pp2deg-pp1deg)/nij_rec\n", + " #lat_rec = tt1deg + tmp_ilat*(tt2deg-tt1deg)/nij_rec\n", + "\n", + " # \n", + " elev_rec = elev_recs[i_rec]\n", + " lon_rec = lon_recs[i_rec]\n", + " lat_rec = lat_recs[i_rec]\n", + " st_name_dummy = rec_names[i_rec]\n", + "\n", + " rec = [i_src, i_rec, st_name_dummy, lat_rec, lon_rec, elev_rec, phase_dummy, dist_dummy, arriv_t_dummy]\n", + " lines.append(rec)\n", + "\n", + " pos_rec.append([lon_rec,lat_rec,elev_rec])\n", + "\n", + "\n", + "# write out ev_arrivals file\n", + "fname = 'src_rec_test.dat'\n", + "\n", + "with open(fname, 'w') as f:\n", + " for line in lines:\n", + " for elem in line:\n", + " f.write('{} '.format(elem))\n", + " f.write('\\n')\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# draw src and rec positions\n", + "import matplotlib.pyplot as plt\n", + "\n", + "for i_src in range(n_src):\n", + " plt.scatter(pos_src[i_src][1],pos_src[i_src][0],c='r',marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot receivers\n", + "for i_rec in range(n_rec[0]):\n", + " plt.scatter(pos_rec[i_rec][1],pos_rec[i_rec][0],c='b',marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "vscode": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_2/README.md b/test/old_tests/inversion_2/README.md new file mode 100644 index 0000000..2028979 --- /dev/null +++ b/test/old_tests/inversion_2/README.md @@ -0,0 +1,14 @@ +# Inversion test + +This is a test setup for inversion calculation. + +1. Run all cells of `make_test_model.ipynb` for creating + - source, receiver file + - true model + - initial model + +2. then run TOMOATT forward with `input_params_pre.yml` for calculating the true arrival times at the stations +-> this will output src_rec_result.dat file which includes the arrival time at each station + +3. run TOMOATT in inversion mode with `input_params.yml`. + \ No newline at end of file diff --git a/test/old_tests/inversion_2/check_obj_func.ipynb b/test/old_tests/inversion_2/check_obj_func.ipynb new file mode 100644 index 0000000..9d67601 --- /dev/null +++ b/test/old_tests/inversion_2/check_obj_func.ipynb @@ -0,0 +1,62 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# check the change of objective values\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "fpath='objective_function.txt'\n", + "\n", + "objs=[]\n", + "\n", + "with open(fpath) as f:\n", + " lines = f.readlines()\n", + "\n", + " for l in lines:\n", + " if(l.startswith('i_inv')):\n", + " continue\n", + " objs.append(float(l.strip().split(',')[1]))\n", + "\n", + "\n", + "plt.plot(objs)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "interpreter": { + "hash": "fbd0b2a7df497f398d93ab2f589d8a5daa3108cfb7ff2b90736653cca3aeadc0" + }, + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_2/check_src_rec_file.ipynb b/test/old_tests/inversion_2/check_src_rec_file.ipynb new file mode 100644 index 0000000..c892c1e --- /dev/null +++ b/test/old_tests/inversion_2/check_src_rec_file.ipynb @@ -0,0 +1,119 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "sys.path.append(\"../../utils/\")\n", + "\n", + "from src_rec_file_helper import read_src_rec_file\n", + "\n", + "events_true = read_src_rec_file(\"./src_rec_test_out.dat\")\n", + "events_calc = read_src_rec_file(\"./src_rec_test_out_out.dat\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# check objective function value\n", + "v_obj = 0.0\n", + "for i_ev in range(len(events_true)):\n", + " for i_rec in range(len(events_true[i_ev].rec_list)):\n", + " v_obj += abs(events_true[i_ev].rec_list[i_rec].arr_time - events_calc[i_ev].rec_list[i_rec].arr_time)**2/2.0\n", + "\n", + "print(\"v_obj: \", v_obj)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# calculate summation of difference of arrival times at each receiver\n", + "list_diff_v_obj = []\n", + "for i_ev in range(len(events_true)):\n", + " for i_rec in range(len(events_true[i_ev].rec_list)):\n", + " #tmp_v_obj = abs(events_true[i_ev].rec_list[i_rec].arr_time - events_calc[i_ev].rec_list[i_rec].arr_time)**2/2.0\n", + " tmp_v_obj = events_true[i_ev].rec_list[i_rec].arr_time - events_calc[i_ev].rec_list[i_rec].arr_time\n", + "\n", + " if (i_ev == 0):\n", + " list_diff_v_obj.append(tmp_v_obj)\n", + " else:\n", + " list_diff_v_obj[i_rec] += tmp_v_obj\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot list_diff_v_obj on map\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "# colormap by list_diff_v_obj\n", + "cmap = plt.get_cmap('viridis')\n", + "norm = plt.Normalize(vmin=min(list_diff_v_obj), vmax=max(list_diff_v_obj))\n", + "\n", + "print(\"min: \", min(list_diff_v_obj))\n", + "print(\"max: \", max(list_diff_v_obj))\n", + "\n", + "list_lon = []\n", + "list_lat = []\n", + "\n", + "for i_rec in range(len(events_true[0].rec_list)):\n", + " list_lon.append(events_true[0].rec_list[i_rec].lon)\n", + " list_lat.append(events_true[0].rec_list[i_rec].lat)\n", + "\n", + "plt.scatter(list_lon, list_lat, c=list_diff_v_obj, cmap=cmap, norm=norm)\n", + "\n", + "# color bar\n", + "plt.colorbar()\n", + "\n", + "# tight \n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "vscode": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_2/compare_with_fortran_code.ipynb b/test/old_tests/inversion_2/compare_with_fortran_code.ipynb new file mode 100644 index 0000000..8a15f62 --- /dev/null +++ b/test/old_tests/inversion_2/compare_with_fortran_code.ipynb @@ -0,0 +1,284 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# compare result from TOMOATT and fortran code\n", + "\n", + "fpath_kernel_fort = './fortran/ega5/output/kernel_step1_sum'\n", + "fpath_synth_fort = './fortran/ega5/output/syn_step1_event1' # Table\n", + "fpath_adj_fort = './fortran/ega5/output/adj_step1_event1' # TableADJ\n", + "fpath_out_tomoatt = './out_data_sim_0.h5'\n", + "\n", + "# grid information in fortran code\n", + "nr = 55\n", + "nt = 55\n", + "np = 55\n", + "npoints = nr*nt*np\n", + "\n", + "# division\n", + "ndiv_r = 1 \n", + "ndiv_t = 1 \n", + "ndiv_p = 1 " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import h5py\n", + "import numpy\n", + "\n", + "\n", + "# read fortran test file and convert to numpy array\n", + "def read_fortran_result_file(fpath):\n", + " with open(fpath, 'r') as f:\n", + " lines = f.readlines()\n", + " lines = [line.strip() for line in lines]\n", + " lines = [line for line in lines if line]\n", + " lines = [line.split() for line in lines]\n", + " lines = numpy.array(lines, dtype=numpy.float64)\n", + " return lines\n", + "\n", + "fortran_data = read_fortran_result_file(fpath_kernel_fort)\n", + "## change dimension of fortran data\n", + "Ks_fort = fortran_data[:,3].reshape(nr, nt, np)\n", + "Kxi_fort = fortran_data[:,4].reshape(nr, nt, np)\n", + "Keta_fort = fortran_data[:,5].reshape(nr, nt, np)\n", + "\n", + "fortran_synth_data = read_fortran_result_file(fpath_synth_fort).reshape(nr, nt, np)\n", + "fortran_adj_data = read_fortran_result_file(fpath_adj_fort).reshape(nr, nt, np)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# read h5 data\n", + "import sys\n", + "sys.path.append(\"../../utils/\")\n", + "\n", + "from tomoatt_data_retrieval import get_data_from_h5\n", + "\n", + "#Ks_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/Ks_update_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p, verbose=True)\n", + "#Kxi_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/Kxi_update_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n", + "#Keta_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/Keta_update_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n", + "\n", + "Ks_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/Ks_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p, verbose=True)\n", + "Kxi_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/Kxi_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n", + "Keta_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/Keta_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n", + "\n", + "Syn_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/T_res_src_0_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n", + "Adj_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/adjoint_field_src_0_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot slice of Ks_inv\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.animation as animation\n", + "\n", + "\n", + "def plot_slice(data_es, data_fort, slice_ax, id_slice, contour=False, make_anime=False, tag=\"\"):\n", + "\n", + " if (slice_ax == 'r'):\n", + " data_es_v = data_es[ id_slice, :, :]\n", + " data_fort_v = data_fort[id_slice, :, :]\n", + " elif (slice_ax == 't'):\n", + " data_es_v = data_es[ :, id_slice, :]\n", + " data_fort_v = data_fort[:, id_slice, :]\n", + " elif (slice_ax == 'p'):\n", + " data_es_v = data_es[ :, :, id_slice]\n", + " data_fort_v = data_fort[:, :, id_slice]\n", + " else:\n", + " print(\"Error: slice_ax should be 'r', 't' or 'p'\")\n", + " return\n", + "\n", + " # use the same color range for both tomoatt and fortran \n", + " combined_data = numpy.array([data_es_v.flatten(),data_fort_v.flatten()])\n", + " #Get the min and max of all your data\n", + " _min, _max = numpy.amin(combined_data), numpy.amax(combined_data)\n", + " # make the color range symmetric\n", + " if (abs(_min) > abs(_max)):\n", + " if(_min < 0):\n", + " _max = -_min\n", + " else:\n", + " _min = -_max\n", + "\n", + "\n", + "\n", + " # make the color range symmetric\n", + " diff_data = data_es_v-data_fort_v\n", + " _min_diff, _max_diff = numpy.amin(diff_data), numpy.amax(diff_data)\n", + " if (abs(_min_diff) > abs(_max_diff)):\n", + " if (_min_diff < 0):\n", + " _max_diff = -_min_diff\n", + " else:\n", + " _min_diff = -_max_diff\n", + "\n", + " #cmap1=\"viridis\"\n", + " cmap1=\"seismic\"\n", + " cmap2=\"seismic\"\n", + "\n", + " plt.figure(figsize=(20,10))\n", + "\n", + " plt.subplot(1,3,1)\n", + " plt.imshow(data_es_v, cmap=cmap1, vmin=_min, vmax=_max)\n", + " plt.colorbar()\n", + " if(contour):\n", + " plt.contour(data_es_v, colors='k', linewidths=0.5)\n", + " plt.title('result_tomoatt')\n", + "\n", + " plt.subplot(1,3,2)\n", + " plt.imshow(data_fort_v, cmap=cmap1, vmin=_min, vmax=_max)\n", + " plt.colorbar()\n", + " if(contour): \n", + " plt.contour(data_fort_v, colors='k', linewidths=0.5)\n", + " plt.title('result_fort')\n", + " \n", + " plt.subplot(1,3,3)\n", + " plt.imshow(diff_data, cmap=cmap2, vmin=_min_diff, vmax=_max_diff)\n", + " plt.colorbar()\n", + " if(contour):\n", + " plt.contour(diff_data, colors='k', linewidths=0.5) \n", + " plt.title('tomoatt-fort')\n", + "\n", + " if (not make_anime):\n", + " plt.show()\n", + " else:\n", + " plt.savefig(\"out_\"+tag+\"_\"+slice_ax+str(id_slice).zfill(3)+\".png\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_slice(Syn_tomoatt, fortran_synth_data, 'r', 20, contour=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "def anime_slices(data_es, data_fort, slice_ax, tag):\n", + "\n", + " if (slice_ax == 'r'):\n", + " n = nr\n", + " elif (slice_ax == 't'):\n", + " n = nt\n", + " elif (slice_ax == 'p'):\n", + " n = np\n", + "\n", + " for i in range(0, n):\n", + " plot_slice(data_es, data_fort, slice_ax, i, contour=True, make_anime=True, tag=tag)\n", + "\n", + " ## make png files to gif\n", + " import subprocess\n", + " subprocess.call([\"convert\", \"-delay\", \"20\", \"-loop\", \"0\", \"out_{}_{}*.png\".format(tag,slice_ax), \"out_{}_{}.gif\".format(tag,slice_ax)])\n", + " # erase png files\n", + " for i in range(0, nr):\n", + " subprocess.call([\"rm\", \"out_{}_{}\".format(tag,slice_ax)+str(i).zfill(3)+\".png\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "anime_slices(Ks_tomoatt, Ks_fort, 'r', 'Ks')\n", + "anime_slices(Ks_tomoatt, Ks_fort, 't', 'Ks')\n", + "anime_slices(Ks_tomoatt, Ks_fort, 'p', 'Ks')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "anime_slices(Adj_tomoatt, fortran_adj_data,'r', 'Adj')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "anime_slices(Keta_tomoatt, Keta_fort, 'r', 'Keta')\n", + "anime_slices(Keta_tomoatt, Keta_fort, 't', 'Keta')\n", + "anime_slices(Keta_tomoatt, Keta_fort, 'p', 'Keta')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "anime_slices(Kxi_tomoatt, Kxi_fort, 'r', 'Kxi')\n", + "anime_slices(Kxi_tomoatt, Kxi_fort, 't', 'Kxi')\n", + "anime_slices(Kxi_tomoatt, Kxi_fort, 'p', 'Kxi')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "anime_slices(Adj_tomoatt, fortran_adj_data, 'r', 'adj')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "vscode": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_2/fortran/Readme.txt b/test/old_tests/inversion_2/fortran/Readme.txt new file mode 100644 index 0000000..3a91b6b --- /dev/null +++ b/test/old_tests/inversion_2/fortran/Readme.txt @@ -0,0 +1,3 @@ +mpif90 ega5_sphe_3d_inversion_Tong_3Dinv.f90 -o a5.out + +mpirun -n 4 a5.out \ No newline at end of file diff --git a/test/old_tests/inversion_2/fortran/ega5/input/EARTHQUAKES.txt b/test/old_tests/inversion_2/fortran/ega5/input/EARTHQUAKES.txt new file mode 100644 index 0000000..ac73414 --- /dev/null +++ b/test/old_tests/inversion_2/fortran/ega5/input/EARTHQUAKES.txt @@ -0,0 +1,501 @@ +500 + 12.902894 37.503373 16.794572 + 17.416074 36.974148 25.587149 + 10.553441 48.572870 29.755519 + 17.050082 30.582756 20.557365 + 7.733536 30.049830 22.686053 + 2.695465 45.678252 36.050257 + 19.018349 30.835213 33.695062 + 16.538200 39.559879 22.351080 + 2.947435 37.234474 24.550463 + 15.739527 49.857044 16.506392 + 15.732578 34.182860 27.127186 + 1.296549 48.107962 29.948977 + 14.587690 39.140723 23.153653 + 18.135532 45.517829 17.105875 + 8.364121 30.479830 15.883796 + 9.211189 38.133248 17.858524 + 4.272898 31.194404 18.573422 + 6.948694 35.954361 24.462624 + 12.746088 49.850406 26.847644 + 11.313107 45.103047 16.301263 + 3.313507 46.477589 36.875331 + 10.145642 42.073024 18.769733 + 8.250413 48.900277 19.475522 + 13.804441 49.786255 16.530966 + 17.835237 45.927679 19.912836 + 11.877357 33.654921 22.852455 + 12.871971 34.707392 21.890595 + 4.097522 34.532987 27.568581 + 17.874029 34.484387 34.692491 + 3.866172 33.865449 28.496058 + 16.252330 41.105672 19.464576 + 1.213538 36.013973 17.977264 + 14.955385 45.399043 29.827500 + 17.469489 35.163250 19.273657 + 7.375320 32.817054 28.313777 + 18.585662 33.143956 25.800265 + 15.518612 34.328928 29.752072 + 18.309939 33.218516 38.096180 + 5.752131 32.762387 39.124230 + 12.471990 48.600499 37.709010 + 8.119302 41.058539 27.574594 + 13.473451 36.710096 33.310765 + 12.096579 45.910913 20.602681 + 12.291621 35.421838 19.609690 + 6.722855 34.197625 22.922348 + 19.977008 33.357824 20.801610 + 14.042122 42.609560 36.961508 + 8.278199 33.440638 35.377468 + 10.130480 41.237552 26.524442 + 9.874228 41.667609 22.900117 + 2.528995 40.838610 35.938716 + 15.334613 43.507392 36.217644 + 2.660098 44.120069 32.041887 + 1.861117 38.659778 36.102099 + 17.497575 45.676303 27.354341 + 11.287530 40.851293 33.379047 + 18.006903 38.149825 25.683572 + 9.641227 30.509291 32.005355 + 11.281402 38.301783 26.210378 + 17.511430 43.700541 20.496900 + 6.279207 49.780686 35.342213 + 10.691969 45.580664 36.011519 + 15.409820 38.320676 17.830344 + 19.051727 44.632362 37.180772 + 1.812418 37.134760 37.694988 + 4.160294 33.803068 37.492413 + 19.990846 44.087650 38.916613 + 6.919528 36.705624 30.282383 + 3.762207 33.859941 23.084520 + 6.696542 31.799267 15.983610 + 5.207515 43.495341 36.539506 + 15.760515 33.837372 18.996584 + 16.401076 40.346859 29.422924 + 3.985079 48.258603 32.826637 + 16.886675 48.716436 23.605320 + 18.974327 46.091270 22.697943 + 7.384952 38.441961 16.463244 + 4.231388 42.800608 22.558010 + 3.169625 49.753544 33.780253 + 3.741493 42.843651 38.277171 + 1.703036 35.504006 28.680233 + 2.556739 31.467144 23.718764 + 8.546980 41.234760 31.150894 + 13.221493 40.941614 33.480616 + 6.837920 34.912584 35.820479 + 7.716762 41.133360 20.876900 + 10.321416 31.362250 29.092427 + 17.855166 45.569227 19.744126 + 5.414400 45.949803 24.029219 + 10.622310 33.633958 37.349613 + 18.821079 45.259309 23.690669 + 6.400983 42.879048 20.743236 + 10.339512 44.689643 20.088403 + 14.157235 42.069607 38.833834 + 17.014583 34.928036 31.302363 + 12.827352 36.255275 22.938120 + 7.405344 48.287391 34.564176 + 3.771071 43.293532 28.422367 + 11.910684 48.348929 36.441739 + 3.053959 43.737186 36.600389 + 8.579958 40.581127 25.851314 + 11.931197 31.720220 17.810105 + 7.425585 44.628309 34.089390 + 1.517343 49.451598 36.749768 + 13.373374 37.648809 36.512094 + 4.490529 47.682461 26.286905 + 17.470296 43.349799 16.006251 + 19.343889 44.865620 31.299373 + 15.455612 39.569737 21.775167 + 13.382569 38.684806 37.606354 + 16.876219 37.640250 22.490769 + 5.007780 43.252308 31.761110 + 14.917810 48.036944 16.404019 + 18.211096 33.840776 16.319922 + 7.586946 30.429530 17.767477 + 15.527441 36.791267 32.576167 + 8.395652 47.363883 30.734555 + 8.300918 45.773041 18.973032 + 12.811946 37.078433 31.654726 + 11.271027 44.367770 23.614827 + 7.883254 33.508117 25.081344 + 9.318537 34.252752 21.126458 + 10.125988 49.407886 23.732711 + 15.231482 31.012657 38.326734 + 17.583612 46.667417 35.223383 + 3.975712 45.446574 19.293018 + 6.378385 47.601238 37.559922 + 2.237225 46.922084 15.276371 + 18.881117 47.018476 32.117860 + 7.601149 37.424848 33.048987 + 1.545623 35.528771 31.054720 + 15.305942 41.902726 32.920003 + 8.780450 43.137000 29.771781 + 15.653881 33.574476 22.550923 + 8.374878 42.226796 29.428747 + 1.649332 37.516438 29.602287 + 15.471741 42.579812 34.244173 + 14.121526 31.968351 35.539179 + 19.951984 31.884994 38.930168 + 5.686047 46.021632 37.620089 + 3.356280 35.028285 27.812111 + 17.282928 32.916989 20.503907 + 17.587365 30.437778 27.868687 + 16.846272 32.526293 23.686783 + 5.595438 46.916388 30.602188 + 10.617813 47.056847 29.509244 + 3.472421 46.734969 23.827490 + 9.450474 39.510548 26.858533 + 7.050903 31.802893 18.651294 + 16.740378 42.673295 22.941474 + 8.748832 49.086459 28.498236 + 11.101980 48.419839 33.467477 + 1.821840 40.425959 24.967524 + 18.807331 49.210102 23.627239 + 16.048152 33.431415 27.275778 + 4.156495 37.028503 23.441579 + 8.252786 43.619866 31.044609 + 6.039243 44.924797 25.445324 + 15.698418 36.891680 31.709361 + 13.305460 31.432069 28.565380 + 1.884098 33.514374 39.083138 + 19.784318 48.068758 33.412684 + 10.067793 43.703751 38.394139 + 9.332467 39.505090 19.017737 + 12.280919 46.423916 38.722269 + 18.443031 39.348801 27.023964 + 15.761264 48.206337 22.708882 + 7.403360 37.157790 15.624682 + 11.901780 46.996568 29.408969 + 19.234729 44.636488 39.127281 + 4.699343 31.480019 22.985463 + 8.029268 33.651500 17.282239 + 9.408798 39.483198 37.726002 + 2.995543 45.341282 28.914835 + 1.469270 43.894101 35.258155 + 17.054291 30.978729 17.580649 + 5.151633 42.357135 21.048084 + 11.523488 48.279981 20.451448 + 12.625369 47.910449 23.809322 + 10.805510 39.289972 33.099199 + 16.688680 31.235778 31.772384 + 5.872404 46.921761 20.735459 + 7.760370 49.248566 27.412126 + 14.981766 48.345084 22.449809 + 17.494891 42.556305 17.939339 + 16.883756 35.789221 26.232745 + 18.320859 32.768764 34.301897 + 17.639973 41.691055 20.038187 + 9.699485 49.507576 29.079033 + 18.107852 35.136726 29.376171 + 18.308439 37.395076 27.395968 + 7.807415 35.196537 36.702486 + 19.870463 31.937476 26.900138 + 3.831742 44.590580 18.565134 + 15.201851 32.646130 39.026955 + 15.828158 47.973824 36.504196 + 13.003291 37.834748 30.167337 + 6.392706 37.452325 18.574045 + 16.906282 42.459442 35.050055 + 13.809721 39.226894 19.719641 + 2.349331 48.568978 36.858088 + 13.463109 31.025621 32.611917 + 7.791103 35.619114 35.466085 + 15.908805 31.883312 36.337440 + 12.117860 40.626769 15.503395 + 17.224971 30.288926 20.225713 + 7.769806 32.781915 20.240085 + 19.515691 32.790366 18.423108 + 13.086107 35.997238 32.187432 + 19.583843 46.680117 23.645876 + 5.856651 40.007246 21.179095 + 7.862932 44.479540 23.893157 + 6.880727 30.486859 36.304971 + 12.890612 39.620341 15.500047 + 17.079175 38.401798 27.785445 + 5.828536 41.348587 16.106890 + 16.937460 42.816015 36.720915 + 3.914160 30.441916 38.949482 + 19.655249 45.167885 21.419356 + 5.977111 38.508239 20.391821 + 6.927604 39.621611 32.875926 + 18.361222 45.590869 38.069800 + 10.260030 43.346131 15.879682 + 2.192603 39.046662 33.248710 + 19.085453 37.873403 16.629225 + 12.101016 38.044051 24.990450 + 5.819428 32.772253 26.474392 + 12.724981 46.690291 27.925452 + 18.061294 42.771723 33.725329 + 14.506720 47.805098 26.622413 + 19.850651 49.189715 25.849751 + 15.219038 43.463470 25.041924 + 19.886991 34.051333 32.426005 + 7.117638 32.476564 32.376542 + 5.495352 36.502620 28.691081 + 16.996145 40.153394 37.204504 + 6.456862 33.696229 34.883926 + 2.330674 33.891702 15.484274 + 16.654256 35.373110 33.898747 + 5.038885 38.192102 27.689718 + 14.123672 33.761702 24.479974 + 1.429166 47.744844 31.788410 + 4.269137 39.186264 18.096003 + 2.289546 40.394737 27.797130 + 8.634843 49.702312 16.408445 + 4.519147 37.133705 18.956423 + 15.655447 42.736719 21.384360 + 12.749631 32.600550 38.708210 + 4.951746 46.823971 36.767247 + 9.331854 35.692199 21.771833 + 10.011062 46.663543 24.723024 + 19.949108 42.198244 27.340252 + 10.252827 47.219953 25.322984 + 16.510059 43.107901 28.874568 + 6.363226 49.090611 17.454213 + 10.635868 40.297072 33.028443 + 16.850642 38.133906 27.489172 + 1.209319 37.893652 34.507359 + 12.115913 34.227874 36.364014 + 12.821762 39.440078 33.040301 + 18.591223 39.525593 31.873724 + 8.071489 49.360508 16.522758 + 8.888324 42.368580 26.650131 + 8.889626 41.127943 35.902008 + 10.999334 37.031617 39.494656 + 18.362983 30.378271 18.297875 + 4.302350 36.174539 25.849816 + 7.203800 35.926694 33.803271 + 5.955434 30.625004 18.539309 + 18.701156 48.114168 36.495495 + 9.310080 31.778387 24.469818 + 4.443713 48.914441 17.652480 + 6.915923 33.492221 30.512492 + 12.953648 47.034138 17.407188 + 13.014381 38.565701 16.404760 + 3.750504 34.237353 36.468920 + 14.823263 48.440372 22.486555 + 15.668423 46.749729 32.080923 + 15.249817 31.028147 15.608834 + 13.264813 47.340345 31.103057 + 15.198867 35.515848 16.671581 + 9.743653 41.383808 30.090270 + 13.220311 46.330492 36.129090 + 3.174404 32.263913 36.140707 + 6.044751 33.274473 15.721678 + 11.565608 35.746820 22.653814 + 16.179206 44.677125 24.020450 + 11.327136 44.811048 32.693529 + 1.636618 40.444103 18.356178 + 10.744547 37.150505 16.214572 + 13.261026 34.105829 21.999317 + 3.868859 49.216692 21.453701 + 18.240428 30.304513 30.673916 + 7.072615 35.062618 26.710350 + 9.121655 48.655297 29.967281 + 5.855663 35.811613 27.420149 + 12.000977 43.413023 15.537291 + 6.564213 36.838226 35.870052 + 7.714274 42.313338 28.048145 + 2.081489 43.751865 27.701850 + 8.319217 33.115678 38.739537 + 14.511302 34.703210 16.585363 + 9.035614 36.808248 20.909689 + 14.228832 44.449462 15.947576 + 10.282913 49.531593 19.906303 + 17.589859 47.123318 23.446360 + 4.864052 37.595184 15.336005 + 5.554797 45.565313 38.282334 + 10.528200 42.619743 24.326508 + 11.040215 46.010982 22.617869 + 11.404083 46.772047 20.275623 + 8.466629 43.802511 26.377092 + 14.969797 31.351324 25.339695 + 14.235184 33.858954 37.025746 + 8.455785 49.863795 33.265439 + 8.889406 35.667726 17.308049 + 6.681788 37.412732 15.346280 + 8.976410 34.648739 17.568041 + 10.814533 44.752360 29.627384 + 10.199468 40.546340 32.494767 + 14.496903 45.258427 38.066645 + 3.094126 35.259604 16.746947 + 8.520395 42.659554 15.880581 + 17.611133 41.555600 18.232809 + 14.251795 33.115916 20.736805 + 7.514731 30.399115 21.351999 + 5.196915 45.397866 34.915807 + 19.166354 32.396496 21.352377 + 13.151796 40.555799 27.727383 + 5.350548 46.598504 34.378491 + 9.529635 40.571371 18.426558 + 9.126816 41.898209 17.050111 + 13.802897 32.953515 28.238527 + 15.418929 34.298935 26.833731 + 12.574792 35.492734 26.555897 + 16.938654 44.491948 25.265210 + 10.924080 48.518974 17.175958 + 7.117455 42.434404 23.654994 + 14.009338 36.036521 39.017975 + 19.349324 30.799935 19.716167 + 14.201462 37.024155 38.578311 + 2.822673 33.994394 34.302821 + 13.892456 32.962351 32.359032 + 15.995095 43.754437 29.772219 + 12.968758 32.410285 24.381215 + 1.583361 48.689008 24.016421 + 15.389693 46.555314 19.407358 + 17.453486 39.698530 32.665472 + 12.941524 30.636925 27.452996 + 13.213848 32.944137 23.119204 + 5.801494 40.680483 39.987076 + 16.748570 32.170913 15.378249 + 5.500054 38.628247 24.922452 + 9.008471 31.774374 37.808194 + 14.855098 47.897280 39.249556 + 18.168511 33.566407 22.346673 + 17.753149 42.913741 33.127159 + 19.795910 35.010497 18.833259 + 13.418894 37.999490 18.797014 + 10.696075 37.767208 37.509466 + 1.516162 41.220767 36.769994 + 9.791821 47.293788 32.327841 + 15.542095 41.085072 23.263423 + 16.094111 33.695693 15.819606 + 11.757946 39.421142 30.979153 + 16.568937 34.064155 18.969278 + 6.911632 36.546812 20.978434 + 4.881109 32.834115 39.250059 + 14.023054 45.882062 37.160694 + 9.816248 46.742746 29.781763 + 8.756145 37.174411 24.408729 + 17.588240 44.192292 26.619717 + 17.340343 41.790910 28.580176 + 12.088289 45.478525 27.897123 + 2.586683 37.906181 27.284716 + 14.494787 31.239448 15.065949 + 19.880752 30.337209 16.025088 + 12.823786 43.458027 18.855097 + 15.293022 31.406674 37.847072 + 13.980302 44.345304 18.989914 + 8.991872 32.283652 15.894826 + 10.306169 44.491996 15.351453 + 9.244054 31.064154 35.461811 + 11.066989 35.074635 21.009033 + 9.996705 35.829850 28.967240 + 11.044099 39.587919 35.338766 + 1.917792 49.787496 20.053103 + 1.898804 31.727660 26.029601 + 17.236757 44.662413 28.599031 + 8.003001 41.530145 34.147378 + 11.296640 31.640054 29.667642 + 7.470842 38.590285 16.251505 + 4.120357 40.312343 30.229225 + 8.168395 39.952977 27.957050 + 14.557243 45.490199 23.005864 + 8.675602 35.746172 28.944592 + 13.436976 32.236888 28.823008 + 17.809797 33.690628 26.829731 + 8.031168 39.495328 32.948914 + 14.566420 42.285006 32.930929 + 10.051800 39.544345 25.797573 + 15.312497 35.367693 24.154386 + 2.101328 37.582577 35.819286 + 14.200961 38.741432 22.349646 + 17.750624 33.199228 15.433538 + 5.105492 42.003092 30.932790 + 10.710424 46.645944 31.550315 + 4.863936 33.255507 39.528023 + 10.640629 37.713774 30.208056 + 3.363033 36.409599 39.058745 + 11.715459 45.522667 32.434962 + 13.464532 47.534408 37.701884 + 5.753267 33.153432 38.744854 + 18.406300 45.310872 29.325427 + 13.206913 40.476137 23.713366 + 8.022162 30.669901 22.709029 + 3.752878 32.705859 37.542413 + 1.610955 47.782385 29.385167 + 3.282363 49.872369 28.006430 + 15.645580 31.838090 35.763354 + 4.094538 33.332994 30.739124 + 19.389613 49.000040 18.201493 + 12.304495 31.002744 35.347648 + 16.636205 41.587288 38.509899 + 16.242905 37.908027 22.830238 + 5.293874 39.810962 24.214172 + 17.730042 40.807401 24.413293 + 10.848526 46.719333 35.651427 + 7.126381 30.842360 33.846795 + 5.959882 33.494248 22.053307 + 19.655118 37.249880 30.995999 + 17.472236 42.954364 33.867949 + 8.702629 44.307435 34.928355 + 14.553503 36.391143 23.208353 + 16.004125 47.562957 34.801544 + 11.432695 47.088634 33.492738 + 18.226320 43.756214 35.926311 + 3.436149 42.651048 38.536654 + 13.874327 30.831422 25.310616 + 14.802646 40.372075 29.327322 + 17.366240 48.310718 23.205411 + 18.883354 33.973377 34.189039 + 4.940024 38.820683 21.764487 + 6.389472 34.087807 31.184860 + 9.686298 46.746346 32.711941 + 14.858616 49.173689 28.350539 + 12.892325 33.920028 27.283556 + 10.997502 36.579405 32.044916 + 17.125470 47.650177 29.239499 + 10.673225 33.505780 21.271442 + 15.673616 33.342102 36.331892 + 19.150955 35.558436 38.191118 + 7.109812 49.243617 18.690492 + 6.496059 31.449753 32.600549 + 16.655108 39.629968 37.582826 + 10.026644 39.787402 21.084604 + 7.611422 40.274845 26.509155 + 19.789113 39.105677 19.207532 + 2.261065 37.897836 16.342341 + 3.544031 45.823398 29.063016 + 8.128766 31.176403 35.862979 + 1.144189 43.284815 36.664338 + 11.880560 36.253201 23.576926 + 16.624167 49.768690 39.240587 + 15.503963 36.766183 20.953801 + 17.806003 30.839724 27.752022 + 8.304373 48.787565 21.408915 + 10.181775 35.977743 18.438917 + 17.122472 34.268485 38.754985 + 5.311906 43.788904 17.804844 + 12.012478 31.562773 17.345468 + 19.961598 36.302881 28.623923 + 19.538837 36.303158 31.781007 + 4.523682 48.587788 33.198009 + 13.324998 42.192480 29.795723 + 1.123948 43.299255 23.155238 + 17.451114 45.355883 24.606045 + 4.411658 44.468014 25.506241 + 3.964021 38.375390 37.494247 + 3.342860 44.301725 24.667203 + 16.858232 33.418985 37.621960 + 17.575051 42.057543 21.681617 + 3.721699 44.550901 22.869235 + 4.536435 32.653021 20.354643 + 12.418668 47.807467 24.510958 + 3.480837 37.949268 25.698086 + 17.659928 48.015778 25.153195 + 3.404855 39.565089 37.688459 + 19.441124 45.664148 24.812879 + 15.163402 48.596491 28.147741 + 7.069610 34.859944 37.842481 + 10.350486 40.456093 36.237884 + 19.801801 40.683590 39.924546 + 7.334750 39.747428 31.758286 + 18.418554 30.115213 16.453879 + 5.771517 49.221621 20.668848 + 18.747257 49.783529 38.782999 + 12.681107 36.749221 26.025580 + 18.648049 31.794062 33.729165 + 3.086854 38.310420 27.893166 diff --git a/test/old_tests/inversion_2/fortran/ega5/input/EARTHQUAKES_5.txt b/test/old_tests/inversion_2/fortran/ega5/input/EARTHQUAKES_5.txt new file mode 100644 index 0000000..52269df --- /dev/null +++ b/test/old_tests/inversion_2/fortran/ega5/input/EARTHQUAKES_5.txt @@ -0,0 +1,6 @@ +5 + 12.902894 37.503373 16.794572 + 17.416074 36.974148 25.587149 + 10.553441 48.572870 29.755519 + 17.050082 30.582756 20.557365 + 7.733536 30.049830 22.686053 diff --git a/test/old_tests/inversion_2/fortran/ega5/input/STATIONS.txt b/test/old_tests/inversion_2/fortran/ega5/input/STATIONS.txt new file mode 100644 index 0000000..553c809 --- /dev/null +++ b/test/old_tests/inversion_2/fortran/ega5/input/STATIONS.txt @@ -0,0 +1,61 @@ +60 +0.0 36.472809 29.812050 +0.0 42.546922 16.133799 +0.0 30.991032 23.169443 +0.0 46.965102 39.508986 +0.0 47.511915 37.527905 +0.0 48.435600 20.814328 +0.0 41.863499 15.672084 +0.0 32.635381 25.986810 +0.0 38.657687 39.966088 +0.0 40.746866 34.837968 +0.0 42.548883 27.938223 +0.0 45.654715 39.054882 +0.0 35.547420 37.107352 +0.0 34.000382 19.128119 +0.0 44.563868 35.283488 +0.0 40.983368 32.490992 +0.0 41.849069 38.852775 +0.0 30.415956 28.399387 +0.0 39.547377 26.435165 +0.0 32.064886 30.332071 +0.0 42.476838 23.230493 +0.0 34.956877 26.244838 +0.0 42.093400 15.092363 +0.0 37.363268 23.303628 +0.0 41.913218 33.323567 +0.0 43.569418 26.558183 +0.0 36.206968 29.037593 +0.0 30.241436 25.506620 +0.0 44.117881 30.429571 +0.0 39.517000 34.746538 +0.0 37.361734 22.829658 +0.0 49.421317 23.380557 +0.0 35.352432 34.053354 +0.0 42.126659 22.069541 +0.0 40.290506 34.457216 +0.0 37.633977 35.795705 +0.0 42.640993 22.595143 +0.0 41.972681 38.966854 +0.0 43.073835 35.660796 +0.0 45.484914 23.240725 +0.0 44.787236 30.506240 +0.0 36.156778 18.188633 +0.0 34.670427 29.724995 +0.0 48.621299 19.602209 +0.0 35.103483 16.672438 +0.0 48.315182 37.314071 +0.0 42.367526 34.248809 +0.0 39.728066 28.578711 +0.0 44.531207 26.103171 +0.0 31.457146 27.143870 +0.0 31.580000 17.230000 +0.0 32.120000 19.330000 +0.0 49.220000 16.330000 +0.0 45.630000 18.290000 +0.0 40.870000 19.970000 +0.0 48.740000 27.460000 +0.0 47.520000 32.420000 +0.0 33.250000 33.980000 +0.0 30.990000 34.470000 +0.0 31.120000 39.100000 diff --git a/test/old_tests/inversion_2/fortran/ega5/input/STATIONS_5.txt b/test/old_tests/inversion_2/fortran/ega5/input/STATIONS_5.txt new file mode 100644 index 0000000..aaaa6c4 --- /dev/null +++ b/test/old_tests/inversion_2/fortran/ega5/input/STATIONS_5.txt @@ -0,0 +1,6 @@ +5 +0.0 36.472809 29.812050 +0.0 42.546922 16.133799 +0.0 30.991032 23.169443 +0.0 46.965102 39.508986 +0.0 47.511915 37.527905 diff --git a/test/old_tests/inversion_2/fortran/ega5_sphe_3d_inversion_Tong_3Dinv.f90 b/test/old_tests/inversion_2/fortran/ega5_sphe_3d_inversion_Tong_3Dinv.f90 new file mode 100644 index 0000000..ef6a85d --- /dev/null +++ b/test/old_tests/inversion_2/fortran/ega5_sphe_3d_inversion_Tong_3Dinv.f90 @@ -0,0 +1,737 @@ +include "eikon_solver_mpi.f90" + + +! example: 3-D 3rd order anisotropic eikonal equation in cartesian coordinate (Point source) +! parameter setting: +! domain: R * Theta * Phi = [6275, 6375] * [49^\circ, 51^\circ] * [129^\circ, 131^\circ] +! analytic solution: T = |x-x_s|/c0 +! isotropic eik equ: Tx^2 + Ty^2 + Tz^2 = s^2, +! boundary condition: T(x0,y0,z0) = 0 (point source) +! test function: 'FSM_WENO3_PS_sphe_3d' in "eikon_solver.f90" +! + +program eikonal_2d + use mpi + +! ######################### 参数声明 parameters statement ######################### + + implicit none + + ! mesh grid + integer,parameter :: nr=55,nt=55,np=55 + double precision,parameter :: pi=3.14159265358979323846264338327950288 + double precision,parameter :: rr1=6070,rr2=6400 + double precision,parameter :: tt1=(30.0-1.5)/180*pi,tt2=(50.0+1.5)/180*pi + double precision,parameter :: pp1=(15.0-1.5)/180*pi,pp2=(40.0+1.5)/180*pi + double precision :: rr(nr),tt(nt),pp(np),dr,dt,dp + + + ! source (STATIONS) & receiver (EARTHQUAKES) + integer :: nsou + double precision,allocatable :: rsou(:),tsou(:),psou(:) ! source (station) + integer :: nrec + double precision,allocatable :: rrec(:),trec(:),prec(:) ! receiver (earthquake) + + ! model parameter + double precision,parameter :: gamma = 0.0 + double precision :: xi(nr,nt,np),eta(nr,nt,np),zeta(nr,nt,np) ! syn model (ani) + double precision :: xiT(nr,nt,np),etaT(nr,nt,np),zetaT(nr,nt,np) ! true model (ani) + double precision :: sigma1,sigma2,psi + double precision,parameter :: slow_p=0.04,ani_p=0.03 + + ! Eikonal solver + double precision :: aT(nr,nt,np),bT(nr,nt,np),cT(nr,nt,np),fT(nr,nt,np),funT(nr,nt,np) ! true model 真实模型 + double precision :: a(nr,nt,np),b(nr,nt,np),c(nr,nt,np),f(nr,nt,np),fun(nr,nt,np) ! syn model 猜测模型 + double precision :: uT(nr,nt,np),TableT(nr,nt,np) !true timetable 真实走时场 + double precision :: u(nr,nt,np),Table(nr,nt,np) !syn timetable 猜测走时场 + !double precision :: T0para(8),tau(nr,nt,np) ! multiplicative factor + + ! adjoint source + double precision,allocatable :: sourceADJ(:),TtimeT(:,:),Ttime(:,:) ! adjoint source 伴随源,真实走时,合成走时 + double precision :: TableADJ(nr,nt,np) ! adjoint field 伴随场 + double precision :: Ks(nr,nt,np),Kxi(nr,nt,np),Keta(nr,nt,np) ! event kernel + integer,parameter :: nk = 3 ! number of kernels + double precision :: all_Ks(nr,nt,np),all_Kxi(nr,nt,np),all_Keta(nr,nt,np) ! sensitivity kernel + double precision :: all_Kernel(nr,nt,np,nk) ! kernels for all parameters together + !double precision,parameter :: radius = 40 ! kernel mask radius + + ! inversion grid + integer,parameter :: ninvr=11,ninvt=10,ninvp=10 ! inversion grid size (coarse) + double precision,parameter :: invr1=6070.0,invr2=6400.0 + double precision,parameter :: invt1=30.0/180*pi,invt2=50.0/180*pi + double precision,parameter :: invp1=15.0/180*pi,invp2=40.0/180*pi + integer,parameter :: ngrid=5 ! number of nultigrid (multigrid technique) + double precision :: invr(ngrid,ninvr),invt(ngrid,ninvt),invp(ngrid,ninvp),dinvr,dinvt,dinvp + double precision :: update_value(nr,nt,np,nk) ! parameter update value 更新参数的变化量 + + ! model update (optimization) + double precision :: stepsize ! stepsize + integer,parameter :: MaxIter=1 ! max iteration step + double precision :: old_obj, obj, sou_obj ! 优化目标函数 objective function + double precision,allocatable :: weight_sou(:),weight_rec(:) !weight function + double precision :: dis_ij, dis_zero !weight function + logical :: weight_sou_bool=.false. , weight_rec_bool= .false. + + ! temp var + double precision :: depth,lat,lon + + ! output file + character(Len=80) :: filename,form,form2 + + ! loop index + integer :: iir,iit,iip,idi,idj,idk,i,j,k,iter,igrid + + ! computing time + double precision :: time_begin,time_end,alpha + + ! mpi parameter + integer :: ierr,myid,nproc + + ! ############################# main work ############################# + + call mpi_init(ierr) + + call mpi_comm_rank(mpi_comm_world,myid,ierr) + call mpi_comm_size(mpi_comm_world,nproc,ierr) + + call CPU_TIME(time_begin) ! program start + + + +! ################### read sources and receivers 读取地震台站数据 ################### + open(10,file='ega5/input/STATIONS_5.txt') + read(10,*) nsou + allocate(rsou(nsou),tsou(nsou),psou(nsou),weight_sou(nsou)) + do i=1,nsou + read(10,*) depth,lat,lon + rsou(i) = 6371.0-depth + tsou(i) = lat/180.0*pi + psou(i) = lon/180.0*pi + end do + close(10) + + open(10,file='ega5/input/EARTHQUAKES_5.txt') + read(10,*) nrec + allocate(rrec(nrec),trec(nrec),prec(nrec),weight_rec(nrec)) + do i=1,nrec + read(10,*) depth,lat,lon + rrec(i) = 6371.0-depth + trec(i) = lat/180.0*pi + prec(i) = lon/180.0*pi + end do + close(10) + + ! distance based weight -rec 台站权重 + if (weight_rec_bool) then + dis_zero = 0 + do i=1,nrec-1 + do j=i,nrec + call Epicenter_Distance(trec(i),prec(i),trec(j),prec(j),dis_ij) + dis_zero = dis_zero + dis_ij + end do + end do + dis_zero = dis_zero/nrec/(nrec-1)*2 + dis_zero = dis_zero/2 + + do i=1,nrec + weight_rec(i)=0.0 + do j=1,nrec + call Epicenter_Distance(trec(i),prec(i),trec(j),prec(j),dis_ij) + weight_rec(i) = weight_rec(i) + exp(-(dis_ij/dis_zero)**2) + end do + weight_rec(i) = 1.0/weight_rec(i) + end do + print *, dis_zero + end if + + if (weight_rec_bool) then + ! distance based weight - soruce 地震权重 + dis_zero = 0 + do i=1,nsou-1 + do j=i,nsou + call Epicenter_Distance(tsou(i),psou(i),tsou(j),psou(j),dis_ij) + dis_zero = dis_zero + dis_ij + end do + end do + dis_zero = dis_zero/nsou/(nsou-1)*2 + dis_zero = dis_zero/4 + + do i=1,nsou + weight_sou(i)=0.0 + do j=1,nsou + call Epicenter_Distance(tsou(i),psou(i),tsou(j),psou(j),dis_ij) + weight_sou(i) = weight_sou(i) + exp(-(dis_ij/dis_zero)**2) + end do + weight_sou(i) = 1.0/weight_sou(i) + end do + print *, dis_zero + end if + + ! ---- 记录到 matlab 数据中 matlab record ---- + if (myid .eq. 0) then + open(100,file='ega5/output/STATIONS') + open(101,file='ega5/output/EARTHQUAKES') + do i=1,nsou + write(100,'(f13.7,f13.7,f13.7,f13.7)') rsou(i),tsou(i),psou(i),weight_sou(i) + end do + do i=1,nrec + write(101,'(f13.7,f13.7,f13.7,f13.7)') rrec(i),trec(i),prec(i),weight_rec(i) + end do + close(100);close(101) + end if + +! ######################### 生成网格 build mesh grid ##################################### + ! -------- forward modeling grid ---------- + dr=(rr2-rr1)/(nr-1); dt=(tt2-tt1)/(nt-1); dp=(pp2-pp1)/(np-1) + do iir=1,nr + rr(iir)=rr1+(iir-1)*dr + end do + do iit=1,nt + tt(iit)=tt1+(iit-1)*dt + end do + do iip=1,np + pp(iip)=pp1+(iip-1)*dp + end do + + ! -------- inversion multigrid ---------- + dinvr=(invr2-invr1)/(ninvr-1); dinvt=(invt2-invt1)/(ninvt-1); dinvp=(invp2-invp1)/(ninvp-1) + do igrid=1,ngrid + do iir=1,ninvr + invr(igrid,iir)=invr1+(iir-1)*dinvr-(igrid-1)*dinvr/ngrid + end do + do iit=1,ninvt + invt(igrid,iit)=invt1+(iit-1)*dinvt-(igrid-1)*dinvt/ngrid + end do + do iip=1,ninvp + invp(igrid,iip)=invp1+(iip-1)*dinvp-(igrid-1)*dinvp/ngrid + end do + end do + +! ######################### 构建背景模型 build the synthetic and true model ##################################### + + do iir=1,nr + do iit=1,nt + do iip=1,np + + ! synthetic (initial) model + eta(iir,iit,iip)=0.0; + xi(iir,iit,iip)=0.0; + zeta(iir,iit,iip)=gamma*sqrt(eta(iir,iit,iip)**2+xi(iir,iit,iip)**2) + ! if (rr(iir)>6351) then ! 6371 - 6351 20 km + ! fun(iir,iit,iip) = 1.0/(5.8+(6371-rr(iir))/20.0*0.7) + ! elseif (rr(iir)>6336) then ! 6351 - 6336 15 km + ! fun(iir,iit,iip) = 1.0/(6.5+(6351-rr(iir))/15.0*0.6) + ! elseif (rr(iir)>6251) then ! 6336 - 6251 85 km + ! fun(iir,iit,iip) = 1.0/(8.04+(6336-rr(iir))/85.0*0.01) + ! elseif (rr(iir)>6161) then ! 6251 - 6161 90 km + ! fun(iir,iit,iip) = 1.0/(8.05+(6251-rr(iir))/90.0*0.25) + ! elseif (rr(iir)>5961) then ! 6161 - 5961 200 km + ! fun(iir,iit,iip) = 1.0/(8.30+(6161-rr(iir))/200.0*0.73) + ! else + ! fun(iir,iit,iip) = 1.0/9.03 + ! end if + + if (rr(iir)>6351) then ! 6371 - 6351 20 km + fun(iir,iit,iip) = 1.0/(5.8+(6371-rr(iir))/20.0*0.7) + elseif (rr(iir)>6336) then ! 6351 - 6336 15 km + fun(iir,iit,iip) = 1.0/(6.5+(6351-rr(iir))/15.0*0.6) + elseif (rr(iir)>5961) then ! 6351 - 6336 15 km + fun(iir,iit,iip) = 1.0/(8.0+(6336-rr(iir))/375.0*1) + else + fun(iir,iit,iip) = 1.0/9.0 + end if + + + !read(100,*) xi(iir,iit,iip) + !read(101,*) eta(iir,iit,iip) + !read(102,*) fun(iir,iit,iip) + + a(iir,iit,iip)=1.0+2*zeta(iir,iit,iip); + b(iir,iit,iip)=1.0-2*xi(iir,iit,iip); + c(iir,iit,iip)=1.0+2*xi(iir,iit,iip); + f(iir,iit,iip)=-2*eta(iir,iit,iip); + + Table(iir,iit,iip) = 0 + + + + ! true (target) model + if (tt(iit)>=30.0/180*pi .and. tt(iit)<=50.0/180*pi .and. & + & pp(iip)>=15.0/180*pi .and. pp(iip)<=40.0/180*pi .and. & + & rr(iir)>=6211.0 .and. rr(iir)<=6371.0 ) then + sigma1 = sin(4*pi*(tt(iit)-30.0/180*pi)/(20.0/180*pi))* & + & sin(4*pi*(pp(iip)-15.0/180*pi)/(25.0/180*pi))* & + & sin(2*pi*(rr(iir)-6211)/160.0) + else + sigma1 = 0.0 + end if + + + if (sigma1<0) then + psi = 60.0/180*pi + elseif (sigma1 > 0) then + psi = 150.0/180*pi + else + psi = 0 + end if + + etaT(iir,iit,iip)=ani_p*abs(sigma1)*sin(2*psi); + xiT(iir,iit,iip)=ani_p*abs(sigma1)*cos(2*psi); + zetaT(iir,iit,iip)=gamma*sqrt(etaT(iir,iit,iip)**2+xiT(iir,iit,iip)**2) + + aT(iir,iit,iip)=1.0+2*zetaT(iir,iit,iip); + bT(iir,iit,iip)=1.0-2*xiT(iir,iit,iip); + cT(iir,iit,iip)=1.0+2*xiT(iir,iit,iip); + fT(iir,iit,iip)=-2*etaT(iir,iit,iip); + funT(iir,iit,iip) = fun(iir,iit,iip)/(1+sigma1*slow_p) + + !fun(iir,iit,iip) = funT(iir,iit,iip) + !eta(iir,iit,iip)=etaT(iir,iit,iip); + !xi(iir,iit,iip)=xiT(iir,iit,iip); + !zeta(iir,iit,iip)=zetaT(iir,iit,iip) + !a(iir,iit,iip)=aT(iir,iit,iip) + !b(iir,iit,iip)=bT(iir,iit,iip) + !c(iir,iit,iip)=cT(iir,iit,iip) + !f(iir,iit,iip)=fT(iir,iit,iip) + + TableT(iir,iit,iip) = 0 + u(iir,iit,iip) = 0 + + end do + end do + end do + + + + ! ---- 记录到 matlab 数据中 matlab record ---- + if (myid==0) then + open(100,file='ega5/output/model_true') + open(101,file='ega5/output/model_init') + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & rr(iir),tt(iit),pp(iip), & + & funT(iir,iit,iip),xiT(iir,iit,iip),etaT(iir,iit,iip) + write(101,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & rr(iir),tt(iit),pp(iip), & + & fun(iir,iit,iip),xi(iir,iit,iip),eta(iir,iit,iip) + end do + end do + end do + close(100);close(101) + + ! --------- 多重网格 multiple grid ------ + do igrid=1,Ngrid + select case(igrid) + case (1:9) + write(form,'(I1)') igrid + case (10:99) + write(form,'(I2)') igrid + end select + open(100,file='ega5/output/multigrid'//trim(form)) + + do iir=1,ninvr + do iit=1,ninvt + do iip=1,ninvp + write(100,'(f13.7,f13.7,f13.7)') & + & invr(igrid,iir),invt(igrid,iit),invp(igrid,iip) + end do + end do + end do + close(100) + end do + + end if + + +! ######################### 计算真实到时 calculate true traveltimes ###################### + call mpi_barrier(mpi_comm_world,ierr) + allocate(TtimeT(nsou,nrec)) ! 初始化真实到时表 initiate true traveltimes + allocate(Ttime(nsou,nrec)) ! 初始化合成到时表 initiate syn traveltimes + allocate(sourceADJ(nrec)) ! 初始化伴随源 initiate adjoint source + + if (myid==0) then + print *, ' ' + print *, '----------------- calculating true timetable ... ----------------' + print *, ' ' + end if + + do i=1,nsou ! loop sources (STATIONS) + ! -------- 求解程函方程 solve eikonal equations ------------ + call mpi_barrier(mpi_comm_world,ierr) + !rsou(i)=6371.0; tsou(i)=30.5/180.0*pi; psou(i)=15.5/180.0*pi + call FSM_WENO3_PS_sphe_3d_mul_mpi(rr,tt,pp,nr,nt,np,aT,bT,cT,fT,TableT,funT,rsou(i),tsou(i),psou(i),u) + call mpi_barrier(mpi_comm_world,ierr) + ! -------- 得到真实走时 calculate true arrival time at receiver -------- + call Linear_Interp_3D(rr,tt,pp,TableT,nr,nt,np,rrec,trec,prec,TtimeT(i,:),nrec) + !if ((myid.eq.0) .and. 1>0) then + ! print *, rsou(i),tsou(i)/pi*180,psou(i)/pi*180 + ! open(100,file='ega5/output/arrivaltime') + ! do j=1,nrec + ! write(100,'(i5.3,f8.2,f6.2,f6.2,f8.3)') j, rrec(j),trec(j)/pi*180,prec(j)/pi*180,TtimeT(i,j) + ! end do + ! close(100) + !end if + end do + + print *, '----------------- calculating true timetable over ---------------- ' + +! ######################## 反演开始 inversion start ########################## + + ! ----- 初始化反演参数 initiate inversion parameters ---- + stepsize = 0.01 ! 迭代步长 stepsize + old_obj = 0; obj = 0 ! 目标函数 objective function + + + + if (myid .eq. 0) then + print *, ' ' + print *, '----------------- inversion start ... ----------------' + print *, ' ' + end if + + + + do iter = 1,MaxIter + call mpi_barrier(mpi_comm_world,ierr) + if (myid .eq. 0) then + print *, '----------------- iteration ',iter,' starting ... ----------------' + end if + + ! ----- 初始化参数 initiate parameters ------ + all_Ks = 0; all_Kxi = 0; all_Keta = 0; + obj = 0; + + if (myid .eq. 0) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + end select + filename='ega5/output/misfit_step'//trim(form) + open(998, file=trim(filename)) + end if + + + do i=1,nsou ! loop sources (STATIONS) + +! ######################## 计算合成走时场 calculate synthetic timetable ######################## + if (myid .eq. 0) then + print *, '----------------- calculating synthetic timetable ... ----------------' + end if + + Table = 20 + call mpi_barrier(mpi_comm_world,ierr) + call FSM_WENO3_PS_sphe_3d_mul_mpi(rr,tt,pp,nr,nt,np,a,b,c,f,Table,fun,rsou(i),tsou(i),psou(i),u) + call mpi_barrier(mpi_comm_world,ierr) + ! -------- 得到合成走时 calculate synthetic arrival time at receiver -------- + call Linear_Interp_3D(rr,tt,pp,Table,nr,nt,np,rrec,trec,prec,Ttime(i,:),nrec) + + ! -------- 构造伴随源 build adjoint source ------- + call Adjoint_Source_Dt(Ttime(i,:),TtimeT(i,:),nrec,sourceADJ,sou_obj) ! absolute traveltime difference + if (myid .eq. 0) then + do j=1,nrec + write(998,'(f10.5)') Ttime(i,j)-TtimeT(i,j) + end do + end if + + ! weighting adjoint source + if (weight_rec_bool) then + do j=1,nrec + sourceADJ(j) = sourceADJ(j) * weight_rec(j) + end do + end if + + if (1>0 .and. (myid .eq. 0)) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + end select + select case (i) + case (1:9) + write(form2,'(I1)') i + case (10:99) + write(form2,'(I2)') i + end select + filename='ega5/output/syn_step'//trim(form)//'_event'//trim(form2) + open(100,file=trim(filename)) + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7)') Table(iir,iit,iip) + end do + end do + end do + close(100) + end if +! + + !print *, Ttime(i,:),TtimeT(i,:) + !call Adjoint_Source_Ddt(Ttime(i,:),TtimeT(i,:),nrec,sourceADJ,sou_obj) ! double difference traveltime + !do j=1,nrec-1 + ! do k=j,nrec + ! write(998,'(f10.5)') (Ttime(i,j)-Ttime(i,k))-(TtimeT(i,j)-TtimeT(i,k)) + ! end do + !end do + +! ######################## 计算伴随场 adjoint field ######################## + if (myid .eq. 0) then + ! print *, '----------------- calculating adjoint field ... ----------------' + end if + call FSM_O1_Adj_sphe_3d(rr,tt,pp,nr,nt,np,Table,TableADJ,zeta,xi,eta,nrec,rrec,trec,prec,sourceADJ) + !call FSM_O1_Adj_PS_sphe_3d(rr,tt,pp,nr,nt,np,T0para,tau,TableADJ,zeta,xi,eta,nrec,rrec,trec,prec,sourceADJ) + ! ---- 记录到 matlab 数据中 matlab record (adjoint field) ---- + if (1>0 .and. (myid .eq. 0)) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + end select + select case (i) + case (1:9) + write(form2,'(I1)') i + case (10:99) + write(form2,'(I2)') i + end select + filename='ega5/output/adj_step'//trim(form)//'_event'//trim(form2) + open(100,file=trim(filename)) + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7)') TableADJ(iir,iit,iip) + end do + end do + end do + close(100) + end if +! ######################## 计算敏感核 sensitivity kernel ######################## + !print *, '----------------- calculating kernel ... ----------------' + call Sensitivity_Kernel(rr,tt,pp,nr,nt,np,Table,TableADJ,gamma,xi,eta,fun,Ks,Kxi,Keta) + + ! ------- 抹去伴随源处的大函数值 mask the source ------- + !print *, '----------------- kernel mask ----------------' + !call Kernel_Mask(rr,tt,pp,nr,nt,np,Ks,rsou(i),tsou(i),psou(i),radius) + !call Kernel_Mask(rr,tt,pp,nr,nt,np,Kxi,rsou(i),tsou(i),psou(i),radius) + !call Kernel_Mask(rr,tt,pp,nr,nt,np,Keta,rsou(i),tsou(i),psou(i),radius) + call Kernel_Mask_new(rr,tt,pp,nr,nt,np,Ks,rsou(i),tsou(i),psou(i)) + call Kernel_Mask_new(rr,tt,pp,nr,nt,np,Kxi,rsou(i),tsou(i),psou(i)) + call Kernel_Mask_new(rr,tt,pp,nr,nt,np,Keta,rsou(i),tsou(i),psou(i)) + + ! ---- 记录到 matlab 数据中 matlab record (adjoint field) ---- + if (1<0 .and. myid .eq. 0) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + end select + select case (i) + case (1:9) + write(form2,'(I1)') i + case (10:99) + write(form2,'(I2)') i + end select + filename='ega5/output/kernel_step'//trim(form)//'_event'//trim(form2) + open(100,file=trim(filename)) + + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & rr(iir),tt(iit),pp(iip), & + & Ks(iir,iit,iip),Kxi(iir,iit,iip),Keta(iir,iit,iip) + end do + end do + end do + close(100) + end if + + ! --------- 敏感核,obj叠加 sum kernels and objective function ------- + if (weight_sou_bool) then ! no weight + all_Ks = all_Ks + Ks * weight_sou(i); + all_Kxi = all_Kxi + Kxi * weight_sou(i); + all_Keta = all_Keta + Keta * weight_sou(i); + obj = obj + sou_obj !* weight_sou(i) + else ! source weighted + all_Ks = all_Ks + Ks; + all_Kxi = all_Kxi + Kxi; + all_Keta = all_Keta + Keta; + obj = obj + sou_obj + end if + + end do + + close(998) + + ! ---- 记录到 matlab 数据中 matlab record (kernel) ---- + if (1>0 .and. myid .eq. 0) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + end select + filename='ega5/output/kernel_step'//trim(form)//'_sum' + open(100,file=trim(filename)) + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & rr(iir),tt(iit),pp(iip), & + & all_Ks(iir,iit,iip),all_Kxi(iir,iit,iip),all_Keta(iir,iit,iip) + end do + end do + end do + close(100) + end if +! ##################### 模型更新 model update #################### + print *, '----------------- model updating ... ----------------' + + all_Kernel(:,:,:,1) = all_Ks; + all_Kernel(:,:,:,2) = all_Kxi; + all_Kernel(:,:,:,3) = all_Keta; + + ! ------------ 更新速度(慢度) update velocity (slowness) ------------ + call Parameter_Update_Multigrid(rr,tt,pp,nr,nt,np,all_Kernel,nk, & + & invr,invt,invp,ninvr,ninvt,ninvp,ngrid,stepsize,update_value) + + if (1<0 .and. myid .eq. 0) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + end select + filename='ega5/output/model_update_step'//trim(form) + open(100,file=trim(filename)) + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & rr(iir),tt(iit),pp(iip), & + & -fun(iir,iit,iip)*update_value(iir,iit,iip,1), & + & -update_value(iir,iit,iip,2),-update_value(iir,iit,iip,3) + end do + end do + end do + close(100) + end if + + do iir=1,nr + do iit=1,nt + do iip=1,np + fun(iir,iit,iip) = fun(iir,iit,iip)*(1-update_value(iir,iit,iip,1)) + !fun(iir,iit,iip) = fun(iir,iit,iip) + end do + end do + end do + + ! ------------ 更新xi update xi ------------ + do iir=1,nr + do iit=1,nt + do iip=1,np + xi(iir,iit,iip) = xi(iir,iit,iip)-update_value(iir,iit,iip,2) + end do + end do + end do + + ! ------------ 更新eta update eta ------------ + do iir=1,nr + do iit=1,nt + do iip=1,np + eta(iir,iit,iip) = eta(iir,iit,iip)-update_value(iir,iit,iip,3) + end do + end do + end do + + ! ----------- 更新 update eikonal solver paramater ----------------- + do iir=1,nr + do iit=1,nt + do iip=1,np + b(iir,iit,iip)=1.0-2*xi(iir,iit,iip); + c(iir,iit,iip)=1.0+2*xi(iir,iit,iip); + f(iir,iit,iip)=-2*eta(iir,iit,iip); + end do + end do + end do + + + + +! ##################### 调整下降步长 modify stepsize ############# + if (myid .eq. 0) then + print *, ' ' + end if + + if (1>0 .and. (myid .eq. 0)) then + open(999,file='ega5/output/obj',access='append') + write(999,'(f9.2,f9.6)') obj, stepsize + close(999) + end if + + if (iter == 1 ) then + if (myid .eq. 0) then + write(*,'(a,f9.2)') 'iter 1, obj is', obj + write(*,'(a,f9.6)') 'iter 1, stepsize is', stepsize + end if + elseif (iter >= 2 .and. obj < old_obj) then + !stepsize = min(0.01,stepsize*1.2) + if (myid .eq. 0) then + write(*,'(a,f9.2,a,f9.2)') 'objective function decreases, from', old_obj, ' to', obj + write(*,'(a,f9.6)') 'new stepsize is ', stepsize + end if + elseif (iter >= 2 .and. obj >= old_obj) then + !stepsize = max(0.002,stepsize*0.5) + if (myid .eq. 0) then + write(*,'(a,f9.2,a,f9.2)') 'objective function increases, from', old_obj, ' to', obj + write(*,'(a,f9.6)') 'new stepsize is ', stepsize + end if + end if + + print *, '----------------- iteration ',iter,' over ----------------' + print *, ' ' + print *, ' ' + + + old_obj = obj + + ! ---- 记录到 matlab 数据中 matlab record ---- + if (1>0 .and. (myid .eq. 0)) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + end select + filename='ega5/output/model_step'//trim(form) + open(100,file=trim(filename)) + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & rr(iir),tt(iit),pp(iip), & + & fun(iir,iit,iip),xi(iir,iit,iip),eta(iir,iit,iip) + end do + end do + end do + close(100) + end if + + + if (myid .eq. 0) then + call CPU_TIME(time_end) + write(*,'(f10.2)') time_end - time_begin + end if + + end do + + + call mpi_finalize(ierr) + +end program eikonal_2d + diff --git a/test/old_tests/inversion_2/fortran/eikon_solver_mpi.f90 b/test/old_tests/inversion_2/fortran/eikon_solver_mpi.f90 new file mode 100644 index 0000000..b83ffe8 --- /dev/null +++ b/test/old_tests/inversion_2/fortran/eikon_solver_mpi.f90 @@ -0,0 +1,2836 @@ +! 3-D third order LF scheme (point source, sphere, 2nd order accuracy, parallel) (verified by ega1) +subroutine FSM_WENO3_PS_sphe_3d_mul_mpi(rr,tt,pp,nr,nt,np,spha,sphb,sphc,sphf,T,fun,r0,t0,p0,u) + + use mpi + ! a -d -e + ! -d b -f + ! -e -f c + integer nr,nt,np + double precision :: dr,dt,dp,rr(nr),tt(nt),pp(np),a(nr,nt,np),b(nr,nt,np),c(nr,nt,np),f(nr,nt,np) + double precision :: spha(nr,nt,np),sphb(nr,nt,np),sphc(nr,nt,np),sphf(nr,nt,np) + double precision :: fun(nr,nt,np),T(nr,nt,np),ischange(nr,nt,np),u(nr,nt,np),xi(nr,nt,np),eta(nr,nt,np) + double precision :: r1,r2,r3,a0,b0,c0,d0,f0,T0v(nr,nt,np),T0r(nr,nt,np),T0t(nr,nt,np),T0p(nr,nt,np) + double precision :: tau(nr,nt,np),tau_old(nr,nt,np),r0,t0,p0 + integer :: idr0,idt0,idp0 + double precision :: sigr,sigt,sigp,coe,pr1,pr2,wr1,wr2,pt1,pt2,wt1,wt2,pp1,pp2,wp1,wp2,tpT + double precision :: L1_dif,Linf_dif,L1_err,Linf_err + double precision :: t1,p1 + double precision,parameter :: tol = (10.0)**(-4),eps=10.0**(-12) + integer,parameter :: MaxIter=1000 + integer iter,rdirec,tdirec,pdirec,iir,iit,iip + double precision :: x0,y0,z0,x,y,z,xst,yst,zst,e11,e12,e13,e21,e22,e23,e31,e32,e33 + double precision :: xstr,xstt,xstp,ystr,ystt,ystp,zstr,zstt,zstp + integer :: ileft,iright,jleft,jright,ii,jj,kk + logical :: isexit + + integer :: ierr,myid,nproc,tag,istat(mpi_status_size),iproc,ptid(nr,np,nt) + integer :: mpi_ptijk(3,np*nt),mpi_ptn,ipt,int_temp,my_npt + double precision :: mpi_ptv(np*nt),dp_temp + + integer :: ptr1,ptr2,iNumber,total_ptn,Nptn,sNptn,tpNptn + double precision :: ave_ni + integer,allocatable :: proc_irange(:,:,:) + + + isexit = .false. + tag=99 + call mpi_comm_rank(mpi_comm_world,myid,ierr) + call mpi_comm_size(mpi_comm_world,nproc,ierr) + + + ! ------------------------ 构造网格 ------------------------ + dr=rr(2)-rr(1); dt=tt(2)-tt(1); dp=pp(2)-pp(1) + + ! ------------------------ 构造矩阵 ------------------------- + ! a -d -e + ! -d b -f + ! -e -f c + + ! ------------------------ 构造 T0 ------------------------ + + ! 震源处参数离散化 + idr0=floor((r0-rr(1))/dr+1); idt0=floor((t0-tt(1))/dt+1); idp0=floor((p0-pp(1))/dp+1); + r1 = min(1.0,(r0-rr(idr0))/dr); r2 = min(1.0,(t0-tt(idt0))/dt); r3 = min(1.0,(p0-pp(idp0))/dp); + + do iir=1,nr + do iit=1,nt + do iip=1,np + a(iir,iit,iip) = spha(iir,iit,iip) + b(iir,iit,iip) = sphb(iir,iit,iip)/(rr(iir)**2) + c(iir,iit,iip) = sphc(iir,iit,iip)/(rr(iir)**2*cos(tt(iit))**2) + f(iir,iit,iip) = sphf(iir,iit,iip)/(rr(iir)**2*cos(tt(iit))) + end do + end do + end do + + a0=(1-r1)*(1-r2)*(1-r3)*a(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*a(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*a(idr0,idt0+1,idp0)+(1-r1)*r2*r3*a(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*a(idr0+1,idt0,idp0)+r1*(1-r2)*r3*a(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*a(idr0+1,idt0+1,idp0)+r1*r2*r3*a(idr0+1,idt0+1,idp0+1) + + b0=(1-r1)*(1-r2)*(1-r3)*b(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*b(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*b(idr0,idt0+1,idp0)+(1-r1)*r2*r3*b(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*b(idr0+1,idt0,idp0)+r1*(1-r2)*r3*b(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*b(idr0+1,idt0+1,idp0)+r1*r2*r3*b(idr0+1,idt0+1,idp0+1) + + c0=(1-r1)*(1-r2)*(1-r3)*c(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*c(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*c(idr0,idt0+1,idp0)+(1-r1)*r2*r3*c(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*c(idr0+1,idt0,idp0)+r1*(1-r2)*r3*c(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*c(idr0+1,idt0+1,idp0)+r1*r2*r3*c(idr0+1,idt0+1,idp0+1) + + f0=(1-r1)*(1-r2)*(1-r3)*f(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*f(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*f(idr0,idt0+1,idp0)+(1-r1)*r2*r3*f(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*f(idr0+1,idt0,idp0)+r1*(1-r2)*r3*f(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*f(idr0+1,idt0+1,idp0)+r1*r2*r3*f(idr0+1,idt0+1,idp0+1) + !d0=-d0 + + fun0=(1-r1)*(1-r2)*(1-r3)*fun(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*fun(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*fun(idr0,idt0+1,idp0)+(1-r1)*r2*r3*fun(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*fun(idr0+1,idt0,idp0)+r1*(1-r2)*r3*fun(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*fun(idr0+1,idt0+1,idp0)+r1*r2*r3*fun(idr0+1,idt0+1,idp0+1) + + + + ! 构造T0 + do iir=1,nr + do iit=1,nt + do iip=1,np + r1 = rr(iir) + t1 = tt(iit) + p1 = pp(iip) + + T0v(iir,iit,iip) = fun0*sqrt( 1.0/a0*(r1-r0)**2 + c0/(c0*b0-f0**2)*(t1-t0)**2 & + & + b0/(c0*b0-f0**2)*(p1-p0)**2 + 2*f0/(c0*b0-f0**2)*(t1-t0)*(p1-p0) ) + ischange(iir,iit,iip)=1 + if ( T0v(iir,iit,iip)==0 ) then + T0r(iir,iit,iip) = 0 + T0t(iir,iit,iip) = 0 + T0p(iir,iit,iip) = 0 + else + T0r(iir,iit,iip) = fun0**2*(1.0/a0*(r1-r0))/T0v(iir,iit,iip) + T0t(iir,iit,iip) = fun0**2*(c0/(c0*b0-f0**2)*(t1-t0)+f0/(c0*b0-f0**2)*(p1-p0))/T0v(iir,iit,iip) + T0p(iir,iit,iip) = fun0**2*(b0/(c0*b0-f0**2)*(p1-p0)+f0/(c0*b0-f0**2)*(t1-t0))/T0v(iir,iit,iip) + end if + + + if ( abs((rr(iir)-r0)/dr)<=2 .and. abs((tt(iit)-t0)/dt)<=2 .and. abs((pp(iip)-p0)/dp)<= 2) then + tau(iir,iit,iip) = 1 !震源周围几个点,直接认为是常速度结构,给出解析解,即和T0相等 + !tau(iir,iit,iip) = u(iir,iit,iip) - T0v(iir,iit,iip) + ischange(iir,iit,iip)=0 + if (iir==1 .or. iir==nr .or. iit==1 .or. iit==nt .or. iip==1 .or. iip==np) then + write(*,*) 'source on the boundary, mesh error' + print *, rr(iir),t0*180/3.1415927,iit,p0*180/3.1415927,iip + ! pause + end if + !write(*,*) iir-idr0,iit-idt0,iip-idp0,u(iir,iit,iip),T0v(iir,iit,iip),u(iir,iit,iip)-T0v(iir,iit,iip) + else + !tau(iir,iit,iip) = T(iir,iit,iip)/T0v(iir,iit,iip) + tau(iir,iit,iip) = 1 + ischange(iir,iit,iip)=1 + end if + end do + end do + end do + + + L1_err=0; Linf_err=0 + do iir=1,nr + do iit=1,nt + do iip=1,np + L1_err=L1_err+abs(u(iir,iit,iip)-T0v(iir,iit,iip)) + Linf_err=max(Linf_err,abs(T0v(iir,iit,iip)-u(iir,iit,iip))) + if(isnan(L1_err)) then + print *, u(iir,iit,iip),T0v(iir,iit,iip) + pause + end if + end do + end do + end do + L1_err = L1_err/(nr*np*nt) + !if (myid .eq. 0) then + ! write(*,*) 'T0 L1 error is ',L1_err,', T0 Linf error is', Linf_err + !end if + + allocate(proc_irange(2,nproc,nr+nt+np-3-6+1)) + + ! 给每个线程分配计算点 + Nptn=0 + sNptn=0 + + do level = 6,nr+nt+np-3 + ileft = max(2,level-np-nt+2) + iright = min(level-4,nr-1) + + iNumber = iright - ileft + 1 + + total_ptn = 0 + do ip = ileft,iright + total_ptn = total_ptn+(min(level-ip-2,nt-1)-max(2,level-ip-np+1)+1) + end do + Nptn = Nptn + total_ptn ! 总点数 + ave_ni = total_ptn*1.0/nproc + + if (iNumber <= nproc) then + ! 即i的数量小于等于线程数,每个线程分配一个i就好 + tpNptn = 0 + MaxtpNptn = 0 + do ip = ileft,iright + proc_irange(:,ip-ileft+1,level-5)=(/ip,ip/) + tpNptn = (min(level-ip-2,nt-1)-max(2,level-ip-np+1)+1) + MaxtpNptn = max(MaxtpNptn,tpNptn) + end do + do ip = iright+1,ileft+nproc-1 + proc_irange(:,ip-ileft+1,level-5)=(/-1,-2/) + end do + sNptn = sNptn + MaxtpNptn + else + !if (myid .eq. 0) then + ! print *, ileft,iright + !end if + !call sleep(2) + + ! i的数量大于线程数,平均分配,接近 total_ptn/nproc + int_temp = 0 + tpNptn = 0 + MaxtpNptn = 0 + ptr1 = ileft + iproc = 1 + do ptr2 = ileft,iright + int_temp = int_temp + (min(level-ptr2-2,nt-1)-max(2,level-ptr2-np+1)+1) + tpNptn = tpNptn + (min(level-ptr2-2,nt-1)-max(2,level-ptr2-np+1)+1) + !if (myid .eq. 0) then + ! print *, ptr2,(min(level-ptr2-2,nt-1)-max(2,level-ptr2-np+1)+1),int_temp,ave_ni + !end if + !call sleep(2) + if ((int_temp>=ave_ni*iproc) .or. (ptr2 .eq.iright)) then + !if (iproc>nproc) then + ! print *, iproc,nproc + !end if + proc_irange(:,iproc,level-5) = (/ptr1,ptr2/) + ptr1 = ptr2+1 + iproc = iproc +1 + MaxtpNptn = max(MaxtpNptn,tpNptn) + tpNptn = 0 + end if + end do + sNptn = sNptn + MaxtpNptn + !call sleep(2) + end if + !if (myid .eq. 0) then + ! print *, proc_irange(1,:,level-5) + ! print *, proc_irange(2,:,level-5) + ! print *, ' ' + !end if + end do + + ! print *, Nptn*1.0/sNptn + + + ! 正式迭代,更新tau + do iter =1,MaxIter + tau_old = tau + L1_dif=0; Linf_dif=0;L1_err=0;Linf_err=0; + + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + my_npt = 0 + do level = 6,nr+nt+np-3 + ! 2<= ir <= nr-1; 2<= it <= nr-1; 2<=ip <=np-1 + + ileft = max(2,level-np-nt+2) + iright = min(level-4,nr-1) + + mpi_ptn=0 + do ii = proc_irange(1,myid+1,level-5),proc_irange(2,myid+1,level-5) + + jleft = max(2,level-ii-np+1) + jright = min(level-ii-2,nt-1) + do jj = jleft,jright + + kk = level-ii-jj + + if(rdirec<0) then + iir=ii + else + iir=nr+1-ii + end if + if(tdirec<0) then + iit=jj + else + iit=nt+1-jj + end if + if(pdirec<0) then + iip=kk + else + iip=np+1-kk + end if + + + if(ischange(iir,iit,iip)==1) then + + + !sigr=2*sqrt(a(iir,iit,iip)); sigt=2*sqrt(b(iir,iit,iip)); sigp=2*sqrt(c(iir,iit,iip)) + !coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + sigr = 2*sqrt(a(iir,iit,iip))*T0v(iir,iit,iip) + sigt = 2*sqrt(b(iir,iit,iip))*T0v(iir,iit,iip) + sigp = 2*sqrt(c(iir,iit,iip))*T0v(iir,iit,iip) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + ! 构造单方向梯度 3阶 WENO 格式 + + if (iir==2) then + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + wr2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir+1,iit,iip)+tau(iir+2,iit,iip))**2)/ & + & (eps+(tau(iir-1,iit,iip)-2*tau(iir,iit,iip)+tau(iir+1,iit,iip))**2))**2) + pr2=(1-wr2)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr2*(-3*tau(iir,iit,iip)+4*tau(iir+1,iit,iip)-tau(iir+2,iit,iip))/2/dr; + elseif (iir==nr-1) then + wr1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))**2)/ & + & (eps+(tau(iir+1,iit,iip)-2*tau(iir,iit,iip)+tau(iir-1,iit,iip))**2))**2) + pr1=(1-wr1)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr1*(3*tau(iir,iit,iip)-4*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))/2/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + else + wr1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))**2)/ & + & (eps+(tau(iir+1,iit,iip)-2*tau(iir,iit,iip)+tau(iir-1,iit,iip))**2))**2) + pr1=(1.0-wr1)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr1*(3*tau(iir,iit,iip)-4*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))/2/dr; + wr2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir+1,iit,iip)+tau(iir+2,iit,iip))**2)/ & + & (eps+(tau(iir-1,iit,iip)-2*tau(iir,iit,iip)+tau(iir+1,iit,iip))**2))**2) + pr2=(1.0-wr2)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr2*(-3*tau(iir,iit,iip)+4*tau(iir+1,iit,iip)-tau(iir+2,iit,iip))/2/dr; + end if + + if (iit==2) then + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + wt2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit+1,iip)+tau(iir,iit+2,iip))**2)/ & + & (eps+(tau(iir,iit-1,iip)-2*tau(iir,iit,iip)+tau(iir,iit+1,iip))**2))**2) + pt2=(1-wt2)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt2*(-3*tau(iir,iit,iip)+4*tau(iir,iit+1,iip)-tau(iir,iit+2,iip))/2/dt; + elseif (iit==nt-1) then + wt1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))**2)/ & + & (eps+(tau(iir,iit+1,iip)-2*tau(iir,iit,iip)+tau(iir,iit-1,iip))**2))**2) + pt1=(1-wt1)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt1*(3*tau(iir,iit,iip)-4*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))/2/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + else + wt1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))**2)/ & + & (eps+(tau(iir,iit+1,iip)-2*tau(iir,iit,iip)+tau(iir,iit-1,iip))**2))**2) + pt1=(1-wt1)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt1*(3*tau(iir,iit,iip)-4*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))/2/dt; + wt2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit+1,iip)+tau(iir,iit+2,iip))**2)/ & + & (eps+(tau(iir,iit-1,iip)-2*tau(iir,iit,iip)+tau(iir,iit+1,iip))**2))**2) + pt2=(1-wt2)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt2*(-3*tau(iir,iit,iip)+4*tau(iir,iit+1,iip)-tau(iir,iit+2,iip))/2/dt; + end if + + if (iip==2) then + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + wp2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip+1)+tau(iir,iit,iip+2))**2)/ & + & (eps+(tau(iir,iit,iip-1)-2*tau(iir,iit,iip)+tau(iir,iit,iip+1))**2))**2) + pp2=(1-wp2)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp2*(-3*tau(iir,iit,iip)+4*tau(iir,iit,iip+1)-tau(iir,iit,iip+2))/2/dp; + elseif (iip==np-1) then + wp1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))**2)/ & + & (eps+(tau(iir,iit,iip+1)-2*tau(iir,iit,iip)+tau(iir,iit,iip-1))**2))**2) + pp1=(1-wp1)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp1*(3*tau(iir,iit,iip)-4*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))/2/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + else + wp1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))**2)/ & + & (eps+(tau(iir,iit,iip+1)-2*tau(iir,iit,iip)+tau(iir,iit,iip-1))**2))**2) + pp1=(1-wp1)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp1*(3*tau(iir,iit,iip)-4*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))/2/dp; + wp2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip+1)+tau(iir,iit,iip+2))**2)/ & + & (eps+(tau(iir,iit,iip-1)-2*tau(iir,iit,iip)+tau(iir,iit,iip+1))**2))**2) + pp2=(1-wp2)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp2*(-3*tau(iir,iit,iip)+4*tau(iir,iit,iip+1)-tau(iir,iit,iip+2))/2/dp; + end if + + !计算 LF Hamiltonian + + !Htau=sqrt( a(iir,iit,iip)*((pr1+pr2)/2)**2 + b(iir,iit,iip)*((pt1+pt2)/2)**2 & + !& + c(iir,iit,iip)*((pp1+pp2)/2)**2 -2*f(iir,iit,iip)*(pt1+pt2)/2*(pp1+pp2)/2 & + !& + a(iir,iit,iip)*(pr1+pr2)*T0r(iir,iit,iip) & + !& + b(iir,iit,iip)*(pt1+pt2)*T0t(iir,iit,iip) - f(iir,iit,iip)*(pt1+pt2)*T0p(iir,iit,iip) & + !& + c(iir,iit,iip)*(pp1+pp2)*T0p(iir,iit,iip) - f(iir,iit,iip)*(pp1+pp2)*T0t(iir,iit,iip) & + !& + a(iir,iit,iip)*T0r(iir,iit,iip)**2 & + !& + b(iir,iit,iip)*T0t(iir,iit,iip)**2 + c(iir,iit,iip)*T0p(iir,iit,iip)**2 & + !& - 2*f(iir,iit,iip)*T0t(iir,iit,iip)*T0p(iir,iit,iip) ) + + Htau = sqrt( & + & a(iir,iit,iip)*(T0r(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pr1+pr2)/2)**2 & + & + b(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2)**2 & + &-2*f(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2) & + & *(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2) ) + + + ! 更新 timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + !write(*,*) fun(iir,iit,iip),Htau + + tau(iir,iit,iip) = tpT + + + mpi_ptn=mpi_ptn+1 + mpi_ptijk(:,mpi_ptn) = (/iir,iit,iip/) + mpi_ptv(mpi_ptn) = tpT + my_npt = my_npt + 1 + end if + end do + end do + + !if (1>2) then + ! 数据通信 步骤1, 其他线程传输给主线程 + if (myid .eq. 0) then + ! 负责接受数据 + do iproc=1,nproc-1 + call mpi_recv(int_temp,1,mpi_integer,iproc,tag,mpi_comm_world,istat,ierr) + if (int_temp .ne. 0) then + call mpi_recv(mpi_ptijk(1,mpi_ptn+1),int_temp*3,mpi_integer,iproc,tag+1, & + & mpi_comm_world,istat,ierr) + call mpi_recv(mpi_ptv(mpi_ptn+1),int_temp,mpi_double_precision,iproc,tag+2, & + & mpi_comm_world,istat,ierr) + ! 接收完数据,赋值 + do ipt=mpi_ptn+1,mpi_ptn+int_temp + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + mpi_ptn = mpi_ptn + int_temp + end if + end do + else + ! 负责发送数据 + call mpi_send(mpi_ptn,1,mpi_integer,0,tag,mpi_comm_world,ierr) + !print *, mpi_ptn, mpi_ptijk(:,1:mpi_ptn), mpi_ptv(1:mpi_ptn) + if (mpi_ptn .ne. 0) then + call mpi_send(mpi_ptijk,3*mpi_ptn,mpi_integer,0,tag+1,mpi_comm_world,ierr) + call mpi_send(mpi_ptv,mpi_ptn,mpi_double_precision,0,tag+2,mpi_comm_world,ierr) + end if + end if + + ! 数据通信 步骤2, 主线程将更新后的level数据广播到其他线程 + + call mpi_bcast(mpi_ptn,1,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptijk,3*mpi_ptn,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptv,mpi_ptn,mpi_double_precision,0,mpi_comm_world,ierr) + + ! 数据广播完成,开始赋值 + if (myid .ne. 0) then + do ipt=1,mpi_ptn + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + end if + + call mpi_barrier(mpi_comm_world,ierr) + !end if + end do + + ! print *, my_npt, Nptn + + ! 处理边界 + + do iit=1,nt + do iip=1,np + if (tau(3,iit,iip)>0) then + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + else + tau(1,iit,iip) = min(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + end if + if (tau(nr-2,iit,iip)>0) then + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + else + tau(nr,iit,iip) = min(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + end if + end do + end do + do iir=1,nr + do iip=1,np + if (tau(iir,3,iip)>0) then + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + else + tau(iir,1,iip) = min(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + end if + if (tau(iir,nt-2,iip)>0) then + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + else + tau(iir,nt,iip) = min(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + end if + end do + end do + do iir=1,nr + do iit=1,nt + if (tau(iir,iit,3)>0) then + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + else + tau(iir,iit,1) = min(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + end if + if (tau(iir,iit,np-2)>0) then + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + else + tau(iir,iit,np) = min(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + end if + end do + end do + + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip)) + end do + end do + end do + + do iir=3,nr-2 + do iit=3,nt-2 + do iip=3,np-2 + L1_err=L1_err+abs(u(iir,iit,iip)-T0v(iir,iit,iip)*tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(T0v(iir,iit,iip)*tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-4)*(nt-4)*(np-4)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (myid .eq. 0) then + ! ################ iteration information ################# + if (abs(L1_dif) 2, y: nt-1 <-> 2, z: np-1 <-> 2 + !sigr = 0; sigt=0; sigp=0 + !do iir=1,nr + ! do iit=1,nt + ! do iip=1,np + ! sigr = max(sigr,2*sqrt(a(iir,iit,iip))*T0v(iir,iit,iip)) + ! sigt = max(sigt,2*sqrt(b(iir,iit,iip))*T0v(iir,iit,iip)) + ! sigp = max(sigp,2*sqrt(c(iir,iit,iip))*T0v(iir,iit,iip)) + ! end do + ! end do + !end do + !coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + + do iir=nint(0.5+nr/2.0+(nr/2.0-1.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+1.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-1.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+1.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-1.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+1.5)*pdirec),-pdirec + + if(ischange(iir,iit,iip)==1) then + sigr = 2*sqrt(a(iir,iit,iip))*T0v(iir,iit,iip) + sigt = 2*sqrt(b(iir,iit,iip))*T0v(iir,iit,iip) + sigp = 2*sqrt(c(iir,iit,iip))*T0v(iir,iit,iip) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + ! 构造单方向梯度 3阶 WENO 格式 + + if (iir==2) then + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + wr2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir+1,iit,iip)+tau(iir+2,iit,iip))**2)/ & + & (eps+(tau(iir-1,iit,iip)-2*tau(iir,iit,iip)+tau(iir+1,iit,iip))**2))**2) + pr2=(1-wr2)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr2*(-3*tau(iir,iit,iip)+4*tau(iir+1,iit,iip)-tau(iir+2,iit,iip))/2/dr; + elseif (iir==nr-1) then + wr1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))**2)/ & + & (eps+(tau(iir+1,iit,iip)-2*tau(iir,iit,iip)+tau(iir-1,iit,iip))**2))**2) + pr1=(1-wr1)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr1*(3*tau(iir,iit,iip)-4*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))/2/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + else + wr1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))**2)/ & + & (eps+(tau(iir+1,iit,iip)-2*tau(iir,iit,iip)+tau(iir-1,iit,iip))**2))**2) + pr1=(1.0-wr1)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr1*(3*tau(iir,iit,iip)-4*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))/2/dr; + wr2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir+1,iit,iip)+tau(iir+2,iit,iip))**2)/ & + & (eps+(tau(iir-1,iit,iip)-2*tau(iir,iit,iip)+tau(iir+1,iit,iip))**2))**2) + pr2=(1.0-wr2)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr2*(-3*tau(iir,iit,iip)+4*tau(iir+1,iit,iip)-tau(iir+2,iit,iip))/2/dr; + end if + + if (iit==2) then + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + wt2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit+1,iip)+tau(iir,iit+2,iip))**2)/ & + & (eps+(tau(iir,iit-1,iip)-2*tau(iir,iit,iip)+tau(iir,iit+1,iip))**2))**2) + pt2=(1.0-wt2)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt2*(-3*tau(iir,iit,iip)+4*tau(iir,iit+1,iip)-tau(iir,iit+2,iip))/2/dt; + elseif (iit==nt-1) then + wt1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))**2)/ & + & (eps+(tau(iir,iit+1,iip)-2*tau(iir,iit,iip)+tau(iir,iit-1,iip))**2))**2) + pt1=(1.0-wt1)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt1*(3*tau(iir,iit,iip)-4*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))/2/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + else + wt1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))**2)/ & + & (eps+(tau(iir,iit+1,iip)-2*tau(iir,iit,iip)+tau(iir,iit-1,iip))**2))**2) + pt1=(1.0-wt1)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt1*(3*tau(iir,iit,iip)-4*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))/2/dt; + wt2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit+1,iip)+tau(iir,iit+2,iip))**2)/ & + & (eps+(tau(iir,iit-1,iip)-2*tau(iir,iit,iip)+tau(iir,iit+1,iip))**2))**2) + pt2=(1-wt2)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt2*(-3*tau(iir,iit,iip)+4*tau(iir,iit+1,iip)-tau(iir,iit+2,iip))/2/dt; + end if + + if (iip==2) then + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + wp2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip+1)+tau(iir,iit,iip+2))**2)/ & + & (eps+(tau(iir,iit,iip-1)-2*tau(iir,iit,iip)+tau(iir,iit,iip+1))**2))**2) + pp2=(1.0-wp2)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp2*(-3*tau(iir,iit,iip)+4*tau(iir,iit,iip+1)-tau(iir,iit,iip+2))/2/dp; + elseif (iip==np-1) then + wp1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))**2)/ & + & (eps+(tau(iir,iit,iip+1)-2*tau(iir,iit,iip)+tau(iir,iit,iip-1))**2))**2) + pp1=(1.0-wp1)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp1*(3*tau(iir,iit,iip)-4*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))/2/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + else + wp1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))**2)/ & + & (eps+(tau(iir,iit,iip+1)-2*tau(iir,iit,iip)+tau(iir,iit,iip-1))**2))**2) + pp1=(1.0-wp1)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp1*(3*tau(iir,iit,iip)-4*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))/2/dp; + wp2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip+1)+tau(iir,iit,iip+2))**2)/ & + & (eps+(tau(iir,iit,iip-1)-2*tau(iir,iit,iip)+tau(iir,iit,iip+1))**2))**2) + pp2=(1.0-wp2)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp2*(-3*tau(iir,iit,iip)+4*tau(iir,iit,iip+1)-tau(iir,iit,iip+2))/2/dp; + end if + + !计算 LF Hamiltonian + + !Htau=sqrt( a(iir,iit,iip)*((pr1+pr2)/2)**2 + b(iir,iit,iip)*((pt1+pt2)/2)**2 & + !& + c(iir,iit,iip)*((pp1+pp2)/2)**2 -2*f(iir,iit,iip)*(pt1+pt2)/2*(pp1+pp2)/2 & + !& + a(iir,iit,iip)*(pr1+pr2)*T0r(iir,iit,iip) & + !& + b(iir,iit,iip)*(pt1+pt2)*T0t(iir,iit,iip) - f(iir,iit,iip)*(pt1+pt2)*T0p(iir,iit,iip) & + !& + c(iir,iit,iip)*(pp1+pp2)*T0p(iir,iit,iip) - f(iir,iit,iip)*(pp1+pp2)*T0t(iir,iit,iip) & + !& + a(iir,iit,iip)*T0r(iir,iit,iip)**2 & + !& + b(iir,iit,iip)*T0t(iir,iit,iip)**2 + c(iir,iit,iip)*T0p(iir,iit,iip)**2 & + !& - 2*f(iir,iit,iip)*T0t(iir,iit,iip)*T0p(iir,iit,iip) ) + + Htau = sqrt( & + & a(iir,iit,iip)*(T0r(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pr1+pr2)/2)**2 & + & + b(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2)**2 & + &-2*f(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2) & + & *(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2) ) + + if (isnan(Htau)) then + print *, iir,iit,iip + print *, a(iir,iit,iip)*(T0r(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pr1+pr2)/2)**2 + print *, b(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2)**2 + print *, c(iir,iit,iip)*(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2)**2 + pause + end if + + ! 更新 timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + !write(*,*) fun(iir,iit,iip),Htau + + tau(iir,iit,iip) = tpT + end if + + + end do + end do + end do + + ! 处理边界 + + do iit=1,nt + do iip=1,np + !if (tau(3,iit,iip)>0) then + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + !else + ! tau(1,iit,iip) = min(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + !end if + !if (tau(nr-2,iit,iip)>0) then + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + !else + ! tau(nr,iit,iip) = min(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + !end if + end do + end do + do iir=1,nr + do iip=1,np + !if (tau(iir,3,iip)>0) then + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + !else + ! tau(iir,1,iip) = min(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + !end if + !if (tau(iir,nt-2,iip)>0) then + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + !else + ! tau(iir,nt,iip) = min(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + !end if + end do + end do + do iir=1,nr + do iit=1,nt + !if (tau(iir,iit,3)>0) then + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + !else + ! tau(iir,iit,1) = min(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + !end if + !if (tau(iir,iit,np-2)>0) then + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + !else + ! tau(iir,iit,np) = min(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + !end if + end do + end do + + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip)) + end do + end do + end do + + do iir=3,nr-2 + do iit=3,nt-2 + do iip=3,np-2 + L1_err=L1_err+abs(u(iir,iit,iip)-T0v(iir,iit,iip)*tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(T0v(iir,iit,iip)*tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-4)*(nt-4)*(np-4)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (abs(L1_dif)=ave_ni*iproc) .or. (ptr2 .eq.iright)) then + !if (iproc>nproc) then + ! print *, iproc,nproc + !end if + proc_irange(:,iproc,level-5) = (/ptr1,ptr2/) + ptr1 = ptr2+1 + iproc = iproc +1 + MaxtpNptn = max(MaxtpNptn,tpNptn) + tpNptn = 0 + end if + end do + sNptn = sNptn + MaxtpNptn + !call sleep(2) + end if + !if (myid .eq. 0) then + ! print *, proc_irange(1,:,level-5) + ! print *, proc_irange(2,:,level-5) + ! print *, ' ' + !end if + end do + + ! print *, Nptn*1.0/sNptn + + + ! 正式迭代,更新tau + do iter =1,MaxIter + tau_old = tau + L1_dif=0; Linf_dif=0;L1_err=0;Linf_err=0; + + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + my_npt = 0 + do level = 6,nr+nt+np-3 + ! 2<= ir <= nr-1; 2<= it <= nr-1; 2<=ip <=np-1 + + ileft = max(2,level-np-nt+2) + iright = min(level-4,nr-1) + + mpi_ptn=0 + do ii = proc_irange(1,myid+1,level-5),proc_irange(2,myid+1,level-5) + + jleft = max(2,level-ii-np+1) + jright = min(level-ii-2,nt-1) + do jj = jleft,jright + + kk = level-ii-jj + + if(rdirec<0) then + iir=ii + else + iir=nr+1-ii + end if + if(tdirec<0) then + iit=jj + else + iit=nt+1-jj + end if + if(pdirec<0) then + iip=kk + else + iip=np+1-kk + end if + + + if(ischange(iir,iit,iip)==1) then + + + !sigr=2*sqrt(a(iir,iit,iip)); sigt=2*sqrt(b(iir,iit,iip)); sigp=2*sqrt(c(iir,iit,iip)) + !coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + sigr = 2*sqrt(a(iir,iit,iip))*T0v(iir,iit,iip) + sigt = 2*sqrt(b(iir,iit,iip))*T0v(iir,iit,iip) + sigp = 2*sqrt(c(iir,iit,iip))*T0v(iir,iit,iip) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + ! 构造单方向梯度 1 阶格式 + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + + !计算 LF Hamiltonian + + ! additive + !Htau=sqrt( a(iir,iit,iip)*((pr1+pr2)/2)**2 + b(iir,iit,iip)*((pt1+pt2)/2)**2 & + !& + c(iir,iit,iip)*((pp1+pp2)/2)**2 -2*f(iir,iit,iip)*(pt1+pt2)/2*(pp1+pp2)/2 & + !& + a(iir,iit,iip)*(pr1+pr2)*T0r(iir,iit,iip) & + !& + b(iir,iit,iip)*(pt1+pt2)*T0t(iir,iit,iip) - f(iir,iit,iip)*(pt1+pt2)*T0p(iir,iit,iip) & + !& + c(iir,iit,iip)*(pp1+pp2)*T0p(iir,iit,iip) - f(iir,iit,iip)*(pp1+pp2)*T0t(iir,iit,iip) & + !& + a(iir,iit,iip)*T0r(iir,iit,iip)**2 & + !& + b(iir,iit,iip)*T0t(iir,iit,iip)**2 + c(iir,iit,iip)*T0p(iir,iit,iip)**2 & + !& - 2*f(iir,iit,iip)*T0t(iir,iit,iip)*T0p(iir,iit,iip) ) + + ! multiplicative + Htau = sqrt( & + & a(iir,iit,iip)*(T0r(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pr1+pr2)/2)**2 & + & + b(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2)**2 & + &-2*f(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2) & + & *(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2) ) + + + ! 更新 timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + !write(*,*) fun(iir,iit,iip),Htau + + tau(iir,iit,iip) = tpT + + + mpi_ptn=mpi_ptn+1 + mpi_ptijk(:,mpi_ptn) = (/iir,iit,iip/) + mpi_ptv(mpi_ptn) = tpT + my_npt = my_npt + 1 + end if + end do + end do + + !if (1>2) then + ! 数据通信 步骤1, 其他线程传输给主线程 + if (myid .eq. 0) then + ! 负责接受数据 + do iproc=1,nproc-1 + call mpi_recv(int_temp,1,mpi_integer,iproc,tag,mpi_comm_world,istat,ierr) + if (int_temp .ne. 0) then + call mpi_recv(mpi_ptijk(1,mpi_ptn+1),int_temp*3,mpi_integer,iproc,tag+1, & + & mpi_comm_world,istat,ierr) + call mpi_recv(mpi_ptv(mpi_ptn+1),int_temp,mpi_double_precision,iproc,tag+2, & + & mpi_comm_world,istat,ierr) + ! 接收完数据,赋值 + do ipt=mpi_ptn+1,mpi_ptn+int_temp + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + mpi_ptn = mpi_ptn + int_temp + end if + end do + else + ! 负责发送数据 + call mpi_send(mpi_ptn,1,mpi_integer,0,tag,mpi_comm_world,ierr) + !print *, mpi_ptn, mpi_ptijk(:,1:mpi_ptn), mpi_ptv(1:mpi_ptn) + if (mpi_ptn .ne. 0) then + call mpi_send(mpi_ptijk,3*mpi_ptn,mpi_integer,0,tag+1,mpi_comm_world,ierr) + call mpi_send(mpi_ptv,mpi_ptn,mpi_double_precision,0,tag+2,mpi_comm_world,ierr) + end if + end if + + ! 数据通信 步骤2, 主线程将更新后的level数据广播到其他线程 + + call mpi_bcast(mpi_ptn,1,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptijk,3*mpi_ptn,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptv,mpi_ptn,mpi_double_precision,0,mpi_comm_world,ierr) + + ! 数据广播完成,开始赋值 + if (myid .ne. 0) then + do ipt=1,mpi_ptn + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + end if + + call mpi_barrier(mpi_comm_world,ierr) + !end if + end do + + ! print *, my_npt, Nptn + + ! 处理边界 + + do iit=1,nt + do iip=1,np + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + end do + end do + do iir=1,nr + do iip=1,np + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + end do + end do + do iir=1,nr + do iit=1,nt + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + end do + end do + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip)) + end do + end do + end do + + do iir=3,nr-2 + do iit=3,nt-2 + do iip=3,np-2 + L1_err=L1_err+abs(u(iir,iit,iip)-T0v(iir,iit,iip)*tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(T0v(iir,iit,iip)*tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-4)*(nt-4)*(np-4)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (myid .eq. 0) then + ! ################ iteration information ################# + if (abs(L1_dif)=ave_ni*iproc) .or. (ptr2 .eq.iright)) then + + proc_irange(:,iproc,level-5) = (/ptr1,ptr2/) + ptr1 = ptr2+1 + iproc = iproc +1 + MaxtpNptn = max(MaxtpNptn,tpNptn) + tpNptn = 0 + end if + end do + sNptn = sNptn + MaxtpNptn + end if + end do + + ! print *, Nptn*1.0/sNptn + + + ! 正式迭代,更新tau + do iter =1,MaxIter + tau_old = tau + L1_dif=0; Linf_dif=0;L1_err=0;Linf_err=0; + + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + my_npt = 0 + do level = 6,nr+nt+np-3 + ! 2<= ir <= nr-1; 2<= it <= nr-1; 2<=ip <=np-1 + + ileft = max(2,level-np-nt+2) + iright = min(level-4,nr-1) + + mpi_ptn=0 + do ii = proc_irange(1,myid+1,level-5),proc_irange(2,myid+1,level-5) + + jleft = max(2,level-ii-np+1) + jright = min(level-ii-2,nt-1) + do jj = jleft,jright + + kk = level-ii-jj + + if(rdirec<0) then + iir=ii + else + iir=nr+1-ii + end if + if(tdirec<0) then + iit=jj + else + iit=nt+1-jj + end if + if(pdirec<0) then + iip=kk + else + iip=np+1-kk + end if + + + if(ischange(iir,iit,iip)==1) then + + + !sigr=2*sqrt(a(iir,iit,iip)); sigt=2*sqrt(b(iir,iit,iip)); sigp=2*sqrt(c(iir,iit,iip)) + !coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + sigr = sqrt(a(iir,iit,iip)) + sigt = sqrt(b(iir,iit,iip)) + sigp = sqrt(c(iir,iit,iip)) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + ! partial derivatives + + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + + !计算 LF Hamiltonian + + Htau=sqrt( a(iir,iit,iip)*((pr1+pr2)/2)**2 + b(iir,iit,iip)*((pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*((pp1+pp2)/2)**2 -2*f(iir,iit,iip)*(pt1+pt2)/2*(pp1+pp2)/2) + + ! 更新 update timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + tau(iir,iit,iip) = tpT + + + mpi_ptn=mpi_ptn+1 + mpi_ptijk(:,mpi_ptn) = (/iir,iit,iip/) + mpi_ptv(mpi_ptn) = tpT + my_npt = my_npt + 1 + end if + end do + end do + + !if (1>2) then + ! 数据通信 步骤1, 其他线程传输给主线程 + if (myid .eq. 0) then + ! 负责接受数据 + do iproc=1,nproc-1 + call mpi_recv(int_temp,1,mpi_integer,iproc,tag,mpi_comm_world,istat,ierr) + if (int_temp .ne. 0) then + call mpi_recv(mpi_ptijk(1,mpi_ptn+1),int_temp*3,mpi_integer,iproc,tag+1, & + & mpi_comm_world,istat,ierr) + call mpi_recv(mpi_ptv(mpi_ptn+1),int_temp,mpi_double_precision,iproc,tag+2, & + & mpi_comm_world,istat,ierr) + ! 接收完数据,赋值 + do ipt=mpi_ptn+1,mpi_ptn+int_temp + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + mpi_ptn = mpi_ptn + int_temp + end if + end do + else + ! 负责发送数据 + call mpi_send(mpi_ptn,1,mpi_integer,0,tag,mpi_comm_world,ierr) + !print *, mpi_ptn, mpi_ptijk(:,1:mpi_ptn), mpi_ptv(1:mpi_ptn) + if (mpi_ptn .ne. 0) then + call mpi_send(mpi_ptijk,3*mpi_ptn,mpi_integer,0,tag+1,mpi_comm_world,ierr) + call mpi_send(mpi_ptv,mpi_ptn,mpi_double_precision,0,tag+2,mpi_comm_world,ierr) + end if + end if + + ! 数据通信 步骤2, 主线程将更新后的level数据广播到其他线程 + + call mpi_bcast(mpi_ptn,1,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptijk,3*mpi_ptn,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptv,mpi_ptn,mpi_double_precision,0,mpi_comm_world,ierr) + + ! 数据广播完成,开始赋值 + if (myid .ne. 0) then + do ipt=1,mpi_ptn + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + end if + + call mpi_barrier(mpi_comm_world,ierr) + !end if + end do + + ! print *, my_npt, Nptn + + ! 处理边界 + + do iit=2,nt-1 + do iip=2,np-1 + if (tau(3,iit,iip)>0) then + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + else + tau(1,iit,iip) = min(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + end if + if (tau(nr-2,iit,iip)>0) then + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + else + tau(nr,iit,iip) = min(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + end if + end do + end do + do iir=2,nr-1 + do iip=2,np-1 + if (tau(iir,3,iip)>0) then + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + else + tau(iir,1,iip) = min(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + end if + if (tau(iir,nt-2,iip)>0) then + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + else + tau(iir,nt,iip) = min(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + end if + end do + end do + do iir=2,nr-1 + do iit=2,nt-1 + if (tau(iir,iit,3)>0) then + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + else + tau(iir,iit,1) = min(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + end if + if (tau(iir,iit,np-2)>0) then + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + else + tau(iir,iit,np) = min(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + end if + end do + end do + + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip)) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))) + end do + end do + end do + + do iir=3,nr-2 + do iit=3,nt-2 + do iip=3,np-2 + L1_err=L1_err+abs(u(iir,iit,iip)-tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-4)*(nt-4)*(np-4)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (myid .eq. 0) then + ! ################ iteration information ################# + if (abs(L1_dif) 2, y: nt-1 <-> 2, z: np-1 <-> 2 + + do iir=nint(0.5+nr/2.0+(nr/2.0-1.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+1.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-1.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+1.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-1.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+1.5)*pdirec),-pdirec + + if(ischange(iir,iit,iip)==1) then + sigr=sqrt(a(iir,iit,iip)); sigt=sqrt(b(iir,iit,iip)); sigp=sqrt(c(iir,iit,iip)) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + ! forward and backward partial derivatives + + + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + + + ! calculate LF Hamiltonian + + Htau=sqrt( a(iir,iit,iip)*((pr1+pr2)/2)**2 + b(iir,iit,iip)*((pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*((pp1+pp2)/2)**2 -2*f(iir,iit,iip)*(pt1+pt2)/2*(pp1+pp2)/2 ) + + ! 更新 update timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + !write(*,*) fun(iir,iit,iip),Htau + + if (tpT < tau(iir,iit,iip)) then + tau(iir,iit,iip) = tpT + end if + + end if + + + end do + end do + end do + + ! boundary + + do iit=1,nt + do iip=1,np + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + end do + end do + do iir=1,nr + do iip=1,np + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + end do + end do + do iir=1,nr + do iit=1,nt + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + end do + end do + + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip)) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))) + end do + end do + end do + + do iir=3,nr-2 + do iit=3,nt-2 + do iip=3,np-2 + L1_err=L1_err+abs(u(iir,iit,iip)-tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-4)*(nt-4)*(np-4)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (myid .eq. 0) then + ! ################ iteration information ################# + if (abs(L1_dif)x0 ) then + idx0=iix + exit + end if + end do + do iiy=1,ny-1 + if (yy(iiy)<= y0 .and. yy(iiy+1)>y0 ) then + idy0=iiy + exit + end if + end do + do iiy=1,ny-1 + if (zz(iiz)<= z0 .and. zz(iiz+1)>z0 ) then + idz0=iiz + exit + end if + end do + + if (idx0<=0 .or. idy0<0 .or. idz0<0) then + write(*,*) 'point out of the mesh' + pause + return + end if + + dx = xx(idx0+1)-xx(idx0) + dy = yy(idy0+1)-yy(idy0) + dz = zz(idz0+1)-zz(idz0) + + r1 = min(1.0, (x0-xx(idx0))/dx ) + r2 = min(1.0, (y0-yy(idy0))/dy ) + r3 = min(1.0, (z0-zz(idz0))/dz ) + + v0 = (1-r1)*(1-r2)*(1-r3)*val(idx0,idy0,idz0) + (1-r1)*(1-r2)*r3*val(idx0,idy0,idz0+1) & + & + (1-r1)*r2*(1-r3)*val(idx0,idy0+1,idz0) + (1-r1)*r2*r3*val(idx0,idy0+1,idz0+1) & + & + r1*(1-r2)*(1-r3)*val(idx0+1,idy0,idz0) + r1*(1-r2)*r3*val(idx0+1,idy0,idz0+1) & + & + r1*r2*(1-r3)*val(idx0+1,idy0+1,idz0) + r1*r2*r3*val(idx0+1,idy0+1,idz0+1) +end subroutine + +! 3-D interpolation uniform mesh +subroutine Linear_Interp_3D(xx,yy,zz,val,nx,ny,nz,x0,y0,z0,v0,n0) + integer :: nx,ny,nz,idx0,idy0,idz0,n0 + double precision :: xx(nx),yy(ny),zz(nz),val(nx,ny,nz),x0(n0),y0(n0),z0(n0),v0(n0),dx,dy,dz + double precision :: r1,r2,r3 + integer :: iix,iiy,iiz,i + + dx = xx(2)-xx(1) + dy = yy(2)-yy(1) + dz = zz(2)-zz(1) + + do i=1,n0 + idx0 = floor((x0(i)-xx(1))/dx)+1 + idy0 = floor((y0(i)-yy(1))/dy)+1 + idz0 = floor((z0(i)-zz(1))/dz)+1 + + if (idx0<1 .or. idx0>nx-1 .or. idy0<1 .or. idy0>ny-1 .or. idz0<1 .or. idz0>nz-1) then + write(*,*) 'point out of the mesh' + pause + return + end if + + r1 = min(1.0, (x0(i)-xx(idx0))/dx ) + r2 = min(1.0, (y0(i)-yy(idy0))/dy ) + r3 = min(1.0, (z0(i)-zz(idz0))/dz ) + + v0(i) = (1-r1)*(1-r2)*(1-r3)*val(idx0,idy0,idz0) + (1-r1)*(1-r2)*r3*val(idx0,idy0,idz0+1) & + & + (1-r1)*r2*(1-r3)*val(idx0,idy0+1,idz0) + (1-r1)*r2*r3*val(idx0,idy0+1,idz0+1) & + & + r1*(1-r2)*(1-r3)*val(idx0+1,idy0,idz0) + r1*(1-r2)*r3*val(idx0+1,idy0,idz0+1) & + & + r1*r2*(1-r3)*val(idx0+1,idy0+1,idz0) + r1*r2*r3*val(idx0+1,idy0+1,idz0+1) + end do +end subroutine + +subroutine FSM_O1_Adj_sphe_3d(rr,tt,pp,nr,nt,np,Table,TableADJ,zeta,xi,eta,Nrec,rrec,trec,prec,sourceADJ) + + integer :: nr,nt,np,Nrec + double precision :: dr,dt,dp,rr(nr),tt(nt),pp(np) + double precision :: Table(nr,nt,np),TableADJ(nr,nt,np),delta(nr,nt,np) + double precision :: zeta(nr,nt,np),xi(nr,nt,np),eta(nr,nt,np) + double precision :: rrec(Nrec),trec(Nrec),prec(Nrec),sourceADJ(Nrec) + double precision :: a1,a1m(nr,nt,np),a1p(nr,nt,np),a2,a2m(nr,nt,np),a2p(nr,nt,np) + double precision :: b1,b1m(nr,nt,np),b1p(nr,nt,np),b2,b2m(nr,nt,np),b2p(nr,nt,np) + double precision :: c1,c1m(nr,nt,np),c1p(nr,nt,np),c2,c2m(nr,nt,np),c2p(nr,nt,np) + double precision :: coe + + integer,parameter :: MaxIter=100 + double precision,parameter :: tol=10.0**(-6),eps=10.0**(-6) + + integer :: iir,iit,iip,idi,idj,idk,rdirec,tdirec,pdirec + double precision :: r1,r2,r3,Linf_dif,tpTabldADJ,Hamilton + double precision :: tmpr1,tmpr2,tmpt1,tmpt2 + + ! ####### 网格间距 mesh size ######## + dr = rr(2)-rr(1) + dt = tt(2)-tt(1) + dp = pp(2)-pp(1) + + ! ################# 构造源项 build the sourece term, the delta function ################# + do iir = 1,nr + do iit = 1,nt + do iip= 1,np + delta(iir,iit,iip) = 0 + TableADJ(iir,iit,iip) = 0 + end do + end do + end do + + ! ------- 遍历每个台站,给予delta函数贡献 loop each station to contribute the delta function ------- + do ir=1,Nrec + idi=floor((rrec(ir)-rr(1))/dr+1); + idj=floor((trec(ir)-tt(1))/dt+1); + idk=floor((prec(ir)-pp(1))/dp+1); + + r1 = min(1.0,(rrec(ir)-rr(idi))/dr); + r2 = min(1.0,(trec(ir)-tt(idj))/dt); + r3 = min(1.0,(prec(ir)-pp(idk))/dp); + + delta(idi,idj,idk) = delta(idi,idj,idk) + sourceADJ(ir)*(1-r1)*(1-r2)*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj,idk) = delta(idi+1,idj,idk) + sourceADJ(ir)*r1*(1-r2)*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi,idj+1,idk) = delta(idi,idj+1,idk) + sourceADJ(ir)*(1-r1)*r2*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj+1,idk) = delta(idi+1,idj+1,idk) + sourceADJ(ir)*r1*r2*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi,idj,idk+1) = delta(idi,idj,idk+1) + sourceADJ(ir)*(1-r1)*(1-r2)*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj,idk+1) = delta(idi+1,idj,idk+1) + sourceADJ(ir)*r1*(1-r2)*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi,idj+1,idk+1) = delta(idi,idj+1,idk+1) + sourceADJ(ir)*(1-r1)*r2*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj+1,idk+1) = delta(idi+1,idj+1,idk+1) + sourceADJ(ir)*r1*r2*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + !print *, delta(idi,idj,idk),delta(idi+1,idj+1,idk+1) + end do + + ! ################# 构造方程系数 calculate coefficients of equations ################# + do iir = 2,nr-1 + do iit = 2,nt-1 + do iip= 2,np-1 + tmpr1 = (rr(iir-1)+rr(iir))/2; tmpt1 = (tt(iit-1)+tt(iit))/2; + tmpr2 = (rr(iir)+rr(iir+1))/2; tmpt2 = (tt(iit)+tt(iit-1))/2; + + a1 = -(1+zeta(iir-1,iit,iip)+zeta(iir,iit,iip))*(Table(iir,iit,iip)-Table(iir-1,iit,iip))/dr + a1m(iir,iit,iip) = (a1-abs(a1))/2; a1p(iir,iit,iip) = (a1+abs(a1))/2; + a2 = -(1+zeta(iir,iit,iip)+zeta(iir+1,iit,iip))*(Table(iir+1,iit,iip)-Table(iir,iit,iip))/dr + a2m(iir,iit,iip) = (a2-abs(a2))/2; a2p(iir,iit,iip) = (a2+abs(a2))/2; + + !b1 = -(1-xi(iir,iit-1,iip)-xi(iir,iit,iip))/(tmpr1**2)*(Table(iir,iit,iip)-Table(iir,iit-1,iip))/dt & + ! & -(eta(iir,iit-1,iip)+eta(iir,iit,iip))/(cos(tmpt1)*tmpr1**2)/(4*dp) & + b1 = -(1-xi(iir,iit-1,iip)-xi(iir,iit,iip))/(rr(iir)**2)*(Table(iir,iit,iip)-Table(iir,iit-1,iip))/dt & + & -(eta(iir,iit-1,iip)+eta(iir,iit,iip))/(cos(tmpt1)*rr(iir)**2)/(4*dp) & + & *((Table(iir,iit-1,iip+1)-Table(iir,iit-1,iip-1))+(Table(iir,iit,iip+1)-Table(iir,iit,iip-1))) + b1m(iir,iit,iip) = (b1-abs(b1))/2; b1p(iir,iit,iip) = (b1+abs(b1))/2; + + !b2 = -(1-xi(iir,iit,iip)-xi(iir,iit+1,iip))/(tmpr2**2)*(Table(iir,iit+1,iip)-Table(iir,iit,iip))/dt & + ! & -(eta(iir,iit,iip)+eta(iir,iit+1,iip))/(cos(tmpt2)*tmpr2**2)/(4*dp) & + b2 = -(1-xi(iir,iit,iip)-xi(iir,iit+1,iip))/(rr(iir)**2)*(Table(iir,iit+1,iip)-Table(iir,iit,iip))/dt & + & -(eta(iir,iit,iip)+eta(iir,iit+1,iip))/(cos(tmpt2)*rr(iir)**2)/(4*dp) & + & *((Table(iir,iit,iip+1)-Table(iir,iit,iip-1))+(Table(iir,iit+1,iip+1)-Table(iir,iit+1,iip-1))) + b2m(iir,iit,iip) = (b2-abs(b2))/2; b2p(iir,iit,iip) = (b2+abs(b2))/2; + + !c1 = -(eta(iir,iit,iip-1)+eta(iir,iit,iip))/(cos(tmpt1)*tmpr1**2)/(4*dt) & + c1 = -(eta(iir,iit,iip-1)+eta(iir,iit,iip))/(cos(tt(iit))*rr(iir)**2)/(4*dt) & + & *((Table(iir,iit+1,iip-1)-Table(iir,iit-1,iip-1))+(Table(iir,iit+1,iip)-Table(iir,iit-1,iip))) & + ! & -(1+xi(iir,iit,iip-1)+xi(iir,iit,iip))/(cos(tmpt1)**2*tmpr1**2)*(Table(iir,iit,iip)-Table(iir,iit,iip-1))/dp + & -(1+xi(iir,iit,iip-1)+xi(iir,iit,iip))/ & + & (cos(tt(iit))**2*rr(iir)**2)*(Table(iir,iit,iip)-Table(iir,iit,iip-1))/dp + c1m(iir,iit,iip) = (c1-abs(c1))/2; c1p(iir,iit,iip) = (c1+abs(c1))/2; + + !c2 = -(eta(iir,iit,iip)+eta(iir,iit,iip+1))/(cos(tmpt2)*tmpr2**2)/(4*dt) & + c2 = -(eta(iir,iit,iip)+eta(iir,iit,iip+1))/(cos(tt(iit))*rr(iir)**2)/(4*dt) & + & *((Table(iir,iit+1,iip)-Table(iir,iit-1,iip))+(Table(iir,iit+1,iip+1)-Table(iir,iit-1,iip+1))) & + ! & -(1+xi(iir,iit,iip)+xi(iir,iit,iip+1))/(cos(tmpt2)**2*tmpr2**2)*(Table(iir,iit,iip+1)-Table(iir,iit,iip))/dp + & -(1+xi(iir,iit,iip)+xi(iir,iit,iip+1)) & + & /(cos(tt(iit))**2*rr(iir)**2)*(Table(iir,iit,iip+1)-Table(iir,iit,iip))/dp + c2m(iir,iit,iip) = (c2-abs(c2))/2; c2p(iir,iit,iip) = (c2+abs(c2))/2; + + end do + end do + end do + + + ! ################# 固定伴随场边界条件 fix the boundary of the adjoint field ###################### + ! -------- R,Theta boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(iir,iit,1) = 0 + TableADJ(iir,iit,np) = 0 + end do + end do + ! -------- R,Phi boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(iir,1,iip) = 0 + TableADJ(iir,nt,iip) = 0 + end do + end do + ! -------- Theta,Phi boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(1,iit,iip) = 0 + TableADJ(nr,iit,iip) = 0 + end do + end do + + + + + ! ################ 使用FSM计算伴随场 calculate adjoint field by FSM ###################### + + do iter =1,MaxIter + Linf_dif=0; + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + + !x: nr-1 <-> 2, y: nt-1 <-> 2, z: np-1 <-> 2 + do iir=nint(0.5+nr/2.0+(nr/2.0-1.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+1.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-1.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+1.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-1.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+1.5)*pdirec),-pdirec + + + coe = (a2p(iir,iit,iip)-a1m(iir,iit,iip))/dr & + & +(b2p(iir,iit,iip)-b1m(iir,iit,iip))/dt & + & +(c2p(iir,iit,iip)-c1m(iir,iit,iip))/dp + + if (abs(coe)Linf_dif) then + ! print *, iir,iit,iip,tpTableADJ,TableADJ(iir,iit,iip) + !end if + Linf_dif = max(Linf_dif, abs(tpTableADJ-TableADJ(iir,iit,iip))) + + TableADJ(iir,iit,iip) = tpTableADJ + end if + + end do + end do + end do + + end do + end do + end do + + + + if (abs(Linf_dif) r1+(iir+0.5)*dr, t1+iit*dt, p1+iip*dp + a0 = T0para(1); b0 = T0para(2); c0 = T0para(3); f0 = T0para(4); fun0 = T0para(5); + r0 = T0para(6); t0 = T0para(7); p0 = T0para(8); + + do iir=1,nr-1 + do iit=1,nt + do iip=1,np + r1 = rr(iir)+0.5*dr; t1 = tt(iit); p1 = pp(iip) + T0v_hr(iir,iit,iip) = fun0*sqrt( 1.0/a0*(r1-r0)**2 + c0/(c0*b0-f0**2)*(t1-t0)**2 & + & + b0/(c0*b0-f0**2)*(p1-p0)**2 + 2*f0/(c0*b0-f0**2)*(t1-t0)*(p1-p0) ) + if ( T0v_hr(iir,iit,iip)==0 ) then + T0r_hr(iir,iit,iip) = 0 + else + T0r_hr(iir,iit,iip) = fun0**2*(1.0/a0*(r1-r0))/T0v_hr(iir,iit,iip) + end if + end do + end do + end do + ! 构造T0_ht iir,iit,iip -> r1+iir*dr, t1+(iit+0.5)*dt, p1+iip*dp + do iir=1,nr + do iit=1,nt-1 + do iip=1,np + r1 = rr(iir); t1 = tt(iit)+0.5*dt; p1 = pp(iip) + T0v_ht(iir,iit,iip) = fun0*sqrt( 1.0/a0*(r1-r0)**2 + c0/(c0*b0-f0**2)*(t1-t0)**2 & + & + b0/(c0*b0-f0**2)*(p1-p0)**2 + 2*f0/(c0*b0-f0**2)*(t1-t0)*(p1-p0) ) + if ( T0v_ht(iir,iit,iip)==0 ) then + T0t_ht(iir,iit,iip) = 0 + T0p_ht(iir,iit,iip) = 0 + else + T0t_ht(iir,iit,iip) = fun0**2*(c0/(c0*b0-f0**2)*(t1-t0)+f0/(c0*b0-f0**2)*(p1-p0))/T0v_ht(iir,iit,iip) + T0p_ht(iir,iit,iip) = fun0**2*(b0/(c0*b0-f0**2)*(p1-p0)+f0/(c0*b0-f0**2)*(t1-t0))/T0v_ht(iir,iit,iip) + end if + end do + end do + end do + ! 构造T0_hp iir,iit,iip -> r1+iir*dr, t1+iit*dt, p1+(iip+0.5)*dp + do iir=1,nr + do iit=1,nt + do iip=1,np-1 + r1 = rr(iir); t1 = tt(iit); p1 = pp(iip)+0.5*dp + T0v_hp(iir,iit,iip) = fun0*sqrt( 1.0/a0*(r1-r0)**2 + c0/(c0*b0-f0**2)*(t1-t0)**2 & + & + b0/(c0*b0-f0**2)*(p1-p0)**2 + 2*f0/(c0*b0-f0**2)*(t1-t0)*(p1-p0) ) + if ( T0v_hp(iir,iit,iip)==0 ) then + T0t_hp(iir,iit,iip) = 0 + T0p_hp(iir,iit,iip) = 0 + else + T0t_hp(iir,iit,iip) = fun0**2*(c0/(c0*b0-f0**2)*(t1-t0)+f0/(c0*b0-f0**2)*(p1-p0))/T0v_hp(iir,iit,iip) + T0p_hp(iir,iit,iip) = fun0**2*(b0/(c0*b0-f0**2)*(p1-p0)+f0/(c0*b0-f0**2)*(t1-t0))/T0v_hp(iir,iit,iip) + end if + end do + end do + end do + + + + + ! ################# 构造方程系数 calculate coefficients of equations ################# + do iir = 2,nr-1 + do iit = 2,nt-1 + do iip= 2,np-1 + tmpt1 = (tt(iit-1)+tt(iit))/2; + tmpt2 = (tt(iit)+tt(iit-1))/2; + + a1 = -(1+zeta(iir-1,iit,iip)+zeta(iir,iit,iip)) & + & *(T0r_hr(iir-1,iit,iip)*(tau(iir,iit,iip)+tau(iir-1,iit,iip))/2 & + & + T0v_hr(iir-1,iit,iip)*(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr) + a1m(iir,iit,iip) = (a1-abs(a1))/2; a1p(iir,iit,iip) = (a1+abs(a1))/2; + a2 = -(1+zeta(iir,iit,iip)+zeta(iir+1,iit,iip)) & + & *(T0r_hr(iir,iit,iip)*(tau(iir+1,iit,iip)+tau(iir,iit,iip))/2 & + & + T0v_hr(iir,iit,iip)*(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr) + a2m(iir,iit,iip) = (a2-abs(a2))/2; a2p(iir,iit,iip) = (a2+abs(a2))/2; + + b1 = -(1-xi(iir,iit-1,iip)-xi(iir,iit,iip))/(rr(iir)**2)* & + & (T0t_ht(iir,iit-1,iip)*(tau(iir,iit,iip)+tau(iir,iit-1,iip))/2 & + & + T0v_ht(iir,iit-1,iip)*(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt) & + & -(eta(iir,iit-1,iip)+eta(iir,iit,iip))/(cos(tmpt1)*rr(iir)**2)* & + & (T0p_ht(iir,iit-1,iip)*(tau(iir,iit,iip)+tau(iir,iit-1,iip))/2 & + & + T0v_ht(iir,iit-1,iip)*(tau(iir,iit-1,iip+1)-tau(iir,iit-1,iip-1) & + & + tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/(4*dp)) + b1m(iir,iit,iip) = (b1-abs(b1))/2; b1p(iir,iit,iip) = (b1+abs(b1))/2; + b2 = -(1-xi(iir,iit,iip)-xi(iir,iit+1,iip))/(rr(iir)**2)* & + & (T0t_ht(iir,iit,iip)*(tau(iir,iit+1,iip)+tau(iir,iit,iip))/2 & + & + T0v_ht(iir,iit,iip)*(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt) & + & -(eta(iir,iit,iip)+eta(iir,iit+1,iip))/(cos(tmpt2)*rr(iir)**2)* & + & (T0p_ht(iir,iit,iip)*(tau(iir,iit+1,iip)+tau(iir,iit,iip))/2 & + & + T0v_ht(iir,iit,iip)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1) & + & + tau(iir,iit+1,iip+1)-tau(iir,iit+1,iip-1))/(4*dp)) + b2m(iir,iit,iip) = (b2-abs(b2))/2; b2p(iir,iit,iip) = (b2+abs(b2))/2; + + c1 = -(eta(iir,iit,iip-1)+eta(iir,iit,iip))/(cos(tt(iit))*rr(iir)**2)* & + & (T0t_hp(iir,iit,iip-1)*(tau(iir,iit,iip)+tau(iir,iit,iip-1))/2 & + & + T0v_hp(iir,iit,iip-1)*(tau(iir,iit+1,iip-1)-tau(iir,iit-1,iip-1) & + & +tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/(4*dt)) & + & -(1+xi(iir,iit,iip-1)+xi(iir,iit,iip))/(cos(tt(iit))**2*rr(iir)**2)* & + & (T0p_hp(iir,iit,iip-1)*(tau(iir,iit,iip)+tau(iir,iit,iip-1))/2 & + & + T0v_hp(iir,iit,iip-1)*(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp) + c1m(iir,iit,iip) = (c1-abs(c1))/2; c1p(iir,iit,iip) = (c1+abs(c1))/2; + c2 = -(eta(iir,iit,iip)+eta(iir,iit,iip+1))/(cos(tt(iit))*rr(iir)**2)* & + & (T0t_hp(iir,iit,iip)*(tau(iir,iit,iip+1)+tau(iir,iit,iip))/2 & + & + T0v_hp(iir,iit,iip)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip) & + & +tau(iir,iit+1,iip+1)-tau(iir,iit-1,iip+1))/(4*dt)) & + & -(1+xi(iir,iit,iip)+xi(iir,iit,iip+1))/(cos(tt(iit))**2*rr(iir)**2)* & + & (T0p_hp(iir,iit,iip)*(tau(iir,iit,iip+1)+tau(iir,iit,iip))/2 & + & + T0v_hp(iir,iit,iip)*(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp) + c2m(iir,iit,iip) = (c2-abs(c2))/2; c2p(iir,iit,iip) = (c2+abs(c2))/2; + + end do + end do + end do + + + ! ################# 固定伴随场边界条件 fix the boundary of the adjoint field ###################### + ! -------- R,Theta boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(iir,iit,1) = 0 + TableADJ(iir,iit,np) = 0 + end do + end do + ! -------- R,Phi boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(iir,1,iip) = 0 + TableADJ(iir,nt,iip) = 0 + end do + end do + ! -------- Theta,Phi boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(1,iit,iip) = 0 + TableADJ(nr,iit,iip) = 0 + end do + end do + + + + + ! ################ 使用FSM计算伴随场 calculate adjoint field by FSM ###################### + + do iter =1,MaxIter + Linf_dif=0; + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + + !x: nr-1 <-> 2, y: nt-1 <-> 2, z: np-1 <-> 2 + do iir=nint(0.5+nr/2.0+(nr/2.0-1.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+1.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-1.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+1.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-1.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+1.5)*pdirec),-pdirec + + + coe = (a2p(iir,iit,iip)-a1m(iir,iit,iip))/dr & + & +(b2p(iir,iit,iip)-b1m(iir,iit,iip))/dt & + & +(c2p(iir,iit,iip)-c1m(iir,iit,iip))/dp + + if (abs(coe)Linf_dif) then + ! print *, iir,iit,iip,tpTableADJ,TableADJ(iir,iit,iip) + !end if + Linf_dif = max(Linf_dif, abs(tpTableADJ-TableADJ(iir,iit,iip))) + + TableADJ(iir,iit,iip) = tpTableADJ + end if + + end do + end do + end do + + end do + end do + end do + + + + if (abs(Linf_dif)ninvr) then + cycle ! 如果与反演网格点无关,考察下一个点 if r is out of inversion grid invr, turn to next point + end if + r1 = (rr(iir)-invr(igrid,1)-(idr-1)*dinvr)/dinvr ! r1=0 -> r=invr(idr); r1=1 -> r=invr(idr+1) + + do iit=1,nt + idt = floor((tt(iit)-invt(igrid,1))/dinvt)+1 + if (idt<0 .or. idt>ninvt) then + cycle ! 如果与反演网格点无关,考察下一个点 + end if + r2 = (tt(iit)-invt(igrid,1)-(idt-1)*dinvt)/dinvt + + do iip=1,np + idp = floor((pp(iip)-invp(igrid,1))/dinvp)+1 + if (idp<0 .or. idp>ninvp) then + cycle ! 如果与反演网格点无关,考察下一个点 + end if + r3 = (pp(iip)-invp(igrid,1)-(idp-1)*dinvp)/dinvp + + if (r1<0 .or. r1>1 .or. r2<0 .or. r2>1 .or. r3<0 .or. r3>1) then + print *, 'error ratio' + pause + end if + + do iik=1,nk + if (idr>=1 .and. idr<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp>=1 .and. idp<=ninvp) then + invkernel(idr,idt,idp,iik) = invkernel(idr,idt,idp,iik) & + & + (1-r1)*(1-r2)*(1-r3)*all_Kernel(iir,iit,iip,iik) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp>=1 .and. idp<=ninvp) then + invkernel(idr+1,idt,idp,iik) = invkernel(idr+1,idt,idp,iik) & + & + r1*(1-r2)*(1-r3)*all_Kernel(iir,iit,iip,iik) + end if + if (idr>=1 .and. idr<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp>=1 .and. idp<=ninvp) then + invkernel(idr,idt+1,idp,iik) = invkernel(idr,idt+1,idp,iik) & + & + (1-r1)*r2*(1-r3)*all_Kernel(iir,iit,iip,iik) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp>=1 .and. idp<=ninvp) then + invkernel(idr+1,idt+1,idp,iik) = invkernel(idr+1,idt+1,idp,iik) & + & + r1*r2*(1-r3)*all_Kernel(iir,iit,iip,iik) + end if + if (idr>=1 .and. idr<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + invkernel(idr,idt,idp+1,iik) = invkernel(idr,idt,idp+1,iik) & + & + (1-r1)*(1-r2)*r3*all_Kernel(iir,iit,iip,iik) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + invkernel(idr+1,idt,idp+1,iik) = invkernel(idr+1,idt,idp+1,iik) & + & + r1*(1-r2)*r3*all_Kernel(iir,iit,iip,iik) + end if + if (idr>=1 .and. idr<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + invkernel(idr,idt+1,idp+1,iik) = invkernel(idr,idt+1,idp+1,iik) & + & + (1-r1)*r2*r3*all_Kernel(iir,iit,iip,iik) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + invkernel(idr+1,idt+1,idp+1,iik) = invkernel(idr+1,idt+1,idp+1,iik) & + & + r1*r2*r3*all_Kernel(iir,iit,iip,iik) + end if + + + end do + + end do + end do + end do + + ! build update value + do iir=1,nr + idr = floor((rr(iir)-invr(igrid,1))/dinvr)+1 ! invr(idr) <= rr(iir) < invr(idr+1) + if (idr<0 .or. idr>ninvr) then + cycle ! 如果与反演网格点无关,考察下一个点 if r is out of inversion grid invr, turn to next point + end if + r1 = (rr(iir)-invr(igrid,1)-(idr-1)*dinvr)/dinvr ! r1=0 -> r=invr(idr); r1=1 -> r=invr(idr+1) + + do iit=1,nt + idt = floor((tt(iit)-invt(igrid,1))/dinvt)+1 + if (idt<0 .or. idt>ninvt) then + cycle ! 如果与反演网格点无关,考察下一个点 + end if + r2 = (tt(iit)-invt(igrid,1)-(idt-1)*dinvt)/dinvt + + do iip=1,np + idp = floor((pp(iip)-invp(igrid,1))/dinvp)+1 + if (idp<0 .or. idp>ninvp) then + cycle ! 如果与反演网格点无关,考察下一个点 + end if + r3 = (pp(iip)-invp(igrid,1)-(idp-1)*dinvp)/dinvp + + if (r1<0 .or. r1>1 .or. r2<0 .or. r2>1 .or. r3<0 .or. r3>1) then + print *, 'error ratio' + pause + end if + + + do iik=1,nk + pert = 0.0 + if (idr>=1 .and. idr<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp>=1 .and. idp<=ninvp) then + pert = pert + invkernel(idr,idt,idp,iik)*(1-r1)*(1-r2)*(1-r3) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp>=1 .and. idp<=ninvp) then + pert = pert + invkernel(idr+1,idt,idp,iik)*r1*(1-r2)*(1-r3) + end if + if (idr>=1 .and. idr<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp>=1 .and. idp<=ninvp) then + pert = pert + invkernel(idr,idt+1,idp,iik)*(1-r1)*r2*(1-r3) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp>=1 .and. idp<=ninvp) then + pert = pert + invkernel(idr+1,idt+1,idp,iik)*r1*r2*(1-r3) + end if + if (idr>=1 .and. idr<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + pert = pert + invkernel(idr,idt,idp+1,iik)*(1-r1)*(1-r2)*r3 + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + pert = pert + invkernel(idr+1,idt,idp+1,iik)*r1*(1-r2)*r3 + end if + if (idr>=1 .and. idr<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + pert = pert + invkernel(idr,idt+1,idp+1,iik)*(1-r1)*r2*r3 + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + pert = pert + invkernel(idr+1,idt+1,idp+1,iik)*r1*r2*r3 + end if + para(iir,iit,iip,iik) = para(iir,iit,iip,iik)+pert + end do + + + end do + end do + end do + + + end do + + + ! rescale + Linf = 0.0 + do iir=1,nr + do iit=1,nt + do iip=1,np + do iik=1,nk + if (Linf < abs(para(iir,iit,iip,iik))) then + Linf = abs(para(iir,iit,iip,iik)) + end if + end do + end do + end do + end do + + do iir=1,nr + do iit=1,nt + do iip=1,np + do iik=1,nk + update_value(iir,iit,iip,iik) = para(iir,iit,iip,iik)/Linf*stepsize + end do + end do + end do + end do + +end subroutine + +subroutine Kernel_Mask(rr,tt,pp,nr,nt,np,kernel,rsou,tsou,psou,radius) + integer :: nr,nt,np + double precision :: rr(nr),tt(nt),pp(np),rsou,tsou,psou,radius + double precision :: kernel(nr,nt,np),dis + integer :: i,j,k + + do i=1,nr + do j=1,nt + do k=1,np + dis = sqrt((rr(i)-rsou)**2+(rsou*(tt(j)-tsou))**2+(rsou*cos(tsou)*(pp(k)-psou))**2) + if ( dis < radius) then + kernel(i,j,k) = kernel(i,j,k) * 0 + end if + end do + end do + end do +end subroutine + +subroutine Kernel_Mask_new(rr,tt,pp,nr,nt,np,kernel,rsou,tsou,psou) + integer :: nr,nt,np + double precision :: rr(nr),tt(nt),pp(np),rsou,tsou,psou,radius + double precision :: kernel(nr,nt,np),dis + integer :: i,j,k + dr = rr(2)-rr(1); dt = tt(2)-tt(1); dp = pp(2)-pp(1); + do i=1,nr + do j=1,nt + do k=1,np + if ( abs(rr(i)-rsou)6351):\n", + " fun_init[ip,it,ir] = 1.0/(5.8+(6371-rr[ir])/20.0*0.7)\n", + " elif (rr[ir]>6336):\n", + " fun_init[ip,it,ir] = 1.0/(6.5+(6351-rr[ir])/15.0*0.6)\n", + " elif (rr[ir]>5961):\n", + " fun_init[ip,it,ir] = 1.0/(8.0+(6336-rr[ir])/375.0*1) \n", + " else:\n", + " fun_init[ip,it,ir] = 1.0/9.0\n", + "\n", + " vel_init[ip,it,ir] = 1.0/fun_init[ip,it,ir]\n", + " a_init[ip,it,ir] = 1.0 + 2.0*zeta_init[ip,it,ir]\n", + " b_init[ip,it,ir] = 1.0 - 2.0*xi_init[ip,it,ir]\n", + " c_init[ip,it,ir] = 1.0 + 2.0*xi_init[ip,it,ir]\n", + " f_init[ip,it,ir] = -2.0 * eta_init[ip,it,ir]\n", + "\n", + " # true model\n", + " if (tt[it] >= 30.0/180.0*math.pi and tt[it] <= 50.0/180.0*math.pi \\\n", + " and pp[ip] >= 15.0/180.0*math.pi and pp[ip] <= 40.0/180.0*math.pi \\\n", + " and rr[ir] >= 6211.0 and rr[ir] <= 6371.0):\n", + " c+=1\n", + " sigma = math.sin(4.0*math.pi*(tt[it]-30.0/180.0*math.pi)/(20.0/180.0*math.pi)) \\\n", + " *math.sin(4.0*math.pi*(pp[ip]-15.0/180.0*math.pi)/(25.0/180.0*math.pi)) \\\n", + " *math.sin(2.0*math.pi*(rr[ir]-6211.0)/160.0)\n", + " else:\n", + " sigma = 0.0\n", + "\n", + " if sigma < 0:\n", + " psi = 60.0/180.0*math.pi\n", + " elif sigma > 0:\n", + " psi = 150.0/180.0*math.pi\n", + " else:\n", + " psi = 0.0\n", + "\n", + " eta_true[ip,it,ir] = ani_p*abs(sigma)*math.sin(2.0*psi)\n", + " xi_true[ip,it,ir] = ani_p*abs(sigma)*math.cos(2.0*psi)\n", + " zeta_true[ip,it,ir] = gamma*math.sqrt(eta_true[ip,it,ir]**2 + xi_true[ip,it,ir]**2)\n", + " fun_true[ip,it,ir] = fun_init[ip,it,ir]/(1.0+sigma*slow_p)\n", + " vel_true[ip,it,ir] = 1.0/fun_true[ip,it,ir] \n", + " a_true[ip,it,ir] = 1.0 + 2.0*zeta_true[ip,it,ir]\n", + " b_true[ip,it,ir] = 1.0 - 2.0*xi_true[ip,it,ir]\n", + " c_true[ip,it,ir] = 1.0 + 2.0*xi_true[ip,it,ir]\n", + " f_true[ip,it,ir] = -2.0 * eta_true[ip,it,ir]\n", + "\n", + "\n", + "\n", + "print(\"depminmax {} {}\".format(R_earth-rr1,R_earth-rr2))\n", + "print(c)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# write out\n", + "import h5py\n", + "\n", + "fout_init = h5py.File('test_model_init.h5', 'w')\n", + "fout_true = h5py.File('test_model_true.h5', 'w')\n", + "\n", + "# write out the arrays eta_init, xi_init, zeta_init, fun_init, a_init, b_init, c_init, f_init\n", + "fout_init.create_dataset('eta', data=eta_init.T)\n", + "fout_init.create_dataset('xi', data=xi_init.T)\n", + "fout_init.create_dataset('zeta', data=zeta_init.T)\n", + "fout_init.create_dataset('fun', data=fun_init.T)\n", + "fout_init.create_dataset('fac_a', data=a_init.T)\n", + "fout_init.create_dataset('fac_b', data=b_init.T)\n", + "fout_init.create_dataset('fac_c', data=c_init.T)\n", + "fout_init.create_dataset('fac_f', data=f_init.T)\n", + "fout_init.create_dataset('vel', data=vel_init.T)\n", + "\n", + "# writeout the arrays eta_true, xi_true, zeta_true, fun_true, a_true, b_true, c_true, f_true\n", + "fout_true.create_dataset('eta', data=eta_true.T)\n", + "fout_true.create_dataset('xi', data=xi_true.T)\n", + "fout_true.create_dataset('zeta', data=zeta_true.T)\n", + "fout_true.create_dataset('fun', data=fun_true.T)\n", + "fout_true.create_dataset('fac_a', data=a_true.T)\n", + "fout_true.create_dataset('fac_b', data=b_true.T)\n", + "fout_true.create_dataset('fac_c', data=c_true.T)\n", + "fout_true.create_dataset('fac_f', data=f_true.T)\n", + "fout_true.create_dataset('vel', data=vel_true.T)\n", + "\n", + "fout_init.close()\n", + "fout_true.close()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# prepare src station file\n", + "\n", + "```\n", + " 26 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- src  : id_src year month day hour min sec lat lon dep_km mag num_recs id_event\n", + " 26 1 PCBI 1.8900 98.9253 1000.0000 P 10.40 18.000 <- arrival : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arrival_time_sec\n", + " 26 2 MRPI 1.6125 99.3172 1100.0000 P 50.84 19.400\n", + " 26 3 HUTI 2.3153 98.9711 1600.0000 P 57.84 19.200\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "random.seed(1145141919810)\n", + "\n", + "# dummys\n", + "year_dummy = 1998\n", + "month_dummy = 1\n", + "day_dummy = 1\n", + "hour_dummy = 0\n", + "minute_dummy = 0\n", + "second_dummy = 0\n", + "mag_dummy = 3.0\n", + "id_dummy = 1000\n", + "st_name_dummy = 'AAAA'\n", + "phase_dummy = 'P'\n", + "dist_dummy = 100.0\n", + "arriv_t_dummy = 0.0\n", + "\n", + "tt1deg = tt1 * 180.0/math.pi\n", + "tt2deg = tt2 * 180.0/math.pi\n", + "pp1deg = pp1 * 180.0/math.pi\n", + "pp2deg = pp2 * 180.0/math.pi\n", + "\n", + "\n", + "n_src = 500\n", + "n_rec = [60 for x in range(n_src)]\n", + "#n_src = 10\n", + "#n_rec = [10 for x in range(n_src)]\n", + "\n", + "\n", + "\n", + "lines = []\n", + "\n", + "pos_src=[]\n", + "pos_rec=[]\n", + "\n", + "# create receiver coordinates\n", + "elev_recs=[]\n", + "lon_recs=[]\n", + "lat_recs=[]\n", + "rec_names=[]\n", + "for i in range(n_rec[0]):\n", + " #elev_recs.append(random.uniform(-100.0,-100.0)) # elevation in m\n", + " elev_recs.append(0) # elevation in m\n", + " lon_recs .append(random.uniform(pp1deg*1.1,pp2deg*0.9))\n", + " lat_recs .append(random.uniform(tt1deg*1.1,tt2deg*0.9))\n", + " rec_names.append(i)\n", + "\n", + "\n", + "\n", + "# create dummy src\n", + "for i_src in range(n_src):\n", + " # define one point in the domain (rr1 bottom, rr2 top)\n", + " dep = random.uniform((R_earth-rr1)*0.1,(R_earth-rr1)*0.9)\n", + " lon = random.uniform(pp1deg,pp2deg)\n", + " lat = random.uniform(tt1deg,tt2deg)\n", + "\n", + " src = [i_src, year_dummy, month_dummy, day_dummy, hour_dummy, minute_dummy, second_dummy, lat, lon, dep, mag_dummy, n_rec[i_src], id_dummy]\n", + " lines.append(src)\n", + "\n", + " pos_src.append([lon,lat,dep])\n", + "\n", + " # create dummy station\n", + " for i_rec in range(n_rec[i_src]):\n", + " #elev_rec = random.uniform(0.0,-10.0) # elevation in m\n", + " #lon_rec = random.uniform(pp1deg,pp2deg)\n", + " #lat_rec = random.uniform(tt1deg,tt2deg)\n", + " elev_rec = elev_recs[i_rec]\n", + " lon_rec = lon_recs[i_rec]\n", + " lat_rec = lat_recs[i_rec]\n", + " st_name_dummy = rec_names[i_rec]\n", + "\n", + "\n", + " rec = [i_src, i_rec, st_name_dummy, lat_rec, lon_rec, elev_rec, phase_dummy, dist_dummy, arriv_t_dummy]\n", + " lines.append(rec)\n", + "\n", + " pos_rec.append([lon_rec,lat_rec,elev_rec])\n", + "\n", + "# write out ev_arrivals file\n", + "fname = 'src_rec_test.dat'\n", + "\n", + "with open(fname, 'w') as f:\n", + " for line in lines:\n", + " for elem in line:\n", + " f.write('{} '.format(elem))\n", + " f.write('\\n')\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# draw src and rec positions\n", + "import matplotlib.pyplot as plt\n", + "\n", + "for i_src in range(n_src):\n", + " plt.scatter(pos_src[i_src][1],pos_src[i_src][0],c='r',marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot receivers\n", + "for i_rec in range(n_rec[0]):\n", + " plt.scatter(pos_rec[i_rec][1],pos_rec[i_rec][0],c='b',marker='o')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "vscode": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_2_one_src/README.md b/test/old_tests/inversion_2_one_src/README.md new file mode 100644 index 0000000..2028979 --- /dev/null +++ b/test/old_tests/inversion_2_one_src/README.md @@ -0,0 +1,14 @@ +# Inversion test + +This is a test setup for inversion calculation. + +1. Run all cells of `make_test_model.ipynb` for creating + - source, receiver file + - true model + - initial model + +2. then run TOMOATT forward with `input_params_pre.yml` for calculating the true arrival times at the stations +-> this will output src_rec_result.dat file which includes the arrival time at each station + +3. run TOMOATT in inversion mode with `input_params.yml`. + \ No newline at end of file diff --git a/test/old_tests/inversion_2_one_src/check_obj_func.ipynb b/test/old_tests/inversion_2_one_src/check_obj_func.ipynb new file mode 100644 index 0000000..c78b61e --- /dev/null +++ b/test/old_tests/inversion_2_one_src/check_obj_func.ipynb @@ -0,0 +1,64 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# check the change of objective values\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "fpath='objective_function.txt'\n", + "\n", + "objs=[]\n", + "\n", + "with open(fpath) as f:\n", + " lines = f.readlines()\n", + "\n", + " for l in lines:\n", + " if(l.startswith('i_inv')):\n", + " continue\n", + " objs.append(float(l.strip().split(',')[1]))\n", + "\n", + "\n", + "plt.plot(objs)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.4 (tags/v3.10.4:9d38120, Mar 23 2022, 23:13:41) [MSC v.1929 64 bit (AMD64)]" + }, + "vscode": { + "interpreter": { + "hash": "cdd74c396a461f81d13d16403c726c38089d3c42a4b6e59262cdb9511d16556b" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_2_one_src/compare_with_fortran_code.ipynb b/test/old_tests/inversion_2_one_src/compare_with_fortran_code.ipynb new file mode 100644 index 0000000..f22668d --- /dev/null +++ b/test/old_tests/inversion_2_one_src/compare_with_fortran_code.ipynb @@ -0,0 +1,491 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# compare result from TOMOATT and fortran code\n", + "\n", + "fpath_kernel_fort = './fortran_code/ega5/output/kernel_step1_sum'\n", + "fpath_synth_fort = './fortran_code/ega5/output/syn_step1_event1' # Table\n", + "fpath_adj_fort = './fortran_code/ega5/output/adj_step1_event1' # TableADJ\n", + "fpath_out_tomoatt = './OUTPUT_FILES/out_data_sim_0.h5'\n", + "fpath_grid_tomoatt = './OUTPUT_FILES/out_data_grid.h5'\n", + "\n", + "# grid information in fortran code\n", + "nr = 55\n", + "nt = 55\n", + "np = 55\n", + "npoints = nr*nt*np\n", + "\n", + "# division\n", + "ndiv_r = 1\n", + "ndiv_t = 2\n", + "ndiv_p = 2 \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "ename": "OSError", + "evalue": "Unable to open file (file signature not found)", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m/home/mnagaso/workspace/TomoATT/test/inversion_2_one_src/compare_with_fortran_code.ipynb Cell 3\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 11\u001b[0m eta \u001b[39m=\u001b[39m f[\u001b[39m'\u001b[39m\u001b[39meta\u001b[39m\u001b[39m'\u001b[39m][:]\n\u001b[1;32m 12\u001b[0m \u001b[39m#zeta = f['zeta'][:]\u001b[39;00m\n\u001b[1;32m 13\u001b[0m \n\u001b[1;32m 14\u001b[0m \u001b[39m# read true model\u001b[39;00m\n\u001b[0;32m---> 15\u001b[0m \u001b[39mwith\u001b[39;00m \u001b[48;5;17mh5py\u001b[39m.\u001b[39;49m\u001b[48;5;17mFile\u001b[48;5;17m(\u001b[48;5;17mfpath_true_model\u001b[48;5;17m,\u001b[48;5;17m \u001b[39m'\u001b[39;49m\u001b[39mr\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[48;5;17m) \u001b[39mas\u001b[39;00m f:\n\u001b[1;32m 16\u001b[0m vel_true \u001b[39m=\u001b[39m f[\u001b[39m'\u001b[39m\u001b[39mvel\u001b[39m\u001b[39m'\u001b[39m][:]\n\u001b[1;32m 17\u001b[0m xi_true \u001b[39m=\u001b[39m f[\u001b[39m'\u001b[39m\u001b[39mxi\u001b[39m\u001b[39m'\u001b[39m][:]\n", + "File \u001b[0;32m~/.local/lib/python3.9/site-packages/h5py/_hl/files.py:507\u001b[0m, in \u001b[0;36mFile.__init__\u001b[0;34m(self, name, mode, driver, libver, userblock_size, swmr, rdcc_nslots, rdcc_nbytes, rdcc_w0, track_order, fs_strategy, fs_persist, fs_threshold, fs_page_size, page_buf_size, min_meta_keep, min_raw_keep, locking, **kwds)\u001b[0m\n\u001b[1;32m 502\u001b[0m fapl \u001b[39m=\u001b[39m make_fapl(driver, libver, rdcc_nslots, rdcc_nbytes, rdcc_w0,\n\u001b[1;32m 503\u001b[0m locking, page_buf_size, min_meta_keep, min_raw_keep, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwds)\n\u001b[1;32m 504\u001b[0m fcpl \u001b[39m=\u001b[39m make_fcpl(track_order\u001b[39m=\u001b[39mtrack_order, fs_strategy\u001b[39m=\u001b[39mfs_strategy,\n\u001b[1;32m 505\u001b[0m fs_persist\u001b[39m=\u001b[39mfs_persist, fs_threshold\u001b[39m=\u001b[39mfs_threshold,\n\u001b[1;32m 506\u001b[0m fs_page_size\u001b[39m=\u001b[39mfs_page_size)\n\u001b[0;32m--> 507\u001b[0m fid \u001b[39m=\u001b[39m \u001b[48;5;17mmake_fid\u001b[48;5;17m(\u001b[48;5;17mname\u001b[48;5;17m,\u001b[48;5;17m \u001b[48;5;17mmode\u001b[48;5;17m,\u001b[48;5;17m \u001b[48;5;17muserblock_size\u001b[48;5;17m,\u001b[48;5;17m \u001b[48;5;17mfapl\u001b[48;5;17m,\u001b[48;5;17m \u001b[48;5;17mfcpl\u001b[48;5;17m,\u001b[48;5;17m \u001b[48;5;17mswmr\u001b[39m=\u001b[39;49m\u001b[48;5;17mswmr\u001b[48;5;17m)\n\u001b[1;32m 509\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39misinstance\u001b[39m(libver, \u001b[39mtuple\u001b[39m):\n\u001b[1;32m 510\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_libver \u001b[39m=\u001b[39m libver\n", + "File \u001b[0;32m~/.local/lib/python3.9/site-packages/h5py/_hl/files.py:220\u001b[0m, in \u001b[0;36mmake_fid\u001b[0;34m(name, mode, userblock_size, fapl, fcpl, swmr)\u001b[0m\n\u001b[1;32m 218\u001b[0m \u001b[39mif\u001b[39;00m swmr \u001b[39mand\u001b[39;00m swmr_support:\n\u001b[1;32m 219\u001b[0m flags \u001b[39m|\u001b[39m\u001b[39m=\u001b[39m h5f\u001b[39m.\u001b[39mACC_SWMR_READ\n\u001b[0;32m--> 220\u001b[0m fid \u001b[39m=\u001b[39m \u001b[48;5;17mh5f\u001b[39m.\u001b[39;49m\u001b[48;5;17mopen\u001b[48;5;17m(\u001b[48;5;17mname\u001b[48;5;17m,\u001b[48;5;17m \u001b[48;5;17mflags\u001b[48;5;17m,\u001b[48;5;17m \u001b[48;5;17mfapl\u001b[39m=\u001b[39;49m\u001b[48;5;17mfapl\u001b[48;5;17m)\n\u001b[1;32m 221\u001b[0m \u001b[39melif\u001b[39;00m mode \u001b[39m==\u001b[39m \u001b[39m'\u001b[39m\u001b[39mr+\u001b[39m\u001b[39m'\u001b[39m:\n\u001b[1;32m 222\u001b[0m fid \u001b[39m=\u001b[39m h5f\u001b[39m.\u001b[39mopen(name, h5f\u001b[39m.\u001b[39mACC_RDWR, fapl\u001b[39m=\u001b[39mfapl)\n", + "File \u001b[0;32mh5py/_objects.pyx:54\u001b[0m, in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mh5py/_objects.pyx:55\u001b[0m, in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mh5py/h5f.pyx:106\u001b[0m, in \u001b[0;36mh5py.h5f.open\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mOSError\u001b[0m: Unable to open file (file signature not found)" + ] + } + ], + "source": [ + "# final model\n", + "fpath_final_model = './OUTPUT_FILES/final_model.h5'\n", + "fpath_true_model = \"./test_model_true.h5\"\n", + "\n", + "import h5py\n", + "\n", + "# read vel, xi, eta dataset \n", + "with h5py.File(fpath_final_model, 'r') as f:\n", + " vel = f['vel'][:]\n", + " xi = f['xi'][:]\n", + " eta = f['eta'][:]\n", + " #zeta = f['zeta'][:]\n", + "\n", + "# read true model\n", + "with h5py.File(fpath_true_model, 'r') as f:\n", + " vel_true = f['vel'][:]\n", + " xi_true = f['xi'][:]\n", + " eta_true = f['eta'][:]\n", + " #zeta_true = f['zeta'][:]\n", + "# plot\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "# plot vel\n", + "plt.figure()\n", + "plt.imshow(vel[:,5,:], origin='lower', aspect='auto')\n", + "plt.colorbar()\n", + "plt.title('vel')\n", + "\n", + "# plot xi\n", + "#plt.figure()\n", + "#plt.imshow(xi[:,:,10].T, origin='lower', aspect='auto')\n", + "#plt.colorbar()\n", + "#plt.title('xi')\n", + "#\n", + "## plot eta\n", + "#plt.figure()\n", + "#plt.imshow(eta[:,:,10].T, origin='lower', aspect='auto')\n", + "#plt.colorbar()\n", + "#plt.title('eta')\n", + "\n", + "# plot vel_true\n", + "plt.figure()\n", + "plt.imshow(vel_true[:,5,:], origin='lower', aspect='auto')\n", + "plt.colorbar()\n", + "plt.title('vel_true')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import h5py\n", + "import numpy\n", + "\n", + "\n", + "# read fortran test file and convert to numpy array\n", + "def read_fortran_result_file(fpath):\n", + " with open(fpath, 'r') as f:\n", + " lines = f.readlines()\n", + " lines = [line.strip() for line in lines]\n", + " lines = [line for line in lines if line]\n", + " lines = [line.split() for line in lines]\n", + " lines = numpy.array(lines, dtype=numpy.float64)\n", + " return lines\n", + "\n", + "fortran_data = read_fortran_result_file(fpath_kernel_fort)\n", + "## change dimension of fortran data\n", + "Ks_fort = fortran_data[:,3].reshape(nr, nt, np)\n", + "Kxi_fort = fortran_data[:,4].reshape(nr, nt, np)\n", + "Keta_fort = fortran_data[:,5].reshape(nr, nt, np)\n", + "\n", + "fortran_synth_data = read_fortran_result_file(fpath_synth_fort).reshape(nr, nt, np)\n", + "fortran_adj_data = read_fortran_result_file(fpath_adj_fort).reshape(nr, nt, np)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# read h5 data\n", + "import sys\n", + "sys.path.append(\"../../utils/\")\n", + "\n", + "from tomoatt_data_retrieval import get_data_from_h5\n", + "\n", + "#Ks_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/Ks_update_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p, verbose=True)\n", + "#Kxi_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/Kxi_update_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n", + "#Keta_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/Keta_update_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n", + "\n", + "Ks_tomoatt ,_,_,_ = get_data_from_h5(fpath_out_tomoatt, fpath_grid_tomoatt, \"Data/Ks_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p, verbose=True)\n", + "Kxi_tomoatt ,_,_,_ = get_data_from_h5(fpath_out_tomoatt, fpath_grid_tomoatt, \"Data/Kxi_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n", + "Keta_tomoatt,_,_,_ = get_data_from_h5(fpath_out_tomoatt,fpath_grid_tomoatt, \"Data/Keta_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n", + "\n", + "Syn_tomoatt,_,_,_ = get_data_from_h5(fpath_out_tomoatt,fpath_grid_tomoatt, \"Data/T_res_src_0_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n", + "Adj_tomoatt,_,_,_ = get_data_from_h5(fpath_out_tomoatt,fpath_grid_tomoatt, \"Data/adjoint_field_src_0_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# plot slice of Ks_inv\n", + "import matplotlib.pyplot as plt\n", + "\n", + "def plot_slice(data_es, data_fort, slice_ax, id_slice, contour=False):\n", + "\n", + " if (slice_ax == 'r'):\n", + " data_es_v = data_es[ id_slice, :, :]\n", + " data_fort_v = data_fort[id_slice, :, :]\n", + " elif (slice_ax == 't'):\n", + " data_es_v = data_es[ :, id_slice, :]\n", + " data_fort_v = data_fort[:, id_slice, :]\n", + " elif (slice_ax == 'p'):\n", + " data_es_v = data_es[ :, :, id_slice]\n", + " data_fort_v = data_fort[:, :, id_slice]\n", + " else:\n", + " print(\"Error: slice_ax should be 'r', 't' or 'p'\")\n", + " return\n", + "\n", + " # use the same color range for both tomoatt and fortran \n", + " combined_data = numpy.array([data_es_v.flatten(),data_fort_v.flatten()])\n", + " #Get the min and max of all your data\n", + " _min, _max = numpy.amin(combined_data), numpy.amax(combined_data)\n", + "\n", + " # make the color range symmetric\n", + " diff_data = data_es_v-data_fort_v\n", + " _min_diff, _max_diff = numpy.amin(diff_data), numpy.amax(diff_data)\n", + " if (abs(_min_diff) > abs(_max_diff)):\n", + " if (_min_diff < 0):\n", + " _max_diff = -_min_diff\n", + " else:\n", + " _min_diff = -_max_diff\n", + "\n", + " cmap1=\"viridis\"\n", + " cmap2=\"seismic\"\n", + "\n", + " plt.figure(figsize=(20,10))\n", + "\n", + " plt.subplot(1,3,1)\n", + " plt.imshow(data_es_v, cmap=cmap1, vmin=_min, vmax=_max)\n", + " plt.colorbar()\n", + " if(contour):\n", + " plt.contour(data_es_v, colors='k', linewidths=0.5)\n", + " plt.title('result_tomoatt')\n", + "\n", + " plt.subplot(1,3,2)\n", + " plt.imshow(data_fort_v, cmap=cmap1, vmin=_min, vmax=_max)\n", + " plt.colorbar()\n", + " if(contour): \n", + " plt.contour(data_fort_v, colors='k', linewidths=0.5)\n", + " plt.title('result_fort')\n", + " \n", + " plt.subplot(1,3,3)\n", + " plt.imshow(diff_data, cmap=cmap2, vmin=_min_diff, vmax=_max_diff)\n", + " plt.colorbar()\n", + " if(contour):\n", + " plt.contour(diff_data, colors='k', linewidths=0.5) \n", + " plt.title('tomoatt-fort')\n", + " plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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JOocEhERERERERGRLKXOIRHJCEYHhEVEZBiqEyIiMjRlDqlzSEREREREREQki6lzSEQyg7IkRERkOKoTIiIyJHUOqXNIRERERERERCSLqXNIRNKfBRNO9iBERCRlqU6IiMiIsrtQqHNIRERERERERCSLqXNIRDKDsiRERGQ4qhMiIjIkZQ6pc0hEREREREREJIupc0hEMoMOCIuIyHBUJ0REZFjqHBIRERERERERkSylySERERERERERkSym08pEJCMYBY2KiMgwVCdERGRoCqRW55CIiIiIiIiISBZT55CIZAYdERYRkeGoToiIyLDUOSQiIiIiIiIiIllKnUMikv4sEE72IEREJGWpToiIyLBUKNQ5JCIiIiIiIiKSxdQ5JCJpz2B1FRoRERmS6oSIiIxMmUMiIiIiIiIiIpKl1DkkIplBR4RFRGQ4qhMiIjIkizqHREREREREREQka6lzSEQyg44Ii4jIcFQnRERkSOocUueQiIiIiIiIiEgWU+eQiKQ/C4STPYjjjDHbgDYihx/6rLULjTGlwAPAVGAbcJ219nCyxigiklVUJ0REZEQpVCiSQJ1DIiJj43xr7Txr7cLo7TuBZ6y1jcAz0dsiIpK9VCdERCRlqHNIRDKCSf0siauAZdHv7weeB+5I1mBERLKN6oSIiAxNmUPqHBIROTHlxpiV/b4+5rCOBZ4yxqzq9/Mqa+3e6Pf7gKpxGa2IiIw31QkREUk76hwSETkxzf1OARjKUmvtbmNMJfC0MWZd/x9aa60xJuUPYYuIyKioToiISNrR5JCIZIYUOl3AWrs7+m+TMeYh4ExgvzGmxlq71xhTAzQldZAiItlGdUJERIal08pERCRBjDF5xpiCo98DK4A1wCPATdHVbgIeTs4IRUQkmVQnREQkFalzSEQygE2lI8JVwEPGGIi8xv7cWvuEMeZ14JfGmFuA7cB1SRyjiEiWUZ0QEZHhKJBak0MiIglkrd0CnOaw/CBw4fiPSEREUonqhIiIpCJNDolI+rOk0hFhERFJNaoTIiIyouzuHFLmkIiIiIiIiIhIFlPnkIhkhnCyByAiIilNdUJERIZkyfZCoc4hEREREREREZEsps4hEckIRlkSIiIyDNUJEREZmq5Wps4hEREREREREZEsps4hEckMOiIsIiLDUZ0QEZFhqXNIRERERERERESylDqHRCT9WSCsI8IiIjIE1QkRERmWMofUOSQiIiIiIiIiksXUOSQiGcAqS0JERIahOiEiIiNR55CIiIiIiIiIiGQpTQ6JiIiIiIiIiGQxnVYmIplBpwuIiMhwVCdERGRIFggnexBJpc4hEREREREREZEsps4hEckMOiIsIiLDUZ0QEZFhKZBaRERERERERESylDqHRCT9WSCsI8IiIjIE1QkRERmWJR06h4wxpcADwFRgG3CdtfZwzDq1wENEmoG8wL9Za78/0r7VOSQiIiIiIiIikvruBJ6x1jYCz0Rvx9oLLLHWzgMWAXcaYyaMtGN1DolIBrBgs/vqAiIiMhzVCRERGU56dA4BVwHLot/fDzwP3NF/BWttb7+bOcTZFKTOIRERERERERGR8VFujFnZ7+tjJ7BtlbV2b/T7fUCV00rGmMnGmHeAncDd1to9I+1YnUMikhl0FRoRERmO6oSIiAxr3DqHmq21C4f6oTHmD0C1w4++1P+GtdYaYxyLm7V2J3Bq9HSy3xpjHrTW7h9uUJocEhERERERERFJAdba5UP9zBiz3xhTY63da4ypAZpG2NceY8wa4BzgweHW1eSQiKQ/XYVGRESGozohIiLDSpvMoUeAm4C7ov8+HLuCMWYScNBa22WMKQGWAt8aacfKHBIRERERERERSX13Ae8zxmwElkdvY4xZaIz5UXSdWcCfjTFvA38EvmGtXT3SjtU5JCKZQVkSIiIyHNUJEREZVupf1dJaexC40GH5SuDW6PdPA6ee6L7VOSQiIiIiIiIiksXUOSQimUFHhEVEZDiqEyIiMqS0yRwaM+ocEhERERERERHJYpocEhERERERERHJYjqtTEQygNXpAiIiMgzVCRERGYlOKxMRERERERERkSylziERSX8WCKf+pSdFRCRJVCdERGRYCqRW55CIiIiIiIiISBZT55CIZAZlSYiIyHBUJ0REZFjZ3WGqziERERERERERkSymziERyQw6IiwiIsNRnRARkSEpc0idQyIiIiIiIiIiWUydQyKSASyEdURYRESGojohIiLDUeeQOodERERERERERLKYOodEJP1ZsDa7ry4gIiLDUJ0QEZERqXNIRERERERERESylDqHRCQzKEtCRESGozohIiJDUuaQOodERERERERERLKYOodEJDNYHREWEZFhqE6IiMiwsjubTp1DIiIiIiIiIiJZTJNDIiIiIiIiIiJZTKeViUj6sxbC2d0GKiIiw1CdEBGRYSmQWp1DIiIiIiIiIiJZTJ1DIpIZFDQqIiLDUZ0QEZFhqXNIRERERERERESylDqHRCQjWGVJiIjIMFQnRERkaMocUueQiIiIiIiIiEgWU+eQiGQAqywJEREZhuqEiIgMR51D6hwSEREREREREcli6hwSkfRngbCOCIuIyBBUJ0REZETqHBIRERERERERkSylziERyQxWV6EREZFhqE6IiMiQLJDddUKdQyIiIiIiIiIiWUydQyKS9ixglSUhIiJDUJ0QEZGRKXNIRERERERERESylDqHRCT9WassCRERGZrqhIiIDMuiziEREREREREREclamhwSEREREREREcliOq1MRDKCgkZFRGQ4qhMiIjI0nVamziERERERERERkSymziERyQwKGhURkeGoToiIyLCyu06oc0hEREREREREJIsZa3X+tYikN2PME0D5ON1ds7X24nG6LxERSQDVCRERGY7qhCaHRERERERERESymk4rExERERERERHJYpocEhERERERERHJYpocEhERERERERHJYpocEhERERERERHJYpocEhERERERERHJYv8/kV7Fg/oRLtoAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_slice(Syn_tomoatt, fortran_synth_data, 'r', 27, contour=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_slice(Ks_tomoatt, Ks_fort, 'p', 28)\n", + "plot_slice(Ks_tomoatt, Ks_fort, 't', 21)\n", + "plot_slice(Ks_tomoatt, Ks_fort, 'r', 36)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_slice(Adj_tomoatt, fortran_adj_data, 't',22)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_slice(Keta_tomoatt, Keta_fort, 'p', 21, contour=False)\n", + "plot_slice(Keta_tomoatt, Keta_fort, 't', 21, contour=False)\n", + "plot_slice(Keta_tomoatt, Keta_fort, 'r', 21, contour=False)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_slice(Kxi_tomoatt, Kxi_fort, 'p', 21, contour=False)\n", + "plot_slice(Kxi_tomoatt, Kxi_fort, 't', 21, contour=False)\n", + "plot_slice(Kxi_tomoatt, Kxi_fort, 'r', 21, contour=False)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_slice(Ks_tomoatt, Keta_fort, 'p', 15, contour=False)\n", + "plot_slice(Ks_tomoatt, Keta_fort, 't', 15, contour=False)\n", + "plot_slice(Ks_tomoatt, Keta_fort, 'r', 25, contour=False)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "vscode": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_2_one_src/fortran_code/Readme.txt b/test/old_tests/inversion_2_one_src/fortran_code/Readme.txt new file mode 100644 index 0000000..3a91b6b --- /dev/null +++ b/test/old_tests/inversion_2_one_src/fortran_code/Readme.txt @@ -0,0 +1,3 @@ +mpif90 ega5_sphe_3d_inversion_Tong_3Dinv.f90 -o a5.out + +mpirun -n 4 a5.out \ No newline at end of file diff --git a/test/old_tests/inversion_2_one_src/fortran_code/ega5/input/EARTHQUAKES.txt b/test/old_tests/inversion_2_one_src/fortran_code/ega5/input/EARTHQUAKES.txt new file mode 100644 index 0000000..9437b06 --- /dev/null +++ b/test/old_tests/inversion_2_one_src/fortran_code/ega5/input/EARTHQUAKES.txt @@ -0,0 +1,2 @@ +1 + 12.902894 37.503373 16.794572 diff --git a/test/old_tests/inversion_2_one_src/fortran_code/ega5/input/STATIONS.txt b/test/old_tests/inversion_2_one_src/fortran_code/ega5/input/STATIONS.txt new file mode 100644 index 0000000..933c4f4 --- /dev/null +++ b/test/old_tests/inversion_2_one_src/fortran_code/ega5/input/STATIONS.txt @@ -0,0 +1,2 @@ +1 +0.0 36.472809 29.812050 diff --git a/test/old_tests/inversion_2_one_src/fortran_code/ega5_sphe_3d_kernel.f90 b/test/old_tests/inversion_2_one_src/fortran_code/ega5_sphe_3d_kernel.f90 new file mode 100644 index 0000000..ad8dfaa --- /dev/null +++ b/test/old_tests/inversion_2_one_src/fortran_code/ega5_sphe_3d_kernel.f90 @@ -0,0 +1,737 @@ +include "eikon_solver_mpi.f90" + + +! example: 3-D 3rd order anisotropic eikonal equation in cartesian coordinate (Point source) +! parameter setting: +! domain: R * Theta * Phi = [6275, 6375] * [49^\circ, 51^\circ] * [129^\circ, 131^\circ] +! analytic solution: T = |x-x_s|/c0 +! isotropic eik equ: Tx^2 + Ty^2 + Tz^2 = s^2, +! boundary condition: T(x0,y0,z0) = 0 (point source) +! test function: 'FSM_WENO3_PS_sphe_3d' in "eikon_solver.f90" +! + +program eikonal_2d + use mpi + +! ######################### 参数声明 parameters statement ######################### + + implicit none + + ! mesh grid + integer,parameter :: nr=55,nt=55,np=55 + double precision,parameter :: pi=3.14159265358979323846264338327950288 + double precision,parameter :: rr1=6070,rr2=6400 + double precision,parameter :: tt1=(30.0-1.5)/180*pi,tt2=(50.0+1.5)/180*pi + double precision,parameter :: pp1=(15.0-1.5)/180*pi,pp2=(40.0+1.5)/180*pi + double precision :: rr(nr),tt(nt),pp(np),dr,dt,dp + + + ! source (STATIONS) & receiver (EARTHQUAKES) + integer :: nsou + double precision,allocatable :: rsou(:),tsou(:),psou(:) ! source (station) + integer :: nrec + double precision,allocatable :: rrec(:),trec(:),prec(:) ! receiver (earthquake) + + ! model parameter + double precision,parameter :: gamma = 0.0 + double precision :: xi(nr,nt,np),eta(nr,nt,np),zeta(nr,nt,np) ! syn model (ani) + double precision :: xiT(nr,nt,np),etaT(nr,nt,np),zetaT(nr,nt,np) ! true model (ani) + double precision :: sigma1,sigma2,psi + double precision,parameter :: slow_p=0.04,ani_p=0.03 + + ! Eikonal solver + double precision :: aT(nr,nt,np),bT(nr,nt,np),cT(nr,nt,np),fT(nr,nt,np),funT(nr,nt,np) ! true model 真实模型 + double precision :: a(nr,nt,np),b(nr,nt,np),c(nr,nt,np),f(nr,nt,np),fun(nr,nt,np) ! syn model 猜测模型 + double precision :: uT(nr,nt,np),TableT(nr,nt,np) !true timetable 真实走时场 + double precision :: u(nr,nt,np),Table(nr,nt,np) !syn timetable 猜测走时场 + !double precision :: T0para(8),tau(nr,nt,np) ! multiplicative factor + + ! adjoint source + double precision,allocatable :: sourceADJ(:),TtimeT(:,:),Ttime(:,:) ! adjoint source 伴随源,真实走时,合成走时 + double precision :: TableADJ(nr,nt,np) ! adjoint field 伴随场 + double precision :: Ks(nr,nt,np),Kxi(nr,nt,np),Keta(nr,nt,np) ! event kernel + integer,parameter :: nk = 3 ! number of kernels + double precision :: all_Ks(nr,nt,np),all_Kxi(nr,nt,np),all_Keta(nr,nt,np) ! sensitivity kernel + double precision :: all_Kernel(nr,nt,np,nk) ! kernels for all parameters together + !double precision,parameter :: radius = 40 ! kernel mask radius + + ! inversion grid + integer,parameter :: ninvr=11,ninvt=10,ninvp=10 ! inversion grid size (coarse) + double precision,parameter :: invr1=6070.0,invr2=6400.0 + double precision,parameter :: invt1=30.0/180*pi,invt2=50.0/180*pi + double precision,parameter :: invp1=15.0/180*pi,invp2=40.0/180*pi + integer,parameter :: ngrid=5 ! number of nultigrid (multigrid technique) + double precision :: invr(ngrid,ninvr),invt(ngrid,ninvt),invp(ngrid,ninvp),dinvr,dinvt,dinvp + double precision :: update_value(nr,nt,np,nk) ! parameter update value 更新参数的变化量 + + ! model update (optimization) + double precision :: stepsize ! stepsize + integer,parameter :: MaxIter=1 ! max iteration step + double precision :: old_obj, obj, sou_obj ! 优化目标函数 objective function + double precision,allocatable :: weight_sou(:),weight_rec(:) !weight function + double precision :: dis_ij, dis_zero !weight function + logical :: weight_sou_bool=.false. , weight_rec_bool= .false. + + ! temp var + double precision :: depth,lat,lon + + ! output file + character(Len=80) :: filename,form,form2 + + ! loop index + integer :: iir,iit,iip,idi,idj,idk,i,j,k,iter,igrid + + ! computing time + double precision :: time_begin,time_end,alpha + + ! mpi parameter + integer :: ierr,myid,nproc + + ! ############################# main work ############################# + + call mpi_init(ierr) + + call mpi_comm_rank(mpi_comm_world,myid,ierr) + call mpi_comm_size(mpi_comm_world,nproc,ierr) + + call CPU_TIME(time_begin) ! program start + + + +! ################### read sources and receivers 读取地震台站数据 ################### + open(10,file='ega5/input/STATIONS.txt') + read(10,*) nsou + allocate(rsou(nsou),tsou(nsou),psou(nsou),weight_sou(nsou)) + do i=1,nsou + read(10,*) depth,lat,lon + rsou(i) = 6371.0-depth + tsou(i) = lat/180.0*pi + psou(i) = lon/180.0*pi + end do + close(10) + + open(10,file='ega5/input/EARTHQUAKES.txt') + read(10,*) nrec + allocate(rrec(nrec),trec(nrec),prec(nrec),weight_rec(nrec)) + do i=1,nrec + read(10,*) depth,lat,lon + rrec(i) = 6371.0-depth + trec(i) = lat/180.0*pi + prec(i) = lon/180.0*pi + end do + close(10) + + ! distance based weight -rec 台站权重 + if (weight_rec_bool) then + dis_zero = 0 + do i=1,nrec-1 + do j=i,nrec + call Epicenter_Distance(trec(i),prec(i),trec(j),prec(j),dis_ij) + dis_zero = dis_zero + dis_ij + end do + end do + dis_zero = dis_zero/nrec/(nrec-1)*2 + dis_zero = dis_zero/2 + + do i=1,nrec + weight_rec(i)=0.0 + do j=1,nrec + call Epicenter_Distance(trec(i),prec(i),trec(j),prec(j),dis_ij) + weight_rec(i) = weight_rec(i) + exp(-(dis_ij/dis_zero)**2) + end do + weight_rec(i) = 1.0/weight_rec(i) + end do + print *, dis_zero + end if + + if (weight_rec_bool) then + ! distance based weight - soruce 地震权重 + dis_zero = 0 + do i=1,nsou-1 + do j=i,nsou + call Epicenter_Distance(tsou(i),psou(i),tsou(j),psou(j),dis_ij) + dis_zero = dis_zero + dis_ij + end do + end do + dis_zero = dis_zero/nsou/(nsou-1)*2 + dis_zero = dis_zero/4 + + do i=1,nsou + weight_sou(i)=0.0 + do j=1,nsou + call Epicenter_Distance(tsou(i),psou(i),tsou(j),psou(j),dis_ij) + weight_sou(i) = weight_sou(i) + exp(-(dis_ij/dis_zero)**2) + end do + weight_sou(i) = 1.0/weight_sou(i) + end do + print *, dis_zero + end if + + ! ---- 记录到 matlab 数据中 matlab record ---- + if (myid .eq. 0) then + open(100,file='ega5/output/STATIONS') + open(101,file='ega5/output/EARTHQUAKES') + do i=1,nsou + write(100,'(f13.7,f13.7,f13.7,f13.7)') rsou(i),tsou(i),psou(i),weight_sou(i) + end do + do i=1,nrec + write(101,'(f13.7,f13.7,f13.7,f13.7)') rrec(i),trec(i),prec(i),weight_rec(i) + end do + close(100);close(101) + end if + +! ######################### 生成网格 build mesh grid ##################################### + ! -------- forward modeling grid ---------- + dr=(rr2-rr1)/(nr-1); dt=(tt2-tt1)/(nt-1); dp=(pp2-pp1)/(np-1) + do iir=1,nr + rr(iir)=rr1+(iir-1)*dr + end do + do iit=1,nt + tt(iit)=tt1+(iit-1)*dt + end do + do iip=1,np + pp(iip)=pp1+(iip-1)*dp + end do + + ! -------- inversion multigrid ---------- + dinvr=(invr2-invr1)/(ninvr-1); dinvt=(invt2-invt1)/(ninvt-1); dinvp=(invp2-invp1)/(ninvp-1) + do igrid=1,ngrid + do iir=1,ninvr + invr(igrid,iir)=invr1+(iir-1)*dinvr-(igrid-1)*dinvr/ngrid + end do + do iit=1,ninvt + invt(igrid,iit)=invt1+(iit-1)*dinvt-(igrid-1)*dinvt/ngrid + end do + do iip=1,ninvp + invp(igrid,iip)=invp1+(iip-1)*dinvp-(igrid-1)*dinvp/ngrid + end do + end do + +! ######################### 构建背景模型 build the synthetic and true model ##################################### + + do iir=1,nr + do iit=1,nt + do iip=1,np + + ! synthetic (initial) model + eta(iir,iit,iip)=0.0; + xi(iir,iit,iip)=0.0; + zeta(iir,iit,iip)=gamma*sqrt(eta(iir,iit,iip)**2+xi(iir,iit,iip)**2) + ! if (rr(iir)>6351) then ! 6371 - 6351 20 km + ! fun(iir,iit,iip) = 1.0/(5.8+(6371-rr(iir))/20.0*0.7) + ! elseif (rr(iir)>6336) then ! 6351 - 6336 15 km + ! fun(iir,iit,iip) = 1.0/(6.5+(6351-rr(iir))/15.0*0.6) + ! elseif (rr(iir)>6251) then ! 6336 - 6251 85 km + ! fun(iir,iit,iip) = 1.0/(8.04+(6336-rr(iir))/85.0*0.01) + ! elseif (rr(iir)>6161) then ! 6251 - 6161 90 km + ! fun(iir,iit,iip) = 1.0/(8.05+(6251-rr(iir))/90.0*0.25) + ! elseif (rr(iir)>5961) then ! 6161 - 5961 200 km + ! fun(iir,iit,iip) = 1.0/(8.30+(6161-rr(iir))/200.0*0.73) + ! else + ! fun(iir,iit,iip) = 1.0/9.03 + ! end if + + if (rr(iir)>6351) then ! 6371 - 6351 20 km + fun(iir,iit,iip) = 1.0/(5.8+(6371-rr(iir))/20.0*0.7) + elseif (rr(iir)>6336) then ! 6351 - 6336 15 km + fun(iir,iit,iip) = 1.0/(6.5+(6351-rr(iir))/15.0*0.6) + elseif (rr(iir)>5961) then ! 6351 - 6336 15 km + fun(iir,iit,iip) = 1.0/(8.0+(6336-rr(iir))/375.0*1) + else + fun(iir,iit,iip) = 1.0/9.0 + end if + + + !read(100,*) xi(iir,iit,iip) + !read(101,*) eta(iir,iit,iip) + !read(102,*) fun(iir,iit,iip) + + a(iir,iit,iip)=1.0+2*zeta(iir,iit,iip); + b(iir,iit,iip)=1.0-2*xi(iir,iit,iip); + c(iir,iit,iip)=1.0+2*xi(iir,iit,iip); + f(iir,iit,iip)=-2*eta(iir,iit,iip); + + Table(iir,iit,iip) = 0 + + + + ! true (target) model + if (tt(iit)>=30.0/180*pi .and. tt(iit)<=50.0/180*pi .and. & + & pp(iip)>=15.0/180*pi .and. pp(iip)<=40.0/180*pi .and. & + & rr(iir)>=6211.0 .and. rr(iir)<=6371.0 ) then + sigma1 = sin(4*pi*(tt(iit)-30.0/180*pi)/(20.0/180*pi))* & + & sin(4*pi*(pp(iip)-15.0/180*pi)/(25.0/180*pi))* & + & sin(2*pi*(rr(iir)-6211)/160.0) + else + sigma1 = 0.0 + end if + + + if (sigma1<0) then + psi = 60.0/180*pi + elseif (sigma1 > 0) then + psi = 150.0/180*pi + else + psi = 0 + end if + + etaT(iir,iit,iip)=ani_p*abs(sigma1)*sin(2*psi); + xiT(iir,iit,iip)=ani_p*abs(sigma1)*cos(2*psi); + zetaT(iir,iit,iip)=gamma*sqrt(etaT(iir,iit,iip)**2+xiT(iir,iit,iip)**2) + + aT(iir,iit,iip)=1.0+2*zetaT(iir,iit,iip); + bT(iir,iit,iip)=1.0-2*xiT(iir,iit,iip); + cT(iir,iit,iip)=1.0+2*xiT(iir,iit,iip); + fT(iir,iit,iip)=-2*etaT(iir,iit,iip); + funT(iir,iit,iip) = fun(iir,iit,iip)/(1+sigma1*slow_p) + + !fun(iir,iit,iip) = funT(iir,iit,iip) + !eta(iir,iit,iip)=etaT(iir,iit,iip); + !xi(iir,iit,iip)=xiT(iir,iit,iip); + !zeta(iir,iit,iip)=zetaT(iir,iit,iip) + !a(iir,iit,iip)=aT(iir,iit,iip) + !b(iir,iit,iip)=bT(iir,iit,iip) + !c(iir,iit,iip)=cT(iir,iit,iip) + !f(iir,iit,iip)=fT(iir,iit,iip) + + TableT(iir,iit,iip) = 0 + u(iir,iit,iip) = 0 + + end do + end do + end do + + + + ! ---- 记录到 matlab 数据中 matlab record ---- + if (myid==0) then + open(100,file='ega5/output/model_true') + open(101,file='ega5/output/model_init') + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & rr(iir),tt(iit),pp(iip), & + & funT(iir,iit,iip),xiT(iir,iit,iip),etaT(iir,iit,iip) + write(101,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & rr(iir),tt(iit),pp(iip), & + & fun(iir,iit,iip),xi(iir,iit,iip),eta(iir,iit,iip) + end do + end do + end do + close(100);close(101) + + ! --------- 多重网格 multiple grid ------ + do igrid=1,Ngrid + select case(igrid) + case (1:9) + write(form,'(I1)') igrid + case (10:99) + write(form,'(I2)') igrid + end select + open(100,file='ega5/output/multigrid'//trim(form)) + + do iir=1,ninvr + do iit=1,ninvt + do iip=1,ninvp + write(100,'(f13.7,f13.7,f13.7)') & + & invr(igrid,iir),invt(igrid,iit),invp(igrid,iip) + end do + end do + end do + close(100) + end do + + end if + + +! ######################### 计算真实到时 calculate true traveltimes ###################### + call mpi_barrier(mpi_comm_world,ierr) + allocate(TtimeT(nsou,nrec)) ! 初始化真实到时表 initiate true traveltimes + allocate(Ttime(nsou,nrec)) ! 初始化合成到时表 initiate syn traveltimes + allocate(sourceADJ(nrec)) ! 初始化伴随源 initiate adjoint source + + if (myid==0) then + print *, ' ' + print *, '----------------- calculating true timetable ... ----------------' + print *, ' ' + end if + + do i=1,nsou ! loop sources (STATIONS) + ! -------- 求解程函方程 solve eikonal equations ------------ + call mpi_barrier(mpi_comm_world,ierr) + !rsou(i)=6371.0; tsou(i)=30.5/180.0*pi; psou(i)=15.5/180.0*pi + call FSM_WENO3_PS_sphe_3d_mul_mpi(rr,tt,pp,nr,nt,np,aT,bT,cT,fT,TableT,funT,rsou(i),tsou(i),psou(i),u) + call mpi_barrier(mpi_comm_world,ierr) + ! -------- 得到真实走时 calculate true arrival time at receiver -------- + call Linear_Interp_3D(rr,tt,pp,TableT,nr,nt,np,rrec,trec,prec,TtimeT(i,:),nrec) + !if ((myid.eq.0) .and. 1>0) then + ! print *, rsou(i),tsou(i)/pi*180,psou(i)/pi*180 + ! open(100,file='ega5/output/arrivaltime') + ! do j=1,nrec + ! write(100,'(i5.3,f8.2,f6.2,f6.2,f8.3)') j, rrec(j),trec(j)/pi*180,prec(j)/pi*180,TtimeT(i,j) + ! end do + ! close(100) + !end if + end do + + print *, '----------------- calculating true timetable over ---------------- ' + +! ######################## 反演开始 inversion start ########################## + + ! ----- 初始化反演参数 initiate inversion parameters ---- + stepsize = 0.01 ! 迭代步长 stepsize + old_obj = 0; obj = 0 ! 目标函数 objective function + + + + if (myid .eq. 0) then + print *, ' ' + print *, '----------------- inversion start ... ----------------' + print *, ' ' + end if + + + + do iter = 1,MaxIter + call mpi_barrier(mpi_comm_world,ierr) + if (myid .eq. 0) then + print *, '----------------- iteration ',iter,' starting ... ----------------' + end if + + ! ----- 初始化参数 initiate parameters ------ + all_Ks = 0; all_Kxi = 0; all_Keta = 0; + obj = 0; + + if (myid .eq. 0) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + end select + filename='ega5/output/misfit_step'//trim(form) + open(998, file=trim(filename)) + end if + + + do i=1,nsou ! loop sources (STATIONS) + +! ######################## 计算合成走时场 calculate synthetic timetable ######################## + if (myid .eq. 0) then + print *, '----------------- calculating synthetic timetable ... ----------------' + end if + + Table = 20 + call mpi_barrier(mpi_comm_world,ierr) + call FSM_WENO3_PS_sphe_3d_mul_mpi(rr,tt,pp,nr,nt,np,a,b,c,f,Table,fun,rsou(i),tsou(i),psou(i),u) + call mpi_barrier(mpi_comm_world,ierr) + ! -------- 得到合成走时 calculate synthetic arrival time at receiver -------- + call Linear_Interp_3D(rr,tt,pp,Table,nr,nt,np,rrec,trec,prec,Ttime(i,:),nrec) + + ! -------- 构造伴随源 build adjoint source ------- + call Adjoint_Source_Dt(Ttime(i,:),TtimeT(i,:),nrec,sourceADJ,sou_obj) ! absolute traveltime difference + if (myid .eq. 0) then + do j=1,nrec + write(998,'(f10.5)') Ttime(i,j)-TtimeT(i,j) + end do + end if + + ! weighting adjoint source + if (weight_rec_bool) then + do j=1,nrec + sourceADJ(j) = sourceADJ(j) * weight_rec(j) + end do + end if + + if (1>0 .and. (myid .eq. 0)) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + end select + select case (i) + case (1:9) + write(form2,'(I1)') i + case (10:99) + write(form2,'(I2)') i + end select + filename='ega5/output/syn_step'//trim(form)//'_event'//trim(form2) + open(100,file=trim(filename)) + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7)') Table(iir,iit,iip) + end do + end do + end do + close(100) + end if +! + + !print *, Ttime(i,:),TtimeT(i,:) + !call Adjoint_Source_Ddt(Ttime(i,:),TtimeT(i,:),nrec,sourceADJ,sou_obj) ! double difference traveltime + !do j=1,nrec-1 + ! do k=j,nrec + ! write(998,'(f10.5)') (Ttime(i,j)-Ttime(i,k))-(TtimeT(i,j)-TtimeT(i,k)) + ! end do + !end do + +! ######################## 计算伴随场 adjoint field ######################## + if (myid .eq. 0) then + ! print *, '----------------- calculating adjoint field ... ----------------' + end if + call FSM_O1_Adj_sphe_3d(rr,tt,pp,nr,nt,np,Table,TableADJ,zeta,xi,eta,nrec,rrec,trec,prec,sourceADJ) + !call FSM_O1_Adj_PS_sphe_3d(rr,tt,pp,nr,nt,np,T0para,tau,TableADJ,zeta,xi,eta,nrec,rrec,trec,prec,sourceADJ) + ! ---- 记录到 matlab 数据中 matlab record (adjoint field) ---- + if (1>0 .and. (myid .eq. 0)) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + end select + select case (i) + case (1:9) + write(form2,'(I1)') i + case (10:99) + write(form2,'(I2)') i + end select + filename='ega5/output/adj_step'//trim(form)//'_event'//trim(form2) + open(100,file=trim(filename)) + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7)') TableADJ(iir,iit,iip) + end do + end do + end do + close(100) + end if +! ######################## 计算敏感核 sensitivity kernel ######################## + !print *, '----------------- calculating kernel ... ----------------' + call Sensitivity_Kernel(rr,tt,pp,nr,nt,np,Table,TableADJ,gamma,xi,eta,fun,Ks,Kxi,Keta) + + ! ------- 抹去伴随源处的大函数值 mask the source ------- + !print *, '----------------- kernel mask ----------------' + !call Kernel_Mask(rr,tt,pp,nr,nt,np,Ks,rsou(i),tsou(i),psou(i),radius) + !call Kernel_Mask(rr,tt,pp,nr,nt,np,Kxi,rsou(i),tsou(i),psou(i),radius) + !call Kernel_Mask(rr,tt,pp,nr,nt,np,Keta,rsou(i),tsou(i),psou(i),radius) + call Kernel_Mask_new(rr,tt,pp,nr,nt,np,Ks,rsou(i),tsou(i),psou(i)) + call Kernel_Mask_new(rr,tt,pp,nr,nt,np,Kxi,rsou(i),tsou(i),psou(i)) + call Kernel_Mask_new(rr,tt,pp,nr,nt,np,Keta,rsou(i),tsou(i),psou(i)) + + ! ---- 记录到 matlab 数据中 matlab record (adjoint field) ---- + if (1<0 .and. myid .eq. 0) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + end select + select case (i) + case (1:9) + write(form2,'(I1)') i + case (10:99) + write(form2,'(I2)') i + end select + filename='ega5/output/kernel_step'//trim(form)//'_event'//trim(form2) + open(100,file=trim(filename)) + + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & rr(iir),tt(iit),pp(iip), & + & Ks(iir,iit,iip),Kxi(iir,iit,iip),Keta(iir,iit,iip) + end do + end do + end do + close(100) + end if + + ! --------- 敏感核,obj叠加 sum kernels and objective function ------- + if (weight_sou_bool) then ! no weight + all_Ks = all_Ks + Ks * weight_sou(i); + all_Kxi = all_Kxi + Kxi * weight_sou(i); + all_Keta = all_Keta + Keta * weight_sou(i); + obj = obj + sou_obj !* weight_sou(i) + else ! source weighted + all_Ks = all_Ks + Ks; + all_Kxi = all_Kxi + Kxi; + all_Keta = all_Keta + Keta; + obj = obj + sou_obj + end if + + end do + + close(998) + + ! ---- 记录到 matlab 数据中 matlab record (kernel) ---- + if (1>0 .and. myid .eq. 0) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + end select + filename='ega5/output/kernel_step'//trim(form)//'_sum' + open(100,file=trim(filename)) + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & rr(iir),tt(iit),pp(iip), & + & all_Ks(iir,iit,iip),all_Kxi(iir,iit,iip),all_Keta(iir,iit,iip) + end do + end do + end do + close(100) + end if +! ##################### 模型更新 model update #################### + print *, '----------------- model updating ... ----------------' + + all_Kernel(:,:,:,1) = all_Ks; + all_Kernel(:,:,:,2) = all_Kxi; + all_Kernel(:,:,:,3) = all_Keta; + + ! ------------ 更新速度(慢度) update velocity (slowness) ------------ + call Parameter_Update_Multigrid(rr,tt,pp,nr,nt,np,all_Kernel,nk, & + & invr,invt,invp,ninvr,ninvt,ninvp,ngrid,stepsize,update_value) + + if (1<0 .and. myid .eq. 0) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + end select + filename='ega5/output/model_update_step'//trim(form) + open(100,file=trim(filename)) + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & rr(iir),tt(iit),pp(iip), & + & -fun(iir,iit,iip)*update_value(iir,iit,iip,1), & + & -update_value(iir,iit,iip,2),-update_value(iir,iit,iip,3) + end do + end do + end do + close(100) + end if + + do iir=1,nr + do iit=1,nt + do iip=1,np + fun(iir,iit,iip) = fun(iir,iit,iip)*(1-update_value(iir,iit,iip,1)) + !fun(iir,iit,iip) = fun(iir,iit,iip) + end do + end do + end do + + ! ------------ 更新xi update xi ------------ + do iir=1,nr + do iit=1,nt + do iip=1,np + xi(iir,iit,iip) = xi(iir,iit,iip)-update_value(iir,iit,iip,2) + end do + end do + end do + + ! ------------ 更新eta update eta ------------ + do iir=1,nr + do iit=1,nt + do iip=1,np + eta(iir,iit,iip) = eta(iir,iit,iip)-update_value(iir,iit,iip,3) + end do + end do + end do + + ! ----------- 更新 update eikonal solver paramater ----------------- + do iir=1,nr + do iit=1,nt + do iip=1,np + b(iir,iit,iip)=1.0-2*xi(iir,iit,iip); + c(iir,iit,iip)=1.0+2*xi(iir,iit,iip); + f(iir,iit,iip)=-2*eta(iir,iit,iip); + end do + end do + end do + + + + +! ##################### 调整下降步长 modify stepsize ############# + if (myid .eq. 0) then + print *, ' ' + end if + + if (1>0 .and. (myid .eq. 0)) then + open(999,file='ega5/output/obj',access='append') + write(999,'(f9.2,f9.6)') obj, stepsize + close(999) + end if + + if (iter == 1 ) then + if (myid .eq. 0) then + write(*,'(a,f9.2)') 'iter 1, obj is', obj + write(*,'(a,f9.6)') 'iter 1, stepsize is', stepsize + end if + elseif (iter >= 2 .and. obj < old_obj) then + !stepsize = min(0.01,stepsize*1.2) + if (myid .eq. 0) then + write(*,'(a,f9.2,a,f9.2)') 'objective function decreases, from', old_obj, ' to', obj + write(*,'(a,f9.6)') 'new stepsize is ', stepsize + end if + elseif (iter >= 2 .and. obj >= old_obj) then + !stepsize = max(0.002,stepsize*0.5) + if (myid .eq. 0) then + write(*,'(a,f9.2,a,f9.2)') 'objective function increases, from', old_obj, ' to', obj + write(*,'(a,f9.6)') 'new stepsize is ', stepsize + end if + end if + + print *, '----------------- iteration ',iter,' over ----------------' + print *, ' ' + print *, ' ' + + + old_obj = obj + + ! ---- 记录到 matlab 数据中 matlab record ---- + if (1>0 .and. (myid .eq. 0)) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + end select + filename='ega5/output/model_step'//trim(form) + open(100,file=trim(filename)) + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & rr(iir),tt(iit),pp(iip), & + & fun(iir,iit,iip),xi(iir,iit,iip),eta(iir,iit,iip) + end do + end do + end do + close(100) + end if + + + if (myid .eq. 0) then + call CPU_TIME(time_end) + write(*,'(f10.2)') time_end - time_begin + end if + + end do + + + call mpi_finalize(ierr) + +end program eikonal_2d + diff --git a/test/old_tests/inversion_2_one_src/fortran_code/eikon_solver_mpi.f90 b/test/old_tests/inversion_2_one_src/fortran_code/eikon_solver_mpi.f90 new file mode 100644 index 0000000..1622bb4 --- /dev/null +++ b/test/old_tests/inversion_2_one_src/fortran_code/eikon_solver_mpi.f90 @@ -0,0 +1,2838 @@ +! 3-D third order LF scheme (point source, sphere, 2nd order accuracy, parallel) (verified by ega1) +subroutine FSM_WENO3_PS_sphe_3d_mul_mpi(rr,tt,pp,nr,nt,np,spha,sphb,sphc,sphf,T,fun,r0,t0,p0,u) + + use mpi + ! a -d -e + ! -d b -f + ! -e -f c + integer nr,nt,np + double precision :: dr,dt,dp,rr(nr),tt(nt),pp(np),a(nr,nt,np),b(nr,nt,np),c(nr,nt,np),f(nr,nt,np) + double precision :: spha(nr,nt,np),sphb(nr,nt,np),sphc(nr,nt,np),sphf(nr,nt,np) + double precision :: fun(nr,nt,np),T(nr,nt,np),ischange(nr,nt,np),u(nr,nt,np),xi(nr,nt,np),eta(nr,nt,np) + double precision :: r1,r2,r3,a0,b0,c0,d0,f0,T0v(nr,nt,np),T0r(nr,nt,np),T0t(nr,nt,np),T0p(nr,nt,np) + double precision :: tau(nr,nt,np),tau_old(nr,nt,np),r0,t0,p0 + integer :: idr0,idt0,idp0 + double precision :: sigr,sigt,sigp,coe,pr1,pr2,wr1,wr2,pt1,pt2,wt1,wt2,pp1,pp2,wp1,wp2,tpT + double precision :: L1_dif,Linf_dif,L1_err,Linf_err + double precision :: t1,p1 + double precision,parameter :: tol = (10.0)**(-4),eps=10.0**(-12) + integer,parameter :: MaxIter=1000 + integer iter,rdirec,tdirec,pdirec,iir,iit,iip + double precision :: x0,y0,z0,x,y,z,xst,yst,zst,e11,e12,e13,e21,e22,e23,e31,e32,e33 + double precision :: xstr,xstt,xstp,ystr,ystt,ystp,zstr,zstt,zstp + integer :: ileft,iright,jleft,jright,ii,jj,kk + logical :: isexit + + integer :: ierr,myid,nproc,tag,istat(mpi_status_size),iproc,ptid(nr,np,nt) + integer :: mpi_ptijk(3,np*nt),mpi_ptn,ipt,int_temp,my_npt + double precision :: mpi_ptv(np*nt),dp_temp + + integer :: ptr1,ptr2,iNumber,total_ptn,Nptn,sNptn,tpNptn + double precision :: ave_ni + integer,allocatable :: proc_irange(:,:,:) + + + isexit = .false. + tag=99 + call mpi_comm_rank(mpi_comm_world,myid,ierr) + call mpi_comm_size(mpi_comm_world,nproc,ierr) + + + ! ------------------------ 构造网格 ------------------------ + dr=rr(2)-rr(1); dt=tt(2)-tt(1); dp=pp(2)-pp(1) + + ! ------------------------ 构造矩阵 ------------------------- + ! a -d -e + ! -d b -f + ! -e -f c + + ! ------------------------ 构造 T0 ------------------------ + + ! 震源处参数离散化 + idr0=floor((r0-rr(1))/dr+1); idt0=floor((t0-tt(1))/dt+1); idp0=floor((p0-pp(1))/dp+1); + r1 = min(1.0,(r0-rr(idr0))/dr); r2 = min(1.0,(t0-tt(idt0))/dt); r3 = min(1.0,(p0-pp(idp0))/dp); + + do iir=1,nr + do iit=1,nt + do iip=1,np + a(iir,iit,iip) = spha(iir,iit,iip) + b(iir,iit,iip) = sphb(iir,iit,iip)/(rr(iir)**2) + c(iir,iit,iip) = sphc(iir,iit,iip)/(rr(iir)**2*cos(tt(iit))**2) + f(iir,iit,iip) = sphf(iir,iit,iip)/(rr(iir)**2*cos(tt(iit))) + end do + end do + end do + + a0=(1-r1)*(1-r2)*(1-r3)*a(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*a(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*a(idr0,idt0+1,idp0)+(1-r1)*r2*r3*a(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*a(idr0+1,idt0,idp0)+r1*(1-r2)*r3*a(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*a(idr0+1,idt0+1,idp0)+r1*r2*r3*a(idr0+1,idt0+1,idp0+1) + + b0=(1-r1)*(1-r2)*(1-r3)*b(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*b(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*b(idr0,idt0+1,idp0)+(1-r1)*r2*r3*b(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*b(idr0+1,idt0,idp0)+r1*(1-r2)*r3*b(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*b(idr0+1,idt0+1,idp0)+r1*r2*r3*b(idr0+1,idt0+1,idp0+1) + + c0=(1-r1)*(1-r2)*(1-r3)*c(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*c(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*c(idr0,idt0+1,idp0)+(1-r1)*r2*r3*c(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*c(idr0+1,idt0,idp0)+r1*(1-r2)*r3*c(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*c(idr0+1,idt0+1,idp0)+r1*r2*r3*c(idr0+1,idt0+1,idp0+1) + + f0=(1-r1)*(1-r2)*(1-r3)*f(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*f(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*f(idr0,idt0+1,idp0)+(1-r1)*r2*r3*f(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*f(idr0+1,idt0,idp0)+r1*(1-r2)*r3*f(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*f(idr0+1,idt0+1,idp0)+r1*r2*r3*f(idr0+1,idt0+1,idp0+1) + !d0=-d0 + + fun0=(1-r1)*(1-r2)*(1-r3)*fun(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*fun(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*fun(idr0,idt0+1,idp0)+(1-r1)*r2*r3*fun(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*fun(idr0+1,idt0,idp0)+r1*(1-r2)*r3*fun(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*fun(idr0+1,idt0+1,idp0)+r1*r2*r3*fun(idr0+1,idt0+1,idp0+1) + + + + ! 构造T0 + do iir=1,nr + do iit=1,nt + do iip=1,np + r1 = rr(iir) + t1 = tt(iit) + p1 = pp(iip) + + T0v(iir,iit,iip) = fun0*sqrt( 1.0/a0*(r1-r0)**2 + c0/(c0*b0-f0**2)*(t1-t0)**2 & + & + b0/(c0*b0-f0**2)*(p1-p0)**2 + 2*f0/(c0*b0-f0**2)*(t1-t0)*(p1-p0) ) + ischange(iir,iit,iip)=1 + if ( T0v(iir,iit,iip)==0 ) then + T0r(iir,iit,iip) = 0 + T0t(iir,iit,iip) = 0 + T0p(iir,iit,iip) = 0 + else + T0r(iir,iit,iip) = fun0**2*(1.0/a0*(r1-r0))/T0v(iir,iit,iip) + T0t(iir,iit,iip) = fun0**2*(c0/(c0*b0-f0**2)*(t1-t0)+f0/(c0*b0-f0**2)*(p1-p0))/T0v(iir,iit,iip) + T0p(iir,iit,iip) = fun0**2*(b0/(c0*b0-f0**2)*(p1-p0)+f0/(c0*b0-f0**2)*(t1-t0))/T0v(iir,iit,iip) + end if + + + if ( abs((rr(iir)-r0)/dr)<=2 .and. abs((tt(iit)-t0)/dt)<=2 .and. abs((pp(iip)-p0)/dp)<= 2) then + tau(iir,iit,iip) = 1 !震源周围几个点,直接认为是常速度结构,给出解析解,即和T0相等 + !tau(iir,iit,iip) = u(iir,iit,iip) - T0v(iir,iit,iip) + ischange(iir,iit,iip)=0 + if (iir==1 .or. iir==nr .or. iit==1 .or. iit==nt .or. iip==1 .or. iip==np) then + write(*,*) 'source on the boundary, mesh error' + print *, rr(iir),t0*180/3.1415927,iit,p0*180/3.1415927,iip + ! pause + end if + !write(*,*) iir-idr0,iit-idt0,iip-idp0,u(iir,iit,iip),T0v(iir,iit,iip),u(iir,iit,iip)-T0v(iir,iit,iip) + else + !tau(iir,iit,iip) = T(iir,iit,iip)/T0v(iir,iit,iip) + tau(iir,iit,iip) = 1 + ischange(iir,iit,iip)=1 + end if + end do + end do + end do + + + L1_err=0; Linf_err=0 + do iir=1,nr + do iit=1,nt + do iip=1,np + L1_err=L1_err+abs(u(iir,iit,iip)-T0v(iir,iit,iip)) + Linf_err=max(Linf_err,abs(T0v(iir,iit,iip)-u(iir,iit,iip))) + if(isnan(L1_err)) then + print *, u(iir,iit,iip),T0v(iir,iit,iip) + pause + end if + end do + end do + end do + L1_err = L1_err/(nr*np*nt) + !if (myid .eq. 0) then + ! write(*,*) 'T0 L1 error is ',L1_err,', T0 Linf error is', Linf_err + !end if + + allocate(proc_irange(2,nproc,nr+nt+np-3-6+1)) + + ! 给每个线程分配计算点 + Nptn=0 + sNptn=0 + + do level = 6,nr+nt+np-3 + ileft = max(2,level-np-nt+2) + iright = min(level-4,nr-1) + + iNumber = iright - ileft + 1 + + total_ptn = 0 + do ip = ileft,iright + total_ptn = total_ptn+(min(level-ip-2,nt-1)-max(2,level-ip-np+1)+1) + end do + Nptn = Nptn + total_ptn ! 总点数 + ave_ni = total_ptn*1.0/nproc + + if (iNumber <= nproc) then + ! 即i的数量小于等于线程数,每个线程分配一个i就好 + tpNptn = 0 + MaxtpNptn = 0 + do ip = ileft,iright + proc_irange(:,ip-ileft+1,level-5)=(/ip,ip/) + tpNptn = (min(level-ip-2,nt-1)-max(2,level-ip-np+1)+1) + MaxtpNptn = max(MaxtpNptn,tpNptn) + end do + do ip = iright+1,ileft+nproc-1 + proc_irange(:,ip-ileft+1,level-5)=(/-1,-2/) + end do + sNptn = sNptn + MaxtpNptn + else + !if (myid .eq. 0) then + ! print *, ileft,iright + !end if + !call sleep(2) + + ! i的数量大于线程数,平均分配,接近 total_ptn/nproc + int_temp = 0 + tpNptn = 0 + MaxtpNptn = 0 + ptr1 = ileft + iproc = 1 + do ptr2 = ileft,iright + int_temp = int_temp + (min(level-ptr2-2,nt-1)-max(2,level-ptr2-np+1)+1) + tpNptn = tpNptn + (min(level-ptr2-2,nt-1)-max(2,level-ptr2-np+1)+1) + !if (myid .eq. 0) then + ! print *, ptr2,(min(level-ptr2-2,nt-1)-max(2,level-ptr2-np+1)+1),int_temp,ave_ni + !end if + !call sleep(2) + if ((int_temp>=ave_ni*iproc) .or. (ptr2 .eq.iright)) then + !if (iproc>nproc) then + ! print *, iproc,nproc + !end if + proc_irange(:,iproc,level-5) = (/ptr1,ptr2/) + ptr1 = ptr2+1 + iproc = iproc +1 + MaxtpNptn = max(MaxtpNptn,tpNptn) + tpNptn = 0 + end if + end do + sNptn = sNptn + MaxtpNptn + !call sleep(2) + end if + !if (myid .eq. 0) then + ! print *, proc_irange(1,:,level-5) + ! print *, proc_irange(2,:,level-5) + ! print *, ' ' + !end if + end do + + ! print *, Nptn*1.0/sNptn + + + ! 正式迭代,更新tau + do iter =1,MaxIter + tau_old = tau + L1_dif=0; Linf_dif=0;L1_err=0;Linf_err=0; + + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + my_npt = 0 + do level = 6,nr+nt+np-3 + ! 2<= ir <= nr-1; 2<= it <= nr-1; 2<=ip <=np-1 + + ileft = max(2,level-np-nt+2) + iright = min(level-4,nr-1) + + mpi_ptn=0 + do ii = proc_irange(1,myid+1,level-5),proc_irange(2,myid+1,level-5) + + jleft = max(2,level-ii-np+1) + jright = min(level-ii-2,nt-1) + do jj = jleft,jright + + kk = level-ii-jj + + if(rdirec<0) then + iir=ii + else + iir=nr+1-ii + end if + if(tdirec<0) then + iit=jj + else + iit=nt+1-jj + end if + if(pdirec<0) then + iip=kk + else + iip=np+1-kk + end if + + + if(ischange(iir,iit,iip)==1) then + + + !sigr=2*sqrt(a(iir,iit,iip)); sigt=2*sqrt(b(iir,iit,iip)); sigp=2*sqrt(c(iir,iit,iip)) + !coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + sigr = 1.0*sqrt(a(iir,iit,iip))*T0v(iir,iit,iip) + sigt = 1.0*sqrt(b(iir,iit,iip))*T0v(iir,iit,iip) + sigp = 1.0*sqrt(c(iir,iit,iip))*T0v(iir,iit,iip) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + ! 构造单方向梯度 3阶 WENO 格式 + + if (iir==2) then + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + wr2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir+1,iit,iip)+tau(iir+2,iit,iip))**2)/ & + & (eps+(tau(iir-1,iit,iip)-2*tau(iir,iit,iip)+tau(iir+1,iit,iip))**2))**2) + pr2=(1-wr2)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr2*(-3*tau(iir,iit,iip)+4*tau(iir+1,iit,iip)-tau(iir+2,iit,iip))/2/dr; + elseif (iir==nr-1) then + wr1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))**2)/ & + & (eps+(tau(iir+1,iit,iip)-2*tau(iir,iit,iip)+tau(iir-1,iit,iip))**2))**2) + pr1=(1-wr1)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr1*(3*tau(iir,iit,iip)-4*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))/2/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + else + wr1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))**2)/ & + & (eps+(tau(iir+1,iit,iip)-2*tau(iir,iit,iip)+tau(iir-1,iit,iip))**2))**2) + pr1=(1.0-wr1)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr1*(3*tau(iir,iit,iip)-4*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))/2/dr; + wr2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir+1,iit,iip)+tau(iir+2,iit,iip))**2)/ & + & (eps+(tau(iir-1,iit,iip)-2*tau(iir,iit,iip)+tau(iir+1,iit,iip))**2))**2) + pr2=(1.0-wr2)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr2*(-3*tau(iir,iit,iip)+4*tau(iir+1,iit,iip)-tau(iir+2,iit,iip))/2/dr; + end if + + if (iit==2) then + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + wt2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit+1,iip)+tau(iir,iit+2,iip))**2)/ & + & (eps+(tau(iir,iit-1,iip)-2*tau(iir,iit,iip)+tau(iir,iit+1,iip))**2))**2) + pt2=(1-wt2)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt2*(-3*tau(iir,iit,iip)+4*tau(iir,iit+1,iip)-tau(iir,iit+2,iip))/2/dt; + elseif (iit==nt-1) then + wt1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))**2)/ & + & (eps+(tau(iir,iit+1,iip)-2*tau(iir,iit,iip)+tau(iir,iit-1,iip))**2))**2) + pt1=(1-wt1)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt1*(3*tau(iir,iit,iip)-4*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))/2/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + else + wt1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))**2)/ & + & (eps+(tau(iir,iit+1,iip)-2*tau(iir,iit,iip)+tau(iir,iit-1,iip))**2))**2) + pt1=(1-wt1)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt1*(3*tau(iir,iit,iip)-4*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))/2/dt; + wt2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit+1,iip)+tau(iir,iit+2,iip))**2)/ & + & (eps+(tau(iir,iit-1,iip)-2*tau(iir,iit,iip)+tau(iir,iit+1,iip))**2))**2) + pt2=(1-wt2)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt2*(-3*tau(iir,iit,iip)+4*tau(iir,iit+1,iip)-tau(iir,iit+2,iip))/2/dt; + end if + + if (iip==2) then + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + wp2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip+1)+tau(iir,iit,iip+2))**2)/ & + & (eps+(tau(iir,iit,iip-1)-2*tau(iir,iit,iip)+tau(iir,iit,iip+1))**2))**2) + pp2=(1-wp2)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp2*(-3*tau(iir,iit,iip)+4*tau(iir,iit,iip+1)-tau(iir,iit,iip+2))/2/dp; + elseif (iip==np-1) then + wp1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))**2)/ & + & (eps+(tau(iir,iit,iip+1)-2*tau(iir,iit,iip)+tau(iir,iit,iip-1))**2))**2) + pp1=(1-wp1)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp1*(3*tau(iir,iit,iip)-4*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))/2/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + else + wp1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))**2)/ & + & (eps+(tau(iir,iit,iip+1)-2*tau(iir,iit,iip)+tau(iir,iit,iip-1))**2))**2) + pp1=(1-wp1)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp1*(3*tau(iir,iit,iip)-4*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))/2/dp; + wp2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip+1)+tau(iir,iit,iip+2))**2)/ & + & (eps+(tau(iir,iit,iip-1)-2*tau(iir,iit,iip)+tau(iir,iit,iip+1))**2))**2) + pp2=(1-wp2)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp2*(-3*tau(iir,iit,iip)+4*tau(iir,iit,iip+1)-tau(iir,iit,iip+2))/2/dp; + end if + + !计算 LF Hamiltonian + + !Htau=sqrt( a(iir,iit,iip)*((pr1+pr2)/2)**2 + b(iir,iit,iip)*((pt1+pt2)/2)**2 & + !& + c(iir,iit,iip)*((pp1+pp2)/2)**2 -2*f(iir,iit,iip)*(pt1+pt2)/2*(pp1+pp2)/2 & + !& + a(iir,iit,iip)*(pr1+pr2)*T0r(iir,iit,iip) & + !& + b(iir,iit,iip)*(pt1+pt2)*T0t(iir,iit,iip) - f(iir,iit,iip)*(pt1+pt2)*T0p(iir,iit,iip) & + !& + c(iir,iit,iip)*(pp1+pp2)*T0p(iir,iit,iip) - f(iir,iit,iip)*(pp1+pp2)*T0t(iir,iit,iip) & + !& + a(iir,iit,iip)*T0r(iir,iit,iip)**2 & + !& + b(iir,iit,iip)*T0t(iir,iit,iip)**2 + c(iir,iit,iip)*T0p(iir,iit,iip)**2 & + !& - 2*f(iir,iit,iip)*T0t(iir,iit,iip)*T0p(iir,iit,iip) ) + + Htau = sqrt( & + & a(iir,iit,iip)*(T0r(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pr1+pr2)/2)**2 & + & + b(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2)**2 & + &-2*f(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2) & + & *(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2) ) + + + ! 更新 timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + !write(*,*) fun(iir,iit,iip),Htau + + tau(iir,iit,iip) = tpT + + + mpi_ptn=mpi_ptn+1 + mpi_ptijk(:,mpi_ptn) = (/iir,iit,iip/) + mpi_ptv(mpi_ptn) = tpT + my_npt = my_npt + 1 + end if + end do + end do + + !if (1>2) then + ! 数据通信 步骤1, 其他线程传输给主线程 + if (myid .eq. 0) then + ! 负责接受数据 + do iproc=1,nproc-1 + call mpi_recv(int_temp,1,mpi_integer,iproc,tag,mpi_comm_world,istat,ierr) + if (int_temp .ne. 0) then + call mpi_recv(mpi_ptijk(1,mpi_ptn+1),int_temp*3,mpi_integer,iproc,tag+1, & + & mpi_comm_world,istat,ierr) + call mpi_recv(mpi_ptv(mpi_ptn+1),int_temp,mpi_double_precision,iproc,tag+2, & + & mpi_comm_world,istat,ierr) + ! 接收完数据,赋值 + do ipt=mpi_ptn+1,mpi_ptn+int_temp + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + mpi_ptn = mpi_ptn + int_temp + end if + end do + else + ! 负责发送数据 + call mpi_send(mpi_ptn,1,mpi_integer,0,tag,mpi_comm_world,ierr) + !print *, mpi_ptn, mpi_ptijk(:,1:mpi_ptn), mpi_ptv(1:mpi_ptn) + if (mpi_ptn .ne. 0) then + call mpi_send(mpi_ptijk,3*mpi_ptn,mpi_integer,0,tag+1,mpi_comm_world,ierr) + call mpi_send(mpi_ptv,mpi_ptn,mpi_double_precision,0,tag+2,mpi_comm_world,ierr) + end if + end if + + ! 数据通信 步骤2, 主线程将更新后的level数据广播到其他线程 + + call mpi_bcast(mpi_ptn,1,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptijk,3*mpi_ptn,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptv,mpi_ptn,mpi_double_precision,0,mpi_comm_world,ierr) + + ! 数据广播完成,开始赋值 + if (myid .ne. 0) then + do ipt=1,mpi_ptn + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + end if + + call mpi_barrier(mpi_comm_world,ierr) + !end if + end do + + ! print *, my_npt, Nptn + + ! 处理边界 + + do iit=1,nt + do iip=1,np + if (tau(3,iit,iip)>0) then + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + else + tau(1,iit,iip) = min(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + end if + if (tau(nr-2,iit,iip)>0) then + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + else + tau(nr,iit,iip) = min(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + end if + end do + end do + do iir=1,nr + do iip=1,np + if (tau(iir,3,iip)>0) then + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + else + tau(iir,1,iip) = min(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + end if + if (tau(iir,nt-2,iip)>0) then + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + else + tau(iir,nt,iip) = min(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + end if + end do + end do + do iir=1,nr + do iit=1,nt + if (tau(iir,iit,3)>0) then + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + else + tau(iir,iit,1) = min(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + end if + if (tau(iir,iit,np-2)>0) then + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + else + tau(iir,iit,np) = min(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + end if + end do + end do + + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip)) + end do + end do + end do + + do iir=3,nr-2 + do iit=3,nt-2 + do iip=3,np-2 + L1_err=L1_err+abs(u(iir,iit,iip)-T0v(iir,iit,iip)*tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(T0v(iir,iit,iip)*tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-4)*(nt-4)*(np-4)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (myid .eq. 0) then + ! ################ iteration information ################# + if (abs(L1_dif) 2, y: nt-1 <-> 2, z: np-1 <-> 2 + !sigr = 0; sigt=0; sigp=0 + !do iir=1,nr + ! do iit=1,nt + ! do iip=1,np + ! sigr = max(sigr,2*sqrt(a(iir,iit,iip))*T0v(iir,iit,iip)) + ! sigt = max(sigt,2*sqrt(b(iir,iit,iip))*T0v(iir,iit,iip)) + ! sigp = max(sigp,2*sqrt(c(iir,iit,iip))*T0v(iir,iit,iip)) + ! end do + ! end do + !end do + !coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + + do iir=nint(0.5+nr/2.0+(nr/2.0-1.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+1.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-1.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+1.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-1.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+1.5)*pdirec),-pdirec + + if(ischange(iir,iit,iip)==1) then + sigr = 2*sqrt(a(iir,iit,iip))*T0v(iir,iit,iip) + sigt = 2*sqrt(b(iir,iit,iip))*T0v(iir,iit,iip) + sigp = 2*sqrt(c(iir,iit,iip))*T0v(iir,iit,iip) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + ! 构造单方向梯度 3阶 WENO 格式 + + if (iir==2) then + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + wr2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir+1,iit,iip)+tau(iir+2,iit,iip))**2)/ & + & (eps+(tau(iir-1,iit,iip)-2*tau(iir,iit,iip)+tau(iir+1,iit,iip))**2))**2) + pr2=(1-wr2)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr2*(-3*tau(iir,iit,iip)+4*tau(iir+1,iit,iip)-tau(iir+2,iit,iip))/2/dr; + elseif (iir==nr-1) then + wr1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))**2)/ & + & (eps+(tau(iir+1,iit,iip)-2*tau(iir,iit,iip)+tau(iir-1,iit,iip))**2))**2) + pr1=(1-wr1)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr1*(3*tau(iir,iit,iip)-4*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))/2/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + else + wr1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))**2)/ & + & (eps+(tau(iir+1,iit,iip)-2*tau(iir,iit,iip)+tau(iir-1,iit,iip))**2))**2) + pr1=(1.0-wr1)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr1*(3*tau(iir,iit,iip)-4*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))/2/dr; + wr2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir+1,iit,iip)+tau(iir+2,iit,iip))**2)/ & + & (eps+(tau(iir-1,iit,iip)-2*tau(iir,iit,iip)+tau(iir+1,iit,iip))**2))**2) + pr2=(1.0-wr2)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr2*(-3*tau(iir,iit,iip)+4*tau(iir+1,iit,iip)-tau(iir+2,iit,iip))/2/dr; + end if + + if (iit==2) then + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + wt2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit+1,iip)+tau(iir,iit+2,iip))**2)/ & + & (eps+(tau(iir,iit-1,iip)-2*tau(iir,iit,iip)+tau(iir,iit+1,iip))**2))**2) + pt2=(1.0-wt2)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt2*(-3*tau(iir,iit,iip)+4*tau(iir,iit+1,iip)-tau(iir,iit+2,iip))/2/dt; + elseif (iit==nt-1) then + wt1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))**2)/ & + & (eps+(tau(iir,iit+1,iip)-2*tau(iir,iit,iip)+tau(iir,iit-1,iip))**2))**2) + pt1=(1.0-wt1)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt1*(3*tau(iir,iit,iip)-4*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))/2/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + else + wt1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))**2)/ & + & (eps+(tau(iir,iit+1,iip)-2*tau(iir,iit,iip)+tau(iir,iit-1,iip))**2))**2) + pt1=(1.0-wt1)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt1*(3*tau(iir,iit,iip)-4*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))/2/dt; + wt2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit+1,iip)+tau(iir,iit+2,iip))**2)/ & + & (eps+(tau(iir,iit-1,iip)-2*tau(iir,iit,iip)+tau(iir,iit+1,iip))**2))**2) + pt2=(1-wt2)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt2*(-3*tau(iir,iit,iip)+4*tau(iir,iit+1,iip)-tau(iir,iit+2,iip))/2/dt; + end if + + if (iip==2) then + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + wp2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip+1)+tau(iir,iit,iip+2))**2)/ & + & (eps+(tau(iir,iit,iip-1)-2*tau(iir,iit,iip)+tau(iir,iit,iip+1))**2))**2) + pp2=(1.0-wp2)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp2*(-3*tau(iir,iit,iip)+4*tau(iir,iit,iip+1)-tau(iir,iit,iip+2))/2/dp; + elseif (iip==np-1) then + wp1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))**2)/ & + & (eps+(tau(iir,iit,iip+1)-2*tau(iir,iit,iip)+tau(iir,iit,iip-1))**2))**2) + pp1=(1.0-wp1)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp1*(3*tau(iir,iit,iip)-4*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))/2/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + else + wp1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))**2)/ & + & (eps+(tau(iir,iit,iip+1)-2*tau(iir,iit,iip)+tau(iir,iit,iip-1))**2))**2) + pp1=(1.0-wp1)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp1*(3*tau(iir,iit,iip)-4*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))/2/dp; + wp2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip+1)+tau(iir,iit,iip+2))**2)/ & + & (eps+(tau(iir,iit,iip-1)-2*tau(iir,iit,iip)+tau(iir,iit,iip+1))**2))**2) + pp2=(1.0-wp2)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp2*(-3*tau(iir,iit,iip)+4*tau(iir,iit,iip+1)-tau(iir,iit,iip+2))/2/dp; + end if + + !计算 LF Hamiltonian + + !Htau=sqrt( a(iir,iit,iip)*((pr1+pr2)/2)**2 + b(iir,iit,iip)*((pt1+pt2)/2)**2 & + !& + c(iir,iit,iip)*((pp1+pp2)/2)**2 -2*f(iir,iit,iip)*(pt1+pt2)/2*(pp1+pp2)/2 & + !& + a(iir,iit,iip)*(pr1+pr2)*T0r(iir,iit,iip) & + !& + b(iir,iit,iip)*(pt1+pt2)*T0t(iir,iit,iip) - f(iir,iit,iip)*(pt1+pt2)*T0p(iir,iit,iip) & + !& + c(iir,iit,iip)*(pp1+pp2)*T0p(iir,iit,iip) - f(iir,iit,iip)*(pp1+pp2)*T0t(iir,iit,iip) & + !& + a(iir,iit,iip)*T0r(iir,iit,iip)**2 & + !& + b(iir,iit,iip)*T0t(iir,iit,iip)**2 + c(iir,iit,iip)*T0p(iir,iit,iip)**2 & + !& - 2*f(iir,iit,iip)*T0t(iir,iit,iip)*T0p(iir,iit,iip) ) + + Htau = sqrt( & + & a(iir,iit,iip)*(T0r(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pr1+pr2)/2)**2 & + & + b(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2)**2 & + &-2*f(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2) & + & *(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2) ) + + if (isnan(Htau)) then + print *, iir,iit,iip + print *, a(iir,iit,iip)*(T0r(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pr1+pr2)/2)**2 + print *, b(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2)**2 + print *, c(iir,iit,iip)*(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2)**2 + pause + end if + + ! 更新 timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + !write(*,*) fun(iir,iit,iip),Htau + + tau(iir,iit,iip) = tpT + end if + + + end do + end do + end do + + ! 处理边界 + + do iit=1,nt + do iip=1,np + !if (tau(3,iit,iip)>0) then + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + !else + ! tau(1,iit,iip) = min(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + !end if + !if (tau(nr-2,iit,iip)>0) then + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + !else + ! tau(nr,iit,iip) = min(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + !end if + end do + end do + do iir=1,nr + do iip=1,np + !if (tau(iir,3,iip)>0) then + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + !else + ! tau(iir,1,iip) = min(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + !end if + !if (tau(iir,nt-2,iip)>0) then + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + !else + ! tau(iir,nt,iip) = min(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + !end if + end do + end do + do iir=1,nr + do iit=1,nt + !if (tau(iir,iit,3)>0) then + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + !else + ! tau(iir,iit,1) = min(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + !end if + !if (tau(iir,iit,np-2)>0) then + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + !else + ! tau(iir,iit,np) = min(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + !end if + end do + end do + + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip)) + end do + end do + end do + + do iir=3,nr-2 + do iit=3,nt-2 + do iip=3,np-2 + L1_err=L1_err+abs(u(iir,iit,iip)-T0v(iir,iit,iip)*tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(T0v(iir,iit,iip)*tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-4)*(nt-4)*(np-4)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (abs(L1_dif)=ave_ni*iproc) .or. (ptr2 .eq.iright)) then + !if (iproc>nproc) then + ! print *, iproc,nproc + !end if + proc_irange(:,iproc,level-5) = (/ptr1,ptr2/) + ptr1 = ptr2+1 + iproc = iproc +1 + MaxtpNptn = max(MaxtpNptn,tpNptn) + tpNptn = 0 + end if + end do + sNptn = sNptn + MaxtpNptn + !call sleep(2) + end if + !if (myid .eq. 0) then + ! print *, proc_irange(1,:,level-5) + ! print *, proc_irange(2,:,level-5) + ! print *, ' ' + !end if + end do + + ! print *, Nptn*1.0/sNptn + + + ! 正式迭代,更新tau + do iter =1,MaxIter + tau_old = tau + L1_dif=0; Linf_dif=0;L1_err=0;Linf_err=0; + + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + my_npt = 0 + do level = 6,nr+nt+np-3 + ! 2<= ir <= nr-1; 2<= it <= nr-1; 2<=ip <=np-1 + + ileft = max(2,level-np-nt+2) + iright = min(level-4,nr-1) + + mpi_ptn=0 + do ii = proc_irange(1,myid+1,level-5),proc_irange(2,myid+1,level-5) + + jleft = max(2,level-ii-np+1) + jright = min(level-ii-2,nt-1) + do jj = jleft,jright + + kk = level-ii-jj + + if(rdirec<0) then + iir=ii + else + iir=nr+1-ii + end if + if(tdirec<0) then + iit=jj + else + iit=nt+1-jj + end if + if(pdirec<0) then + iip=kk + else + iip=np+1-kk + end if + + + if(ischange(iir,iit,iip)==1) then + + + !sigr=2*sqrt(a(iir,iit,iip)); sigt=2*sqrt(b(iir,iit,iip)); sigp=2*sqrt(c(iir,iit,iip)) + !coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + sigr = 2*sqrt(a(iir,iit,iip))*T0v(iir,iit,iip) + sigt = 2*sqrt(b(iir,iit,iip))*T0v(iir,iit,iip) + sigp = 2*sqrt(c(iir,iit,iip))*T0v(iir,iit,iip) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + ! 构造单方向梯度 1 阶格式 + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + + !计算 LF Hamiltonian + + ! additive + !Htau=sqrt( a(iir,iit,iip)*((pr1+pr2)/2)**2 + b(iir,iit,iip)*((pt1+pt2)/2)**2 & + !& + c(iir,iit,iip)*((pp1+pp2)/2)**2 -2*f(iir,iit,iip)*(pt1+pt2)/2*(pp1+pp2)/2 & + !& + a(iir,iit,iip)*(pr1+pr2)*T0r(iir,iit,iip) & + !& + b(iir,iit,iip)*(pt1+pt2)*T0t(iir,iit,iip) - f(iir,iit,iip)*(pt1+pt2)*T0p(iir,iit,iip) & + !& + c(iir,iit,iip)*(pp1+pp2)*T0p(iir,iit,iip) - f(iir,iit,iip)*(pp1+pp2)*T0t(iir,iit,iip) & + !& + a(iir,iit,iip)*T0r(iir,iit,iip)**2 & + !& + b(iir,iit,iip)*T0t(iir,iit,iip)**2 + c(iir,iit,iip)*T0p(iir,iit,iip)**2 & + !& - 2*f(iir,iit,iip)*T0t(iir,iit,iip)*T0p(iir,iit,iip) ) + + ! multiplicative + Htau = sqrt( & + & a(iir,iit,iip)*(T0r(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pr1+pr2)/2)**2 & + & + b(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2)**2 & + &-2*f(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2) & + & *(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2) ) + + + ! 更新 timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + !write(*,*) fun(iir,iit,iip),Htau + + tau(iir,iit,iip) = tpT + + + mpi_ptn=mpi_ptn+1 + mpi_ptijk(:,mpi_ptn) = (/iir,iit,iip/) + mpi_ptv(mpi_ptn) = tpT + my_npt = my_npt + 1 + end if + end do + end do + + !if (1>2) then + ! 数据通信 步骤1, 其他线程传输给主线程 + if (myid .eq. 0) then + ! 负责接受数据 + do iproc=1,nproc-1 + call mpi_recv(int_temp,1,mpi_integer,iproc,tag,mpi_comm_world,istat,ierr) + if (int_temp .ne. 0) then + call mpi_recv(mpi_ptijk(1,mpi_ptn+1),int_temp*3,mpi_integer,iproc,tag+1, & + & mpi_comm_world,istat,ierr) + call mpi_recv(mpi_ptv(mpi_ptn+1),int_temp,mpi_double_precision,iproc,tag+2, & + & mpi_comm_world,istat,ierr) + ! 接收完数据,赋值 + do ipt=mpi_ptn+1,mpi_ptn+int_temp + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + mpi_ptn = mpi_ptn + int_temp + end if + end do + else + ! 负责发送数据 + call mpi_send(mpi_ptn,1,mpi_integer,0,tag,mpi_comm_world,ierr) + !print *, mpi_ptn, mpi_ptijk(:,1:mpi_ptn), mpi_ptv(1:mpi_ptn) + if (mpi_ptn .ne. 0) then + call mpi_send(mpi_ptijk,3*mpi_ptn,mpi_integer,0,tag+1,mpi_comm_world,ierr) + call mpi_send(mpi_ptv,mpi_ptn,mpi_double_precision,0,tag+2,mpi_comm_world,ierr) + end if + end if + + ! 数据通信 步骤2, 主线程将更新后的level数据广播到其他线程 + + call mpi_bcast(mpi_ptn,1,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptijk,3*mpi_ptn,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptv,mpi_ptn,mpi_double_precision,0,mpi_comm_world,ierr) + + ! 数据广播完成,开始赋值 + if (myid .ne. 0) then + do ipt=1,mpi_ptn + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + end if + + call mpi_barrier(mpi_comm_world,ierr) + !end if + end do + + ! print *, my_npt, Nptn + + ! 处理边界 + + do iit=1,nt + do iip=1,np + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + end do + end do + do iir=1,nr + do iip=1,np + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + end do + end do + do iir=1,nr + do iit=1,nt + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + end do + end do + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip)) + end do + end do + end do + + do iir=3,nr-2 + do iit=3,nt-2 + do iip=3,np-2 + L1_err=L1_err+abs(u(iir,iit,iip)-T0v(iir,iit,iip)*tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(T0v(iir,iit,iip)*tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-4)*(nt-4)*(np-4)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (myid .eq. 0) then + ! ################ iteration information ################# + if (abs(L1_dif)=ave_ni*iproc) .or. (ptr2 .eq.iright)) then + + proc_irange(:,iproc,level-5) = (/ptr1,ptr2/) + ptr1 = ptr2+1 + iproc = iproc +1 + MaxtpNptn = max(MaxtpNptn,tpNptn) + tpNptn = 0 + end if + end do + sNptn = sNptn + MaxtpNptn + end if + end do + + ! print *, Nptn*1.0/sNptn + + + ! 正式迭代,更新tau + do iter =1,MaxIter + tau_old = tau + L1_dif=0; Linf_dif=0;L1_err=0;Linf_err=0; + + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + my_npt = 0 + do level = 6,nr+nt+np-3 + ! 2<= ir <= nr-1; 2<= it <= nr-1; 2<=ip <=np-1 + + ileft = max(2,level-np-nt+2) + iright = min(level-4,nr-1) + + mpi_ptn=0 + do ii = proc_irange(1,myid+1,level-5),proc_irange(2,myid+1,level-5) + + jleft = max(2,level-ii-np+1) + jright = min(level-ii-2,nt-1) + do jj = jleft,jright + + kk = level-ii-jj + + if(rdirec<0) then + iir=ii + else + iir=nr+1-ii + end if + if(tdirec<0) then + iit=jj + else + iit=nt+1-jj + end if + if(pdirec<0) then + iip=kk + else + iip=np+1-kk + end if + + + if(ischange(iir,iit,iip)==1) then + + + !sigr=2*sqrt(a(iir,iit,iip)); sigt=2*sqrt(b(iir,iit,iip)); sigp=2*sqrt(c(iir,iit,iip)) + !coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + sigr = sqrt(a(iir,iit,iip)) + sigt = sqrt(b(iir,iit,iip)) + sigp = sqrt(c(iir,iit,iip)) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + ! partial derivatives + + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + + !计算 LF Hamiltonian + + Htau=sqrt( a(iir,iit,iip)*((pr1+pr2)/2)**2 + b(iir,iit,iip)*((pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*((pp1+pp2)/2)**2 -2*f(iir,iit,iip)*(pt1+pt2)/2*(pp1+pp2)/2) + + ! 更新 update timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + tau(iir,iit,iip) = tpT + + + mpi_ptn=mpi_ptn+1 + mpi_ptijk(:,mpi_ptn) = (/iir,iit,iip/) + mpi_ptv(mpi_ptn) = tpT + my_npt = my_npt + 1 + end if + end do + end do + + !if (1>2) then + ! 数据通信 步骤1, 其他线程传输给主线程 + if (myid .eq. 0) then + ! 负责接受数据 + do iproc=1,nproc-1 + call mpi_recv(int_temp,1,mpi_integer,iproc,tag,mpi_comm_world,istat,ierr) + if (int_temp .ne. 0) then + call mpi_recv(mpi_ptijk(1,mpi_ptn+1),int_temp*3,mpi_integer,iproc,tag+1, & + & mpi_comm_world,istat,ierr) + call mpi_recv(mpi_ptv(mpi_ptn+1),int_temp,mpi_double_precision,iproc,tag+2, & + & mpi_comm_world,istat,ierr) + ! 接收完数据,赋值 + do ipt=mpi_ptn+1,mpi_ptn+int_temp + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + mpi_ptn = mpi_ptn + int_temp + end if + end do + else + ! 负责发送数据 + call mpi_send(mpi_ptn,1,mpi_integer,0,tag,mpi_comm_world,ierr) + !print *, mpi_ptn, mpi_ptijk(:,1:mpi_ptn), mpi_ptv(1:mpi_ptn) + if (mpi_ptn .ne. 0) then + call mpi_send(mpi_ptijk,3*mpi_ptn,mpi_integer,0,tag+1,mpi_comm_world,ierr) + call mpi_send(mpi_ptv,mpi_ptn,mpi_double_precision,0,tag+2,mpi_comm_world,ierr) + end if + end if + + ! 数据通信 步骤2, 主线程将更新后的level数据广播到其他线程 + + call mpi_bcast(mpi_ptn,1,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptijk,3*mpi_ptn,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptv,mpi_ptn,mpi_double_precision,0,mpi_comm_world,ierr) + + ! 数据广播完成,开始赋值 + if (myid .ne. 0) then + do ipt=1,mpi_ptn + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + end if + + call mpi_barrier(mpi_comm_world,ierr) + !end if + end do + + ! print *, my_npt, Nptn + + ! 处理边界 + + do iit=2,nt-1 + do iip=2,np-1 + if (tau(3,iit,iip)>0) then + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + else + tau(1,iit,iip) = min(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + end if + if (tau(nr-2,iit,iip)>0) then + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + else + tau(nr,iit,iip) = min(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + end if + end do + end do + do iir=2,nr-1 + do iip=2,np-1 + if (tau(iir,3,iip)>0) then + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + else + tau(iir,1,iip) = min(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + end if + if (tau(iir,nt-2,iip)>0) then + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + else + tau(iir,nt,iip) = min(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + end if + end do + end do + do iir=2,nr-1 + do iit=2,nt-1 + if (tau(iir,iit,3)>0) then + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + else + tau(iir,iit,1) = min(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + end if + if (tau(iir,iit,np-2)>0) then + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + else + tau(iir,iit,np) = min(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + end if + end do + end do + + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip)) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))) + end do + end do + end do + + do iir=3,nr-2 + do iit=3,nt-2 + do iip=3,np-2 + L1_err=L1_err+abs(u(iir,iit,iip)-tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-4)*(nt-4)*(np-4)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (myid .eq. 0) then + ! ################ iteration information ################# + if (abs(L1_dif) 2, y: nt-1 <-> 2, z: np-1 <-> 2 + + do iir=nint(0.5+nr/2.0+(nr/2.0-1.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+1.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-1.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+1.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-1.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+1.5)*pdirec),-pdirec + + if(ischange(iir,iit,iip)==1) then + sigr=sqrt(a(iir,iit,iip)); sigt=sqrt(b(iir,iit,iip)); sigp=sqrt(c(iir,iit,iip)) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + ! forward and backward partial derivatives + + + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + + + ! calculate LF Hamiltonian + + Htau=sqrt( a(iir,iit,iip)*((pr1+pr2)/2)**2 + b(iir,iit,iip)*((pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*((pp1+pp2)/2)**2 -2*f(iir,iit,iip)*(pt1+pt2)/2*(pp1+pp2)/2 ) + + ! 更新 update timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + !write(*,*) fun(iir,iit,iip),Htau + + if (tpT < tau(iir,iit,iip)) then + tau(iir,iit,iip) = tpT + end if + + end if + + + end do + end do + end do + + ! boundary + + do iit=1,nt + do iip=1,np + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + end do + end do + do iir=1,nr + do iip=1,np + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + end do + end do + do iir=1,nr + do iit=1,nt + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + end do + end do + + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip)) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))) + end do + end do + end do + + do iir=3,nr-2 + do iit=3,nt-2 + do iip=3,np-2 + L1_err=L1_err+abs(u(iir,iit,iip)-tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-4)*(nt-4)*(np-4)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (myid .eq. 0) then + ! ################ iteration information ################# + if (abs(L1_dif)x0 ) then + idx0=iix + exit + end if + end do + do iiy=1,ny-1 + if (yy(iiy)<= y0 .and. yy(iiy+1)>y0 ) then + idy0=iiy + exit + end if + end do + do iiy=1,ny-1 + if (zz(iiz)<= z0 .and. zz(iiz+1)>z0 ) then + idz0=iiz + exit + end if + end do + + if (idx0<=0 .or. idy0<0 .or. idz0<0) then + write(*,*) 'point out of the mesh' + pause + return + end if + + dx = xx(idx0+1)-xx(idx0) + dy = yy(idy0+1)-yy(idy0) + dz = zz(idz0+1)-zz(idz0) + + r1 = min(1.0, (x0-xx(idx0))/dx ) + r2 = min(1.0, (y0-yy(idy0))/dy ) + r3 = min(1.0, (z0-zz(idz0))/dz ) + + v0 = (1-r1)*(1-r2)*(1-r3)*val(idx0,idy0,idz0) + (1-r1)*(1-r2)*r3*val(idx0,idy0,idz0+1) & + & + (1-r1)*r2*(1-r3)*val(idx0,idy0+1,idz0) + (1-r1)*r2*r3*val(idx0,idy0+1,idz0+1) & + & + r1*(1-r2)*(1-r3)*val(idx0+1,idy0,idz0) + r1*(1-r2)*r3*val(idx0+1,idy0,idz0+1) & + & + r1*r2*(1-r3)*val(idx0+1,idy0+1,idz0) + r1*r2*r3*val(idx0+1,idy0+1,idz0+1) +end subroutine + +! 3-D interpolation uniform mesh +subroutine Linear_Interp_3D(xx,yy,zz,val,nx,ny,nz,x0,y0,z0,v0,n0) + integer :: nx,ny,nz,idx0,idy0,idz0,n0 + double precision :: xx(nx),yy(ny),zz(nz),val(nx,ny,nz),x0(n0),y0(n0),z0(n0),v0(n0),dx,dy,dz + double precision :: r1,r2,r3 + integer :: iix,iiy,iiz,i + + dx = xx(2)-xx(1) + dy = yy(2)-yy(1) + dz = zz(2)-zz(1) + + do i=1,n0 + idx0 = floor((x0(i)-xx(1))/dx)+1 + idy0 = floor((y0(i)-yy(1))/dy)+1 + idz0 = floor((z0(i)-zz(1))/dz)+1 + + if (idx0<1 .or. idx0>nx-1 .or. idy0<1 .or. idy0>ny-1 .or. idz0<1 .or. idz0>nz-1) then + write(*,*) 'point out of the mesh' + pause + return + end if + + r1 = min(1.0, (x0(i)-xx(idx0))/dx ) + r2 = min(1.0, (y0(i)-yy(idy0))/dy ) + r3 = min(1.0, (z0(i)-zz(idz0))/dz ) + + v0(i) = (1-r1)*(1-r2)*(1-r3)*val(idx0,idy0,idz0) + (1-r1)*(1-r2)*r3*val(idx0,idy0,idz0+1) & + & + (1-r1)*r2*(1-r3)*val(idx0,idy0+1,idz0) + (1-r1)*r2*r3*val(idx0,idy0+1,idz0+1) & + & + r1*(1-r2)*(1-r3)*val(idx0+1,idy0,idz0) + r1*(1-r2)*r3*val(idx0+1,idy0,idz0+1) & + & + r1*r2*(1-r3)*val(idx0+1,idy0+1,idz0) + r1*r2*r3*val(idx0+1,idy0+1,idz0+1) + end do +end subroutine + +subroutine FSM_O1_Adj_sphe_3d(rr,tt,pp,nr,nt,np,Table,TableADJ,zeta,xi,eta,Nrec,rrec,trec,prec,sourceADJ) + + integer :: nr,nt,np,Nrec + double precision :: dr,dt,dp,rr(nr),tt(nt),pp(np) + double precision :: Table(nr,nt,np),TableADJ(nr,nt,np),delta(nr,nt,np) + double precision :: zeta(nr,nt,np),xi(nr,nt,np),eta(nr,nt,np) + double precision :: rrec(Nrec),trec(Nrec),prec(Nrec),sourceADJ(Nrec) + double precision :: a1,a1m(nr,nt,np),a1p(nr,nt,np),a2,a2m(nr,nt,np),a2p(nr,nt,np) + double precision :: b1,b1m(nr,nt,np),b1p(nr,nt,np),b2,b2m(nr,nt,np),b2p(nr,nt,np) + double precision :: c1,c1m(nr,nt,np),c1p(nr,nt,np),c2,c2m(nr,nt,np),c2p(nr,nt,np) + double precision :: coe + + integer,parameter :: MaxIter=100 + double precision,parameter :: tol=10.0**(-6),eps=10.0**(-6) + + integer :: iir,iit,iip,idi,idj,idk,rdirec,tdirec,pdirec + double precision :: r1,r2,r3,Linf_dif,tpTabldADJ,Hamilton + double precision :: tmpr1,tmpr2,tmpt1,tmpt2 + + ! ####### 网格间距 mesh size ######## + dr = rr(2)-rr(1) + dt = tt(2)-tt(1) + dp = pp(2)-pp(1) + + ! ################# 构造源项 build the sourece term, the delta function ################# + do iir = 1,nr + do iit = 1,nt + do iip= 1,np + delta(iir,iit,iip) = 0 + TableADJ(iir,iit,iip) = 0 + end do + end do + end do + + ! ------- 遍历每个台站,给予delta函数贡献 loop each station to contribute the delta function ------- + do ir=1,Nrec + idi=floor((rrec(ir)-rr(1))/dr+1); + idj=floor((trec(ir)-tt(1))/dt+1); + idk=floor((prec(ir)-pp(1))/dp+1); + + r1 = min(1.0,(rrec(ir)-rr(idi))/dr); + r2 = min(1.0,(trec(ir)-tt(idj))/dt); + r3 = min(1.0,(prec(ir)-pp(idk))/dp); + + delta(idi,idj,idk) = delta(idi,idj,idk) + sourceADJ(ir)*(1-r1)*(1-r2)*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj,idk) = delta(idi+1,idj,idk) + sourceADJ(ir)*r1*(1-r2)*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi,idj+1,idk) = delta(idi,idj+1,idk) + sourceADJ(ir)*(1-r1)*r2*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj+1,idk) = delta(idi+1,idj+1,idk) + sourceADJ(ir)*r1*r2*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi,idj,idk+1) = delta(idi,idj,idk+1) + sourceADJ(ir)*(1-r1)*(1-r2)*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj,idk+1) = delta(idi+1,idj,idk+1) + sourceADJ(ir)*r1*(1-r2)*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi,idj+1,idk+1) = delta(idi,idj+1,idk+1) + sourceADJ(ir)*(1-r1)*r2*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj+1,idk+1) = delta(idi+1,idj+1,idk+1) + sourceADJ(ir)*r1*r2*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + !print *, delta(idi,idj,idk),delta(idi+1,idj+1,idk+1) + end do + + ! ################# 构造方程系数 calculate coefficients of equations ################# + do iir = 2,nr-1 + do iit = 2,nt-1 + do iip= 2,np-1 + tmpr1 = (rr(iir-1)+rr(iir))/2; tmpt1 = (tt(iit-1)+tt(iit))/2; + !tmpr2 = (rr(iir)+rr(iir+1))/2; tmpt2 = (tt(iit)+tt(iit-1))/2; + tmpr2 = (rr(iir)+rr(iir+1))/2; tmpt2 = (tt(iit)+tt(iit+1))/2; + + a1 = -(1+zeta(iir-1,iit,iip)+zeta(iir,iit,iip))*(Table(iir,iit,iip)-Table(iir-1,iit,iip))/dr + a1m(iir,iit,iip) = (a1-abs(a1))/2; a1p(iir,iit,iip) = (a1+abs(a1))/2; + a2 = -(1+zeta(iir,iit,iip)+zeta(iir+1,iit,iip))*(Table(iir+1,iit,iip)-Table(iir,iit,iip))/dr + a2m(iir,iit,iip) = (a2-abs(a2))/2; a2p(iir,iit,iip) = (a2+abs(a2))/2; + + !b1 = -(1-xi(iir,iit-1,iip)-xi(iir,iit,iip))/(tmpr1**2)*(Table(iir,iit,iip)-Table(iir,iit-1,iip))/dt & + ! & -(eta(iir,iit-1,iip)+eta(iir,iit,iip))/(cos(tmpt1)*tmpr1**2)/(4*dp) & + b1 = -(1-xi(iir,iit-1,iip)-xi(iir,iit,iip))/(rr(iir)**2)*(Table(iir,iit,iip)-Table(iir,iit-1,iip))/dt & + & -(eta(iir,iit-1,iip)+eta(iir,iit,iip))/(cos(tmpt1)*rr(iir)**2)/(4*dp) & + & *((Table(iir,iit-1,iip+1)-Table(iir,iit-1,iip-1))+(Table(iir,iit,iip+1)-Table(iir,iit,iip-1))) + b1m(iir,iit,iip) = (b1-abs(b1))/2; b1p(iir,iit,iip) = (b1+abs(b1))/2; + + !b2 = -(1-xi(iir,iit,iip)-xi(iir,iit+1,iip))/(tmpr2**2)*(Table(iir,iit+1,iip)-Table(iir,iit,iip))/dt & + ! & -(eta(iir,iit,iip)+eta(iir,iit+1,iip))/(cos(tmpt2)*tmpr2**2)/(4*dp) & + b2 = -(1-xi(iir,iit,iip)-xi(iir,iit+1,iip))/(rr(iir)**2)*(Table(iir,iit+1,iip)-Table(iir,iit,iip))/dt & + & -(eta(iir,iit,iip)+eta(iir,iit+1,iip))/(cos(tmpt2)*rr(iir)**2)/(4*dp) & + & *((Table(iir,iit,iip+1)-Table(iir,iit,iip-1))+(Table(iir,iit+1,iip+1)-Table(iir,iit+1,iip-1))) + b2m(iir,iit,iip) = (b2-abs(b2))/2; b2p(iir,iit,iip) = (b2+abs(b2))/2; + + !c1 = -(eta(iir,iit,iip-1)+eta(iir,iit,iip))/(cos(tmpt1)*tmpr1**2)/(4*dt) & + c1 = -(eta(iir,iit,iip-1)+eta(iir,iit,iip))/(cos(tt(iit))*rr(iir)**2)/(4*dt) & + & *((Table(iir,iit+1,iip-1)-Table(iir,iit-1,iip-1))+(Table(iir,iit+1,iip)-Table(iir,iit-1,iip))) & + ! & -(1+xi(iir,iit,iip-1)+xi(iir,iit,iip))/(cos(tmpt1)**2*tmpr1**2)*(Table(iir,iit,iip)-Table(iir,iit,iip-1))/dp + & -(1+xi(iir,iit,iip-1)+xi(iir,iit,iip))/ & + & (cos(tt(iit))**2*rr(iir)**2)*(Table(iir,iit,iip)-Table(iir,iit,iip-1))/dp + c1m(iir,iit,iip) = (c1-abs(c1))/2; c1p(iir,iit,iip) = (c1+abs(c1))/2; + + !c2 = -(eta(iir,iit,iip)+eta(iir,iit,iip+1))/(cos(tmpt2)*tmpr2**2)/(4*dt) & + c2 = -(eta(iir,iit,iip)+eta(iir,iit,iip+1))/(cos(tt(iit))*rr(iir)**2)/(4*dt) & + & *((Table(iir,iit+1,iip)-Table(iir,iit-1,iip))+(Table(iir,iit+1,iip+1)-Table(iir,iit-1,iip+1))) & + ! & -(1+xi(iir,iit,iip)+xi(iir,iit,iip+1))/(cos(tmpt2)**2*tmpr2**2)*(Table(iir,iit,iip+1)-Table(iir,iit,iip))/dp + & -(1+xi(iir,iit,iip)+xi(iir,iit,iip+1)) & + & /(cos(tt(iit))**2*rr(iir)**2)*(Table(iir,iit,iip+1)-Table(iir,iit,iip))/dp + c2m(iir,iit,iip) = (c2-abs(c2))/2; c2p(iir,iit,iip) = (c2+abs(c2))/2; + + end do + end do + end do + + + ! ################# 固定伴随场边界条件 fix the boundary of the adjoint field ###################### + ! -------- R,Theta boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(iir,iit,1) = 0 + TableADJ(iir,iit,np) = 0 + end do + end do + ! -------- R,Phi boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(iir,1,iip) = 0 + TableADJ(iir,nt,iip) = 0 + end do + end do + ! -------- Theta,Phi boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(1,iit,iip) = 0 + TableADJ(nr,iit,iip) = 0 + end do + end do + + + + + ! ################ 使用FSM计算伴随场 calculate adjoint field by FSM ###################### + + do iter =1,MaxIter + Linf_dif=0; + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + + !x: nr-1 <-> 2, y: nt-1 <-> 2, z: np-1 <-> 2 + do iir=nint(0.5+nr/2.0+(nr/2.0-1.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+1.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-1.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+1.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-1.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+1.5)*pdirec),-pdirec + + + coe = (a2p(iir,iit,iip)-a1m(iir,iit,iip))/dr & + & +(b2p(iir,iit,iip)-b1m(iir,iit,iip))/dt & + & +(c2p(iir,iit,iip)-c1m(iir,iit,iip))/dp + + if (abs(coe)Linf_dif) then + ! print *, iir,iit,iip,tpTableADJ,TableADJ(iir,iit,iip) + !end if + Linf_dif = max(Linf_dif, abs(tpTableADJ-TableADJ(iir,iit,iip))) + + TableADJ(iir,iit,iip) = tpTableADJ + end if + + end do + end do + end do + + end do + end do + end do + + + + if (abs(Linf_dif) r1+(iir+0.5)*dr, t1+iit*dt, p1+iip*dp + a0 = T0para(1); b0 = T0para(2); c0 = T0para(3); f0 = T0para(4); fun0 = T0para(5); + r0 = T0para(6); t0 = T0para(7); p0 = T0para(8); + + do iir=1,nr-1 + do iit=1,nt + do iip=1,np + r1 = rr(iir)+0.5*dr; t1 = tt(iit); p1 = pp(iip) + T0v_hr(iir,iit,iip) = fun0*sqrt( 1.0/a0*(r1-r0)**2 + c0/(c0*b0-f0**2)*(t1-t0)**2 & + & + b0/(c0*b0-f0**2)*(p1-p0)**2 + 2*f0/(c0*b0-f0**2)*(t1-t0)*(p1-p0) ) + if ( T0v_hr(iir,iit,iip)==0 ) then + T0r_hr(iir,iit,iip) = 0 + else + T0r_hr(iir,iit,iip) = fun0**2*(1.0/a0*(r1-r0))/T0v_hr(iir,iit,iip) + end if + end do + end do + end do + ! 构造T0_ht iir,iit,iip -> r1+iir*dr, t1+(iit+0.5)*dt, p1+iip*dp + do iir=1,nr + do iit=1,nt-1 + do iip=1,np + r1 = rr(iir); t1 = tt(iit)+0.5*dt; p1 = pp(iip) + T0v_ht(iir,iit,iip) = fun0*sqrt( 1.0/a0*(r1-r0)**2 + c0/(c0*b0-f0**2)*(t1-t0)**2 & + & + b0/(c0*b0-f0**2)*(p1-p0)**2 + 2*f0/(c0*b0-f0**2)*(t1-t0)*(p1-p0) ) + if ( T0v_ht(iir,iit,iip)==0 ) then + T0t_ht(iir,iit,iip) = 0 + T0p_ht(iir,iit,iip) = 0 + else + T0t_ht(iir,iit,iip) = fun0**2*(c0/(c0*b0-f0**2)*(t1-t0)+f0/(c0*b0-f0**2)*(p1-p0))/T0v_ht(iir,iit,iip) + T0p_ht(iir,iit,iip) = fun0**2*(b0/(c0*b0-f0**2)*(p1-p0)+f0/(c0*b0-f0**2)*(t1-t0))/T0v_ht(iir,iit,iip) + end if + end do + end do + end do + ! 构造T0_hp iir,iit,iip -> r1+iir*dr, t1+iit*dt, p1+(iip+0.5)*dp + do iir=1,nr + do iit=1,nt + do iip=1,np-1 + r1 = rr(iir); t1 = tt(iit); p1 = pp(iip)+0.5*dp + T0v_hp(iir,iit,iip) = fun0*sqrt( 1.0/a0*(r1-r0)**2 + c0/(c0*b0-f0**2)*(t1-t0)**2 & + & + b0/(c0*b0-f0**2)*(p1-p0)**2 + 2*f0/(c0*b0-f0**2)*(t1-t0)*(p1-p0) ) + if ( T0v_hp(iir,iit,iip)==0 ) then + T0t_hp(iir,iit,iip) = 0 + T0p_hp(iir,iit,iip) = 0 + else + T0t_hp(iir,iit,iip) = fun0**2*(c0/(c0*b0-f0**2)*(t1-t0)+f0/(c0*b0-f0**2)*(p1-p0))/T0v_hp(iir,iit,iip) + T0p_hp(iir,iit,iip) = fun0**2*(b0/(c0*b0-f0**2)*(p1-p0)+f0/(c0*b0-f0**2)*(t1-t0))/T0v_hp(iir,iit,iip) + end if + end do + end do + end do + + + + + ! ################# 构造方程系数 calculate coefficients of equations ################# + do iir = 2,nr-1 + do iit = 2,nt-1 + do iip= 2,np-1 + tmpt1 = (tt(iit-1)+tt(iit))/2; + tmpt2 = (tt(iit)+tt(iit-1))/2; + + a1 = -(1+zeta(iir-1,iit,iip)+zeta(iir,iit,iip)) & + & *(T0r_hr(iir-1,iit,iip)*(tau(iir,iit,iip)+tau(iir-1,iit,iip))/2 & + & + T0v_hr(iir-1,iit,iip)*(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr) + a1m(iir,iit,iip) = (a1-abs(a1))/2; a1p(iir,iit,iip) = (a1+abs(a1))/2; + a2 = -(1+zeta(iir,iit,iip)+zeta(iir+1,iit,iip)) & + & *(T0r_hr(iir,iit,iip)*(tau(iir+1,iit,iip)+tau(iir,iit,iip))/2 & + & + T0v_hr(iir,iit,iip)*(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr) + a2m(iir,iit,iip) = (a2-abs(a2))/2; a2p(iir,iit,iip) = (a2+abs(a2))/2; + + b1 = -(1-xi(iir,iit-1,iip)-xi(iir,iit,iip))/(rr(iir)**2)* & + & (T0t_ht(iir,iit-1,iip)*(tau(iir,iit,iip)+tau(iir,iit-1,iip))/2 & + & + T0v_ht(iir,iit-1,iip)*(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt) & + & -(eta(iir,iit-1,iip)+eta(iir,iit,iip))/(cos(tmpt1)*rr(iir)**2)* & + & (T0p_ht(iir,iit-1,iip)*(tau(iir,iit,iip)+tau(iir,iit-1,iip))/2 & + & + T0v_ht(iir,iit-1,iip)*(tau(iir,iit-1,iip+1)-tau(iir,iit-1,iip-1) & + & + tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/(4*dp)) + b1m(iir,iit,iip) = (b1-abs(b1))/2; b1p(iir,iit,iip) = (b1+abs(b1))/2; + b2 = -(1-xi(iir,iit,iip)-xi(iir,iit+1,iip))/(rr(iir)**2)* & + & (T0t_ht(iir,iit,iip)*(tau(iir,iit+1,iip)+tau(iir,iit,iip))/2 & + & + T0v_ht(iir,iit,iip)*(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt) & + & -(eta(iir,iit,iip)+eta(iir,iit+1,iip))/(cos(tmpt2)*rr(iir)**2)* & + & (T0p_ht(iir,iit,iip)*(tau(iir,iit+1,iip)+tau(iir,iit,iip))/2 & + & + T0v_ht(iir,iit,iip)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1) & + & + tau(iir,iit+1,iip+1)-tau(iir,iit+1,iip-1))/(4*dp)) + b2m(iir,iit,iip) = (b2-abs(b2))/2; b2p(iir,iit,iip) = (b2+abs(b2))/2; + + c1 = -(eta(iir,iit,iip-1)+eta(iir,iit,iip))/(cos(tt(iit))*rr(iir)**2)* & + & (T0t_hp(iir,iit,iip-1)*(tau(iir,iit,iip)+tau(iir,iit,iip-1))/2 & + & + T0v_hp(iir,iit,iip-1)*(tau(iir,iit+1,iip-1)-tau(iir,iit-1,iip-1) & + & +tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/(4*dt)) & + & -(1+xi(iir,iit,iip-1)+xi(iir,iit,iip))/(cos(tt(iit))**2*rr(iir)**2)* & + & (T0p_hp(iir,iit,iip-1)*(tau(iir,iit,iip)+tau(iir,iit,iip-1))/2 & + & + T0v_hp(iir,iit,iip-1)*(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp) + c1m(iir,iit,iip) = (c1-abs(c1))/2; c1p(iir,iit,iip) = (c1+abs(c1))/2; + c2 = -(eta(iir,iit,iip)+eta(iir,iit,iip+1))/(cos(tt(iit))*rr(iir)**2)* & + & (T0t_hp(iir,iit,iip)*(tau(iir,iit,iip+1)+tau(iir,iit,iip))/2 & + & + T0v_hp(iir,iit,iip)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip) & + & +tau(iir,iit+1,iip+1)-tau(iir,iit-1,iip+1))/(4*dt)) & + & -(1+xi(iir,iit,iip)+xi(iir,iit,iip+1))/(cos(tt(iit))**2*rr(iir)**2)* & + & (T0p_hp(iir,iit,iip)*(tau(iir,iit,iip+1)+tau(iir,iit,iip))/2 & + & + T0v_hp(iir,iit,iip)*(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp) + c2m(iir,iit,iip) = (c2-abs(c2))/2; c2p(iir,iit,iip) = (c2+abs(c2))/2; + + end do + end do + end do + + + ! ################# 固定伴随场边界条件 fix the boundary of the adjoint field ###################### + ! -------- R,Theta boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(iir,iit,1) = 0 + TableADJ(iir,iit,np) = 0 + end do + end do + ! -------- R,Phi boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(iir,1,iip) = 0 + TableADJ(iir,nt,iip) = 0 + end do + end do + ! -------- Theta,Phi boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(1,iit,iip) = 0 + TableADJ(nr,iit,iip) = 0 + end do + end do + + + + + ! ################ 使用FSM计算伴随场 calculate adjoint field by FSM ###################### + + do iter =1,MaxIter + Linf_dif=0; + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + + !x: nr-1 <-> 2, y: nt-1 <-> 2, z: np-1 <-> 2 + do iir=nint(0.5+nr/2.0+(nr/2.0-1.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+1.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-1.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+1.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-1.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+1.5)*pdirec),-pdirec + + + coe = (a2p(iir,iit,iip)-a1m(iir,iit,iip))/dr & + & +(b2p(iir,iit,iip)-b1m(iir,iit,iip))/dt & + & +(c2p(iir,iit,iip)-c1m(iir,iit,iip))/dp + + if (abs(coe)Linf_dif) then + ! print *, iir,iit,iip,tpTableADJ,TableADJ(iir,iit,iip) + !end if + Linf_dif = max(Linf_dif, abs(tpTableADJ-TableADJ(iir,iit,iip))) + + TableADJ(iir,iit,iip) = tpTableADJ + end if + + end do + end do + end do + + end do + end do + end do + + + + if (abs(Linf_dif)ninvr) then + cycle ! 如果与反演网格点无关,考察下一个点 if r is out of inversion grid invr, turn to next point + end if + r1 = (rr(iir)-invr(igrid,1)-(idr-1)*dinvr)/dinvr ! r1=0 -> r=invr(idr); r1=1 -> r=invr(idr+1) + + do iit=1,nt + idt = floor((tt(iit)-invt(igrid,1))/dinvt)+1 + if (idt<0 .or. idt>ninvt) then + cycle ! 如果与反演网格点无关,考察下一个点 + end if + r2 = (tt(iit)-invt(igrid,1)-(idt-1)*dinvt)/dinvt + + do iip=1,np + idp = floor((pp(iip)-invp(igrid,1))/dinvp)+1 + if (idp<0 .or. idp>ninvp) then + cycle ! 如果与反演网格点无关,考察下一个点 + end if + r3 = (pp(iip)-invp(igrid,1)-(idp-1)*dinvp)/dinvp + + if (r1<0 .or. r1>1 .or. r2<0 .or. r2>1 .or. r3<0 .or. r3>1) then + print *, 'error ratio' + pause + end if + + do iik=1,nk + if (idr>=1 .and. idr<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp>=1 .and. idp<=ninvp) then + invkernel(idr,idt,idp,iik) = invkernel(idr,idt,idp,iik) & + & + (1-r1)*(1-r2)*(1-r3)*all_Kernel(iir,iit,iip,iik) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp>=1 .and. idp<=ninvp) then + invkernel(idr+1,idt,idp,iik) = invkernel(idr+1,idt,idp,iik) & + & + r1*(1-r2)*(1-r3)*all_Kernel(iir,iit,iip,iik) + end if + if (idr>=1 .and. idr<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp>=1 .and. idp<=ninvp) then + invkernel(idr,idt+1,idp,iik) = invkernel(idr,idt+1,idp,iik) & + & + (1-r1)*r2*(1-r3)*all_Kernel(iir,iit,iip,iik) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp>=1 .and. idp<=ninvp) then + invkernel(idr+1,idt+1,idp,iik) = invkernel(idr+1,idt+1,idp,iik) & + & + r1*r2*(1-r3)*all_Kernel(iir,iit,iip,iik) + end if + if (idr>=1 .and. idr<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + invkernel(idr,idt,idp+1,iik) = invkernel(idr,idt,idp+1,iik) & + & + (1-r1)*(1-r2)*r3*all_Kernel(iir,iit,iip,iik) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + invkernel(idr+1,idt,idp+1,iik) = invkernel(idr+1,idt,idp+1,iik) & + & + r1*(1-r2)*r3*all_Kernel(iir,iit,iip,iik) + end if + if (idr>=1 .and. idr<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + invkernel(idr,idt+1,idp+1,iik) = invkernel(idr,idt+1,idp+1,iik) & + & + (1-r1)*r2*r3*all_Kernel(iir,iit,iip,iik) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + invkernel(idr+1,idt+1,idp+1,iik) = invkernel(idr+1,idt+1,idp+1,iik) & + & + r1*r2*r3*all_Kernel(iir,iit,iip,iik) + end if + + + end do + + end do + end do + end do + + ! build update value + do iir=1,nr + idr = floor((rr(iir)-invr(igrid,1))/dinvr)+1 ! invr(idr) <= rr(iir) < invr(idr+1) + if (idr<0 .or. idr>ninvr) then + cycle ! 如果与反演网格点无关,考察下一个点 if r is out of inversion grid invr, turn to next point + end if + r1 = (rr(iir)-invr(igrid,1)-(idr-1)*dinvr)/dinvr ! r1=0 -> r=invr(idr); r1=1 -> r=invr(idr+1) + + do iit=1,nt + idt = floor((tt(iit)-invt(igrid,1))/dinvt)+1 + if (idt<0 .or. idt>ninvt) then + cycle ! 如果与反演网格点无关,考察下一个点 + end if + r2 = (tt(iit)-invt(igrid,1)-(idt-1)*dinvt)/dinvt + + do iip=1,np + idp = floor((pp(iip)-invp(igrid,1))/dinvp)+1 + if (idp<0 .or. idp>ninvp) then + cycle ! 如果与反演网格点无关,考察下一个点 + end if + r3 = (pp(iip)-invp(igrid,1)-(idp-1)*dinvp)/dinvp + + if (r1<0 .or. r1>1 .or. r2<0 .or. r2>1 .or. r3<0 .or. r3>1) then + print *, 'error ratio' + pause + end if + + + do iik=1,nk + pert = 0.0 + if (idr>=1 .and. idr<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp>=1 .and. idp<=ninvp) then + pert = pert + invkernel(idr,idt,idp,iik)*(1-r1)*(1-r2)*(1-r3) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp>=1 .and. idp<=ninvp) then + pert = pert + invkernel(idr+1,idt,idp,iik)*r1*(1-r2)*(1-r3) + end if + if (idr>=1 .and. idr<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp>=1 .and. idp<=ninvp) then + pert = pert + invkernel(idr,idt+1,idp,iik)*(1-r1)*r2*(1-r3) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp>=1 .and. idp<=ninvp) then + pert = pert + invkernel(idr+1,idt+1,idp,iik)*r1*r2*(1-r3) + end if + if (idr>=1 .and. idr<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + pert = pert + invkernel(idr,idt,idp+1,iik)*(1-r1)*(1-r2)*r3 + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + pert = pert + invkernel(idr+1,idt,idp+1,iik)*r1*(1-r2)*r3 + end if + if (idr>=1 .and. idr<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + pert = pert + invkernel(idr,idt+1,idp+1,iik)*(1-r1)*r2*r3 + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + pert = pert + invkernel(idr+1,idt+1,idp+1,iik)*r1*r2*r3 + end if + para(iir,iit,iip,iik) = para(iir,iit,iip,iik)+pert + end do + + + end do + end do + end do + + + end do + + + ! rescale + Linf = 0.0 + do iir=1,nr + do iit=1,nt + do iip=1,np + do iik=1,nk + if (Linf < abs(para(iir,iit,iip,iik))) then + Linf = abs(para(iir,iit,iip,iik)) + end if + end do + end do + end do + end do + + do iir=1,nr + do iit=1,nt + do iip=1,np + do iik=1,nk + update_value(iir,iit,iip,iik) = para(iir,iit,iip,iik)/Linf*stepsize + end do + end do + end do + end do + +end subroutine + +subroutine Kernel_Mask(rr,tt,pp,nr,nt,np,kernel,rsou,tsou,psou,radius) + integer :: nr,nt,np + double precision :: rr(nr),tt(nt),pp(np),rsou,tsou,psou,radius + double precision :: kernel(nr,nt,np),dis + integer :: i,j,k + + do i=1,nr + do j=1,nt + do k=1,np + dis = sqrt((rr(i)-rsou)**2+(rsou*(tt(j)-tsou))**2+(rsou*cos(tsou)*(pp(k)-psou))**2) + if ( dis < radius) then + kernel(i,j,k) = kernel(i,j,k) * 0 + end if + end do + end do + end do +end subroutine + +subroutine Kernel_Mask_new(rr,tt,pp,nr,nt,np,kernel,rsou,tsou,psou) + integer :: nr,nt,np + double precision :: rr(nr),tt(nt),pp(np),rsou,tsou,psou,radius + double precision :: kernel(nr,nt,np),dis + integer :: i,j,k + dr = rr(2)-rr(1); dt = tt(2)-tt(1); dp = pp(2)-pp(1); + do i=1,nr + do j=1,nt + do k=1,np + if ( abs(rr(i)-rsou)6351):\n", + " fun_init[ir,it,ip] = 1.0/(5.8+(6371-rr[ir])/20.0*0.7)\n", + " elif (rr[ir]>6336):\n", + " fun_init[ir,it,ip] = 1.0/(6.5+(6351-rr[ir])/15.0*0.6)\n", + " elif (rr[ir]>5961):\n", + " fun_init[ir,it,ip] = 1.0/(8.0+(6336-rr[ir])/375.0*1) \n", + " else:\n", + " fun_init[ir,it,ip] = 1.0/9.0\n", + "\n", + " vel_init[ir,it,ip] = 1.0/fun_init[ir,it,ip]\n", + "\n", + " # true model\n", + " if (tt[it] >= 30.0/180.0*math.pi and tt[it] <= 50.0/180.0*math.pi \\\n", + " and pp[ip] >= 15.0/180.0*math.pi and pp[ip] <= 40.0/180.0*math.pi \\\n", + " and rr[ir] >= 6211.0 and rr[ir] <= 6371.0):\n", + " c+=1\n", + " sigma = math.sin(4.0*math.pi*(tt[it]-30.0/180.0*math.pi)/(20.0/180.0*math.pi)) \\\n", + " *math.sin(4.0*math.pi*(pp[ip]-15.0/180.0*math.pi)/(25.0/180.0*math.pi)) \\\n", + " *math.sin(2.0*math.pi*(rr[ir]-6211.0)/160.0)\n", + " else:\n", + " sigma = 0.0\n", + "\n", + " if sigma < 0:\n", + " psi = 60.0/180.0*math.pi\n", + " elif sigma > 0:\n", + " psi = 150.0/180.0*math.pi\n", + " else:\n", + " psi = 0.0\n", + "\n", + " eta_true[ir,it,ip] = ani_p*abs(sigma)*math.sin(2.0*psi)\n", + " xi_true[ir,it,ip] = ani_p*abs(sigma)*math.cos(2.0*psi)\n", + " zeta_true[ir,it,ip] = gamma*math.sqrt(eta_true[ir,it,ip]**2 + xi_true[ir,it,ip]**2)\n", + " fun_true[ir,it,ip] = fun_init[ir,it,ip]/(1.0+sigma*slow_p)\n", + " vel_true[ir,it,ip] = 1.0/fun_true[ir,it,ip] \n", + "\n", + "\n", + "r_earth = R_earth #6378.1370\n", + "print(\"depminmax {} {}\".format(r_earth-rr1,r_earth-rr2))\n", + "print(c)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# write out\n", + "import h5py\n", + "\n", + "fout_init = h5py.File('test_model_init.h5', 'w')\n", + "fout_true = h5py.File('test_model_true.h5', 'w')\n", + "\n", + "# write out the arrays eta_init, xi_init, zeta_init, fun_init, a_init, b_init, c_init, f_init\n", + "fout_init.create_dataset('eta', data=eta_init)\n", + "fout_init.create_dataset('xi', data=xi_init)\n", + "fout_init.create_dataset('zeta',data=zeta_init)\n", + "fout_init.create_dataset('vel', data=vel_init)\n", + "\n", + "# writeout the arrays eta_true, xi_true, zeta_true, fun_true, a_true, b_true, c_true, f_true\n", + "fout_true.create_dataset('eta', data=eta_true)\n", + "fout_true.create_dataset('xi', data=xi_true)\n", + "fout_true.create_dataset('zeta',data=zeta_true)\n", + "fout_true.create_dataset('vel', data=vel_true)\n", + "\n", + "fout_init.close()\n", + "fout_true.close()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# prepare src station file\n", + "\n", + "```\n", + " 26 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- src  : id_src year month day hour min sec lat lon dep_km mag num_recs id_event\n", + " 26 1 PCBI 1.8900 98.9253 1000.0000 P 10.40 18.000 <- arrival : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arrival_time_sec\n", + " 26 2 MRPI 1.6125 99.3172 1100.0000 P 50.84 19.400\n", + " 26 3 HUTI 2.3153 98.9711 1600.0000 P 57.84 19.200\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "random.seed(123456789)\n", + "\n", + "# dummys\n", + "year_dummy = 1998\n", + "month_dummy = 1\n", + "day_dummy = 1\n", + "hour_dummy = 0\n", + "minute_dummy = 0\n", + "second_dummy = 0\n", + "mag_dummy = 3.0\n", + "id_dummy = 1000\n", + "st_name_dummy = 'AAAA'\n", + "phase_dummy = 'P'\n", + "arriv_t_dummy = 0.0\n", + "\n", + "tt1deg = tt1 * 180.0/math.pi\n", + "tt2deg = tt2 * 180.0/math.pi\n", + "pp1deg = pp1 * 180.0/math.pi\n", + "pp2deg = pp2 * 180.0/math.pi\n", + "\n", + "\n", + "n_src = 1\n", + "n_rec = [1 for x in range(n_src)]\n", + "\n", + "\n", + "lines = []\n", + "\n", + "pos_src=[]\n", + "pos_rec=[]\n", + "\n", + "dep_srcs=[12.902894]\n", + "lon_srcs=[16.794572]\n", + "lat_srcs=[37.503373]\n", + "\n", + "elev_recs = [0.0]\n", + "lon_recs = [29.812050]\n", + "lat_recs = [36.472809]\n", + "\n", + "\n", + "# create dummy src\n", + "for i_src in range(n_src):\n", + " # define one point in the domain (rr1 bottom, rr2 top)\n", + " dep = dep_srcs[i_src]\n", + " lon = lon_srcs[i_src]\n", + " lat = lat_srcs[i_src]\n", + "\n", + " src = [i_src, year_dummy, month_dummy, day_dummy, hour_dummy, minute_dummy, second_dummy, lat, lon, dep, mag_dummy, n_rec[i_src], id_dummy]\n", + " lines.append(src)\n", + "\n", + " pos_src.append([lon,lat,dep])\n", + "\n", + " # create dummy station\n", + " for i_rec in range(n_rec[i_src]):\n", + " #elev_rec = random.uniform(0.0,-10.0) # elevation in m\n", + " #lon_rec = random.uniform(pp1deg,pp2deg)\n", + " #lat_rec = random.uniform(tt1deg,tt2deg)\n", + "\n", + " rec = [i_src, i_rec, st_name_dummy+\"_\"+str(i_rec), lat_recs[i_rec], lon_recs[i_rec], elev_recs[i_rec], phase_dummy, arriv_t_dummy]\n", + " lines.append(rec)\n", + "\n", + " pos_rec.append([lon_recs[i_rec],lat_recs[i_rec],elev_recs[i_rec]])\n", + "\n", + "# write out ev_arrivals file\n", + "fname = 'src_rec_test.dat'\n", + "\n", + "with open(fname, 'w') as f:\n", + " for line in lines:\n", + " for elem in line:\n", + " f.write('{} '.format(elem))\n", + " f.write('\\n')\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# draw src and rec positions\n", + "import matplotlib.pyplot as plt\n", + "\n", + "for i_src in range(n_src):\n", + " plt.scatter(pos_src[i_src][1],pos_src[i_src][0],c='r',marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot receivers\n", + "for i_rec in range(n_rec[0]):\n", + " plt.scatter(pos_rec[i_rec][1],pos_rec[i_rec][0],c='b',marker='o')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "vscode": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_2_one_src/make_test_model.py b/test/old_tests/inversion_2_one_src/make_test_model.py new file mode 100644 index 0000000..f1dec64 --- /dev/null +++ b/test/old_tests/inversion_2_one_src/make_test_model.py @@ -0,0 +1,215 @@ +# %% [markdown] +# # notebook for create init and true test model + +# %% +import numpy as np +import math + +# grid +R_earth = 6371.0 #6378.1370 + +rr1=6070 +rr2=6400 +tt1=(30.0-1.5)/180*math.pi +tt2=(50.0+1.5)/180*math.pi +pp1=(15.0-1.5)/180*math.pi +pp2=(40.0+1.5)/180*math.pi + +n_rtp = [55,55,55] +dr = (rr2-rr1)/(n_rtp[0]-1) +dt = (tt2-tt1)/(n_rtp[1]-1) +dp = (pp2-pp1)/(n_rtp[2]-1) +rr = np.array([rr1 + x*dr for x in range(n_rtp[0])]) +tt = np.array([tt1 + x*dt for x in range(n_rtp[1])]) +pp = np.array([pp1 + x*dp for x in range(n_rtp[2])]) + +# initial model +gamma = 0.0 +#s0 = 1.0/6.0 +slow_p=0.04 +ani_p=0.03 + +eta_init = np.zeros(n_rtp) +xi_init = np.zeros(n_rtp) +zeta_init = np.zeros(n_rtp) +fun_init = np.zeros(n_rtp) +vel_init = np.zeros(n_rtp) + +# true model +eta_true = np.zeros(n_rtp) +xi_true = np.zeros(n_rtp) +zeta_true = np.zeros(n_rtp) +fun_true = np.zeros(n_rtp) +vel_true = np.zeros(n_rtp) + +c=0 +for ir in range(n_rtp[2]): + for it in range(n_rtp[1]): + for ip in range(n_rtp[0]): + #eta_init[ir,it,ip] = 0.0 + #xi_init[ir,it,ip] = 0.0 + zeta_init[ir,it,ip] = gamma*math.sqrt(eta_init[ir,it,ip]**2 + xi_init[ir,it,ip]**2) + + if (rr[ir]>6351): + fun_init[ir,it,ip] = 1.0/(5.8+(6371-rr[ir])/20.0*0.7) + elif (rr[ir]>6336): + fun_init[ir,it,ip] = 1.0/(6.5+(6351-rr[ir])/15.0*0.6) + elif (rr[ir]>5961): + fun_init[ir,it,ip] = 1.0/(8.0+(6336-rr[ir])/375.0*1) + else: + fun_init[ir,it,ip] = 1.0/9.0 + + vel_init[ir,it,ip] = 1.0/fun_init[ir,it,ip] + + # true model + if (tt[it] >= 30.0/180.0*math.pi and tt[it] <= 50.0/180.0*math.pi \ + and pp[ip] >= 15.0/180.0*math.pi and pp[ip] <= 40.0/180.0*math.pi \ + and rr[ir] >= 6211.0 and rr[ir] <= 6371.0): + c+=1 + sigma = math.sin(4.0*math.pi*(tt[it]-30.0/180.0*math.pi)/(20.0/180.0*math.pi)) \ + *math.sin(4.0*math.pi*(pp[ip]-15.0/180.0*math.pi)/(25.0/180.0*math.pi)) \ + *math.sin(2.0*math.pi*(rr[ir]-6211.0)/160.0) + else: + sigma = 0.0 + + if sigma < 0: + psi = 60.0/180.0*math.pi + elif sigma > 0: + psi = 150.0/180.0*math.pi + else: + psi = 0.0 + + eta_true[ir,it,ip] = ani_p*abs(sigma)*math.sin(2.0*psi) + xi_true[ir,it,ip] = ani_p*abs(sigma)*math.cos(2.0*psi) + zeta_true[ir,it,ip] = gamma*math.sqrt(eta_true[ir,it,ip]**2 + xi_true[ir,it,ip]**2) + fun_true[ir,it,ip] = fun_init[ir,it,ip]/(1.0+sigma*slow_p) + vel_true[ir,it,ip] = 1.0/fun_true[ir,it,ip] + + + +r_earth = R_earth #6378.1370 +print("depminmax {} {}".format(r_earth-rr1,r_earth-rr2)) +print(c) + + +# %% +# write out +import h5py + +fout_init = h5py.File('test_model_init.h5', 'w') +fout_true = h5py.File('test_model_true.h5', 'w') + +# write out the arrays eta_init, xi_init, zeta_init, fun_init, a_init, b_init, c_init, f_init +fout_init.create_dataset('eta', data=eta_init) +fout_init.create_dataset('xi', data=xi_init) +fout_init.create_dataset('zeta',data=zeta_init) +fout_init.create_dataset('vel', data=vel_init) + +# writeout the arrays eta_true, xi_true, zeta_true, fun_true, a_true, b_true, c_true, f_true +fout_true.create_dataset('eta', data=eta_true) +fout_true.create_dataset('xi', data=xi_true) +fout_true.create_dataset('zeta',data=zeta_true) +fout_true.create_dataset('vel', data=vel_true) + +fout_init.close() +fout_true.close() + + +# %% [markdown] +# # prepare src station file +# +# ``` +# 26 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- src  : id_src year month day hour min sec lat lon dep_km mag num_recs id_event +# 26 1 PCBI 1.8900 98.9253 1000.0000 P 10.40 18.000 <- arrival : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arrival_time_sec +# 26 2 MRPI 1.6125 99.3172 1100.0000 P 50.84 19.400 +# 26 3 HUTI 2.3153 98.9711 1600.0000 P 57.84 19.200 +# +# ``` + +# %% +import random +random.seed(123456789) + +# dummys +year_dummy = 1998 +month_dummy = 1 +day_dummy = 1 +hour_dummy = 0 +minute_dummy = 0 +second_dummy = 0 +mag_dummy = 3.0 +id_dummy = 1000 +st_name_dummy = 'AAAA' +phase_dummy = 'P' +arriv_t_dummy = 0.0 + +tt1deg = tt1 * 180.0/math.pi +tt2deg = tt2 * 180.0/math.pi +pp1deg = pp1 * 180.0/math.pi +pp2deg = pp2 * 180.0/math.pi + + +n_src = 1 +n_rec = [1 for x in range(n_src)] + + +lines = [] + +pos_src=[] +pos_rec=[] + +dep_srcs=[12.902894] +lon_srcs=[16.794572] +lat_srcs=[37.503373] + +elev_recs = [0.0] +lon_recs = [29.812050] +lat_recs = [36.472809] + + +# create dummy src +for i_src in range(n_src): + # define one point in the domain (rr1 bottom, rr2 top) + dep = dep_srcs[i_src] + lon = lon_srcs[i_src] + lat = lat_srcs[i_src] + + src = [i_src, year_dummy, month_dummy, day_dummy, hour_dummy, minute_dummy, second_dummy, lat, lon, dep, mag_dummy, n_rec[i_src], id_dummy] + lines.append(src) + + pos_src.append([lon,lat,dep]) + + # create dummy station + for i_rec in range(n_rec[i_src]): + #elev_rec = random.uniform(0.0,-10.0) # elevation in m + #lon_rec = random.uniform(pp1deg,pp2deg) + #lat_rec = random.uniform(tt1deg,tt2deg) + + rec = [i_src, i_rec, st_name_dummy+"_"+str(i_rec), lat_recs[i_rec], lon_recs[i_rec], elev_recs[i_rec], phase_dummy, arriv_t_dummy] + lines.append(rec) + + pos_rec.append([lon_recs[i_rec],lat_recs[i_rec],elev_recs[i_rec]]) + +# write out ev_arrivals file +fname = 'src_rec_test.dat' + +with open(fname, 'w') as f: + for line in lines: + for elem in line: + f.write('{} '.format(elem)) + f.write('\n') + + +# %% +# draw src and rec positions +import matplotlib.pyplot as plt + +for i_src in range(n_src): + plt.scatter(pos_src[i_src][1],pos_src[i_src][0],c='r',marker='o') + +# %% +# plot receivers +for i_rec in range(n_rec[0]): + plt.scatter(pos_rec[i_rec][1],pos_rec[i_rec][0],c='b',marker='o') + + diff --git a/test/old_tests/inversion_ASCII/README.md b/test/old_tests/inversion_ASCII/README.md new file mode 100644 index 0000000..2028979 --- /dev/null +++ b/test/old_tests/inversion_ASCII/README.md @@ -0,0 +1,14 @@ +# Inversion test + +This is a test setup for inversion calculation. + +1. Run all cells of `make_test_model.ipynb` for creating + - source, receiver file + - true model + - initial model + +2. then run TOMOATT forward with `input_params_pre.yml` for calculating the true arrival times at the stations +-> this will output src_rec_result.dat file which includes the arrival time at each station + +3. run TOMOATT in inversion mode with `input_params.yml`. + \ No newline at end of file diff --git a/test/old_tests/inversion_ASCII/check_obj_func.ipynb b/test/old_tests/inversion_ASCII/check_obj_func.ipynb new file mode 100644 index 0000000..1d854f4 --- /dev/null +++ b/test/old_tests/inversion_ASCII/check_obj_func.ipynb @@ -0,0 +1,66 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# check the change of objective values\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "fpath='objective_function.txt'\n", + "\n", + "objs=[]\n", + "\n", + "with open(fpath) as f:\n", + " lines = f.readlines()\n", + "\n", + " for l in lines:\n", + " if(l.startswith('i_inv')):\n", + " continue\n", + " objs.append(float(l.strip().split(',')[1]))\n", + "\n", + "\n", + "plt.xlabel('iteration')\n", + "plt.ylabel('objective function value')\n", + "plt.plot(objs)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "vscode": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_ASCII/check_src_rec_file.ipynb b/test/old_tests/inversion_ASCII/check_src_rec_file.ipynb new file mode 100644 index 0000000..42ca8e0 --- /dev/null +++ b/test/old_tests/inversion_ASCII/check_src_rec_file.ipynb @@ -0,0 +1,185 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# read src_rec file and check its arrival time and distance from src to rec\n", + "import numpy as np\n", + "\n", + "def read_src_rec_file(fpath):\n", + "\n", + " with open(fpath, \"r\") as f:\n", + " lines = f.readlines()\n", + "\n", + " # list to store src lon lat\n", + " src_pos = []\n", + " # list to store rec lon lat\n", + " rec_pos_tmp=[]\n", + " rec_pos = []\n", + "\n", + " for line in lines:\n", + " # src line if there are 13 elements\n", + " if len(line.split()) == 13:\n", + " # store source lon lat dep\n", + " stlon = float(line.split()[8])\n", + " stlat = float(line.split()[7])\n", + " src_pos.append([stlon, stlat])\n", + "\n", + " nrec = float(line.split()[11])\n", + " # rec line if there are 9 elements\n", + " elif len(line.split()) == 9:\n", + " # store receiver lon lat dep\n", + " rclon = float(line.split()[4])\n", + " rclat = float(line.split()[3])\n", + " rctime= float(line.split()[8])\n", + " # calc epicentral distance from src\n", + " dist = np.sqrt((stlon-rclon)**2 + (stlat-rclat)**2)\n", + " rec_pos_tmp.append([rclon, rclat, rctime, dist])\n", + "\n", + " nrec-=1\n", + " else:\n", + " raise ValueError(\"src_rec_test_out.dat file is not correct\")\n", + "\n", + " if nrec==0:\n", + " rec_pos.append(rec_pos_tmp)\n", + " # remove all rec_pos_tmp\n", + " rec_pos_tmp = []\n", + "\n", + "\n", + "\n", + " src_pos = np.array(src_pos)\n", + " rec_pos = np.array(rec_pos)\n", + "\n", + " return src_pos, rec_pos" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "src_pos_true, rec_pos_true = read_src_rec_file(\"./src_rec_test_out.dat\")\n", + "src_pos_try, rec_pos_try = read_src_rec_file(\"./src_rec_test_out_out.dat\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot rec_pos for each src_pos with color by 3rd element\n", + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "def plot_srcrec(src_pos, rec_pos):\n", + "\n", + " # selected source\n", + " id_src = 1\n", + " \n", + " fig, axs = plt.subplots(2,1,figsize=(10,10))\n", + " \n", + " # plot arrival time\n", + " # src\n", + " axs[0].scatter(src_pos[id_src,0], src_pos[id_src,1], c='r', marker='o', s=100)\n", + " # rec\n", + " axs[0].scatter(rec_pos[id_src][:,0], rec_pos[id_src][:,1], c=rec_pos[id_src][:,2], s=10, marker='o')\n", + " \n", + " # colorbar\n", + " cbar = plt.colorbar(axs[0].scatter(rec_pos[id_src][:,0], rec_pos[id_src][:,1], c=rec_pos[id_src][:,2], s=100, marker='o'))\n", + " cbar.set_label('arrival time')\n", + " \n", + " # plot epicentral distance\n", + " # src\n", + " axs[1].scatter(src_pos[id_src,0], src_pos[id_src,1], c='r', marker='o', s=100)\n", + " # rec\n", + " axs[1].scatter(rec_pos[id_src][:,0], rec_pos[id_src][:,1], c=rec_pos[id_src][:,3], s=100, marker='o')\n", + " \n", + " # colorbar\n", + " cbar = plt.colorbar(axs[1].scatter(rec_pos[id_src][:,0], rec_pos[id_src][:,1], c=rec_pos[id_src][:,3], s=10, marker='o'))\n", + " cbar.set_label('epicentral distance')\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_srcrec(src_pos_true, rec_pos_true)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_srcrec(src_pos_try, rec_pos_try)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rec_pos_diff = rec_pos_true[:][:][2]-rec_pos_try[:][:][2]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rec_pos_diff.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rec_pos_true.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + }, + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_ASCII/input_params.yml b/test/old_tests/inversion_ASCII/input_params.yml new file mode 100644 index 0000000..3296760 --- /dev/null +++ b/test/old_tests/inversion_ASCII/input_params.yml @@ -0,0 +1,51 @@ +version : 2 + +domain : + #min_max_dep : [-2.863,17.137] # depth in km + min_max_dep : [-10.0, 10.0] # depth in km + min_max_lat : [37.7,42.3] # latitude in degree + min_max_lon : [22.7,27.3] # longitude in degree + n_rtp : [10,50,50] # number of nodes + +source : + #src_dep_lat_lon : [5.0,40.0,24.0] # source depth in km, latitude, longitude in degree + #src_dep_lat_lon : [5750.6370,46.0,36.0] # source depth in km, latitude, longitude in degree + src_rec_file : 'src_rec_test_out.dat' # source receiver file (if found, src_dep_lat_lon is ignored) + swap_src_rec : 1 # swap source and receiver (1: yes, 0: no) + +model : + init_model_type : '' # 'fd' (input file) or '1d_ak135' + init_model_path : './test_model_init.h5' # path to initial model file (ignored if init_model_type is '1d_*') + +inversion : + run_mode : 1 # 0 for forward simulation only, 1 for inversion + optim_method : 0 # optimization method. 0 : "grad_descent", 1 : "lbfgs", 2 : "halve-stepping" + smooth_method : 0 # 0: multigrid parametrization, 1: laplacian smoothing with CG + max_iterations_inv : 100 # maximum number of inversion iterations + step_size : 0.01 # step size for inversion + # parameters for multiparametric inversion + n_inversion_grid : 5 # number of inversion grid sets + n_inv_dep_lat_lon : [5,10,10] # number of the base inversion grid points + min_max_dep_inv : [-10.0, 10.0] # depth in km with R = 6371.0 + min_max_lat_inv : [37.7,42.3] # latitude in degree + min_max_lon_inv : [22.7,27.3] # longitude in degree + # parameters for laplacian smoothing + l_smooth_rtp : [10,10,10] # smoothing coefficients for each direction + regularization_weight : 1.0 # regularization weight NOTWORKING + # parameter for halving-stepping or lbfgs + max_sub_iterations : 100 # maximum number of sub-iterations + + +parallel : + n_sims : 1 # number of simultaneous run + ndiv_rtp : [1,2,2] # number of subdomains + nproc_sub : 2 # number of subprocess used for each subdomain + use_gpu : 0 # 0: CPU, 1: GPU + +calculation : + convergence_tolerance : 1e-6 + max_iterations : 200 + stencil_order : 3 # 1 or 3 + sweep_type : 2 # 0: legacy, 1: cuthill-mckee with shm parallelization + + diff --git a/test/old_tests/inversion_ASCII/input_params_pre.yml b/test/old_tests/inversion_ASCII/input_params_pre.yml new file mode 100644 index 0000000..72f1eb7 --- /dev/null +++ b/test/old_tests/inversion_ASCII/input_params_pre.yml @@ -0,0 +1,37 @@ +version : 2 + +domain : + #min_max_dep : [-2.863,17.137] # depth in km + min_max_dep : [-10.0, 10.0] # depth in km + min_max_lat : [37.7,42.3] # latitude in degree + min_max_lon : [22.7,27.3] # longitude in degree + n_rtp : [10,50,50] # number of nodes + +source : + #src_dep_lat_lon : [5.0,40.0,24.0] # source depth in km, latitude, longitude in degree + #src_dep_lat_lon : [5750.6370,46.0,36.0] # source depth in km, latitude, longitude in degree + src_rec_file : 'src_rec_test.dat' # source receiver file (if found, src_dep_lat_lon is ignored) + swap_src_rec : 1 # swap source and receiver (1: yes, 0: no) + +model : + init_model_type : '' # 'fd' (input file) or '1d_ak135' + init_model_path : './test_model_true.dat' # path to initial model file (ignored if init_model_type is '1d_*') + +inversion : + run_mode : 0 # 0 for forward simulation only, 1 for inversion + n_inversion_grid : 1 + + +parallel : + n_sims : 1 # number of simultaneous run + ndiv_rtp : [2,1,2] # number of subdomains + nproc_sub : 2 # number of subprocess used for each subdomain + +calculation : + convergence_tolerance : 1e-6 + max_iterations : 200 + stencil_order : 3 # 1 or 3 + sweep_type : 2 # 0: legacy, 1: cuthill-mckee with shm parallelization + output_file_format : 1 # 0: hdf5, 1: ascii + + diff --git a/test/old_tests/inversion_ASCII/make_test_model.ipynb b/test/old_tests/inversion_ASCII/make_test_model.ipynb new file mode 100644 index 0000000..be1d0e5 --- /dev/null +++ b/test/old_tests/inversion_ASCII/make_test_model.ipynb @@ -0,0 +1,338 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# notebook for create init and true test model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import math\n", + "\n", + "# grid\n", + "#R_earth = 6378.1370\n", + "R_earth = 6371.0\n", + "\n", + "rr1=6361 \n", + "rr2=6381\n", + "tt1=(38.0-0.3)/180*math.pi\n", + "tt2=(42.0+0.3)/180*math.pi\n", + "pp1=(23.0-0.3)/180*math.pi\n", + "pp2=(27.0+0.3)/180*math.pi\n", + "\n", + "n_rtp = [10,50,50]\n", + "n_rtp.reverse()\n", + "dr = (rr2-rr1)/(n_rtp[2]-1)\n", + "dt = (tt2-tt1)/(n_rtp[1]-1)\n", + "dp = (pp2-pp1)/(n_rtp[0]-1)\n", + "rr = np.array([rr1 + x*dr for x in range(n_rtp[2])])\n", + "tt = np.array([tt1 + x*dt for x in range(n_rtp[1])])\n", + "pp = np.array([pp1 + x*dp for x in range(n_rtp[0])])\n", + "\n", + "# initial model\n", + "gamma = 0.0\n", + "s0 = 1.0/6.0\n", + "slow_p=0.06\n", + "ani_p=0.04\n", + "\n", + "eta_init = np.zeros(n_rtp)\n", + "xi_init = np.zeros(n_rtp)\n", + "zeta_init = np.zeros(n_rtp)\n", + "fun_init = np.zeros(n_rtp)\n", + "vel_init = np.zeros(n_rtp)\n", + "a_init = np.zeros(n_rtp)\n", + "b_init = np.zeros(n_rtp)\n", + "c_init = np.zeros(n_rtp)\n", + "f_init = np.zeros(n_rtp)\n", + "\n", + "# true model\n", + "eta_true = np.zeros(n_rtp)\n", + "xi_true = np.zeros(n_rtp)\n", + "zeta_true = np.zeros(n_rtp)\n", + "fun_true = np.zeros(n_rtp)\n", + "vel_true = np.zeros(n_rtp)\n", + "a_true = np.zeros(n_rtp)\n", + "b_true = np.zeros(n_rtp)\n", + "c_true = np.zeros(n_rtp)\n", + "f_true = np.zeros(n_rtp)\n", + "\n", + "c=0\n", + "for ir in range(n_rtp[2]):\n", + " for it in range(n_rtp[1]):\n", + " for ip in range(n_rtp[0]):\n", + " #eta_init[ip,it,ir] = 0.0\n", + " #xi_init[ip,it,ir] = 0.0\n", + " zeta_init[ip,it,ir] = gamma*math.sqrt(eta_init[ip,it,ir]**2 + xi_init[ip,it,ir]**2)\n", + " fun_init[ip,it,ir] = s0\n", + " vel_init[ip,it,ir] = 1.0/s0\n", + " a_init[ip,it,ir] = 1.0 + 2.0*zeta_init[ip,it,ir]\n", + " b_init[ip,it,ir] = 1.0 - 2.0*xi_init[ip,it,ir]\n", + " c_init[ip,it,ir] = 1.0 + 2.0*xi_init[ip,it,ir]\n", + " f_init[ip,it,ir] = -2.0 * eta_init[ip,it,ir]\n", + "\n", + " # true model\n", + " if (tt[it] >= 38.0/180.0*math.pi and tt[it] <= 42.0/180.0*math.pi \\\n", + " and pp[ip] >= 23.0/180.0*math.pi and pp[ip] <= 27.0/180.0*math.pi):\n", + " c+=1\n", + " sigma = math.sin(2.0*math.pi*(tt[it]-38.0/180.0*math.pi)/(4.0/180.0*math.pi))*math.sin(2.0*math.pi*(pp[ip]-23.0/180.0*math.pi)/(4.0/180.0*math.pi))\n", + " else:\n", + " sigma = 0.0\n", + "\n", + " if sigma < 0:\n", + " psi = 60.0/180.0*math.pi\n", + " elif sigma > 0:\n", + " psi = 120.0/180.0*math.pi\n", + " else:\n", + " psi = 0.0\n", + "\n", + " eta_true[ip,it,ir] = ani_p*abs(sigma)*math.sin(2.0*psi)\n", + " xi_true[ip,it,ir] = ani_p*abs(sigma)*math.cos(2.0*psi)\n", + " zeta_true[ip,it,ir] = gamma*math.sqrt(eta_true[ip,it,ir]**2 + xi_true[ip,it,ir]**2)\n", + " fun_true[ip,it,ir] = s0/(1.0+sigma*slow_p)\n", + " vel_true[ip,it,ir] = 1.0/fun_true[ip,it,ir] \n", + " a_true[ip,it,ir] = 1.0 + 2.0*zeta_true[ip,it,ir]\n", + " b_true[ip,it,ir] = 1.0 - 2.0*xi_true[ip,it,ir]\n", + " c_true[ip,it,ir] = 1.0 + 2.0*xi_true[ip,it,ir]\n", + " f_true[ip,it,ir] = -2.0 * eta_true[ip,it,ir]\n", + "\n", + "\n", + "\n", + "#r_earth = 6378.1370\n", + "print(\"depminmax {} {}\".format(R_earth-rr1,R_earth-rr2))\n", + "print(c)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# write out in ASCIII\n", + "\n", + "#\n", + "\n", + "fname_init = 'test_model_init.dat'\n", + "fname_true = 'test_model_true.dat'\n", + "\n", + "\n", + "# write init model\n", + "with open(fname_init, 'w') as f:\n", + " # write nodes in rtp\n", + " for ir in range(n_rtp[2]):\n", + " for it in range(n_rtp[1]):\n", + " for ip in range(n_rtp[0]):\n", + " # write out eta xi zeta fun fac_a fac_b fac_c fac_f\n", + " f.write(\"{} {} {} {} {} {} {} {} {}\\n\".format(eta_init[ip,it,ir],xi_init[ip,it,ir],zeta_init[ip,it,ir],fun_init[ip,it,ir],vel_init[ip,it,ir],a_init[ip,it,ir],b_init[ip,it,ir],c_init[ip,it,ir],f_init[ip,it,ir]))\n", + "\n", + "\n", + "# write true model\n", + "with open(fname_true, 'w') as f:\n", + " # write nodes in rtp\n", + " for ir in range(n_rtp[2]):\n", + " for it in range(n_rtp[1]):\n", + " for ip in range(n_rtp[0]):\n", + " # write out eta xi zeta fun fac_a fac_b fac_c fac_f\n", + " f.write(\"{} {} {} {} {} {} {} {} {}\\n\".format(eta_true[ip,it,ir],xi_true[ip,it,ir],zeta_true[ip,it,ir],fun_true[ip,it,ir],vel_true[ip,it,ir],a_true[ip,it,ir],b_true[ip,it,ir],c_true[ip,it,ir],f_true[ip,it,ir]))\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# prepare src station file\n", + "\n", + "```\n", + " 26 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- src  : id_src year month day hour min sec lat lon dep_km mag num_recs id_event\n", + " 26 1 PCBI 1.8900 98.9253 1000.0000 P 10.40 18.000 <- arrival : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arrival_time_sec\n", + " 26 2 MRPI 1.6125 99.3172 1100.0000 P 50.84 19.400\n", + " 26 3 HUTI 2.3153 98.9711 1600.0000 P 57.84 19.200\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "random.seed(1145141919810)\n", + "\n", + "# dummys\n", + "year_dummy = 1998\n", + "month_dummy = 1\n", + "day_dummy = 1\n", + "hour_dummy = 0\n", + "minute_dummy = 0\n", + "second_dummy = 0\n", + "mag_dummy = 3.0\n", + "id_dummy = 1000\n", + "st_name_dummy = 'AAAA'\n", + "phase_dummy = 'P'\n", + "dist_dummy = 100.0\n", + "arriv_t_dummy = 0.0\n", + "\n", + "tt1deg = tt1 * 180.0/math.pi\n", + "tt2deg = tt2 * 180.0/math.pi\n", + "pp1deg = pp1 * 180.0/math.pi\n", + "pp2deg = pp2 * 180.0/math.pi\n", + "\n", + "\n", + "n_src = 500\n", + "n_rec = [30 for x in range(n_src)]\n", + "\n", + "\n", + "lines = []\n", + "\n", + "nij_src = math.sqrt(n_src)\n", + "nij_rec = math.sqrt(n_rec[0])\n", + "\n", + "pos_src=[]\n", + "pos_rec=[]\n", + "\n", + "\n", + "# create receiver coordinates\n", + "elev_recs=[]\n", + "lon_recs=[]\n", + "lat_recs=[]\n", + "rec_names=[]\n", + "for i in range(n_rec[0]):\n", + " #elev_recs.append(random.uniform(-100.0,-100.0)) # elevation in m\n", + " #elev_recs.append(0) # elevation in m\n", + " #lon_recs .append(random.uniform(pp1deg*1.1,pp2deg*0.9))\n", + " #lat_recs .append(random.uniform(tt1deg*1.1,tt2deg*0.9))\n", + " rec_names.append(i)\n", + " # regularly\n", + " elev_recs.append(0.0)\n", + " tmp_ilon = i%nij_rec\n", + " tmp_ilat = int(i/nij_rec)\n", + " lon_recs.append(pp1deg + tmp_ilon*(pp2deg-pp1deg)/nij_rec)\n", + " lat_recs.append(tt1deg + tmp_ilat*(tt2deg-tt1deg)/nij_rec)\n", + "\n", + "\n", + "\n", + "# create dummy src\n", + "for i_src in range(n_src):\n", + " # define one point in the domain (rr1 bottom, rr2 top)\n", + " # random\n", + " #dep = random.uniform((R_earth-rr1)*0.5,(R_earth-rr1)*0.98)\n", + " #lon = random.uniform(pp1deg,pp2deg)\n", + " #lat = random.uniform(tt1deg,tt2deg)\n", + "\n", + " # regularl\n", + " dep = (R_earth-rr1)*0.9\n", + " tmp_ilon = i_src%nij_src\n", + " tmp_ilat = int(i_src/nij_src)\n", + " lon = pp1deg + tmp_ilon*(pp2deg-pp1deg)/nij_src\n", + " lat = tt1deg + tmp_ilat*(tt2deg-tt1deg)/nij_src\n", + "\n", + " src = [i_src, year_dummy, month_dummy, day_dummy, hour_dummy, minute_dummy, second_dummy, lat, lon, dep, mag_dummy, n_rec[i_src], id_dummy]\n", + " lines.append(src)\n", + "\n", + " pos_src.append([lon,lat,dep])\n", + "\n", + "\n", + " # create dummy station\n", + " for i_rec in range(n_rec[i_src]):\n", + " #elev_rec = 0.0 #random.uniform(0.0,-10.0) # elevation in m\n", + " #lon_rec = random.uniform(pp1deg,pp2deg)\n", + " #lat_rec = random.uniform(tt1deg,tt2deg)\n", + " # regularly\n", + " #elev_rec = -10.0\n", + " #tmp_ilon = i_rec%nij_rec\n", + " #tmp_ilat = int(i_rec/nij_rec)\n", + " #lon_rec = pp1deg + tmp_ilon*(pp2deg-pp1deg)/nij_rec\n", + " #lat_rec = tt1deg + tmp_ilat*(tt2deg-tt1deg)/nij_rec\n", + "\n", + " # \n", + " elev_rec = elev_recs[i_rec]\n", + " lon_rec = lon_recs[i_rec]\n", + " lat_rec = lat_recs[i_rec]\n", + " st_name_dummy = rec_names[i_rec]\n", + "\n", + " rec = [i_src, i_rec, st_name_dummy, lat_rec, lon_rec, elev_rec, phase_dummy, dist_dummy, arriv_t_dummy]\n", + " lines.append(rec)\n", + "\n", + " pos_rec.append([lon_rec,lat_rec,elev_rec])\n", + "\n", + "\n", + "# write out ev_arrivals file\n", + "fname = 'src_rec_test.dat'\n", + "\n", + "with open(fname, 'w') as f:\n", + " for line in lines:\n", + " for elem in line:\n", + " f.write('{} '.format(elem))\n", + " f.write('\\n')\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# draw src and rec positions\n", + "import matplotlib.pyplot as plt\n", + "\n", + "for i_src in range(n_src):\n", + " plt.scatter(pos_src[i_src][1],pos_src[i_src][0],c='r',marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot receivers\n", + "for i_rec in range(n_rec[0]):\n", + " plt.scatter(pos_rec[i_rec][1],pos_rec[i_rec][0],c='b',marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "vscode": { + "interpreter": { + "hash": "fbd0b2a7df497f398d93ab2f589d8a5daa3108cfb7ff2b90736653cca3aeadc0" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_ASCII/view_result.ipynb b/test/old_tests/inversion_ASCII/view_result.ipynb new file mode 100644 index 0000000..96d1743 --- /dev/null +++ b/test/old_tests/inversion_ASCII/view_result.ipynb @@ -0,0 +1,94 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np \n", + "import sys\n", + "sys.path.append(\"../../utils/\")\n", + "\n", + "from tomoatt_data_retrieval import get_data_from_ascii\n", + "\n", + "#\n", + "# plot calculated travel time field\n", + "\n", + "# number of grids\n", + "nx = 50 \n", + "ny = 50\n", + "nz = 10\n", + "\n", + "# read coordiantes from file\n", + "fname_grid = \"OUTPUT_FILES/out_grid.out\"\n", + "\n", + "\n", + "# read data\n", + "_src_id = 0\n", + "_inv_id = 0\n", + "\n", + "# filling 0 for digit\n", + "inv_id = str(_inv_id).zfill(4)\n", + "src_id = str(_src_id).zfill(4)\n", + "fname_data = \"OUTPUT_FILES/T_res_inv_{}_src_{}.dat\".format(inv_id, src_id)\n", + "\n", + "data = get_data_from_ascii(fname_data, fname_grid, nz, ny, nx, 2, 1,2, verbose=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot\n", + "import matplotlib.pyplot as plt\n", + "\n", + "fig, axs = plt.subplots(3, 1, figsize=(15, 5))\n", + "\n", + "axs[0].imshow(data[5,:,:], cmap='jet', interpolation='nearest')\n", + "axs[0].set_title('lon-lat')\n", + "\n", + "axs[1].imshow(data[:,25,:], cmap='jet', interpolation='nearest')\n", + "axs[1].set_title('r-lon')\n", + "\n", + "axs[2].imshow(data[:,:,25], cmap='jet', interpolation='nearest')\n", + "axs[2].set_title('r-lat')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "vscode": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_one_src/README.md b/test/old_tests/inversion_one_src/README.md new file mode 100644 index 0000000..5dd900a --- /dev/null +++ b/test/old_tests/inversion_one_src/README.md @@ -0,0 +1,30 @@ +# Inversion test + +This is a test setup for inversion calculation. + +1. Run all cells of `make_test_model.ipynb` or `make_test_model.py` for creating + - source, receiver file (src_rec_test.dat) + - true model (test_model_true.h5) + - initial model (test_model_init.h5) + +2. then run TOMOATT forward with `input_params_pre.yml` for calculating the true arrival times at the stations +-> this will output src_rec_test_out.dat file which includes the true arrival times +```bash +mpirun --oversubscribe -np 8 ../../build/TOMOATT ./input_params_pre.yml +``` + +3. run TOMOATT in inversion mode with `input_params.yml`. +-> this will output src_rec_test_out.dat file which includes the true arrival times +```bash +mpirun --oversubscribe -np 8 ../../build/TOMOATT ./input_params_pre.yml +``` + +4. for visualizing the result files +```bash +paraview out_data_sim_0.xmf +``` + +0 is the source id. The kernel and model fields are output in the file of 0th source. + + + \ No newline at end of file diff --git a/test/old_tests/inversion_one_src/input_params.yml b/test/old_tests/inversion_one_src/input_params.yml new file mode 100644 index 0000000..85cedc2 --- /dev/null +++ b/test/old_tests/inversion_one_src/input_params.yml @@ -0,0 +1,44 @@ +version : 2 + +domain : + min_max_dep : [-2.863,17.137] # depth in km + min_max_lat : [37.7,42.3] # latitude in degree + min_max_lon : [22.7,27.3] # longitude in degree + n_rtp : [20,50,50] # number of nodes + +source : + #src_dep_lat_lon : [5.0,40.0,24.0] # source depth in km, latitude, longitude in degree + #src_dep_lat_lon : [5750.6370,46.0,36.0] # source depth in km, latitude, longitude in degree + src_rec_file : 'src_rec_test_out.dat' # source receiver file (if found, src_dep_lat_lon is ignored) + swap_src_rec : 0 # swap source and receiver (1: yes, 0: no) + +model : + init_model_type : '' # 'fd' (input file) or '1d_ak135' + init_model_path : './test_model_init.h5' # path to initial model file (ignored if init_model_type is '1d_*') + +inversion : + run_mode : 1 # 0 for forward simulation only, 1 for inversion + n_inversion_grid : 4 # number of inversion grid sets + n_inv_dep_lat_lon : [5,10,10] # number of the base inversion grid points + optim_method : 0 # optimization method. 0 : "grad_descent" or 1 : "lbfgs" + max_iterations_inv : 2 # maximum number of inversion iterations + step_size : 0.01 # initial step size for inversion + # parameters for laplacian iterative smoothing + l_smooth_rtp : [0.9,0.9,0.9] # smoothing coefficients for each direction + # parameters for lbfgs + regularization_weight : 20.0 # regularization weight + max_sub_iterations : 1 # maximum number of sub-iterations + + +parallel : + n_sims : 1 # number of simultaneous run + ndiv_rtp : [1,2,2] # number of subdomains + nproc_sub : 2 # number of subprocess used for each subdomain + +calculation : + convergence_tolerance : 1e-10 + max_iterations : 200 + stencil_order : 3 # 1 or 3 + sweep_type : 2 # 0: legacy, 1: cuthill-mckee with shm parallelization + + diff --git a/test/old_tests/inversion_one_src/input_params_pre.yml b/test/old_tests/inversion_one_src/input_params_pre.yml new file mode 100644 index 0000000..4011b72 --- /dev/null +++ b/test/old_tests/inversion_one_src/input_params_pre.yml @@ -0,0 +1,35 @@ +version : 2 + +domain : + min_max_dep : [-2.863,17.137] # depth in km + min_max_lat : [37.7,42.3] # latitude in degree + min_max_lon : [22.7,27.3] # longitude in degree + n_rtp : [20,50,50] # number of nodes + +source : + #src_dep_lat_lon : [5.0,40.0,24.0] # source depth in km, latitude, longitude in degree + #src_dep_lat_lon : [5750.6370,46.0,36.0] # source depth in km, latitude, longitude in degree + src_rec_file : 'src_rec_test.dat' # source receiver file (if found, src_dep_lat_lon is ignored) + swap_src_rec : 0 # swap source and receiver (1: yes, 0: no) + +model : + init_model_type : '' # 'fd' (input file) or '1d_ak135' + init_model_path : './test_model_true.h5' # path to initial model file (ignored if init_model_type is '1d_*') + +inversion : + run_mode : 0 # 0 for forward simulation only, 1 for inversion + n_inversion_grid : 1 + + +parallel : + n_sims : 1 # number of simultaneous run + ndiv_rtp : [1,2,2] # number of subdomains + nproc_sub : 2 # number of subprocess used for each subdomain + +calculation : + convergence_tolerance : 1e-10 + max_iterations : 200 + stencil_order : 3 # 1 or 3 + sweep_type : 2 # 0: legacy, 1: cuthill-mckee with shm parallelization + + diff --git a/test/old_tests/inversion_one_src/make_test_model.ipynb b/test/old_tests/inversion_one_src/make_test_model.ipynb new file mode 100644 index 0000000..8450fa8 --- /dev/null +++ b/test/old_tests/inversion_one_src/make_test_model.ipynb @@ -0,0 +1,319 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# notebook for create init and true test model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import math\n", + "\n", + "# grid\n", + "R_earth = 6378.1370\n", + "\n", + "rr1=6361 \n", + "rr2=6381\n", + "tt1=(38.0-0.3)/180*math.pi\n", + "tt2=(42.0+0.3)/180*math.pi\n", + "pp1=(23.0-0.3)/180*math.pi\n", + "pp2=(27.0+0.3)/180*math.pi\n", + "\n", + "n_rtp = [20,50,50]\n", + "n_rtp.reverse()\n", + "dr = (rr2-rr1)/n_rtp[2]\n", + "dt = (tt2-tt1)/n_rtp[1]\n", + "dp = (pp2-pp1)/n_rtp[0]\n", + "rr = np.array([rr1 + x*dr for x in range(n_rtp[2])])\n", + "tt = np.array([tt1 + x*dt for x in range(n_rtp[1])])\n", + "pp = np.array([pp1 + x*dp for x in range(n_rtp[0])])\n", + "\n", + "# initial model\n", + "gamma = 0.0\n", + "s0 = 1.0/6.0\n", + "slow_p=0.06\n", + "ani_p=0.04\n", + "\n", + "eta_init = np.zeros(n_rtp)\n", + "xi_init = np.zeros(n_rtp)\n", + "zeta_init = np.zeros(n_rtp)\n", + "fun_init = np.zeros(n_rtp)\n", + "vel_init = np.zeros(n_rtp)\n", + "a_init = np.zeros(n_rtp)\n", + "b_init = np.zeros(n_rtp)\n", + "c_init = np.zeros(n_rtp)\n", + "f_init = np.zeros(n_rtp)\n", + "\n", + "# true model\n", + "eta_true = np.zeros(n_rtp)\n", + "xi_true = np.zeros(n_rtp)\n", + "zeta_true = np.zeros(n_rtp)\n", + "fun_true = np.zeros(n_rtp)\n", + "vel_true = np.zeros(n_rtp)\n", + "a_true = np.zeros(n_rtp)\n", + "b_true = np.zeros(n_rtp)\n", + "c_true = np.zeros(n_rtp)\n", + "f_true = np.zeros(n_rtp)\n", + "\n", + "c=0\n", + "for ir in range(n_rtp[2]):\n", + " for it in range(n_rtp[1]):\n", + " for ip in range(n_rtp[0]):\n", + " #eta_init[ip,it,ir] = 0.0\n", + " #xi_init[ip,it,ir] = 0.0\n", + " zeta_init[ip,it,ir] = gamma*math.sqrt(eta_init[ip,it,ir]**2 + xi_init[ip,it,ir]**2)\n", + " fun_init[ip,it,ir] = s0\n", + " vel_init[ip,it,ir] = 1.0/s0\n", + " a_init[ip,it,ir] = 1.0 + 2.0*zeta_init[ip,it,ir]\n", + " b_init[ip,it,ir] = 1.0 - 2.0*xi_init[ip,it,ir]\n", + " c_init[ip,it,ir] = 1.0 + 2.0*xi_init[ip,it,ir]\n", + " f_init[ip,it,ir] = -2.0 * eta_init[ip,it,ir]\n", + "\n", + " # true model\n", + " if (tt[it] >= 38.0/180.0*math.pi and tt[it] <= 42.0/180.0*math.pi \\\n", + " and pp[ip] >= 23.0/180.0*math.pi and pp[ip] <= 27.0/180.0*math.pi):\n", + " c+=1\n", + " sigma = math.sin(2.0*math.pi*(tt[it]-38.0/180.0*math.pi)/(4.0/180.0*math.pi))*math.sin(2.0*math.pi*(pp[ip]-23.0/180.0*math.pi)/(4.0/180.0*math.pi))\n", + " else:\n", + " sigma = 0.0\n", + "\n", + " if sigma < 0:\n", + " psi = 60.0/180.0*math.pi\n", + " elif sigma > 0:\n", + " psi = 120.0/180.0*math.pi\n", + " else:\n", + " psi = 0.0\n", + "\n", + " eta_true[ip,it,ir] = ani_p*abs(sigma)*math.sin(2.0*psi)\n", + " xi_true[ip,it,ir] = ani_p*abs(sigma)*math.cos(2.0*psi)\n", + " zeta_true[ip,it,ir] = gamma*math.sqrt(eta_true[ip,it,ir]**2 + xi_true[ip,it,ir]**2)\n", + " fun_true[ip,it,ir] = s0/(1.0+sigma*slow_p)\n", + " vel_true[ip,it,ir] = 1.0/fun_true[ip,it,ir] \n", + " a_true[ip,it,ir] = 1.0 + 2.0*zeta_true[ip,it,ir]\n", + " b_true[ip,it,ir] = 1.0 - 2.0*xi_true[ip,it,ir]\n", + " c_true[ip,it,ir] = 1.0 + 2.0*xi_true[ip,it,ir]\n", + " f_true[ip,it,ir] = -2.0 * eta_true[ip,it,ir]\n", + "\n", + "\n", + "\n", + "r_earth = 6378.1370\n", + "print(\"depminmax {} {}\".format(r_earth-rr1,r_earth-rr2))\n", + "print(c)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# write out\n", + "import h5py\n", + "\n", + "fout_init = h5py.File('test_model_init.h5', 'w')\n", + "fout_true = h5py.File('test_model_true.h5', 'w')\n", + "\n", + "# write out the arrays eta_init, xi_init, zeta_init, fun_init, a_init, b_init, c_init, f_init\n", + "fout_init.create_dataset('eta', data=eta_init.T)\n", + "fout_init.create_dataset('xi', data=xi_init.T)\n", + "fout_init.create_dataset('zeta', data=zeta_init.T)\n", + "fout_init.create_dataset('fun', data=fun_init.T)\n", + "fout_init.create_dataset('fac_a', data=a_init.T)\n", + "fout_init.create_dataset('fac_b', data=b_init.T)\n", + "fout_init.create_dataset('fac_c', data=c_init.T)\n", + "fout_init.create_dataset('fac_f', data=f_init.T)\n", + "fout_init.create_dataset('vel', data=vel_init.T)\n", + "\n", + "# writeout the arrays eta_true, xi_true, zeta_true, fun_true, a_true, b_true, c_true, f_true\n", + "fout_true.create_dataset('eta', data=eta_true.T)\n", + "fout_true.create_dataset('xi', data=xi_true.T)\n", + "fout_true.create_dataset('zeta', data=zeta_true.T)\n", + "fout_true.create_dataset('fun', data=fun_true.T)\n", + "fout_true.create_dataset('fac_a', data=a_true.T)\n", + "fout_true.create_dataset('fac_b', data=b_true.T)\n", + "fout_true.create_dataset('fac_c', data=c_true.T)\n", + "fout_true.create_dataset('fac_f', data=f_true.T)\n", + "fout_true.create_dataset('vel', data=vel_true.T)\n", + "\n", + "fout_init.close()\n", + "fout_true.close()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# prepare src station file\n", + "\n", + "```\n", + " 26 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- src  : id_src year month day hour min sec lat lon dep_km mag num_recs id_event\n", + " 26 1 PCBI 1.8900 98.9253 1000.0000 P 10.40 18.000 <- arrival : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arrival_time_sec\n", + " 26 2 MRPI 1.6125 99.3172 1100.0000 P 50.84 19.400\n", + " 26 3 HUTI 2.3153 98.9711 1600.0000 P 57.84 19.200\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "random.seed(1145141919810)\n", + "\n", + "# dummys\n", + "year_dummy = 1998\n", + "month_dummy = 1\n", + "day_dummy = 1\n", + "hour_dummy = 0\n", + "minute_dummy = 0\n", + "second_dummy = 0\n", + "mag_dummy = 3.0\n", + "id_dummy = 1000\n", + "st_name_dummy = 'AAAA'\n", + "phase_dummy = 'P'\n", + "dist_dummy = 100.0\n", + "arriv_t_dummy = 0.0\n", + "\n", + "tt1deg = tt1 * 180.0/math.pi\n", + "tt2deg = tt2 * 180.0/math.pi\n", + "pp1deg = pp1 * 180.0/math.pi\n", + "pp2deg = pp2 * 180.0/math.pi\n", + "\n", + "\n", + "n_src = 1\n", + "n_rec = [1 for x in range(n_src)]\n", + "\n", + "\n", + "lines = []\n", + "\n", + "nij_src = math.sqrt(n_src)\n", + "nij_rec = math.sqrt(n_rec[0])\n", + "\n", + "pos_src=[]\n", + "pos_rec=[]\n", + "\n", + "# create dummy src\n", + "for i_src in range(n_src):\n", + " # define one point in the domain (rr1 bottom, rr2 top)\n", + " # random\n", + " #dep = random.uniform((R_earth-rr1)*0.95,(R_earth-rr1)*0.98)\n", + " #lon = random.uniform(pp1deg,pp2deg)\n", + " #lat = random.uniform(tt1deg,tt2deg)\n", + " # regularl\n", + " dep = (R_earth-rr1)*0.9\n", + " tmp_ilon = i_src%nij_src\n", + " tmp_ilat = int(i_src/nij_src)\n", + " lon = pp1deg + tmp_ilon*(pp2deg-pp1deg)/nij_src\n", + " lat = tt1deg + tmp_ilat*(tt2deg-tt1deg)/nij_src\n", + "\n", + " src = [i_src, year_dummy, month_dummy, day_dummy, hour_dummy, minute_dummy, second_dummy, lat, lon, dep, mag_dummy, n_rec[i_src], id_dummy]\n", + " lines.append(src)\n", + "\n", + " pos_src.append([lon,lat,dep])\n", + "\n", + "\n", + " # create dummy station\n", + " for i_rec in range(n_rec[i_src]):\n", + " elev_rec = random.uniform(0.0,-10.0) # elevation in m\n", + " lon_rec = random.uniform(pp1deg,pp2deg)\n", + " lat_rec = random.uniform(tt1deg,tt2deg)\n", + " # regularly\n", + " #elev_rec = -10.0\n", + " #tmp_ilon = i_rec%nij_rec\n", + " #tmp_ilat = int(i_rec/nij_rec)\n", + " #lon_rec = pp1deg + tmp_ilon*(pp2deg-pp1deg)/nij_rec\n", + " #lat_rec = tt1deg + tmp_ilat*(tt2deg-tt1deg)/nij_rec\n", + "\n", + " rec = [i_src, i_rec, st_name_dummy+str(i_rec), lat_rec, lon_rec, elev_rec, phase_dummy, dist_dummy, arriv_t_dummy]\n", + " lines.append(rec)\n", + "\n", + " pos_rec.append([lon_rec,lat_rec,elev_rec])\n", + "\n", + "\n", + "# write out ev_arrivals file\n", + "fname = 'src_rec_test.dat'\n", + "\n", + "with open(fname, 'w') as f:\n", + " for line in lines:\n", + " for elem in line:\n", + " f.write('{} '.format(elem))\n", + " f.write('\\n')\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# draw src and rec positions\n", + "import matplotlib.pyplot as plt\n", + "\n", + "for i_src in range(n_src):\n", + " plt.scatter(pos_src[i_src][1],pos_src[i_src][0],c='r',marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot receivers\n", + "for i_rec in range(n_rec[0]):\n", + " plt.scatter(pos_rec[i_rec][1],pos_rec[i_rec][0],c='b',marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "vscode": { + "interpreter": { + "hash": "fbd0b2a7df497f398d93ab2f589d8a5daa3108cfb7ff2b90736653cca3aeadc0" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_one_src/make_test_model.py b/test/old_tests/inversion_one_src/make_test_model.py new file mode 100644 index 0000000..92e3922 --- /dev/null +++ b/test/old_tests/inversion_one_src/make_test_model.py @@ -0,0 +1,246 @@ +# %% [markdown] +# # notebook for create init and true test model + +# %% +import numpy as np +import math + +# grid +R_earth = 6378.1370 + +rr1=6361 +rr2=6381 +tt1=(38.0-0.3)/180*math.pi +tt2=(42.0+0.3)/180*math.pi +pp1=(23.0-0.3)/180*math.pi +pp2=(27.0+0.3)/180*math.pi + +n_rtp = [20,50,50] +n_rtp.reverse() +dr = (rr2-rr1)/n_rtp[2] +dt = (tt2-tt1)/n_rtp[1] +dp = (pp2-pp1)/n_rtp[0] +rr = np.array([rr1 + x*dr for x in range(n_rtp[2])]) +tt = np.array([tt1 + x*dt for x in range(n_rtp[1])]) +pp = np.array([pp1 + x*dp for x in range(n_rtp[0])]) + +# initial model +gamma = 0.0 +s0 = 1.0/6.0 +slow_p=0.06 +ani_p=0.04 + +eta_init = np.zeros(n_rtp) +xi_init = np.zeros(n_rtp) +zeta_init = np.zeros(n_rtp) +fun_init = np.zeros(n_rtp) +vel_init = np.zeros(n_rtp) +a_init = np.zeros(n_rtp) +b_init = np.zeros(n_rtp) +c_init = np.zeros(n_rtp) +f_init = np.zeros(n_rtp) + +# true model +eta_true = np.zeros(n_rtp) +xi_true = np.zeros(n_rtp) +zeta_true = np.zeros(n_rtp) +fun_true = np.zeros(n_rtp) +vel_true = np.zeros(n_rtp) +a_true = np.zeros(n_rtp) +b_true = np.zeros(n_rtp) +c_true = np.zeros(n_rtp) +f_true = np.zeros(n_rtp) + +c=0 +for ir in range(n_rtp[2]): + for it in range(n_rtp[1]): + for ip in range(n_rtp[0]): + #eta_init[ip,it,ir] = 0.0 + #xi_init[ip,it,ir] = 0.0 + zeta_init[ip,it,ir] = gamma*math.sqrt(eta_init[ip,it,ir]**2 + xi_init[ip,it,ir]**2) + fun_init[ip,it,ir] = s0 + vel_init[ip,it,ir] = 1.0/s0 + a_init[ip,it,ir] = 1.0 + 2.0*zeta_init[ip,it,ir] + b_init[ip,it,ir] = 1.0 - 2.0*xi_init[ip,it,ir] + c_init[ip,it,ir] = 1.0 + 2.0*xi_init[ip,it,ir] + f_init[ip,it,ir] = -2.0 * eta_init[ip,it,ir] + + # true model + if (tt[it] >= 38.0/180.0*math.pi and tt[it] <= 42.0/180.0*math.pi \ + and pp[ip] >= 23.0/180.0*math.pi and pp[ip] <= 27.0/180.0*math.pi): + c+=1 + sigma = math.sin(2.0*math.pi*(tt[it]-38.0/180.0*math.pi)/(4.0/180.0*math.pi))*math.sin(2.0*math.pi*(pp[ip]-23.0/180.0*math.pi)/(4.0/180.0*math.pi)) + else: + sigma = 0.0 + + if sigma < 0: + psi = 60.0/180.0*math.pi + elif sigma > 0: + psi = 120.0/180.0*math.pi + else: + psi = 0.0 + + eta_true[ip,it,ir] = ani_p*abs(sigma)*math.sin(2.0*psi) + xi_true[ip,it,ir] = ani_p*abs(sigma)*math.cos(2.0*psi) + zeta_true[ip,it,ir] = gamma*math.sqrt(eta_true[ip,it,ir]**2 + xi_true[ip,it,ir]**2) + fun_true[ip,it,ir] = s0/(1.0+sigma*slow_p) + vel_true[ip,it,ir] = 1.0/fun_true[ip,it,ir] + a_true[ip,it,ir] = 1.0 + 2.0*zeta_true[ip,it,ir] + b_true[ip,it,ir] = 1.0 - 2.0*xi_true[ip,it,ir] + c_true[ip,it,ir] = 1.0 + 2.0*xi_true[ip,it,ir] + f_true[ip,it,ir] = -2.0 * eta_true[ip,it,ir] + + + +r_earth = 6378.1370 +print("depminmax {} {}".format(r_earth-rr1,r_earth-rr2)) +print(c) + + +# %% + + +# %% +# write out +import h5py + +fout_init = h5py.File('test_model_init.h5', 'w') +fout_true = h5py.File('test_model_true.h5', 'w') + +# write out the arrays eta_init, xi_init, zeta_init, fun_init, a_init, b_init, c_init, f_init +fout_init.create_dataset('eta', data=eta_init.T) +fout_init.create_dataset('xi', data=xi_init.T) +fout_init.create_dataset('zeta', data=zeta_init.T) +fout_init.create_dataset('fun', data=fun_init.T) +fout_init.create_dataset('fac_a', data=a_init.T) +fout_init.create_dataset('fac_b', data=b_init.T) +fout_init.create_dataset('fac_c', data=c_init.T) +fout_init.create_dataset('fac_f', data=f_init.T) +fout_init.create_dataset('vel', data=vel_init.T) + +# writeout the arrays eta_true, xi_true, zeta_true, fun_true, a_true, b_true, c_true, f_true +fout_true.create_dataset('eta', data=eta_true.T) +fout_true.create_dataset('xi', data=xi_true.T) +fout_true.create_dataset('zeta', data=zeta_true.T) +fout_true.create_dataset('fun', data=fun_true.T) +fout_true.create_dataset('fac_a', data=a_true.T) +fout_true.create_dataset('fac_b', data=b_true.T) +fout_true.create_dataset('fac_c', data=c_true.T) +fout_true.create_dataset('fac_f', data=f_true.T) +fout_true.create_dataset('vel', data=vel_true.T) + +fout_init.close() +fout_true.close() + + +# %% [markdown] +# # prepare src station file +# +# ``` +# 26 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- src  : id_src year month day hour min sec lat lon dep_km mag num_recs id_event +# 26 1 PCBI 1.8900 98.9253 1000.0000 P 10.40 18.000 <- arrival : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arrival_time_sec +# 26 2 MRPI 1.6125 99.3172 1100.0000 P 50.84 19.400 +# 26 3 HUTI 2.3153 98.9711 1600.0000 P 57.84 19.200 +# +# ``` + +# %% +import random +random.seed(1145141919810) + +# dummys +year_dummy = 1998 +month_dummy = 1 +day_dummy = 1 +hour_dummy = 0 +minute_dummy = 0 +second_dummy = 0 +mag_dummy = 3.0 +id_dummy = 1000 +st_name_dummy = 'AAAA' +phase_dummy = 'P' +dist_dummy = 100.0 +arriv_t_dummy = 0.0 + +tt1deg = tt1 * 180.0/math.pi +tt2deg = tt2 * 180.0/math.pi +pp1deg = pp1 * 180.0/math.pi +pp2deg = pp2 * 180.0/math.pi + + +n_src = 1 +n_rec = [60 for x in range(n_src)] + + +lines = [] + +nij_src = math.sqrt(n_src) +nij_rec = math.sqrt(n_rec[0]) + +pos_src=[] +pos_rec=[] + +# create dummy src +for i_src in range(n_src): + # define one point in the domain (rr1 bottom, rr2 top) + # random + #dep = random.uniform((R_earth-rr1)*0.95,(R_earth-rr1)*0.98) + #lon = random.uniform(pp1deg,pp2deg) + #lat = random.uniform(tt1deg,tt2deg) + # regularl + dep = (R_earth-rr1)*0.9 + tmp_ilon = i_src%nij_src + tmp_ilat = int(i_src/nij_src) + lon = pp1deg + tmp_ilon*(pp2deg-pp1deg)/nij_src + lat = tt1deg + tmp_ilat*(tt2deg-tt1deg)/nij_src + + src = [i_src, year_dummy, month_dummy, day_dummy, hour_dummy, minute_dummy, second_dummy, lat, lon, dep, mag_dummy, n_rec[i_src], id_dummy] + lines.append(src) + + pos_src.append([lon,lat,dep]) + + + # create dummy station + for i_rec in range(n_rec[i_src]): + #elev_rec = random.uniform(0.0,-10.0) # elevation in m + #lon_rec = random.uniform(pp1deg,pp2deg) + #lat_rec = random.uniform(tt1deg,tt2deg) + # regularly + elev_rec = -10.0 + tmp_ilon = i_rec%nij_rec + tmp_ilat = int(i_rec/nij_rec) + lon_rec = pp1deg + tmp_ilon*(pp2deg-pp1deg)/nij_rec + lat_rec = tt1deg + tmp_ilat*(tt2deg-tt1deg)/nij_rec + + rec = [i_src, i_rec, st_name_dummy, lat_rec, lon_rec, elev_rec, phase_dummy, dist_dummy, arriv_t_dummy] + lines.append(rec) + + pos_rec.append([lon_rec,lat_rec,elev_rec]) + + +# write out ev_arrivals file +fname = 'src_rec_test.dat' + +with open(fname, 'w') as f: + for line in lines: + for elem in line: + f.write('{} '.format(elem)) + f.write('\n') + + +# %% +# draw src and rec positions +import matplotlib.pyplot as plt + +for i_src in range(n_src): + plt.scatter(pos_src[i_src][1],pos_src[i_src][0],c='r',marker='o') + +# %% +# plot receivers +for i_rec in range(n_rec[0]): + plt.scatter(pos_rec[i_rec][1],pos_rec[i_rec][0],c='b',marker='o') + +# %% + + + diff --git a/test/old_tests/inversion_tele/1d_ak135.txt b/test/old_tests/inversion_tele/1d_ak135.txt new file mode 100644 index 0000000..58f131c --- /dev/null +++ b/test/old_tests/inversion_tele/1d_ak135.txt @@ -0,0 +1,136 @@ + 0.000, 5.8000 + 20.000, 5.8000 + 20.000, 6.5000 + 35.000, 6.5000 + 35.000, 8.0400 + 77.500, 8.0450 + 120.000, 8.0500 + 165.000, 8.1750 + 210.000, 8.3000 + 210.000, 8.3000 + 260.000, 8.4825 + 310.000, 8.6650 + 360.000, 8.8475 + 410.000, 9.0300 + 410.000, 9.3600 + 460.000, 9.5280 + 510.000, 9.6960 + 560.000, 9.8640 + 610.000, 10.0320 + 660.000, 10.2000 + 660.000, 10.7900 + 710.000, 10.9229 + 760.000, 11.0558 + 809.500, 11.1353 + 859.000, 11.2221 + 908.500, 11.3068 + 958.000, 11.3896 +1007.500, 11.4705 +1057.000, 11.5495 +1106.500, 11.6269 +1156.000, 11.7026 +1205.500, 11.7766 +1255.000, 11.8491 +1304.500, 11.9200 +1354.000, 11.9895 +1403.500, 12.0577 +1453.000, 12.1245 +1502.500, 12.1912 +1552.000, 12.2550 +1601.500, 12.3185 +1651.000, 12.3819 +1700.500, 12.4426 +1750.000, 12.5031 +1799.500, 12.5631 +1849.000, 12.6221 +1898.500, 12.6804 +1948.000, 12.7382 +1997.500, 12.7956 +2047.000, 12.8526 +2096.500, 12.9096 +2146.000, 12.9668 +2195.500, 13.0222 +2245.000, 13.0783 +2294.500, 13.1336 +2344.000, 13.1894 +2393.500, 13.2465 +2443.000, 13.3018 +2492.500, 13.3585 +2542.000, 13.4156 +2591.500, 13.4741 +2640.000, 13.5312 +2690.000, 13.5900 +2740.000, 13.6494 +2740.000, 13.6494 +2789.670, 13.6530 +2839.330, 13.6566 +2891.500, 13.6602 +2891.500, 8.0000 +2939.330, 8.0382 +2989.660, 8.1283 +3039.990, 8.2213 +3090.320, 8.3122 +3140.660, 8.4001 +3190.990, 8.4861 +3241.320, 8.5692 +3291.650, 8.6496 +3341.980, 8.7283 +3392.310, 8.8036 +3442.640, 8.8761 +3492.970, 8.9461 +3543.300, 9.0138 +3593.640, 9.0792 +3643.970, 9.1426 +3694.300, 9.2042 +3744.630, 9.2634 +3794.960, 9.3205 +3845.290, 9.3760 +3895.620, 9.4297 +3945.950, 9.4814 +3996.280, 9.5306 +4046.620, 9.5777 +4096.950, 9.6232 +4147.280, 9.6673 +4197.610, 9.7100 +4247.940, 9.7513 +4298.270, 9.7914 +4348.600, 9.8304 +4398.930, 9.8682 +4449.260, 9.9051 +4499.600, 9.9410 +4549.930, 9.9761 +4600.260, 10.0103 +4650.590, 10.0439 +4700.920, 10.0768 +4801.580, 10.1415 +4851.910, 10.1739 +4902.240, 10.2049 +4952.580, 10.2329 +5002.910, 10.2565 +5053.240, 10.2745 +5103.570, 10.2854 +5153.500, 10.2890 +5153.500, 11.0427 +5204.610, 11.0585 +5255.320, 11.0718 +5306.040, 11.0850 +5356.750, 11.0983 +5407.460, 11.1166 +5458.170, 11.1316 +5508.890, 11.1457 +5559.600, 11.1590 +5610.310, 11.1715 +5661.020, 11.1832 +5711.740, 11.1941 +5813.160, 11.2134 +5863.870, 11.2219 +5914.590, 11.2295 +5965.300, 11.2364 +6016.010, 11.2424 +6066.720, 11.2477 +6117.440, 11.2521 +6168.150, 11.2557 +6218.860, 11.2586 +6269.570, 11.2606 +6320.290, 11.2618 +6371.000, 11.2622 \ No newline at end of file diff --git a/test/old_tests/inversion_tele/1d_model.txt b/test/old_tests/inversion_tele/1d_model.txt new file mode 100644 index 0000000..e8ae686 --- /dev/null +++ b/test/old_tests/inversion_tele/1d_model.txt @@ -0,0 +1,158 @@ +5463, 11.3059 +5473, 11.2888 +5483, 11.2717 +5493, 11.2546 +5503, 11.2375 +5513, 11.2203 +5523, 11.2028 +5533, 11.1853 +5543, 11.1677 +5553, 11.1502 +5563, 11.1329 +5573, 11.1168 +5583, 11.1008 +5593, 11.0847 +5603, 11.0686 +5613, 11.0505 +5623, 11.0239 +5633, 10.9973 +5643, 10.9707 +5653, 10.9442 +5663, 10.9176 +5673, 10.891 +5683, 10.8644 +5693, 10.8378 +5703, 10.8113 +5713, 10.1933 +5723, 10.1597 +5733, 10.1261 +5743, 10.0925 +5753, 10.0589 +5763, 10.0253 +5773, 9.99168 +5783, 9.95808 +5793, 9.92448 +5803, 9.89088 +5813, 9.85728 +5823, 9.82368 +5833, 9.79008 +5843, 9.75648 +5853, 9.72288 +5863, 9.68928 +5873, 9.65568 +5883, 9.62208 +5893, 9.58848 +5903, 9.55488 +5913, 9.52128 +5923, 9.48768 +5933, 9.45408 +5943, 9.42048 +5953, 9.38688 +5963, 9.0227 +5973, 8.9862 +5983, 8.9497 +5993, 8.9132 +6003, 8.8767 +6013, 8.8402 +6023, 8.8037 +6033, 8.7672 +6043, 8.7307 +6053, 8.6942 +6063, 8.6577 +6073, 8.6212 +6083, 8.5847 +6093, 8.5482 +6103, 8.5117 +6113, 8.4752 +6123, 8.4387 +6133, 8.4022 +6143, 8.3657 +6153, 8.3292 +6163, 8.29444 +6173, 8.26667 +6183, 8.23889 +6193, 8.21111 +6203, 8.18333 +6213, 8.15556 +6223, 8.12778 +6233, 8.1 +6243, 8.07222 +6253, 8.04976 +6263, 8.04859 +6273, 8.04741 +6283, 8.04624 +6293, 8.04506 +6303, 8.04388 +6313, 8.04271 +6323, 8.04153 +6333, 8.04035 +6343, 6.5 +6353, 5.8 +6363, 5.8 +6373, 5.8 +6383, 5.8 +6393, 5.8 +6403, 5.8 +6413, 5.8 +6423, 5.8 +6433, 5.8 +6443, 5.8 +6453, 5.8 +6463, 5.8 +6473, 5.8 +6483, 5.8 +6493, 5.8 +6503, 5.8 +6513, 5.8 +6523, 5.8 +6533, 5.8 +6543, 5.8 +6553, 5.8 +6563, 5.8 +6573, 5.8 +6583, 5.8 +6593, 5.8 +6603, 5.8 +6613, 5.8 +6623, 5.8 +6633, 5.8 +6643, 5.8 +6653, 5.8 +6663, 5.8 +6673, 5.8 +6683, 5.8 +6693, 5.8 +6703, 5.8 +6713, 5.8 +6723, 5.8 +6733, 5.8 +6743, 5.8 +6753, 5.8 +6763, 5.8 +6773, 5.8 +6783, 5.8 +6793, 5.8 +6803, 5.8 +6813, 5.8 +6823, 5.8 +6833, 5.8 +6843, 5.8 +6853, 5.8 +6863, 5.8 +6873, 5.8 +6883, 5.8 +6893, 5.8 +6903, 5.8 +6913, 5.8 +6923, 5.8 +6933, 5.8 +6943, 5.8 +6953, 5.8 +6963, 5.8 +6973, 5.8 +6983, 5.8 +6993, 5.8 +7003, 5.8 +7013, 5.8 +7023, 5.8 +7033, 5.8 diff --git a/test/old_tests/inversion_tele/README.md b/test/old_tests/inversion_tele/README.md new file mode 100644 index 0000000..e26c4ac --- /dev/null +++ b/test/old_tests/inversion_tele/README.md @@ -0,0 +1,30 @@ +# Inversion test + +This is a test setup for inversion calculation with teleseismic events. + +1. Run all cells of `make_test_model.ipynb` for creating + - source, receiver file (src_rec_test.dat) + - true model (test_model_true.h5) + - initial model (test_model_init.h5) + +2. then run TOMOATT forward with `input_params_pre.yml` for calculating the true arrival times at the stations +At first, TOMOATT calculates 2d traveltime field for each teleseismic event. +TOMOATT will find the event source is teleseismic if the event origin is outside of the simulation domain. +Calculated 2d traveltime field is saved in OUTPUT_FILES directory with 2d_travel_time_field_{src_id}.h5 +2D solver run will be skipped if this file is found by TOMOATT. +Result travel time at the stations is saved in the file `src_rec_test_out.dat` +Following command will run the forward simulation with the true model +``` bash +mpirun -n 8 ../../build/TOMOATT -i input_params_pre.yml +``` +Volumetric output data is saved in the file `OUTPUT_FILES/out_data_sim_0.h5`. +This file may be visualized by paraview with opening the index file `OUTPUT_FILES/out_data_sim_0.xmf`. + +3. run TOMOATT in inversion mode with `input_params.yml`, by the command +``` bash +mpirun -n 8 ../../build/TOMOATT -i input_params.yml +``` +The volumetric output data is saved in the file `OUTPUT_FILES/out_data_sim_0.h5`. + + +4. For retrieving the output data from *.h5, please use the python script `utils/tomoatt_data_retrieval.py` \ No newline at end of file diff --git a/test/old_tests/inversion_tele/check_1d_model_and_Tfield.ipynb b/test/old_tests/inversion_tele/check_1d_model_and_Tfield.ipynb new file mode 100644 index 0000000..9bafa64 --- /dev/null +++ b/test/old_tests/inversion_tele/check_1d_model_and_Tfield.ipynb @@ -0,0 +1,111 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot 1d_model.txt\n", + "fname_gen='1d_model.txt'\n", + "fname_ori='1d_ak135.txt'\n", + "\n", + "r_earth = 6371.0\n", + "\n", + "# read file\n", + "\n", + "dep_gen=[]\n", + "vp_gen=[]\n", + "\n", + "with open(fname_gen, 'r') as f:\n", + " lines = f.readlines()\n", + "\n", + " for line in lines:\n", + " line = line.strip()\n", + " if line.startswith('#'):\n", + " continue\n", + " else:\n", + " line = line.split(\",\")\n", + " dep_gen.append(r_earth-float(line[0]))\n", + " vp_gen.append(float(line[1]))\n", + "\n", + "dep_ori=[]\n", + "vp_ori=[]\n", + "\n", + "with open(fname_ori,'r') as f:\n", + " lines = f.readlines()\n", + "\n", + " for line in lines:\n", + " line = line.strip()\n", + " if line.startswith('#'):\n", + " continue\n", + " else:\n", + " line = line.split(\",\")\n", + " dep_ori.append(float(line[0]))\n", + " vp_ori.append(float(line[1]))\n", + "\n", + "\n", + "# plot dep and vp\n", + "import matplotlib.pyplot as plt\n", + "\n", + "plt.plot(dep_gen, vp_gen, linewidth=10)\n", + "plt.plot(dep_ori, vp_ori)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# read 2D traveltime field and plot\n", + "import h5py\n", + "import matplotlib.pyplot as plt\n", + "\n", + "fname_Tfield='OUTPUT_FILES/2d_travel_time_field_0.h5'\n", + "\n", + "with h5py.File(fname_Tfield, 'r') as f:\n", + " T_2d = f['T'][:,:]\n", + " t_1d = f['t'][:]\n", + " r_1d = f['r'][:]\n", + "\n", + "plt.imshow(T_2d, extent=[t_1d[0], t_1d[-1], r_1d[0], r_1d[-1]], aspect='auto') \n", + "plt.colorbar()\n", + "#plt.imshow(T_2d)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "vscode": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_tele/fortran_code/ega5/input/EARTHQUAKES_region b/test/old_tests/inversion_tele/fortran_code/ega5/input/EARTHQUAKES_region new file mode 100644 index 0000000..8276b54 --- /dev/null +++ b/test/old_tests/inversion_tele/fortran_code/ega5/input/EARTHQUAKES_region @@ -0,0 +1,201 @@ +200 + 11.802 0.000 120.430 + 10.977 0.000 112.347 + 14.799 0.000 116.441 + 13.870 0.000 114.593 + 2.238 0.000 118.621 + 18.077 0.000 111.279 + 15.485 0.000 128.750 + 5.138 0.000 129.964 + 1.021 0.000 117.016 + 16.461 0.000 124.992 + 12.131 0.000 127.582 + 1.691 0.000 129.371 + 14.213 0.000 120.983 + 12.474 0.000 125.122 + 10.740 0.000 129.356 + 15.138 0.000 119.121 + 16.849 0.000 113.748 + 10.421 0.000 127.899 + 8.083 0.000 113.566 + 7.194 0.000 127.568 + 15.695 0.000 129.820 + 15.755 0.000 128.741 + 4.287 0.000 119.474 + 3.368 0.000 116.248 + 16.400 0.000 110.836 + 2.200 0.000 126.318 + 8.136 0.000 128.447 + 14.206 0.000 127.036 + 11.432 0.000 126.942 + 8.027 0.000 118.581 + 2.233 0.000 126.321 + 2.856 0.000 128.286 + 15.194 0.000 111.542 + 19.468 0.000 114.427 + 18.235 0.000 116.594 + 11.378 0.000 117.484 + 7.172 0.000 113.442 + 15.956 0.000 125.590 + 2.810 0.000 114.026 + 12.895 0.000 127.486 + 8.131 0.000 125.399 + 9.603 0.000 127.463 + 9.059 0.000 127.470 + 15.437 0.000 117.213 + 4.344 0.000 120.949 + 8.399 0.000 112.079 + 6.747 0.000 114.103 + 8.264 0.000 119.535 + 8.660 0.000 125.041 + 12.518 0.000 111.975 + 1.344 0.000 115.458 + 14.245 0.000 122.863 + 14.446 0.000 127.582 + 7.296 0.000 123.609 + 15.986 0.000 118.914 + 2.741 0.000 128.433 + 2.776 0.000 114.310 + 10.058 0.000 118.660 + 4.767 0.000 112.640 + 6.614 0.000 123.114 + 18.459 0.000 128.929 + 5.942 0.000 112.869 + 9.770 0.000 123.277 + 11.403 0.000 128.818 + 10.440 0.000 127.002 + 11.587 0.000 122.665 + 13.228 0.000 127.416 + 2.504 0.000 110.861 + 3.837 0.000 120.637 + 15.225 0.000 112.534 + 12.590 0.000 123.332 + 9.117 0.000 122.897 + 15.230 0.000 125.084 + 6.218 0.000 129.723 + 17.309 0.000 125.024 + 2.178 0.000 120.731 + 13.611 0.000 112.946 + 2.805 0.000 123.454 + 4.944 0.000 115.870 + 14.004 0.000 125.492 + 4.209 0.000 125.665 + 13.779 0.000 123.429 + 2.183 0.000 118.440 + 5.357 0.000 123.154 + 13.240 0.000 116.284 + 18.648 0.000 121.295 + 19.219 0.000 115.919 + 1.486 0.000 121.474 + 2.457 0.000 119.333 + 16.288 0.000 127.138 + 5.268 0.000 121.570 + 5.623 0.000 122.193 + 12.494 0.000 112.512 + 1.649 0.000 120.953 + 18.253 0.000 113.672 + 4.109 0.000 115.474 + 15.850 0.000 121.814 + 6.920 0.000 115.925 + 3.525 0.000 127.491 + 7.125 0.000 127.679 + 8.291 0.000 129.702 + 2.453 0.000 116.388 + 10.126 0.000 114.561 + 16.671 0.000 115.128 + 9.499 0.000 115.955 + 7.057 0.000 114.557 + 9.537 0.000 118.136 + 17.129 0.000 127.229 + 13.159 0.000 123.202 + 18.156 0.000 112.430 + 12.148 0.000 127.744 + 4.707 0.000 118.976 + 12.066 0.000 113.261 + 9.917 0.000 112.249 + 4.562 0.000 115.574 + 9.033 0.000 111.773 + 2.664 0.000 115.781 + 3.620 0.000 113.157 + 8.536 0.000 124.149 + 12.984 0.000 118.287 + 11.377 0.000 114.723 + 14.438 0.000 117.563 + 6.770 0.000 117.346 + 19.103 0.000 122.253 + 11.890 0.000 120.057 + 1.882 0.000 125.606 + 6.826 0.000 120.949 + 1.447 0.000 124.624 + 11.237 0.000 114.481 + 18.727 0.000 124.695 + 16.117 0.000 125.042 + 9.385 0.000 111.953 + 2.156 0.000 110.976 + 17.274 0.000 110.739 + 11.901 0.000 116.806 + 3.311 0.000 112.308 + 16.118 0.000 129.010 + 14.839 0.000 111.311 + 14.383 0.000 114.445 + 4.545 0.000 110.627 + 6.887 0.000 111.142 + 15.771 0.000 129.508 + 16.464 0.000 111.184 + 5.103 0.000 113.133 + 5.517 0.000 111.094 + 11.793 0.000 121.722 + 9.895 0.000 127.312 + 2.327 0.000 117.660 + 9.218 0.000 127.343 + 17.444 0.000 120.635 + 13.747 0.000 115.551 + 14.244 0.000 112.432 + 7.793 0.000 123.270 + 2.825 0.000 128.950 + 17.617 0.000 127.288 + 2.807 0.000 126.756 + 15.653 0.000 126.819 + 17.047 0.000 120.984 + 5.550 0.000 128.964 + 18.377 0.000 111.008 + 9.899 0.000 124.873 + 17.878 0.000 126.725 + 9.937 0.000 121.221 + 9.665 0.000 127.646 + 11.705 0.000 118.606 + 8.598 0.000 123.095 + 9.381 0.000 112.372 + 12.011 0.000 111.390 + 9.745 0.000 126.383 + 6.575 0.000 112.135 + 1.758 0.000 125.892 + 14.843 0.000 114.231 + 2.378 0.000 115.137 + 13.871 0.000 121.657 + 17.999 0.000 127.665 + 11.245 0.000 120.451 + 2.764 0.000 112.762 + 15.920 0.000 111.560 + 12.590 0.000 115.623 + 10.907 0.000 128.019 + 14.613 0.000 125.835 + 11.296 0.000 120.752 + 5.326 0.000 115.745 + 8.918 0.000 125.743 + 14.636 0.000 122.201 + 10.490 0.000 126.751 + 13.210 0.000 129.310 + 14.389 0.000 122.314 + 10.010 0.000 112.866 + 2.412 0.000 122.699 + 10.634 0.000 129.658 + 15.328 0.000 116.282 + 17.949 0.000 117.036 + 10.058 0.000 129.116 + 10.862 0.000 126.679 + 5.712 0.000 113.093 + 7.001 0.000 119.322 + 17.848 0.000 129.814 + 2.726 0.000 123.738 + 2.228 0.000 123.016 diff --git a/test/old_tests/inversion_tele/fortran_code/ega5/input/EARTHQUAKES_tele b/test/old_tests/inversion_tele/fortran_code/ega5/input/EARTHQUAKES_tele new file mode 100644 index 0000000..464a4e7 --- /dev/null +++ b/test/old_tests/inversion_tele/fortran_code/ega5/input/EARTHQUAKES_tele @@ -0,0 +1,31 @@ +30 + 93.754 0.000 167.742 90.000 47.742 + 91.741 0.000 76.894 270.000 43.106 + 28.520 0.000 192.245 90.000 72.245 + 99.877 0.000 171.239 90.000 51.239 + 29.960 0.000 68.069 270.000 51.931 + 63.202 0.000 57.747 270.000 62.253 + 25.908 0.000 199.894 90.000 79.894 + 60.869 0.000 72.681 270.000 47.319 + 58.767 0.000 77.051 270.000 42.949 + 12.108 0.000 189.167 90.000 69.167 + 46.008 0.000 43.608 270.000 76.392 + 10.170 0.000 74.481 270.000 45.519 + 89.800 0.000 175.250 90.000 55.250 + 31.693 0.000 166.363 90.000 46.363 + 93.750 0.000 68.855 270.000 51.145 + 51.260 0.000 193.542 90.000 73.542 + 86.110 0.000 172.078 90.000 52.078 + 10.661 0.000 191.059 90.000 71.059 + 22.843 0.000 56.609 270.000 63.391 + 61.437 0.000 176.890 90.000 56.890 + 62.972 0.000 58.230 270.000 61.770 + 39.053 0.000 185.517 90.000 65.517 + 32.690 0.000 167.737 90.000 47.737 + 78.764 0.000 190.265 90.000 70.265 + 76.323 0.000 184.958 90.000 64.958 + 33.802 0.000 47.777 270.000 72.223 + 25.489 0.000 62.227 270.000 57.773 + 51.580 0.000 195.428 90.000 75.428 + 64.127 0.000 171.087 90.000 51.087 + 92.574 0.000 73.692 270.000 46.308 diff --git a/test/old_tests/inversion_tele/fortran_code/ega5/input/STATIONS b/test/old_tests/inversion_tele/fortran_code/ega5/input/STATIONS new file mode 100644 index 0000000..1df466e --- /dev/null +++ b/test/old_tests/inversion_tele/fortran_code/ega5/input/STATIONS @@ -0,0 +1,41 @@ +40 + 0.000 0.000 110.250 + 0.000 0.000 110.750 + 0.000 0.000 111.250 + 0.000 0.000 111.750 + 0.000 0.000 112.250 + 0.000 0.000 112.750 + 0.000 0.000 113.250 + 0.000 0.000 113.750 + 0.000 0.000 114.250 + 0.000 0.000 114.750 + 0.000 0.000 115.250 + 0.000 0.000 115.750 + 0.000 0.000 116.250 + 0.000 0.000 116.750 + 0.000 0.000 117.250 + 0.000 0.000 117.750 + 0.000 0.000 118.250 + 0.000 0.000 118.750 + 0.000 0.000 119.250 + 0.000 0.000 119.750 + 0.000 0.000 120.250 + 0.000 0.000 120.750 + 0.000 0.000 121.250 + 0.000 0.000 121.750 + 0.000 0.000 122.250 + 0.000 0.000 122.750 + 0.000 0.000 123.250 + 0.000 0.000 123.750 + 0.000 0.000 124.250 + 0.000 0.000 124.750 + 0.000 0.000 125.250 + 0.000 0.000 125.750 + 0.000 0.000 126.250 + 0.000 0.000 126.750 + 0.000 0.000 127.250 + 0.000 0.000 127.750 + 0.000 0.000 128.250 + 0.000 0.000 128.750 + 0.000 0.000 129.250 + 0.000 0.000 129.750 diff --git a/test/old_tests/inversion_tele/fortran_code/ega5/input/inputdata.ipynb b/test/old_tests/inversion_tele/fortran_code/ega5/input/inputdata.ipynb new file mode 100644 index 0000000..ca5563c --- /dev/null +++ b/test/old_tests/inversion_tele/fortran_code/ega5/input/inputdata.ipynb @@ -0,0 +1,474 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "import random\n", + "import math\n", + "import matplotlib.pyplot as plt\n", + "\n", + "#震中距函数\n", + "def cal_dis(lat1, lon1,lat2, lon2):\n", + " latitude1 = (math.pi/180)*lat1\n", + " latitude2 = (math.pi/180)*lat2\n", + " longitude1 = (math.pi/180)*lon1\n", + " longitude2= (math.pi/180)*lon2\n", + " #因此AB两点的球面距离为:{arccos[sinb*siny+cosb*cosy*cos(a-x)]}*R\n", + " #地球半径\n", + " if((lat1-lat2)**2+(lon1-lon2)**2<0.0001):\n", + " return 0\n", + "\n", + " d = math.acos(math.sin(latitude1)*math.sin(latitude2)+ math.cos(latitude1)*math.cos(latitude2)*math.cos(longitude2-longitude1))/math.pi*180.0\n", + " return d\n", + "\n", + "#方位角函数\n", + "def cal_azimuth(lat1, lon1, lat2, lon2):\n", + " lat1_rad = lat1 * math.pi / 180\n", + " lon1_rad = lon1 * math.pi / 180\n", + " lat2_rad = lat2 * math.pi / 180\n", + " lon2_rad = lon2 * math.pi / 180\n", + " \n", + " y = math.sin(lon2_rad - lon1_rad) * math.cos(lat2_rad)\n", + " x = math.cos(lat1_rad) * math.sin(lat2_rad) - math.sin(lat1_rad) * math.cos(lat2_rad) * math.cos(lon2_rad - lon1_rad)\n", + " brng = math.atan2(y, x) * 180 / math.pi\n", + " if((lat1-lat2)**2+(lon1-lon2)**2<0.0001):\n", + " return 0\n", + " return float((brng + 360.0) % 360.0)\n", + "\n", + "\n", + "\n", + "# 研究区域范围\n", + "dep1 = 0; dep2 = 800; \n", + "lat1 = -1.0; lat2 = 1.0; \n", + "lon1 = 110.0; lon2 = 130.0; \n", + "clat = (lat1+lat2)/2.0; \n", + "clon = (lon1+lon2)/2.0; \n", + "\n", + "\n", + "# 生成一定数量的台站\n", + "Nst = 40; \n", + "pos_st=[]; \n", + "# 台站的范围\n", + "dep_st1 = -0.5; dep_st2 = 0.5; \n", + "lat_st1 = 0.0; lat_st2 = 0.0; \n", + "lon_st1 = 110.0; lon_st2 = 130.0; \n", + "\n", + "# 生成一定数量的地震\n", + "Nev_region = 200; \n", + "pos_ev_region=[]; \n", + "# 局部地震的范围\n", + "dep_ev_region1 = 1.0; dep_ev_region2 = 20.0; \n", + "lat_ev_region1 = 0.0; lat_ev_region2 = 0.0; \n", + "lon_ev_region1 = 110.0; lon_ev_region2 = 130.0; \n", + "\n", + "# 生成一定数量的远震\n", + "Nev_tele = 30; \n", + "pos_ev_tele=[]; \n", + "# 远震的范围\n", + "azi1 = 0.0; azi2 = 360.0; \n", + "degree1 = 40.0; degree2 = 80.0; \n", + "dep_ev_tele1 = 10.0; dep_ev_tele2 = 100.0; \n", + "\n", + "# 随机种子\n", + "random.seed(631)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.0 225.9511468651809 105.95114686518092 90.0\n", + "0.0 134.37263128921603 14.372631289216041 90.0\n", + "0.0 221.86291452364492 101.86291452364495 90.0\n", + "0.0 135.0265809510972 15.026580951097205 90.0\n", + "0.0 205.6327554209649 85.63275542096493 90.0\n", + "0.0 132.91673845591365 12.916738455913654 90.0\n", + "0.0 16.258737495319888 103.74126250468011 270.0\n", + "0.0 236.91222080019207 116.9122208001921 90.0\n", + "0.0 231.60534307538006 111.60534307538009 90.0\n", + "0.0 127.76937738221575 7.76937738221574 90.0\n", + "0.0 296.7089619188061 176.70896191880615 90.0\n", + "0.0 109.987388485231 10.012611514768977 270.0\n", + "0.0 167.7421462765811 47.74214627658114 90.0\n", + "0.0 143.53357078698778 23.53357078698778 90.0\n", + "0.0 76.89393688373681 43.10606311626317 270.0\n", + "0.0 243.99003464620372 123.99003464620375 90.0\n", + "0.0 107.72864961420355 12.271350385796454 270.0\n", + "0.0 192.24495483877945 72.24495483877948 90.0\n", + "0.0 131.78390165243425 11.783901652434272 90.0\n", + "0.0 28.764512000200227 91.23548799979977 270.0\n", + "0.0 334.7755278165224 145.2244721834776 270.0\n", + "0.0 210.25490259109463 90.25490259109465 90.0\n", + "0.0 339.62165350972003 140.37834649027994 270.0\n", + "0.0 356.65953464944505 123.34046535055498 270.0\n", + "0.0 310.73064432466316 169.26935567533684 270.0\n", + "0.0 14.362593311061245 105.63740668893875 270.0\n", + "0.0 219.55849454012824 99.55849454012825 90.0\n", + "0.0 216.37171778796466 96.37171778796468 90.0\n", + "0.0 17.888701551321237 102.11129844867875 270.0\n", + "0.0 171.2386125573614 51.23861255736139 90.0\n", + "0.0 341.33064526380423 138.66935473619577 270.0\n", + "0.0 210.8077223236536 90.8077223236536 90.0\n", + "0.0 289.112673508994 169.11267350899402 90.0\n", + "0.0 298.08845278767177 178.08845278767174 90.0\n", + "0.0 272.45026020019355 152.45026020019355 90.0\n", + "0.0 144.07425671018817 24.07425671018818 90.0\n", + "0.0 68.06864484053433 51.93135515946566 270.0\n", + "0.0 136.29773319963272 16.297733199632727 90.0\n", + "0.0 147.8123908849427 27.812390884942708 90.0\n", + "0.0 57.74720760152299 62.252792398477006 270.0\n", + "0.0 15.652724958883866 104.34727504111613 270.0\n", + "0.0 144.72146631701912 24.721466317019132 90.0\n", + "0.0 27.083088365413673 92.91691163458631 270.0\n", + "0.0 264.3101344354792 144.31013443547923 90.0\n", + "0.0 341.08957840202356 138.91042159797647 270.0\n", + "0.0 116.10814242841248 3.891857571587484 270.0\n", + "0.0 130.7610096663694 10.761009666369436 90.0\n", + "0.0 86.20775751226536 33.79224248773463 270.0\n", + "0.0 199.89381975746232 79.89381975746234 90.0\n", + "0.0 72.68053962138247 47.31946037861752 270.0\n", + "0.0 77.05144953292259 42.948550467077396 270.0\n", + "0.0 266.39229908576056 146.39229908576056 90.0\n", + "0.0 336.08487636106537 143.91512363893463 270.0\n", + "0.0 315.4798829868885 164.52011701311147 270.0\n", + "0.0 83.03381783702551 36.966182162974484 270.0\n", + "0.0 275.99647488706177 155.99647488706177 90.0\n", + "0.0 116.23838021530406 3.761619784695913 270.0\n", + "0.0 118.52414477992758 1.4758552200723425 270.0\n", + "0.0 220.74310560698524 100.74310560698525 90.0\n", + "0.0 338.40097536399816 141.59902463600184 270.0\n", + "0.0 203.62740080582384 83.62740080582384 90.0\n", + "0.0 355.8080215395081 124.1919784604919 270.0\n", + "0.0 9.404231671969384 110.5957683280306 270.0\n", + "0.0 343.5534959818642 136.4465040181358 270.0\n", + "0.0 6.66339734732301 113.33660265267699 270.0\n", + "0.0 358.0037637181944 121.99623628180552 270.0\n", + "0.0 247.98908263067963 127.98908263067965 90.0\n", + "0.0 97.64127642203272 22.358723577967275 270.0\n", + "0.0 99.53081429245076 20.46918570754922 270.0\n", + "0.0 128.9499990799955 8.949999079995527 90.0\n", + "0.0 261.6643380104868 141.6643380104868 90.0\n", + "0.0 329.5615005848541 150.43849941514588 270.0\n", + "0.0 217.67290357735305 97.67290357735308 90.0\n", + "0.0 205.18903585853536 85.18903585853536 90.0\n", + "0.0 228.97693699706412 108.97693699706413 90.0\n", + "0.0 8.881693318871182 111.11830668112881 270.0\n", + "0.0 356.57170393774953 123.42829606225041 270.0\n", + "0.0 189.16694569680052 69.16694569680054 90.0\n", + "0.0 121.50245011182267 1.5024501118226716 90.0\n", + "0.0 333.93797255055347 146.06202744944653 270.0\n", + "0.0 100.13308707398681 19.866912926013175 270.0\n", + "0.0 43.6084015041731 76.3915984958269 270.0\n", + "0.0 111.05944610086928 8.940553899130707 270.0\n", + "0.0 74.48107242651632 45.518927573483666 270.0\n", + "0.0 312.0462723650521 167.95372763494788 270.0\n", + "0.0 322.947704942887 157.05229505711299 270.0\n", + "0.0 208.95113264150558 88.9511326415056 90.0\n", + "0.0 175.24970913034872 55.24970913034874 90.0\n", + "0.0 140.9614395734827 20.961439573482696 90.0\n", + "0.0 166.3626290086637 46.3626290086637 90.0\n", + "0.0 90.41872798898056 29.581272011019415 270.0\n", + "0.0 222.8793862747397 102.8793862747397 90.0\n", + "0.0 68.85476821721676 51.14523178278323 270.0\n", + "0.0 28.214387666817153 91.78561233318284 270.0\n", + "0.0 91.48103529832157 28.518964701678417 270.0\n", + "0.0 89.50523941860742 30.494760581392573 270.0\n", + "0.0 193.54150713960806 73.54150713960807 90.0\n", + "0.0 7.161329384662456 112.83867061533753 270.0\n", + "0.0 213.18842190537316 93.18842190537318 90.0\n", + "0.0 172.07812140684445 52.07812140684447 90.0\n", + "0.0 334.8353619985278 145.1646380014722 270.0\n", + "0.0 191.0593578794778 71.0593578794778 90.0\n", + "0.0 56.60854133537719 63.39145866462279 270.0\n", + "0.0 92.26165787695894 27.738342123041054 270.0\n", + "0.0 286.9224658393914 166.9224658393914 90.0\n", + "0.0 176.89046670533634 56.890466705336365 90.0\n", + "0.0 276.0389970910487 156.0389970910487 90.0\n", + "0.0 137.64747685530494 17.647476855304948 90.0\n", + "0.0 1.4308610934428856 118.56913890655709 270.0\n", + "0.0 110.88137345107941 9.118626548920576 270.0\n", + "0.0 137.09485329193856 17.094853291938563 90.0\n", + "0.0 135.5690155005423 15.569015500542301 90.0\n", + "0.0 126.14097870235523 6.140978702355242 90.0\n", + "0.0 323.5471905278929 156.4528094721071 270.0\n", + "0.0 322.23762188343517 157.76237811656483 270.0\n", + "0.0 88.32263639560081 31.677363604399194 270.0\n", + "0.0 338.27038239137386 141.72961760862614 270.0\n", + "0.0 93.32529519621555 26.67470480378444 270.0\n", + "0.0 204.0513824389116 84.05138243891159 90.0\n", + "0.0 58.230491293900585 61.7695087060994 270.0\n", + "0.0 34.17234176219371 85.82765823780629 270.0\n", + "0.0 20.355778278035714 99.64422172196426 270.0\n", + "0.0 185.5169105695217 65.51691056952171 90.0\n", + "0.0 330.35248244149466 149.6475175585053 270.0\n", + "0.0 276.63332567163 156.63332567163005 90.0\n", + "0.0 358.5496625205124 121.45033747948762 270.0\n", + "0.0 7.590891759615754 112.40910824038424 270.0\n", + "0.0 167.7368613892805 47.73686138928051 90.0\n", + "0.0 244.68032032578964 124.68032032578965 90.0\n", + "0.0 156.8417344482591 36.84173444825912 90.0\n", + "0.0 269.4204866261951 149.42048662619513 90.0\n", + "0.0 190.265203959195 70.265203959195 90.0\n", + "0.0 136.57685361968288 16.57685361968289 90.0\n", + "0.0 260.9555979708692 140.95559797086918 90.0\n", + "0.0 103.67335828401178 16.32664171598821 270.0\n", + "0.0 184.95848872928786 64.95848872928788 90.0\n", + "0.0 47.777009530082694 72.22299046991728 270.0\n", + "0.0 62.22725457147253 57.772745428527465 270.0\n", + "0.0 278.7120149718238 158.71201497182383 90.0\n", + "0.0 195.428361258955 75.42836125895501 90.0\n", + "0.0 239.0927285144889 119.09272851448891 90.0\n", + "0.0 230.62021224665406 110.62021224665409 90.0\n", + "0.0 107.11731376192003 12.882686238079954 270.0\n", + "0.0 157.35907039424248 37.35907039424247 90.0\n", + "0.0 135.4058798399319 15.40587983993192 90.0\n", + "0.0 130.24064313799508 10.240643137995084 90.0\n", + "0.0 1.892581816404899 118.1074181835951 270.0\n", + "0.0 207.37075291430313 87.37075291430315 90.0\n", + "0.0 171.0869519017806 51.08695190178061 90.0\n", + "0.0 278.1067962102084 158.10679621020842 90.0\n", + "0.0 254.71648464073405 134.71648464073405 90.0\n", + "0.0 299.9432308787044 179.94323087870285 90.0\n", + "0.0 22.921838498505068 97.07816150149492 270.0\n", + "0.0 7.89398472687715 112.10601527312285 270.0\n", + "0.0 73.69196142088225 46.30803857911775 270.0\n" + ] + } + ], + "source": [ + "# -------------------- 数据生成 ------------------------\n", + "\n", + "# 首先生成台站\n", + "doc_st=open('STATIONS','w')\n", + "doc_st.write('%d \\n'%(Nst))\n", + "for i in range(Nst):\n", + " # dep_st = random.uniform(dep_st1,dep_st2); \n", + " dep_st = 0.0\n", + " lat_st = random.uniform(lat_st1,lat_st2); \n", + " # lon_st = random.uniform(lon_st1,lon_st2); \n", + " lon_st = (lon_st2-lon_st1)/(Nst)*(i+0.5)+lon_st1\n", + " doc_st.write('%8.3f %8.3f %8.3f \\n'%(dep_st,lat_st,lon_st))\n", + " pos_st.append((dep_st,lat_st,lon_st))\n", + "doc_st.close()\n", + "\n", + "# 生成区域地震\n", + "doc_ev_region = open('EARTHQUAKES_region','w')\n", + "doc_ev_region.write('%d \\n'%(Nev_region))\n", + "for i in range(Nev_region):\n", + " dep_ev = random.uniform(dep_ev_region1,dep_ev_region2); \n", + " lat_ev = random.uniform(lat_ev_region1,lat_ev_region2); \n", + " lon_ev = random.uniform(lon_ev_region1,lon_ev_region2); \n", + " doc_ev_region.write('%8.3f %8.3f %8.3f \\n'%(dep_ev,lat_ev,lon_ev))\n", + " pos_ev_region.append((dep_ev,lat_ev,lon_ev))\n", + "doc_ev_region.close()\n", + "\n", + "# 生成远震\n", + "doc_ev_tele = open('EARTHQUAKES_tele','w')\n", + "doc_ev_tele.write('%d \\n'%(Nev_tele))\n", + "count = 0\n", + "while (count < Nev_tele):\n", + " lat_ev = 0.0\n", + " lon_ev = random.uniform(0,360.0)\n", + " dep_ev = random.uniform(dep_ev_tele1,dep_ev_tele2)\n", + " degree = cal_dis(clat,clon,lat_ev,lon_ev)\n", + " azi = cal_azimuth(clat,clon,lat_ev,lon_ev)\n", + " print(lat_ev,lon_ev,degree,azi)\n", + " if (degree > degree1 and degree < degree2 and azi > azi1 and azi < azi2):\n", + " doc_ev_tele.write('%8.3f %8.3f %8.3f %8.3f %8.3f \\n'%(dep_ev,lat_ev,lon_ev,azi,degree))\n", + " count = count+1; \n", + " pos_ev_tele.append((dep_ev,degree,azi))\n", + "doc_ev_tele.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(-2.5, 2.5)" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# 台站分布\n", + "plt.figure(1)\n", + "for i in range(Nst):\n", + " plt.scatter(pos_st[i][2],pos_st[i][1],c='r',marker='o')\n", + "plt.xlabel('Longitude')\n", + "plt.ylabel('Latitude')\n", + "plt.xlim([lon1-1.5,lon2+1.5])\n", + "plt.ylim([lat1-1.5,lat2+1.5])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(-2.5, 2.5)" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# 地震分布\n", + "plt.figure(2)\n", + "for i in range(Nev_region):\n", + " plt.scatter(pos_ev_region[i][2],pos_ev_region[i][1],c='b',marker='p')\n", + "plt.xlabel('Longitude')\n", + "plt.ylabel('Latitude')\n", + "plt.xlim([lon1-1.5,lon2+1.5])\n", + "plt.ylim([lat1-1.5,lat2+1.5])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(93.75424024443853, 47.74214627658114, 90.0)\n", + "(91.74147058170392, 43.10606311626317, 270.0)\n", + "(28.519975785125162, 72.24495483877948, 90.0)\n", + "(99.8767124683807, 51.23861255736139, 90.0)\n", + "(29.960132387638367, 51.93135515946566, 270.0)\n", + "(63.20184963246517, 62.252792398477006, 270.0)\n", + "(25.90818571587431, 79.89381975746234, 90.0)\n", + "(60.869382359315146, 47.31946037861752, 270.0)\n", + "(58.76663282089372, 42.948550467077396, 270.0)\n", + "(12.108262720166383, 69.16694569680054, 90.0)\n", + "(46.00751259206518, 76.3915984958269, 270.0)\n", + "(10.170098357139967, 45.518927573483666, 270.0)\n", + "(89.79967671929133, 55.24970913034874, 90.0)\n", + "(31.693028518129445, 46.3626290086637, 90.0)\n", + "(93.75025622172483, 51.14523178278323, 270.0)\n", + "(51.259680088140676, 73.54150713960807, 90.0)\n", + "(86.11028572151156, 52.07812140684447, 90.0)\n", + "(10.66109955772044, 71.0593578794778, 90.0)\n", + "(22.843331848633156, 63.39145866462279, 270.0)\n", + "(61.43688934548696, 56.890466705336365, 90.0)\n", + "(62.97234405157307, 61.7695087060994, 270.0)\n", + "(39.05312782429853, 65.51691056952171, 90.0)\n", + "(32.690103384326115, 47.73686138928051, 90.0)\n", + "(78.76430267593933, 70.265203959195, 90.0)\n", + "(76.32278204224933, 64.95848872928788, 90.0)\n", + "(33.802179523988485, 72.22299046991728, 270.0)\n", + "(25.48858050569794, 57.772745428527465, 270.0)\n", + "(51.5795080124909, 75.42836125895501, 90.0)\n", + "(64.12652782728235, 51.08695190178061, 90.0)\n", + "(92.5735521149096, 46.30803857911775, 270.0)\n" + ] + }, + { + "data": { + "text/plain": [ + "(-80.0, 80.0)" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# 远震分布\n", + "plt.figure(3)\n", + "for i in range(Nev_tele):\n", + " print(pos_ev_tele[i])\n", + " x = pos_ev_tele[i][1]*math.cos(pos_ev_tele[i][2]/180*math.pi)\n", + " y = pos_ev_tele[i][1]*math.sin(pos_ev_tele[i][2]/180*math.pi)\n", + " plt.scatter(x,y,c='g',marker='p')\n", + "# plt.xlabel('Longitude')\n", + "# plt.ylabel('Latitude')\n", + "plt.xlim([-80,80])\n", + "plt.ylim([-80,80])" + ] + } + ], + "metadata": { + "interpreter": { + "hash": "cdd74c396a461f81d13d16403c726c38089d3c42a4b6e59262cdb9511d16556b" + }, + "kernelspec": { + "display_name": "Python 3.10.4 64-bit", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.4" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_tele/fortran_code/ega5/input/prem_model.txt b/test/old_tests/inversion_tele/fortran_code/ega5/input/prem_model.txt new file mode 100644 index 0000000..96a6218 --- /dev/null +++ b/test/old_tests/inversion_tele/fortran_code/ega5/input/prem_model.txt @@ -0,0 +1,89 @@ +88 + 0.00 5.80000 3.20000 2.60000 1456.0 600.0 + 15.00 5.80000 3.20000 2.60000 1456.0 600.0 + 15.00 6.80000 3.90000 2.90000 1350.0 600.0 + 24.40 6.80000 3.90000 2.90000 1350.0 600.0 + 24.40 8.11061 4.49094 3.38076 1446.0 600.0 + 40.00 8.10119 4.48486 3.37906 1446.0 600.0 + 60.00 8.08907 4.47715 3.37688 1447.0 600.0 + 80.00 8.07688 4.46953 3.37471 195.0 80.0 + 115.00 8.05540 4.45643 3.37091 195.0 80.0 + 150.00 8.03370 4.44361 3.36710 195.0 80.0 + 185.00 8.01180 4.43108 3.36330 195.0 80.0 + 220.00 7.98970 4.41885 3.35950 195.0 80.0 + 220.00 8.55896 4.64391 3.43578 362.0 143.0 + 265.00 8.64552 4.67540 3.46264 365.0 143.0 + 310.00 8.73209 4.70690 3.48951 367.0 143.0 + 355.00 8.81867 4.73840 3.51639 370.0 143.0 + 400.00 8.90522 4.76989 3.54325 372.0 143.0 + 400.00 9.13397 4.93259 3.72378 366.0 143.0 + 450.00 9.38990 5.07842 3.78678 365.0 143.0 + 500.00 9.64588 5.22428 3.84980 364.0 143.0 + 550.00 9.90185 5.37014 3.91282 363.0 143.0 + 600.00 10.15782 5.51602 3.97584 362.0 143.0 + 635.00 10.21203 5.54311 3.98399 362.0 143.0 + 670.00 10.26622 5.57020 3.99214 362.0 143.0 + 670.00 10.75131 5.94508 4.38071 759.0 312.0 + 721.00 10.91005 6.09418 4.41241 744.0 312.0 + 771.00 11.06557 6.24046 4.44317 730.0 312.0 + 871.00 11.24490 6.31091 4.50372 737.0 312.0 + 971.00 11.41560 6.37813 4.56307 743.0 312.0 + 1071.00 11.57828 6.44232 4.62129 750.0 312.0 + 1171.00 11.73357 6.50370 4.67844 755.0 312.0 + 1271.00 11.88209 6.56250 4.73460 761.0 312.0 + 1371.00 12.02445 6.61891 4.78983 766.0 312.0 + 1471.00 12.16126 6.67317 4.84422 770.0 312.0 + 1571.00 12.29316 6.72548 4.89783 775.0 312.0 + 1671.00 12.42075 6.77606 4.95073 779.0 312.0 + 1771.00 12.54466 6.82512 5.00299 784.0 312.0 + 1871.00 12.66550 6.87289 5.05469 788.0 312.0 + 1971.00 12.78389 6.91957 5.10590 792.0 312.0 + 2071.00 12.90045 6.96538 5.15669 795.0 312.0 + 2171.00 13.01579 7.01053 5.20713 799.0 312.0 + 2271.00 13.13055 7.05525 5.25729 803.0 312.0 + 2371.00 13.24532 7.09974 5.30724 807.0 312.0 + 2471.00 13.36074 7.14423 5.35706 811.0 312.0 + 2571.00 13.47742 7.18892 5.40681 815.0 312.0 + 2671.00 13.59597 7.23403 5.45657 819.0 312.0 + 2741.00 13.68041 7.26597 5.49145 822.0 312.0 + 2771.00 13.68753 7.26575 5.50642 823.0 312.0 + 2871.00 13.71168 7.26486 5.55641 826.0 312.0 + 2891.00 13.71660 7.26466 5.56645 826.0 312.0 + 2891.00 8.06482 0.00000 9.90349 57822.0 0.0 + 2971.00 8.19939 0.00000 10.02940 57822.0 0.0 + 3071.00 8.36019 0.00000 10.18134 57822.0 0.0 + 3171.00 8.51298 0.00000 10.32726 57822.0 0.0 + 3271.00 8.65805 0.00000 10.46727 57822.0 0.0 + 3371.00 8.79573 0.00000 10.60152 57822.0 0.0 + 3471.00 8.92632 0.00000 10.73012 57822.0 0.0 + 3571.00 9.05015 0.00000 10.85321 57822.0 0.0 + 3671.00 9.16752 0.00000 10.97091 57822.0 0.0 + 3771.00 9.27867 0.00000 11.08335 57822.0 0.0 + 3871.00 9.38418 0.00000 11.19067 57822.0 0.0 + 3971.00 9.48409 0.00000 11.29298 57822.0 0.0 + 4071.00 9.57881 0.00000 11.39042 57822.0 0.0 + 4171.00 9.66865 0.00000 11.48311 57822.0 0.0 + 4271.00 9.75393 0.00000 11.57119 57822.0 0.0 + 4371.00 9.83496 0.00000 11.65478 57822.0 0.0 + 4471.00 9.91206 0.00000 11.73401 57822.0 0.0 + 4571.00 9.98554 0.00000 11.80900 57822.0 0.0 + 4671.00 10.05572 0.00000 11.87990 57822.0 0.0 + 4771.00 10.12291 0.00000 11.94682 57822.0 0.0 + 4871.00 10.18743 0.00000 12.00989 57822.0 0.0 + 4971.00 10.24959 0.00000 12.06924 57822.0 0.0 + 5071.00 10.30971 0.00000 12.12500 57822.0 0.0 + 5149.50 10.35568 0.00000 12.16634 57822.0 0.0 + 5149.50 11.02827 3.50432 12.76360 445.0 85.0 + 5171.00 11.03643 3.51002 12.77493 445.0 85.0 + 5271.00 11.07249 3.53522 12.82501 443.0 85.0 + 5371.00 11.10542 3.55823 12.87073 440.0 85.0 + 5471.00 11.13521 3.57905 12.91211 439.0 85.0 + 5571.00 11.16186 3.59767 12.94912 437.0 85.0 + 5671.00 11.18538 3.61411 12.98178 436.0 85.0 + 5771.00 11.20576 3.62835 13.01009 434.0 85.0 + 5871.00 11.22301 3.64041 13.03404 433.0 85.0 + 5971.00 11.23712 3.65027 13.05364 432.0 85.0 + 6071.00 11.24809 3.65794 13.06888 432.0 85.0 + 6171.00 11.25593 3.66342 13.07977 431.0 85.0 + 6271.00 11.26064 3.66670 13.08630 431.0 85.0 + 6371.00 11.26220 3.66780 13.08848 431.0 85.0 diff --git a/test/old_tests/inversion_tele/fortran_code/ega5_sphe_3d_kernel.f90 b/test/old_tests/inversion_tele/fortran_code/ega5_sphe_3d_kernel.f90 new file mode 100644 index 0000000..957574c --- /dev/null +++ b/test/old_tests/inversion_tele/fortran_code/ega5_sphe_3d_kernel.f90 @@ -0,0 +1,1016 @@ +include "eikon_solver_mpi.f90" + + +! example: 3-D 3rd order anisotropic eikonal equation in cartesian coordinate (Point source) +! parameter setting: +! domain: R * Theta * Phi = [6275, 6375] * [49^\circ, 51^\circ] * [129^\circ, 131^\circ] +! analytic solution: T = |x-x_s|/c0 +! isotropic eik equ: Tx^2 + Ty^2 + Tz^2 = s^2, +! boundary condition: T(x0,y0,z0) = 0 (point source) +! test function: 'FSM_WENO3_PS_sphe_3d' in "eikon_solver.f90" +! + +program eikonal_2d + use mpi + +! ######################### 参数声明 parameters statement ######################### + + implicit none + + ! mesh grid + integer :: nr,nt,np + double precision,parameter :: pi=3.14159265358979323846264338327950288 + double precision,parameter :: Earth_Radius = 6371.0 + double precision :: rr1,rr2,tt1,tt2,pp1,pp2 + double precision,allocatable :: rr(:),tt(:),pp(:) + double precision :: dr,dt,dp + + ! STATIONS & EARTHQUAKES + integer :: nev + double precision,allocatable :: rev(:),tev(:),pev(:) ! earthquake (event) + integer :: nst + double precision,allocatable :: rst(:),tst(:),pst(:) ! station + integer :: nev_tele + double precision,allocatable :: rev_tele(:),tev_tele(:),pev_tele(:) ! tele seismic event + + ! model parameter + double precision,parameter :: gamma = 0.0 + double precision :: slow_p,ani_p + double precision,allocatable :: xi(:,:,:),eta(:,:,:),zeta(:,:,:) ! syn model (ani) + double precision,allocatable :: a(:,:,:),b(:,:,:),c(:,:,:),f(:,:,:),fun(:,:,:) ! syn model 猜测模型 + double precision,allocatable :: xiT(:,:,:),etaT(:,:,:),zetaT(:,:,:) ! true model (ani) + double precision,allocatable :: aT(:,:,:),bT(:,:,:),cT(:,:,:),fT(:,:,:),funT(:,:,:) ! true model 真实模型 + double precision :: sigma1,sigma2,psi + + ! teleseismic modeling + double precision,allocatable :: bd_N(:,:,:),bd_S(:,:,:),bd_W(:,:,:),bd_E(:,:,:),bd_B(:,:,:),bd_T(:,:,:) ! boundary conditions + double precision,allocatable :: bd_N_l(:,:,:),bd_S_l(:,:,:),bd_W_l(:,:,:),bd_E_l(:,:,:),bd_B_l(:,:,:),bd_T_l(:,:,:) ! local boundary conditions + + logical,allocatable :: isbd(:,:) + double precision :: max_deg,deg + + ! tele and regional control + double precision :: region_ratio, tele_ratio ! the ratio of regional kernel over tele kernel + logical :: is_region, is_tele + + + ! Eikonal solver + double precision,allocatable :: uT(:,:,:),TableT(:,:,:) !true timetable 真实走时场 + double precision,allocatable :: u(:,:,:),Table(:,:,:) !syn timetable 猜测走时场 + double precision,allocatable :: TableADJ(:,:,:) ! adjoint field 伴随场 + + ! adjoint source + double precision,allocatable :: TtimeT(:,:),Ttime_teleT(:,:),Ttime(:,:),Ttime_tele(:,:) ! 真实走时,合成走时 + double precision,allocatable :: TtimeT_l(:,:),Ttime_teleT_l(:,:),Ttime_l(:,:),Ttime_tele_l(:,:) ! 真实走时,合成走时 + double precision,allocatable :: sourceADJ(:) ! adjoint source 伴随源 + + ! sensitivity kernel + integer :: nk ! number of kernels + double precision,allocatable :: all_Ks_region(:,:,:),all_Kxi_region(:,:,:),all_Keta_region(:,:,:) ! sensitivity kernel + double precision,allocatable :: all_Ks_region_l(:,:,:),all_Kxi_region_l(:,:,:),all_Keta_region_l(:,:,:) ! sensitivity kernel + double precision,allocatable :: all_Ks_tele(:,:,:),all_Kxi_tele(:,:,:),all_Keta_tele(:,:,:) ! sensitivity kernel + double precision,allocatable :: all_Ks_tele_l(:,:,:),all_Kxi_tele_l(:,:,:),all_Keta_tele_l(:,:,:) ! sensitivity kernel + double precision,allocatable :: Ks(:,:,:),Kxi(:,:,:),Keta(:,:,:) ! event kernel + double precision,allocatable :: all_Kernel(:,:,:,:) ! kernels for all parameters together + + ! inversion parameterization + integer :: ninvr,ninvt,ninvp + double precision :: invr1,invr2,invt1,invt2,invp1,invp2 + integer :: ngrid ! number of nultigrid (multigrid technique) + double precision,allocatable :: invr(:,:),invt(:,:),invp(:,:) + double precision,allocatable :: inv_dep(:) + double precision :: dinvr,dinvt,dinvp + double precision,allocatable :: update_value(:,:,:,:) ! parameter update value 更新参数的变化量 + + ! model update (optimization) + double precision :: stepsize ! stepsize + integer :: stIter, edIter ! max iteration step + double precision :: old_obj, obj, obj_region, obj_region_l, obj_tele, obj_tele_l, tmp_obj ! 优化目标函数 objective function + double precision,allocatable :: weight_st(:),weight_ev(:),weight_ev_tele(:) !weight function + double precision :: dis_ij, dis_zero !weight function + logical :: weight_sou_bool=.false. , weight_rec_bool= .false. + + ! temp var + double precision :: depth,lat,lon + double precision :: tmp_dp,tmp_int + + ! input and output file + character(Len=80) :: filename,form,form2,TTfield_path + character(Len=80) :: input_path,output_path + logical :: isfile + logical :: isread_model + character(Len=80) :: read_model_name + + ! loop index + integer :: iir,iit,iip,idi,idj,idk,i,j,k,iter,igrid + + ! computing time + double precision :: time_begin,time_end,alpha + + ! mpi parameter + integer :: ierr,myid,nproc,tag,istat(mpi_status_size) + integer,allocatable :: my_tele_source_range(:,:),my_region_source_range(:,:) ! 负载平衡,当前 processor 负责的 最小最大震源序号 + integer :: iproc ! proc 循环index + double precision,allocatable :: dp_3d(:,:,:), dp_2d(:,:), dp_1d(:,:), dp_0d + + +! ############################# input parameters ############################## + ! this can be included in a input_parameter file later + + ! 正演网格 forward mesh + nr = 101; nt = 9; np = 101 ! number of grid for forward modeling + rr1 = 5550; rr2 = 6400 ! 6371 - 5571; 800 km depth + tt1 = (0.0-1.0)/180*pi; tt2 = (0.0+1.0)/180*pi + pp1 = (110.0-1.5)/180*pi; pp2 = (130.0+1.5)/180*pi + + ! 反演网格 + ninvr = 15; ninvt = 3; ninvp = 19 ! inversion grid size (coarse) + invr1 = rr1; invr2 = rr2 + invt1 = tt1 - 1.0/180*pi; invt2 = tt2 + 1.0/180*pi + invp1 = pp1 - 1.5/180*pi; invp2 = pp2 + 1.5/180*pi + ngrid = 5 + nk = 3 ! number of typies of kernel + allocate(inv_dep(ninvr)) + inv_dep = [-25,0,25,50,75,100,150,200,300,400,500,600,700,800,900] + + + ! 迭代进程 iterative control + ! ############### 迭代中途开始反演,以下每个参数都值得仔细考虑和修改 + ! ############### allow starting from one iteration at any step. Please check all following parameters before start the inversion + stIter = 1; edIter = 50 ! 迭代次数 + isread_model = .false. + read_model_name = 'ega5/output/model_step100' + stepsize = 0.01 ! 初始迭代步长 + + + ! 反演相关参数 parameters for inversion + max_deg = 2.5/180.0*pi ! the distance threshold of stations for tele seismic inversion + slow_p=0.04; ani_p=0.00 ! 检测板异常大小 amplitude of checkerboard anomaly + + region_ratio = 1.0 ! 远近震比例 ratio for regional misfit + tele_ratio = 1.0 ! ratio for teleseismic misfit + is_region = .false. ! invert regional tarveltime data or not + is_tele = .true. ! invert teleseismic tarveltime data or not + + input_path = 'ega5/input' ! input and output path + output_path = 'ega5/output' + + +! ############################# Preparation ############################# + + ! -------------------- iteration check ------------------- + ! 如果当前目录下有生成的文件,暂停程序 if the velocity model file exists, pause + select case (stIter) + case (1:9) + write(form,'(I1)') stIter + case (10:99) + write(form,'(I2)') stIter + case (100:999) + write(form,'(I3)') stIter + end select + filename=trim(output_path)//'/model_step'//trim(form) + inquire(file=filename,exist = isfile) + if (isfile) then ! velocity model file exists, pause + print *, 'file exists, please check the output folder' + pause + end if + + ! -------------------- mpi initialization ------------------- + call mpi_init(ierr) + + call mpi_comm_rank(mpi_comm_world,myid,ierr) + call mpi_comm_size(mpi_comm_world,nproc,ierr) + + call CPU_TIME(time_begin) ! program start + + tag = 1 ! communcation tag + +! ################### read sources and receivers 读取地震台站数据 ################### + open(10,file=trim(input_path)//'/STATIONS') + read(10,*) nst + allocate(rst(nst),tst(nst),pst(nst),weight_st(nst)) + do i=1,nst + read(10,*) depth,lat,lon + rst(i) = Earth_Radius-depth + tst(i) = lat/180.0*pi + pst(i) = lon/180.0*pi + end do + close(10) + + if (is_region) then + open(10,file=trim(input_path)//'/EARTHQUAKES_region') + read(10,*) nev + allocate(rev(nev),tev(nev),pev(nev),weight_ev(nev)) + do i=1,nev + read(10,*) depth,lat,lon + rev(i) = Earth_Radius-depth + tev(i) = lat/180.0*pi + pev(i) = lon/180.0*pi + end do + close(10) + end if + + if (is_tele) then + open(10,file=trim(input_path)//'/EARTHQUAKES_tele') + read(10,*) nev_tele + allocate(rev_tele(nev_tele),tev_tele(nev_tele),pev_tele(nev_tele),weight_ev_tele(nev_tele)) + do i=1,nev_tele + read(10,*) depth,lat,lon + rev_tele(i) = Earth_Radius-depth + tev_tele(i) = lat/180.0*pi + pev_tele(i) = lon/180.0*pi + end do + close(10) + end if + ! ---- 数据记录 data record (earthquakes and stations) ---- + if (myid .eq. 0) then + open(100,file=trim(output_path)//'/STATIONS') + do i=1,nst + write(100,'(f13.7,f13.7,f13.7)') & + & Earth_Radius-rst(i),tst(i)*180.0/pi,pst(i)*180.0/pi + end do + close(100); + if (is_region) then + open(101,file=trim(output_path)//'/EARTHQUAKES_region') + do i=1,nev + write(101,'(f13.7,f13.7,f13.7)') & + & Earth_Radius-rev(i),tev(i)*180.0/pi,pev(i)*180.0/pi + end do + close(101); + end if + if (is_tele) then + open(102,file=trim(output_path)//'/EARTHQUAKES_tele') + do i=1,nev_tele + write(102,'(f13.7,f13.7,f13.7)') & + & Earth_Radius-rev_tele(i),tev_tele(i)*180.0/pi,pev_tele(i)*180.0/pi + end do + close(102) + end if + end if + + +! ######################### 生成网格 build mesh grid ##################################### + ! -------- forward modeling grid ---------- + dr=(rr2-rr1)/(nr-1); dt=(tt2-tt1)/(nt-1); dp=(pp2-pp1)/(np-1) + allocate(rr(nr),tt(nt),pp(np)) + do iir=1,nr + rr(iir)=rr1+(iir-1)*dr + end do + do iit=1,nt + tt(iit)=tt1+(iit-1)*dt + end do + do iip=1,np + pp(iip)=pp1+(iip-1)*dp + end do + + ! -------- inversion multigrid ---------- + dinvr=(invr2-invr1)/(ninvr-1); dinvt=(invt2-invt1)/(ninvt-1); dinvp=(invp2-invp1)/(ninvp-1) + allocate(invr(ngrid,ninvr),invt(ngrid,ninvt),invp(ngrid,ninvp)) + + + do igrid=1,ngrid + do iir=1,ninvr + if (iir .eq. 1) then + dinvr = inv_dep(ninvr)-inv_dep(ninvr-1) + else + dinvr = inv_dep(ninvr+1-iir+1)-inv_dep(ninvr+1-iir) + end if + invr(igrid,iir)=Earth_Radius-inv_dep(ninvr+1-iir)-(igrid-1)*dinvr/ngrid + end do + do iit=1,ninvt + invt(igrid,iit)=invt1+(iit-1)*dinvt-(igrid-1)*dinvt/ngrid + end do + do iip=1,ninvp + invp(igrid,iip)=invp1+(iip-1)*dinvp-(igrid-1)*dinvp/ngrid + end do + end do + + ! ------------ 数据记录 data record (multi grid for inversion) ------------- + if (myid==0) then + open(100,file=trim(output_path)//'/multigrid') + do igrid=1,Ngrid + write(100,'(i4,i4,i4,i4)') & + & igrid,ninvr,ninvt,ninvp + do iir=1,ninvr + do iit=1,ninvt + do iip=1,ninvp + write(100,'(f13.7,f13.7,f13.7)') & + & Earth_Radius-invr(igrid,iir),invt(igrid,iit)*180.0/pi,invp(igrid,iip)*180.0/pi + end do + end do + end do + end do + close(100) + end if + +! ######################### 构建背景模型 build the synthetic and true model ##################################### + ! ----------- allocation --------------- + allocate(xi(nr,nt,np),eta(nr,nt,np),zeta(nr,nt,np)) + allocate(a(nr,nt,np),b(nr,nt,np),c(nr,nt,np),f(nr,nt,np),fun(nr,nt,np)) + allocate(xiT(nr,nt,np),etaT(nr,nt,np),zetaT(nr,nt,np)) + allocate(aT(nr,nt,np),bT(nr,nt,np),cT(nr,nt,np),fT(nr,nt,np),funT(nr,nt,np)) + + + filename = trim(input_path)//'/prem_model.txt' + call Read_1D_velocity_3d(filename,rr,nr,nt,np,fun) + + do iir=1,nr + do iit=1,nt + do iip=1,np + + ! ! ega5 test velocity + ! if (rr(iir)>6351) then ! 6371 - 6351 20 km + ! fun(iir,iit,iip) = 1.0/(5.8+(6371-rr(iir))/20.0*0.7) + ! elseif (rr(iir)>6336) then ! 6351 - 6336 15 km + ! fun(iir,iit,iip) = 1.0/(6.5+(6351-rr(iir))/15.0*0.6) + ! elseif (rr(iir)>5961) then ! 6351 - 6336 15 km + ! fun(iir,iit,iip) = 1.0/(8.0+(6336-rr(iir))/375.0*1) + ! else + ! fun(iir,iit,iip) = 1.0/9.0 + ! end if + + + ! synthetic (initial) model + eta(iir,iit,iip)=0.0; + xi(iir,iit,iip)=0.0; + zeta(iir,iit,iip)=gamma*sqrt(eta(iir,iit,iip)**2+xi(iir,iit,iip)**2) + a(iir,iit,iip)=1.0+2*zeta(iir,iit,iip); + b(iir,iit,iip)=1.0-2*xi(iir,iit,iip); + c(iir,iit,iip)=1.0+2*xi(iir,iit,iip); + f(iir,iit,iip)=-2*eta(iir,iit,iip); + + ! true (target) model + if (pp(iip)>=110.0/180*pi .and. pp(iip)<=130.0/180*pi .and. & + & Earth_Radius-rr(iir)>=0.0 .and. Earth_Radius-rr(iir)<=100.0 ) then + sigma1 = sin(7*pi*(pp(iip)-110.0/180*pi)/(20.0/180*pi))* & + & sin(1*pi*(rr(iir)-6271)/50.0) + elseif (pp(iip)>=110.0/180*pi .and. pp(iip)<=130.0/180*pi .and. & + & Earth_Radius-rr(iir)>=100.0 .and. Earth_Radius-rr(iir)<=200.0 ) then + sigma1 = sin(7*pi*(pp(iip)-110.0/180*pi)/(20.0/180*pi))* & + & sin(pi+1*pi*(rr(iir)-6171)/100.0) + elseif (pp(iip)>=110.0/180*pi .and. pp(iip)<=130.0/180*pi .and. & + & Earth_Radius-rr(iir)>=200.0 .and. Earth_Radius-rr(iir)<=800.0 ) then + sigma1 = sin(7*pi*(pp(iip)-110.0/180*pi)/(20.0/180*pi))* & + & sin(1*pi*(rr(iir)-5571)/200.0) + else + sigma1 = 0.0 + end if + + + if (sigma1<0) then + psi = 60.0/180*pi + elseif (sigma1 > 0) then + psi = 150.0/180*pi + else + psi = 0 + end if + + etaT(iir,iit,iip)=ani_p*abs(sigma1)*sin(2*psi); + xiT(iir,iit,iip)=ani_p*abs(sigma1)*cos(2*psi); + zetaT(iir,iit,iip)=gamma*sqrt(etaT(iir,iit,iip)**2+xiT(iir,iit,iip)**2) + + aT(iir,iit,iip)=1.0+2*zetaT(iir,iit,iip); + bT(iir,iit,iip)=1.0-2*xiT(iir,iit,iip); + cT(iir,iit,iip)=1.0+2*xiT(iir,iit,iip); + fT(iir,iit,iip)=-2*etaT(iir,iit,iip); + funT(iir,iit,iip) = fun(iir,iit,iip)/(1+sigma1*slow_p) + end do + end do + end do + + ! 从外部读取模型文件,一般用于从迭代中途开始 + ! if we start the inversion from an input model: + if (isread_model) then + call read_model_3d(read_model_name,nr,nt,np,fun,xi,eta,zeta,a,b,c,f) + else + ! ---- 数据记录 data record (true and initial model)---- + if (myid .eq. 0) then + open(100,file=trim(output_path)//'/model_true') + open(101,file=trim(output_path)//'/model_init') + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & Earth_Radius-rr(iir),tt(iit)*180.0/pi,pp(iip)*180.0/pi, & + & funT(iir,iit,iip),xiT(iir,iit,iip),etaT(iir,iit,iip) + write(101,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & Earth_Radius-rr(iir),tt(iit)*180.0/pi,pp(iip)*180.0/pi, & + & fun(iir,iit,iip),xi(iir,iit,iip),eta(iir,iit,iip) + end do + end do + end do + close(100);close(101) + end if + end if + +! ###################### 震源并行, 负载平衡 load balancing ################################## + if (is_region) then + allocate(my_region_source_range(nproc,3)) + ! 分配,每个线程计算那些震源对应的到时 + do iproc=1,nproc + ! 前 k 个 processor 负责的总震源数,应该接近 震源总数的第k个nproc等分点 + my_region_source_range(iproc,1) = (nst*(iproc-1)/nproc)+1 + my_region_source_range(iproc,2) = (nst*(iproc)/nproc) + my_region_source_range(iproc,3) = my_region_source_range(iproc,2)-my_region_source_range(iproc,1)+1 + end do + end if + if (is_tele) then + allocate(my_tele_source_range(nproc,3)) + ! 分配,每个线程计算那些震源对应的到时 + do iproc=1,nproc + ! 前 k 个 processor 负责的总震源数,应该接近 震源总数的第k个nproc等分点 + my_tele_source_range(iproc,1) = (nev_tele*(iproc-1)/nproc)+1 + my_tele_source_range(iproc,2) = (nev_tele*(iproc)/nproc) + my_tele_source_range(iproc,3) = my_tele_source_range(iproc,2)-my_tele_source_range(iproc,1)+1 + end do + end if +! ###################### 计算远震波到达区域的边界 calculate the traveltime of teleseismic events on the boundary ##################### + + if (is_tele) then + allocate(bd_N(nev_tele,nr,np),bd_S(nev_tele,nr,np),bd_W(nev_tele,nr,nt), & + & bd_E(nev_tele,nr,nt),bd_B(nev_tele,nr,np),bd_T(nev_tele,nr,np)) + allocate(bd_N_l(nev_tele,nr,np),bd_S_l(nev_tele,nr,np),bd_W_l(nev_tele,nr,nt), & + & bd_E_l(nev_tele,nr,nt),bd_B_l(nev_tele,nr,np),bd_T_l(nev_tele,nr,np)) + allocate(isbd(nev_tele,5)) + bd_N = 0.0; bd_S = 0.0; bd_W = 0.0; bd_E = 0.0; bd_B = 0.0; bd_T = 0.0; isbd = .false. + bd_N_l = 0.0; bd_S_l = 0.0; bd_W_l = 0.0; bd_E_l = 0.0; bd_B_l = 0.0; bd_T_l = 0.0; + filename = trim(input_path)//'/prem_model.txt' + TTfield_path = trim(output_path)//'/tele_traveltime_field' + + ! calculate the boundary on each processor + do i = my_tele_source_range(myid+1,1),my_tele_source_range(myid+1,2) + print *, '----------------- calculating tele 2d timetable ... evid: ',i,'----------------' + call eikonal_boundary_traveltime(rr,tt,pp,nr,nt,np,rev_tele(i),tev_tele(i),pev_tele(i) & + & ,filename,TTfield_path,isbd(i,:), & + & bd_N_l(i,:,:),bd_S_l(i,:,:),bd_W_l(i,:,:),bd_E_l(i,:,:),bd_B_l(i,:,:),bd_T_l(i,:,:)) + end do + + + ! processor communication + ! 数据通信 步骤1, 其他线程传输给主线程 + call mpi_barrier(mpi_comm_world,ierr) + if (myid .eq. 0) then ! 负责接受数据 myid .eq. 0, receiver data + do iproc=1,nproc-1 + call mpi_recv(isbd(my_tele_source_range(iproc+1,1):my_tele_source_range(iproc+1,2),:), & + & my_tele_source_range(iproc+1,3)*5,mpi_logical,iproc,tag-1,mpi_comm_world,istat,ierr) + end do + else ! 负责发送数据 myid .ne. 0, send data + call mpi_send(isbd(my_tele_source_range(myid+1,1):my_tele_source_range(myid+1,2),:), & + & my_tele_source_range(myid+1,3)*5,mpi_logical,0,tag-1,mpi_comm_world,ierr) + end if + call mpi_allreduce(bd_N_l,bd_N,nev_tele*nr*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(bd_S_l,bd_S,nev_tele*nr*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(bd_W_l,bd_W,nev_tele*nr*nt,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(bd_E_l,bd_E,nev_tele*nr*nt,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(bd_B_l,bd_B,nev_tele*nt*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(bd_T_l,bd_T,nev_tele*nt*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + + ! 数据通信 步骤2, 主线程将更新后的level数据广播到其他线程 + call mpi_bcast(isbd,nev_tele*5,mpi_logical,0,mpi_comm_world,ierr) + end if + + +! ######################### 计算真实区域地震到时 regional event true traveltime ###################### + call mpi_barrier(mpi_comm_world,ierr) + allocate(TableT(nr,nt,np),uT(nr,nt,np)) ! 初始化走时场 initial the true timetable + + if (is_region) then + allocate(TtimeT(nev,nst),TtimeT_l(nev,nst)) ! 初始化区域地震真实到时表 initiate true traveltimes + TtimeT = 0.0; TtimeT_l = 0.0 + do j=my_region_source_range(myid+1,1),my_region_source_range(myid+1,2) ! loop STATIONS + ! -------- 求解程函方程 solve eikonal equations ------------ + print *, '----------------- calculating regional true timetable ... evid: ',j,'----------------' + + call FSM_WENO3_PS_sphe_3d_mul(rr,tt,pp,nr,nt,np,aT,bT,cT,fT,TableT,funT,rst(j),tst(j),pst(j),uT) + ! call FSM_WENO3_PS_sphe_3d_mul_mpi(rr,tt,pp,nr,nt,np,aT,bT,cT,fT,TableT,funT,rst(j),tst(j),pst(j),uT) + ! -------- 得到真实走时 calculate true arrival time -------- + do i=1,nev + call Linear_Interp_3D(rr,tt,pp,TableT,nr,nt,np,rev(i),tev(i),pev(i),TtimeT_l(i,j)) + end do + end do + + ! processor communication (true traveltime at stations) + ! 数据通信 归约 + call mpi_barrier(mpi_comm_world,ierr) + call mpi_allreduce(TtimeT_l,TtimeT,nev*nst,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + + + ! data record (traveltime from source to receiver) + if ((myid.eq.0) .and. .true.) then + open(100,file=trim(output_path)//'/traveltime_region') + do i=1,nev + do j=1,nst + write(100,'(i4,f8.3,f8.3,f8.3,i4,f8.3,f8.3,f8.3,f8.3)') & + & i,Earth_Radius-rev(i),tev(i)/pi*180,pev(i)/pi*180, & + & j,Earth_Radius-rst(j),tst(j)/pi*180,pst(j)/pi*180, TtimeT(i,j) + end do + end do + close(100) + end if + end if +! ######################### 计算真实远震到时 tele seismic event true traveltime ###################### + if (is_tele) then + allocate(Ttime_teleT(nev_tele,nst),Ttime_teleT_l(nev_tele,nst)); ! 初始化远震真实到时表 initiate true traveltimes + Ttime_teleT = 0.0; Ttime_teleT_l = 0.0 + + do i=my_tele_source_range(myid+1,1),my_tele_source_range(myid+1,2) ! loop ev_tele + ! -------- 求解远震程函方程 solve eikonal equations ------------ + print *, '----------------- calculating tele true timetable ... evid: ',i,'----------------' + call FSM_WENO3_tele_sphe_3d_ver2(rr,tt,pp,nr,nt,np,aT,bT,cT,fT,funT,isbd(i,:) & + & ,bd_N(i,:,:),bd_S(i,:,:),bd_W(i,:,:),bd_E(i,:,:),bd_B(i,:,:),TableT) + ! -------- 得到真实走时 calculate true arrival time -------- + do j=1,nst + call Linear_Interp_3D(rr,tt,pp,TableT,nr,nt,np,rst(j),tst(j),pst(j),Ttime_teleT_l(i,j)) + end do + end do + + ! processor communication (true traveltime at stations) + ! 数据通信 归约 + call mpi_barrier(mpi_comm_world,ierr) + call mpi_allreduce(Ttime_teleT_l,Ttime_teleT,nev_tele*nst,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + + ! data record (traveltime from source to receiver) + if ((myid.eq.0) .and. .true.) then + open(100,file=trim(output_path)//'/traveltime_tele') + do i=1,nev_tele + do j=1,nst + write(100,'(i4,f8.3,f8.3,f8.3,i4,f8.3,f8.3,f8.3,f8.3)') & + & i,Earth_Radius-rev_tele(i),tev_tele(i)/pi*180,pev_tele(i)/pi*180, & + & j,Earth_Radius-rst(j),tst(j)/pi*180,pst(j)/pi*180, Ttime_teleT(i,j) + end do + end do + close(100) + end if + end if +! ######################## 反演开始 inversion start ########################## + ! ----- 初始化反演参数 initiate inversion parameters ---- + old_obj = 0; obj = 0; obj_region=0; obj_tele=0; obj_tele_l=0;! 目标函数 objective function + + if (is_region) then + allocate(all_Ks_region(nr,nt,np),all_Kxi_region(nr,nt,np),all_Keta_region(nr,nt,np)) + allocate(Ttime(nev,nst)) + Ttime = 0.0; all_Ks_region = 0.0; all_Kxi_region = 0.0; all_Keta_region = 0.0 + allocate(all_Ks_region_l(nr,nt,np),all_Kxi_region_l(nr,nt,np),all_Keta_region_l(nr,nt,np)) + allocate(Ttime_l(nev,nst)) + Ttime_l = 0.0; all_Ks_region_l = 0.0; all_Kxi_region_l = 0.0; all_Keta_region_l = 0.0 + end if + if (is_tele) then + allocate(all_Ks_tele(nr,nt,np),all_Kxi_tele(nr,nt,np),all_Keta_tele(nr,nt,np)) + allocate(Ttime_tele(nev_tele,nst)) + Ttime_tele = 0.0; all_Ks_tele = 0.0; all_Kxi_tele = 0.0; all_Keta_tele = 0.0 + allocate(all_Ks_tele_l(nr,nt,np),all_Kxi_tele_l(nr,nt,np),all_Keta_tele_l(nr,nt,np)) + allocate(Ttime_tele_l(nev_tele,nst)) + Ttime_tele_l = 0.0; all_Ks_tele_l = 0.0; all_Kxi_tele_l = 0.0; all_Keta_tele_l = 0.0 + + end if + + allocate(Ks(nr,nt,np),Kxi(nr,nt,np),Keta(nr,nt,np)) + allocate(Table(nr,nt,np),u(nr,nt,np),TableADJ(nr,nt,np)) + allocate(all_Kernel(nr,nt,np,3),update_value(nr,nt,np,3)) + Ks = 0.0; Kxi = 0.0; Keta = 0.0; Table = 0.0; u = 0.0; TableADJ = 0.0; + all_Kernel = 0.0; update_value = 0.0; + + if (myid .eq. 0) then + print *, ' ' + print *, '----------------- inversion start ... ----------------' + print *, ' ' + end if + + do iter = stIter,edIter ! loop iterations + call mpi_barrier(mpi_comm_world,ierr) + if (myid .eq. 0) then + print *, '----------------- iteration ',iter,' starting ... ----------------' + end if + + ! ----- 初始化参数 initiate parameters ------ + obj = 0.0; obj_region=0.0; obj_region_l=0.0; obj_tele=0.0; obj_tele_l=0; + all_Kernel = 0.0; update_value = 0.0; + +! ######################## 区域地震敏感核计算 calculate sensitivity kernel for regional events ########################## + if (is_region) then + call mpi_barrier(mpi_comm_world,ierr) + ! ----- 初始化参数 initiate parameters ------ + all_Ks_region_l = 0; all_Kxi_region_l = 0; all_Keta_region_l = 0; + all_Ks_region = 0; all_Kxi_region = 0; all_Keta_region = 0; + + do j=my_region_source_range(myid+1,1),my_region_source_range(myid+1,2) ! loop STATIONS + ! ######################## 计算合成走时场 calculate synthetic timetable ######################## + print *, '----------------- calculating regional synthetic timetable and kernel ... evid: ',j,'----------------' + + call FSM_WENO3_PS_sphe_3d_mul(rr,tt,pp,nr,nt,np,a,b,c,f,Table,fun,rst(j),tst(j),pst(j),u) + + ! -------- 得到合成走时 calculate synthetic arrival time at receiver -------- + do i=1,nev + call Linear_Interp_3D(rr,tt,pp,Table,nr,nt,np,rev(i),tev(i),pev(i),Ttime_l(i,j)) + end do + + ! ######################## 计算伴随场 calculate adjoint timetable ######################## + + ! -------- 构造伴随源 build adjoint source (absolute traveltime difference) ------- + allocate(sourceADJ(nev)) + call Adjoint_Source_Dt(Ttime_l(:,j),TtimeT(:,j),nev,sourceADJ,tmp_obj) ! absolute traveltime difference + + call FSM_O1_Adj_sphe_3d(rr,tt,pp,nr,nt,np,Table,TableADJ,zeta,xi,eta,nev,rev,tev,pev,sourceADJ) + + deallocate(sourceADJ) + ! ######################## 计算敏感核 calculate sensitivity kernel ######################## + + call Sensitivity_Kernel(rr,tt,pp,nr,nt,np,Table,TableADJ,gamma,xi,eta,fun,Ks,Kxi,Keta) + + ! ------- 抹去伴随源处的大函数值 mask the source ------- + call Kernel_Mask_new(rr,tt,pp,nr,nt,np,Ks,rst(j),tst(j),pst(j)) + call Kernel_Mask_new(rr,tt,pp,nr,nt,np,Kxi,rst(j),tst(j),pst(j)) + call Kernel_Mask_new(rr,tt,pp,nr,nt,np,Keta,rst(j),tst(j),pst(j)) + + ! --------- 敏感核,obj叠加 sum kernels and objective function ------- + all_Ks_region_l = all_Ks_region_l + Ks; + all_Kxi_region_l = all_Kxi_region_l + Kxi; + all_Keta_region_l = all_Keta_region_l + Keta; + obj_region_l = obj_region_l + tmp_obj + + ! ----- data recored (local event kernel) ------ + if (.false. .and. myid .eq. 0) then + select case (j) + case (1:9) + write(form2,'(I1)') j + case (10:99) + write(form2,'(I2)') j + end select + filename=trim(output_path)//'/region_event_kernel_ev'//trim(form2) + open(100*(myid+1),file=trim(filename)) + tmp_dp = 0 + do iir=1,nr + do iit=1,nt + do iip=1,np + tmp_dp=max(tmp_dp,abs(Ks(iir,iit,iip))) + tmp_dp=max(tmp_dp,abs(Kxi(iir,iit,iip))) + tmp_dp=max(tmp_dp,abs(Keta(iir,iit,iip))) + end do + end do + end do + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & Earth_Radius-rr(iir),tt(iit)*180/pi,pp(iip)*180/pi, & + & Ks(iir,iit,iip)/tmp_dp,Kxi(iir,iit,iip)/tmp_dp,Keta(iir,iit,iip)/tmp_dp + end do + end do + end do + close(100*(myid+1)) + end if + end do + + ! processor communication (true traveltime at stations) + ! 数据通信 归约,把所有进程的kernel和obj求和,传输给所有进程 + call mpi_barrier(mpi_comm_world,ierr) + call mpi_allreduce(all_Ks_region_l,all_Ks_region,nr*nt*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(all_Kxi_region_l,all_Kxi_region,nr*nt*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(all_Keta_region_l,all_Keta_region,nr*nt*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(obj_region_l,obj_region,1,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(Ttime_l,Ttime,nev*nst,mpi_double_precision,mpi_max,mpi_comm_world,ierr) + + + + ! ----- data recored (regional traveltime misfit at each iteration) ------ + if (myid .eq. 0) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + case (100:999) + write(form,'(I3)') iter + end select + filename=trim(output_path)//'/misfit_step'//trim(form)//'_region' + open(998, file=trim(filename)) + do i=1,nev + do j=1,nst + write(998,'(f10.5,f10.5,f10.5)') & + & Ttime(i,j)-TtimeT(i,j), Ttime(i,j), TtimeT(i,j) + end do + end do + close(998) + end if + + ! ----- data recored (region misfit kernel) ------ + if (.false. .and. myid .eq. 0) then + filename=trim(output_path)//'/region_misfit_kernel' + open(100,file=trim(filename)) + tmp_dp = 0 + do iir=1,nr + do iit=1,nt + do iip=1,np + tmp_dp=max(tmp_dp,abs(all_Ks_region(iir,iit,iip))) + tmp_dp=max(tmp_dp,abs(all_Kxi_region(iir,iit,iip))) + tmp_dp=max(tmp_dp,abs(all_Keta_region(iir,iit,iip))) + end do + end do + end do + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & Earth_Radius-rr(iir),tt(iit)*180/pi,pp(iip)*180/pi, & + & all_Ks_region(iir,iit,iip)/tmp_dp,all_Kxi_region(iir,iit,iip)/tmp_dp, & + & all_Keta_region(iir,iit,iip)/tmp_dp + end do + end do + end do + close(100) + end if + + end if +! ######################## 远震敏感核计算 calculate sensitivity kernel for teleseismic events ########################## + if (is_tele) then + call mpi_barrier(mpi_comm_world,ierr) + ! ----- 初始化参数 initiate parameters ------ + all_Ks_tele_l = 0; all_Kxi_tele_l = 0; all_Keta_tele_l = 0; + all_Ks_tele = 0; all_Kxi_tele = 0; all_Keta_tele = 0; + + do i=my_tele_source_range(myid+1,1),my_tele_source_range(myid+1,2) + ! ######################## 计算合成走时场 calculate synthetic timetable ######################## + ! -------- 求解远震程函方程 solve eikonal equations ------------ + print *, '----------------- calculating tele synthetic timetable and kernel ... evid: ',i,' ----------------' + + call FSM_WENO3_tele_sphe_3d_ver2(rr,tt,pp,nr,nt,np,a,b,c,f,fun,isbd(i,:) & + & ,bd_N(i,:,:),bd_S(i,:,:),bd_W(i,:,:),bd_E(i,:,:),bd_B(i,:,:),Table) + ! -------- 得到真实走时 calculate true arrival time -------- + do j=1,nst + call Linear_Interp_3D(rr,tt,pp,Table,nr,nt,np,rst(j),tst(j),pst(j),Ttime_tele_l(i,j)) + end do + + ! ######################## 计算伴随场 calculate adjoint timetable ######################## + + allocate(sourceADJ(nst)) + call Adjoint_Source_DDt(Ttime_tele_l(i,:),Ttime_teleT(i,:),tst,pst,nst,max_deg,sourceADJ,tmp_obj) ! absolute traveltime difference + + call FSM_O1_Adj_tele_sphe_3d(rr,tt,pp,nr,nt,np,Table,TableADJ,zeta,xi,eta,Nst,rst,tst,pst,sourceADJ,isbd) + deallocate(sourceADJ) + + ! ######################## 计算敏感核 calculate sensitivity kernel ######################## + + call Sensitivity_Kernel(rr,tt,pp,nr,nt,np,Table,TableADJ,gamma,xi,eta,fun,Ks,Kxi,Keta) + + ! --------- 敏感核,obj叠加 sum kernels and objective function ------- + all_Ks_tele_l = all_Ks_tele_l + Ks; + all_Kxi_tele_l = all_Kxi_tele_l + Kxi; + all_Keta_tele_l = all_Keta_tele_l + Keta; + obj_tele_l = obj_tele_l + tmp_obj + + ! ----- data recored (tele event kernel) ------ + if (.false. .and. myid .eq. 0) then + select case (i) + case (1:9) + write(form2,'(I1)') i + case (10:99) + write(form2,'(I2)') i + end select + filename=trim(output_path)//'/tele_event_kernel_ev'//trim(form2) + open(100*(myid+1),file=trim(filename)) + tmp_dp = 0 + do iir=1,nr + do iit=1,nt + do iip=1,np + tmp_dp=max(tmp_dp,abs(Ks(iir,iit,iip))) + tmp_dp=max(tmp_dp,abs(Kxi(iir,iit,iip))) + tmp_dp=max(tmp_dp,abs(Keta(iir,iit,iip))) + end do + end do + end do + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & Earth_Radius-rr(iir),tt(iit)*180/pi,pp(iip)*180/pi, & + & Ks(iir,iit,iip)/tmp_dp,Kxi(iir,iit,iip)/tmp_dp,Keta(iir,iit,iip)/tmp_dp + end do + end do + end do + close(100*(myid+1)) + end if + end do + + ! processor communication (true traveltime at stations) + ! 数据通信 归约,把所有进程的kernel和obj求和,传输给所有进程 + ! sum kernels and objective functions + call mpi_barrier(mpi_comm_world,ierr) + call mpi_allreduce(all_Ks_tele_l,all_Ks_tele,nr*nt*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(all_Kxi_tele_l,all_Kxi_tele,nr*nt*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(all_Keta_tele_l,all_Keta_tele,nr*nt*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(obj_tele_l,obj_tele,1,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(Ttime_tele_l,Ttime_tele,nev_tele*nst,mpi_double_precision,mpi_max,mpi_comm_world,ierr) + + + + + ! ----- data recored (teleseismic traveltime misfit at each iteration) ------ + if (myid .eq. 0) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + case (100:999) + write(form,'(I3)') iter + end select + filename=trim(output_path)//'/misfit_step'//trim(form)//'_tele' + open(998, file=trim(filename)) + do i=1,nev_tele + do j=1,nst-1 + do k=j+1,nst + call Epicenter_Distance_sphere(tst(j),pst(j),tst(k),pst(k),deg) + if (deg < max_deg) then + write(998,'(f10.5,f10.5,f10.5,f10.5,f10.5)') & + & (Ttime_tele(i,j)-Ttime_tele(i,k))-(Ttime_teleT(i,j)-Ttime_teleT(i,k)), & + & Ttime_tele(i,j), Ttime_tele(i,k), Ttime_teleT(i,j), Ttime_teleT(i,k) + end if + end do + end do + end do + close(998) + end if + + ! ----- data recored (tele misfit kernel) ------ + if (.false. .and. myid .eq. 0) then + filename=trim(output_path)//'/tele_misfit_kernel' + open(100,file=trim(filename)) + tmp_dp = 0 + do iir=1,nr + do iit=1,nt + do iip=1,np + tmp_dp=max(tmp_dp,abs(all_Ks_tele(iir,iit,iip))) + tmp_dp=max(tmp_dp,abs(all_Kxi_tele(iir,iit,iip))) + tmp_dp=max(tmp_dp,abs(all_Keta_tele(iir,iit,iip))) + end do + end do + end do + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & Earth_Radius-rr(iir),tt(iit)*180/pi,pp(iip)*180/pi, & + & all_Ks_tele(iir,iit,iip)/tmp_dp,all_Kxi_tele(iir,iit,iip)/tmp_dp, & + & all_Keta_tele(iir,iit,iip)/tmp_dp + end do + end do + end do + close(100) + end if + + end if + +! ################################### 模型更新 model update ########################################## + call mpi_barrier(mpi_comm_world,ierr) + if (myid .eq. 0) then + print *, '----------------- model update ... iter: ',iter,' ----------------' + end if + + ! ---- 更新目标函数 update objective function ------- + obj = region_ratio * obj_region + tele_ratio * obj_tele + + ! ----- data recored (misfit and step size at each iteration) ------ + if ((myid .eq. 0)) then + if (iter .eq. 1) then + open(999,file=trim(output_path)//'/obj') + else + open(999,file=trim(output_path)//'/obj',access='append') + end if + write(999,'(f11.2,f11.2,f11.2,f9.6)') obj, obj_region,obj_tele,stepsize + close(999) + end if + + ! --------- 整合kernel (sum kernels) --------------------- + if (is_region) then + all_Kernel(:,:,:,1) = all_Kernel(:,:,:,1) + region_ratio * all_Ks_region + all_Kernel(:,:,:,2) = all_Kernel(:,:,:,2) + region_ratio * all_Kxi_region + all_Kernel(:,:,:,3) = all_Kernel(:,:,:,3) + region_ratio * all_Keta_region + end if + if (is_tele) then + all_Kernel(:,:,:,1) = all_Kernel(:,:,:,1) + tele_ratio * all_Ks_tele + all_Kernel(:,:,:,2) = all_Kernel(:,:,:,2) + tele_ratio * all_Kxi_tele + all_Kernel(:,:,:,3) = all_Kernel(:,:,:,3) + tele_ratio * all_Keta_tele + end if + + + ! ------------ multiple grid parameterization ------------ + ! call Parameter_Update_Multigrid(rr,tt,pp,nr,nt,np,all_Kernel,nk, & + ! & invr,invt,invp,ninvr,ninvt,ninvp,ngrid,stepsize,update_value) + call Parameter_Update_Multigrid_ver2(rr,tt,pp,nr,nt,np,all_Kernel,nk, & + & invr,invt,invp,ninvr,ninvt,ninvp,ngrid,stepsize,update_value) + do iir=1,nr + do iit=1,nt + do iip=1,np + ! model parameter update + fun(iir,iit,iip) = fun(iir,iit,iip)*(1-update_value(iir,iit,iip,1)) + xi(iir,iit,iip) = xi(iir,iit,iip)-update_value(iir,iit,iip,2) + eta(iir,iit,iip) = eta(iir,iit,iip)-update_value(iir,iit,iip,3) + + b(iir,iit,iip)=1.0-2*xi(iir,iit,iip); + c(iir,iit,iip)=1.0+2*xi(iir,iit,iip); + f(iir,iit,iip)=-2*eta(iir,iit,iip); + end do + end do + end do + +! ################################## 调整下降步长 modify stepsize ############################## + + if (iter == 1 ) then + if (myid .eq. 0) then + write(*,'(a,f9.2)') 'iter 1, obj is', obj + write(*,'(a,f9.6)') 'iter 1, stepsize is', stepsize + end if + elseif (iter >= 2 .and. obj < old_obj) then + if (myid .eq. 0) then + write(*,'(a,f9.2,a,f9.2)') 'objective function decreases, from', old_obj, ' to', obj + write(*,'(a,f9.6)') 'new stepsize is ', stepsize + end if + elseif (iter >= 2 .and. obj >= old_obj) then + stepsize = max(0.003,stepsize*0.97) ! ega5 会注释掉步长变化 + if (myid .eq. 0) then + write(*,'(a,f9.2,a,f9.2)') 'objective function increases, from', old_obj, ' to', obj + write(*,'(a,f9.6)') 'new stepsize is ', stepsize + end if + end if + +! ################################## 迭代结束 iteration over ############################## + if (myid .eq. 0) then + print *, ' ' + print *, '----------------- iteration ',iter,' over ----------------' + print *, ' ' + end if + + old_obj = obj + + ! ---- data recored (parameters at each iteration) ---- + if ((myid .eq. 0) .and. .true.) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + case (100:999) + write(form,'(I3)') iter + end select + + filename=trim(output_path)//'/model_step'//trim(form) + open(100,file=trim(filename)) + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & Earth_Radius-rr(iir),tt(iit)*180.0/pi,pp(iip)*180.0/pi, & + & fun(iir,iit,iip),xi(iir,iit,iip),eta(iir,iit,iip) + end do + end do + end do + close(100) + end if + + + if (myid .eq. 0) then + call CPU_TIME(time_end) + write(*,'(a,f10.2,a)') 'runtime is: ',time_end - time_begin, 'second' + end if + + + + end do + +! 储存释放 release space + if (is_tele) then + deallocate(rev_tele,tev_tele,pev_tele,weight_ev_tele) + deallocate(bd_N,bd_S,bd_W,bd_E,bd_B,bd_T,isbd) + deallocate(Ttime_teleT,Ttime_tele) + deallocate(Ttime_teleT_l,Ttime_tele_l) + deallocate(all_Ks_tele,all_Kxi_tele,all_Keta_tele) + deallocate(all_Ks_tele_l,all_Kxi_tele_l,all_Keta_tele_l) + deallocate(my_tele_source_range) + end if + if (is_region) then + deallocate(rev,tev,pev,weight_ev) + deallocate(TtimeT,Ttime) + deallocate(TtimeT_l,Ttime_l) + deallocate(all_Ks_region,all_Kxi_region,all_Keta_region) + deallocate(all_Ks_region_l,all_Kxi_region_l,all_Keta_region_l) + deallocate(my_region_source_range) + end if + + deallocate(rst,tst,pst,weight_st) + deallocate(rr,tt,pp,invr,invt,invp) + deallocate(xi,eta,zeta) + deallocate(a,b,c,f,fun) + deallocate(xiT,etaT,zetaT) + deallocate(aT,bT,cT,fT,funT) + deallocate(TableT,uT,Table,u,TableADJ) + + deallocate(Ks,Kxi,Keta) + deallocate(all_kernel,update_value) + + deallocate(inv_dep) + + + call mpi_finalize(ierr) + +end program eikonal_2d + diff --git a/test/old_tests/inversion_tele/fortran_code/eikon_solver_mpi.f90 b/test/old_tests/inversion_tele/fortran_code/eikon_solver_mpi.f90 new file mode 100644 index 0000000..18d9e09 --- /dev/null +++ b/test/old_tests/inversion_tele/fortran_code/eikon_solver_mpi.f90 @@ -0,0 +1,5333 @@ +subroutine FSM_WENO3_tele_sphe_3d(rr,tt,pp,nr,nt,np,spha,sphb,sphc,sphf,T,fun,u,ischange) + ! a -d -e + ! -d b -f + ! -e -f c + integer nr,nt,np + double precision :: dr,dt,dp,rr(nr),tt(nt),pp(np),a(nr,nt,np),b(nr,nt,np),c(nr,nt,np),f(nr,nt,np) + double precision :: spha(nr,nt,np),sphb(nr,nt,np),sphc(nr,nt,np),sphf(nr,nt,np) + double precision :: fun(nr,nt,np),T(nr,nt,np),ischange(nr,nt,np),u(nr,nt,np),xi(nr,nt,np),eta(nr,nt,np) + double precision :: T_old(nr,nt,np) + double precision :: sigr,sigt,sigp,coe,pr1,pr2,wr1,wr2,pt1,pt2,wt1,wt2,pp1,pp2,wp1,wp2,tpT + double precision :: L1_dif,Linf_dif,L1_err,Linf_err + double precision,parameter :: tol = (10.0)**(-5),eps=10.0**(-12) + integer,parameter :: MaxIter=500 + integer iter,rdirec,tdirec,pdirec,iir,iit,iip + double precision :: tmp + + ! ------------------------ 构造网格 ------------------------ + dr=rr(2)-rr(1); dt=tt(2)-tt(1); dp=pp(2)-pp(1) + + ! ------------------------ 构造矩阵 build eikonal matrix ------------------------- + ! a -d -e + ! -d b -f + ! -e -f c + do iir=1,nr + do iit=1,nt + do iip=1,np + a(iir,iit,iip) = spha(iir,iit,iip) + b(iir,iit,iip) = sphb(iir,iit,iip)/(rr(iir)**2) + c(iir,iit,iip) = sphc(iir,iit,iip)/(rr(iir)**2*cos(tt(iit))**2) + f(iir,iit,iip) = sphf(iir,iit,iip)/(rr(iir)**2*cos(tt(iit))) + end do + end do + end do + + ! 正式迭代,更新 iteration start, update T + do iter =1,MaxIter + T_old = T + L1_dif=0; Linf_dif=0;L1_err=0;Linf_err=0; + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + + !x: nr <-> 1, y: nt <-> 1, z: np <-> 1 + + do iir=nint(0.5+nr/2.0+(nr/2.0-0.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+0.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-0.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+0.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-0.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+0.5)*pdirec),-pdirec + + + if(ischange(iir,iit,iip)==1) then + if( iir>1 .and. iir1 .and. iit1 .and. iip0) then + T(i,j,1) = bd_W_interp(i,j) + u(i,j,1) = bd_W_interp(i,j) + ischange(i,j,1) = 0 + else + T(i,j,1) = infT + ischange(i,j,1) = 1 + end if + else + if (bd_W_interp(i,j)>0) then + u(i,j,1) = bd_W_interp(i,j) + end if + end if + + end do + end do + + ! 释放动态数组 + deallocate(bd_rr,bd_tt,bd_W) + + + + ! #--------------------------- 东 E 边界 ---------------------------# + open(10, file='ega1/input/boundary_condition_E') + read(10, *) ni,nj,x1,x2,y1,y2 + allocate(bd_E(ni,nj),bd_rr(ni),bd_tt(nj)) + do i=1,ni + do j=1,nj + read(10, *) read_tmp, read_tmp, read_tmp, bd_E(i,j), read_tmp, read_tmp + end do + end do + x1 = Radius - x1 + x2 = Radius - x2 + y1 = y1/180*pi + y2 = y2/180*pi + + bd_dr = (x2-x1)/(ni-1) + bd_dt = (y2-y1)/(nj-1) + do i=1,ni + bd_rr(i) = x1 + (i-1)*bd_dr + end do + do j=1,nj + bd_tt(j) = y1 + (j-1)*bd_dt + end do + + ! 远震到时 插值到 计算区域边界 + call boundary_interp(bd_rr,bd_tt,ni,nj,bd_E,rr,tt,nr,nt,bd_E_interp) + + ! 赋值给 走时场T + do i=1,nr + do j=1,nt + if (isE) then + if (bd_E_interp(i,j)>0) then + T(i,j,np) = bd_E_interp(i,j) + u(i,j,np) = bd_E_interp(i,j) + ischange(i,j,np) = 0 + else + T(i,j,np) = infT + ischange(i,j,np) = 1 + end if + else + if (bd_E_interp(i,j)>0) then + u(i,j,np) = bd_E_interp(i,j) + end if + end if + end do + end do + + ! 释放动态数组 + deallocate(bd_rr,bd_tt,bd_E) + + + + ! #--------------------------- 北 N 边界 ---------------------------# + open(10, file='ega1/input/boundary_condition_N') + read(10, *) ni,nj,x1,x2,y1,y2 + allocate(bd_N(ni,nj),bd_rr(ni),bd_pp(nj)) + do i=1,ni + do j=1,nj + read(10, *) read_tmp, read_tmp, read_tmp, bd_N(i,j), read_tmp, read_tmp + end do + end do + x1 = Radius - x1 + x2 = Radius - x2 + y1 = y1/180*pi + y2 = y2/180*pi + + bd_dr = (x2-x1)/(ni-1) + bd_dp = (y2-y1)/(nj-1) + do i=1,ni + bd_rr(i) = x1 + (i-1)*bd_dr + end do + do j=1,nj + bd_pp(j) = y1 + (j-1)*bd_dp + end do + + ! 远震到时 插值到 计算区域边界 + call boundary_interp(bd_rr,bd_pp,ni,nj,bd_N,rr,pp,nr,np,bd_N_interp) + + ! 赋值给 走时场T + do i=1,nr + do j=1,np + if (isN) then + if (bd_N_interp(i,j)>0) then + T(i,nt,j) = bd_N_interp(i,j) + u(i,nt,j) = bd_N_interp(i,j) + ischange(i,nt,j) = 0 + else + T(i,nt,j) = infT + ischange(i,nt,j) = 1 + end if + else + if (bd_N_interp(i,j)>0) then + u(i,nt,j) = bd_N_interp(i,j) + end if + end if + end do + end do + + ! 释放动态数组 + deallocate(bd_rr,bd_pp,bd_N) + + + + ! #--------------------------- 南 S 边界 ---------------------------# + open(10, file='ega1/input/boundary_condition_S') + read(10, *) ni,nj,x1,x2,y1,y2 + allocate(bd_S(ni,nj),bd_rr(ni),bd_pp(nj)) + do i=1,ni + do j=1,nj + read(10, *) read_tmp, read_tmp, read_tmp, bd_S(i,j), read_tmp, read_tmp + end do + end do + x1 = Radius - x1 + x2 = Radius - x2 + y1 = y1/180*pi + y2 = y2/180*pi + + bd_dr = (x2-x1)/(ni-1) + bd_dp = (y2-y1)/(nj-1) + do i=1,ni + bd_rr(i) = x1 + (i-1)*bd_dr + end do + do j=1,nj + bd_pp(j) = y1 + (j-1)*bd_dp + end do + + ! 远震到时 插值到 计算区域边界 + call boundary_interp(bd_rr,bd_pp,ni,nj,bd_S,rr,pp,nr,np,bd_S_interp) + + ! 赋值给 走时场T + do i=1,nr + do j=1,np + if (isS) then + if (bd_S_interp(i,j)>0) then + T(i,1,j) = bd_S_interp(i,j) + u(i,1,j) = bd_S_interp(i,j) + ischange(i,1,j) = 0 + else + T(i,1,j) = infT + ischange(i,1,j) = 1 + end if + else + if (bd_S_interp(i,j)>0) then + u(i,1,j) = bd_S_interp(i,j) + end if + end if + end do + end do + + ! 释放动态数组 + deallocate(bd_rr,bd_pp,bd_S) + + + ! #--------------------------- 顶 Top 边界 ---------------------------# + open(10, file='ega1/input/boundary_condition_T') + read(10, *) ni,nj,x1,x2,y1,y2 + allocate(bd_T(ni,nj),bd_tt(ni),bd_pp(nj)) + do i=1,ni + do j=1,nj + read(10, *) read_tmp, read_tmp, read_tmp, bd_T(i,j), read_tmp, read_tmp + end do + end do + x1 = x1/180*pi + x2 = x2/180*pi + y1 = y1/180*pi + y2 = y2/180*pi + + bd_dt = (x2-x1)/(ni-1) + bd_dp = (y2-y1)/(nj-1) + do i=1,ni + bd_tt(i) = x1 + (i-1)*bd_dt + end do + do j=1,nj + bd_pp(j) = y1 + (j-1)*bd_dp + end do + + ! 远震到时 插值到 计算区域边界 + call boundary_interp(bd_tt,bd_pp,ni,nj,bd_T,tt,pp,nt,np,bd_T_interp) + + ! 赋值给 走时场T + do i=1,nt + do j=1,np + if (isT) then + if (bd_T_interp(i,j)>0) then + T(nr,i,j) = bd_T_interp(i,j) + ischange(nr,i,j) = 0 + surface(i,j) = bd_T_interp(i,j) + else + T(nr,i,j) = infT + ischange(nr,i,j) = 1 + end if + else + if (bd_T_interp(i,j)>0) then + surface(i,j) = bd_T_interp(i,j) + end if + end if + end do + end do + + ! 释放动态数组 + deallocate(bd_tt,bd_pp,bd_T) + + + ! #--------------------------- 底 Bottom 边界 ---------------------------# + open(10, file='ega1/input/boundary_condition_B') + read(10, *) ni,nj,x1,x2,y1,y2 + allocate(bd_B(ni,nj),bd_tt(ni),bd_pp(nj)) + do i=1,ni + do j=1,nj + read(10, *) read_tmp, read_tmp, read_tmp, bd_B(i,j), read_tmp, read_tmp + end do + end do + x1 = x1/180*pi + x2 = x2/180*pi + y1 = y1/180*pi + y2 = y2/180*pi + + bd_dt = (x2-x1)/(ni-1) + bd_dp = (y2-y1)/(nj-1) + do i=1,ni + bd_tt(i) = x1 + (i-1)*bd_dt + end do + do j=1,nj + bd_pp(j) = y1 + (j-1)*bd_dp + end do + + ! 远震到时 插值到 计算区域边界 + call boundary_interp(bd_tt,bd_pp,ni,nj,bd_B,tt,pp,nt,np,bd_B_interp) + + ! 赋值给 走时场T + do i=1,nt + do j=1,np + if (isB) then + if (bd_T_interp(i,j)>0) then + T(1,i,j) = bd_B_interp(i,j) + u(1,i,j) = bd_B_interp(i,j) + ischange(1,i,j) = 0 + else + T(1,i,j) = infT + ischange(1,i,j) = 1 + end if + else + if (bd_T_interp(i,j)>0) then + u(1,i,j) = bd_B_interp(i,j) + end if + end if + end do + end do + + ! 释放动态数组 + deallocate(bd_tt,bd_pp,bd_B) + +end subroutine + +subroutine boundary_interp(xx1,yy1,nx1,ny1,val1,xx2,yy2,nx2,ny2,val2) + ! 将 1 套网格的值 插值到 2套网格上,允许外插 + integer :: nx1,ny1,nx2,ny2 + double precision :: xx1(nx1),yy1(ny1),xx2(nx2),yy2(ny2) + double precision :: dx1,dy1,val1(nx1,ny1),val2(nx2,ny2) + double precision :: r1,r2 + integer i,j,idx0,idy0 + dx1 = xx1(2)-xx1(1) + dy1 = yy1(2)-yy1(1) + + + + do i=1,nx2 + do j=1,ny2 + idx0 = floor((xx2(i)-xx1(1))/dx1)+1 + idy0 = floor((yy2(j)-yy1(1))/dy1)+1 + + if (idx0<1 .or. idx0>nx1-1 .or. idy0<1 .or. idy0>ny1-1) then + ! 允许外插 + idx0 = min(nx1-1,max(1,idx0)) + idy0 = min(ny1-1,max(1,idy0)) + end if + + + r1 = min(1.0, (xx2(i)-xx1(idx0))/dx1 ) + r2 = min(1.0, (yy2(j)-yy1(idy0))/dy1 ) + + val2(i,j) = (1-r1)*(1-r2)*val1(idx0,idy0) + (1-r1)*(r2)*val1(idx0,idy0+1) & + & + (r1)*(1-r2)*val1(idx0+1,idy0) + (r1)*(r2)*val1(idx0+1,idy0+1) + + end do + end do +end subroutine + +subroutine tele_error_estimation(rr,tt,pp,nr,nt,np,T,filename,dep,error) + integer :: nr,nt,np + double precision :: T(nr,nt,np),rr(nr),tt(nt),pp(np) + double precision :: error(nt,np,3),dep + double precision,parameter :: Radius = 6371.0 + double precision,parameter :: pi=3.14159265358979323846264338327950288 + character(Len=80) :: filename + + double precision,allocatable :: tauP_solution(:,:),tauP_tt(:),tauP_pp(:) + double precision :: tauP_dt,tauP_dp,tauP_solution_interp(nt,np) + + double precision :: L1_err, Linf_err + + ! 边界的index + integer :: ni,nj + double precision :: x1,x2,y1,y2,r1 + integer :: i,j,idx0,iit,iip + double precision :: read_tmp + + dr = rr(2)-rr(1) + + + ! 读取指定文件 + open(10, file=filename) + read(10, *) ni,nj,x1,x2,y1,y2 + allocate(tauP_solution(ni,nj),tauP_tt(ni),tauP_pp(nj)) + + + do i=1,ni + do j=1,nj + read(10, *) read_tmp, read_tmp, read_tmp, tauP_solution(i,j), read_tmp, read_tmp + end do + end do + x1 = x1/180*pi + x2 = x2/180*pi + y1 = y1/180*pi + y2 = y2/180*pi + + tauP_dt = (x2-x1)/(ni-1) + tauP_dp = (y2-y1)/(nj-1) + do i=1,ni + tauP_tt(i) = x1 + (i-1)*tauP_dt + end do + do j=1,nj + tauP_pp(j) = y1 + (j-1)*tauP_dp + end do + + ! 远震到时 插值到 计算区域 + call boundary_interp(tauP_tt,tauP_pp,ni,nj,tauP_solution,tt,pp,nt,np,tauP_solution_interp) + + ! 走时场 T 插值到指定深度 + idx0 = floor(((Radius-dep) -rr(1))/dr)+1 + r1 = min(1.0,((Radius-dep)-rr(idx0))/dr ) + L1_err=0; Linf_err=0 + + do iit=1,nt + do iip=1,np + error(iit,iip,1) = tauP_solution_interp(iit,iip) + error(iit,iip,2) = (1-r1)*T(idx0,iit,iip)+r1*T(idx0+1,iit,iip) + error(iit,iip,3) = error(iit,iip,1) - error(iit,iip,2) + L1_err = L1_err + abs(error(iit,iip,3)) + Linf_err = max(Linf_err, abs(error(iit,iip,3))) + end do + end do + L1_err = L1_err/(nt*np) + ! 释放动态数组 + deallocate(tauP_solution,tauP_tt,tauP_pp) + + write(*,'(a,f5.1,a,es10.3,a,es10.3,a)') 'L1 and Linf errors at depth ', dep, 'km are ', L1_err, ' s and ', Linf_err,' s.' + + +end subroutine +! ----------------------- end for ega1 ---------------------- + + +! ----------------------- for ega2 ---------------------- +subroutine load_boundary(rr,tt,pp,nr,nt,np,T,ischange,taup_fn,isbd,tele_location) + integer :: nr,nt,np + double precision :: T(nr,nt,np),rr(nr),tt(nt),pp(np),ischange(nr,nt,np) + double precision,parameter :: Radius = 6371.0,pi=3.14159265358979323846264338327950288 + logical :: isbd(6),isN,isS,isW,isE,isT,isB ! N S W E T B + double precision :: tele_location(3) + + ! tauP database + character(Len=80) :: taup_fn + integer :: taup_nsrc_dep,taup_nrec_dep,taup_ndegree + double precision,allocatable :: taup_time(:,:,:),taup_src_dep(:),taup_rec_dep(:),taup_degree(:) + double precision :: tmp_read ! useless for read + + ! boundary points + double precision :: epicenter_dis(nt,np),lat1,lon1,lat2,lon2 + double precision :: r1,r2,r3 ! linear interpolation + double precision :: src,rec,dis + integer :: id1,id2,id3 + ! otheres + integer :: i,j,k !iterative index + + + ! 读取 tauP 数据库 三列分别是 震源深度,台站深度,和震中距 + open(10, file=taup_fn) + read(10, *) taup_nsrc_dep,taup_nrec_dep,taup_ndegree + + allocate(taup_time(taup_nsrc_dep,taup_nrec_dep,taup_ndegree)) + allocate(taup_src_dep(taup_nsrc_dep),taup_rec_dep(taup_nrec_dep),taup_degree(taup_ndegree)) + + read(10, *) taup_src_dep + read(10, *) taup_rec_dep + read(10, *) taup_degree + + do i=1,taup_nsrc_dep + do j=1,taup_nrec_dep + do k=1,taup_ndegree + read(10, *) tmp_read,tmp_read,tmp_read,taup_time(i,j,k) + end do + end do + end do + close(10) + ! 插值边界 + + isN=isbd(1);isS=isbd(2) + isW=isbd(3);isE=isbd(4) + isT=isbd(5);isB=isbd(6) + + ! 统一计算震中距 + do i=1,nt + do j=1,np + lat1 = tt(i); lon1 = pp(j) + lat2 = tele_location(2); lon2 = tele_location(3); + epicenter_dis(i,j)=acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon2-lon1))/pi*180 + end do + end do + + + ! 北边界 North + if (isN) then + do i=1,nr + do j=1,np + ! 震源位置: tele_location(1), 台站位置 Radius-rr(i),震中距:epicenter_dis(nt,j), + src = tele_location(1) + rec = Radius-rr(i) + dis = epicenter_dis(nt,j) + + call taup_data_interp(taup_src_dep,taup_rec_dep,taup_degree, & + & taup_time,taup_nsrc_dep,taup_nrec_dep,taup_ndegree,src,rec,dis,T(i,nt,j)) + ischange(i,nt,j) = 0 + end do + end do + end if + + ! 南边界 South + if (isS) then + do i=1,nr + do j=1,np + ! 震源位置: tele_location(1), 台站位置 Radius-rr(i),震中距:epicenter_dis(1,j), + src = tele_location(1) + rec = Radius-rr(i) + dis = epicenter_dis(1,j) + + call taup_data_interp(taup_src_dep,taup_rec_dep,taup_degree, & + & taup_time,taup_nsrc_dep,taup_nrec_dep,taup_ndegree,src,rec,dis,T(i,1,j)) + ischange(i,1,j) = 0 + end do + end do + end if + + ! 西边界 West + if (isW) then + do i=1,nr + do j=1,nt + ! 震源位置: tele_location(1), 台站位置 Radius-rr(i),震中距:epicenter_dis(j,1), + src = tele_location(1) + rec = Radius-rr(i) + dis = epicenter_dis(j,1) + + call taup_data_interp(taup_src_dep,taup_rec_dep,taup_degree, & + & taup_time,taup_nsrc_dep,taup_nrec_dep,taup_ndegree,src,rec,dis,T(i,j,1)) + ischange(i,j,1) = 0 + end do + end do + end if + + ! 东边界 East + if (isE) then + do i=1,nr + do j=1,nt + ! 震源位置: tele_location(1), 台站位置 Radius-rr(i),震中距:epicenter_dis(j,np), + src = tele_location(1) + rec = Radius-rr(i) + dis = epicenter_dis(j,np) + + call taup_data_interp(taup_src_dep,taup_rec_dep,taup_degree, & + & taup_time,taup_nsrc_dep,taup_nrec_dep,taup_ndegree,src,rec,dis,T(i,j,np)) + ischange(i,j,np) = 0 + end do + end do + end if + + ! 上边界 top (一般是不插值的,遂略去) + + ! 下边界 bottom + if (isB) then + do i=1,nt + do j=1,np + ! 震源位置: tele_location(1), 台站位置 Radius-rr(1),震中距:epicenter_dis(i,j), + src = tele_location(1) + rec = Radius-rr(1) + dis = epicenter_dis(i,j) + + call taup_data_interp(taup_src_dep,taup_rec_dep,taup_degree, & + & taup_time,taup_nsrc_dep,taup_nrec_dep,taup_ndegree,src,rec,dis,T(1,i,j)) + ischange(1,i,j) = 0 + end do + end do + end if + + + deallocate(taup_time,taup_src_dep,taup_rec_dep,taup_degree) + +end subroutine + +subroutine taup_data_interp(src,rec,deg,time,ns,nr,nd,s,r,d,v) + integer :: ns,nr,nd + double precision :: time(ns,nr,nd),src(ns),rec(nr),deg(nd) + double precision :: s,r,d,v + + integer :: id1,id2,id3,k + double precision :: r1,r2,r3 + ! 震源插值 + ! do k=1,ns-1 + ! if (src(k)<= s .and. src(k+1) > s ) then + ! id1=k + ! exit + ! elseif (src(1) > s) then + ! id1=1 + ! exit + ! elseif (src(ns) <= s) then + ! id1=ns-1 + ! exit + ! end if + ! end do + ! r1 = (s - src(id1)) / (src(id1+1)-src(id1)) + + id1 = 1 + + ! 台站插值 (允许外插) + do k=1,nr-1 + if (rec(k)<= r .and. rec(k+1) > r ) then + id2=k + exit + elseif (rec(1) > r) then + id2=1 + exit + elseif (rec(nr) <= r) then + id2=nr-1 + exit + end if + end do + r2 = (r - rec(id2)) / (rec(id2+1)-rec(id2)) + + ! 震中距插值 (允许外插) + do k=1,nd-1 + if (deg(k)<= d .and. deg(k+1) > d ) then + id3=k + exit + elseif (deg(1) > d) then + id3=1 + exit + elseif (deg(nd) <= d) then + id3=nd-1 + exit + end if + end do + r3 = (d - deg(id3)) / (deg(id3+1)-deg(id3)) + + ! v = (1-r1)*(1-r2)*(1-r3)*time(id1,id2,id3) + (1-r1)*(1-r2)*(r3)*time(id1,id2,id3+1) & + ! & + (1-r1)*(r2)*(1-r3)*time(id1,id2+1,id3) + (1-r1)*(r2)*(r3)*time(id1,id2+1,id3+1) & + ! & + (r1)*(1-r2)*(1-r3)*time(id1+1,id2,id3) + (r1)*(1-r2)*(r3)*time(id1+1,id2,id3+1) & + ! & + (r1)*(r2)*(1-r3)*time(id1+1,id2+1,id3) + (r1)*(r2)*(r3)*time(id1+1,id2+1,id3+1) + + v = (1-r2)*(1-r3)*time(id1,id2,id3) + (1-r2)*(r3)*time(id1,id2,id3+1) & + & + (r2)*(1-r3)*time(id1,id2+1,id3) + (r2)*(r3)*time(id1,id2+1,id3+1) + + +end subroutine + +subroutine tele_error_estimation_ver2(rr,tt,pp,nr,nt,np,T,taup_fn,tele_location,dep,error) + integer :: nr,nt,np + double precision :: T(nr,nt,np),rr(nr),tt(nt),pp(np) + double precision :: error(nt,np,3),dep,tele_location(3) + double precision,parameter :: Radius = 6371.0 + double precision,parameter :: pi=3.14159265358979323846264338327950288 + + ! tauP database + character(Len=80) :: taup_fn + integer :: taup_nsrc_dep,taup_nrec_dep,taup_ndegree + double precision,allocatable :: taup_time(:,:,:),taup_src_dep(:),taup_rec_dep(:),taup_degree(:) + double precision :: tmp_read ! useless for read + + double precision :: epicenter_dis(nt,np),lat1,lon1,lat2,lon2 + double precision :: src,rec,dis,traveltime + + double precision :: L1_err, Linf_err + + + + ! 边界的index + integer :: ni,nj + double precision :: x1,x2,y1,y2,r1 + integer :: i,j,k,idx0,iit,iip + double precision :: read_tmp + + dr = rr(2)-rr(1) + + + ! 读取 tauP 数据库 三列分别是 震源深度,台站深度,和震中距 + open(10, file=taup_fn) + read(10, *) taup_nsrc_dep,taup_nrec_dep,taup_ndegree + + allocate(taup_time(taup_nsrc_dep,taup_nrec_dep,taup_ndegree)) + allocate(taup_src_dep(taup_nsrc_dep),taup_rec_dep(taup_nrec_dep),taup_degree(taup_ndegree)) + + read(10, *) taup_src_dep + read(10, *) taup_rec_dep + read(10, *) taup_degree + + do i=1,taup_nsrc_dep + do j=1,taup_nrec_dep + do k=1,taup_ndegree + read(10, *) tmp_read,tmp_read,tmp_read,taup_time(i,j,k) + end do + end do + end do + close(10) + ! 统一计算震中距 + do i=1,nt + do j=1,np + lat1 = tt(i); lon1 = pp(j) + lat2 = tele_location(2); lon2 = tele_location(3); + epicenter_dis(i,j)=acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon2-lon1))/pi*180 + end do + end do + + ! 指定深度 tauP 走时 + idx0 = floor(((Radius-dep) -rr(1))/dr)+1 + r1 = min(1.0,((Radius-dep)-rr(idx0))/dr ) + L1_err=0; Linf_err=0 + + do iit=1,nt + do iip=1,np + ! 震源位置: tele_location(1), 台站位置 Radius-dep,震中距:epicenter_dis(iit,iip), + src = tele_location(1) + rec = dep + dis = epicenter_dis(iit,iip) + + call taup_data_interp(taup_src_dep,taup_rec_dep,taup_degree, & + & taup_time,taup_nsrc_dep,taup_nrec_dep,taup_ndegree,src,rec,dis,traveltime) + + error(iit,iip,1) = traveltime + error(iit,iip,2) = (1-r1)*T(idx0,iit,iip)+r1*T(idx0+1,iit,iip) + error(iit,iip,3) = error(iit,iip,1) - error(iit,iip,2) + L1_err = L1_err + abs(error(iit,iip,3)) + Linf_err = max(Linf_err, abs(error(iit,iip,3))) + + end do + end do + L1_err = L1_err/(nt*np) + + ! 释放动态数组 + deallocate(taup_time,taup_src_dep,taup_rec_dep,taup_degree) + + write(*,'(a,f5.1,a,es10.3,a,es10.3,a)') 'L1 and Linf errors at depth ', dep, 'km are ', L1_err, ' s and ', Linf_err,' s.' + + +end subroutine +! ----------------------- end for ega2 ---------------------- + + +! ----------------------- for ega3 ---------------------- + +subroutine FSM_WENO3_PS_sphe_2d(rr,tt,nr,nt,spha,sphb,T,fun,r0,t0,u) + integer :: nr,nt + double precision :: spha(nr,nt),sphb(nr,nt) + double precision :: rr(nr),tt(nt),a(nr,nt),b(nr,nt),T(nr,nt),fun(nr,nt),r0,t0,ischange(nr,nt),u(nr,nt) + double precision :: dr,dt,T0v(nr,nt),T0r(nr,nt),T0t(nr,nt),a0,b0,fun0 + double precision :: tau(nr,nt),px1,px2,py1,py2,tpT,Htau,wx1,wx2,wy1,wy2 + integer :: iir,iit,iter,xdirec,ydirec + double precision :: L1_dif,Linf_dif,L1_err,Linf_err,tau_old(nr,nt),sigr,sigt + integer,parameter :: MaxIter = 2000 + double precision,parameter :: tol=(10.0)**(-4),eps=(10.0)**(-12) + + ! ------------------------ 构造网格 ------------------------ + dr=rr(2)-rr(1); dt=tt(2)-tt(1); + + ! ------------------------ 构造 T0 ------------------------ + + ! 震源处参数离散化 + idr0=floor((r0-rr(1))/dr+1); idt0=floor((t0-tt(1))/dt+1); + r1 = min(1.0,(r0-rr(idr0))/dr); r2 = min(1.0,(t0-tt(idt0))/dt); + + do iir=1,nr + do iit=1,nt + a(iir,iit) = spha(iir,iit) + b(iir,iit) = sphb(iir,iit)/(rr(iir)**2) + end do + end do + + a0=(1-r1)*(1-r2)*a(idr0,idt0)+(1-r1)*r2*a(idr0,idt0+1) & + & +r1*(1-r2)*a(idr0+1,idt0)+r1*r2*a(idr0+1,idt0+1) + + b0=(1-r1)*(1-r2)*b(idr0,idt0)+(1-r1)*r2*b(idr0,idt0+1) & + & +r1*(1-r2)*b(idr0+1,idt0)+r1*r2*b(idr0+1,idt0+1) + + fun0=(1-r1)*(1-r2)*fun(idr0,idt0)+(1-r1)*r2*fun(idr0,idt0+1) & + & +r1*(1-r2)*fun(idr0+1,idt0)+r1*r2*fun(idr0+1,idt0+1) + + do iir=1,nr + do iit=1,nt + T0v(iir,iit) = fun0*sqrt((1.0/a0)*(rr(iir)-r0)**2 + 1.0/b0*(tt(iit)-t0)**2) + if (T0v(iir,iit) .eq. 0) then + T0r(iir,iit) = 0 + T0t(iir,iit) = 0 + else + T0r(iir,iit) = fun0**2*(1.0/a0*(rr(iir)-r0))/T0v(iir,iit) + T0t(iir,iit) = fun0**2*(1.0/b0*(tt(iit)-y0))/T0v(iir,iit) + end if + + if ( abs((rr(iir)-r0)/dr)<=2 .and. abs((tt(iit)-t0)/dt)<=2) then + tau(iir,iit) = 1 !震源周围几个点,直接认为是常速度结构,给出解析解,即和T0相等 + ischange(iir,iit)=0 + if (iir==1 .or. iir==nr .or. iit==1 .or. iit==nt) then + write(*,*) 'source on the boundary, mesh error' + pause + end if + else + tau(iir,iit) = 1 + ischange(iir,iit)=1 + end if + + end do + end do + + ! step 2, solve Tau, H(tau) = a tau_x^2+ b tau_y^2 + (2aTx-2cTy) tau_x + (2bTy-2cTx) tau_y + ! -2c tau_x tau_y + (aTx^2+bTy^2-2cTxTy) = f^2 + + do iter =1,MaxIter + L1_dif=10000; Linf_dif=10000;L1_err=0;Linf_err=0; + tau_old = tau + do xdirec = -1,1,2 + do ydirec = -1,1,2 + ! iter 1 x: 1 -> nr, y: 1 -> nt + ! iter 2 x: 1 -> nr, y: nt -> 1 + ! iter 3 x: nr -> 1, y: 1 -> nt + ! iter 4 x: nr -> 1, y: nt -> 1 + do iir=nint(0.5+nr/2.0+(nr/2.0-1.5)*xdirec),nint(0.5+nr/2.0+(-nr/2.0+1.5)*xdirec),-xdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-1.5)*ydirec),nint(0.5+nt/2.0+(-nt/2.0+1.5)*ydirec),-ydirec + if(ischange(iir,iit)==1) then + + sigr=sqrt(a(iir,iit))*T0v(iir,iit);sigt=sqrt(b(iir,iit))*T0v(iir,iit) + coe=1.0/((sigr/dr)+(sigt/dt)) + + if(iir==2) then + px1=(tau(iir,iit)-tau(iir-1,iit))/dr; + wx2=1.0/(1+2*((eps+(tau(iir,iit)-2*tau(iir+1,iit)+tau(iir+2,iit))**2)/ & + & (eps+(tau(iir-1,iit)-2*tau(iir,iit)+tau(iir+1,iit))**2))**2) + px2=(1-wx2)*(tau(iir+1,iit)-tau(iir-1,iit))/2/dr+ & + & wx2*(-3*tau(iir,iit)+4*tau(iir+1,iit)-tau(iir+2,iit))/2/dr; + elseif (iir==nr-1) then + wx1=1.0/(1+2*((eps+(tau(iir,iit)-2*tau(iir-1,iit)+tau(iir-2,iit))**2)/ & + & (eps+(tau(iir+1,iit)-2*tau(iir,iit)+tau(iir-1,iit))**2))**2) + px1=(1-wx1)*(tau(iir+1,iit)-tau(iir-1,iit))/2/dr+ & + & wx1*(3*tau(iir,iit)-4*tau(iir-1,iit)+tau(iir-2,iit))/2/dr; + px2=(tau(iir+1,iit)-tau(iir,iit))/dr; + else + wx1=1.0/(1.0+2*((eps+(tau(iir,iit)-2*tau(iir-1,iit)+tau(iir-2,iit))**2)/ & + & (eps+(tau(iir+1,iit)-2*tau(iir,iit)+tau(iir-1,iit))**2))**2) + px1=(1.0-wx1)*(tau(iir+1,iit)-tau(iir-1,iit))/2/dr+ & + & wx1*(3*tau(iir,iit)-4*tau(iir-1,iit)+tau(iir-2,iit))/2/dr; + wx2=1.0/(1.0+2*((eps+(tau(iir,iit)-2*tau(iir+1,iit)+tau(iir+2,iit))**2)/ & + & (eps+(tau(iir-1,iit)-2*tau(iir,iit)+tau(iir+1,iit))**2))**2) + px2=(1.0-wx2)*(tau(iir+1,iit)-tau(iir-1,iit))/2/dr+ & + & wx2*(-3*tau(iir,iit)+4*tau(iir+1,iit)-tau(iir+2,iit))/2/dr; + end if + + + if(iit==2) then + py1=(tau(iir,iit)-tau(iir,iit-1))/dt; + wy2=1.0/(1+2*((eps+(tau(iir,iit)-2*tau(iir,iit+1)+tau(iir,iit+2))**2)/ & + & (eps+(tau(iir,iit-1)-2*tau(iir,iit)+tau(iir,iit+1))**2))**2) + py2=(1-wy2)*(tau(iir,iit+1)-tau(iir,iit-1))/2/dt+ & + & wy2*(-3*tau(iir,iit)+4*tau(iir,iit+1)-tau(iir,iit+2))/2/dt; + elseif (iit==nt-1) then + wy1=1.0/(1+2*((eps+(tau(iir,iit)-2*tau(iir,iit-1)+tau(iir,iit-2))**2)/ & + & (eps+(tau(iir,iit+1)-2*tau(iir,iit)+tau(iir,iit-1))**2))**2) + py1=(1-wy1)*(tau(iir,iit+1)-tau(iir,iit-1))/2/dt+ & + & wy1*(3*tau(iir,iit)-4*tau(iir,iit-1)+tau(iir,iit-2))/2/dt; + py2=(tau(iir,iit+1)-tau(iir,iit))/dt; + else + wy1=1.0/(1+2*((eps+(tau(iir,iit)-2*tau(iir,iit-1)+tau(iir,iit-2))**2)/ & + & (eps+(tau(iir,iit+1)-2*tau(iir,iit)+tau(iir,iit-1))**2))**2) + py1=(1-wy1)*(tau(iir,iit+1)-tau(iir,iit-1))/2/dt+ & + & wy1*(3*tau(iir,iit)-4*tau(iir,iit-1)+tau(iir,iit-2))/2/dt; + wy2=1.0/(1+2*((eps+(tau(iir,iit)-2*tau(iir,iit+1)+tau(iir,iit+2))**2)/ & + & (eps+(tau(iir,iit-1)-2*tau(iir,iit)+tau(iir,iit+1))**2))**2) + py2=(1-wy2)*(tau(iir,iit+1)-tau(iir,iit-1))/2/dt+ & + & wy2*(-3*tau(iir,iit)+4*tau(iir,iit+1)-tau(iir,iit+2))/2/dt; + end if + + + + Htau = sqrt( a(iir,iit)*(T0r(iir,iit)*tau(iir,iit)+T0v(iir,iit)*(px1+px2)/2)**2 & + & + b(iir,iit)*(T0t(iir,iit)*tau(iir,iit)+T0v(iir,iit)*(py1+py2)/2)**2 ) + + tpT=coe*(fun(iir,iit)-Htau) + coe*(sigr*(px2-px1)/2+sigt*(py2-py1)/2)+tau(iir,iit); + + tau(iir,iit)=tpT + + + end if + + end do + end do + + ! 处理边界 + do iit=1,nt + tau(1,iit) = max(2*tau(2,iit)-tau(3,iit),tau(3,iit)) + tau(nr,iit) = max(2*tau(nr-1,iit)-tau(nr-2,iit),tau(nr-2,iit)) + end do + do iir=1,nr + tau(iir,1) = max(2*tau(iir,2)-tau(iir,3),tau(iir,3)) + tau(iir,nt) = max(2*tau(iir,nt-1)-tau(iir,nt-2),tau(iir,nt-2)) + end do + + end do + end do + + L1_dif=0; Linf_dif=0 + do iir=1,nr + do iit=1,nt + L1_dif=L1_dif+abs(tau(iir,iit)-tau_old(iir,iit)) + Linf_dif=max(Linf_dif,abs(tau(iir,iit)-tau_old(iir,iit))) + end do + end do + L1_dif = L1_dif/(nr*nt) + + do iir=3,nr-2 + do iit=3,nt-2 + L1_err=L1_err+abs(tau(iir,iit)*T0v(iir,iit)-u(iir,iit)) + Linf_err=max(Linf_err,abs(tau(iir,iit)*T0v(iir,iit)-u(iir,iit))) + end do + end do + L1_err = L1_err/(nr-4)/(nt-4) + + + if (abs(L1_dif)= layer_dep(nlayer)) then + vel = layer_vel(nlayer) + else + do i=1,nlayer-1 + if ( layer_dep(i)+small_eps <= dep .and. layer_dep(i+1) > dep-small_eps ) then + vel = (dep-layer_dep(i))/(layer_dep(i+1)-layer_dep(i))*(layer_vel(i+1)-layer_vel(i))+layer_vel(i) + exit + end if + end do + end if + + do iit=1,nt + fun(iir,iit) = 1.0/vel + end do + + end do + + close(10) + deallocate(layer_dep,layer_vel) + + +end subroutine + +subroutine Read_1D_velocity_3d(filename,rr,nr,nt,np,fun) + integer :: nr,nt,np + double precision :: fun(nr,nt,np),rr(nr) + character(len=80) filename + + ! input velocity file + integer :: nlayer + double precision,allocatable :: layer_dep(:), layer_vel(:) + double precision,parameter :: Radius = 6371.0, small_eps=0.001 + + ! others + integer i,iir,iit,iip ! iterative index + double precision :: read_tmp,dep,vel ! read temp variable + + + + open(10,file=trim(filename)) + read(10,*) nlayer + allocate(layer_dep(nlayer),layer_vel(nlayer)) + + do i=1,nlayer + read(10,*) layer_dep(i),layer_vel(i) + end do + + do iir=1,nr + ! 计算 dep 处的速度 + dep = Radius - rr(iir) + if (dep < layer_dep(1)) then + vel = layer_vel(1) + elseif (dep >= layer_dep(nlayer)) then + vel = layer_vel(nlayer) + else + do i=1,nlayer-1 + if ( layer_dep(i)+small_eps <= dep .and. layer_dep(i+1) > dep-small_eps ) then + vel = (dep-layer_dep(i))/(layer_dep(i+1)-layer_dep(i))*(layer_vel(i+1)-layer_vel(i))+layer_vel(i) + exit + end if + end do + end if + + do iit=1,nt + do iip=1,np + fun(iir,iit,iip) = 1.0/vel + end do + end do + + end do + + close(10) + deallocate(layer_dep,layer_vel) + + +end subroutine + +subroutine Ray_tracing_sphe_2d(rr,tt,nr,nt,T,recr,rect,srcr,srct,time,filename) + integer :: nr,nt + double precision :: rr(nr),tt(nt),T(nr,nt) + double precision :: srcr,srct,recr,rect,time + character(len=80) :: filename + + integer :: Ntime,traceid + double precision,allocatable :: trace(:,:) + double precision :: dt,grad_r,grad_t,Tgrad_r(nr,nt),Tgrad_t(nr,nt) + double precision :: tol + + integer :: iir,iit,it ! 循环 index + double precision,parameter :: pi=3.14159265358979323846264338327950288 + + + + dtime=0.1; + Ntime = int(time*1.5/dtime) ! 总时间 + allocate(trace(Ntime,2)) + + ! 初始化 + trace(1,1) = recr; trace(1,2) = rect; ! 起始点 + + dr = rr(2)-rr(1); dt=tt(2)-tt(1) + tol = sqrt(dr**2+(dt*srcr)**2) + + + ! 梯度场 + do iir=2,nr-1 + do iit=2,nt-1 + Tgrad_r(iir,iit) = (T(iir+1,iit) - T(iir-1,iit))/dr/2 + Tgrad_t(iir,iit) = (T(iir,iit+1) - T(iir,iit-1))/dt/2 + end do + end do + do iir=1,nr + Tgrad_t(iir,1) = (T(iir,2) - T(iir,1))/dt + Tgrad_t(iir,nt) = (T(iir,nt) - T(iir,nt-1))/dt + end do + do iit=1,nt + Tgrad_r(1,iit) = (T(2,iit) - T(1,iit))/dr + Tgrad_r(nr,iit) = (T(nr,iit) - T(nr-1,iit))/dr + end do + + traceid=-1 + + + + ! 主循环 + do it=1,Ntime-1 + + ! 该点位置 trace(it,1), trace(it,2) + if ( trace(it,1)<=rr(1) .or. trace(it,1)>=rr(nr) .or. trace(it,2)<=tt(1) .or. trace(it,2)>=tt(nt)) then + print *, 'ray out of region, stop' + exit + end if + + ! 如果当前点离震源非常近,判定收敛 + if ( (trace(it,1)-srcr)**2+(trace(it,2)-srct)**2*trace(it,1)**2 < tol**2 ) then + print *, 'ray arrive source' + trace(it+1,1) = srcr + trace(it+1,2) = srct + traceid = it+1 + exit + end if + + + ! 计算该点的梯度 + call interp2d(rr,tt,nr,nt,Tgrad_r,trace(it,1),trace(it,2),grad_r) + call interp2d(rr,tt,nr,nt,Tgrad_t,trace(it,1),trace(it,2),grad_t) + + slowness_squared = grad_r**2 + grad_t**2/trace(it,1)**2 + ! 沿负梯度走 dtime 长度 r = r- dtime*Tr/(s^2); theta = theta - dtime*Ttheta/(r^2 s^2) + trace(it+1,1) = trace(it,1) - dtime*grad_r / slowness_squared + trace(it+1,2) = trace(it,2) - dtime*grad_t / slowness_squared / ((trace(it,1)+trace(it+1,1))**2/4) + + !print *, trace(it+1,1),trace(it+1,2),xsou,ysou + + end do + + if (traceid<0) then + ! 没打到震源,存在问题 + print *, filename, 'not arrive' + open(10,file=trim(filename)//'_NotArrive') + do it=1,Ntime + write(10,*) trace(it,1),trace(it,2)*180.0/pi,dtime*(it-1) + end do + close(10) + else + ! 达到震源,输出射线路径 + open(10,file=trim(filename)) + do it=1,traceid + write(10,*) trace(it,1),trace(it,2)*180.0/pi,dtime*(it-1) + end do + close(10) + end if + + + + deallocate(trace) +end subroutine + +subroutine interp2d(xx,yy,nx,ny,val,x0,y0,v0) + integer :: nx,ny,idx0,idy0 + double precision :: xx(nx),yy(ny),val(nx,ny),x0,y0,v0,dx,dy,r1,r2 + integer :: iix,iiy + + dx=xx(2)-xx(1); dy=yy(2)-yy(1) + + + if ( x0<=xx(1) .or. x0>=xx(nx) .or. y0<=yy(1) .or. y0>=yy(ny)) then + print *, x0,xx(1),xx(nx),y0,yy(1),yy(ny) + print *, 'out of mesh' + pause + end if + + idx0 = floor((x0-xx(1))/dx)+1 + idy0 = floor((y0-yy(1))/dy)+1 + + r1 = min(1.0, (x0-xx(idx0))/dx ) + r2 = min(1.0, (y0-yy(idy0))/dy ) + + v0 = (1-r1)*(1-r2)*val(idx0,idy0) + (1-r1)*r2*val(idx0,idy0+1) & + & + r1*(1-r2)*val(idx0+1,idy0) + r1*r2*val(idx0+1,idy0+1) + + +end subroutine + +subroutine load_boundary_ver2(rr,tt,pp,nr,nt,np,T,ischange,bd_fn,isbd,tele_location) + integer :: nr,nt,np + double precision :: T(nr,nt,np),rr(nr),tt(nt),pp(np),ischange(nr,nt,np) + double precision,parameter :: Radius = 6371.0,pi=3.14159265358979323846264338327950288 + logical :: isbd(6),isN,isS,isW,isE,isT,isB ! N S W E T B + double precision :: tele_location(3) + + ! boundary database + character(Len=80) :: bd_fn + integer :: bd_nr,bd_nt + double precision :: bd_srcr + double precision,allocatable :: bd_time(:,:),bd_r(:),bd_t(:) + double precision :: tmp_read ! useless for read + + ! boundary points + double precision :: epicenter_dis(nt,np),lat1,lon1,lat2,lon2 + double precision :: r1,r2,r3 ! linear interpolation + double precision :: rec,dis + integer :: id1,id2,id3 + ! otheres + integer :: i,j,k !iterative index + + ! 读取 2d eikonal 计算的到时数据 + open(10, file=bd_fn) + read(10, *) bd_srcr + if (abs(bd_srcr - tele_location(1))>0.1) then + print *, 'source depth is not consistent with the boundary data' + pause + end if + + read(10, *) bd_nr,bd_nt + + allocate(bd_time(bd_nr,bd_nt),bd_r(bd_nr),bd_t(bd_nt)) + + read(10, *) bd_r + read(10, *) bd_t + + do i=1,bd_nr + do j=1,bd_nt + read(10, *) bd_time(i,j) + end do + end do + close(10) + ! 插值边界 + + + + isN=isbd(1);isS=isbd(2) + isW=isbd(3);isE=isbd(4) + isT=isbd(5);isB=isbd(6) + + ! 统一计算震中距 + do i=1,nt + do j=1,np + lat1 = tt(i); lon1 = pp(j) + lat2 = tele_location(2); lon2 = tele_location(3); + epicenter_dis(i,j)=acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon2-lon1))/pi*180 + end do + end do + + + ! 北边界 North + if (isN) then + do i=1,nr + do j=1,np + ! 震源位置: tele_location(1), 台站位置 Radius-rr(i),震中距:epicenter_dis(nt,j), + rec = rr(i) + dis = epicenter_dis(nt,j) + + call interp2d(bd_r,bd_t,bd_nr,bd_nt,bd_time,rec,dis,T(i,nt,j)) + ischange(i,nt,j) = 0 + end do + end do + end if + + ! 南边界 South + if (isS) then + do i=1,nr + do j=1,np + ! 震源位置: tele_location(1), 台站位置 Radius-rr(i),震中距:epicenter_dis(1,j), + rec = rr(i) + dis = epicenter_dis(1,j) + call interp2d(bd_r,bd_t,bd_nr,bd_nt,bd_time,rec,dis,T(i,1,j)) + ischange(i,1,j) = 0 + end do + end do + end if + + ! 西边界 West + if (isW) then + do i=1,nr + do j=1,nt + ! 震源位置: tele_location(1), 台站位置 Radius-rr(i),震中距:epicenter_dis(j,1), + rec = rr(i) + dis = epicenter_dis(j,1) + + call interp2d(bd_r,bd_t,bd_nr,bd_nt,bd_time,rec,dis,T(i,j,1)) + + ischange(i,j,1) = 0 + end do + end do + end if + + ! 东边界 East + if (isE) then + do i=1,nr + do j=1,nt + ! 震源位置: tele_location(1), 台站位置 Radius-rr(i),震中距:epicenter_dis(j,np), + rec = rr(i) + dis = epicenter_dis(j,np) + + call interp2d(bd_r,bd_t,bd_nr,bd_nt,bd_time,rec,dis,T(i,j,np)) + + ischange(i,j,np) = 0 + end do + end do + end if + + ! 上边界 top (一般是不插值的,遂略去) + + ! 下边界 bottom + if (isB) then + do i=1,nt + do j=1,np + ! 震源位置: tele_location(1), 台站位置 Radius-rr(1),震中距:epicenter_dis(i,j), + rec = rr(1) + dis = epicenter_dis(i,j) + + call interp2d(bd_r,bd_t,bd_nr,bd_nt,bd_time,rec,dis,T(1,i,j)) + + ischange(1,i,j) = 0 + end do + end do + end if + + + deallocate(bd_time,bd_r,bd_t) + +end subroutine + +subroutine tele_error_estimation_ver3(rr,tt,pp,nr,nt,np,T,bd_fn,tele_location,dep,error) + integer :: nr,nt,np + double precision :: T(nr,nt,np),rr(nr),tt(nt),pp(np) + double precision :: error(nt,np,3),dep,tele_location(3) + double precision,parameter :: Radius = 6371.0 + double precision,parameter :: pi=3.14159265358979323846264338327950288 + + ! boundary database + character(Len=80) :: bd_fn + integer :: bd_nr,bd_nt + double precision :: bd_srcr + double precision,allocatable :: bd_time(:,:),bd_r(:),bd_t(:) + double precision :: tmp_read ! useless for read + + + double precision :: epicenter_dis(nt,np),lat1,lon1,lat2,lon2 + double precision :: src,rec,dis,traveltime + double precision :: L1_err, Linf_err + + + + ! 边界的index + integer :: ni,nj + double precision :: x1,x2,y1,y2,r1 + integer :: i,j,k,idx0,iit,iip + double precision :: read_tmp + + dr = rr(2)-rr(1) + + + ! 读取 2d eikonal 计算的到时数据 + open(10, file=bd_fn) + read(10, *) bd_srcr + if (abs(bd_srcr - tele_location(1))>0.1) then + print *, 'source depth is not consistent with the boundary data' + pause + end if + + read(10, *) bd_nr,bd_nt + + allocate(bd_time(bd_nr,bd_nt),bd_r(bd_nr),bd_t(bd_nt)) + + read(10, *) bd_r + read(10, *) bd_t + + do i=1,bd_nr + do j=1,bd_nt + read(10, *) bd_time(i,j) + end do + end do + close(10) + + + ! 统一计算震中距 + do i=1,nt + do j=1,np + lat1 = tt(i); lon1 = pp(j) + lat2 = tele_location(2); lon2 = tele_location(3); + epicenter_dis(i,j)=acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon2-lon1))/pi*180 + end do + end do + + ! 指定深度 计算 走时 + idx0 = floor(((Radius-dep) -rr(1))/dr)+1 + r1 = min(1.0,((Radius-dep)-rr(idx0))/dr ) + L1_err=0; Linf_err=0 + + do iit=1,nt + do iip=1,np + ! 震源位置: tele_location(1), 台站位置 Radius-dep,震中距:epicenter_dis(iit,iip), + rec = Radius-dep + dis = epicenter_dis(iit,iip) + + call interp2d(bd_r,bd_t,bd_nr,bd_nt,bd_time,rec,dis,traveltime) + + error(iit,iip,1) = traveltime + error(iit,iip,2) = (1-r1)*T(idx0,iit,iip)+r1*T(idx0+1,iit,iip) + error(iit,iip,3) = error(iit,iip,1) - error(iit,iip,2) + L1_err = L1_err + abs(error(iit,iip,3)) + Linf_err = max(Linf_err, abs(error(iit,iip,3))) + end do + end do + L1_err = L1_err/(nt*np) + + ! dep = 6071.0 + ! do iit=1,10 + ! call interp2d(bd_r,bd_t,bd_nr,bd_nt,bd_time,dep+iit,epicenter_dis(3,3),traveltime) + ! print *, dep+iit,traveltime + ! end do + + ! 释放动态数组 + deallocate(bd_time,bd_r,bd_t) + + write(*,'(a,f5.1,a,es10.3,a,es10.3,a)') 'L1 and Linf errors at depth ', dep, 'km are ', L1_err, ' s and ', Linf_err,' s.' + + + + +end subroutine +! ----------------------- end for ega3 ---------------------- + +! ----------------------- for ega4 ---------------------- +subroutine eikonal_boundary_traveltime(rr,tt,pp,nr,nt,np,r0,t0,p0,velo_1d_fn,TTfield_path,isbd,bd_N,bd_S,bd_W,bd_E,bd_B,bd_T) + ! input parameter + integer :: nr,nt,np + double precision :: rr(nr),tt(nt),pp(np) + double precision :: r0,t0,p0 + character(len=80) :: velo_1d_fn,TTfield_path + + ! output parameter + double precision :: bd_N(nr,np),bd_S(nr,np),bd_W(nr,nt),bd_E(nr,nt),bd_B(nt,np),bd_T(nt,np) + logical :: isbd(5) + + ! + double precision :: degree(4),azimuthal(4) + double precision :: maxdegree + double precision :: epicenter_dis(nt,np) ! epicenter distance from tele source to study region + + ! mesh for 2d eikonal + integer :: nr_2d,nt_2d + double precision :: rr1_2d,rr2_2d,tt1_2d,tt2_2d,dr_2d,dt_2d,r0_2d,t0_2d + double precision,allocatable :: rr_2d(:),tt_2d(:),spha_2d(:,:),sphb_2d(:,:) + double precision,allocatable :: fun_2d(:,:),u_2d(:,:),T_2d(:,:) + character(len=80) :: filename,form1,form2 + logical :: isfile,iscal + integer :: file_nr_2d,file_nt_2d + double precision,allocatable :: file_rr_2d(:),file_tt_2d(:) + + + ! others + double precision,parameter :: pi=3.14159265358979323846264338327950288 + double precision,parameter :: Earth_Radius = 6371.0 + double precision,parameter :: tol=0.001 + integer :: iir,iit,iip,iter ! iteration index + + + ! ---------- 首先,确定二维程函方程的计算范围 first, determine the region for 2d eikonal -------------------- + + ! calculate the degree and azimuthal from the tele-source to the region + ! S-W + call Epicenter_Distance_sphere(tt(1),pp(1),t0,p0,degree(1)) + call Azimuthal_sphere(tt(1),pp(1),t0,p0,azimuthal(1)) + ! S-E + call Epicenter_Distance_sphere(tt(1),pp(np),t0,p0,degree(2)) + call Azimuthal_sphere(tt(1),pp(np),t0,p0,azimuthal(2)) + ! N-W + call Epicenter_Distance_sphere(tt(nt),pp(1),t0,p0,degree(3)) + call Azimuthal_sphere(tt(nt),pp(1),t0,p0,azimuthal(3)) + ! N-E + call Epicenter_Distance_sphere(tt(nt),pp(np),t0,p0,degree(4)) + call Azimuthal_sphere(tt(nt),pp(np),t0,p0,azimuthal(4)) + + ! print *, 'source (lat,lon) = ', t0*180/pi, ' ', p0*180/pi + ! print *, 'degree is ', degree*180/pi + ! print *, 'azimuthal is ', azimuthal*180/pi + + ! ---------- 然后,根据震中距和方位角,确定计算哪些边界,只有4种情况,出现其他情况,请报错 ------------ + ! ---------- determine to activate which boundaries. Only 4 cases, otherwise print error ------------ + maxdegree = max(degree(1),degree(2),degree(3),degree(4)) + if (maxdegree== degree(1)) then + ! N + E + isbd = [ .true. , .false. , .false. , .true. , .true. ] ! isbd: N,S,W,E,B + else if (maxdegree == degree(2)) then + ! N + W + isbd = [ .true. , .false. , .true. , .false. , .true. ] + else if (maxdegree == degree(3)) then + ! S + E + isbd = [ .false. , .true. , .false. , .true. , .true. ] + else if (maxdegree == degree(4)) then + ! S + W + isbd = [ .false. , .true. , .true. , .false. , .true. ] + end if + + ! ---------- if source is on the west or ease direction, N and S boundaries are deactivated + if (t0 > tt(1) .and. t0 < tt(nt)) then + isbd(1) = .false. + isbd(2) = .false. + end if + ! ---------- if source is on the north or south direction, west and east boundaries are deactivated + if (p0 > pp(1) .and. p0 < pp(np)) then + isbd(3) = .false. + isbd(4) = .false. + end if + + + ! ---------- 生成二维网格 ---------------------- + ! ---------- generate 2d mesh ---------------------- + dr_2d = 2.0; dt_2d = pi/1000; + rr1_2d = Earth_Radius-3000; rr2_2d = Earth_Radius+100; + tt1_2d = -10.0/180.0*pi; tt2_2d = 100.0/180.0*pi; + nr_2d = floor((rr2_2d-rr1_2d)/dr_2d)+1; + nt_2d = floor((tt2_2d-tt1_2d)/dt_2d)+1; + + allocate(rr_2d(nr_2d),tt_2d(nt_2d)) + + do iir=1,nr_2d + rr_2d(iir)=rr1_2d+(iir-1)*dr_2d + end do + do iit=1,nt_2d + tt_2d(iit)=tt1_2d+(iit-1)*dt_2d + end do + + + + ! ----------- 读取一维速度文件,产生速度场 ----------------------- + ! ----------- read the 1d velocity file ----------------------- + allocate(fun_2d(nr_2d,nt_2d),spha_2d(nr_2d,nt_2d),sphb_2d(nr_2d,nt_2d),u_2d(nr_2d,nt_2d),T_2d(nr_2d,nt_2d)) + + call Read_1D_velocity_2d(velo_1d_fn,rr_2d,nr_2d,nt_2d,fun_2d) + do iir=1,nr_2d + do iit=1,nt_2d + spha_2d(iir,iit)=1.0; + sphb_2d(iir,iit)=1.0; + u_2d(iir,iit) = 0.0 + T_2d(iir,iit) = 0.0 + end do + end do + ! --------- 速度场文件输出 output 2d velocity file ------------- + filename=trim(TTfield_path)//'/model2d' + inquire(file=filename, exist=isfile) + if (.not. isfile) then + open(10,file=filename) + write(10,*) nr_2d,' ',nt_2d + write(10,*) rr_2d + write(10,*) tt_2d + do iir =1,nr_2d + do iit =1,nt_2d + write(10,*) 1.0/fun_2d(iir,iit) + end do + print *, Earth_Radius - rr_2d(iir), 1.0/fun_2d(iir,1) + end do + close(10) + end if + + ! ----------- 核心,计算对应远震产生的二维走时场 ------------------- + ! ----------- calculate the 2d traveltime field ----------------- + r0_2d = r0; t0_2d = 0.0 + write(*,'(a)') & + & 'calculating 2d traveltime field, region: ' + write(*,'(a, f7.2,a,f7.2,a)') & + & 'Depth: ', Earth_Radius-rr2_2d, ' km - ' ,Earth_Radius-rr1_2d, ' km' + write(*,'(a, f7.2,a,f7.2)') & + & 'Epicenter dis: ', tt1_2d*180.0/pi, ' - ' ,tt2_2d*180.0/pi + write(*,'(a,f7.2,f7.2,i5,i5)') & + & '(dr,dt,nr,nt) = ', dr_2d,dt_2d*180.0/pi,nr_2d,nt_2d + + ! determine the 2d time file name + write(form1,'(i4)') floor(r0) + write(form2,'(i3)') int((r0-floor(r0))*1000) + filename=trim(TTfield_path)//'/traveltime2d_'//trim(form1)//'_'//trim(form2) + + + ! load or calculate the traveltime + inquire(file=filename, exist=isfile) + if (isfile) then + ! if the traveltime file exist, just read it + write(*,'(a,a)') 'file exist, loading ... :', filename + open(10,file=filename) + read(10,*) file_nr_2d,file_nt_2d + allocate(file_rr_2d(file_nr_2d),file_tt_2d(file_nt_2d)) + read(10,*) file_rr_2d + read(10,*) file_tt_2d + if (file_nr_2d == nr_2d .and. file_nt_2d == nt_2d .and. & + & abs(file_rr_2d(1)-rr_2d(1)) old_L1_dif) then + stop_count = stop_count+1 + end if + old_L1_dif = L1_dif + L1_dif=0; Linf_dif=0; + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + + !x: nr <-> 1, y: nt <-> 1, z: np <-> 1 + + do iir=nint(0.5+nr/2.0+(nr/2.0-0.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+0.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-0.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+0.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-0.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+0.5)*pdirec),-pdirec + + + if(ischange(iir,iit,iip)==1) then + if( iir>1 .and. iir1 .and. iit1 .and. iip= 5) then + write(*,*) 'iter ',iter,', T is oscillating' + exit + else + ! write(*,*) 'iter ',iter,', T is changing, L1 dif = ', L1_dif,'L inf dif = ', Linf_dif + end if + + if (iter==MaxIter) then + write(*,*) 'iter ',iter,', max iteration steps' + end if + + end do + +end subroutine + +subroutine FSM_O1_Adj_tele_sphe_3d(rr,tt,pp,nr,nt,np,Table,TableADJ,zeta,xi,eta,Nrec,rrec,trec,prec,sourceADJ,isbd) + + integer :: nr,nt,np,Nrec + double precision :: dr,dt,dp,rr(nr),tt(nt),pp(np) + double precision :: Table(nr,nt,np),TableADJ(nr,nt,np),delta(nr,nt,np) + double precision :: zeta(nr,nt,np),xi(nr,nt,np),eta(nr,nt,np) + double precision :: rrec(Nrec),trec(Nrec),prec(Nrec),sourceADJ(Nrec) + double precision :: a1,a1m(nr,nt,np),a1p(nr,nt,np),a2,a2m(nr,nt,np),a2p(nr,nt,np) + double precision :: b1,b1m(nr,nt,np),b1p(nr,nt,np),b2,b2m(nr,nt,np),b2p(nr,nt,np) + double precision :: c1,c1m(nr,nt,np),c1p(nr,nt,np),c2,c2m(nr,nt,np),c2p(nr,nt,np) + double precision :: coe + logical :: isbd(5) + + integer,parameter :: MaxIter=100 + double precision,parameter :: tol=10.0**(-6),eps=10.0**(-6) + + integer :: iir,iit,iip,idi,idj,idk,rdirec,tdirec,pdirec + double precision :: r1,r2,r3,Linf_dif,tpTabldADJ,Hamilton + double precision :: tmpr1,tmpr2,tmpt1,tmpt2 + + ! ####### 网格间距 mesh size ######## + dr = rr(2)-rr(1) + dt = tt(2)-tt(1) + dp = pp(2)-pp(1) + + ! ################# 构造源项 build the sourece term, the delta function ################# + do iir = 1,nr + do iit = 1,nt + do iip= 1,np + delta(iir,iit,iip) = 0 + TableADJ(iir,iit,iip) = 0 + end do + end do + end do + + + + + ! ------- 遍历每个台站,给予delta函数贡献 loop each station to contribute the delta function ------- + do ir=1,Nrec + idi=floor((rrec(ir)-rr(1))/dr+1); + idj=floor((trec(ir)-tt(1))/dt+1); + idk=floor((prec(ir)-pp(1))/dp+1); + + r1 = min(1.0,(rrec(ir)-rr(idi))/dr); + r2 = min(1.0,(trec(ir)-tt(idj))/dt); + r3 = min(1.0,(prec(ir)-pp(idk))/dp); + + delta(idi,idj,idk) = delta(idi,idj,idk) + sourceADJ(ir)*(1-r1)*(1-r2)*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj,idk) = delta(idi+1,idj,idk) + sourceADJ(ir)*r1*(1-r2)*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi,idj+1,idk) = delta(idi,idj+1,idk) + sourceADJ(ir)*(1-r1)*r2*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj+1,idk) = delta(idi+1,idj+1,idk) + sourceADJ(ir)*r1*r2*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi,idj,idk+1) = delta(idi,idj,idk+1) + sourceADJ(ir)*(1-r1)*(1-r2)*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj,idk+1) = delta(idi+1,idj,idk+1) + sourceADJ(ir)*r1*(1-r2)*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi,idj+1,idk+1) = delta(idi,idj+1,idk+1) + sourceADJ(ir)*(1-r1)*r2*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj+1,idk+1) = delta(idi+1,idj+1,idk+1) + sourceADJ(ir)*r1*r2*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + end do + + ! ################# 构造方程系数 calculate coefficients of equations ################# + do iir = 2,nr-1 + do iit = 2,nt-1 + do iip= 2,np-1 + tmpr1 = (rr(iir-1)+rr(iir))/2; tmpt1 = (tt(iit-1)+tt(iit))/2; + tmpr2 = (rr(iir)+rr(iir+1))/2; tmpt2 = (tt(iit)+tt(iit-1))/2; + + a1 = -(1+zeta(iir-1,iit,iip)+zeta(iir,iit,iip))*(Table(iir,iit,iip)-Table(iir-1,iit,iip))/dr + a1m(iir,iit,iip) = (a1-abs(a1))/2; a1p(iir,iit,iip) = (a1+abs(a1))/2; + a2 = -(1+zeta(iir,iit,iip)+zeta(iir+1,iit,iip))*(Table(iir+1,iit,iip)-Table(iir,iit,iip))/dr + a2m(iir,iit,iip) = (a2-abs(a2))/2; a2p(iir,iit,iip) = (a2+abs(a2))/2; + + !b1 = -(1-xi(iir,iit-1,iip)-xi(iir,iit,iip))/(tmpr1**2)*(Table(iir,iit,iip)-Table(iir,iit-1,iip))/dt & + ! & -(eta(iir,iit-1,iip)+eta(iir,iit,iip))/(cos(tmpt1)*tmpr1**2)/(4*dp) & + b1 = -(1-xi(iir,iit-1,iip)-xi(iir,iit,iip))/(rr(iir)**2)*(Table(iir,iit,iip)-Table(iir,iit-1,iip))/dt & + & -(eta(iir,iit-1,iip)+eta(iir,iit,iip))/(cos(tmpt1)*rr(iir)**2)/(4*dp) & + & *((Table(iir,iit-1,iip+1)-Table(iir,iit-1,iip-1))+(Table(iir,iit,iip+1)-Table(iir,iit,iip-1))) + b1m(iir,iit,iip) = (b1-abs(b1))/2; b1p(iir,iit,iip) = (b1+abs(b1))/2; + + !b2 = -(1-xi(iir,iit,iip)-xi(iir,iit+1,iip))/(tmpr2**2)*(Table(iir,iit+1,iip)-Table(iir,iit,iip))/dt & + ! & -(eta(iir,iit,iip)+eta(iir,iit+1,iip))/(cos(tmpt2)*tmpr2**2)/(4*dp) & + b2 = -(1-xi(iir,iit,iip)-xi(iir,iit+1,iip))/(rr(iir)**2)*(Table(iir,iit+1,iip)-Table(iir,iit,iip))/dt & + & -(eta(iir,iit,iip)+eta(iir,iit+1,iip))/(cos(tmpt2)*rr(iir)**2)/(4*dp) & + & *((Table(iir,iit,iip+1)-Table(iir,iit,iip-1))+(Table(iir,iit+1,iip+1)-Table(iir,iit+1,iip-1))) + b2m(iir,iit,iip) = (b2-abs(b2))/2; b2p(iir,iit,iip) = (b2+abs(b2))/2; + + !c1 = -(eta(iir,iit,iip-1)+eta(iir,iit,iip))/(cos(tmpt1)*tmpr1**2)/(4*dt) & + c1 = -(eta(iir,iit,iip-1)+eta(iir,iit,iip))/(cos(tt(iit))*rr(iir)**2)/(4*dt) & + & *((Table(iir,iit+1,iip-1)-Table(iir,iit-1,iip-1))+(Table(iir,iit+1,iip)-Table(iir,iit-1,iip))) & + ! & -(1+xi(iir,iit,iip-1)+xi(iir,iit,iip))/(cos(tmpt1)**2*tmpr1**2)*(Table(iir,iit,iip)-Table(iir,iit,iip-1))/dp + & -(1+xi(iir,iit,iip-1)+xi(iir,iit,iip))/ & + & (cos(tt(iit))**2*rr(iir)**2)*(Table(iir,iit,iip)-Table(iir,iit,iip-1))/dp + c1m(iir,iit,iip) = (c1-abs(c1))/2; c1p(iir,iit,iip) = (c1+abs(c1))/2; + + !c2 = -(eta(iir,iit,iip)+eta(iir,iit,iip+1))/(cos(tmpt2)*tmpr2**2)/(4*dt) & + c2 = -(eta(iir,iit,iip)+eta(iir,iit,iip+1))/(cos(tt(iit))*rr(iir)**2)/(4*dt) & + & *((Table(iir,iit+1,iip)-Table(iir,iit-1,iip))+(Table(iir,iit+1,iip+1)-Table(iir,iit-1,iip+1))) & + ! & -(1+xi(iir,iit,iip)+xi(iir,iit,iip+1))/(cos(tmpt2)**2*tmpr2**2)*(Table(iir,iit,iip+1)-Table(iir,iit,iip))/dp + & -(1+xi(iir,iit,iip)+xi(iir,iit,iip+1)) & + & /(cos(tt(iit))**2*rr(iir)**2)*(Table(iir,iit,iip+1)-Table(iir,iit,iip))/dp + c2m(iir,iit,iip) = (c2-abs(c2))/2; c2p(iir,iit,iip) = (c2+abs(c2))/2; + + end do + end do + end do + + ! ################ 使用FSM计算伴随场 calculate adjoint field by FSM ###################### + + do iter =1,MaxIter + Linf_dif=0; + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + + !x: nr-1 <-> 2, y: nt-1 <-> 2, z: np-1 <-> 2 + do iir=nint(0.5+nr/2.0+(nr/2.0-0.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+0.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-0.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+0.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-0.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+0.5)*pdirec),-pdirec + + if (iir == 1) then + ! bottom boundary + if (isbd(5)) then + if (TableADJ(3,iit,iip)>=0) then + TableADJ(1,iit,iip) = max(0.0,2*TableADJ(2,iit,iip)-TableADJ(3,iit,iip)) + else + TableADJ(1,iit,iip) = min(0.0,2*TableADJ(2,iit,iip)-TableADJ(3,iit,iip)) + end if + else + TableADJ(1,iit,iip) = 0.0 + end if + + elseif (iir == nr) then + ! Top boundary + TableADJ(nr,iit,iip) = 0.0 + + elseif (iit == 1) then + ! south boundary + if (isbd(2)) then + if (TableADJ(iir,3,iip)>=0) then + TableADJ(iir,1,iip) = max(0.0,2*TableADJ(iir,2,iip)-TableADJ(iir,3,iip)) + else + TableADJ(iir,1,iip) = min(0.0,2*TableADJ(iir,2,iip)-TableADJ(iir,3,iip)) + end if + else + TableADJ(iir,1,iip) = 0.0 + end if + + elseif (iit == nt) then + ! north boundary + if (isbd(1)) then + if (TableADJ(iir,nt-2,iip)>=0) then + TableADJ(iir,nt,iip) = max(0.0,2*TableADJ(iir,nt-1,iip)-TableADJ(iir,nt-2,iip)) + else + TableADJ(iir,nt,iip) = min(0.0,2*TableADJ(iir,nt-1,iip)-TableADJ(iir,nt-2,iip)) + end if + else + TableADJ(iir,nt,iip) = 0.0 + end if + + elseif (iip == 1) then + ! west boundary + if (isbd(3)) then + if (TableADJ(iir,iit,3)>=0) then + TableADJ(iir,iit,1) = max(0.0,2*TableADJ(iir,iit,2)-TableADJ(iir,iit,3)) + else + TableADJ(iir,iit,1) = min(0.0,2*TableADJ(iir,iit,2)-TableADJ(iir,iit,3)) + end if + else + TableADJ(iir,iit,1) = 0.0 + end if + elseif (iip == np) then + ! east boundary + if (isbd(4)) then + if (TableADJ(iir,iit,np-2)>=0) then + TableADJ(iir,iit,np) = max(0.0,2*TableADJ(iir,iit,np-1)-TableADJ(iir,iit,np-2)) + else + TableADJ(iir,iit,np) = min(0.0,2*TableADJ(iir,iit,np-1)-TableADJ(iir,iit,np-2)) + end if + else + TableADJ(iir,iit,np) = 0.0 + end if + else + coe = (a2p(iir,iit,iip)-a1m(iir,iit,iip))/dr & + & +(b2p(iir,iit,iip)-b1m(iir,iit,iip))/dt & + & +(c2p(iir,iit,iip)-c1m(iir,iit,iip))/dp + + if (abs(coe)Linf_dif) then + ! print *, iir,iit,iip,tpTableADJ,TableADJ(iir,iit,iip) + !end if + Linf_dif = max(Linf_dif, abs(tpTableADJ-TableADJ(iir,iit,iip))) + + TableADJ(iir,iit,iip) = tpTableADJ + end if + + end if + + end do + end do + end do + + end do + end do + end do + + + + if (abs(Linf_dif) 2, y: nt-1 <-> 2, z: np-1 <-> 2 + do iir=nint(0.5+nr/2.0+(nr/2.0-1.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+1.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-1.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+1.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-1.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+1.5)*pdirec),-pdirec + + if(ischange(iir,iit,iip)==1) then + sigr = 1.0*sqrt(a(iir,iit,iip))*T0v(iir,iit,iip) + sigt = 1.0*sqrt(b(iir,iit,iip))*T0v(iir,iit,iip) + sigp = 1.0*sqrt(c(iir,iit,iip))*T0v(iir,iit,iip) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + ! 构造单方向梯度 3阶 WENO 格式 + + if (iir==2) then + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + wr2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir+1,iit,iip)+tau(iir+2,iit,iip))**2)/ & + & (eps+(tau(iir-1,iit,iip)-2*tau(iir,iit,iip)+tau(iir+1,iit,iip))**2))**2) + pr2=(1-wr2)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr2*(-3*tau(iir,iit,iip)+4*tau(iir+1,iit,iip)-tau(iir+2,iit,iip))/2/dr; + elseif (iir==nr-1) then + wr1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))**2)/ & + & (eps+(tau(iir+1,iit,iip)-2*tau(iir,iit,iip)+tau(iir-1,iit,iip))**2))**2) + pr1=(1-wr1)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr1*(3*tau(iir,iit,iip)-4*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))/2/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + else + wr1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))**2)/ & + & (eps+(tau(iir+1,iit,iip)-2*tau(iir,iit,iip)+tau(iir-1,iit,iip))**2))**2) + pr1=(1.0-wr1)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr1*(3*tau(iir,iit,iip)-4*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))/2/dr; + wr2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir+1,iit,iip)+tau(iir+2,iit,iip))**2)/ & + & (eps+(tau(iir-1,iit,iip)-2*tau(iir,iit,iip)+tau(iir+1,iit,iip))**2))**2) + pr2=(1.0-wr2)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr2*(-3*tau(iir,iit,iip)+4*tau(iir+1,iit,iip)-tau(iir+2,iit,iip))/2/dr; + end if + + if (iit==2) then + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + wt2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit+1,iip)+tau(iir,iit+2,iip))**2)/ & + & (eps+(tau(iir,iit-1,iip)-2*tau(iir,iit,iip)+tau(iir,iit+1,iip))**2))**2) + pt2=(1.0-wt2)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt2*(-3*tau(iir,iit,iip)+4*tau(iir,iit+1,iip)-tau(iir,iit+2,iip))/2/dt; + elseif (iit==nt-1) then + wt1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))**2)/ & + & (eps+(tau(iir,iit+1,iip)-2*tau(iir,iit,iip)+tau(iir,iit-1,iip))**2))**2) + pt1=(1.0-wt1)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt1*(3*tau(iir,iit,iip)-4*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))/2/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + else + wt1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))**2)/ & + & (eps+(tau(iir,iit+1,iip)-2*tau(iir,iit,iip)+tau(iir,iit-1,iip))**2))**2) + pt1=(1.0-wt1)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt1*(3*tau(iir,iit,iip)-4*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))/2/dt; + wt2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit+1,iip)+tau(iir,iit+2,iip))**2)/ & + & (eps+(tau(iir,iit-1,iip)-2*tau(iir,iit,iip)+tau(iir,iit+1,iip))**2))**2) + pt2=(1-wt2)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt2*(-3*tau(iir,iit,iip)+4*tau(iir,iit+1,iip)-tau(iir,iit+2,iip))/2/dt; + end if + + if (iip==2) then + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + wp2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip+1)+tau(iir,iit,iip+2))**2)/ & + & (eps+(tau(iir,iit,iip-1)-2*tau(iir,iit,iip)+tau(iir,iit,iip+1))**2))**2) + pp2=(1.0-wp2)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp2*(-3*tau(iir,iit,iip)+4*tau(iir,iit,iip+1)-tau(iir,iit,iip+2))/2/dp; + elseif (iip==np-1) then + wp1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))**2)/ & + & (eps+(tau(iir,iit,iip+1)-2*tau(iir,iit,iip)+tau(iir,iit,iip-1))**2))**2) + pp1=(1.0-wp1)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp1*(3*tau(iir,iit,iip)-4*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))/2/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + else + wp1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))**2)/ & + & (eps+(tau(iir,iit,iip+1)-2*tau(iir,iit,iip)+tau(iir,iit,iip-1))**2))**2) + pp1=(1.0-wp1)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp1*(3*tau(iir,iit,iip)-4*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))/2/dp; + wp2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip+1)+tau(iir,iit,iip+2))**2)/ & + & (eps+(tau(iir,iit,iip-1)-2*tau(iir,iit,iip)+tau(iir,iit,iip+1))**2))**2) + pp2=(1.0-wp2)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp2*(-3*tau(iir,iit,iip)+4*tau(iir,iit,iip+1)-tau(iir,iit,iip+2))/2/dp; + end if + + !计算 LF Hamiltonian + + Htau = sqrt( & + & a(iir,iit,iip)*(T0r(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pr1+pr2)/2)**2 & + & + b(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2)**2 & + &-2*f(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2) & + & *(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2) ) + + if (isnan(Htau)) then + print *, iir,iit,iip + print *, a(iir,iit,iip)*(T0r(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pr1+pr2)/2)**2 + print *, b(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2)**2 + print *, c(iir,iit,iip)*(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2)**2 + pause + end if + + ! 更新 timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + !write(*,*) fun(iir,iit,iip),Htau + + tau(iir,iit,iip) = tpT + end if + + + end do + end do + end do + + ! 处理边界 + + do iit=1,nt + do iip=1,np + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + end do + end do + do iir=1,nr + do iip=1,np + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + end do + end do + do iir=1,nr + do iit=1,nt + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + end do + end do + + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip)) + end do + end do + end do + + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_err=L1_err+abs(u(iir,iit,iip)-T0v(iir,iit,iip)*tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(T0v(iir,iit,iip)*tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-2)*(nt-2)*(np-2)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (abs(L1_dif) invr(igrid,ii_invr) .and. rr(iir)<=invr(igrid,ii_invr+1)) then + idr = ii_invr + r1 = (rr(iir) - invr(igrid,idr)) / (invr(igrid,idr+1) - invr(igrid,idr)) ! r1=0 -> r=invr(idr); r1=1 -> r=invr(idr+1) + exit + end if + end do + if (r1 < 0) then + cycle ! 如果与反演网格点无关,考察下一个点 if r is out of inversion grid invr, turn to next point + end if + + do iit=1,nt + + r2 = -1 + do ii_invt = 1,ninvt-1 + if (tt(iit)> invt(igrid,ii_invt) .and. tt(iit)<=invt(igrid,ii_invt+1)) then + idt = ii_invt + r2 = (tt(iit) - invt(igrid,idt)) / (invt(igrid,idt+1) - invt(igrid,idt)) ! r2=0 -> t=invt(idt); r2=1 -> t=invt(idt+1) + exit + end if + end do + if (r2 < 0) then + cycle ! 如果与反演网格点无关,考察下一个点 if t is out of inversion grid invt, turn to next point + end if + + do iip=1,np + r3 = -1 + do ii_invp = 1,ninvp-1 + if (pp(iip)> invp(igrid,ii_invp) .and. pp(iip)<=invp(igrid,ii_invp+1)) then + idp = ii_invp + r3 = (pp(iip) - invp(igrid,idp)) / (invp(igrid,idp+1) - invp(igrid,idp)) ! r3=0 -> p=invp(idp); r3=1 -> p=invp(idp+1) + exit + end if + end do + if (r3 < 0) then + cycle ! 如果与反演网格点无关,考察下一个点 if p is out of inversion grid invp, turn to next point + end if + + do iik=1,nk + invkernel(idr,idt,idp,iik) = invkernel(idr,idt,idp,iik) & + & + (1-r1)*(1-r2)*(1-r3)*all_Kernel(iir,iit,iip,iik) + invkernel(idr+1,idt,idp,iik) = invkernel(idr+1,idt,idp,iik) & + & + r1*(1-r2)*(1-r3)*all_Kernel(iir,iit,iip,iik) + invkernel(idr,idt+1,idp,iik) = invkernel(idr,idt+1,idp,iik) & + & + (1-r1)*r2*(1-r3)*all_Kernel(iir,iit,iip,iik) + invkernel(idr+1,idt+1,idp,iik) = invkernel(idr+1,idt+1,idp,iik) & + & + r1*r2*(1-r3)*all_Kernel(iir,iit,iip,iik) + invkernel(idr,idt,idp+1,iik) = invkernel(idr,idt,idp+1,iik) & + & + (1-r1)*(1-r2)*r3*all_Kernel(iir,iit,iip,iik) + invkernel(idr+1,idt,idp+1,iik) = invkernel(idr+1,idt,idp+1,iik) & + & + r1*(1-r2)*r3*all_Kernel(iir,iit,iip,iik) + invkernel(idr,idt+1,idp+1,iik) = invkernel(idr,idt+1,idp+1,iik) & + & + (1-r1)*r2*r3*all_Kernel(iir,iit,iip,iik) + invkernel(idr+1,idt+1,idp+1,iik) = invkernel(idr+1,idt+1,idp+1,iik) & + & + r1*r2*r3*all_Kernel(iir,iit,iip,iik) + end do + + end do + end do + end do + + ! build update value + do iir=1,nr + r1 = -1 + do ii_invr = 1,ninvr-1 + if (rr(iir)> invr(igrid,ii_invr) .and. rr(iir)<=invr(igrid,ii_invr+1)) then + idr = ii_invr + r1 = (rr(iir) - invr(igrid,idr)) / (invr(igrid,idr+1) - invr(igrid,idr)) ! r1=0 -> r=invr(idr); r1=1 -> r=invr(idr+1) + exit + end if + end do + if (r1 < 0) then + cycle ! 如果与反演网格点无关,考察下一个点 if r is out of inversion grid invr, turn to next point + end if + + do iit=1,nt + r2 = -1 + do ii_invt = 1,ninvt-1 + if (tt(iit)> invt(igrid,ii_invt) .and. tt(iit)<=invt(igrid,ii_invt+1)) then + idt = ii_invt + r2 = (tt(iit) - invt(igrid,idt)) / (invt(igrid,idt+1) - invt(igrid,idt)) ! r2=0 -> t=invt(idt); r2=1 -> t=invt(idt+1) + exit + end if + end do + if (r2 < 0) then + cycle ! 如果与反演网格点无关,考察下一个点 if t is out of inversion grid invt, turn to next point + end if + + do iip=1,np + r3 = -1 + do ii_invp = 1,ninvp-1 + if (pp(iip)> invp(igrid,ii_invp) .and. pp(iip)<=invp(igrid,ii_invp+1)) then + idp = ii_invp + r3 = (pp(iip) - invp(igrid,idp)) / (invp(igrid,idp+1) - invp(igrid,idp)) ! r3=0 -> p=invp(idp); r3=1 -> p=invp(idp+1) + exit + end if + end do + if (r3 < 0) then + cycle ! 如果与反演网格点无关,考察下一个点 if p is out of inversion grid invp, turn to next point + end if + + + do iik=1,nk + pert = 0.0 + pert = pert + invkernel(idr,idt,idp,iik)*(1-r1)*(1-r2)*(1-r3) + pert = pert + invkernel(idr+1,idt,idp,iik)*r1*(1-r2)*(1-r3) + pert = pert + invkernel(idr,idt+1,idp,iik)*(1-r1)*r2*(1-r3) + pert = pert + invkernel(idr+1,idt+1,idp,iik)*r1*r2*(1-r3) + pert = pert + invkernel(idr,idt,idp+1,iik)*(1-r1)*(1-r2)*r3 + pert = pert + invkernel(idr+1,idt,idp+1,iik)*r1*(1-r2)*r3 + pert = pert + invkernel(idr,idt+1,idp+1,iik)*(1-r1)*r2*r3 + pert = pert + invkernel(idr+1,idt+1,idp+1,iik)*r1*r2*r3 + para(iir,iit,iip,iik) = para(iir,iit,iip,iik)+pert + end do + + + end do + end do + end do + + + end do + + + ! rescale + Linf = 0.0 + do iir=1,nr + do iit=1,nt + do iip=1,np + do iik=1,nk + if (Linf < abs(para(iir,iit,iip,iik))) then + Linf = abs(para(iir,iit,iip,iik)) + end if + end do + end do + end do + end do + + do iir=1,nr + do iit=1,nt + do iip=1,np + do iik=1,nk + update_value(iir,iit,iip,iik) = para(iir,iit,iip,iik)/Linf*stepsize + end do + end do + end do + end do + +end subroutine + +! ----------------------- end for ega4 ---------------------- + +! 并行版本 +subroutine FSM_WENO3_PS_sphe_3d_mul_mpi(rr,tt,pp,nr,nt,np,spha,sphb,sphc,sphf,T,fun,r0,t0,p0,u) + + use mpi + ! a -d -e + ! -d b -f + ! -e -f c + integer nr,nt,np + double precision :: dr,dt,dp,rr(nr),tt(nt),pp(np),a(nr,nt,np),b(nr,nt,np),c(nr,nt,np),f(nr,nt,np) + double precision :: spha(nr,nt,np),sphb(nr,nt,np),sphc(nr,nt,np),sphf(nr,nt,np) + double precision :: fun(nr,nt,np),T(nr,nt,np),ischange(nr,nt,np),u(nr,nt,np),xi(nr,nt,np),eta(nr,nt,np) + double precision :: r1,r2,r3,a0,b0,c0,d0,f0,T0v(nr,nt,np),T0r(nr,nt,np),T0t(nr,nt,np),T0p(nr,nt,np) + double precision :: tau(nr,nt,np),tau_old(nr,nt,np),r0,t0,p0 + integer :: idr0,idt0,idp0 + double precision :: sigr,sigt,sigp,coe,pr1,pr2,wr1,wr2,pt1,pt2,wt1,wt2,pp1,pp2,wp1,wp2,tpT + double precision :: L1_dif,Linf_dif,L1_err,Linf_err + double precision :: t1,p1 + double precision,parameter :: tol = (10.0)**(-5),eps=10.0**(-12) + integer,parameter :: MaxIter=1000 + integer iter,rdirec,tdirec,pdirec,iir,iit,iip + double precision :: x0,y0,z0,x,y,z,xst,yst,zst,e11,e12,e13,e21,e22,e23,e31,e32,e33 + double precision :: xstr,xstt,xstp,ystr,ystt,ystp,zstr,zstt,zstp + integer :: ileft,iright,jleft,jright,ii,jj,kk + logical :: isexit + + integer :: ierr,myid,nproc,tag,istat(mpi_status_size),iproc,ptid(nr,np,nt) + integer :: mpi_ptijk(3,np*nt),mpi_ptn,ipt,int_temp,my_npt + double precision :: mpi_ptv(np*nt),dp_temp + + integer :: ptr1,ptr2,iNumber,total_ptn,Nptn,sNptn,tpNptn + double precision :: ave_ni + integer,allocatable :: proc_irange(:,:,:) + + + isexit = .false. + tag=99 + call mpi_comm_rank(mpi_comm_world,myid,ierr) + call mpi_comm_size(mpi_comm_world,nproc,ierr) + + + ! ------------------------ 构造网格 ------------------------ + dr=rr(2)-rr(1); dt=tt(2)-tt(1); dp=pp(2)-pp(1) + + ! ------------------------ 构造矩阵 ------------------------- + ! a -d -e + ! -d b -f + ! -e -f c + + ! ------------------------ 构造 T0 ------------------------ + + ! 震源处参数离散化 + idr0=floor((r0-rr(1))/dr+1); idt0=floor((t0-tt(1))/dt+1); idp0=floor((p0-pp(1))/dp+1); + r1 = min(1.0,(r0-rr(idr0))/dr); r2 = min(1.0,(t0-tt(idt0))/dt); r3 = min(1.0,(p0-pp(idp0))/dp); + + do iir=1,nr + do iit=1,nt + do iip=1,np + a(iir,iit,iip) = spha(iir,iit,iip) + b(iir,iit,iip) = sphb(iir,iit,iip)/(rr(iir)**2) + c(iir,iit,iip) = sphc(iir,iit,iip)/(rr(iir)**2*cos(tt(iit))**2) + f(iir,iit,iip) = sphf(iir,iit,iip)/(rr(iir)**2*cos(tt(iit))) + end do + end do + end do + + a0=(1-r1)*(1-r2)*(1-r3)*a(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*a(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*a(idr0,idt0+1,idp0)+(1-r1)*r2*r3*a(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*a(idr0+1,idt0,idp0)+r1*(1-r2)*r3*a(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*a(idr0+1,idt0+1,idp0)+r1*r2*r3*a(idr0+1,idt0+1,idp0+1) + + b0=(1-r1)*(1-r2)*(1-r3)*b(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*b(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*b(idr0,idt0+1,idp0)+(1-r1)*r2*r3*b(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*b(idr0+1,idt0,idp0)+r1*(1-r2)*r3*b(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*b(idr0+1,idt0+1,idp0)+r1*r2*r3*b(idr0+1,idt0+1,idp0+1) + + c0=(1-r1)*(1-r2)*(1-r3)*c(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*c(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*c(idr0,idt0+1,idp0)+(1-r1)*r2*r3*c(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*c(idr0+1,idt0,idp0)+r1*(1-r2)*r3*c(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*c(idr0+1,idt0+1,idp0)+r1*r2*r3*c(idr0+1,idt0+1,idp0+1) + + f0=(1-r1)*(1-r2)*(1-r3)*f(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*f(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*f(idr0,idt0+1,idp0)+(1-r1)*r2*r3*f(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*f(idr0+1,idt0,idp0)+r1*(1-r2)*r3*f(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*f(idr0+1,idt0+1,idp0)+r1*r2*r3*f(idr0+1,idt0+1,idp0+1) + !d0=-d0 + + fun0=(1-r1)*(1-r2)*(1-r3)*fun(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*fun(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*fun(idr0,idt0+1,idp0)+(1-r1)*r2*r3*fun(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*fun(idr0+1,idt0,idp0)+r1*(1-r2)*r3*fun(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*fun(idr0+1,idt0+1,idp0)+r1*r2*r3*fun(idr0+1,idt0+1,idp0+1) + + + + ! 构造T0 + do iir=1,nr + do iit=1,nt + do iip=1,np + r1 = rr(iir) + t1 = tt(iit) + p1 = pp(iip) + + T0v(iir,iit,iip) = fun0*sqrt( 1.0/a0*(r1-r0)**2 + c0/(c0*b0-f0**2)*(t1-t0)**2 & + & + b0/(c0*b0-f0**2)*(p1-p0)**2 + 2*f0/(c0*b0-f0**2)*(t1-t0)*(p1-p0) ) + ischange(iir,iit,iip)=1 + if ( T0v(iir,iit,iip)==0 ) then + T0r(iir,iit,iip) = 0 + T0t(iir,iit,iip) = 0 + T0p(iir,iit,iip) = 0 + else + T0r(iir,iit,iip) = fun0**2*(1.0/a0*(r1-r0))/T0v(iir,iit,iip) + T0t(iir,iit,iip) = fun0**2*(c0/(c0*b0-f0**2)*(t1-t0)+f0/(c0*b0-f0**2)*(p1-p0))/T0v(iir,iit,iip) + T0p(iir,iit,iip) = fun0**2*(b0/(c0*b0-f0**2)*(p1-p0)+f0/(c0*b0-f0**2)*(t1-t0))/T0v(iir,iit,iip) + end if + + + if ( abs((rr(iir)-r0)/dr)<=2 .and. abs((tt(iit)-t0)/dt)<=2 .and. abs((pp(iip)-p0)/dp)<= 2) then + tau(iir,iit,iip) = 1 !震源周围几个点,直接认为是常速度结构,给出解析解,即和T0相等 + !tau(iir,iit,iip) = u(iir,iit,iip) - T0v(iir,iit,iip) + ischange(iir,iit,iip)=0 + if (iir==1 .or. iir==nr .or. iit==1 .or. iit==nt .or. iip==1 .or. iip==np) then + write(*,*) 'source on the boundary, mesh error' + print *, rr(iir),iir,t0*180/3.1415927,iit,p0*180/3.1415927,iip + ! pause + end if + !write(*,*) iir-idr0,iit-idt0,iip-idp0,u(iir,iit,iip),T0v(iir,iit,iip),u(iir,iit,iip)-T0v(iir,iit,iip) + else + !tau(iir,iit,iip) = T(iir,iit,iip)/T0v(iir,iit,iip) + tau(iir,iit,iip) = 1 + ischange(iir,iit,iip)=1 + end if + end do + end do + end do + + L1_err=0; Linf_err=0 + do iir=1,nr + do iit=1,nt + do iip=1,np + L1_err=L1_err+abs(u(iir,iit,iip)-T0v(iir,iit,iip)) + Linf_err=max(Linf_err,abs(T0v(iir,iit,iip)-u(iir,iit,iip))) + if(isnan(L1_err)) then + print *, u(iir,iit,iip),T0v(iir,iit,iip) + pause + end if + end do + end do + end do + L1_err = L1_err/(nr*np*nt) + print *, L1_err + + + allocate(proc_irange(2,nproc,nr+nt+np-3-6+1)) + + ! 给每个线程分配计算点 + Nptn=0 + sNptn=0 + + do level = 6,nr+nt+np-3 + ileft = max(2,level-np-nt+2) + iright = min(level-4,nr-1) + + iNumber = iright - ileft + 1 + + total_ptn = 0 + do ip = ileft,iright + total_ptn = total_ptn+(min(level-ip-2,nt-1)-max(2,level-ip-np+1)+1) + end do + Nptn = Nptn + total_ptn ! 总点数 + ave_ni = total_ptn*1.0/nproc + + if (iNumber <= nproc) then + ! 即i的数量小于等于线程数,每个线程分配一个i就好 + tpNptn = 0 + MaxtpNptn = 0 + do ip = ileft,iright + proc_irange(:,ip-ileft+1,level-5)=(/ip,ip/) + tpNptn = (min(level-ip-2,nt-1)-max(2,level-ip-np+1)+1) + MaxtpNptn = max(MaxtpNptn,tpNptn) + end do + do ip = iright+1,ileft+nproc-1 + proc_irange(:,ip-ileft+1,level-5)=(/-1,-2/) + end do + sNptn = sNptn + MaxtpNptn + else + !if (myid .eq. 0) then + ! print *, ileft,iright + !end if + !call sleep(2) + + ! i的数量大于线程数,平均分配,接近 total_ptn/nproc + int_temp = 0 + tpNptn = 0 + MaxtpNptn = 0 + ptr1 = ileft + iproc = 1 + do ptr2 = ileft,iright + int_temp = int_temp + (min(level-ptr2-2,nt-1)-max(2,level-ptr2-np+1)+1) + tpNptn = tpNptn + (min(level-ptr2-2,nt-1)-max(2,level-ptr2-np+1)+1) + !if (myid .eq. 0) then + ! print *, ptr2,(min(level-ptr2-2,nt-1)-max(2,level-ptr2-np+1)+1),int_temp,ave_ni + !end if + !call sleep(2) + if ((int_temp>=ave_ni*iproc) .or. (ptr2 .eq.iright)) then + !if (iproc>nproc) then + ! print *, iproc,nproc + !end if + proc_irange(:,iproc,level-5) = (/ptr1,ptr2/) + ptr1 = ptr2+1 + iproc = iproc +1 + MaxtpNptn = max(MaxtpNptn,tpNptn) + tpNptn = 0 + end if + end do + sNptn = sNptn + MaxtpNptn + !call sleep(2) + end if + !if (myid .eq. 0) then + ! print *, proc_irange(1,:,level-5) + ! print *, proc_irange(2,:,level-5) + ! print *, ' ' + !end if + end do + + ! print *, Nptn*1.0/sNptn + + + ! 正式迭代,更新tau + do iter =1,MaxIter + tau_old = tau + L1_dif=0; Linf_dif=0;L1_err=0;Linf_err=0; + + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + my_npt = 0 + do level = 6,nr+nt+np-3 + ! 2<= ir <= nr-1; 2<= it <= nr-1; 2<=ip <=np-1 + + ileft = max(2,level-np-nt+2) + iright = min(level-4,nr-1) + + mpi_ptn=0 + do ii = proc_irange(1,myid+1,level-5),proc_irange(2,myid+1,level-5) + + jleft = max(2,level-ii-np+1) + jright = min(level-ii-2,nt-1) + do jj = jleft,jright + + kk = level-ii-jj + + if(rdirec<0) then + iir=ii + else + iir=nr+1-ii + end if + if(tdirec<0) then + iit=jj + else + iit=nt+1-jj + end if + if(pdirec<0) then + iip=kk + else + iip=np+1-kk + end if + + + if(ischange(iir,iit,iip)==1) then + + + !sigr=2*sqrt(a(iir,iit,iip)); sigt=2*sqrt(b(iir,iit,iip)); sigp=2*sqrt(c(iir,iit,iip)) + !coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + sigr = 1.0*sqrt(a(iir,iit,iip))*T0v(iir,iit,iip) + sigt = 1.0*sqrt(b(iir,iit,iip))*T0v(iir,iit,iip) + sigp = 1.0*sqrt(c(iir,iit,iip))*T0v(iir,iit,iip) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + ! 构造单方向梯度 3阶 WENO 格式 + + if (iir==2) then + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + wr2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir+1,iit,iip)+tau(iir+2,iit,iip))**2)/ & + & (eps+(tau(iir-1,iit,iip)-2*tau(iir,iit,iip)+tau(iir+1,iit,iip))**2))**2) + pr2=(1-wr2)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr2*(-3*tau(iir,iit,iip)+4*tau(iir+1,iit,iip)-tau(iir+2,iit,iip))/2/dr; + elseif (iir==nr-1) then + wr1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))**2)/ & + & (eps+(tau(iir+1,iit,iip)-2*tau(iir,iit,iip)+tau(iir-1,iit,iip))**2))**2) + pr1=(1-wr1)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr1*(3*tau(iir,iit,iip)-4*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))/2/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + else + wr1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))**2)/ & + & (eps+(tau(iir+1,iit,iip)-2*tau(iir,iit,iip)+tau(iir-1,iit,iip))**2))**2) + pr1=(1.0-wr1)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr1*(3*tau(iir,iit,iip)-4*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))/2/dr; + wr2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir+1,iit,iip)+tau(iir+2,iit,iip))**2)/ & + & (eps+(tau(iir-1,iit,iip)-2*tau(iir,iit,iip)+tau(iir+1,iit,iip))**2))**2) + pr2=(1.0-wr2)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr2*(-3*tau(iir,iit,iip)+4*tau(iir+1,iit,iip)-tau(iir+2,iit,iip))/2/dr; + end if + + if (iit==2) then + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + wt2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit+1,iip)+tau(iir,iit+2,iip))**2)/ & + & (eps+(tau(iir,iit-1,iip)-2*tau(iir,iit,iip)+tau(iir,iit+1,iip))**2))**2) + pt2=(1-wt2)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt2*(-3*tau(iir,iit,iip)+4*tau(iir,iit+1,iip)-tau(iir,iit+2,iip))/2/dt; + elseif (iit==nt-1) then + wt1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))**2)/ & + & (eps+(tau(iir,iit+1,iip)-2*tau(iir,iit,iip)+tau(iir,iit-1,iip))**2))**2) + pt1=(1-wt1)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt1*(3*tau(iir,iit,iip)-4*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))/2/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + else + wt1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))**2)/ & + & (eps+(tau(iir,iit+1,iip)-2*tau(iir,iit,iip)+tau(iir,iit-1,iip))**2))**2) + pt1=(1-wt1)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt1*(3*tau(iir,iit,iip)-4*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))/2/dt; + wt2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit+1,iip)+tau(iir,iit+2,iip))**2)/ & + & (eps+(tau(iir,iit-1,iip)-2*tau(iir,iit,iip)+tau(iir,iit+1,iip))**2))**2) + pt2=(1-wt2)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt2*(-3*tau(iir,iit,iip)+4*tau(iir,iit+1,iip)-tau(iir,iit+2,iip))/2/dt; + end if + + if (iip==2) then + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + wp2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip+1)+tau(iir,iit,iip+2))**2)/ & + & (eps+(tau(iir,iit,iip-1)-2*tau(iir,iit,iip)+tau(iir,iit,iip+1))**2))**2) + pp2=(1-wp2)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp2*(-3*tau(iir,iit,iip)+4*tau(iir,iit,iip+1)-tau(iir,iit,iip+2))/2/dp; + elseif (iip==np-1) then + wp1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))**2)/ & + & (eps+(tau(iir,iit,iip+1)-2*tau(iir,iit,iip)+tau(iir,iit,iip-1))**2))**2) + pp1=(1-wp1)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp1*(3*tau(iir,iit,iip)-4*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))/2/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + else + wp1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))**2)/ & + & (eps+(tau(iir,iit,iip+1)-2*tau(iir,iit,iip)+tau(iir,iit,iip-1))**2))**2) + pp1=(1-wp1)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp1*(3*tau(iir,iit,iip)-4*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))/2/dp; + wp2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip+1)+tau(iir,iit,iip+2))**2)/ & + & (eps+(tau(iir,iit,iip-1)-2*tau(iir,iit,iip)+tau(iir,iit,iip+1))**2))**2) + pp2=(1-wp2)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp2*(-3*tau(iir,iit,iip)+4*tau(iir,iit,iip+1)-tau(iir,iit,iip+2))/2/dp; + end if + + !计算 LF Hamiltonian + + !Htau=sqrt( a(iir,iit,iip)*((pr1+pr2)/2)**2 + b(iir,iit,iip)*((pt1+pt2)/2)**2 & + !& + c(iir,iit,iip)*((pp1+pp2)/2)**2 -2*f(iir,iit,iip)*(pt1+pt2)/2*(pp1+pp2)/2 & + !& + a(iir,iit,iip)*(pr1+pr2)*T0r(iir,iit,iip) & + !& + b(iir,iit,iip)*(pt1+pt2)*T0t(iir,iit,iip) - f(iir,iit,iip)*(pt1+pt2)*T0p(iir,iit,iip) & + !& + c(iir,iit,iip)*(pp1+pp2)*T0p(iir,iit,iip) - f(iir,iit,iip)*(pp1+pp2)*T0t(iir,iit,iip) & + !& + a(iir,iit,iip)*T0r(iir,iit,iip)**2 & + !& + b(iir,iit,iip)*T0t(iir,iit,iip)**2 + c(iir,iit,iip)*T0p(iir,iit,iip)**2 & + !& - 2*f(iir,iit,iip)*T0t(iir,iit,iip)*T0p(iir,iit,iip) ) + + Htau = sqrt( & + & a(iir,iit,iip)*(T0r(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pr1+pr2)/2)**2 & + & + b(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2)**2 & + &-2*f(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2) & + & *(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2) ) + + + ! 更新 timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + !write(*,*) fun(iir,iit,iip),Htau + + tau(iir,iit,iip) = tpT + + + mpi_ptn=mpi_ptn+1 + mpi_ptijk(:,mpi_ptn) = (/iir,iit,iip/) + mpi_ptv(mpi_ptn) = tpT + my_npt = my_npt + 1 + end if + end do + end do + + !if (1>2) then + ! 数据通信 步骤1, 其他线程传输给主线程 + if (myid .eq. 0) then + ! 负责接受数据 + do iproc=1,nproc-1 + call mpi_recv(int_temp,1,mpi_integer,iproc,tag,mpi_comm_world,istat,ierr) + if (int_temp .ne. 0) then + call mpi_recv(mpi_ptijk(1,mpi_ptn+1),int_temp*3,mpi_integer,iproc,tag+1, & + & mpi_comm_world,istat,ierr) + call mpi_recv(mpi_ptv(mpi_ptn+1),int_temp,mpi_double_precision,iproc,tag+2, & + & mpi_comm_world,istat,ierr) + ! 接收完数据,赋值 + do ipt=mpi_ptn+1,mpi_ptn+int_temp + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + mpi_ptn = mpi_ptn + int_temp + end if + end do + else + ! 负责发送数据 + call mpi_send(mpi_ptn,1,mpi_integer,0,tag,mpi_comm_world,ierr) + !print *, mpi_ptn, mpi_ptijk(:,1:mpi_ptn), mpi_ptv(1:mpi_ptn) + if (mpi_ptn .ne. 0) then + call mpi_send(mpi_ptijk,3*mpi_ptn,mpi_integer,0,tag+1,mpi_comm_world,ierr) + call mpi_send(mpi_ptv,mpi_ptn,mpi_double_precision,0,tag+2,mpi_comm_world,ierr) + end if + end if + + ! 数据通信 步骤2, 主线程将更新后的level数据广播到其他线程 + + call mpi_bcast(mpi_ptn,1,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptijk,3*mpi_ptn,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptv,mpi_ptn,mpi_double_precision,0,mpi_comm_world,ierr) + + ! 数据广播完成,开始赋值 + if (myid .ne. 0) then + do ipt=1,mpi_ptn + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + end if + + call mpi_barrier(mpi_comm_world,ierr) + !end if + end do + + ! print *, my_npt, Nptn + + ! 处理边界 + + do iit=1,nt + do iip=1,np + if (tau(3,iit,iip)>0) then + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + else + tau(1,iit,iip) = min(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + end if + if (tau(nr-2,iit,iip)>0) then + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + else + tau(nr,iit,iip) = min(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + end if + end do + end do + do iir=1,nr + do iip=1,np + if (tau(iir,3,iip)>0) then + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + else + tau(iir,1,iip) = min(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + end if + if (tau(iir,nt-2,iip)>0) then + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + else + tau(iir,nt,iip) = min(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + end if + end do + end do + do iir=1,nr + do iit=1,nt + if (tau(iir,iit,3)>0) then + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + else + tau(iir,iit,1) = min(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + end if + if (tau(iir,iit,np-2)>0) then + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + else + tau(iir,iit,np) = min(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + end if + end do + end do + + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip)) + end do + end do + end do + + do iir=3,nr-2 + do iit=3,nt-2 + do iip=3,np-2 + L1_err=L1_err+abs(u(iir,iit,iip)-T0v(iir,iit,iip)*tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(T0v(iir,iit,iip)*tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-4)*(nt-4)*(np-4)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (myid .eq. 0) then + ! ################ iteration information ################# + if (abs(L1_dif)=ave_ni*iproc) .or. (ptr2 .eq.iright)) then + !if (iproc>nproc) then + ! print *, iproc,nproc + !end if + proc_irange(:,iproc,level-5) = (/ptr1,ptr2/) + ptr1 = ptr2+1 + iproc = iproc +1 + MaxtpNptn = max(MaxtpNptn,tpNptn) + tpNptn = 0 + end if + end do + sNptn = sNptn + MaxtpNptn + !call sleep(2) + end if + !if (myid .eq. 0) then + ! print *, proc_irange(1,:,level-5) + ! print *, proc_irange(2,:,level-5) + ! print *, ' ' + !end if + end do + + ! print *, Nptn*1.0/sNptn + + + ! 正式迭代,更新tau + do iter =1,MaxIter + tau_old = tau + L1_dif=0; Linf_dif=0;L1_err=0;Linf_err=0; + + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + my_npt = 0 + do level = 6,nr+nt+np-3 + ! 2<= ir <= nr-1; 2<= it <= nr-1; 2<=ip <=np-1 + + ileft = max(2,level-np-nt+2) + iright = min(level-4,nr-1) + + mpi_ptn=0 + do ii = proc_irange(1,myid+1,level-5),proc_irange(2,myid+1,level-5) + + jleft = max(2,level-ii-np+1) + jright = min(level-ii-2,nt-1) + do jj = jleft,jright + + kk = level-ii-jj + + if(rdirec<0) then + iir=ii + else + iir=nr+1-ii + end if + if(tdirec<0) then + iit=jj + else + iit=nt+1-jj + end if + if(pdirec<0) then + iip=kk + else + iip=np+1-kk + end if + + + if(ischange(iir,iit,iip)==1) then + + + !sigr=2*sqrt(a(iir,iit,iip)); sigt=2*sqrt(b(iir,iit,iip)); sigp=2*sqrt(c(iir,iit,iip)) + !coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + sigr = 2*sqrt(a(iir,iit,iip))*T0v(iir,iit,iip) + sigt = 2*sqrt(b(iir,iit,iip))*T0v(iir,iit,iip) + sigp = 2*sqrt(c(iir,iit,iip))*T0v(iir,iit,iip) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + ! 构造单方向梯度 1 阶格式 + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + + !计算 LF Hamiltonian + + ! additive + !Htau=sqrt( a(iir,iit,iip)*((pr1+pr2)/2)**2 + b(iir,iit,iip)*((pt1+pt2)/2)**2 & + !& + c(iir,iit,iip)*((pp1+pp2)/2)**2 -2*f(iir,iit,iip)*(pt1+pt2)/2*(pp1+pp2)/2 & + !& + a(iir,iit,iip)*(pr1+pr2)*T0r(iir,iit,iip) & + !& + b(iir,iit,iip)*(pt1+pt2)*T0t(iir,iit,iip) - f(iir,iit,iip)*(pt1+pt2)*T0p(iir,iit,iip) & + !& + c(iir,iit,iip)*(pp1+pp2)*T0p(iir,iit,iip) - f(iir,iit,iip)*(pp1+pp2)*T0t(iir,iit,iip) & + !& + a(iir,iit,iip)*T0r(iir,iit,iip)**2 & + !& + b(iir,iit,iip)*T0t(iir,iit,iip)**2 + c(iir,iit,iip)*T0p(iir,iit,iip)**2 & + !& - 2*f(iir,iit,iip)*T0t(iir,iit,iip)*T0p(iir,iit,iip) ) + + ! multiplicative + Htau = sqrt( & + & a(iir,iit,iip)*(T0r(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pr1+pr2)/2)**2 & + & + b(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2)**2 & + &-2*f(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2) & + & *(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2) ) + + + ! 更新 timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + !write(*,*) fun(iir,iit,iip),Htau + + tau(iir,iit,iip) = tpT + + + mpi_ptn=mpi_ptn+1 + mpi_ptijk(:,mpi_ptn) = (/iir,iit,iip/) + mpi_ptv(mpi_ptn) = tpT + my_npt = my_npt + 1 + end if + end do + end do + + !if (1>2) then + ! 数据通信 步骤1, 其他线程传输给主线程 + if (myid .eq. 0) then + ! 负责接受数据 + do iproc=1,nproc-1 + call mpi_recv(int_temp,1,mpi_integer,iproc,tag,mpi_comm_world,istat,ierr) + if (int_temp .ne. 0) then + call mpi_recv(mpi_ptijk(1,mpi_ptn+1),int_temp*3,mpi_integer,iproc,tag+1, & + & mpi_comm_world,istat,ierr) + call mpi_recv(mpi_ptv(mpi_ptn+1),int_temp,mpi_double_precision,iproc,tag+2, & + & mpi_comm_world,istat,ierr) + ! 接收完数据,赋值 + do ipt=mpi_ptn+1,mpi_ptn+int_temp + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + mpi_ptn = mpi_ptn + int_temp + end if + end do + else + ! 负责发送数据 + call mpi_send(mpi_ptn,1,mpi_integer,0,tag,mpi_comm_world,ierr) + !print *, mpi_ptn, mpi_ptijk(:,1:mpi_ptn), mpi_ptv(1:mpi_ptn) + if (mpi_ptn .ne. 0) then + call mpi_send(mpi_ptijk,3*mpi_ptn,mpi_integer,0,tag+1,mpi_comm_world,ierr) + call mpi_send(mpi_ptv,mpi_ptn,mpi_double_precision,0,tag+2,mpi_comm_world,ierr) + end if + end if + + ! 数据通信 步骤2, 主线程将更新后的level数据广播到其他线程 + + call mpi_bcast(mpi_ptn,1,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptijk,3*mpi_ptn,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptv,mpi_ptn,mpi_double_precision,0,mpi_comm_world,ierr) + + ! 数据广播完成,开始赋值 + if (myid .ne. 0) then + do ipt=1,mpi_ptn + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + end if + + call mpi_barrier(mpi_comm_world,ierr) + !end if + end do + + ! print *, my_npt, Nptn + + ! 处理边界 + + do iit=1,nt + do iip=1,np + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + end do + end do + do iir=1,nr + do iip=1,np + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + end do + end do + do iir=1,nr + do iit=1,nt + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + end do + end do + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip)) + end do + end do + end do + + do iir=3,nr-2 + do iit=3,nt-2 + do iip=3,np-2 + L1_err=L1_err+abs(u(iir,iit,iip)-T0v(iir,iit,iip)*tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(T0v(iir,iit,iip)*tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-4)*(nt-4)*(np-4)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (myid .eq. 0) then + ! ################ iteration information ################# + if (abs(L1_dif)=ave_ni*iproc) .or. (ptr2 .eq.iright)) then + + proc_irange(:,iproc,level-5) = (/ptr1,ptr2/) + ptr1 = ptr2+1 + iproc = iproc +1 + MaxtpNptn = max(MaxtpNptn,tpNptn) + tpNptn = 0 + end if + end do + sNptn = sNptn + MaxtpNptn + end if + end do + + ! print *, Nptn*1.0/sNptn + + + ! 正式迭代,更新tau + do iter =1,MaxIter + tau_old = tau + L1_dif=0; Linf_dif=0;L1_err=0;Linf_err=0; + + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + my_npt = 0 + do level = 6,nr+nt+np-3 + ! 2<= ir <= nr-1; 2<= it <= nr-1; 2<=ip <=np-1 + + ileft = max(2,level-np-nt+2) + iright = min(level-4,nr-1) + + mpi_ptn=0 + do ii = proc_irange(1,myid+1,level-5),proc_irange(2,myid+1,level-5) + + jleft = max(2,level-ii-np+1) + jright = min(level-ii-2,nt-1) + do jj = jleft,jright + + kk = level-ii-jj + + if(rdirec<0) then + iir=ii + else + iir=nr+1-ii + end if + if(tdirec<0) then + iit=jj + else + iit=nt+1-jj + end if + if(pdirec<0) then + iip=kk + else + iip=np+1-kk + end if + + + if(ischange(iir,iit,iip)==1) then + + + !sigr=2*sqrt(a(iir,iit,iip)); sigt=2*sqrt(b(iir,iit,iip)); sigp=2*sqrt(c(iir,iit,iip)) + !coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + sigr = sqrt(a(iir,iit,iip)) + sigt = sqrt(b(iir,iit,iip)) + sigp = sqrt(c(iir,iit,iip)) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + ! partial derivatives + + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + + !计算 LF Hamiltonian + + Htau=sqrt( a(iir,iit,iip)*((pr1+pr2)/2)**2 + b(iir,iit,iip)*((pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*((pp1+pp2)/2)**2 -2*f(iir,iit,iip)*(pt1+pt2)/2*(pp1+pp2)/2) + + ! 更新 update timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + tau(iir,iit,iip) = tpT + + + mpi_ptn=mpi_ptn+1 + mpi_ptijk(:,mpi_ptn) = (/iir,iit,iip/) + mpi_ptv(mpi_ptn) = tpT + my_npt = my_npt + 1 + end if + end do + end do + + !if (1>2) then + ! 数据通信 步骤1, 其他线程传输给主线程 + if (myid .eq. 0) then + ! 负责接受数据 + do iproc=1,nproc-1 + call mpi_recv(int_temp,1,mpi_integer,iproc,tag,mpi_comm_world,istat,ierr) + if (int_temp .ne. 0) then + call mpi_recv(mpi_ptijk(1,mpi_ptn+1),int_temp*3,mpi_integer,iproc,tag+1, & + & mpi_comm_world,istat,ierr) + call mpi_recv(mpi_ptv(mpi_ptn+1),int_temp,mpi_double_precision,iproc,tag+2, & + & mpi_comm_world,istat,ierr) + ! 接收完数据,赋值 + do ipt=mpi_ptn+1,mpi_ptn+int_temp + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + mpi_ptn = mpi_ptn + int_temp + end if + end do + else + ! 负责发送数据 + call mpi_send(mpi_ptn,1,mpi_integer,0,tag,mpi_comm_world,ierr) + !print *, mpi_ptn, mpi_ptijk(:,1:mpi_ptn), mpi_ptv(1:mpi_ptn) + if (mpi_ptn .ne. 0) then + call mpi_send(mpi_ptijk,3*mpi_ptn,mpi_integer,0,tag+1,mpi_comm_world,ierr) + call mpi_send(mpi_ptv,mpi_ptn,mpi_double_precision,0,tag+2,mpi_comm_world,ierr) + end if + end if + + ! 数据通信 步骤2, 主线程将更新后的level数据广播到其他线程 + + call mpi_bcast(mpi_ptn,1,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptijk,3*mpi_ptn,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptv,mpi_ptn,mpi_double_precision,0,mpi_comm_world,ierr) + + ! 数据广播完成,开始赋值 + if (myid .ne. 0) then + do ipt=1,mpi_ptn + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + end if + + call mpi_barrier(mpi_comm_world,ierr) + !end if + end do + + ! print *, my_npt, Nptn + + ! 处理边界 + + do iit=2,nt-1 + do iip=2,np-1 + if (tau(3,iit,iip)>0) then + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + else + tau(1,iit,iip) = min(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + end if + if (tau(nr-2,iit,iip)>0) then + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + else + tau(nr,iit,iip) = min(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + end if + end do + end do + do iir=2,nr-1 + do iip=2,np-1 + if (tau(iir,3,iip)>0) then + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + else + tau(iir,1,iip) = min(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + end if + if (tau(iir,nt-2,iip)>0) then + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + else + tau(iir,nt,iip) = min(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + end if + end do + end do + do iir=2,nr-1 + do iit=2,nt-1 + if (tau(iir,iit,3)>0) then + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + else + tau(iir,iit,1) = min(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + end if + if (tau(iir,iit,np-2)>0) then + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + else + tau(iir,iit,np) = min(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + end if + end do + end do + + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip)) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))) + end do + end do + end do + + do iir=3,nr-2 + do iit=3,nt-2 + do iip=3,np-2 + L1_err=L1_err+abs(u(iir,iit,iip)-tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-4)*(nt-4)*(np-4)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (myid .eq. 0) then + ! ################ iteration information ################# + if (abs(L1_dif) 2, y: nt-1 <-> 2, z: np-1 <-> 2 + + do iir=nint(0.5+nr/2.0+(nr/2.0-1.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+1.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-1.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+1.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-1.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+1.5)*pdirec),-pdirec + + if(ischange(iir,iit,iip)==1) then + sigr=sqrt(a(iir,iit,iip)); sigt=sqrt(b(iir,iit,iip)); sigp=sqrt(c(iir,iit,iip)) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + ! forward and backward partial derivatives + + + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + + + ! calculate LF Hamiltonian + + Htau=sqrt( a(iir,iit,iip)*((pr1+pr2)/2)**2 + b(iir,iit,iip)*((pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*((pp1+pp2)/2)**2 -2*f(iir,iit,iip)*(pt1+pt2)/2*(pp1+pp2)/2 ) + + ! 更新 update timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + !write(*,*) fun(iir,iit,iip),Htau + + if (tpT < tau(iir,iit,iip)) then + tau(iir,iit,iip) = tpT + end if + + end if + + + end do + end do + end do + + ! boundary + + do iit=1,nt + do iip=1,np + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + end do + end do + do iir=1,nr + do iip=1,np + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + end do + end do + do iir=1,nr + do iit=1,nt + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + end do + end do + + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip)) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))) + end do + end do + end do + + do iir=3,nr-2 + do iit=3,nt-2 + do iip=3,np-2 + L1_err=L1_err+abs(u(iir,iit,iip)-tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-4)*(nt-4)*(np-4)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (myid .eq. 0) then + ! ################ iteration information ################# + if (abs(L1_dif)x0 ) then + idx0=iix + exit + end if + end do + do iiy=1,ny-1 + if (yy(iiy)<= y0 .and. yy(iiy+1)>y0 ) then + idy0=iiy + exit + end if + end do + do iiy=1,ny-1 + if (zz(iiz)<= z0 .and. zz(iiz+1)>z0 ) then + idz0=iiz + exit + end if + end do + + if (idx0<=0 .or. idy0<0 .or. idz0<0) then + write(*,*) 'point out of the mesh' + pause + return + end if + + dx = xx(idx0+1)-xx(idx0) + dy = yy(idy0+1)-yy(idy0) + dz = zz(idz0+1)-zz(idz0) + + r1 = min(1.0, (x0-xx(idx0))/dx ) + r2 = min(1.0, (y0-yy(idy0))/dy ) + r3 = min(1.0, (z0-zz(idz0))/dz ) + + v0 = (1-r1)*(1-r2)*(1-r3)*val(idx0,idy0,idz0) + (1-r1)*(1-r2)*r3*val(idx0,idy0,idz0+1) & + & + (1-r1)*r2*(1-r3)*val(idx0,idy0+1,idz0) + (1-r1)*r2*r3*val(idx0,idy0+1,idz0+1) & + & + r1*(1-r2)*(1-r3)*val(idx0+1,idy0,idz0) + r1*(1-r2)*r3*val(idx0+1,idy0,idz0+1) & + & + r1*r2*(1-r3)*val(idx0+1,idy0+1,idz0) + r1*r2*r3*val(idx0+1,idy0+1,idz0+1) +end subroutine + +! 3-D interpolation uniform mesh +subroutine Linear_Interp_3D(xx,yy,zz,val,nx,ny,nz,x0,y0,z0,v0) + integer :: nx,ny,nz,idx0,idy0,idz0 + double precision :: xx(nx),yy(ny),zz(nz),val(nx,ny,nz),x0,y0,z0,v0,dx,dy,dz + double precision :: r1,r2,r3 + integer :: iix,iiy,iiz + + dx = xx(2)-xx(1) + dy = yy(2)-yy(1) + dz = zz(2)-zz(1) + + idx0 = floor((x0-xx(1))/dx)+1 + idy0 = floor((y0-yy(1))/dy)+1 + idz0 = floor((z0-zz(1))/dz)+1 + + if (idx0<1 .or. idx0>nx-1 .or. idy0<1 .or. idy0>ny-1 .or. idz0<1 .or. idz0>nz-1) then + write(*,*) 'point out of the mesh' + pause + return + end if + + r1 = min(1.0, (x0-xx(idx0))/dx ) + r2 = min(1.0, (y0-yy(idy0))/dy ) + r3 = min(1.0, (z0-zz(idz0))/dz ) + + v0 = (1-r1)*(1-r2)*(1-r3)*val(idx0,idy0,idz0) + (1-r1)*(1-r2)*r3*val(idx0,idy0,idz0+1) & + & + (1-r1)*r2*(1-r3)*val(idx0,idy0+1,idz0) + (1-r1)*r2*r3*val(idx0,idy0+1,idz0+1) & + & + r1*(1-r2)*(1-r3)*val(idx0+1,idy0,idz0) + r1*(1-r2)*r3*val(idx0+1,idy0,idz0+1) & + & + r1*r2*(1-r3)*val(idx0+1,idy0+1,idz0) + r1*r2*r3*val(idx0+1,idy0+1,idz0+1) + +end subroutine + +subroutine FSM_O1_Adj_sphe_3d(rr,tt,pp,nr,nt,np,Table,TableADJ,zeta,xi,eta,Nrec,rrec,trec,prec,sourceADJ) + + integer :: nr,nt,np,Nrec + double precision :: dr,dt,dp,rr(nr),tt(nt),pp(np) + double precision :: Table(nr,nt,np),TableADJ(nr,nt,np),delta(nr,nt,np) + double precision :: zeta(nr,nt,np),xi(nr,nt,np),eta(nr,nt,np) + double precision :: rrec(Nrec),trec(Nrec),prec(Nrec),sourceADJ(Nrec) + double precision :: a1,a1m(nr,nt,np),a1p(nr,nt,np),a2,a2m(nr,nt,np),a2p(nr,nt,np) + double precision :: b1,b1m(nr,nt,np),b1p(nr,nt,np),b2,b2m(nr,nt,np),b2p(nr,nt,np) + double precision :: c1,c1m(nr,nt,np),c1p(nr,nt,np),c2,c2m(nr,nt,np),c2p(nr,nt,np) + double precision :: coe + + integer,parameter :: MaxIter=100 + double precision,parameter :: tol=10.0**(-6),eps=10.0**(-6) + + integer :: iir,iit,iip,idi,idj,idk,rdirec,tdirec,pdirec + double precision :: r1,r2,r3,Linf_dif,tpTabldADJ,Hamilton + double precision :: tmpr1,tmpr2,tmpt1,tmpt2 + + ! ####### 网格间距 mesh size ######## + dr = rr(2)-rr(1) + dt = tt(2)-tt(1) + dp = pp(2)-pp(1) + + ! ################# 构造源项 build the sourece term, the delta function ################# + do iir = 1,nr + do iit = 1,nt + do iip= 1,np + delta(iir,iit,iip) = 0 + TableADJ(iir,iit,iip) = 0 + end do + end do + end do + + ! ------- 遍历每个台站,给予delta函数贡献 loop each station to contribute the delta function ------- + do ir=1,Nrec + idi=floor((rrec(ir)-rr(1))/dr+1); + idj=floor((trec(ir)-tt(1))/dt+1); + idk=floor((prec(ir)-pp(1))/dp+1); + + r1 = min(1.0,(rrec(ir)-rr(idi))/dr); + r2 = min(1.0,(trec(ir)-tt(idj))/dt); + r3 = min(1.0,(prec(ir)-pp(idk))/dp); + + delta(idi,idj,idk) = delta(idi,idj,idk) + sourceADJ(ir)*(1-r1)*(1-r2)*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj,idk) = delta(idi+1,idj,idk) + sourceADJ(ir)*r1*(1-r2)*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi,idj+1,idk) = delta(idi,idj+1,idk) + sourceADJ(ir)*(1-r1)*r2*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj+1,idk) = delta(idi+1,idj+1,idk) + sourceADJ(ir)*r1*r2*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi,idj,idk+1) = delta(idi,idj,idk+1) + sourceADJ(ir)*(1-r1)*(1-r2)*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj,idk+1) = delta(idi+1,idj,idk+1) + sourceADJ(ir)*r1*(1-r2)*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi,idj+1,idk+1) = delta(idi,idj+1,idk+1) + sourceADJ(ir)*(1-r1)*r2*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj+1,idk+1) = delta(idi+1,idj+1,idk+1) + sourceADJ(ir)*r1*r2*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + !print *, delta(idi,idj,idk),delta(idi+1,idj+1,idk+1) + end do + + ! ################# 构造方程系数 calculate coefficients of equations ################# + do iir = 2,nr-1 + do iit = 2,nt-1 + do iip= 2,np-1 + tmpr1 = (rr(iir-1)+rr(iir))/2; tmpt1 = (tt(iit-1)+tt(iit))/2; + tmpr2 = (rr(iir)+rr(iir+1))/2; tmpt2 = (tt(iit)+tt(iit-1))/2; + + a1 = -(1+zeta(iir-1,iit,iip)+zeta(iir,iit,iip))*(Table(iir,iit,iip)-Table(iir-1,iit,iip))/dr + a1m(iir,iit,iip) = (a1-abs(a1))/2; a1p(iir,iit,iip) = (a1+abs(a1))/2; + a2 = -(1+zeta(iir,iit,iip)+zeta(iir+1,iit,iip))*(Table(iir+1,iit,iip)-Table(iir,iit,iip))/dr + a2m(iir,iit,iip) = (a2-abs(a2))/2; a2p(iir,iit,iip) = (a2+abs(a2))/2; + + !b1 = -(1-xi(iir,iit-1,iip)-xi(iir,iit,iip))/(tmpr1**2)*(Table(iir,iit,iip)-Table(iir,iit-1,iip))/dt & + ! & -(eta(iir,iit-1,iip)+eta(iir,iit,iip))/(cos(tmpt1)*tmpr1**2)/(4*dp) & + b1 = -(1-xi(iir,iit-1,iip)-xi(iir,iit,iip))/(rr(iir)**2)*(Table(iir,iit,iip)-Table(iir,iit-1,iip))/dt & + & -(eta(iir,iit-1,iip)+eta(iir,iit,iip))/(cos(tmpt1)*rr(iir)**2)/(4*dp) & + & *((Table(iir,iit-1,iip+1)-Table(iir,iit-1,iip-1))+(Table(iir,iit,iip+1)-Table(iir,iit,iip-1))) + b1m(iir,iit,iip) = (b1-abs(b1))/2; b1p(iir,iit,iip) = (b1+abs(b1))/2; + + !b2 = -(1-xi(iir,iit,iip)-xi(iir,iit+1,iip))/(tmpr2**2)*(Table(iir,iit+1,iip)-Table(iir,iit,iip))/dt & + ! & -(eta(iir,iit,iip)+eta(iir,iit+1,iip))/(cos(tmpt2)*tmpr2**2)/(4*dp) & + b2 = -(1-xi(iir,iit,iip)-xi(iir,iit+1,iip))/(rr(iir)**2)*(Table(iir,iit+1,iip)-Table(iir,iit,iip))/dt & + & -(eta(iir,iit,iip)+eta(iir,iit+1,iip))/(cos(tmpt2)*rr(iir)**2)/(4*dp) & + & *((Table(iir,iit,iip+1)-Table(iir,iit,iip-1))+(Table(iir,iit+1,iip+1)-Table(iir,iit+1,iip-1))) + b2m(iir,iit,iip) = (b2-abs(b2))/2; b2p(iir,iit,iip) = (b2+abs(b2))/2; + + !c1 = -(eta(iir,iit,iip-1)+eta(iir,iit,iip))/(cos(tmpt1)*tmpr1**2)/(4*dt) & + c1 = -(eta(iir,iit,iip-1)+eta(iir,iit,iip))/(cos(tt(iit))*rr(iir)**2)/(4*dt) & + & *((Table(iir,iit+1,iip-1)-Table(iir,iit-1,iip-1))+(Table(iir,iit+1,iip)-Table(iir,iit-1,iip))) & + ! & -(1+xi(iir,iit,iip-1)+xi(iir,iit,iip))/(cos(tmpt1)**2*tmpr1**2)*(Table(iir,iit,iip)-Table(iir,iit,iip-1))/dp + & -(1+xi(iir,iit,iip-1)+xi(iir,iit,iip))/ & + & (cos(tt(iit))**2*rr(iir)**2)*(Table(iir,iit,iip)-Table(iir,iit,iip-1))/dp + c1m(iir,iit,iip) = (c1-abs(c1))/2; c1p(iir,iit,iip) = (c1+abs(c1))/2; + + !c2 = -(eta(iir,iit,iip)+eta(iir,iit,iip+1))/(cos(tmpt2)*tmpr2**2)/(4*dt) & + c2 = -(eta(iir,iit,iip)+eta(iir,iit,iip+1))/(cos(tt(iit))*rr(iir)**2)/(4*dt) & + & *((Table(iir,iit+1,iip)-Table(iir,iit-1,iip))+(Table(iir,iit+1,iip+1)-Table(iir,iit-1,iip+1))) & + ! & -(1+xi(iir,iit,iip)+xi(iir,iit,iip+1))/(cos(tmpt2)**2*tmpr2**2)*(Table(iir,iit,iip+1)-Table(iir,iit,iip))/dp + & -(1+xi(iir,iit,iip)+xi(iir,iit,iip+1)) & + & /(cos(tt(iit))**2*rr(iir)**2)*(Table(iir,iit,iip+1)-Table(iir,iit,iip))/dp + c2m(iir,iit,iip) = (c2-abs(c2))/2; c2p(iir,iit,iip) = (c2+abs(c2))/2; + + end do + end do + end do + + + ! ################# 固定伴随场边界条件 fix the boundary of the adjoint field ###################### + ! -------- R,Theta boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(iir,iit,1) = 0 + TableADJ(iir,iit,np) = 0 + end do + end do + ! -------- R,Phi boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(iir,1,iip) = 0 + TableADJ(iir,nt,iip) = 0 + end do + end do + ! -------- Theta,Phi boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(1,iit,iip) = 0 + TableADJ(nr,iit,iip) = 0 + end do + end do + + + + + ! ################ 使用FSM计算伴随场 calculate adjoint field by FSM ###################### + + do iter =1,MaxIter + Linf_dif=0; + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + + !x: nr-1 <-> 2, y: nt-1 <-> 2, z: np-1 <-> 2 + do iir=nint(0.5+nr/2.0+(nr/2.0-1.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+1.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-1.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+1.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-1.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+1.5)*pdirec),-pdirec + + + coe = (a2p(iir,iit,iip)-a1m(iir,iit,iip))/dr & + & +(b2p(iir,iit,iip)-b1m(iir,iit,iip))/dt & + & +(c2p(iir,iit,iip)-c1m(iir,iit,iip))/dp + + if (abs(coe)Linf_dif) then + ! print *, iir,iit,iip,tpTableADJ,TableADJ(iir,iit,iip) + !end if + Linf_dif = max(Linf_dif, abs(tpTableADJ-TableADJ(iir,iit,iip))) + + TableADJ(iir,iit,iip) = tpTableADJ + end if + + end do + end do + end do + + end do + end do + end do + + + + if (abs(Linf_dif) r1+(iir+0.5)*dr, t1+iit*dt, p1+iip*dp + a0 = T0para(1); b0 = T0para(2); c0 = T0para(3); f0 = T0para(4); fun0 = T0para(5); + r0 = T0para(6); t0 = T0para(7); p0 = T0para(8); + + do iir=1,nr-1 + do iit=1,nt + do iip=1,np + r1 = rr(iir)+0.5*dr; t1 = tt(iit); p1 = pp(iip) + T0v_hr(iir,iit,iip) = fun0*sqrt( 1.0/a0*(r1-r0)**2 + c0/(c0*b0-f0**2)*(t1-t0)**2 & + & + b0/(c0*b0-f0**2)*(p1-p0)**2 + 2*f0/(c0*b0-f0**2)*(t1-t0)*(p1-p0) ) + if ( T0v_hr(iir,iit,iip)==0 ) then + T0r_hr(iir,iit,iip) = 0 + else + T0r_hr(iir,iit,iip) = fun0**2*(1.0/a0*(r1-r0))/T0v_hr(iir,iit,iip) + end if + end do + end do + end do + ! 构造T0_ht iir,iit,iip -> r1+iir*dr, t1+(iit+0.5)*dt, p1+iip*dp + do iir=1,nr + do iit=1,nt-1 + do iip=1,np + r1 = rr(iir); t1 = tt(iit)+0.5*dt; p1 = pp(iip) + T0v_ht(iir,iit,iip) = fun0*sqrt( 1.0/a0*(r1-r0)**2 + c0/(c0*b0-f0**2)*(t1-t0)**2 & + & + b0/(c0*b0-f0**2)*(p1-p0)**2 + 2*f0/(c0*b0-f0**2)*(t1-t0)*(p1-p0) ) + if ( T0v_ht(iir,iit,iip)==0 ) then + T0t_ht(iir,iit,iip) = 0 + T0p_ht(iir,iit,iip) = 0 + else + T0t_ht(iir,iit,iip) = fun0**2*(c0/(c0*b0-f0**2)*(t1-t0)+f0/(c0*b0-f0**2)*(p1-p0))/T0v_ht(iir,iit,iip) + T0p_ht(iir,iit,iip) = fun0**2*(b0/(c0*b0-f0**2)*(p1-p0)+f0/(c0*b0-f0**2)*(t1-t0))/T0v_ht(iir,iit,iip) + end if + end do + end do + end do + ! 构造T0_hp iir,iit,iip -> r1+iir*dr, t1+iit*dt, p1+(iip+0.5)*dp + do iir=1,nr + do iit=1,nt + do iip=1,np-1 + r1 = rr(iir); t1 = tt(iit); p1 = pp(iip)+0.5*dp + T0v_hp(iir,iit,iip) = fun0*sqrt( 1.0/a0*(r1-r0)**2 + c0/(c0*b0-f0**2)*(t1-t0)**2 & + & + b0/(c0*b0-f0**2)*(p1-p0)**2 + 2*f0/(c0*b0-f0**2)*(t1-t0)*(p1-p0) ) + if ( T0v_hp(iir,iit,iip)==0 ) then + T0t_hp(iir,iit,iip) = 0 + T0p_hp(iir,iit,iip) = 0 + else + T0t_hp(iir,iit,iip) = fun0**2*(c0/(c0*b0-f0**2)*(t1-t0)+f0/(c0*b0-f0**2)*(p1-p0))/T0v_hp(iir,iit,iip) + T0p_hp(iir,iit,iip) = fun0**2*(b0/(c0*b0-f0**2)*(p1-p0)+f0/(c0*b0-f0**2)*(t1-t0))/T0v_hp(iir,iit,iip) + end if + end do + end do + end do + + + + + ! ################# 构造方程系数 calculate coefficients of equations ################# + do iir = 2,nr-1 + do iit = 2,nt-1 + do iip= 2,np-1 + tmpt1 = (tt(iit-1)+tt(iit))/2; + tmpt2 = (tt(iit)+tt(iit-1))/2; + + a1 = -(1+zeta(iir-1,iit,iip)+zeta(iir,iit,iip)) & + & *(T0r_hr(iir-1,iit,iip)*(tau(iir,iit,iip)+tau(iir-1,iit,iip))/2 & + & + T0v_hr(iir-1,iit,iip)*(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr) + a1m(iir,iit,iip) = (a1-abs(a1))/2; a1p(iir,iit,iip) = (a1+abs(a1))/2; + a2 = -(1+zeta(iir,iit,iip)+zeta(iir+1,iit,iip)) & + & *(T0r_hr(iir,iit,iip)*(tau(iir+1,iit,iip)+tau(iir,iit,iip))/2 & + & + T0v_hr(iir,iit,iip)*(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr) + a2m(iir,iit,iip) = (a2-abs(a2))/2; a2p(iir,iit,iip) = (a2+abs(a2))/2; + + b1 = -(1-xi(iir,iit-1,iip)-xi(iir,iit,iip))/(rr(iir)**2)* & + & (T0t_ht(iir,iit-1,iip)*(tau(iir,iit,iip)+tau(iir,iit-1,iip))/2 & + & + T0v_ht(iir,iit-1,iip)*(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt) & + & -(eta(iir,iit-1,iip)+eta(iir,iit,iip))/(cos(tmpt1)*rr(iir)**2)* & + & (T0p_ht(iir,iit-1,iip)*(tau(iir,iit,iip)+tau(iir,iit-1,iip))/2 & + & + T0v_ht(iir,iit-1,iip)*(tau(iir,iit-1,iip+1)-tau(iir,iit-1,iip-1) & + & + tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/(4*dp)) + b1m(iir,iit,iip) = (b1-abs(b1))/2; b1p(iir,iit,iip) = (b1+abs(b1))/2; + b2 = -(1-xi(iir,iit,iip)-xi(iir,iit+1,iip))/(rr(iir)**2)* & + & (T0t_ht(iir,iit,iip)*(tau(iir,iit+1,iip)+tau(iir,iit,iip))/2 & + & + T0v_ht(iir,iit,iip)*(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt) & + & -(eta(iir,iit,iip)+eta(iir,iit+1,iip))/(cos(tmpt2)*rr(iir)**2)* & + & (T0p_ht(iir,iit,iip)*(tau(iir,iit+1,iip)+tau(iir,iit,iip))/2 & + & + T0v_ht(iir,iit,iip)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1) & + & + tau(iir,iit+1,iip+1)-tau(iir,iit+1,iip-1))/(4*dp)) + b2m(iir,iit,iip) = (b2-abs(b2))/2; b2p(iir,iit,iip) = (b2+abs(b2))/2; + + c1 = -(eta(iir,iit,iip-1)+eta(iir,iit,iip))/(cos(tt(iit))*rr(iir)**2)* & + & (T0t_hp(iir,iit,iip-1)*(tau(iir,iit,iip)+tau(iir,iit,iip-1))/2 & + & + T0v_hp(iir,iit,iip-1)*(tau(iir,iit+1,iip-1)-tau(iir,iit-1,iip-1) & + & +tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/(4*dt)) & + & -(1+xi(iir,iit,iip-1)+xi(iir,iit,iip))/(cos(tt(iit))**2*rr(iir)**2)* & + & (T0p_hp(iir,iit,iip-1)*(tau(iir,iit,iip)+tau(iir,iit,iip-1))/2 & + & + T0v_hp(iir,iit,iip-1)*(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp) + c1m(iir,iit,iip) = (c1-abs(c1))/2; c1p(iir,iit,iip) = (c1+abs(c1))/2; + c2 = -(eta(iir,iit,iip)+eta(iir,iit,iip+1))/(cos(tt(iit))*rr(iir)**2)* & + & (T0t_hp(iir,iit,iip)*(tau(iir,iit,iip+1)+tau(iir,iit,iip))/2 & + & + T0v_hp(iir,iit,iip)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip) & + & +tau(iir,iit+1,iip+1)-tau(iir,iit-1,iip+1))/(4*dt)) & + & -(1+xi(iir,iit,iip)+xi(iir,iit,iip+1))/(cos(tt(iit))**2*rr(iir)**2)* & + & (T0p_hp(iir,iit,iip)*(tau(iir,iit,iip+1)+tau(iir,iit,iip))/2 & + & + T0v_hp(iir,iit,iip)*(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp) + c2m(iir,iit,iip) = (c2-abs(c2))/2; c2p(iir,iit,iip) = (c2+abs(c2))/2; + + end do + end do + end do + + + ! ################# 固定伴随场边界条件 fix the boundary of the adjoint field ###################### + ! -------- R,Theta boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(iir,iit,1) = 0 + TableADJ(iir,iit,np) = 0 + end do + end do + ! -------- R,Phi boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(iir,1,iip) = 0 + TableADJ(iir,nt,iip) = 0 + end do + end do + ! -------- Theta,Phi boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(1,iit,iip) = 0 + TableADJ(nr,iit,iip) = 0 + end do + end do + + + + + ! ################ 使用FSM计算伴随场 calculate adjoint field by FSM ###################### + + do iter =1,MaxIter + Linf_dif=0; + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + + !x: nr-1 <-> 2, y: nt-1 <-> 2, z: np-1 <-> 2 + do iir=nint(0.5+nr/2.0+(nr/2.0-1.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+1.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-1.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+1.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-1.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+1.5)*pdirec),-pdirec + + + coe = (a2p(iir,iit,iip)-a1m(iir,iit,iip))/dr & + & +(b2p(iir,iit,iip)-b1m(iir,iit,iip))/dt & + & +(c2p(iir,iit,iip)-c1m(iir,iit,iip))/dp + + if (abs(coe)Linf_dif) then + ! print *, iir,iit,iip,tpTableADJ,TableADJ(iir,iit,iip) + !end if + Linf_dif = max(Linf_dif, abs(tpTableADJ-TableADJ(iir,iit,iip))) + + TableADJ(iir,iit,iip) = tpTableADJ + end if + + end do + end do + end do + + end do + end do + end do + + + + if (abs(Linf_dif)ninvr) then + cycle ! 如果与反演网格点无关,考察下一个点 if r is out of inversion grid invr, turn to next point + end if + r1 = (rr(iir)-invr(igrid,1)-(idr-1)*dinvr)/dinvr ! r1=0 -> r=invr(idr); r1=1 -> r=invr(idr+1) + + do iit=1,nt + idt = floor((tt(iit)-invt(igrid,1))/dinvt)+1 + if (idt<0 .or. idt>ninvt) then + cycle ! 如果与反演网格点无关,考察下一个点 + end if + r2 = (tt(iit)-invt(igrid,1)-(idt-1)*dinvt)/dinvt + + do iip=1,np + idp = floor((pp(iip)-invp(igrid,1))/dinvp)+1 + if (idp<0 .or. idp>ninvp) then + cycle ! 如果与反演网格点无关,考察下一个点 + end if + r3 = (pp(iip)-invp(igrid,1)-(idp-1)*dinvp)/dinvp + + if (r1<0 .or. r1>1 .or. r2<0 .or. r2>1 .or. r3<0 .or. r3>1) then + print *, 'error ratio' + pause + end if + + do iik=1,nk + if (idr>=1 .and. idr<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp>=1 .and. idp<=ninvp) then + invkernel(idr,idt,idp,iik) = invkernel(idr,idt,idp,iik) & + & + (1-r1)*(1-r2)*(1-r3)*all_Kernel(iir,iit,iip,iik) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp>=1 .and. idp<=ninvp) then + invkernel(idr+1,idt,idp,iik) = invkernel(idr+1,idt,idp,iik) & + & + r1*(1-r2)*(1-r3)*all_Kernel(iir,iit,iip,iik) + end if + if (idr>=1 .and. idr<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp>=1 .and. idp<=ninvp) then + invkernel(idr,idt+1,idp,iik) = invkernel(idr,idt+1,idp,iik) & + & + (1-r1)*r2*(1-r3)*all_Kernel(iir,iit,iip,iik) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp>=1 .and. idp<=ninvp) then + invkernel(idr+1,idt+1,idp,iik) = invkernel(idr+1,idt+1,idp,iik) & + & + r1*r2*(1-r3)*all_Kernel(iir,iit,iip,iik) + end if + if (idr>=1 .and. idr<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + invkernel(idr,idt,idp+1,iik) = invkernel(idr,idt,idp+1,iik) & + & + (1-r1)*(1-r2)*r3*all_Kernel(iir,iit,iip,iik) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + invkernel(idr+1,idt,idp+1,iik) = invkernel(idr+1,idt,idp+1,iik) & + & + r1*(1-r2)*r3*all_Kernel(iir,iit,iip,iik) + end if + if (idr>=1 .and. idr<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + invkernel(idr,idt+1,idp+1,iik) = invkernel(idr,idt+1,idp+1,iik) & + & + (1-r1)*r2*r3*all_Kernel(iir,iit,iip,iik) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + invkernel(idr+1,idt+1,idp+1,iik) = invkernel(idr+1,idt+1,idp+1,iik) & + & + r1*r2*r3*all_Kernel(iir,iit,iip,iik) + end if + + + end do + + end do + end do + end do + + ! build update value + do iir=1,nr + idr = floor((rr(iir)-invr(igrid,1))/dinvr)+1 ! invr(idr) <= rr(iir) < invr(idr+1) + if (idr<0 .or. idr>ninvr) then + cycle ! 如果与反演网格点无关,考察下一个点 if r is out of inversion grid invr, turn to next point + end if + r1 = (rr(iir)-invr(igrid,1)-(idr-1)*dinvr)/dinvr ! r1=0 -> r=invr(idr); r1=1 -> r=invr(idr+1) + + do iit=1,nt + idt = floor((tt(iit)-invt(igrid,1))/dinvt)+1 + if (idt<0 .or. idt>ninvt) then + cycle ! 如果与反演网格点无关,考察下一个点 + end if + r2 = (tt(iit)-invt(igrid,1)-(idt-1)*dinvt)/dinvt + + do iip=1,np + idp = floor((pp(iip)-invp(igrid,1))/dinvp)+1 + if (idp<0 .or. idp>ninvp) then + cycle ! 如果与反演网格点无关,考察下一个点 + end if + r3 = (pp(iip)-invp(igrid,1)-(idp-1)*dinvp)/dinvp + + if (r1<0 .or. r1>1 .or. r2<0 .or. r2>1 .or. r3<0 .or. r3>1) then + print *, 'error ratio' + pause + end if + + + do iik=1,nk + pert = 0.0 + if (idr>=1 .and. idr<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp>=1 .and. idp<=ninvp) then + pert = pert + invkernel(idr,idt,idp,iik)*(1-r1)*(1-r2)*(1-r3) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp>=1 .and. idp<=ninvp) then + pert = pert + invkernel(idr+1,idt,idp,iik)*r1*(1-r2)*(1-r3) + end if + if (idr>=1 .and. idr<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp>=1 .and. idp<=ninvp) then + pert = pert + invkernel(idr,idt+1,idp,iik)*(1-r1)*r2*(1-r3) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp>=1 .and. idp<=ninvp) then + pert = pert + invkernel(idr+1,idt+1,idp,iik)*r1*r2*(1-r3) + end if + if (idr>=1 .and. idr<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + pert = pert + invkernel(idr,idt,idp+1,iik)*(1-r1)*(1-r2)*r3 + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + pert = pert + invkernel(idr+1,idt,idp+1,iik)*r1*(1-r2)*r3 + end if + if (idr>=1 .and. idr<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + pert = pert + invkernel(idr,idt+1,idp+1,iik)*(1-r1)*r2*r3 + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + pert = pert + invkernel(idr+1,idt+1,idp+1,iik)*r1*r2*r3 + end if + para(iir,iit,iip,iik) = para(iir,iit,iip,iik)+pert + end do + + + end do + end do + end do + + + end do + + + ! rescale + Linf = 0.0 + do iir=1,nr + do iit=1,nt + do iip=1,np + do iik=1,nk + if (Linf < abs(para(iir,iit,iip,iik))) then + Linf = abs(para(iir,iit,iip,iik)) + end if + end do + end do + end do + end do + + do iir=1,nr + do iit=1,nt + do iip=1,np + do iik=1,nk + update_value(iir,iit,iip,iik) = para(iir,iit,iip,iik)/Linf*stepsize + end do + end do + end do + end do + +end subroutine + +subroutine Kernel_Mask(rr,tt,pp,nr,nt,np,kernel,rsou,tsou,psou,radius) + integer :: nr,nt,np + double precision :: rr(nr),tt(nt),pp(np),rsou,tsou,psou,radius + double precision :: kernel(nr,nt,np),dis + integer :: i,j,k + + do i=1,nr + do j=1,nt + do k=1,np + dis = sqrt((rr(i)-rsou)**2+(rsou*(tt(j)-tsou))**2+(rsou*cos(tsou)*(pp(k)-psou))**2) + if ( dis < radius) then + kernel(i,j,k) = kernel(i,j,k) * 0 + end if + end do + end do + end do +end subroutine + +subroutine Kernel_Mask_new(rr,tt,pp,nr,nt,np,kernel,rsou,tsou,psou) + integer :: nr,nt,np + double precision :: rr(nr),tt(nt),pp(np),rsou,tsou,psou,radius + double precision :: kernel(nr,nt,np),dis + integer :: i,j,k + dr = rr(2)-rr(1); dt = tt(2)-tt(1); dp = pp(2)-pp(1); + do i=1,nr + do j=1,nt + do k=1,np + if ( abs(rr(i)-rsou)6351):\n", + " fun_init[ir,it,ip] = 1.0/(5.8+(6371-rr[ir])/20.0*0.7)\n", + " elif (rr[ir]>6336):\n", + " fun_init[ir,it,ip] = 1.0/(6.5+(6351-rr[ir])/15.0*0.6)\n", + " elif (rr[ir]>5961):\n", + " fun_init[ir,it,ip] = 1.0/(8.0+(6336-rr[ir])/375.0*1) \n", + " else:\n", + " fun_init[ir,it,ip] = 1.0/9.0\n", + "\n", + " vel_init[ir,it,ip] = 1.0/fun_init[ir,it,ip]\n", + " a_init[ir,it,ip] = 1.0 + 2.0*zeta_init[ir,it,ip]\n", + " b_init[ir,it,ip] = 1.0 - 2.0*xi_init[ir,it,ip]\n", + " c_init[ir,it,ip] = 1.0 + 2.0*xi_init[ir,it,ip]\n", + " f_init[ir,it,ip] = -2.0 * eta_init[ir,it,ip]\n", + "\n", + " # true model\n", + " if (tt[it] >= 30.0/180.0*math.pi and tt[it] <= 50.0/180.0*math.pi \\\n", + " and pp[ip] >= 15.0/180.0*math.pi and pp[ip] <= 40.0/180.0*math.pi \\\n", + " and rr[ir] >= 6211.0 and rr[ir] <= 6371.0):\n", + " c+=1\n", + " sigma = math.sin(4.0*math.pi*(tt[it]-30.0/180.0*math.pi)/(20.0/180.0*math.pi)) \\\n", + " *math.sin(4.0*math.pi*(pp[ip]-15.0/180.0*math.pi)/(25.0/180.0*math.pi)) \\\n", + " *math.sin(2.0*math.pi*(rr[ir]-6211.0)/160.0)\n", + " else:\n", + " sigma = 0.0\n", + "\n", + " if sigma < 0:\n", + " psi = 60.0/180.0*math.pi\n", + " elif sigma > 0:\n", + " psi = 150.0/180.0*math.pi\n", + " else:\n", + " psi = 0.0\n", + "\n", + " eta_true[ir,it,ip] = ani_p*abs(sigma)*math.sin(2.0*psi)\n", + " xi_true[ir,it,ip] = ani_p*abs(sigma)*math.cos(2.0*psi)\n", + " zeta_true[ir,it,ip] = gamma*math.sqrt(eta_true[ir,it,ip]**2 + xi_true[ir,it,ip]**2)\n", + " fun_true[ir,it,ip] = fun_init[ir,it,ip]/(1.0+sigma*slow_p)\n", + " vel_true[ir,it,ip] = 1.0/fun_true[ir,it,ip] \n", + " a_true[ir,it,ip] = 1.0 + 2.0*zeta_true[ir,it,ip]\n", + " b_true[ir,it,ip] = 1.0 - 2.0*xi_true[ir,it,ip]\n", + " c_true[ir,it,ip] = 1.0 + 2.0*xi_true[ir,it,ip]\n", + " f_true[ir,it,ip] = -2.0 * eta_true[ir,it,ip]\n", + "\n", + "\n", + "\n", + "r_earth = R_earth #6378.1370\n", + "print(\"depminmax {} {}\".format(r_earth-rr1,r_earth-rr2))\n", + "print(c)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# write out\n", + "import h5py\n", + "\n", + "fout_init = h5py.File('test_model_init.h5', 'w')\n", + "fout_true = h5py.File('test_model_true.h5', 'w')\n", + "\n", + "# write out the arrays eta_init, xi_init, zeta_init, fun_init, a_init, b_init, c_init, f_init\n", + "fout_init.create_dataset('eta', data=eta_init)\n", + "fout_init.create_dataset('xi', data=xi_init)\n", + "fout_init.create_dataset('zeta',data=zeta_init)\n", + "fout_init.create_dataset('fun', data=fun_init)\n", + "fout_init.create_dataset('fac_a', data=a_init)\n", + "fout_init.create_dataset('fac_b', data=b_init)\n", + "fout_init.create_dataset('fac_c', data=c_init)\n", + "fout_init.create_dataset('fac_f', data=f_init)\n", + "fout_init.create_dataset('vel', data=vel_init)\n", + "\n", + "# writeout the arrays eta_true, xi_true, zeta_true, fun_true, a_true, b_true, c_true, f_true\n", + "fout_true.create_dataset('eta', data=eta_true)\n", + "fout_true.create_dataset('xi', data=xi_true)\n", + "fout_true.create_dataset('zeta',data=zeta_true)\n", + "fout_true.create_dataset('fun', data=fun_true)\n", + "fout_true.create_dataset('fac_a', data=a_true)\n", + "fout_true.create_dataset('fac_b', data=b_true)\n", + "fout_true.create_dataset('fac_c', data=c_true)\n", + "fout_true.create_dataset('fac_f', data=f_true)\n", + "fout_true.create_dataset('vel', data=vel_true)\n", + "\n", + "fout_init.close()\n", + "fout_true.close()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# prepare src station file\n", + "\n", + "```\n", + " 26 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- src  : id_src year month day hour min sec lat lon dep_km mag num_recs id_event\n", + " 26 1 PCBI 1.8900 98.9253 1000.0000 P 10.40 18.000 <- arrival : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arrival_time_sec\n", + " 26 2 MRPI 1.6125 99.3172 1100.0000 P 50.84 19.400\n", + " 26 3 HUTI 2.3153 98.9711 1600.0000 P 57.84 19.200\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "random.seed(123456789)\n", + "\n", + "# dummys\n", + "year_dummy = 1998\n", + "month_dummy = 1\n", + "day_dummy = 1\n", + "hour_dummy = 0\n", + "minute_dummy = 0\n", + "second_dummy = 0\n", + "mag_dummy = 3.0\n", + "id_dummy = 1000\n", + "st_name_dummy = 'AAAA'\n", + "phase_dummy = 'P'\n", + "dist_dummy = 100.0\n", + "arriv_t_dummy = 0.0\n", + "\n", + "tt1deg = tt1 * 180.0/math.pi\n", + "tt2deg = tt2 * 180.0/math.pi\n", + "pp1deg = pp1 * 180.0/math.pi\n", + "pp2deg = pp2 * 180.0/math.pi\n", + "\n", + "\n", + "n_src = 1\n", + "n_rec = [1 for x in range(n_src)]\n", + "\n", + "\n", + "lines = []\n", + "\n", + "pos_src=[]\n", + "pos_rec=[]\n", + "\n", + "# one source outside of the region\n", + "dep_srcs=[]\n", + "lon_srcs=[]\n", + "lat_srcs=[]\n", + "\n", + "# teleseismic events\n", + "n_src_tele = 10\n", + "center_lon = (pp2deg+pp1deg)/2.0\n", + "center_lat = (tt2deg+tt1deg)/2.0\n", + "r_src = 40 # deg\n", + "d_r = 360.0/n_src_tele\n", + "\n", + "for i in range(n_src_tele):\n", + " dep = 50.0\n", + " lon = math.cos(d_r*i/180.0*math.pi)*r_src + center_lon\n", + " lat = math.sin(d_r*i/180.0*math.pi)*r_src + center_lat\n", + " dep_srcs.append(dep)\n", + " lon_srcs.append(lon)\n", + " lat_srcs.append(lat)\n", + "\n", + "# regional events\n", + "n_src_reg = 0\n", + "for i in range(n_src_reg):\n", + " dep = random.uniform(r_earth-rr1,r_earth-rr2)\n", + " lon = random.uniform(pp1deg,pp2deg)\n", + " lat = random.uniform(tt1deg,tt2deg)\n", + " dep_srcs.append(dep)\n", + " lon_srcs.append(lon)\n", + " lat_srcs.append(lat)\n", + "\n", + "n_src = n_src_tele + n_src_reg\n", + "\n", + "# create receiver coordinates\n", + "n_rec = [20 for i in range(n_src)]\n", + "elev_recs=[]\n", + "lon_recs=[]\n", + "lat_recs=[]\n", + "rec_names=[]\n", + "for i in range(n_rec[0]):\n", + " #elev_recs.append(random.uniform(-100.0,-100.0)) # elevation in m\n", + " elev_recs.append(0) # elevation in m\n", + " lon_recs .append(random.uniform(pp1deg*1.1,pp2deg*0.9))\n", + " lat_recs .append(random.uniform(tt1deg*1.1,tt2deg*0.9))\n", + " rec_names.append(i)\n", + "\n", + "\n", + "\n", + "# create dummy src\n", + "for i_src in range(n_src):\n", + " # define one point in the domain (rr1 bottom, rr2 top)\n", + " dep = dep_srcs[i_src]\n", + " lon = lon_srcs[i_src]\n", + " lat = lat_srcs[i_src]\n", + "\n", + " src = [i_src, year_dummy, month_dummy, day_dummy, hour_dummy, minute_dummy, second_dummy, lat, lon, dep, mag_dummy, n_rec[i_src], id_dummy]\n", + " lines.append(src)\n", + "\n", + " pos_src.append([lon,lat,dep])\n", + "\n", + " # create dummy station\n", + " for i_rec in range(n_rec[i_src]):\n", + " #elev_rec = random.uniform(0.0,-10.0) # elevation in m\n", + " #lon_rec = random.uniform(pp1deg,pp2deg)\n", + " #lat_rec = random.uniform(tt1deg,tt2deg)\n", + "\n", + " rec = [i_src, i_rec, st_name_dummy+\"_\"+str(i_rec), lat_recs[i_rec], lon_recs[i_rec], elev_recs[i_rec], phase_dummy, dist_dummy, arriv_t_dummy]\n", + " lines.append(rec)\n", + "\n", + " pos_rec.append([lon_recs[i_rec],lat_recs[i_rec],elev_recs[i_rec]])\n", + "\n", + "# write out ev_arrivals file\n", + "fname = 'src_rec_test.dat'\n", + "\n", + "with open(fname, 'w') as f:\n", + " for line in lines:\n", + " for elem in line:\n", + " f.write('{} '.format(elem))\n", + " f.write('\\n')\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# draw src and rec positions\n", + "import matplotlib.pyplot as plt\n", + "\n", + "for i_src in range(n_src):\n", + " plt.scatter(pos_src[i_src][1],pos_src[i_src][0],c='r',marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot receivers\n", + "for i_rec in range(n_rec[0]):\n", + " plt.scatter(pos_rec[i_rec][1],pos_rec[i_rec][0],c='b',marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "vscode": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_tele_one_src/1d_ak135.txt b/test/old_tests/inversion_tele_one_src/1d_ak135.txt new file mode 100644 index 0000000..58f131c --- /dev/null +++ b/test/old_tests/inversion_tele_one_src/1d_ak135.txt @@ -0,0 +1,136 @@ + 0.000, 5.8000 + 20.000, 5.8000 + 20.000, 6.5000 + 35.000, 6.5000 + 35.000, 8.0400 + 77.500, 8.0450 + 120.000, 8.0500 + 165.000, 8.1750 + 210.000, 8.3000 + 210.000, 8.3000 + 260.000, 8.4825 + 310.000, 8.6650 + 360.000, 8.8475 + 410.000, 9.0300 + 410.000, 9.3600 + 460.000, 9.5280 + 510.000, 9.6960 + 560.000, 9.8640 + 610.000, 10.0320 + 660.000, 10.2000 + 660.000, 10.7900 + 710.000, 10.9229 + 760.000, 11.0558 + 809.500, 11.1353 + 859.000, 11.2221 + 908.500, 11.3068 + 958.000, 11.3896 +1007.500, 11.4705 +1057.000, 11.5495 +1106.500, 11.6269 +1156.000, 11.7026 +1205.500, 11.7766 +1255.000, 11.8491 +1304.500, 11.9200 +1354.000, 11.9895 +1403.500, 12.0577 +1453.000, 12.1245 +1502.500, 12.1912 +1552.000, 12.2550 +1601.500, 12.3185 +1651.000, 12.3819 +1700.500, 12.4426 +1750.000, 12.5031 +1799.500, 12.5631 +1849.000, 12.6221 +1898.500, 12.6804 +1948.000, 12.7382 +1997.500, 12.7956 +2047.000, 12.8526 +2096.500, 12.9096 +2146.000, 12.9668 +2195.500, 13.0222 +2245.000, 13.0783 +2294.500, 13.1336 +2344.000, 13.1894 +2393.500, 13.2465 +2443.000, 13.3018 +2492.500, 13.3585 +2542.000, 13.4156 +2591.500, 13.4741 +2640.000, 13.5312 +2690.000, 13.5900 +2740.000, 13.6494 +2740.000, 13.6494 +2789.670, 13.6530 +2839.330, 13.6566 +2891.500, 13.6602 +2891.500, 8.0000 +2939.330, 8.0382 +2989.660, 8.1283 +3039.990, 8.2213 +3090.320, 8.3122 +3140.660, 8.4001 +3190.990, 8.4861 +3241.320, 8.5692 +3291.650, 8.6496 +3341.980, 8.7283 +3392.310, 8.8036 +3442.640, 8.8761 +3492.970, 8.9461 +3543.300, 9.0138 +3593.640, 9.0792 +3643.970, 9.1426 +3694.300, 9.2042 +3744.630, 9.2634 +3794.960, 9.3205 +3845.290, 9.3760 +3895.620, 9.4297 +3945.950, 9.4814 +3996.280, 9.5306 +4046.620, 9.5777 +4096.950, 9.6232 +4147.280, 9.6673 +4197.610, 9.7100 +4247.940, 9.7513 +4298.270, 9.7914 +4348.600, 9.8304 +4398.930, 9.8682 +4449.260, 9.9051 +4499.600, 9.9410 +4549.930, 9.9761 +4600.260, 10.0103 +4650.590, 10.0439 +4700.920, 10.0768 +4801.580, 10.1415 +4851.910, 10.1739 +4902.240, 10.2049 +4952.580, 10.2329 +5002.910, 10.2565 +5053.240, 10.2745 +5103.570, 10.2854 +5153.500, 10.2890 +5153.500, 11.0427 +5204.610, 11.0585 +5255.320, 11.0718 +5306.040, 11.0850 +5356.750, 11.0983 +5407.460, 11.1166 +5458.170, 11.1316 +5508.890, 11.1457 +5559.600, 11.1590 +5610.310, 11.1715 +5661.020, 11.1832 +5711.740, 11.1941 +5813.160, 11.2134 +5863.870, 11.2219 +5914.590, 11.2295 +5965.300, 11.2364 +6016.010, 11.2424 +6066.720, 11.2477 +6117.440, 11.2521 +6168.150, 11.2557 +6218.860, 11.2586 +6269.570, 11.2606 +6320.290, 11.2618 +6371.000, 11.2622 \ No newline at end of file diff --git a/test/old_tests/inversion_tele_one_src/1d_model.txt b/test/old_tests/inversion_tele_one_src/1d_model.txt new file mode 100644 index 0000000..d35a8cd --- /dev/null +++ b/test/old_tests/inversion_tele_one_src/1d_model.txt @@ -0,0 +1,789 @@ +5463, 11.3081 +5465, 11.3046 +5467, 11.3012 +5469, 11.2978 +5471, 11.2944 +5473, 11.291 +5475, 11.2876 +5477, 11.2842 +5479, 11.2807 +5481, 11.2773 +5483, 11.2739 +5485, 11.2705 +5487, 11.2671 +5489, 11.2637 +5491, 11.2603 +5493, 11.2568 +5495, 11.2534 +5497, 11.25 +5499, 11.2466 +5501, 11.2431 +5503, 11.2395 +5505, 11.2359 +5507, 11.2323 +5509, 11.2288 +5511, 11.2252 +5513, 11.2216 +5515, 11.218 +5517, 11.2144 +5519, 11.2108 +5521, 11.2072 +5523, 11.2037 +5525, 11.2001 +5527, 11.1965 +5529, 11.1929 +5531, 11.1893 +5533, 11.1857 +5535, 11.1821 +5537, 11.1785 +5539, 11.175 +5541, 11.1714 +5543, 11.1678 +5545, 11.1642 +5547, 11.1606 +5549, 11.157 +5551, 11.1534 +5553, 11.1499 +5555, 11.1463 +5557, 11.1427 +5559, 11.1391 +5561, 11.1355 +5563, 11.1319 +5565, 11.1283 +5567, 11.1247 +5569, 11.1212 +5571, 11.1176 +5573, 11.114 +5575, 11.1104 +5577, 11.1068 +5579, 11.1032 +5581, 11.0996 +5583, 11.0961 +5585, 11.0925 +5587, 11.0889 +5589, 11.0853 +5591, 11.0817 +5593, 11.0781 +5595, 11.0745 +5597, 11.0709 +5599, 11.0674 +5601, 11.0625 +5603, 11.0562 +5605, 11.05 +5607, 11.0438 +5609, 11.0376 +5611, 11.0314 +5613, 11.0251 +5615, 11.0189 +5617, 11.0127 +5619, 11.0065 +5621, 11.0003 +5623, 10.994 +5625, 10.9878 +5627, 10.9816 +5629, 10.9754 +5631, 10.9691 +5633, 10.9629 +5635, 10.9567 +5637, 10.9505 +5639, 10.9443 +5641, 10.938 +5643, 10.9318 +5645, 10.9256 +5647, 10.9194 +5649, 10.9132 +5651, 10.9069 +5653, 10.9007 +5655, 10.8945 +5657, 10.8883 +5659, 10.882 +5661, 10.8758 +5663, 10.8696 +5665, 10.8634 +5667, 10.8571 +5669, 10.8509 +5671, 10.8447 +5673, 10.8385 +5675, 10.8322 +5677, 10.826 +5679, 10.8198 +5681, 10.8136 +5683, 10.8073 +5685, 10.8011 +5687, 10.7949 +5689, 10.7887 +5691, 10.7824 +5693, 10.7762 +5695, 10.77 +5697, 10.7638 +5699, 10.7575 +5701, 10.7513 +5703, 10.2631 +5705, 10.26 +5707, 10.2569 +5709, 10.2538 +5711, 10.2507 +5713, 10.2476 +5715, 10.2445 +5717, 10.2414 +5719, 10.2384 +5721, 10.2353 +5723, 10.2322 +5725, 10.2291 +5727, 10.226 +5729, 10.2229 +5731, 10.2198 +5733, 10.2167 +5735, 10.2136 +5737, 10.2105 +5739, 10.2074 +5741, 10.2043 +5743, 10.2012 +5745, 10.1981 +5747, 10.195 +5749, 10.1919 +5751, 10.1888 +5753, 10.1857 +5755, 10.1826 +5757, 10.1795 +5759, 10.1764 +5761, 10.1733 +5763, 10.1702 +5765, 10.1671 +5767, 10.164 +5769, 10.1609 +5771, 10.1578 +5773, 10.1476 +5775, 10.1373 +5777, 10.1271 +5779, 10.1169 +5781, 10.1066 +5783, 10.0964 +5785, 10.0861 +5787, 10.0759 +5789, 10.0657 +5791, 10.0554 +5793, 10.0452 +5795, 10.035 +5797, 10.0247 +5799, 10.0145 +5801, 10.0042 +5803, 9.994 +5805, 9.98376 +5807, 9.97352 +5809, 9.96328 +5811, 9.95304 +5813, 9.94281 +5815, 9.93257 +5817, 9.92233 +5819, 9.91209 +5821, 9.90185 +5823, 9.89161 +5825, 9.88137 +5827, 9.87113 +5829, 9.86089 +5831, 9.85066 +5833, 9.84042 +5835, 9.83018 +5837, 9.81994 +5839, 9.8097 +5841, 9.79946 +5843, 9.78922 +5845, 9.77898 +5847, 9.76875 +5849, 9.75851 +5851, 9.74827 +5853, 9.73803 +5855, 9.72779 +5857, 9.71755 +5859, 9.70731 +5861, 9.69707 +5863, 9.68684 +5865, 9.6766 +5867, 9.66636 +5869, 9.65612 +5871, 9.64588 +5873, 9.63564 +5875, 9.6254 +5877, 9.61516 +5879, 9.60492 +5881, 9.59468 +5883, 9.58444 +5885, 9.57421 +5887, 9.56397 +5889, 9.55373 +5891, 9.54349 +5893, 9.53325 +5895, 9.52301 +5897, 9.51277 +5899, 9.50253 +5901, 9.49229 +5903, 9.48205 +5905, 9.47181 +5907, 9.46157 +5909, 9.45134 +5911, 9.4411 +5913, 9.43086 +5915, 9.42062 +5917, 9.41038 +5919, 9.40014 +5921, 9.3899 +5923, 9.37966 +5925, 9.36943 +5927, 9.35919 +5929, 9.34895 +5931, 9.33871 +5933, 9.32848 +5935, 9.31824 +5937, 9.308 +5939, 9.29777 +5941, 9.28753 +5943, 9.27729 +5945, 9.26705 +5947, 9.25682 +5949, 9.24658 +5951, 9.23634 +5953, 9.2261 +5955, 9.21587 +5957, 9.20563 +5959, 9.19539 +5961, 9.18516 +5963, 9.17492 +5965, 9.16468 +5967, 9.15444 +5969, 9.14421 +5971, 9.13397 +5973, 8.90137 +5975, 8.89753 +5977, 8.89368 +5979, 8.88983 +5981, 8.88599 +5983, 8.88214 +5985, 8.87829 +5987, 8.87445 +5989, 8.8706 +5991, 8.86675 +5993, 8.86291 +5995, 8.85906 +5997, 8.85521 +5999, 8.85137 +6001, 8.84752 +6003, 8.84367 +6005, 8.83983 +6007, 8.83598 +6009, 8.83213 +6011, 8.82829 +6013, 8.82444 +6015, 8.82059 +6017, 8.81675 +6019, 8.8129 +6021, 8.80905 +6023, 8.8052 +6025, 8.80135 +6027, 8.79751 +6029, 8.79366 +6031, 8.78981 +6033, 8.78596 +6035, 8.78211 +6037, 8.77827 +6039, 8.77442 +6041, 8.77057 +6043, 8.76672 +6045, 8.76287 +6047, 8.75903 +6049, 8.75518 +6051, 8.75133 +6053, 8.74748 +6055, 8.74363 +6057, 8.73979 +6059, 8.73594 +6061, 8.73209 +6063, 8.72824 +6065, 8.72439 +6067, 8.72055 +6069, 8.7167 +6071, 8.71285 +6073, 8.709 +6075, 8.70516 +6077, 8.70131 +6079, 8.69746 +6081, 8.69361 +6083, 8.68977 +6085, 8.68592 +6087, 8.68207 +6089, 8.67822 +6091, 8.67438 +6093, 8.67053 +6095, 8.66668 +6097, 8.66283 +6099, 8.65899 +6101, 8.65514 +6103, 8.65129 +6105, 8.64744 +6107, 8.6436 +6109, 8.63975 +6111, 8.6359 +6113, 8.63206 +6115, 8.62821 +6117, 8.62436 +6119, 8.62051 +6121, 8.61667 +6123, 8.61282 +6125, 8.60897 +6127, 8.60513 +6129, 8.60128 +6131, 8.59743 +6133, 8.59358 +6135, 8.58974 +6137, 8.58589 +6139, 8.58204 +6141, 8.5782 +6143, 8.57435 +6145, 8.5705 +6147, 8.56665 +6149, 8.56281 +6151, 8.55896 +6153, 7.99096 +6155, 7.99223 +6157, 7.99349 +6159, 7.99475 +6161, 7.99601 +6163, 7.99728 +6165, 7.99854 +6167, 7.9998 +6169, 8.00107 +6171, 8.00233 +6173, 8.00359 +6175, 8.00485 +6177, 8.00612 +6179, 8.00738 +6181, 8.00864 +6183, 8.00991 +6185, 8.01117 +6187, 8.01243 +6189, 8.01368 +6191, 8.01493 +6193, 8.01618 +6195, 8.01743 +6197, 8.01868 +6199, 8.01993 +6201, 8.02119 +6203, 8.02244 +6205, 8.02369 +6207, 8.02494 +6209, 8.02619 +6211, 8.02744 +6213, 8.02869 +6215, 8.02995 +6217, 8.0312 +6219, 8.03245 +6221, 8.0337 +6223, 8.03494 +6225, 8.03618 +6227, 8.03742 +6229, 8.03866 +6231, 8.0399 +6233, 8.04114 +6235, 8.04238 +6237, 8.04362 +6239, 8.04486 +6241, 8.0461 +6243, 8.04734 +6245, 8.04858 +6247, 8.04982 +6249, 8.05106 +6251, 8.0523 +6253, 8.05354 +6255, 8.05478 +6257, 8.05601 +6259, 8.05724 +6261, 8.05847 +6263, 8.0597 +6265, 8.06092 +6267, 8.06215 +6269, 8.06338 +6271, 8.06461 +6273, 8.06583 +6275, 8.06706 +6277, 8.06829 +6279, 8.06952 +6281, 8.07074 +6283, 8.07197 +6285, 8.0732 +6287, 8.07443 +6289, 8.07565 +6291, 8.07688 +6293, 8.0781 +6295, 8.07932 +6297, 8.08054 +6299, 8.08176 +6301, 8.08297 +6303, 8.08419 +6305, 8.08541 +6307, 8.08663 +6309, 8.08785 +6311, 8.08907 +6313, 8.09028 +6315, 8.09149 +6317, 8.09271 +6319, 8.09392 +6321, 8.09513 +6323, 8.09634 +6325, 8.09755 +6327, 8.09877 +6329, 8.09998 +6331, 8.10119 +6333, 8.1024 +6335, 8.10361 +6337, 8.10481 +6339, 8.10602 +6341, 8.10723 +6343, 8.10844 +6345, 8.10964 +6347, 6.8 +6349, 6.8 +6351, 6.8 +6353, 6.8 +6355, 6.8 +6357, 5.8 +6359, 5.8 +6361, 5.8 +6363, 5.8 +6365, 5.8 +6367, 5.8 +6369, 5.8 +6371, 5.8 +6373, 5.8 +6375, 5.8 +6377, 5.8 +6379, 5.8 +6381, 5.8 +6383, 5.8 +6385, 5.8 +6387, 5.8 +6389, 5.8 +6391, 5.8 +6393, 5.8 +6395, 5.8 +6397, 5.8 +6399, 5.8 +6401, 5.8 +6403, 5.8 +6405, 5.8 +6407, 5.8 +6409, 5.8 +6411, 5.8 +6413, 5.8 +6415, 5.8 +6417, 5.8 +6419, 5.8 +6421, 5.8 +6423, 5.8 +6425, 5.8 +6427, 5.8 +6429, 5.8 +6431, 5.8 +6433, 5.8 +6435, 5.8 +6437, 5.8 +6439, 5.8 +6441, 5.8 +6443, 5.8 +6445, 5.8 +6447, 5.8 +6449, 5.8 +6451, 5.8 +6453, 5.8 +6455, 5.8 +6457, 5.8 +6459, 5.8 +6461, 5.8 +6463, 5.8 +6465, 5.8 +6467, 5.8 +6469, 5.8 +6471, 5.8 +6473, 5.8 +6475, 5.8 +6477, 5.8 +6479, 5.8 +6481, 5.8 +6483, 5.8 +6485, 5.8 +6487, 5.8 +6489, 5.8 +6491, 5.8 +6493, 5.8 +6495, 5.8 +6497, 5.8 +6499, 5.8 +6501, 5.8 +6503, 5.8 +6505, 5.8 +6507, 5.8 +6509, 5.8 +6511, 5.8 +6513, 5.8 +6515, 5.8 +6517, 5.8 +6519, 5.8 +6521, 5.8 +6523, 5.8 +6525, 5.8 +6527, 5.8 +6529, 5.8 +6531, 5.8 +6533, 5.8 +6535, 5.8 +6537, 5.8 +6539, 5.8 +6541, 5.8 +6543, 5.8 +6545, 5.8 +6547, 5.8 +6549, 5.8 +6551, 5.8 +6553, 5.8 +6555, 5.8 +6557, 5.8 +6559, 5.8 +6561, 5.8 +6563, 5.8 +6565, 5.8 +6567, 5.8 +6569, 5.8 +6571, 5.8 +6573, 5.8 +6575, 5.8 +6577, 5.8 +6579, 5.8 +6581, 5.8 +6583, 5.8 +6585, 5.8 +6587, 5.8 +6589, 5.8 +6591, 5.8 +6593, 5.8 +6595, 5.8 +6597, 5.8 +6599, 5.8 +6601, 5.8 +6603, 5.8 +6605, 5.8 +6607, 5.8 +6609, 5.8 +6611, 5.8 +6613, 5.8 +6615, 5.8 +6617, 5.8 +6619, 5.8 +6621, 5.8 +6623, 5.8 +6625, 5.8 +6627, 5.8 +6629, 5.8 +6631, 5.8 +6633, 5.8 +6635, 5.8 +6637, 5.8 +6639, 5.8 +6641, 5.8 +6643, 5.8 +6645, 5.8 +6647, 5.8 +6649, 5.8 +6651, 5.8 +6653, 5.8 +6655, 5.8 +6657, 5.8 +6659, 5.8 +6661, 5.8 +6663, 5.8 +6665, 5.8 +6667, 5.8 +6669, 5.8 +6671, 5.8 +6673, 5.8 +6675, 5.8 +6677, 5.8 +6679, 5.8 +6681, 5.8 +6683, 5.8 +6685, 5.8 +6687, 5.8 +6689, 5.8 +6691, 5.8 +6693, 5.8 +6695, 5.8 +6697, 5.8 +6699, 5.8 +6701, 5.8 +6703, 5.8 +6705, 5.8 +6707, 5.8 +6709, 5.8 +6711, 5.8 +6713, 5.8 +6715, 5.8 +6717, 5.8 +6719, 5.8 +6721, 5.8 +6723, 5.8 +6725, 5.8 +6727, 5.8 +6729, 5.8 +6731, 5.8 +6733, 5.8 +6735, 5.8 +6737, 5.8 +6739, 5.8 +6741, 5.8 +6743, 5.8 +6745, 5.8 +6747, 5.8 +6749, 5.8 +6751, 5.8 +6753, 5.8 +6755, 5.8 +6757, 5.8 +6759, 5.8 +6761, 5.8 +6763, 5.8 +6765, 5.8 +6767, 5.8 +6769, 5.8 +6771, 5.8 +6773, 5.8 +6775, 5.8 +6777, 5.8 +6779, 5.8 +6781, 5.8 +6783, 5.8 +6785, 5.8 +6787, 5.8 +6789, 5.8 +6791, 5.8 +6793, 5.8 +6795, 5.8 +6797, 5.8 +6799, 5.8 +6801, 5.8 +6803, 5.8 +6805, 5.8 +6807, 5.8 +6809, 5.8 +6811, 5.8 +6813, 5.8 +6815, 5.8 +6817, 5.8 +6819, 5.8 +6821, 5.8 +6823, 5.8 +6825, 5.8 +6827, 5.8 +6829, 5.8 +6831, 5.8 +6833, 5.8 +6835, 5.8 +6837, 5.8 +6839, 5.8 +6841, 5.8 +6843, 5.8 +6845, 5.8 +6847, 5.8 +6849, 5.8 +6851, 5.8 +6853, 5.8 +6855, 5.8 +6857, 5.8 +6859, 5.8 +6861, 5.8 +6863, 5.8 +6865, 5.8 +6867, 5.8 +6869, 5.8 +6871, 5.8 +6873, 5.8 +6875, 5.8 +6877, 5.8 +6879, 5.8 +6881, 5.8 +6883, 5.8 +6885, 5.8 +6887, 5.8 +6889, 5.8 +6891, 5.8 +6893, 5.8 +6895, 5.8 +6897, 5.8 +6899, 5.8 +6901, 5.8 +6903, 5.8 +6905, 5.8 +6907, 5.8 +6909, 5.8 +6911, 5.8 +6913, 5.8 +6915, 5.8 +6917, 5.8 +6919, 5.8 +6921, 5.8 +6923, 5.8 +6925, 5.8 +6927, 5.8 +6929, 5.8 +6931, 5.8 +6933, 5.8 +6935, 5.8 +6937, 5.8 +6939, 5.8 +6941, 5.8 +6943, 5.8 +6945, 5.8 +6947, 5.8 +6949, 5.8 +6951, 5.8 +6953, 5.8 +6955, 5.8 +6957, 5.8 +6959, 5.8 +6961, 5.8 +6963, 5.8 +6965, 5.8 +6967, 5.8 +6969, 5.8 +6971, 5.8 +6973, 5.8 +6975, 5.8 +6977, 5.8 +6979, 5.8 +6981, 5.8 +6983, 5.8 +6985, 5.8 +6987, 5.8 +6989, 5.8 +6991, 5.8 +6993, 5.8 +6995, 5.8 +6997, 5.8 +6999, 5.8 +7001, 5.8 +7003, 5.8 +7005, 5.8 +7007, 5.8 +7009, 5.8 +7011, 5.8 +7013, 5.8 +7015, 5.8 +7017, 5.8 +7019, 5.8 +7021, 5.8 +7023, 5.8 +7025, 5.8 +7027, 5.8 +7029, 5.8 +7031, 5.8 +7033, 5.8 +7035, 5.8 +7037, 5.8 +7039, 5.8 diff --git a/test/old_tests/inversion_tele_one_src/EARTHQUAKES_tele b/test/old_tests/inversion_tele_one_src/EARTHQUAKES_tele new file mode 100644 index 0000000..baca2e4 --- /dev/null +++ b/test/old_tests/inversion_tele_one_src/EARTHQUAKES_tele @@ -0,0 +1,2 @@ +1 +50.0 40.0 67.5 diff --git a/test/old_tests/inversion_tele_one_src/README.md b/test/old_tests/inversion_tele_one_src/README.md new file mode 100644 index 0000000..e05d104 --- /dev/null +++ b/test/old_tests/inversion_tele_one_src/README.md @@ -0,0 +1,19 @@ +# Inversion test + +This is a test setup for inversion calculation. + +1. Run all cells of `make_test_model.ipynb` for creating + - source, receiver file + - true model + - initial model + +2. then run TOMOATT forward with `input_params_pre.yml` for calculating the true arrival times at the stations +-> this will output src_rec_result.dat file which includes the arrival time at each station + +3. run TOMOATT in inversion mode with `input_params.yml`. + +4. at first, TOMOATT calculates 2d traveltime field for each teleseismic event. +TOMOATT will find the event source is teleseismic if the event origin is outside of the simulation domain. +Calculated 2d traveltime field is saved in OUTPUT_FILES directory with 2d_travel_time_field_{src_id}.h5 +2D solver run will be skipped if this file is found by TOMOATT. + \ No newline at end of file diff --git a/test/old_tests/inversion_tele_one_src/STATIONS b/test/old_tests/inversion_tele_one_src/STATIONS new file mode 100644 index 0000000..45b9ebc --- /dev/null +++ b/test/old_tests/inversion_tele_one_src/STATIONS @@ -0,0 +1,51 @@ +50 +0.0 39.48283902145424 29.281513864182138 +0.0 43.998782050303745 37.19643899137363 +0.0 37.30760565117001 33.11401338760367 +0.0 41.68653979748724 35.934639928020964 +0.0 36.61537788634567 23.78498599183464 +0.0 39.53372622366508 23.841070463667265 +0.0 40.35236327081236 19.52357011656586 +0.0 40.521021601341126 15.382805946506043 +0.0 40.652338638485574 15.43974831654911 +0.0 36.06181789303116 31.492644232896822 +0.0 40.220383199721056 30.131592405768828 +0.0 32.690556139214564 29.12155270260603 +0.0 41.38557105851774 21.887079844236876 +0.0 31.5803169410531 15.828284584124932 +0.0 39.72076150617663 29.444060586520337 +0.0 39.153291824326395 15.348344308914173 +0.0 37.3196743759749 24.882795770531047 +0.0 45.38532464248119 31.54872211314764 +0.0 35.027710629652205 20.71225367598449 +0.0 34.73430718282967 30.761114486702205 +0.0 41.62771310002017 20.964465183242254 +0.0 41.96541753785979 22.638041556854436 +0.0 34.18819520502442 31.526202657153434 +0.0 33.289630995715136 26.11544195974523 +0.0 44.99003971165912 31.18999369792465 +0.0 43.71764805530941 27.09889711083143 +0.0 39.149408331767305 24.672389827246107 +0.0 40.94054916696042 19.539882515019904 +0.0 39.55054219303491 17.883860634990157 +0.0 45.51670367081901 35.889274144396786 +0.0 45.09106334932971 23.658196610348384 +0.0 45.3510270418072 33.647693941540325 +0.0 38.04870033400669 25.845480891830285 +0.0 40.2502568580665 27.674022408814878 +0.0 38.91110035012384 23.488821700130032 +0.0 33.038736736209884 31.45966132466628 +0.0 45.13288373382176 32.43630443882502 +0.0 38.95996799830328 24.837368712391495 +0.0 43.491229999719096 29.79312700226344 +0.0 35.465004203274056 33.62459653703114 +0.0 40.21403161430093 17.72710938876384 +0.0 39.55239238847392 19.234971464234178 +0.0 35.94933583184151 22.513051849149996 +0.0 44.119556199620654 20.89644919626955 +0.0 35.522471813078226 19.309847752271143 +0.0 41.32129208930305 29.532291144989525 +0.0 38.64267131605151 25.351066793111908 +0.0 34.925624689463994 33.227497100537946 +0.0 33.199759796131325 22.212825309023625 +0.0 34.47881106709583 28.51463648501263 diff --git a/test/old_tests/inversion_tele_one_src/check_1d_model_and_Tfield.ipynb b/test/old_tests/inversion_tele_one_src/check_1d_model_and_Tfield.ipynb new file mode 100644 index 0000000..242fb28 --- /dev/null +++ b/test/old_tests/inversion_tele_one_src/check_1d_model_and_Tfield.ipynb @@ -0,0 +1,157 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'P-wave velocity (km/s)')" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# plot 1d_model.txt\n", + "fname_gen='1d_model.txt'\n", + "fname_ori='1d_ak135.txt'\n", + "\n", + "r_earth = 6371.0\n", + "\n", + "# read file\n", + "\n", + "dep_gen=[]\n", + "vp_gen=[]\n", + "\n", + "with open(fname_gen, 'r') as f:\n", + " lines = f.readlines()\n", + "\n", + " for line in lines:\n", + " line = line.strip()\n", + " if line.startswith('#'):\n", + " continue\n", + " else:\n", + " line = line.split(\",\")\n", + " dep_gen.append(r_earth-float(line[0]))\n", + " vp_gen.append(float(line[1]))\n", + "\n", + "dep_ori=[]\n", + "vp_ori=[]\n", + "\n", + "with open(fname_ori,'r') as f:\n", + " lines = f.readlines()\n", + "\n", + " for line in lines:\n", + " line = line.strip()\n", + " if line.startswith('#'):\n", + " continue\n", + " else:\n", + " line = line.split(\",\")\n", + " dep_ori.append(float(line[0]))\n", + " vp_ori.append(float(line[1]))\n", + "\n", + "\n", + "# plot dep and vp\n", + "import matplotlib.pyplot as plt\n", + "\n", + "plt.plot(dep_gen, vp_gen, linewidth=10, label=\"1d model in run\")\n", + "plt.plot(dep_ori, vp_ori, label=\"reference 1d model\")\n", + "\n", + "plt.legend()\n", + "plt.xlabel(\"depth (km)\")\n", + "plt.ylabel(\"P-wave velocity (km/s)\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "ename": "OSError", + "evalue": "Unable to open file (unable to open file: name = 'OUTPUT_FILES/2d_travel_time_field_0.h5', errno = 2, error message = 'No such file or directory', flags = 0, o_flags = 0)", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mfname_Tfield\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'OUTPUT_FILES/2d_travel_time_field_0.h5'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0;32mwith\u001b[0m \u001b[0mh5py\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mFile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname_Tfield\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'r'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0mT_2d\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'T'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mt_1d\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m't'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/.pyenv/versions/3.9.1/lib/python3.9/site-packages/h5py/_hl/files.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, name, mode, driver, libver, userblock_size, swmr, rdcc_nslots, rdcc_nbytes, rdcc_w0, track_order, fs_strategy, fs_persist, fs_threshold, **kwds)\u001b[0m\n\u001b[1;32m 422\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mphil\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 423\u001b[0m \u001b[0mfapl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmake_fapl\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdriver\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlibver\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrdcc_nslots\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrdcc_nbytes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrdcc_w0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 424\u001b[0;31m fid = make_fid(name, mode, userblock_size,\n\u001b[0m\u001b[1;32m 425\u001b[0m fapl, fcpl=make_fcpl(track_order=track_order, fs_strategy=fs_strategy,\n\u001b[1;32m 426\u001b[0m fs_persist=fs_persist, fs_threshold=fs_threshold),\n", + "\u001b[0;32m~/.pyenv/versions/3.9.1/lib/python3.9/site-packages/h5py/_hl/files.py\u001b[0m in \u001b[0;36mmake_fid\u001b[0;34m(name, mode, userblock_size, fapl, fcpl, swmr)\u001b[0m\n\u001b[1;32m 188\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mswmr\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mswmr_support\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[0mflags\u001b[0m \u001b[0;34m|=\u001b[0m \u001b[0mh5f\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mACC_SWMR_READ\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 190\u001b[0;31m \u001b[0mfid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mh5f\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflags\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfapl\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfapl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 191\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mmode\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'r+'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 192\u001b[0m \u001b[0mfid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mh5f\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mh5f\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mACC_RDWR\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfapl\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfapl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32mh5py/_objects.pyx\u001b[0m in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mh5py/_objects.pyx\u001b[0m in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mh5py/h5f.pyx\u001b[0m in \u001b[0;36mh5py.h5f.open\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mOSError\u001b[0m: Unable to open file (unable to open file: name = 'OUTPUT_FILES/2d_travel_time_field_0.h5', errno = 2, error message = 'No such file or directory', flags = 0, o_flags = 0)" + ] + } + ], + "source": [ + "# read 2D traveltime field and plot\n", + "import h5py\n", + "import matplotlib.pyplot as plt\n", + "\n", + "fname_Tfield='OUTPUT_FILES/2D_TRAVEL_TIME_FIELD/2d_travel_time_field_0.h5'\n", + "\n", + "with h5py.File(fname_Tfield, 'r') as f:\n", + " T_2d = f['T'][:,:]\n", + " t_1d = f['t'][:]\n", + " r_1d = f['r'][:]\n", + "\n", + "plt.imshow(T_2d, extent=[t_1d[0], t_1d[-1], r_1d[0], r_1d[-1]], aspect='auto')\n", + "plt.xlabel(\"epicentral distance (rad.)\")\n", + "plt.ylabel(\"depth (km)\")\n", + "plt.colorbar()\n", + "#plt.imshow(T_2d)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "vscode": { + "interpreter": { + "hash": "fbd0b2a7df497f398d93ab2f589d8a5daa3108cfb7ff2b90736653cca3aeadc0" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_tele_one_src/compare_with_fortran_code.ipynb b/test/old_tests/inversion_tele_one_src/compare_with_fortran_code.ipynb new file mode 100644 index 0000000..241ba88 --- /dev/null +++ b/test/old_tests/inversion_tele_one_src/compare_with_fortran_code.ipynb @@ -0,0 +1,453 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# compare result from TOMOATT and fortran code\n", + "\n", + "fpath_kernel_fort = './fortran_code/ega5/output/tele_event_kernel_ev1'\n", + "#fpath_synth_fort = './fortran_code/ega5/output/syn_step1_event1' # Table\n", + "#fpath_adj_fort = './fortran_code/ega5/output/adj_step1_event1' # TableADJ\n", + "\n", + "# HDF5 output\n", + "fpath_out_tomoatt = './OUTPUT_FILES/out_data_sim_0.h5'\n", + "fpath_grid_tomoatt = './OUTPUT_FILES/out_data_grid.h5'\n", + "# ASCII output\n", + "fpath_out_tomoatt_ascii_Ks = './OUTPUT_FILES/Ks_inv_0000.dat'\n", + "fpath_out_tomoatt_ascii_Keta = './OUTPUT_FILES/Keta_inv_0000.dat'\n", + "fpath_out_tomoatt_ascii_Kxi = './OUTPUT_FILES/Kxi_inv_0000.dat'\n", + "fpath_out_tomoatt_ascii_T = './OUTPUT_FILES/T_res_inv_0000_src_0000.dat'\n", + "fpath_out_tomoatt_ascii_adj = './OUTPUT_FILES/adjoint_field_inv_0000_src_0000.dat'\n", + "\n", + "# grid information in fortran code\n", + "nr = 55\n", + "nt = 55\n", + "np = 55\n", + "npoints = nr*nt*np\n", + "\n", + "# division\n", + "ndiv_r = 1 \n", + "ndiv_t = 2 \n", + "ndiv_p = 2 " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import h5py\n", + "import numpy\n", + "\n", + "\n", + "# read fortran test file and convert to numpy array\n", + "def read_fortran_result_file(fpath):\n", + " with open(fpath, 'r') as f:\n", + " lines = f.readlines()\n", + " lines = [line.strip() for line in lines]\n", + " lines = [line for line in lines if line]\n", + " lines = [line.split() for line in lines]\n", + " lines = numpy.array(lines, dtype=numpy.float64)\n", + " return lines\n", + "\n", + "fortran_data = read_fortran_result_file(fpath_kernel_fort)\n", + "## change dimension of fortran data\n", + "Ks_fort = fortran_data[:,3].reshape(nr, nt, np)\n", + "Kxi_fort = fortran_data[:,4].reshape(nr, nt, np)\n", + "Keta_fort = fortran_data[:,5].reshape(nr, nt, np)\n", + "Syn_fort = fortran_data[:,6].reshape(nr, nt, np)\n", + "Adj_fort = fortran_data[:,7].reshape(nr, nt, np)\n", + "\n", + "#fortran_synth_data = read_fortran_result_file(fpath_synth_fort).reshape(nr, nt, np)\n", + "#fortran_adj_data = read_fortran_result_file(fpath_adj_fort).reshape(nr, nt, np)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# read h5 data\n", + "import sys\n", + "sys.path.append(\"../../utils/\")\n", + "\n", + "from tomoatt_data_retrieval import get_data_from_h5\n", + "from tomoatt_data_retrieval import get_data_from_ascii\n", + "\n", + "\n", + "## from h5\n", + "i_inv=0\n", + "# fill 0 at flont of i_inv\n", + "str_i_inv = str(i_inv).zfill(4)\n", + "Ks_tomoatt ,_,_,_= get_data_from_h5(fpath_out_tomoatt, fpath_grid_tomoatt, \"Data/Ks_inv_{}\".format(str_i_inv), nr, nt, np, ndiv_r, ndiv_t, ndiv_p, verbose=True)\n", + "Kxi_tomoatt ,_,_,_= get_data_from_h5(fpath_out_tomoatt, fpath_grid_tomoatt, \"Data/Kxi_inv_{}\".format(str_i_inv), nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n", + "Keta_tomoatt ,_,_,_= get_data_from_h5(fpath_out_tomoatt,fpath_grid_tomoatt, \"Data/Keta_inv_{}\".format(str_i_inv), nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n", + "Syn_tomoatt ,_,_,_= get_data_from_h5(fpath_out_tomoatt, fpath_grid_tomoatt, \"Data/T_res_src_0_inv_{}\".format(str_i_inv), nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n", + "Adj_tomoatt ,_,_,_= get_data_from_h5(fpath_out_tomoatt, fpath_grid_tomoatt, \"Data/adjoint_field_src_0_inv_{}\".format(str_i_inv), nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n", + "\n", + "## from ascii\n", + "#Ks_tomoatt = get_data_from_ascii(fpath_out_tomoatt_ascii_Ks, nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n", + "#Kxi_tomoatt = get_data_from_ascii(fpath_out_tomoatt_ascii_Kxi, nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n", + "#Keta_tomoatt = get_data_from_ascii(fpath_out_tomoatt_ascii_Keta, nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n", + "#Syn_tomoatt = get_data_from_ascii(fpath_out_tomoatt_ascii_T, nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n", + "#Adj_tomoatt = get_data_from_ascii(fpath_out_tomoatt_ascii_adj, nr, nt, np, ndiv_r, ndiv_t, ndiv_p)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# normalize Ks_tomoatt and Kxi_tomoatt and Keta_tomoatt\n", + "Ks_tomoatt /= numpy.max(Ks_tomoatt)\n", + "Kxi_tomoatt /= numpy.max(Kxi_tomoatt)\n", + "Keta_tomoatt /= numpy.max(Keta_tomoatt)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# plot slice of Ks_inv\n", + "import matplotlib.pyplot as plt\n", + "\n", + "def plot_slice(data_es, data_fort, slice_ax, id_slice, contour=False):\n", + "\n", + " if (slice_ax == 'r'):\n", + " data_es_v = data_es[ id_slice, :, :]\n", + " data_fort_v = data_fort[id_slice, :, :]\n", + " elif (slice_ax == 't'):\n", + " data_es_v = data_es[ :, id_slice, :]\n", + " data_fort_v = data_fort[:, id_slice, :]\n", + " elif (slice_ax == 'p'):\n", + " data_es_v = data_es[ :, :, id_slice]\n", + " data_fort_v = data_fort[:, :, id_slice]\n", + " else:\n", + " print(\"Error: slice_ax should be 'r', 't' or 'p'\")\n", + " return\n", + "\n", + " # use the same color range for both tomoatt and fortran \n", + " combined_data = numpy.array([data_es_v.flatten(),data_fort_v.flatten()])\n", + " #Get the min and max of all your data\n", + " _min, _max = numpy.amin(combined_data), numpy.amax(combined_data)\n", + "\n", + " # make the color range symmetric\n", + " diff_data = data_es_v-data_fort_v\n", + " _min_diff, _max_diff = numpy.amin(diff_data), numpy.amax(diff_data)\n", + " if (abs(_min_diff) > abs(_max_diff)):\n", + " if (_min_diff < 0):\n", + " _max_diff = -_min_diff\n", + " else:\n", + " _min_diff = -_max_diff\n", + "\n", + " cmap1=\"viridis\"\n", + " cmap2=\"seismic\"\n", + "\n", + " plt.figure(figsize=(20,10))\n", + "\n", + " plt.subplot(1,3,1)\n", + " plt.imshow(data_es_v, cmap=cmap1, vmin=_min, vmax=_max)\n", + " plt.colorbar()\n", + " if(contour):\n", + " plt.contour(data_es_v, colors='k', linewidths=0.5)\n", + " plt.title('result_tomoatt')\n", + "\n", + " plt.subplot(1,3,2)\n", + " plt.imshow(data_fort_v, cmap=cmap1, vmin=_min, vmax=_max)\n", + " plt.colorbar()\n", + " if(contour): \n", + " plt.contour(data_fort_v, colors='k', linewidths=0.5)\n", + " plt.title('result_fort')\n", + " \n", + " plt.subplot(1,3,3)\n", + " plt.imshow(diff_data, cmap=cmap2, vmin=_min_diff, vmax=_max_diff)\n", + " plt.colorbar()\n", + " if(contour):\n", + " plt.contour(diff_data, colors='k', linewidths=0.5) \n", + " plt.title('tomoatt-fort')\n", + " plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_slice(Ks_tomoatt, Ks_fort, 'p', 28)\n", + "plot_slice(Ks_tomoatt, Ks_fort, 't', 21)\n", + "plot_slice(Ks_tomoatt, Ks_fort, 'r', 36)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABIcAAAIvCAYAAADu7rsiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABa60lEQVR4nO39eZRt110f+n5/5xz1ki3ZR0hCkpETKbENBDvRNeaGgAP2jQhg+Y3QmCbYGeY5zfUNuaTBhDxCSN6LSUPIDb4jVw/zMBAw4FxjhRgcY+wQCI1kcIzbWDgiknAn2zKW1Z5T8/1R+5CqvebetU9VndrN+nzGqFG1Zs291lx771q/XXP91m9Vay0AAAAAjNOxZQ8AAAAAgOUxOQQAAAAwYiaHAAAAAEbM5BAAAADAiJkcAgAAABgxk0MAAAAAI2ZyCOCQVdUtVfX+qrqrql7R+f1LqupjVfWOyde3LmOcACyHOAHAqjmx7AEAHNSf+7OXtI9/4vSRbOvt73z0Ta21W2b9vqqOJ3lVkucnuTfJHVV1e2vtPVNdf6q19vJzOFQAJsQJAOa5sao9dETb+lAyN04si8khYO19/BOn85tvesqRbOv4NR84uUeXZye5q7X2wSSpqtcmuTXJ9Id+AI6IOAHAPA8l+ctHtK3vSfaKE0thcghYey3JVraWPYwzrk1yz47le5N8YaffX6iqL0nyX5P87621ezp9ADgE4gQA81TU3Bn7/gOcrZNVdeeOr5ftYx3/LskNrbU/keTNSV5zuEMEYInECQDWjswhYAO0nG5Hdkb4/tbazXN+f1+S63csXzdp+0OttY/vWPyhJP/k8IYHwJA4AcB8Y8+cGfv+Axy2O5LcVFVPrarzk7woye07O1TVNTsWX5DkvUc4PgCWS5wAYOXIHAI4RK21U1X18iRvSnI8yQ+31t5dVd+b5M7W2u1J/npVvSDJqSSfSPKSpQ0YgCMlTgCwikwOAWtvu9BoW/Yw/lBr7Y1J3jjV9t07fv7OJN951OMCGCtxAoB5FKS2/wAAAACjJnMI2AgrdItiAFaQOAHAPGPPnBn7/gMAAACMmswhYO21tJxuq1NLAoDVIk4AsJexZ86Mff8BAAAARk3mELARVukuNACsHnECgFncrcz+AwAAAIyazCFg7bUkp50RBmAGcQKAvYw9c2bs+w8AAAAwajKHgI2glgQA84gTAMyi5pD9BwAAABg1mUPA2mtJTjdnhAHoEycA2MvYM2fGvv8AAAAAoyZzCNgIW8seAAArTZwAYJ5a9gCWTOYQAAAAwIiZHAIAAAAYMZeVAWuvpeW0WxQDMIM4AcA8leT4sgexZDKHAAAAAEZM5hCw/lpy2glhAGYRJwDYw9gzZ8a+/wAAAACjJnMIWHstblEMwGziBADzVGTOjH3/AQAAAEZN5hCwASqnU8seBAArS5wAYL6xZ86Mff8BAAAARk3mELD2WpItd6EBYAZxAoC9jD1zZuz7DwAAADBqMoeAjaCWBADziBMAzOJuZfYfAAAAYNRkDgFrr8UZYQBmEycA2MvYM2fGvv8AAAAAoyZzCNgIW80ZYQBmEycAmKUmX2MmcwgAAABgxEwOAQAAAIyYy8qAtafQKADziBMA7OX4sgewZDKHAAAAAEZM5hCw9loqp811AzCDOAHAPBWZM2PffwAAAIBRkzkEbAS3KAZgHnECgHnGnjkz9v0HAAAAGDWTQ8DaO3MXmqP4AmD9iBMA7OXYEX3tpapuqar3V9VdVfWKOf3+QlW1qrr57Pd2yOQQAAAAwJJV1fEkr0ryFUmekeQbquoZnX6XJfm2JL9xWNtWcwjYAJXTzVw3ALOIEwDMtkJ3K3t2krtaax9Mkqp6bZJbk7xnqt8/TPJ9Sf72YW14RfYfAAAAYNSuTXLPjuV7J21/qKr+ZJLrW2v//jA3LHMIWHstyZa5bgBmECcA2MsRRomTVXXnjuXbWmu3LfLAqjqW5PuTvOSwB2VyCAAAAOBo3N9am1VE+r4k1+9Yvm7SdsZlST4vyduqKkmuTnJ7Vb2gtbZzwumsmRwCNoI7xAAwjzgBwCwrVHPojiQ3VdVTsz0p9KIk33jml621TyU5eWa5qt6W5G8ddGIoWZn9BwAAABiv1tqpJC9P8qYk703y0621d1fV91bVC87ltmUOAWuvNXehAWA2cQKAvaxKfmlr7Y1J3jjV9t0z+j73sLYrSgIAAACMmMkhAAAAgBFzWRmwEbZWJhEUgFUkTgAwz/FlD2DJZA4BAAAAjJjMIWDttSSnzXUDMIM4AcA8K3Qr+6UZ+/4DAAAAjJrMIWADuEUxAPOIEwDMN/YoMfb9BwAAABg1k0PA2mtJtnLsSL4WUVW3VNX7q+quqnrFnH5/oapaVd18WM8FAEPiBADznKk5dBRfq2qVxwawdqrqeJJXJfmKJM9I8g1V9YxOv8uSfFuS3zjaEQKwTOIEAKtIzSFgI5xutewhnPHsJHe11j6YJFX12iS3JnnPVL9/mOT7kvztox0ewDiJEwDMM/bMmbHvP8DZOllVd+74etnU769Ncs+O5XsnbX+oqv5kkutba//+HI8VgKMnTgCwdmQOAWuvpXL66Oa672+t7bv2Q1UdS/L9SV5yaCMCYC5xAoC9jD1zZuz7D3DY7kty/Y7l6yZtZ1yW5POSvK2q7k7ynCS3KzYKMBriBAArR+YQsBG22srMdd+R5Kaqemq2P+y/KMk3nvlla+1TSU6eWa6qtyX5W621O494nACjIk4AMMuZu5WN2dj3H+BQtdZOJXl5kjcleW+Sn26tvbuqvreqXrDc0QGwbOIEAKtI5hCw9lpylLUk9tRae2OSN061ffeMvs89ijEBjJk4AcBeVuaelkuyOlESAAAAgCNncggAAABgxFxWBqy9lsrpNvZEUABmEScAmKeSHF/2IJZM5hAAAADAiMkcAjbClrluAOYQJwCYZ+xRYuz7DwAAADBqMoeAtddacrqZ6wagT5wAYC9jjxJj338AAACAUZM5BGyAylbchQaAWcQJAGaryJwZ+/4DAAAAjJrMIWDttaglAcBs4gQAexl7lBj7/gMAAACMmswhYCOcNtcNwBziBACzqDlk/wEAAABGTeYQsPZaKlvNXWgA6BMnANjL2DNnxr7/AAAAAKMmcwjYCGpJADCPOAHAPGPPLxUlAQAAAEbM5BAAAADAiLmsDFh7LclWM9cNQJ84AcA8leT4sgexZKIkAAAAwIjJHAI2QOX06EvIATCbOAHAfGPPnBn7/gMAAACMmswhYO2pJQHAPOIEAPNUZM6Mff8BAAAARk3mELAR1JIAYB5xAoB5xp45M/b9BwAAABg1mUPA2mut1JIAYCZxAoC9jD1KjH3/AQAAAEZN5hCwEU47IwzAHOIEALO4W5n9BwAAABg1mUPA2mtJttyFBoAZxAkA9jL2zJmx7z8AAADAqMkcAjZAqSUBwBziBADzjT2/VJQEAAAAGDGZQ8Daa0m22tjn+gGYRZwAYJ5KcnzZg1gymUMAAAAAI2ZyCAAAAGDEXFYGbITT5roBmEOcAGCesUeJse8/AAAAwKjJHALWXkspNArATOIEAPNUZM6Mff8BAAAARk3mELARtsx1AzCHOAHAPGOPEmPffwAAAIBRkzkErL3WktNqSQAwgzgBwDxqDtl/AAAAgFGTOQRsBHehAWAecQKAecaeOTP2/QcAAAAYNZlDwNprqWw1c90A9IkTAMyj5pD9BwAAABg1mUPARjgdtSQAmE2cAGCesWfOjH3/AQAAAEZN5hCw9lrchQaA2cQJYKeqqiQ/nOSFST7QWnv2ckfEKhh75szY95+zVFVvq6pvXfY4ANgc+40tVXVRVf27qvpUVf3MuRgbANuq6u6qet6yx7FTVb2kqn5lqu1Hquof7fHQL07y/CTX7XdiqKpaVd24n8fCKjI5xL71DsZz+i5ykD5yVXXD5MB+YkfbwvsFwOE6y2Pw1yS5KsmTW2tfu49tDWIAAKPwOUnubq195mwfKGawqUwObSgHLcZl+xbFR/G10Giqbqmq91fVXVX1is7v/0pV/U5VvaOqfqWqnnHoTwmcAysYWz4nyX9trZ062weu4L5wTokTcBBV9WNJnpLk31XVg1X1d6rqBVX17qp6YJIB+vQd/e+uqr9dVe+sqs9U1aur6qqq+vmq+nRV/WJVXbGj/7x1vaKqfnfyuPdU1f9j0v70JP86yRdNxvRAVb0syTcl+TuTtn/X2ZeXJvmhHY/7B5P2/+fkb/ITVXV7VX32jse0qvpfq+oDST5QVb88+dV/mazj6w/v2WYZztzK/ii+VtUqj42zNDkIf0dVvTPJZ6rqi6vqP08OlP+lqp67o+9LquqDk4Psf6uqb5q0f09V/fiOft2zqr2D8ZxxdQ/SVfX0ycH/gUkweMGOx/xIVf2fkwDyYFX9alVdXVU/UFWfrKr3VdWzdo5nzrq+sqp+u6r+oKruqarv2TG8Mwf2Bybb+aJF9wt6qup4klcl+Yokz0jyDZ0P9T/RWvv81tozk/yTJN9/tKOExa1wbPkHSb47yddP+r60qo5V1d+rqt+rqo9W1Y9W1ROntvnSqvrvSX4p/RgA55Q4wTpqrf3FJP89yVe31i5N8rNJfjLJ30hyZZI3Znvi6PwdD/sL2b50648l+eokP5/k7076H0vy15Okqv7YHuv63SR/JskTk/yDJD9eVde01t6b5K8k+bXW2qWttctba7cl+TdJ/smk7as7+/Lqqcf9/ar6siT/OMnXJbkmye8lee3UQ1+Y5AuTPKO19iWTti+YrOOnFn0uYVWZHNo835DkK5P8kSRvSPKPkjwpyd9K8m+r6sqquiTJ/5HkK1prlyX5n5O842w20jsYz+k7OEhX1XlJ/l2S/5Dks5L8b0n+TVX98R0P/bokfy/JySSPJvm1JL81WX5dJh+UFljXZ5J8S5LLJ8/NX62qF05+d+bAfvlkbL+26H6xWrZSR/K1gGcnuau19sHW2mPZ/mBx684OrbU/2LF4SbZrpcIqW8XY8veT/H+S/NSk76uTvGTy9WcnY700yQ9OPfRLkzw9yZ9LPwawocQJOFRfn+Tft9be3Fp7PMk/S3JRto/9Z/yr1tpHWmv3JflPSX6jtfbbrbVHkrw+ybMWWVdr7Wdaa7/fWtuaTMJ8INt/R4fpm5L8cGvtt1prjyb5zmyfqLhhR59/3Fr7RGvt4UPeNitC5hCb5v9ord2T5JuTvLG19sbJgfTNSe5M8ucn/baSfF5VXdRa+1Br7d1HPM7nZPtD+ytba4+11n4pyc9l+x+QM17fWnv7jgDySGvtR1trp5P8VP5HQJm7rtba21prvzN5Ht6Z7TMTX3oUO8lGOllVd+74etnU769Ncs+O5XsnbbtMUpN/N9tnhP/6uRsuHIp1iS3flOT7J/90P5jtD/cvmspQ+p7W2md8uOccEicYg8/OdnZNkqS1tpXt9/XO9/JHdvz8cGf50kXWVVXfUtuXWD4wySj9vGyfLF5IVX3TJDv0war6+QX358EkH5/an3umHwSbxPX2m+fMQetzknxtVe1MpTwvyVtba5+p7eti/1aSV1fVryb5m6219x3hOD87yT2Tg/8Zv5f9B5SZ66qqL0zyymwHkvOTXJDEXW02SGvJ6aO7RfH9rbWbD7qS1tqrkryqqr4x2xlyLz7wyODcWafY8ns7ln8v2591rtrR5sP9CIkTcCh2ZrD9fpLPP7NQVZXk+iT37WO9M9dVVZ+T5P+b5MuznVV6uqrekfxhml4vq25XW2vt32T7Koa9xvA5O8ZwSZInZ/f+yODbYGdqDo3Z2Pd/E505aN2T5Mcm196e+bqktfbKJGmtvam19vxsX1P7vmwfdJPtS7Au3rG+qxfY1tmM64zfT3J9Ve18Dz4l+w8o89b1E0luT3J9a+2J2a5nsXBAgbN0X7Y/0JxxXea/r1+b7WvYYZWtamyZtuvDfbZjwansPrnQZvwMR0WcYF19JNuX7CbJTyf5yqr68kmJh7+Z7TIQ/3kf6523rjOXVX4sSarqL2X7hO/OMV03Veto5zgX9ZNJ/lJVPbOqLsj2Zcu/0Vq7e85j9rMdWFkmhzbXjyf56qr6c1V1vKourKrnVtV1tX2ngFsnM+KPJnkw25cCJNv1Ib6kqp4yKeL5nXO20TsYz+u78+D5G0keynaR6vMmBU2/OsPCb4vYa12XJflEa+2Rqnp2km/c8diPZXvfd47tbPaLFbFCd6G5I8lNVfXUyXvoRdmenPxDVXXTjsWvzPa187AOVi22TPvJJP/75O/v0vyPmkSz7mbWiwFsKHECDuwfJ/l7k0u7vjrblxr/qyT3T5a/elJH66y01t4/a12ttfck+efZrj36kWxnGP3qjof/UpJ3J/lwVd0/aXt1kmdMLkP72QXH8ItJ/l9J/m2SDyX5o9n+25zne5K8ZrKdr1tkO6y2sdccclnZhmqt3VNVt2b7OvWfTHI6yW8m+avZfk9+e5IfzfZM/Dsm7WmtvbmqfirJO7N9cP6+JC+YXv/EzoPxVmtt3rW/r07yM5Ng8rbW2gsnlyX8n9n+J+G+JN+yn8sPWmuP7bGuv5bkn1fVDyb5j9k+O3H55LEPVdX/O8mvTs5U3HKW+wW7tNZOVdXLk7wpyfFsFzd8d1V9b5I7W2u3J3l5VT0vyeNJPhmXCrAmVjC2TPvhbF9a9stJLsz23+H/Nmd/BjGgtfbrZ7E9OGviBOuqtfaGbN+UYKfXz+h7w9TyN08t/1C2byd/Zvn1c9b1XUm+a8bvHsv2BOrOtg8keWav/44+P5LkR6ba/nW2rzDo9R9clzqvP6yjak1GNbDenvz0K9uf/5Fb9+54CH78Oa9++2HUkgDg6IgTAMxzc1W7s46mNl1t33Rp5eLEKmc1AQAAAHCOuayMQ1NV787uQqBn/OXJXQLgnNnKkd2FBjhCYguHRZwAYKaq5MQRTY88/vjRbOcsmRzi0LTWPnfZYwBgs4gtAADn3oEuK6uqW6rq/VV1V1W94rAGBXA2WpKtVkfyxdkRJ4BVIE6sLnECWBknThzN14ra98iq6niSVyV5fpJ7k9xRVbdPbjfY39jFl7Tznvik/W4S2ECPf+oTOfXQZ3ya3kDiBHAYxInNtZ84cfLkyXbDDTcc0QiBdXD33Xfn/vvvFycO6CDTVs9Ocldr7YNJUlWvTXJrkpkH8/Oe+KQ89S99+wE2CWya//b/+/5DWc9WU19/BYkTwIGJExvtrOPEDTfckN/8zTuPaHjAOnj2sw/hxl9HWXNoRR0kSl6b5J4dy/dO2napqpdV1Z1Vdeephz5zgM0BsGbECQDmOes48bGPfezIBgcwJuf8FEpr7bbW2s2ttZtPXHzJud4cAGtGnABgnp1x4sorr1z2cAA20kHypu5Lcv2O5esmbQBHSxHQVSVOAKtBnFhV4gSwGlxWdqDMoTuS3FRVT62q85O8KMnthzMsADaAOAHAPOIEwIrY99RYa+1UVb08yZuSHE/yw621dx/ayAAW1JJsxRnhVSNOAKtCnFhN4gSwMmQOHeiysrTW3pjkjYc0FgA2jDgBwDziBMBqGPfUGLAx1JIAYB5xAoCZZA6d+7uVAQAAALC6xj01BmyEFmeEAZhNnABgTzKHAAAAABircU+NARvDGWEA5hEnAJhJzSGZQwAAAABjNu6pMWAjtJQzwgDMJE4AMJfMIZlDAAAAAGM27qkxYGNsxRlhAGYTJwCYSeaQzCEAAACAVVBVt1TV+6vqrqp6Ref3315V76mqd1bVW6rqcw5ju+OeGgM2Q3MXGgDmECcAmGdFMoeq6niSVyV5fpJ7k9xRVbe31t6zo9tvJ7m5tfZQVf3VJP8kydcfdNsyhwAAAACW79lJ7mqtfbC19liS1ya5dWeH1tpbW2sPTRZ/Pcl1h7Fhk0MAAAAAR+NkVd254+tlO353bZJ7dizfO2mb5aVJfv4wBrX8vCmAA2pxuQAAs4kTAOzp6C4ru7+1dvNBV1JV35zk5iRfevAhmRwCAAAAWAX3Jbl+x/J1k7Zdqup5Sb4ryZe21h49jA2bHAI2gjPCAMwjTgAw04oUpE5yR5Kbquqp2Z4UelGSb9zZoaqeleT/SnJLa+2jh7VhNYcAAAAAlqy1dirJy5O8Kcl7k/x0a+3dVfW9VfWCSbd/muTSJD9TVe+oqtsPY9srMTUGcBAt5YwwADOJEwDMtTqZQ2mtvTHJG6favnvHz887F9uVOQQAAAAwYqsxNQZwQM0ZYQDmECcAmGmFMoeWReYQAAAAwIiNe2oM2BhbcUYYgNnECQBmkjkkcwgAAABgzMY9NQZshNbiLjQAzCROALCnkWcOre3eH3902Hbep9ue/VonV+r0hZ22C4YfILbOG/Zrx6eWe587fBYBAICV8rGPDdve/e5h27337l6+4IJhn+uvH7ZdffWw7eTJYduFU/+LjPz/U2BJHHqAjeAuNADMI04AMJOaQ2oOAQAAAIzZuKfGgA1RakkAMIc4AcAcModkDgEAAACM2fpOjW0Nm3pFqs9/cHfHXkHqxzuN7diwuHU7PjzjNHho76TUcFWKVAMAwBI92vnfYbr4dJK87327l6cLSCfJ6dPDtl6/Xtt0ssLIkxeAJXHoATaCQqMAzCNOADCTy8pcVgYAAAAwZuOeGgM2QksUGgVgJnECgLlkDskcAgAAABiztZ0aa8eHbacu6vXce/7r9AW99XeKTzvhtPp6xb97vJabpSVt0dceGI/DPC6IG+tNnKDj0kuHbTfcsPfjeskFV1+92Pp7Bak5Gsd6dzQaqS05IkMyh7wrAAAAAMZs3FNjwMbYclofgDnECQDmkjkEAAAAwFjtOTlUVT9cVR+tqnftaHtSVb25qj4w+X7FuR0mwGwtSWt1JF8MiRPAqhMnlkucAFbemZpDR/G1ohYZ2Y8k+cEkP7qj7RVJ3tJae2VVvWKy/B2HP7zZugWpLx4G5K3z9reurc4z0+u3UIayzwkH1ykiWQcoLLk1NS166uLhyk532lpnOvXY47tf4GOPdfo8NnwTHDvVGdgh7ycckR/JCsYJRqZ3/OzVHl30mDp1vO/9z3+Y8wCO9Wy4H8kKxolecegbbxy2nTy597p6xacXLUi9wv8rbr5TvQ/kC3rkkd3L99477PPf/tuw7dFHh22XX757uVfhvPdG7L3Jem+oqbZ1L86toPa5seehqLX2y1V1w1TzrUmeO/n5NUneFh/6gaWpbDlbuzTiBLD6xIllEieAleduZfuecruqtfahyc8fTnLVIY0HgM0gTgAwjzgBsEIOPDXWWmtVs5Ohq+plSV6WJCee4FJi4NxoLslYWeIEsArEidV1NnHiKU95ypGNCxgRmUP7zhz6SFVdkyST7x+d1bG1dltr7ebW2s0nLr5kn5sDWB9VdUtVvb+q7prUUZj+/bdX1Xuq6p1V9Zaq+pxljPMcEycAZhAnkuwzTlx55ZVHNkCAMdnv1NjtSV6c5JWT7284tBEtqFcYuFd8erqwdO+cRPcS9M76F7pU/RAvZ+9t79Qlwx3oFVPuFc8+9vju5eOPdook99o6ddrO+/Sw7ZKP7C5sdsEnHh/0aceH63/8suFgH33C7hdg0WLjWwsWDZ9+7GPXDMd6/fUfH7RdfuHDg7YPP3jZruX7P/aE4RA+MRzsic8MB9Z7TXJ6al3OfHatyh1iqup4klcleX6Se5PcUVW3t9bes6Pbbye5ubX2UFX91ST/JMnXH/1oz6mlxwn+h/3+eRzoeLPAYxdd/yLjP9fHxm5B6kVvVDE1tl6h7EWHLwbsnzixcpYeJ3rFoafrAif9mr/TFqgBPLPtXDp2qnOnlLvuGra9733DtoeHn3sHT9D11w/79Aond57YD3744kHbz/7s7uU77xyuqvccfu7nDtue9azdyzfeOPwH7+TJ8wdtvde7W8D5/vt3L7/udcM+P/RDw7Z77hm2ff7n716+5ZZhny/+4mHb0542bFukcPXIM2S6ZA4tdCv7n0zya0n+eFXdW1UvzfZB/PlV9YEkz5ssA5A8O8ldrbUPttYeS/LabBfd/EOttbe21h6aLP56kuuOeIyHSpwAOCvihDgBsHIWuVvZN8z41Zcf8lgANsG1SXaeEro3yRfO6f/SJD9/Tkd0jokTAGdFnPgfxAmAFTHuvClgI7R2pJcLnKyqnUnOt7XWbtvPiqrqm5PcnORLD2VkAHSJEwDsaeSXla3v3veu/V+gvPahX6p/1JevL1jzoJ03vC52a+oqwl4toUVrLR07NXwmz//U7hVe+PudwkQdJ64cFqBtxy7YvdzZx61O/aLab62oU8MHPnJq+Ofx2OnhQAYfNo913mW992ZvXAuMtbc/alAcqftbazfP+f19SXZegH/dpG2Xqnpeku9K8qWttUcPd4iwmgbHqgWPXd0yPjV/edbjFt3AipSnYT2JE2usV4do2qnOZ+i1+p+ytwO9+kIPPLD3uq7o3GW0V7Sns80HHxx2e9e7di//wi/sPYQk+djHhm3nTZX87A2r93r3XssLLxx+mD82/eDeBnpFrHrP6/Gp/zF6r9GibbBP63QYA5hpa3X+k7sjyU1V9dRsf9h/UZJv3Nmhqp6V5P9KcktrbebdWQA4POIEADMpSL3vW9kD0NFaO5Xk5UnelOS9SX66tfbuqvreqnrBpNs/TXJpkp+pqndU1e1LGi4AR0ycAGAVjXtqDNgYbYUurWutvTHJG6favnvHz8878kEBjJw4AcBMModkDgEAAACM2WZNjS1yKXnvrNHKXIK+t2OPDgd7oluce1g4eboQ6LHHh4+r0522znN2+vzhRh+9YvfbqdoTOusfruzxy4ZjPXXh7vWfPq9XFXvY1C0n0CtSOlWvu04POz1+ajiux7c6lbFZCUd4FxpYO6tStH76z/Rc/9UuGhO6Fum3YCHr6SY3FlgOcYLDslbJBb3Bnjw5bHv604dtvYrR00WYewWXe4WZO+PoPfTmqVLuvXrLjzwybLvxxmHbtdfuPazpOtBnZZHnotd2yfBmPIPq2Rw9mUMyhwAAAADGbNxTY8BGaClnhAGYSZwAYC6ZQzKHAAAAAMZs3FNjwMZQrgOAecQJAOYaeebQ+PZ+jTKKe8Upj3WKstXDw51aqNjlVqdPp61nq1Mz7eEn7U5Ee/ziTqfOPrXOu/DxS2pquTOG8zsDW7Ci5+mpx7aLh0/sxRc8Nmi76MSwivdDx3fvZx0bjuFARVEB1lHvGDd1eDzQVT5Tjz3XVwy1TtHS1su/7hWpnr4JwqIxwWwGcC70iiRPF1dO+pWfp/957j2u9w/2ggWpv/iLdy/fcMOwT69IdW9d0499ysmHhp3uv3/Y9pnOBnr79OEP716+995hnwce6Kz/M8O2xzt3CprW2/FFTT925JMg9HlXAOuvuQsNAHOIEwDMo+aQmkMAAAAAYzbuqTFgc7j8AoB5xAkAZpE5JHMIAAAAYMzGPTW2RHV677ZebeXe5fLdIpm9tgUutV+wnnN3/acu3r28dUFvsL2NDptOXzD1sF5t6xOLDbY31tOX7q4Oet5FCxSBS/LAIxcN2x7cveNbnx4O9vwHhzt5/KFhW7fg+Dks4ApwpNboGDRdbHrR4tOLrXyxtkVjMjBOvXrRn/707uXTp4cHrwsvvHixtsuH6z/Wu6PNPl166bBtuoj0VVcN+5zu/B91vPN5/8orpxo+/MCw04MPzhjdlN6T/YEP7F7uFaTuDezaa4dtT3/67uXP+7xhn15bp2L3Vue1HNSjHq4JvC+AzaDQKADziBMAzOSyMpeVAQAAAIzZuKfGgI3RXH4BwBziBAAzyRwyOXRQNXXZba+WUK+OQLe2zPRjezWHerWEOv22erULpusn9LKrD5BxPT22rQPkpU2PrTrP17EF08Pb8eGTceyR3Y99/FMXDPp86NHhn0fbGm6zHtzd76KPDF+kiz46HMP5n+5cs93ZpVMX1tzlJNkaDj9bnfdKL1dw8DTKuofVtd9/bv1dn7VBvZ9emY0FawdNt01/dkiSYwt+fuha4PVd+Ioq7xU4ctP1YHrlbR5+eNj26KPDtukSOtPrTvq1fi65ZPb4djpx4tjU8mKPW7RW0fTYLrxwsfUvtM3eji+6A73aRNdcs3v5C75g2Ofqqxfb5h/9o7uXv/qrB13+87ueMGi763XDVfVMD+O664Z9nvzkYdtllw3besMf+ZzKxvAyAmuvRS0JAGYTJwDY08hnudQcAgAAABixcU+NAZuh5SyumQBgdMQJAOZRc0jmEAAAAMCYjXtq7DBMF5nsFJTsFZ9eqIhlZ+quV8Ty+Gc6BZc725w+YbZ13rDP1vmdYsedfq1X2HiRgtcLGhQC7Tyvveeip50eDuS8qcLSxx/uDXb451GdgtTHp4oBnv/AcE0XfWI42PM+Pdypdny4/mOX7q4s3X1ejw0be/0WKkLee2+uwclWd6FhFBb5W+zdkGDRYsoLbO9AyRfn8FgyiBsHNL267g0n9qn7evTuUbDgPg1eE6f+usQJVtV00ehe7eNeW69w9bReIkTvcR/+8GL9ptd3+eXDPv224YGpV2x6ev2HmsixyAbP5rHTbTfcsNi6ets8eXLX4jvvunjQ5dd/ffiwD3xg2HbRRcO2G2/cewi9XTyv839gr673RpA55OMDAAAAwJiNe2oM2BzOCAMwjzgBwCwyh2QOAQAAAIzZuKfGgA1Rae5CA8BM4gQAc8gcMjl0YFOfM3qFmreOD9sW0lnXsceHbSc6xeLOf7BT2XIqnfrURcMPSY8Pa591+22dP+w32NyieWkLfFbrFeVcNDt8kSLh5z/SKVr94HALxx/be6u1NezTOgWjH790+MbYOjHsd+rC3W3dQuKd91j3+fe5GMZp0SLV0w/rHDNqkcL2Mx47rPK89xiWZaFi0L3ndb+XLvWewwX7Aett+v/RXmHg6aLVs/pNu+CCYdunPjVsu//+Ydtdd+29/quvHrb16jL3xj9VgznJcJ8O9X/13soW3UBvB6YqM//+h4cfvnvPYe+5ntYrBt57vW+6ac9hJRm+Tr2i4Qep181m8HIDm0EtCQDmEScAmEXmkJpDAAAAAGNmcggAAABgxMadNwVshhaFRgGYTZwAYC8jv6xs3Ht/CAafMxYtDLyIBT/DnLqo1zrc6PQ4eo87dXGn+HSnAPJ+P1/tu1DnYa9r+rG9dS1aYHWq7fR5vaLSvcd1nuve++fE/gpS9/ICF3rdfHaGzbPg8Wy6SPWxBYpWz1pXNzd5qm3hw/gqHJfOdb2aBQt99+x7zmMVnldgoYLUi/7Put//ba+7brF1TRc7vvHGYZ/PPvnYsPGBB4ZtnaLLydTOr0qV5M42Hzu1O6j1alYvuKpBW69g9KKvUe8pm17fJZcM+1zU+d9wVZ5+joaXFtgMCo0CMI84AcAsClKrOQQAAAAwZuOeGgM2iOsjAJhHnABgBplDe2cOVdX1VfXWqnpPVb27qr5t0v6kqnpzVX1g8v2Kcz9cAFaNOAHAPOIEwOpbZGrsVJK/2Vr7raq6LMnbq+rNSV6S5C2ttVdW1SuSvCLJd5y7oa6oqZNQ+y4+vaCtzivWKyJ9+vxhv+mxbV3QW9ew7fFLhhfpt/OGbXV69/Kxx4bjOv7osK06xdum19VzmMWte0WeH+88r8c6z+uJh3cP5II/GFZwPfFI5znsFJF+/KLhG+jxqYJxrVPIutO0UPHsjaKWxDKJE6ukdzzodesVrV/kgZ22buzrrX+dL2bvHT97z0Wv0Pcix6dFj2ELrN9NuWYQJ5ZJnDgLvSLAPb0CyIskPiyaHHHy5LBtuiD1ky58aNjpXe8btt1117DtkU5F6unKyVdfPezTa+tVcJ5+Ig85K2SRItK9gt292tz33rt7+R3vGPa5//5hW++90itcPT2OXp/zOv8P7fc9tpZkDu2dOdRa+1Br7bcmP386yXuTXJvk1iSvmXR7TZIXnqMxArDCxAkA5hEnAFbfWU2NVdUNSZ6V5DeSXNVa+9DkVx9OctXhDg3gLDgjvBLECWBliRMrQZwAVpLMocXvVlZVlyb5t0n+RmvtD3b+rrXWMiPkVtXLqurOqrrz1EOfOdBgAVhd4gQA8xxGnPjYxz52BCMFGJ+Fpsaq6rxsH8j/TWvt/540f6Sqrmmtfaiqrkny0d5jW2u3JbktSS665vrNP2ez6HX+3QIQCzysM53Xq5fTfWWn1r/Vq3lz2bBeznlPGf6zdvXlfzBoe+TU7o3e/8nLBn0e/cSw0NGJTw936vjDuwd7rHO9a/cp3GfNhl79n60Fa/ac/9Hdz9kTf3v4p3D6rv82fOCx4UYvu+H6QdsjT33yruXPXD18wR994vA57NWU6tWsGryn9vneXKoWRTaWTJxYcfusQ9QtOdRbV+cY2q0vNP3YYcjpH8c7bYdZd27fFqxDNHhYr67eAWoOTT/X3WEtOtZNPZSKE0t3WHHi5ptvXoW//pWw3ySH3uOu6JQC79WbGdS4ebDT6e67h20//uPDtjvuGLZNF+75oi8a9nnuc4dtn/d5w7bpwjrTBZOSxQs8LeAgq/+FX9i9/IpXDPs8/vivdx45LIha9ScHbd/8zbuXb7lluKbeU3jVgrl8h/g0LpfMofmqqpK8Osl7W2vfv+NXtyd58eTnFyd5w+EPD4BVJ04AMI84AbD6Fpka+9NJ/mKS36mqd0za/m6SVyb56ap6aZLfS/J152SEAAtoziMukzgBrDxxYqnECWC1qTm09+RQa+1XMjvJ+MsPdzgArBtxAoB5xAmA1TfuqTFgczgjDMA84gQAs8gcMjm0NPutibhgUdH9rv/Yo8MHPvLpYWXj9sRhvz918t7dDSeH63//H3zWoO3ujzx50Pbox3dvs1u0+pHhGHqFqxcqZLpAgc+kX9D5sct2d3zkhicN+lx4wbBYXM9jV1w0bHvi7o2evmA42H0XgwXGa9F4ssDjFl7/9LGqd+zqFanuFXDu9Bs8bhmTAQsUfu4enw8yVsd24IB6/xMv9H9yrxLxDTcM2575zGHbO94xaLr/fe/b3TC9nOTkz/3ccF1f9VXDti+fSkr7/M8f9rn66mHbgpWlj00Foq1OOd/eczhdczsZFoN+0YuGfd72tucM2npFw7/gC4ZtT3va7uWTnf/Tei/leZ0bH418/mSjLXwrewAAAAA2j3k/YDO4RTEA84gTAMzisjKZQwAAAABjNu6pMWBjLKW2CABrQ5wAYCaZQyaHNsI+s6R7H5JOPDxc2dYnh2+TTz5pWDj58s96aNfyjRd+ZNDnCSceHrQ9emq4/nsf213UeeuxYTW0XvHpdno4/n1/GFykmGqSx6aKc3/qjwyLTz947bBIdXWKqW51ir6dnqoHfvr8TkHqzl9yt0j1Iu8VWfcwXvv9++8dZxc49vaOSbVgsebBfQU6x9Tu+pcwQTAYxyGPa99XSzneA2dpughz95/pXkHqL/zCYdvb3jZoeuiee3Ytf7Qzhoc+9rFB21Pe+tZhx+li01deOeyzYPHpbuXnqX0fPDfpF6nurX66iHRvWC984bDt8ceHbVdcMWybLkDdK0jdK5TdG+vI5082mpcWWH8tblEMwGziBAB7GfnMl5pDAAAAACM27qkxYEOUu9AAMIc4AcAcag7JHAIAAAAYs3FPjW2w3smx6WLHW+cNL74/demw7Ql/5IFB28v/2NsGbd/yhPt2LT/ahhXSXjccVu448Tmd1indYqdLOAO4wPP62BM6RbE7hVIXXf9gNztTugd6KjblRKpaEnB2On8zg6LIC/5d9YriL3Q861Vh3sTsjgV26UCHsA18ys4JcQLOyrFHHho23n///OUkede7hm3/7J8Nmn7ld35n0PabU8udesi5udP2lM98ptO6gHOcKbJokerpItLPfOZwXY88sv9xTBeW7u32yJNmZA5F5hAAAADAqJkcAjZDO6KvBVTVLVX1/qq6q6pe0fn9l1TVb1XVqar6mn3uMQBnQ5wAYJYzmUNH8bWiTA4BHKKqOp7kVUm+IskzknxDVT1jqtt/T/KSJD9xtKMDYNnECQBW0epOWwGcjdWpJfHsJHe11j6YJFX12iS3JnnPmQ6ttbsnv1u0GhUAByVOADCLmkPrMTnUq03ZK37ZK7A8/djaGq7s2KnhuqrX1iveOR2yD/LBY2poC9fk7PXrPWfHdy+fvmg42POvGxZze8ENw2Jxt176u4O28+qSXcvvfXxYkPo/PfDHBm2/99EnDdryqd1Vno8/3HndHhs+rPtaLvKxapHCqTMM+h3v9Om0HSrFSI/Syaq6c8fyba2123YsX5vknh3L9yb5wiMZGbu0RYu3T7ctUqj5bPot8Lh9O+y//amxLfpvae/Y23r7Ob2+6h18h02LPv8LPW5VOY5vEnFiBfUKA+fBB4dtvaq/p6YOcr1/IKcr/s5o2zpx/p6r7+n1WeT/2AP9r9vb6PRztmDx6d/sFJ/+lc4mp5/9k50+f6TTluc9b9g2XdX5hhuGfU4Ot7B14cXDcfWKQS/wtuhZpBj0om8xOExrMTkEMFfLUd7h6P7WWu9GGQCsKnECgL2MPHNIzSGAw3Vfkut3LF83aQOARJwAYAWZHAI4XHckuamqnlpV5yd5UZLblzwmAFaHOAHAylnfvKnOZcN1apguvEgC8bFhaZycGJbeyYmHh8ULzntod9v5nx4ObOvEcBS9GjSPPmH3XN2pC4eP27pg+LitBV/F6ZoQxx8drv+R+y8atP3E4//ToO0Xn/THh499fPdAHn50eE31w58Yrv/4p4Y7cP5Du8d2/NFBl5x4uNP20PA1qtPDftNOn995rs8b9uvVupp+LQ9UK4p9W5XaIq21U1X18iRvynYFqh9urb27qr43yZ2ttdur6n9K8vokVyT56qr6B621z13isDdT7z3R+7ubrrOzaH2hXhzqtZ3eu8+iY52uo9Srq9Q77bPfq2m6Y+3tY2+sCzw/3fEvQe/5WZVjCodnVV5TcWKF9Iq47POyksdODOvU3HvvsN+HPzxsu+ee3ct33z3sc9llw7ZLLx223Xjj7uVOSZ1uW++puLi3gem2q68e9unU/3l2ZwPPvuOO4WOn13fTTQutP895zrBt+snojPX3Hxi+bnfdNVxVt+bQlN5Tcfnlw7ZFntaRX920HApSr/HkEMCKaq29Mckbp9q+e8fPd2T7MgIARkicAGDVmBwCNsOKnBEGYEWJEwDMInNIzSEAAACAMRv31BgAAAAwbjKH1mNyqFdAsFtkeIHCw931dx7XK5LZK1o83fbwk4cP7BUx3uoUpJ7O4+oWED1AEePpwtu9At4nPjMcbLtv2PbJGhZvWyRd+8LO83r8sU7bVLHpY73XtlPstFtUdIECtMdOdwZ/rFOkuld0daqtFi0Gu2ixXODQdAssL/K4Xhxa9BKV6b/rgxSt3++6FjW1vl6s6h3jehYqgn2Ay3wWef4XLcTt0Aubb6t3wcSJ4c1Tem2npm7q0vv/8VSnYHGvyHOvaPF1U9WlvuIrhn2ecGkngC1SJbmntwOL/lM8Xc365puHfZ72tGHby1++2Pqnn7Tuk31q2NZ5Yj/ysd2v+ac6BcJ7q7qgcwOgXr9pDz44bFv0qZ5uO8Ra6ayhqrolyb/M9k0Lfqi19sqp31+Q5EeT/KkkH0/y9a21uw+6XW8xYCOsyl1oAFhN4gQAM61I5lBVHU/yqiTPT3Jvkjuq6vbW2nt2dHtpkk+21m6sqhcl+b4kX3/Qbas5BAAAALB8z05yV2vtg621x5K8NsmtU31uTfKayc+vS/LlVd3rZc7K8qfGAA7DotePADBO4gQAc3QvPz03TlbVnTuWb2ut3Tb5+dok9+z43b1JvnDq8X/Yp7V2qqo+leTJSe4/yKBMDgEAAAAcjftba52CXcu1FpND04WUk+TCjw8vHL/4I8NKYSce2V3J+NSFw+qapy4ezhBundcpRtwpzDldkPrxSztFqztFzU536t8NJio7ded6xbMXLbA6fa1979r7bo3kfRb67ukVnz7xUK9t90iOdYrA9YqGdwtSL1BjYKtXbLbzwF623nRx1u4YOtt0AvMQtRyosC2bqXds7B4PptsW/dtc8D03faw60N/+AgWpD7L+wWN7N084wN/afse20OvWPY73Vrb3qvqDWKQTK0ucGL0HHhi2/cqvDNt+/ueHbR/5yO7lq64a9rnhhmHbFVcM2y69dNg2XUu5V8/5CaceGDbe30kSmK6c3Ntgr23RCsjTbYuua1EL1HzZ6hQNv/vuYb/ptoMUjO7V/p5+qnu7fbwTR3vrn+63aOmbFSiRszFaW6zw+BG4L8n1O5avm7T1+txbVSeSPDHbhakPRM0hAAAAgOW7I8lNVfXUqjo/yYuS3D7V5/YkL578/DVJfqm1duBTIOYagc3gjDAA84gTAMywKplDkxpCL0/ypmzncP9wa+3dVfW9Se5srd2e5NVJfqyq7kryiWxPIB2YySEAAACAFdBae2OSN061ffeOnx9J8rWHvV2TQ8BGWKS2FADjJU4AMMuqZA4t01pMDvWKip54ZBjhL/j4sFLY8Qd2Vzs+7+JhdehHT140aHvs8uFTc/r8YYmmUxftrlD5aKfw3KOfNazo3C7pvPNO715XPTysYHb8M8MxnHikUyS5U8S7V+B68LglfHDqFueervzZG3uvqOh+q2gtuK7WKSo36HfIBWKBBfSKEfeOZwsUqe7+vS7a1jFY3xKOEYd5bD/QqhbZz97NEhYp9L/f12MWx23YKI93Pht/+MPDtre/fdj2vvftXp4uIJ0kz3nOsO2Zzxy2nTy5d9tn5/eHnX72F/YeWDKsinzjjcM+vbbrrhu2XX753utftKLzIer9A98b6nSR8F5R6YMMf3ocvcf1ilQv0raEpxXWY3IIYE/OCAMwjzgBwAwyh9ytDAAAAGDUTA4BAAAAjNiel5VV1YVJfjnJBZP+r2ut/f2qemqS1yZ5cpK3J/mLrbXHzsUgtzp1Xh65vFMM4KmXDJpOPLK7ntDWieHjpusGzWo7fX6nber60F5NmulaQtsb6MzLndhdDOPYkx8ddLnscx4etF16wfBpf+TU8KV94A8u3rX8+APD+ksn/mC4AyceXqymUa821EBvOrLzLjw1PYxOKvixYSmnHOu8A4+d6hWwmFrsvG5b5w33u1vTaHr16lQsh8sFlmYV4kS3jk+vW6+W2D7/hvdbJ+gwa94suq7uc9FrXOTvqFf/5zD//g6wT4dqn88FK0ycWJpViBOXXTZs+4IvGLa95CXDtunaRJcM/+XI9dcP23plfHo1hwb9Huhc23LppcO2Jz5x2Pbo1P8Pb3vbsM8P/uCw7Z57hm29Qj7Petbu5UWLLU0XAJq1/gWK7/Rq7/Senl5tn2mf/vSw7eMfH7Y98MDe6+ptr7eLxzv/dywy1oM4tkjx2TWydY5yXFxWtrdHk3xZa+0LkjwzyS1V9Zwk35fkX7TWbkzyySQvPWejBGCViRMAzCNOAKy4PSeH2rYHJ4vnTb5aki9L8rpJ+2uSvPBcDBBgL9WO7oshcQJYdeLEcokTwKo7U5D6KL5W1UL5WFV1vKrekeSjSd6c5HeTPNBaO7Nr9ya5dsZjX1ZVd1bVnace+swhDBmAVSNOADDPYcWJj33sY0cyXoCxWehW9q2100meWVWXJ3l9kqctuoHW2m1JbkuSi6653vkU4NzYbwEYDoU4Aaw8cWKpDitO3HzzzeIEcOjcyn7ByaEzWmsPVNVbk3xRksur6sRktv+6JPediwEm/WLBpy4ZBviHOgWj6/TeyVG99XcLFC/Qr1cQ+fxPDcf1eGcD5332I7uWv+gpdw/6PO+K9wzarj3xyUHbfaeuGLT96h/ctGv5Nz78lEGfT3zkCYO29snzBm0nHhru07GpItXVKRjds1CR546tXgHaTluvCPlAb12917s31qnHHmax2d76emPoFkJf9HmdauumxHdq2C1SgFx6/fgsK04sqvv3eZj/Ly5yuOnVyO89rtfv+PzlRceQJK33dz113F7oRgPL4v/8s3Ku50Uc71nUsuJEr+DvTTcN2668ctj2yO6P6N2CyL31XzC890suumjYNiymfPmw0803D9t6A3nta3ctPvgzPzPo8s7ho/KJTtul05W4k/yx971v1/Jn//ZvDx/4tV87bPvCLxy2Pf3pw7bpCs6dStPHOvt9fuepOHFif0WLzxv+69MteD3c3rCt977otU0/treuQ/Xgg8O26Td6svhsySI7sOgTtMjjOCf2/IupqisnM/ypqouSPD/Je5O8NcnXTLq9OMkbztEYAfbWjuiLAXECWAvixNKIE8CqU3Noscyha5K8pqqOZ3sy6adbaz9XVe9J8tqq+kdJfjvJq8/hOAFYXeIEAPOIEwArbs/JodbaO5M8q9P+wSTPPheDAjhbLmlYHnECWAfixPKIE8CqU3NowbuVAQAAALCZ1qO6U7fI8LCtWyx4n+vvWaSQaa945/FHFquc/Hi7ZNfyf3xkWCXvHU8c3uHzsy4dFhR74gUPD9oeOnX+7iF0xlAnhqfV2nmdtt4759T0kzHs0jtp1z2Tt8Brskhx6GTGWKe3eZD3wAJjOIjB87PP4tBHYalnZZ0RZtoaFSxetEj1oND/osfPTr/u3+siBepZS17LiBMMTNc+TvqFhxfJJli0Zu5C/XqD6D1wgSLVl95ww6DL//yf/tPwcW9/+6DpwccfH7SdP2jpuP/+YdsDDyzWNr3v+y2InOTY1IfmrU5exCLFoXvDOoiVqK/c26FFikMfxErs+HwyhwAAAAAYrdWfvgPYS3NWHIA5xAkA5lBzSOYQAAAAwKjJHAI2gzPCAMwjTgAwg8yhdZ4c6hUePtd5UAsUN12kwGeSHH+k89jTu3dg68ELBn0ePG/Y9gfnXz7cZKeI9KB49nQB6STHHx22HXtsuKrjj3WKWS9QKPVQU7oXq/O9eMHW/fRZAmnxMA4L/a0fcjF6xxdg7Ho1c1eijm6vWPDVVw/bnvOc3ctPe9qwzwtfOGzrFJG+tFdYevq/50suGfa55pphW2+sJ08O26YLJR/iCzJdoDrpF6leidd7GUa745zhsjIAAACAETM9CGwGGQ8AzCNOADCDy8pkDgEAAACMmswhYCOolQLAPOIEALPIHNq0yaEVLSDc0/uAcuzx6eXODnULcS/Yb7ogde9DUqe46aJFthd63DKs0fsC4GyszHEWgKPXKyA8XeT58suHfa67btj2SOduOfv9T7k3rl5B7ZWt/g3j5K8PAAAAGLWxZw6pOQQAAAAwYjKHgM3g8hoA5hEnAJhBzSGTQytlodoRnT7VqRM0XV8o2X/pnf3WtKjTw7bpukpJcuyxzmO3dm+0V1epdd69p88ftm2d1xvc1Lp6z9e611oC2BT7Pa4uUH/vKIgLwNIsWtenVxNoBTz0yPBClwceGPa7//5h28MP716+6KJhn0svHbZNl22a1e/Yqc4/Mfs1glpLWwtetHSsVwSXI7H570Jg8zX/fAEwhzgBwBwyh9QcAgAAABg1mUPAZnBGGIB5xAkAZpA5JHMIAAAAYNRkDi1JryDmdOHkrfM6p7h603mdml3HTg83UFMzob1C1od5Vu1YZ+b1/E8NN3Dhp4YDOf7o7rbT5w93/PFLhvvYazt10bBta6pwdes8r4sWLV3ZGgaLjmuB4tzteKet916cemzvPdYrSn4oVvV1AM7Ogn/L08fe7jG7dxOHRYexQMeVPf7T5/Vi0/TSHKYrM/eqN/ce1yuI3KvCPN3WK2S9aBHsBXz608O2d7xj2HbnncO26afi8suHfW68cdj2x//4sO3664dtl1+++x+K3lOxTsWVFy0YvYhese5jDz447PjII3uvrPfEXv6kfYxqPplDMocAAAAARk3mELD2Ks7gAzCbOAHAXmQOAQAAADBaJocAAAAARsxlZUvSK/B7+uLd+c6nLhkWMGsnhjnRdWpYNfPYI8N5v+OPTvV5rPO4TipdLwt7kdTs6QLbSfLoFZ0i0pcOn4yaeoIWLpK8aNsYCo32nrPefk8XpN5n8entjguM61xZ99cL2LbgsWWhmwYsWn2691DHlM3jNWXT9Ar83n337uX3vW/Yp1ekuld8+tprh23TlZlPnhz26VV+7lmgSPUVVwzb/tSfGrY97WnDtulLhHqb69U67j0Vi9bdntYr8rxORaoXHut0Yeleoele26LF0Y+AgtQyhwAAAABGTeYQsP6as/wAzCFOADCHzCGZQwAAAACjZnII2AztiL4WUFW3VNX7q+quqnpF5/cXVNVPTX7/G1V1w/52GoCFiRMAzHAmc+govlaVy8qWpE4P2058ZnflzGOPDefueoWBq1MnrE4Pq3BOb7M3hp79pmF3i0h3ilS3fb4LFypGOstBHrvGuq/lVFvv/cTiqup4klcleX6Se5PcUVW3t9bes6PbS5N8srV2Y1W9KMn3Jfn6ox8trImRHrPZTOIEh6ZXOfnGG3cv9wpGL1oEeJFqzb0+vbYFTRdw7g3ryiuHbb3C1Ys417WPl1F8er9FsA801unX/ADvAZbH5BCwGVanlsSzk9zVWvtgklTVa5PcmmTnh/5bk3zP5OfXJfnBqqrW2ursBcCmWZ0jrDgBsGLUHHJZGcBhuzbJPTuW7520dfu01k4l+VSSJx/J6ABYNnECgJUjcwjYCEd4F5qTVXXnjuXbWmu3HdnWAdgXcQKAWWQOmRxamu4HlKk34/FTh1tkYbqWTK/m0ML1Znr1hKbz0Hp9FmxbZHuHatECkgv06+7Povu93/08wAdet/Y9a/e31m6e8/v7kly/Y/m6SVuvz71VdSLJE5N8/FBHCfuxCscD9YVWX+994nXbSZzgaPQK5lx++fzlZPGaQx1bJ87ftfzII8M+jzyw0Kq6m5xuW6TPrLZV0Kv/s8gERG9/ujWBOis7dpgzHOv0ZHNgXllgM6zCP7Xb7khyU1U9Ndsf7l+U5Bun+tye5MVJfi3J1yT5JXUkAM6x1TnKihMAK0jmEACHprV2qqpenuRNSY4n+eHW2rur6nuT3Nlauz3Jq5P8WFXdleQT2f7HAIARECcAWEUmh4D117JKZ4TTWntjkjdOtX33jp8fSfK1Rz0ugNESJwCYQ80hdysDAAAAGLWFM4eq6niSO5Pc11r7qsl10q/N9m01357kL7bWHjs3wxyHoy4M3I53GhecLlyoiHTPmhesXKSI9MIFqXvP9SLPT6cWXfdhnfdT9z12Lt93R/h6K6y9fOLEBljkb1Yx4vV0iDdeOMDqFxzEYa5sx2rFiaUTJ47AIsWCD7Gg8IUX7n/1Y61rvFCx6V4Ky0HaFtF7MXsOUNB8lckcOrvMoW9L8t4dy9+X5F+01m5M8skkLz3MgQGwdsQJAOYRJwBW1EKTQ1V1XZKvTPJDk+VK8mVJXjfp8pokLzwH4wNgDYgTAMwjTgCstkXzv34gyd9Jctlk+clJHmitnUm8ujfJtb0HVtXLkrwsSU484Yp9DxRgLpcLLNsPRJwAVpk4sWw/kEOIE095ylPO7SiBUXJZ2QKZQ1X1VUk+2lp7+3420Fq7rbV2c2vt5hMXX7KfVQCwwsQJAOY5zDhx5ZVXHvLoAEgWyxz600leUFV/PsmFSZ6Q5F8mubyqTkxm+69Lct+5GyaHYoECj/suNL3uDnG/Fy36XJ3C0kuxIa+5QqNLJU6MyYYcM0Znwddtkz8HiBNLJU6MyAbUJj40g0LTi+o9iZ7Yc0rm0AKZQ62172ytXddauyHJi5L8Umvtm5K8NcnXTLq9OMkbztkoAVhZ4gQA84gTAKvvbO5WNu07knx7Vd2V7WuGX304QwLYh3ZEX5wNcQJYHeLEKhIngJVx6tTRfK2qs8pNa629LcnbJj9/MMmzD39IAKwrcQKAecQJgNXkwkVg/TlbC8A84gQAc6g5ZHIIAACAKVsHqkCyWfZdWBrWiMkhYO1V3EAJgNnECQDmkTl0sILUAAAAAKw5mUPAZlBLAoB5xAkAZpA5JHMIAAAAYNRkDgEboZwRBmAOcYJ10SsErSDyueF5PXubWqhc5pDMIQAAAIBRkzkEbAZnhAGYR5wAYA6ZQwAAAACMlswhAAAANop6QrNtat0gDsbkELAZXC4AwDziBAAzKEjtsjIAAACAUZM5BKy/5hbFAMwhTgAwh8whmUMAAAAAoyZzCNgMzggDMI84wRrrFRAea8Hlse63ItLnlswhmUMAAAAAoyZzCNgIakkAMI84AcAsModkDgEAAACMmswhYDM4IwzAPOIEAHOMPXPI5BAAAAC79Ao/n+uiyJtWbFoRadaJySFgI6glAcA84gQAs6g5pOYQAAAAwKjJHALWX4taEgDMJk4AMIfMIZlDAAAAAKMmcwjYDM4IAzCPOAFLs6qFphWM5gyZQzKHAAAAAEbN5BAAAADAiLmsDFh7FbcoBmA2cQKAeVxWJnMIAAAAYNRkDgGbwRlhAOYRJ+BILFp8WjFoVonMIZlDAAAAAKMmcwjYCNWcEgZgNnECgHlkDgEAAAAwWjKHgPXXopYEALOJE2ygVa3Zs6rjgnnUHJI5BAAAADBqMoeAjVDOCAMwhzgBwCwyh2QOAQAAAIzaQplDVXV3kk8nOZ3kVGvt5qp6UpKfSnJDkruTfF1r7ZPnZpgAe3BGeKnECWDliRNLJU4Aq0zm0NllDv3Z1tozW2s3T5ZfkeQtrbWbkrxlsgzAeIkTAMwjTgAcQFU9qareXFUfmHy/otPnmVX1a1X17qp6Z1V9/SLrPshlZbcmec3k59ckeeEB1gVwINWO5ouzIk4AK0OcWEniBLASzmQOHcXXAS0yqf5Qkm9prX1ukluS/EBVXb7XihedHGpJ/kNVvb2qXjZpu6q19qHJzx9OctWC6wJg84gTAMwjTgAc3J6T6q21/9pa+8Dk599P8tEkV+614kXvVvbFrbX7quqzkry5qt43tfFW1T9XMjn4vyxJTjxhkPEEcDicrV02cQJYbeLEsh1KnHjKU55y7kcKjNKa1Bw6q0n1qnp2kvOT/O5eK14oc6i1dt/k+0eTvD7Js5N8pKqumWzwmmzPRvUee1tr7ebW2s0nLr5kkc0BsGbECQDmOaw4ceWVe578Blh1J6vqzh1fL9v5y6r6xap6V+fr1p39Wmstc059TI6rP5bkL7XWtvYa1J6TQ1V1SVVddubnJP9LkncluT3JiyfdXpzkDXutC4DNI04AMI84AbDL/WcmvCdft+38ZWvtea21z+t8vSELTqpX1ROS/Psk39Va+/VFBrXIZWVXJXl9VZ3p/xOttV+oqjuS/HRVvTTJ7yX5ukU2CHDo1qQI6KK37K2qX0jynCS/0lr7qqMc4z6JE8BqEyeWTZwAVtoa3cr+zKT6KzNjUr2qzs92huaPttZet+iK95wcaq19MMkXdNo/nuTLF90QAH94d4FXVtUrJsvf0en3T5NcnOQvH+Xg9kucADg04gQA87wynUn1qro5yV9prX3rpO1Lkjy5ql4yedxLWmvvmLfiRQtSA6y2NTgjnO27Czx38vNrkrwtnQ/9rbW3VNVzp9sBOABxAoAZ1iVzaNakemvtziTfOvn5x5P8+Nmue9Fb2QNwcG7ZC8A84gQASyFzCFh7lSOtJXGyqu7csXzbziJyVfWLSa7uPO67di7Mu2UvAIdLnABgnnXJHDqXTA4BnJ37W2s3z/pla+15s35XVR+pqmtaax+ad3cBANaaOAHA2jE5BGyGthYnV/e8uwAA54g4AcAMMofUHAI4Sq9M8vyq+kCS502WU1U3V9UPnelUVf8pyc8k+fKqureq/txSRgvAURMnAFgKmUPARliHqgyL3F1gsvxnjnJcAGMgTgAwj8whAAAAAEZL5hCw/trkCwB6xAkA5lBzSOYQAAAAwKjJHAI2Qm0tewQArDJxAoBZZA7JHAIAAAAYNZlDwGZQSwKAecQJAGaQOSRzCAAAAGDUTA4BAAAAjJjLyoCNUC4XAGAOcQKAWVxWdsSTQ498+N773/uPv/33kpxMcv9RbvuQGf/yrPPYE+Pv+ZxDXh9rTJxYGes8/nUee2L8PeIEf+jtb3/7/cePlzixXOs89sT4l02cWFFHOjnUWrsySarqztbazUe57cNk/MuzzmNPjP+cadme7mftiROrYZ3Hv85jT4z/nBEnNoY4sXzrPPbE+Jdtlcc/9swhNYcAAAAARkzNIWAjqCUBwDziBACzqDm0vMyh25a03cNi/MuzzmNPjB8Wte7vNeNfnnUee2L8sKh1f6+t8/jXeeyJ8S/buo9/Y1Vz/TWw5i694vr2zD/7bUeyrV99/d9++6peJw1AnzgBwDxVN7fkN49oa8dXMk6oOQQAAAAwYmoOAWuvopYEALOJEwDM15KcXvYglurIM4eq6paqen9V3VVVrzjq7Z+tqvrhqvpoVb1rR9uTqurNVfWByfcrljnGWarq+qp6a1W9p6reXVXfNmlfl/FfWFW/WVX/ZTL+fzBpf2pV/cbkPfRTVXX+ssc6S1Udr6rfrqqfmyyv09jvrqrfqap3VNWdk7a1eO+w3sSJoyNOLJ84AWdn3WJEIk4skzixXOLEejnSyaGqOp7kVUm+IskzknxDVT3jKMewDz+S5JaptlckeUtr7aYkb5ksr6JTSf5ma+0ZSZ6T5H+dPN/rMv5Hk3xZa+0LkjwzyS1V9Zwk35fkX7TWbkzyySQvXd4Q9/RtSd67Y3mdxp4kf7a19swd18Su5nuntaP74pwSJ46cOLF84sRRECc2wprGiEScWCZxYvnWI04k2c4cOoqv1XTUmUPPTnJXa+2DrbXHkrw2ya1HPIaz0lr75SSfmGq+NclrJj+/JskLj3JMi2qtfai19luTnz+d7YPKtVmf8bfW2oOTxfMmXy3JlyV53aR9ZcdfVdcl+cokPzRZrqzJ2OdYi/cOa02cOELixHKJE3DW1i5GJOLEMokTK2kt3jtjdNSTQ9cmuWfH8r2TtnVzVWvtQ5OfP5zkqmUOZhFVdUOSZyX5jazR+CdplO9I8tEkb07yu0keaK2dmnRZ5ffQDyT5O0m2JstPzvqMPdkOnP+hqt5eVS+btK3se6fa0XxxzokTSyJOLMUPRJw4MuLERtiUGJGs8N/KLOLEUvxAxIkj0jL2zCEFqQ+otdaqVvujQFVdmuTfJvkbrbU/2J5w3rbq42+tnU7yzKq6PMnrkzxtuSNaTFV9VZKPttbeXlXPXfJw9uuLW2v3VdVnJXlzVb1v5y9X/b0Dq2Id/lbEiaMnTgBnrMPfijhx9MQJjtpRTw7dl+T6HcvXTdrWzUeq6prW2oeq6ppsz0KvpKo6L9sH8n/TWvu/J81rM/4zWmsPVNVbk3xRksur6sRkxnxV30N/OskLqurPJ7kwyROS/Musx9iTJK21+ybfP1pVr892KvfqvneElU0hThwxcWJpxImjJk5sgk2JEckq/61MESeWRpw4clt7d9lgR31Z2R1JbppUWD8/yYuS3H7EYzgMtyd58eTnFyd5wxLHMtPkmtRXJ3lva+37d/xqXcZ/5WSGP1V1UZLnZ/s657cm+ZpJt5Ucf2vtO1tr17XWbsj2+/yXWmvflDUYe5JU1SVVddmZn5P8L0nelTV577DWxIkjJE4sjzgB+7IpMSJZk78VcWJ5xAmO2pFmDrXWTlXVy5O8KcnxJD/cWnv3UY7hbFXVTyZ5bpKTVXVvkr+f5JVJfrqqXprk95J83fJGONefTvIXk/zO5DrbJPm7WZ/xX5PkNbV9Z4pjSX66tfZzVfWeJK+tqn+U5LezHbDWxXdkPcZ+VZLXT1KGTyT5idbaL1TVHVmP9w5rSpw4cuLE6hEnYIZ1jBGJOLFk4sTyiBNrpppbbgJr7rLLr2t/8s9825Fs65d/7u+8vf2PW3ECsAbECQDmqXpW207KOgpXrGScOOrLygAAAABYIe5WBqy/lmRLFiQAM4gTAMx15lb24yVzCAAAAGDEZA4Bm8EJYQDmEScAmEvmEAAAAAAjJXMI2AjljDAAc4gTAMym5pDMIQAAAIARkzkEbIbmlDAAc4gTAMy1tewBLJXMIQAAAIARkzkEbAS1JACYR5wAYDY1h2QOAQAAAIyYzCFg/bXJFwD0iBMAzCVzSOYQAAAAwIjJHALWXiUpd6EBYAZxAoC9yRwCAAAAYKRMDgEAAACMmMvKgM2wtewBALDSxAkAZlKQWuYQAAAAwIjJHAI2gkKjAMwjTgAw37hTTGUOAQAAAIyYzCFg/bXJFwD0iBMAzKXmkMwhAAAAgBGTOQRsgJaoJQHATOIEAHuROQQAAADASMkcAjZCOSEMwBziBACzqTkkcwgAAABgxGQOAZtBLQkA5hEnAJhJ5pDMIQAAAIARkzkErL+W1NayBwHAyhInANjTuAOFzCEAAACAETM5BGyG1o7m6wCq6klV9eaq+sDk+xWdPs+sql+rqndX1Tur6usPtFEAtokTAMx0pubQUXytJpNDAEfnFUne0lq7KclbJsvTHkryLa21z01yS5IfqKrLj26IACyROAHAUqg5BGyG9bgJza1Jnjv5+TVJ3pbkO3Z2aK391x0//35VfTTJlUkeOJIRAmwqcQKAuVY3q+comBwCODsnq+rOHcu3tdZuW/CxV7XWPjT5+cNJrprXuaqeneT8JL979sMEYEnECQDWjskhgLNzf2vt5lm/rKpfTHJ151fftXOhtdaqauZ57Kq6JsmPJXlxa23ct04AWC/iBABrx+QQsBHqgEVAD0tr7XmzfldVH6mqa1prH5p8qP/ojH5PSPLvk3xXa+3Xz9FQAUZFnABgtjMFqcdLQWqAo3N7khdPfn5xkjdMd6iq85O8PsmPttZed4RjA2D5xAkAlsLkELAZ1uAWxUlemeT5VfWBJM+bLKeqbq6qH5r0+bokX5LkJVX1jsnXMw+6YYDREycAmGvct7J3WRnAEWmtfTzJl3fa70zyrZOffzzJjx/x0ABYAeIEAMticghYfy2JUpwAzCJOADCXQOGyMgAAAIARkzkErL1KW5m70ACwesQJAPa2uvWAjoLMIQAAAIARkzkEbAZnhAGYR5wAYKYWmUMAAAAAjJbMIWAzOCMMwDziBAAzyRySOQQAAAAwYjKHgPXXkmwtexAArCxxAoA9jTtQyBwCAAAAGDGZQ8BGKLUkAJhDnABgNjWHZA4BAAAAjJjJIQAAAIARc1kZsBlcLgDAPOIEAHO5rAwAAACAkZI5BGyA5owwAHOIEwDMoyC1zCEAAACAEZM5BKy/FmeEAZhNnABgTzKHAAAAABgpmUPAZtha9gAAWGniBAAztYw9UMgcAgAAABgxmUPARii1JACYQ5wAYDZ3K5M5BAAAADBiMoeAzeCMMADziBMAzCVzCAAAAICRkjkErL+WZMsZYQBmECcAmEvNIZlDAAAAACMmcwjYAE0tCQDmECcA2IvMIQAAAABGyuQQAAAAwIi5rAzYDC4XAGAecQKAmVqSrWUPYqlkDgEAAACsuKp6UlW9uao+MPl+xZy+T6iqe6vqBxdZt8khYDO0djRfAKwncQKAuU4f0deBvCLJW1prNyV5y2R5ln+Y5JcXXbHJIQAAAIDVd2uS10x+fk2SF/Y6VdWfSnJVkv+w6IrVHALWX0uy5WwtADOIEwDM1XKEt7I/WVV37li+rbV224KPvaq19qHJzx/O9gTQLlV1LMk/T/LNSZ636KBMDgEAAAAcjftbazfP+mVV/WKSqzu/+q6dC621VlW9Mx9/LckbW2v3VtXCgzI5BGyAlrRx310AgHnECQDmOdLMoblaazOzfarqI1V1TWvtQ1V1TZKPdrp9UZI/U1V/LcmlSc6vqgdba/PqE5kcAgAAAFgDtyd5cZJXTr6/YbpDa+2bzvxcVS9JcvNeE0OJySFgU7hDDADziBMAzLUamUN7eGWSn66qlyb5vSRflyRVdXOSv9Ja+9b9rtjkEAAAAMCKa619PMmXd9rvTDKYGGqt/UiSH1lk3SaHgPXnLjQAzCNOADDX6tQcWpZjyx4AAAAAAMsjcwjYDGpJADCPOAHAXOO+q6XMIQAAAIARkzkEbAZnhAGYR5wAYCY1h2QOAQAAAIyYySEAAACAEXNZGbABmssFAJhDnABgLy4rAwAAAGCkZA4B668l2Rr3rScBmEOcAGAuBallDgEAAACMmMwhYDOoJQHAPOIEAHONO8NU5hAAAADAiMkcAjaDM8IAzCNOADCTmkMyhwAAAABGTOYQsAFasrX6Z4Sr6klJfirJDUnuTvJ1rbVPTvX5nCSvz/bk/XlJ/lVr7V8f7UgBNo04AcA8ModkDgEcnVckeUtr7aYkb5ksT/tQki9qrT0zyRcmeUVVffbRDRGAJRInAFgKmUPA+mtJa2txd4Fbkzx38vNrkrwtyXfs7NBae2zH4gUxiQ9wcOIEAHuSOQTA0biqtfahyc8fTnJVr1NVXV9V70xyT5Lva639/lENEIClEicAWAqZQ8BmOLpaEier6s4dy7e11m47s1BVv5jk6s7jvmvnQmutVVV30K21e5L8icllAj9bVa9rrX3kEMYOMF7iBAAzqTlkcgjg7NzfWrt51i9ba8+b9buq+khVXdNa+1BVXZPko/M21Fr7/ap6V5I/k+R1+x4xAEdJnABg7bisDNgMrR3N18HcnuTFk59fnOQN0x2q6rqqumjy8xVJvjjJ+w+6YYDREycAmGvriL5Wk8khgKPzyiTPr6oPJHneZDlVdXNV/dCkz9OT/EZV/Zck/zHJP2ut/c5SRgvAURMnAFgKl5UBHJHW2seTfHmn/c4k3zr5+c1J/sQRDw2AFSBOALAsJoeA9ddasrW6KZoALJk4AcBcClK7rAwAAABgxGQOAZvh4EVAAdhk4gQAc8kcAgAAAGCkZA4BG6GpJQHAHOIEALOpOSRzCAAAAGDEZA4BG6CpJQHAHOIEAPPIHJI5BAAAADBiMoeA9deSbDkjDMAM4gQAe5I5BAAAAMBIyRwCNkNzFxoA5hAnAJipJRl3nJA5BAAAADBiMoeAtdeSNLUkAJhBnABgb2oOAQAAADBSMoeA9deaWhIAzCZOADBXi8whAAAAAEbL5BAAAADAiLmsDNgICo0CMI84AcBsLiuTOQQAAAAwYjKHgM2g0CgA84gTAMw17jghcwgAAABgxKo1118D662qfiHJySPa3P2ttVuOaFsAHAJxAoB5xAmTQwAAAACj5rIyAAAAgBEzOQQAAAAwYiaHAAAAAEbM5BAAAADAiJkcAgAAABix/z+4AYFPMwwo5AAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_slice(Keta_tomoatt, Keta_fort, 'p', 21, contour=False)\n", + "plot_slice(Keta_tomoatt, Keta_fort, 't', 21, contour=False)\n", + "plot_slice(Keta_tomoatt, Keta_fort, 'r', 21, contour=False)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_slice(Kxi_tomoatt, Kxi_fort, 'p', 21, contour=False)\n", + "plot_slice(Kxi_tomoatt, Kxi_fort, 't', 21, contour=False)\n", + "plot_slice(Kxi_tomoatt, Kxi_fort, 'r', 21, contour=False)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_slice(Syn_tomoatt, Syn_fort, 'p', 21, contour=False)\n", + "plot_slice(Syn_tomoatt, Syn_fort, 't', 21, contour=False)\n", + "plot_slice(Syn_tomoatt, Syn_fort, 'r', 21, contour=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABJkAAAItCAYAAACaQatyAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABeF0lEQVR4nO39e7xtZ10f+n++e+2diwkQSBBCAk3axKOBHrXmAD31nKKIxFoNfRUhHqtpD5ReoNraHoHaH1gqp3Au1WLRvvIDJFrbQGkpqY2mXORnjxVIqIiCcthyKUm5hYRLkFz2Xs/vjzU2rj3nmHPNveZY87be79drvvaczxzjGc8ce63xnesZ3/Ed1VoLAAAAAMzjyLIHAAAAAMD6M8kEAAAAwNxMMgEAAAAwN5NMAAAAAMzNJBMAAAAAczu67AEAzOvp33Ze+9zdJxeyrfe+//5bW2vXLGRjAAxCnABgmiuq2h8uaFufTDY6TphkAtbe5+4+mffc+riFbGvr4g9ftJANATAYcQKAaf4wyV9b0LZ+ItnoOGGSCVh7Lcl2tpc9DABWlDgBwDQVtYSGYj8CAAAAMDeZTMAGaDnZnKEGYBJxAoDpZOAMw34EAAAAYG4mmQAAAABWQFVdU1UfqqrjVfWinvfPrqo3dO+/u6ou2/Xei7v2D1XV08+gz1dV1b1DjN/lcsDa2yno2pY9DABWlDgBwDSrUvi7qraSvDrJ05LckeS2qrq5tfbBXYs9J8k9rbUrquq6JK9M8uyquirJdUken+QxSd5WVV/XrTOxz6q6OsnDh/oMq7AfAQAAAA67JyY53lr7SGvtgSQ3Jbl2ZJlrk9zYPX9TkqdWVXXtN7XW7m+tfTTJ8a6/iX12k1r/Z5IfG+oDyGQCNoJbUwMwjTgBwDQLzMC5qKpu3/X6htbaDd3zS5J8Ytd7dyR50sj6X12mtXaiqr6Q5MKu/V0j617SPZ/U5wuS3Nxa++TOPNX8TDIBAAAALMZdrbWrlz2IqnpMku9L8pQh+zXJBKy9lpaTTa0NAPqJEwDsZUVqCd2Z5LG7Xl/atfUtc0dVHU3ysCSf22PdvvZvTnJFkuNdFtPXVNXx1toV83yAFdmPAAAAAIfabUmurKrLq+qs7BTyvnlkmZuTXN89f2aSd7TWWtd+XXf3ucuTXJnkPZP6bK39h9bao1trl7XWLkvyh/NOMCUymYAN4a5BAEwjTgAwyarcXa6rsfSCJLcm2UryutbaB6rqZUlub63dnOS1SX6xqo4nuTs7k0bplntjkg8mOZHk+a21k0nS1+dBfQaTTAAAAAAroLV2S5JbRtpesuv5fdmppdS37suTvHyWPnuWOX8/4x1lkglYey3JSWeoAZhAnABgL6uQybQJ7EcAAAAA5iaTCdgIam0AMI04AcAkq1KTaRPYjwAAAADMTSYTsPZakpPNGWoA+okTAOxFBs4w7EcAAAAA5iaTCdgI28seAAArTZwAYJpa9gA2hEwmAAAAAOZmkgkAAACAublcDlh7LS0n3ZoagAnECQCmqSRbyx7EhpDJBAAAAMDcZDIB668lJ52gBmAScQKAPcjAGYb9CAAAAMDcZDIBa6/FrakBmEycAGCaigycodiPAAAAAMxNJhOwASonU8seBAArS5wAYDoZOMOwHwEAAACYm0wmYO21JNvuGgTABOIEAHuRgTMM+xEAAACAuclkAjaCWhsATCNOADCJu8sNx34EAAAAYG4ymYC11+IMNQCTiRMA7EUGzjDsRwAAAADmJpMJ2AjbzRlqACYTJwCYpLoH85PJBAAAAMDcTDIBAAAAMDeXywFrT0FXAKYRJwDYy9ayB7AhZDIBAAAAMDeZTMDaa6mcNGcOwATiBADTVGTgDMV+BAAAAGBuMpmAjeDW1ABMI04AMI0MnGHYjwAAAADMTSYTsPbcNQiAacQJAPYiA2cY9iMAAAAAc5PJBGyAyslmzhyAScQJACZzd7nh2I8AAAAAzE0mE7D2WpJtc+YATCBOALAXUWIY9iMAAAAAc5PJBGwEdw0CYBpxAoBJ1GQajv0IAAAAwNxkMgFrrzV3DQJgMnECgL3Idx2GaAsAAADA3EwyAQAAADA3l8sBG2FbgisAU4gTAEyztewBbAiZTAAAAADMTSYTsPZakpPmzAGYQJwAYJqKDJyh2I8AAAAAzE0mE7AB3JoagGnECQCmEyWGYT8CAAAAMDeZTMDaa0m2zZkDMIE4AcA0ajINx34EAAAAYG4ymYCNcLLVsocAwAoTJwCYRgbOMOxHAAAAAOYmkwlYey2Vk+bMAZhAnABgL6LEMOxHAAAAAOYmkwnYCNvNnDkAk4kTAEzi7nLDsR8BAAAAVkBVXVNVH6qq41X1op73z66qN3Tvv7uqLtv13ou79g9V1dP36rOqXltVv11V76+qN1XV+fOOXyYTsPZaotYGABOJEwDsZRXuQVpVW0leneRpSe5IcltV3dxa++CuxZ6T5J7W2hVVdV2SVyZ5dlVdleS6JI9P8pgkb6uqr+vWmdTn32mtfbHb9j9J8oIkr5jnM4i2AAAAAMv3xCTHW2sfaa09kOSmJNeOLHNtkhu7529K8tSqqq79ptba/a21jyY53vU3sc9dE0yV5NzsnJeZi0kmAAAAgMW4qKpu3/V43q73LknyiV2v7+ja0rdMa+1Eki8kuXDKulP7rKqfT/KpJF+f5Gfm+FxJXC4HbICWysm2CgmuAKwicQKAaSrJ1uI2d1dr7erFbW661tpf6S7T+5kkz07y8/P0J5MJAAAAYPnuTPLYXa8v7dp6l6mqo0keluRzU9bds8/W2snsXEb3F+f9ADKZgI2wbc4cgCnECQCmWZEocVuSK6vq8uxMBF2X5H8ZWebmJNcn+c0kz0zyjtZaq6qbk/zLroD3Y5JcmeQ92UnUGuuzq8P0J1prx7vn35vk9+f9ACaZAAAAAJastXaiql6Q5NbsXMH3utbaB6rqZUlub63dnOS1SX6xqo4nuTs7k0bplntjkg8mOZHk+V2GUib0eSTJjVX10OxMRP12kr8x72cwyQSsvdaSk21Fzj0AsHLECQD2sipRorV2S5JbRtpesuv5fUm+b8K6L0/y8hn73E7yZwYY8mlWZT8CAAAAsMZkMgEboLIddw0CYBJxAoDJKjJwhmI/AgAAADA3mUzA2mtRawOAycQJAPYiSgzDfgQAAABgbiaZgI1wMkcW8phFVV1TVR+qquNV9aKe98+uqjd077+7qi7b9d6Lu/YPVdXT9+qzql5bVb9dVe+vqjdV1fnz7UmAzSROiBMAk5yqybSIx6Y7DJ8RYGGqaivJq5N8V5Krknx/VV01sthzktzTWrsiyU8leWW37lVJrkvy+CTXJPnZqtrao8+/01r7xtbaf5/kvyZ5wYF+QADmIk4AsMnUZALWXktlu63MXYOemOR4a+0jSVJVNyW5NskHdy1zbZKf6J6/Kck/q6rq2m9qrd2f5KNVdbzrL5P6bK19sWurJOdmp/QIALuIE+IEwF5k4AzDfgQ4MxdV1e27Hs8bef+SJJ/Y9fqOrq13mdbaiSRfSHLhlHWn9llVP5/kU0m+PsnP7PNzATAMcQKAQ0smE7ARZq2DMYC7WmtXL2pjs2it/ZXuUomfSfLsJD+/5CEBrBxxQpwAmGZl8l3XnEwmgGHdmeSxu15f2rX1LlNVR5M8LMnnpqy7Z5+ttZNJbkryF+f+BAAcJHECgI1lkglgWLclubKqLq+qs7JToPXmkWVuTnJ99/yZSd7RWmtd+3XdXYUuT3JlkvdM6rN2XJF8tdbG9yb5/QP+fADMR5wAYGO5XA5Yey3JdluNOfPW2omqekGSW5NsJXlda+0DVfWyJLe31m5O8tokv9gVbL07O38MpFvujdkp/noiyfO7M8+Z0OeRJDdW1UOzk+H720n+xiI/L8A6ECfECYBpKjsHT+ZXOydFANbXY5/w0Paj//rJC9nWj1711veuWq0NAKYTJwCY5glV7V8vaFtXJRsdJ2QyARugclKpPgAmEicAmG418l3Xn/0IAAAAwNxkMgFrb5VqbQCwesQJAKapyMAZiv0IAAAAwNxkMgEbQa0NAKYRJwCYRgbOMOxHAAAAAOYmkwlYe62VWhsATCROALAXUWIY9iMAAAAAc5PJBGyEk85QAzCFOAHAJO4uNxz7EQAAAIC5yWQC1l5Lsu2uQQBMIE4AsBcZOMOwHwEAAACYm0wmYAOUWhsATCFOADCdfNdhiLYAAAAAzE0mE7D2WpLt5twDAP3ECQCmqSRbyx7EhpDJBAAAAMDcTDIBAAAAMDeXywEb4aQ5cwCmECcAmEaUGIb9CAAAAMDcZDIBa6+lFHQFYCJxAoBpKjJwhmI/AgAAADA3mUzARtg2Zw7AFOIEANOIEsOwHwEAAACYm0wmYO21lpxUawOACcQJAKZRk2k49iMAAAAAc5PJBGwEdw0CYBpxAoBpZOAMw34EAAAAYG4ymYC111LZbubMAegnTgAwjZpMw7EfAQAAAJibTCZgI5yMWhsATCZOADCNDJxh2I8AAAAAzE0mE7D2Wtw1CIDJxAkA9iIDZxj2IwAAAIdG7fj5qrqnqt6z7PHAJjHJxBmpqndW1XOXPQ4ANsd+Y0tVnVtV/76qvlBV//ogxgbAjqr6WFV9x7LHsVtV/eWq+n9G2l5fVT+5x6rfmuRpSS5trT1xn9tuVXXFftaFTWaSiX3rO6hPWXaWg/3CVdVlXYA4uqtt5s/Fqti5NfUiHsDBOsNj8DOTPCrJha2179vHtsZiAJtKnABO88eSfKy19uUzXVHM2EyVncmRRTw23WH4jIeSgx8AQ1vB2PLHkvy/rbUTZ7riCn4WgJVVVb+Y5HFJ/n1V3VtVP1ZV31tVH6iqz3cZqd+wa/mPVdX/VlXvr6ovV9Vrq+pRVfUrVfWlqnpbVT181/LT+npRVf1Bt94Hq+ovdO3fkOSfJ/nT3Zg+X1XPS/IDSX6sa/v3PZ/lOUles2u9f9i1/9WqOl5Vd1fVzVX1mF3rtKp6flV9OMmHq+rXu7d+u+vj2cPtbVhvJpk2SHcwf2FVvT/Jl6vqW6vqP3cH3N+uqqfsWvYvV9VHuoP1R6vqB7r2n6iqf7Frud6zvH0H9Snj6j3YV9U3dEHk811Q+d5d67y+qn62C0T3VtVvVNWjq+qnu2unf7+qvnn3eKb09d1V9VtV9cWq+kRV/cSu4Z0KEJ/vtvOnZ/1crJbt1EIecNiscGz5h0lekuTZ3bLPqaojVfUPqurjVfWZqvqFqnrYyDafU1X/Nck70h8D2FDiBOxfa+0Hk/zXJN/TWjs/yb9L8q+S/O0kj0xyS3YmoM7atdpfzM4laV+X5HuS/EqSv98tfyTJDydJVX3dHn39QZL/KcnDkvzDJP+iqi5urf1ekr+e5Ddba+e31i5ord2Q5JeS/B9d2/f0fJbXjqz30qr69iT/OMmzklyc5ONJbhpZ9RlJnpTkqtba/9y1fWPXxxtm3ZesLplMwzgMn/Gw+f4k353kjyd5S5KfTPKIJH8vyb+pqkdW1XlJXpXku1prD0nyPyZ535lspO+gPmXZsYN9VR1L8u+T/MckX5vkbyX5par673at+qwk/yDJRUnuT/KbSf5L9/pNSf5JkszQ15eT/FCSC7p98zeq6hnde6cCxAXd2H5z1s8FcIisYmx5aZL/PckbumVfm+Qvd49v68Z6fpJ/NrLqn03yDUmenv4YAMDenp3kP7TW3tpaezDJ/5Xk3Owc+0/5mdbap1trdyb5T0ne3Vr7rdbafUnenOSbZ+mrtfavW2v/rbW23U3mfDjJvuooTfEDSV7XWvsvrbX7k7w4Oyc8Ltu1zD9urd3dWvvKwNuGjWKSafO8qrX2iSR/KcktrbVbugPyW5PcnuTPdcttJ3lCVZ3bWvtka+0DCx7nk7Pz5f8VrbUHWmvvSPLL2flD5pQ3t9beuysQ3dda+4XW2skkb8gfBaapfbXW3tla+51uP7w/O2dK/uwiPiSL0VpystVCHnBIrUts+YEk/6S19pHW2r3Z+SPhupGMqZ9orX3ZHwmHizgBg3tMdrJ9kiStte0kn0hyya5lPr3r+Vd6Xp8/S19V9UNV9b4ug/bzSZ6QnZPOM6mqH+iyVe+tql+Z8fPcm+RzI5/nE7Nuk/WjJtNwDsNnPGxOHfz+WJLvO3Uw7g7I35rk4q7A3bOzc7b4k1X1H6rq6xc8zsck+UQXRE75ePYfmCb2VVVPqqpfq6rPVtUXsvO5Zw5MAKxVbPn4rtcfT3I0O8XBT/FHAsD+tF3P/1t2YkKSpKoqyWOT3LmPfif2VVV/LMn/N8kLsnOThwuS/G7y1WtTW8ad1tZa+6UuW/X81tp3zTiG85JcOPJ5+rYFjDDJtHlOHfw+keQXu2uTTz3Oa629Iklaa7e21p6WnWuOfz87B+9k59Kyr9nV36Nn2NaZjOuU/5bksVW1+2fwcdl/YJrW179McnOSx7bWHpadeh8zBybWg7sGwYFa1dgy6rQ/ErITC07k9JMUbcJzNpw4AXP7dHYuRU6SNyb57qp6ale64u9mp7zFf95Hv9P6Oi87x+rPJklV/ZXsZDLtHtOlI7Wgdo9zVv8qyV+pqm+qqrOzczn2u1trH5uyzn62wwqTyTSMw/AZD6t/keR7qurpVbVVVedU1VOq6tLaubPDtd0M/f1J7s3OJQ7JTv2M/7mqHtcVS33xlG30HdSnLbv7IPzuJH+YnWLgx7rCsd+T8QJ7s9irr4ckubu1dl9VPTHJ/7Jr3c9m57PvHtuZfC6Aw2TVYsuof5Xk71TV5VV1fv6oZtOku8/1xQAA+v3jJP+gy2L9nuxcQv0zSe7qXn9Pa+2BM+20tfahSX211j6Y5P/OTm3WTyf5k0l+Y9fq70jygSSfqqq7urbXJrmqy7j9dzOO4W1J/j9J/k2STyb5E0mu22O1n0hyY7edZ82yHTgM3L53Q7XWPlFV1yb5P7Lzpftkkvck+RvZmVz80SS/kJ0zA+/r2tNae2tVvSHJ+7NzkH9lku8d7b+z+6C+3Vqbdgnaa5P86y4ovbO19oyq+p4kP5udPzbuTPJDrbXf38dnfWCPvv5mkv+7qv5Zkv9fds6WXNCt+4dV9fIkv9GdObnmDD8XK6Clsq0OBhy4FYwto16XnUvmfj3JOUluzc7NICZ9nrEY0Fp71xlsjzUhTsD8Wmtvyc7NH3Z784RlLxt5/ZdGXr8myWt2vX7zlL5+PMmPT3jvgezcmGJ324eTfFPf8ruWeX2S14+0/fPsXPHQt/zYAWTa8qynnSs1F6BtdiJ1tQ3/gMDmu/AbHtn+3OuvXci2/sWTX/ve1trVC9kYAIMQJwCY5uqqdvuCJplq5+ZWE+NEVV2T5J8m2UrymlNlCXa9f3Z2Tup9S3YK1D/71KWdVfXiJM/JzonAH26t3Tqtz6r6pSRXJ3kwOycO/1p3l8d9k8kEbITtOEMNwGTiBAATVSVHFzQ98uDkOZyq2kry6iRPS3JHktuq6ubu0tFTnpPkntbaFVV1XXYyxJ9dVVdl5zLPx2cns/ttVfV13TqT+vyl7FyumuzUMn5ukp+b5+OpycRgquoDu24PuvvxA8seGwDrSWwBAA6RJyY53lr7SHc56E1JRlNxr01yY/f8TUme2t2V8dokN7XW7m+tfTTJ8a6/iX221m5pnexkMl067weYa6purzQuDpfW2uOXPQYOp5aotbGixAnmJbYwBHFidYkTwMpYXCbTRVV1+66WG1prN3TPL8nO3XxPuSPJk0Z6+OoyrbUTVfWFJBd27e8aWfeS7vnUPrvalD+Y5EfO+POM2PdenDGN6/SNnXNeO/v8R+x3k6tpyJJW+/zuM+t3pvFqdfvb3kKMjK22xwd75ETPB+hrOjq+g9qR09tm3ocz7LPevnyvnej+e+/Oifu+bA9tIHGiM8Nxo+8XYKZDdM+KfcegtjXjRkcX2e5p7GnrOzbOciyc+W7vPf0fOXn66637ewZ271fGh3BkfKPt3LPH2rbPOn25QecnHPHOiDixufYTJy666KJ22WWXLWiEK6Svju4+68ecPDne1nf1zolJ9+Xcpe9v8r62rZ44tN1z2B4d2wMz3quu59Ces0cO7VsP3je+0D33jLed1XNz0/PO23u5vvjS89/Wt/9H/yv7/mtnbTuMPvaxj+Wuu+5ap71x1wrW7vvZJL/eWvtP83Y0z1TdV1OukqSqTqVcTQwKZ5//iFz15//OHJtcPaOTH71fyHv0/hFwZPToMr7Mds8BuvdLet9BaHv6653OetabdTJqdLk5fs1H9+tZ944P9pzP9kSdniP5AxeMB4oHHnL6jtw+1jeG8batB8b73946/YP29TX2f8tXffCXf2qQfrZn/muVBRIn0hMn+r5c9k3S9PxIj7b1HVtOnDO+3oMPGV/u5Pi8ytjYjo7P0eToV8YHWz1/iPSNf/T4eOK8vpMA4+sd6fnj56wvnD6OC46P//Fw5D/91njb+Q8Zazv5hD8+1vaHjzl9R544py+w9jT1xI7RmL/dc/Kjz8zxd8OJExvtjOPEZZddltvf854FDW+F9M347DPr4ov3jv8u3HHH+HJ33bX3Ji/quf9nX9v554+33dcz5/P5z+89rr5d0df/FVec/vqhd/T8WL2554Z2j33seNvVPfMBo5Od54wH4AdOjO/re+8d72p0v846eTfrj8CRvjNEM9gesLrOfscwi6uf+MT5O1lkTabp7kyy+4fw0q6tb5k7qupokodlpwD4tHUn9llVL03yyCR/bYDxz/VT05fGdcnoQlX1vKq6vapuP3Hfl+fYHABrRpwAYJozjhOf/exnFzY4gCW4LcmVVXV5VZ2VnULeN48sc3OS67vnz0zyjq6m0s1Jrquqs6vq8iRXZqfO0sQ+q+q5SZ6e5Ptba4PMBB74KZ3W2g2ttatba1cfPacnzRCAQ02cAGCa3XHikY985LKHA3BgWmsnkrwgya1Jfi/JG1trH6iql1XV93aLvTbJhVV1PMmPJnlRt+4HkrwxO9mgv5rk+a21k5P67Pr650keleQ3q+p9VfWSeT/DPPlgs6RxARy8Vgq6riZxYkX0XqLd9ytz0KeeRmsyzfprO+BlY7XVdz3eDJfCHXRNJpfGHSxxYlWJEyui7xK0WWoyHfQ4Zh3DoFc59RWQOuDLqA76Kq0hL3vbWKtzuVxaa7ckuWWk7SW7nt+X5PsmrPvyJC+fpc+uffAPPc9P2yxpXAAcXuIEANOIEwAbZt+zVt2t8k6lXG0led2ulCuAhWlJtt2uaeWIE8CqECdWkzgBrIwVymRad3PtxUkpVwCQiBMATCdOAGwWU3XARlBrA4BpxAkAJpLJNBh7cROsyHemaqdXLW014MD6CqI2VVIBxvQdemct8j1y49pZC4b3Hu171609l+ntapbD/awxocY/+ErMPfTtr77FhD7YfAdccXvW7mdZbp6hrkqx8THHjo239U0+rNGExJHRAD8jBcPZj/X5zQCYoMUZagAmEycA2NMaTRyuMlOTAAAAAMzNVB2wEZyhBmAacQKAidRkGoy9yP6oCQEwm5Hj5VJq6sxaW+mg/wYf7b9ve7OWVtrvftzqSeLeGh/IQc5H9O57cRVYolnrIx303+Cj25x1DDO19XW2gfWXYNn8tgBrr6WcoQZgInECgKlkMg1GTSYAAAAA5maqDtgI27PeCx2AQ0mcAGAimUyDkckEAAAAwNxM1XFw+oqYLuMkYt82nczcLM1dgzgc2gyVuft+FXp/PXpOM40tN8+vVd84RrbZWwC7r68hi2JvbY13f+SAq6A7PC2fOAFnbNZi4Pv14IN797+M4uM5++zxtnPOOeCNnm4pn7vHkWyPtW1vap6KTKbBbOhPCAAAAACLZJIJAAAAgLnJBwPWXovLIACYTJwAYE8ulxuETCYAAAAA5maqjvU1YGHx3mK6NWOl2ZFVZynMy/CcoYYpZiwGPuThq/dXcvR42XOqq04ON4a+D1Q9Zyn7Cn+Pjn/WY3vNUqW8r6shi5vTS5yAHX0Ft2cpwt3XNmQh8Fn7H3SbfZkrx47Ntpysl82i8PdgZDIBAAAAMDdTdcDaaylnqAGYSJwAYCqZTIORyQQAAADA3EzVARuhOUMNwBTiBAATyWQajL0IAJtkxiLf7UhPpekDvnHBwv/Gr56E7SPjbW3L5ANwuJ3suelCXzHwIf8Gn2WbQxcWH9P3gc45Z7blRmzPeJHQus9jHMn2WNusn53DYc1/xAF2bO/31oIAHAriBAATyWQajClHAAAAAOZmqg5Ye63FXYMAmEicAGBPMpkGYS9ugr7vTD2lNg7c6Dbn+C7XDrguyH75fgpsjFlqN81zzOtbdyR/uvXkU7fxUg+pfca0OtIziKNb49vsG+sBHu9n3d5+PzfAEPpqJi16m1/5yvgy558/3jbo3MCMNZnUIZqsr24Th4dJJmAjuGsQANOIEwBMpCbTYEy/AgAAADA3U3XABii1NgCYQpwAYAqZTIORyQQAAADA3EzVLcsqnEw7JAVFV7WIOMA0+0266D3m9RX57jvNNODhsm/8Y9s84DFkq6fId1/h754C4ZJegE3VV9D7xIn9tfUtM6tZ+p91rDPpy1LpiROzFv4+SPPsV1g2k0zARlDQFYBpxAkAJnK53GBcLgcAAADA3EzVAWuvJQq6AjCROAHAVDKZBiOTCWBgVXVNVX2oqo5X1Yt63j+7qt7Qvf/uqrps13sv7to/VFVP36vPqvqlrv13q+p1VXXswD8gAHMRJwDYVKbqhtZXTHtVTpzNUOi71qkY+Bz7dciTmWN9rcr/92HSkrYiP7tVtZXk1UmeluSOJLdV1c2ttQ/uWuw5Se5prV1RVdcleWWSZ1fVVUmuS/L4JI9J8raq+rpunUl9/lKSv9Qt8y+TPDfJzx3oh2S19RXc7jsuzVB0e65j5Qzj6C0+PqDqK+jaU/j7wAuQL7Jv+okT4gRnrK/49IMPHmz/99239zKDOtYz57oChb9ZAplMg5HJBDCsJyY53lr7SGvtgSQ3Jbl2ZJlrk9zYPX9TkqdWVXXtN7XW7m+tfTTJ8a6/iX221m5pnSTvSXLpAX8+AOYjTgCwsUzVARthe3GpARdV1e27Xt/QWrth1+tLknxi1+s7kjxppI+vLtNaO1FVX0hyYdf+rpF1L+meT+2zu/zhB5P8yBl9GoBDQpwQJwCmksk0CHsR4Mzc1Vq7etmD6PGzSX69tfaflj0QgENOnADg0DLJBKy9lqStzl2D7kzy2F2vL+3a+pa5o6qOJnlYks/tse7EPqvqpUkemeSvDTB+gI0jTogTAFOpyTSYPWsydXeh+ExV/e6utkdU1Vur6sPdvw8/2GGusDby4KuqtbHHwW+0xh+wWLclubKqLq+qs7JToPXmkWVuTnJ99/yZSd7R1cq4Ocl13V2FLk9yZXbqZ0zss6qem+TpSb6/tbZ9wJ+tlzgxXbXTH31ajT+GHcT4YzR8tSTtSDvtMXP3bfzRqsYeOZLTHq3vMeS+2Noae7S+x5Eae+zXTOPv+f/gUBEnIk6smhMnZnucPHn6o8+DD44/9rvN++4bf/Qt1+fo0dMfvc45Z/wxuuLRo9nOkbEHf2R073C4zfLb8fok14y0vSjJ21trVyZ5e/caYEkq220xj7201k4keUGSW5P8XpI3ttY+UFUvq6rv7RZ7bZILq+p4kh9NdwxtrX0gyRuTfDDJryZ5fmvt5KQ+u77+eZJHJfnNqnpfVb1kmH16Rl4fcQJYaeJExAmAyU5lMi3iseH2/ISttV+vqstGmq9N8pTu+Y1J3pnkhUMODGBdtdZuSXLLSNtLdj2/L8n3TVj35UlePkufXfvSI5U4AXBmxIkk4gTARtpv0HlUa+2T3fNPZefsSK+qel6S5yXJWefJggUOxiKuxuSMiBPAShEnVs6+4sTjHve4BQwNOHTUZBrM3BeTdteHTwzbrbUbWmtXt9auPnrOefNuDoA1I04AMM2ZxIlHPvKRCxwZAGdqv1N1n66qi1trn6yqi5N8ZshBsfr6iniPFrRdmZu4DDkOhcRX1grdNYgd4sSyTCo0ParnNNOgv0Y9fbWRbbatvr8p9zmInuNzbY1/yHa0p21rvLuxfdE3rBkzY9rI2Pr2syPYwRMnVo44seLuu2+87ZxzFrvNvjFMKvS9L1s9AaDnQ86yzSGTYPqKpfeNQeLNgGQyDWa/mUy773hxfZK3DDMcADaEOAHANOIEwAbac5Kpqv5Vkt9M8t9V1R1V9Zwkr0jytKr6cJLv6F4DcAiJEwBMI04AHB6z3F3u+ye89dSBxwKwL625DGKZxAlg1YkTyyVOAGvB5XKDsBdZX6tSH2mGYfTW33CXG2BB+o5B7UjPQWjI42rfNkfaRms0TVpv33pqbfTWZDqy4Hgya90sgAPQV9tnv219tYPmGcdof1/5ymzr7duxY+NtM9ZkMh8B/fxqABth2xlqAKYQJwCYSOHvwey38DcAAAAAfJWpOmAjNJcfAjCFOAHARDKZBiOTCQAAAIC5mapbJbOUClBOYKr+4rYH2/9+lmF47hoEO3p/FWY9No4uN8evVV//bWuGZYY8/dVzRrK38LdC3IeCOMFaW0KGRV9R7yGLbvf1df/9018PrqfI9zIKf4/2dfLkcH0zI5lMg5HJBAAAALACquqaqvpQVR2vqhf1vH92Vb2he//dVXXZrvde3LV/qKqevlefVfWCrq1V1UVDjN9UHbD2WsoZagAmEicAmGpFMpmqaivJq5M8LckdSW6rqptbax/ctdhzktzTWruiqq5L8sokz66qq5Jcl+TxSR6T5G1V9XXdOpP6/I0kv5zknUN9BplMAAAAAMv3xCTHW2sfaa09kOSmJNeOLHNtkhu7529K8tSqqq79ptba/a21jyY53vU3sc/W2m+11j425AdY/lQdwADcNAiAacQJAKZaXCbTRVV1+67XN7TWbuieX5LkE7veuyPJk0bW/+oyrbUTVfWFJBd27e8aWfeS7vlefQ7GJNMG6Mv+rmV8kxrd5gGPYa6sdxnzwKo76OPUEm6UMNp/O9oTKGqfH7xn7NXzZXG7r/D3gvO6XbUFrJq+wtZ9xacPuvD3ffdNf530FySfSd8EwtbWeFtf4e/P73ObMw6DQ+eu1trVyx7EQfEjDqy/5q5BAEwhTgAwzYrUZEpyZ5LH7np9adfWt8wdVXU0ycOSfG6PdffqczBqMgEAAAAs321Jrqyqy6vqrOwU8r55ZJmbk1zfPX9mkne01lrXfl1397nLk1yZ5D0z9jmYlZiqA5ibYhsATCNOADDJimQydTWWXpDk1iRbSV7XWvtAVb0sye2ttZuTvDbJL1bV8SR3Z2fSKN1yb0zywSQnkjy/tXYySfr67Np/OMmPJXl0kvdX1S2ttefO8xmWvxcBAAAASGvtliS3jLS9ZNfz+5J834R1X57k5bP02bW/Ksmr5hzyaUwyDa2v0OmKlABYSjHwocy6D/sKxu53/8+43qr8/wIk6T92zVrke4bj2cyxpK+v0cLfPfVW91uEu/Ud/4+Ob6D1Fv4eX7e3v4H0b298xwovwEGYtXh3X9HtWdY9dmz//Y+23Xvv+DJ9Bcn37dxzx5oeODFbIBrdF0MmwQxZYB0WzSQTsBEUdAVgGnECgIlW5HK5TaDwNwAAAABzM1UHbIS2zpeDAnDgxAkAJpLJNBh7cVPN8EVqrhpNPeuO9jfXd7lZMtoPsF7G5G0ufpPAIbCMY8uR8aN0G3AgfbWVtrdO32Y72hdMBhtCsjVek2n76IC1+/rMFL8G3B7AAemrCzTaNk99pL7+v/KV01/31WQatF5Rz6RCX62oBx8cbzvnnAHHARvEJBOw9lrU2gBgMnECgD3JZBqEmkwAAAAAzM1UHbD+WhJnqAGYRJwAYBo1mQYjkwkAAACAuZmqW5K2jKLVm2bGKdKF7+u+zbmjzYFz1yAOhSEPZ33H0JH+50r86Fm3jdTh7iv83XoKks/0wfu2d3S88Hc7Ov7B+4qUH2gxcF8BlkKcgDMzawHs/eor4H3//XuPoa9tJn1ZKj3Vu0eLjyf7L3Det8lZCpcPWtyc2chkGoxMJgAAAADmZqoO2AzOUAMwjTgBwCQymQYjkwkAAACAuZmqAzZApblrEAATiRMATCGTaTD2IsMZSUOvnrT0/Waq9xXvnqeg936/Z/au5zsrsEL6jlO9bVt9RbcHHEdfX6NtfWPY9/G5Z8W+wt/jTQu/s725DmAdDFkAu09fcevRot733DPbevvWM6kw5GcckmLgrAuTTMBmUGsDgGnECQAmkck0GDWZAAAAAJibSSYAAAAA5iYfDFh/LQq6AjCZOAHAXlwuNwh78TDZtFoEs35XnGW5vmU2bX8B7NZ3d4axtjlusNCTKz3WdrRnDDPmWI/NF/QVNz82XuV7+2jPgosu/N33Gc1/ACumrwD2kMWnR4t8J8m9957++stfPtgx5Jxzxpr6xrXouQdFvllnJpmAzWBSEIBpxAkAJlH4ezBqMgEAAAAwN1N1wIZwrQkA04gTAEwgk2kwMpkAAAAAmNueU3VV9dgkv5DkUdm5mv2G1to/rapHJHlDksuSfCzJs1pr9xzcUNfYEk6c9dVzXfQ2D3oIrcZ3bLUD3uoM/5d9N69Zxv/HoWMfL404cWb6jhH9bcMFj95j0AEXn+4t/L11+kCOHBuvKtuOHNvf9vr24dHxQbSt8QWH3NczkVCzHOLE0ogTq2XWotJ9BbCHLEjd19foNkcLgc81hr4slZ7C3339D5ngMktfCn8vgUymwcySyXQiyd9trV2V5MlJnl9VVyV5UZK3t9auTPL27jUAh484AcA04gTAIbHnVF1r7ZNJPtk9/1JV/V6SS5Jcm+Qp3WI3JnlnkhceyCgB9uIM9dKIE8BaECeWRpwAVp5MpsGcUU2mqrosyTcneXeSR3UBI0k+lZ301751nldVt1fV7Sfu+/I8YwVgxYkTAEwzb5z47Gc/u5iBArAvM0/VVdX5Sf5Nkr/dWvti7apf0FprVf1VZ1prNyS5IUnOu+ixziFtiIXXGOqrX9FXf6Onsa9Oxyx6az45DbqaWvb/H81gxIk1szW+q2f6Ner7H+pr6ztGb40M4ej2TGOYaVxHeo7/W+Pn0ra3xpr6xzrS1vvT2zeuGX6C++pVccDEiZUwRJy4+uqrNz9OrEg2xZA1mfo+Ul//ozWYPv/58WUefHB/Y+jVM7D7eupA9ZRuOlBqMi3JivzurbuZvuZU1bHsBIRfaq39267501V1cff+xUk+czBDBGDViRMATCNOABwOe04y1c4phtcm+b3W2j/Z9dbNSa7vnl+f5C3DDw9gNq0t5sE4cQJYB+LE8ogTwMo7VZNpEY8NN8sn/DNJfjDJ71TV+7q2v5/kFUneWFXPSfLxJM86kBECsOrECQCmEScADolZ7i73/6S/6kCSPHXY4QDsk7PHSyNOAGtBnFgacQJYee4uNxh7cWDLqCnZWyKxp+3Ai3WP5ogPuDNmLQQ78xYH/H/qKxAOsOrqSE9QGLmIfp640Vfcuo0UGz921nhl0wf2fbOGnrZj41W+W1+B8AOOCWP9CxvAGhiy8Hefvr5Gt9lX+Pv++/e5wb4JhJ62VSi6vQpjgP1yfxMAAAAA5iaTCdgMbk0NwDTiBACTuFxuMDKZAAAAAJibqTpgIxx4zTEA1po4AcBEMpkGYy+yttpWT9r7yb6K5wNuc5a+ZOMDq6bv0Li1Pb7YkMfLvsLfR08fyFlHT44tc/8+c6x7C3of7WkbrwXef9w+wAmJvn0jdgAHYXuOC1cOuvB3X//33jv99dBj6JtUePDBAfvfp1UYA+yXSSZg/bW4NTUAk4kTAOxFJtMg1GQCAAAAYG6m6oANUO4aBMAU4gQAU6jJNBiZTAAAAADMzVTdhprpDip9y8x6kq+viOxB1jroG1f1NPYVmnXi8nBQa4N10Xs8O+Bt9hb+Hm9ssxzIZ/1d6zuNdeT0lc85a7yy6ZeOjG+gZjmQ9yyyvTU+iN6i2wu2CmM4lMQJDqEjGb/JQ98Bui+BY79Ft2dNBunra7QY+IMPfrlnvfNm28CovoGdc85Y08nxe1LM3N1QZh0DA5LJNBhfcwAAAACYm6k6YDM4Qw3ANOIEAJPIZBqMTCYAAAAA5maqDtgMzlADMI04AcAkMpkGYy8uyzKKUR/0l6sFf3nrrQN70PtVEXFgDfXV8z5yZLwY7PboMW6O43rrKeCdkWLjX3NsvPD3vm/W0Ff4+9h4YzvS09az7kHezELhb2AdjBbhTpIHxw/bg/Y/Xmx8wMLffVZ0UmGWAuuwqlbztwrgTLS4jSAAk4kTAOxlRScd141zaQAAAADMzSQTAAAAAHOTDzavGepXtFpCevYSiluO1q/orWfR1zbD7pm5/lLfvj7o/T/SfW9tj4MdATnY+ikwj9FjwlJ+Vnu2efToeE2mEwMerHrrDo3UZDrv2APjy8x4+mt0P/bVWsrWjONaNEFhKcQJ2NF3RVBf23h9pOTkyeHGMVtNpi+OLXPixNcON4ieD37Q9ZD69vXoNvvGoE7TAVP4ezCr8FULAAAAgDVnqg7YDM5QAzCNOAHAJDKZBiOTCQAAAIC5maoDAAAADi+ZTIOxF4e2jGKeK1DkO8nBjqOneHdvkdc2Poi+QtxLKcYOkAk3Muizz8PUrMfnra3xwt+j2+zra9biyX0Ftmuk8PdDj41XfZ15/8ywvb6duN/+h7QKYwDYbdbC36PFp7d6brAwq75C1uPFwL8803oz6fmQ2yt6YY8i34dbVV2T5J9m5xYmr2mtvWLk/bOT/EKSb0nyuSTPbq19rHvvxUmek+Rkkh9urd06rc+qujzJTUkuTPLeJD/YWuu5M8vsVvO3CuAMVVvMA4D1JE4AMNGpTKZFPKYOo7aSvDrJdyW5Ksn3V9VVI4s9J8k9rbUrkvxUkld2616V5Lokj09yTZKfraqtPfp8ZZKf6vq6p+t7LiaZAAAAAJbviUmOt9Y+0mUU3ZTk2pFlrk1yY/f8TUmeWlXVtd/UWru/tfbRJMe7/nr77Nb59q6PdH0+Y94P4HI5YDO4/gSAacQJAKZY4OWTF1XV7bte39Bau6F7fkmST+x6744kTxpZ/6vLtNZOVNUXsnO52yVJ3jWy7iXd874+L0zy+dbaiZ7l980kEwAAAMBi3NVau3rZgzgoJpnWzYzX+i+jJkCNFt0e8Ixhb1eztu1XX8HwpVR2Z08tSymAD0M56JsRVE+N72NbJ3vGMeAvUs/JwCMzFP7edwDrO2b3FaTt29VDHj9m+a/s2TeSbA6YOMEhNU9mxiyFv/vMeoOu8SLffdv84tgyDz44W/+zmLXA9qJvOqbw9+K1tjL7/c4kj931+tKurW+ZO6rqaJKHZacA+LR1+9o/l+SCqjraZTP1beuMqckEAAAAsHy3Jbmyqi6vqrOyU8j75pFlbk5yfff8mUne0VprXft1VXV2d9e4K5O8Z1Kf3Tq/1vWRrs+3zPsBZDIBm8EZagCmEScAmGBVMpm6GksvSHJrkq0kr2utfaCqXpbk9tbazUlem+QXq+p4kruzM2mUbrk3JvlgkhNJnt9aO5kkfX12m3xhkpuq6ieT/FbX91xMMgEAAACsgNbaLUluGWl7ya7n9yX5vgnrvjzJy2fps2v/SHbuPjcYk0zARlhGHTIA1oc4AcAkq5LJtAnUZNpUbfxRrZ32OPBtHrB2ZPyRmvFxkBa9PVZOVV1TVR+qquNV9aKe98+uqjd077+7qi7b9d6Lu/YPVdXT9+qzql7QtbWquujAPxyrr+f43+esoyfHHjP1NWP/rcYfR45sn/a44Ogfjj16j6EzbLMdqbHH9tb4o29cB27k8/TGLw4VcYJVc/To+OPee8cfo44dG3/M6sSJ8cf49r7Y8xjuQ/aNYRWs6rhgFjKZgM2wImeoq2oryauTPC3JHUluq6qbW2sf3LXYc5Lc01q7oqquS/LKJM+uqquyc03145M8JsnbqurrunUm9fkbSX45yTsP/tMBrDFx4p0H/+kA1pNMpuE4dwYwrCcmOd5a+0hr7YEkNyW5dmSZa5Pc2D1/U5KnVlV17Te11u5vrX00yfGuv4l9ttZ+q7X2sYP+UAAMRpwAYGOZZAI4MxdV1e27Hs8bef+SJJ/Y9fqOrq13mdbaiSRfSHLhlHVn6ROA1SBOAHBo7Xm5XFWdk+TXk5zdLf+m1tpLq+ry7JwluTDJe5P8YHfmhEVbRvp3zzZre+T1kOPqqZnRjow39tW1WEi9DZZvcb8Hd7XWrl7Y1taAOHGGlnBMGj0+J8lZWz01mEbHNuPvVd/xvu94vLV1+kAefuzLs21gBn3H+t5aRysQE9RgWhJxYmnEidVytOcvwK2t8badG1id7sSJcwYbx33j3efBB0dj03gNppM94avvMw2pb/8cJJdtLYf9PoxZvubcn+TbW2vfmOSbklxTVU/OzrXhP9VauyLJPdm5dhzgsLszyWN3vb60a+tdpqqOJnlYks9NWXeWPpdJnACYnTghTgBsrD0nmdqOU/cSONY9WpJvz8414snONePPOIgBAuyl2uIeM7gtyZVVdXlVnZWdAq03jyxzc5Lru+fPTPKO1lrr2q/r7ip0eZIrk7xnxj6XRpwAVp04sVziBLDqThX+XsRj082UsF1VW1X1viSfSfLWJH+Q5PPdNeLJlOu+q+p5p65JP3HfcGnxAKuoOy6+IMmtSX4vyRtbax+oqpdV1fd2i702yYVVdTzJjyZ5UbfuB5K8MckHk/xqkue31k5O6jNJquqHq+qO7Jy1fn9VvWZRn3U3cQJgNuLEfHHis5/97ELGC8D+zHT1amvtZJJvqqoLkrw5ydfPuoHW2g1JbkiS8y567IrcPBbYOCtUfKu1dkuSW0baXrLr+X1Jvm/Cui9P8vJZ+uzaX5XkVXMOeW7iBLDyxImlGipOXH311eIEMLhTmUzM74xKpLXWPl9Vv5bkTye5oKqOdmcfVu2676VptRpfYKotIf6ObHLI73K9fc1a5BVYGHGix4LDQt/lOn2Fv88+uvc3qblu4NCz8pEjp7c9Yqsnc61vf80yjhlvELEahb/9jczhJU4s1pH0BICei1mOHetb+ys9bacX/p6n4PaDD/a1jlYDv7dvof3pGWzfpMKsn+kgi4337xtYD3v+SV5Vj+zOOKSqzk3ytOyk4f5adq4RT3auGX/LAY0RYG9tQQ/GiBPAWhAnlkacAFadmkzDmWX+9eIkN1bVVnYmpd7YWvvlqvpgkpuq6ieT/FZ2rh0H4PARJwCYRpwAOCT2nGRqrb0/yTf3tH8kyRMPYlAAZ2quy3qYizgBrANxYnnECWDVqck0HBVsAAAAAJjbAZYr46tWoMhon77i4PMULh/t76DPGPYVA+8d/qL3/4r+f288Z6hhx6yFv7dmKPzds96sx/a+GzGMFv6+8OhwBV37inyv7M0gesYly2YB7GNI0l+wur+I9WgR7nn6GnfyZF/rAyOvPz9TXwdZhDuZVBj94PTvGw6aTKZhrOrXLwAAAADWiEwmYP01WQAATCFOADCFmkzDkckEAAAAwNxkMgGbwRlqAKYRJwCYQCbTcEwyzWmeQtlD6U3/nuWL1NBDP8gvbzMW9J75/2O/n335/93Amus9Tg15bJmx8Pc5Ww/uve48x/Wez3TkyOkDueDIH+49hvTfqGJstVW48cOMescKMIDtkQtVjqQnAPQYsvD3rPr/oB+NTcPdIGLWMWxtHegmZ2Kyg3XmcjkAAAAA5iaTCdgMLoMAYBpxAoAJXC43HJlMAAAAAMxNJhOwEdyaGoBpxAkAJpHJNByTTGum7wtSXwHRWZcbchxjhWV7C7XubxB9Y29H+hrHt6nAKnCY9BbJ3h4/EJ6zNf5NqkYOmLXdF0z2PbRsjQSPC458Zbb+Z2nrjROzjWvhkw/yyIEl6its3V/Ae7zo9uhywxf+fmDk9RfHlph1/ONtsw322LHZ+j9Ifftm0WOA/fKjCgAAABxqMpmG4VwaAAAAAHOTyQRsBrU2AJhGnABgAjWZhmOSaROsypem3hpMB7i5vlpU6i8BK6Yt+sA0S828JOduPbjnun3rzaz3GH36Bh52pG8M4yvOUjOpt3bfHPv+IOs0rUrYBjilv97PfXsuN1stpDMxGhfGx9BXM2lI61776EjmCd4wvzX/FQJI0tw1CIApxAkAppDJNBw1mQAAAACYm0wmYDM4Qw3ANOIEABPIZBqOTCYAAAAA5iaTaWirUni672zdAY+tTp6+0UFrH/SNvbfI64zrHqDeMXDwnKGGJP3H3r4C3mcf6TldN7Jc33rzHNtHC38/5EhPke++eqWzbHPW4/8qHCvEieVYhf97GND2PvMF+gpn9xe7fmDP5YYvkj26zS/vOYYk2dra39ZmLVy+6GLgMmoWTybTcGQyAQAAADA3mUzA2qu4axAAk4kTAOxFJtMwZDIBAAAAMDeTTAAAAADMzeVyDGa0WOtBF8Du679KNdVDy2UQsKO38Pd449lHHhxf7uTIMbSvCPcc4xit8/01NV59dr/FxtfqpgurWpB809nHbJgjPQfp/RYD7y9sfd9YyznnnP561oLbfWPtz3cYLfz9lT3HMLMZq3fvu3/WmsLfw5HJBAAAAMDcZDIB668p6ArAFOIEAFPIZBqOTCYAAAAA5iaTCdgMzlADMI04AcAEMpmGY5JpXitQaHQp6d9tfKOjhWWHHFfrKehdPRtoPbl5fesOaa2KzQLLd8DHjL5jb88hO2cfGf8mVSdHXvfVae07tu+zkPXZNf41ZKz4+Kx6Vus9PveNa0UnH1zeBRyEvvrX/QW8T461jBbFPvfc8bX6i3zPNo7xO07sXXw8SY6N30di3/rGNWPN8MGY7GCdmWQCNoM/xgCYRpwAYAKZTMNRkwkAAACAuclkAjaCy0oAmEacAGASmUzDMcm0bmashdFbk2PwwYxs8+Tyv72pjwQcej2H4r7aSkd6AsVoPaTemkwzmuUP+q0aT6gerQuVZNAAtrITDas6LmBlbe/zopS++kL9NY0eHGsZrYc0T62i/nX7gsDpzj571r72N4ZF11+a1aqOC0b5UQU2gz/QAJhGnABgCplMw1CTCQAAAIC5yWQC1l+LM9QATCZOADCFmkzDkckEAAAAwNxmzmSqqq0ktye5s7X256vq8iQ3JbkwyXuT/GBr7YGDGSZT7ffM3MBn9Gp7pMMDPmPYV+Rb3e/Da2WL+R4i4sQEiz4wzVj4u89o0e0jPTd0aDXbBxotIp4ko2Gid72+s4gzrDfruDi8xInlEyf2b79Fvmc1a1Hp8847/fVoIfAzsbXV17r3f/9DHrL/bc6if1yLpcj34slkGs6ZHK1+JMnv7Xr9yiQ/1Vq7Isk9SZ4z5MAAWDviBADTiBMAG26mSaaqujTJdyd5Tfe6knx7kjd1i9yY5BkHMD4A1oA4AcA04gTA4TBrIt5PJ/mxJKeSEy9M8vnW2qmEsjuSXNK3YlU9L8nzkuSs8x6+74ECTOUyiGX76YgTwCoTJ5btpzNAnHjc4x53sKMEDiWXyw1nz0ymqvrzST7TWnvvfjbQWruhtXZ1a+3qo+ect/cKAKwVcQKAaYaME4985CMHHh3A+qiqR1TVW6vqw92/vWdoq+r6bpkPV9X1u9q/pap+p6qOV9WruqzSif1W1ddX1W9W1f1V9fdmGeMsmUx/Jsn3VtWfS3JOkocm+adJLqiqo93Zh0uT3DnLBtlcdfL0yrJtyPqEffVce9p6T1IuuBaswqLLYb8vlTixQvp+F/p+PbZ77p5w5MHT28Zu6JCkzVgQta/YeBvZ5oPt5NgyR06Mj6va+Dj2/Tu/CseKnn3jGHbw7OOlEifmdKTnwLHfYuCzF5Ue73+06HbfuGZ17rl9raNx4ayxJc4/f3ytIQtlHzt2sP3PQuHvxVujTKYXJXl7a+0VVfWi7vULdy9QVY9I8tIkV2fnm897q+rm1to9SX4uyV9N8u4ktyS5JsmvTOn37iQ/nDO4nHnPI1Nr7cWttUtba5cluS7JO1prP5Dk15I8s1vs+iRvmXWjAGwOcQKAacQJgMFcm50adsnkWnZPT/LW1trd3cTSW5NcU1UXJ3loa+1drbWW5Bd2rd/bb2vtM62125I8OOsA58k1eWGSH62q49m5pvq1c/QFMJ+2oAdnQpwAVoc4sYrECWBlnDixmEeSi6rq9l2P553BMB/VWvtk9/xTSR7Vs8wlST6x6/WpmneXdM9H22ftdyZnlIjXWntnknd2zz+S5In73TAAm0ecAGAacQIgd7XWrp70ZlW9Lcmje9768d0vWmutaviLweft19WewPpz9hiAacQJAKZYpZpMrbXvmPReVX26qi5urX2yu/ztMz2L3ZnkKbteX5qdyf07u+e720/Vwpul35mYZGIwdeL0wn8HXWCzVU9x2CV8g1RIFFgpPcekvuPUH26PF1M98sDIeuN1uVNHeoqB9x2Pe76ondw+/Sr9L2zfNz6Gviv+ZznOzniTh759sejjeO/2xBJgifoLTY9X5r7ggpGG+8aP4znnnJm22VfAe9z4XWeHLPzdt94qFN1e1XGxEm7OTg27V2RyLbtbk/zvu+48951JXtxau7uqvlhVT85O4e8fSvIzZ9DvTPyoAmuvsvCbCAKwRsQJAKZZpUymPbwiyRur6jlJPp7kWUlSVVcn+eutted2k0n/KMlt3Tova63d3T3/m0len51Z5F/pHtP6fXSS27NzV9DtqvrbSa5qrX1x0gBNMgEAAACsuNba55I8taf99iTP3fX6dUleN2G5J5xBv5/K6ZfY7ckkE7AZXGoCwDTiBAATrFEm08o7svciAAAAADCdTCYGM1r4uyl+wAIpwA47Zv1duPuBrxlr2xopul3bfZ3NdnA/8uD4cidOnn5u644T419DjvScRdy03+++guocvE37OeJw2R4wN6CvgHR/BsdDx1qGLPx93nhN7x5fu/cYBrYKBbbPPnvZIzh8ZDINRyYTAAAAAHNbgXlagAE4Qw3ANOIEAFPIZBqGTCYAAAAA5iaTac3MWk+g9U0fjpbHmOeMXo3X2mhHT99oO3LARZl6um8z1go5UNvjTepAAAsz4/HmA3c9eqxt6yunv+47drWe43+fo18Zb7v3i6fX6file548Poae8h6DZqCswPF46yvj+7DaCgwMOLT66hBV/amxtkvP6Ebm0112WV/rlSOvv3NsiUePh69911FahfpLyfg4HvnIvZeBVeVHFdgM/j4DYBpxAoAJFP4ejsvlAAAAAJibTCZg/TWXJAIwhTgBwBQymYYjkwkAAACAuclkYl9aX93X0aKlfcscdF3uFaj77UzpktjvcEa+dO+5Y23nPzjyizTH79WRB3saHzz93NaHvvSonvWG+2XuL1w+WPezGxnHkb4zpY5hB88+Zk1sz5EHcKTvDjT7dMUV423nnz/SMEfqx8Mf3td6bOT1aCHwnjEMbBUKbJ9zzt7LMCyZTMORyQQAAADA3FZgnhZgfjLIAJhGnABgEplMw5HJBAAAAMDcZDIBm8EZagCmEScAmEIm0zBMMm2opRQ2HakzuJQxrAJfYoElmrXY9YNfOmusbbQgdc1RP7a38PeJ0wfy8XvGq74ePbn/bc5iFS6Z6t03wKE1T6Hvg/Qn/sR423nnjTTM8Vd5fwHv029KcezYeJw4++x9b3JtzFrcfMhC7zAUk0zARliFPxwBWF3iBACTqMk0nNWcNgcAAABgrchkAtZfi8sUAZhMnABgCplMw5HJBAAAAMDcZDJtqiUU3a42corwsBb+ZjmcoYaJ+mrRbH1pa6xtrPD36HH9DBx5cHzdevD0c1tfvOdrxpa5sKfw96bV0lH4e0k27OcIDto3fMN420MeMtLw+f33f8EF421V55z2+slPHl/m3HPH22axqgXW+8xa+JvhyGQazvr8pgEAAACwskwyAQAAADA3l8sBa6+yeZfTADAccQKAaVwuNxyZTAAAAADMTSbTIdZ3Rm/mk3x9Rb1HCsS2Q1r425nSJbHf4Ywc+9L4eaY6OcMv0ozH9uo5GzhaWDyfOza+3vZs/a+zIyd6iqI7hh08+xjOyBOeMN52zjkjDTOmfvQV3e4rbn322ae/7iv8PTaGDXTeecseweEjk2k4MpkAAAAAmJtMJmAjzHOrdQA2nzgBwDQymYYhkwkAAACAuclk2lCtxotmLPoMXjtySIsyOVG6eC32O5yhY18cbzsyWpNpjt+rsfpLSerk6XHhrHt6YtX25v0yj9ZbOvLgcsZxqIkT8FVHMl78rq9m0uMf37PuiQcGG0dfTaZzzz399bd+6/gyRw/BX7Cj+4GDpybTcGQyAQAAADA3k0zARqi2mMdMY6m6pqo+VFXHq+pFPe+fXVVv6N5/d1Vdtuu9F3ftH6qqp+/VZ1Vd3vVxvOvzrLl2JMCGEifECYBJTmUyLeKx6UwyAQyoqraSvDrJdyW5Ksn3V9VVI4s9J8k9rbUrkvxUkld2616V5Lokj09yTZKfraqtPfp8ZZKf6vq6p+sbgBUlTgCwyUwyAZuhLeixtycmOd5a+0hr7YEkNyW5dmSZa5Pc2D1/U5KnVlV17Te11u5vrX00yfGuv94+u3W+vesjXZ/PmGmUAIeNOJGIEwC9ZDINZ6ayaVX1sSRfSnIyyYnW2tVV9Ygkb0hyWZKPJXlWa+2egxkmZ6yn5vZoMfA2R13uk8fGV/7SlQ/dcwyHwayp8qyti6rq9l2vb2it3bDr9SVJPrHr9R1JnjTSx1eXaa2dqKovJLmwa3/XyLqXdM/7+rwwyedbayd6ll8ocWL9nP358YPV9tbpB+4Hz9v/uai+Y+FDPnr66yMPjC90GI6hCn9vPHGihzix2vqKgf/JP9kTA0arbj/60fve5gUXjLf98i+f/voJT9h392utryh63/8RrKIzqc3/ba21u3a9flGSt7fWXtFd9/2iJC8cdHQAM1rgH6Z3tdauXtjW1os4AawscWIliBPASnJ3ueHMc7nc7jReqbcAO+5M8thdry/t2nqXqaqjSR6W5HNT1p3U/rkkF3R9TNrWMokTAOPEiT8iTgBsmFknmVqS/1hV762q53Vtj2qtfbJ7/qkkj+pbsaqeV1W3V9XtJ+778pzDBZhgdWpt3Jbkyu5uPmdlp0DrzSPL3Jzk+u75M5O8o7XWuvbrursKXZ7kyiTvmdRnt86vdX2k6/MtM41yeOIEsNrEiWQD4sRnP/vZRYwVOITUZBrGrJfLfWtr7c6q+tokb62q39/9ZmutVfUnIXfXoN+QJOdd9NhDUGkBOMy62hkvSHJrkq0kr2utfaCqXpbk9tbazUlem+QXq+p4kruz88dAuuXemOSDSU4keX5r7WSS9PXZbfKFSW6qqp9M8ltd38sgTgDMQJyYL05cffXV4gTACptpkqm1dmf372eq6s3ZuYPFp6vq4tbaJ6vq4iSfOcBxchDmKczds+6DX+NmhZAkrbVbktwy0vaSXc/vS/J9E9Z9eZKXz9Jn1/6R7ByTl0qcWD9H+s6kjRzbt48OeweHYxLVkhyO4uZMJ06IE7utakHnrzlnhnGNFgKfYNbP+D8+eabFgBW256xAVZ1XVQ859TzJdyb53ZyexrvM1FvgsGs7f7Qt4sE4cQJYeeLEUokTwKo7Vfjb5XLzm2Xq+VFJ3lxVp5b/l621X62q25K8saqek+TjSZ51cMMEYIWJEwBMI04AHBJ7TjJ1Kbbf2NP+uSRPPYhBAZwxZ4+XRpwA1oI4sTTiBLDqTmUyMT9FdAAAAACY26x3lwNYWRV1MACYTJwAYBqZTMORyQQAAADA3GQyAZuhOUUNwBTiBAATyGQajkwmAAAAAOYmkwnYCGptADCNOAHANDKZhiGTCQAAAIC5yWQC1l/rHgDQR5wAYAo1mYYjkwkAAACAuclkAjZCbS97BACsMnECgElkMg1HJhMAAAAAc5PJBGwGtTYAmEacAGACmUzDkckEAAAAwNxMMgEAAACsuKp6RFW9tao+3P378AnLXd8t8+Gqun5X+7dU1e9U1fGqelVV1bR+q+oHqur93Tr/uaq+ca8xmmQCNkK1xTwAWE/iBACTnLpcbhGPOb0oydtba1cmeXv3+jRV9YgkL03ypCRPTPLSXZNRP5fkrya5sntcs0e/H03yZ1trfzLJP0pyw14DXGhNpj/83B133X7j3/14kouS3LXIbQ/M+JdnnceeGH+fPzZwf6wxcWJlrPP413nsifH3ESf4qve+97131daWOLFc6zz2xPiXTZyYz7VJntI9vzHJO5O8cGSZpyd5a2vt7iSpqrcmuaaq3pnkoa21d3Xtv5DkGUl+ZVK/rbX/vKvfdyW5dK8BLnSSqbX2yCSpqttba1cvcttDMv7lWeexJ8Z/YFp2Tj+w9sSJ1bDO41/nsSfGf2DEiY0hTizfOo89Mf5lW+XxL7Dw90VVdfuu1ze01vbMEOo8qrX2ye75p5I8qmeZS5J8YtfrO7q2S7rno+2z9vuc7ExITeXucgAAAACLcde0ibaqeluSR/e89eO7X7TWWtXwF2r39VtV35adSaZv3Wt9k0zARlAHA4BpxAkAJjlVk2kVtNa+Y9J7VfXpqrq4tfbJqro4yWd6Frszf3TpW7Jzids7u/ZLR9rv7J5P7Leq/vskr0nyXa21z+01/mUV/p41FWxVGf/yrPPYE+OHWa37z5rxL886jz0xfpjVuv+srfP413nsifEv27qPf9luTnLqbnHXJ3lLzzK3JvnOqnp4V/D7O5Pc2l0O98WqenJ3V7kf2rV+b79V9bgk/zbJD7bW/t9ZBljN9enAmjv/4Y9t3/RtP7KQbf3Gm/+3967qdeQA9BMnAJim6uqWvGdBW9vad5yoqguTvDHJ45J8PMmzWmt3V9XVSf56a+253XL/a5K/36328tbaz3ftVyd5fZJzs1Nf6W91l8dN6vc1Sf5i15YkJ/Yau8vlAAAAAFZcd7naU3vab0/y3F2vX5fkdROWe8IZ9Pvc3f3OwiQTsPYqam0AMJk4AcB0LcnJZQ9iIyy8JlNVXVNVH6qq41X1okVv/0xV1euq6jNV9bu72h5RVW+tqg93/z58mWOcpKoeW1W/VlUfrKoPVNWPdO3rMv5zquo9VfXb3fj/Ydd+eVW9u/sZekNVnbXssU5SVVtV9VtV9cvd63Ua+8eq6neq6n2nbrG5Lj87rDdxYnHEieUTJ+DMrFuMSMSJZRInlkucOJwWOslUVVtJXp3ku5JcleT7q+qqRY5hH16f5JqRthcleXtr7cokb+9er6ITSf5ua+2qJE9O8vxuf6/L+O9P8u2ttW9M8k1JrqmqJyd5ZZKfaq1dkeSe7NxKcVX9SJLf2/V6ncaeJN/WWvumXdfdrubPTmuLe3CgxImFEyeWT5xYBHFiI6xpjEjEiWUSJ5ZvPeJEkp1MpkU8NtuiM5memOR4a+0jrbUHktyU5NoFj+GMtNZ+PcndI83XJrmxe35jkmcsckyzaq19srX2X7rnX8rOwemSrM/4W2vt3u7lse7Rknx7kjd17Ss7/qq6NMl3Z+d2j6mqypqMfYq1+NlhrYkTCyROLJc4AWds7WJEIk4skzixktbiZ4f9W/Qk0yVJPrHr9R1d27p5VHf7vyT5VJJHLXMws6iqy5J8c5J3Z43G36WHvi/JZ5K8NckfJPl8a+1Et8gq/wz9dJIfS7Ldvb4w6zP2ZCcA/8eqem9VPa9rW9mfnWqLeXDgxIklESeW4qcjTiyMOLERNiVGJCv8uzKJOLEUPx1xYkFaZDINQ+HvOXW3+1vprxRVdX6Sf5Pkb7fWvrgzAb5j1cffWjuZ5Juq6oIkb07y9csd0Wyq6s8n+Uxr7b1V9ZQlD2e/vrW1dmdVfW2St1bV7+9+c9V/dmBVrMPvijixeOIEcMo6/K6IE4snTrCuFj3JdGeSx+56fWnXtm4+XVUXt9Y+WVUXZ2dWfCVV1bHsBIRfaq392655bcZ/Smvt81X1a0n+dJILqupoN4O/qj9DfybJ91bVn0tyTpKHJvmnWY+xJ0laa3d2/36mqt6cnRT11f3ZEZ42hTixYOLE0ogTiyZObIJNiRHJKv+ujBAnlkacWLjtvRdhT4u+XO62JFd2FfHPSnJdkpsXPIYh3Jzk+u759UnessSxTNRds/vaJL/XWvsnu95al/E/sjvjkKo6N8nTsnMd+K8leWa32EqOv7X24tbapa21y7Lzc/6O1toPZA3GniRVdV5VPeTU8yTfmeR3syY/O6w1cWKBxInlESdgXzYlRiRr8rsiTiyPOMG6WmgmU2vtRFW9IMmtSbaSvK619oFFjuFMVdW/SvKUJBdV1R1JXprkFUneWFXPSfLxJM9a3gin+jNJfjDJ73TXISfJ38/6jP/iJDfWzp1EjiR5Y2vtl6vqg0luqqqfTPJb2Ql86+KFWY+xPyrJm7tU6KNJ/mVr7Ver6rasx88Oa0qcWDhxYvWIEzDBOsaIRJxYMnFiecSJQ6qaW60Ca+4hF1za/tT/9CML2dav//KPvbf90S1YAVgD4gQA01R9c9tJEluEh290nFj05XIAAAAAbCB3lwPWX0uyLSsTgAnECQCmaklOLnsQG0EmEwAAAABzk8kEbAYnqAGYRpwAYCqZTEOQyQQAAADA3GQyARuhnKEGYApxAoDJ1GQaikwmAAAAAOYmkwnYDM0pagCmECcAmGp72QPYCDKZAAAAAJibTCZgI6i1AcA04gQAk6nJNBSZTAAAAADMTSYTsP5a9wCAPuIEAFPJZBqKTCYAAAAA5iaTCVh7laTcNQiACcQJAPYmk2kIMpkAAAAAmJtJJgAAAADm5nI5YDNsL3sAAKw0cQKAiRT+HopMJgAAAADmJpMJ2AgKugIwjTgBwHRSXocgkwkAAACAuclkAtZf6x4A0EecAGAqNZmGIpMJAAAAgLnJZAI2QEvU2gBgInECgL3IZBqCTCYAAAAA5iaTCdgI5QQ1AFOIEwBMpibTUGQyAQAAADA3mUzAZlBrA4BpxAkAJpLJNBSZTAAAAADMTSYTsP5aUtvLHgQAK0ucAGBPAsUQZDIBAAAAMDeZTMBmUGsDgGnECQAmUpNpKDKZAAAAAJibTCZgMzhBDcA04gQAU8lkGoJMJgAAAADmZpIJAAAAgLm5XA7YCKWgKwBTiBMATKbw91BkMgEAAAAwN5lMwGZwhhqAacQJAKaSyTQEmUwAAAAAzE0mE7D+WpLtZQ8CgJUlTgAwlUAxFJlMAAAAAMxNJhOw9irNXYMAmEicAGBvajINQSYTAAAAAHOTyQRsBmeoAZhGnABgohaZTMOQyQQAAADA3GQyAZvBGWoAphEnAJhIJtNQZDIBAAAAMDeTTMD6a0m2F/QAYP2IEwDsafUDRVU9oqreWlUf7v59+ITlru+W+XBVXb+r/Vuq6neq6nhVvaqqalq/VXVtVb2/qt5XVbdX1bfuNUaTTAAAAACr70VJ3t5auzLJ27vXp6mqRyR5aZInJXlikpfumoz6uSR/NcmV3eOaPfp9e5JvbK19U5L/Nclr9hqgSSZgI1RrC3kAsJ7ECQAmO1WTaRGPuVyb5Mbu+Y1JntGzzNOTvLW1dndr7Z4kb01yTVVdnOShrbV3tdZakl/YtX5vv621e7tlk+S87OyoqRT+BgAAAFiMi6rq9l2vb2it3TDjuo9qrX2ye/6pJI/qWeaSJJ/Y9fqOru2S7vlo+9R+q+ovJPnHSb42yXfvNUCTTAAAAACLcVdr7epJb1bV25I8uuetH9/9orXWqmrwFNrRfltrb07y5qr6n5P8oyTfMW19k0zAZnCJAgDTiBMATDX3pWyDaK1NnMSpqk9X1cWttU92l799pmexO5M8ZdfrS5O8s2u/dKT9zu75nv221n69qv54VV3UWrtr0hjVZAJYkCXcDeLrq+o3q+r+qvp7i/mUAOyXOAHAHm5Ocuq4f32St/Qsc2uS76yqh3fH++9Mcmt3OdwXq+rJXXz4oV3r9/ZbVVfsiiV/KsnZST43bYAmmYAN0HbOUC/iMZ9F3w3i7iQ/nOT/mnfgAOtNnJjQrzgBkGSNCn+/IsnTqurD2bls7RVJUlVXV9VrkqS1dnd2Lmu7rXu8rGtLkr+ZnTvEHU/yB0l+ZVq/Sf5ikt+tqvcleXWSZ+8qBN7L5XIAi3Nt/ih19cbspK2+cGSZr94NIkmq6tTdIN6Z7m4QXfupu0H8yqR+W2ufSfKZqtqzQB8AK0GcAGCi1trnkjy1p/32JM/d9fp1SV43YbknnEG/r0zyyjMZo0kmYP21LLLWxlrdDQKAiBPiBMAMVqMm07ozyQRwZtbqbhAALJw4AcChZZIJ2Azbyx7AjlW9GwTAoSdOiBMAE7WsTKBYcwp/AyzOQu8GAcDaEScAWGsymYCNUIurtTGPVyR5Y1U9J8nHkzwr2bkbRJK/3lp7bmvt7qo6dTeIZPxuEK9Pcm52Crn+yh79PjrJ7UkemmS7qv52kqtaa1880E8JsILECXECYLJTd5djXiaZABZkCXeD+FROv3QCgBUmTgCw7kwyAZthPc5QA7As4gQAU8lkGoKaTAAAAADMTSYTsP5akm1nqAGYQJwAYCo1mYYikwkAAACAuclkAjZAU2sDgCnECQD2IpNpCDKZAAAAAJibSSYAAAAA5uZyOWAzuAwCgGnECQAmakm2lz2IjSCTCQAAAIC5yWQCNoMz1ABMI04AMJXC30OQyQQAAADA3GQyAeuvJdl2hhqACcQJAKZqkck0DJlMAAAAAMxNJhOwAVrS3A0CgEnECQCmkck0FJlMAAAAAMxNJhOwGdw1CIBpxAkAppLJNASZTAAAAADMTSYTsP7cNQiAacQJAKZSk2koMpkAAAAAmJtMJmAzqLUBwDTiBABTuQvpEGQyAQAAADA3mUzAZnCGGoBpxAkAJlKTaSgymQAAAACYm0kmAAAAAObmcjlgAzSXQQAwhTgBwF5cLjcEmUwAAAAAzE0mE7D+WpJttxwFYAJxAoCpFP4eikwmAAAAAOYmkwnYDGptADCNOAHAVDJehyCTCQAAAIC5yWQCNoMz1ABMI04AMJGaTEORyQQAAADA3GQyARugJdvOUAMwiTgBwDQymYYikwkAAACAuclkAtZfS1pzNwgAJhAnANiTTKYhyGQCAAAAYG4ymYDNoNYGANOIEwBMpCbTUGQyAQAAADA3mUzAZmjOUAMwhTgBwFRq9w1BJhMAAAAAczPJBAAAAMDcXC4HrL/Wkm3prQBMIE4AMJXC30ORyQQAAADA3GQyAZtBQVcAphEnAJhKJtMQZDIBAAAAMDeZTMBGaGptADCFOAHAZGoyDUUmEwAAAABzk8kEbICm1gYAU4gTAEwjk2koMpkAAAAAmJtMJmD9tSTbzlADMIE4AcCeZDINQSYTAAAAwIqrqkdU1Vur6sPdvw+fsNz13TIfrqrrd7V/S1X9TlUdr6pXVVXN0m9V/Q9VdaKqnrnXGE0yAZuhbS/mAcB6EicAmKgl2V7QYy4vSvL21tqVSd7evT5NVT0iyUuTPCnJE5O8dNek0c8l+atJruwe1+zVb1VtJXllkv84ywBNMgEAAACsvmuT3Ng9vzHJM3qWeXqSt7bW7m6t3ZPkrUmuqaqLkzy0tfau1lpL8gu71p/W799K8m+SfGaWAarJBKy9lqSptQHABOIEAHtbWE2mi6rq9l2vb2it3TDjuo9qrX2ye/6pJI/qWeaSJJ/Y9fqOru2S7vlo+8R+q+qSJH8hybcl+R9mGaBJJgAAAIDFuKu1dvWkN6vqbUke3fPWj+9+0VprVTX4GZSRfn86yQtba9td+aY9mWQC1l9r6mAAMJk4AcBULatyd7nW2ndMeq+qPl1VF7fWPtld/tZ3CdudSZ6y6/WlSd7ZtV860n5n93xSv1cnuambYLooyZ+rqhOttX83aYxqMgEAAACsvpuTnLpb3PVJ3tKzzK1JvrOqHt4V/P7OJLd2l8N9saqe3N1V7od2rd/bb2vt8tbaZa21y5K8KcnfnDbBlJhkAgAAAFgHr0jytKr6cJLv6F6nqq6uqtckSWvt7iT/KMlt3eNlXVuS/M0kr0lyPMkfJPmVaf3uh8vlgI2goCsA04gTAEy2OpfLTdNa+1ySp/a0357kubtevy7J6yYs94RZ+x1Z5i/PMkaZTAAAAADMTSYTsBkUdAVgGnECgKnEiSHIZAIAAABgbtWa69OB9VZVv5qdW2ouwl2ttWsWtC0ABiBOADCNODEck0wAAAAAzM3lcgAAAADMzSQTAAAAAHMzyQQAAADA3EwyAQAAADA3k0wAAAAAzO3/D899tksdQ6YYAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_slice(Adj_tomoatt, Adj_fort, 'p', 21, contour=False)\n", + "plot_slice(Adj_tomoatt, Adj_fort, 't', 21, contour=False)\n", + "plot_slice(Adj_tomoatt, Adj_fort, 'r', 21, contour=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "vscode": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_tele_one_src/fortran_code/ega5/input/EARTHQUAKES_region b/test/old_tests/inversion_tele_one_src/fortran_code/ega5/input/EARTHQUAKES_region new file mode 100644 index 0000000..1874828 --- /dev/null +++ b/test/old_tests/inversion_tele_one_src/fortran_code/ega5/input/EARTHQUAKES_region @@ -0,0 +1 @@ +0 diff --git a/test/old_tests/inversion_tele_one_src/fortran_code/ega5/input/EARTHQUAKES_tele b/test/old_tests/inversion_tele_one_src/fortran_code/ega5/input/EARTHQUAKES_tele new file mode 100644 index 0000000..baca2e4 --- /dev/null +++ b/test/old_tests/inversion_tele_one_src/fortran_code/ega5/input/EARTHQUAKES_tele @@ -0,0 +1,2 @@ +1 +50.0 40.0 67.5 diff --git a/test/old_tests/inversion_tele_one_src/fortran_code/ega5/input/STATIONS b/test/old_tests/inversion_tele_one_src/fortran_code/ega5/input/STATIONS new file mode 100644 index 0000000..ec7ffee --- /dev/null +++ b/test/old_tests/inversion_tele_one_src/fortran_code/ega5/input/STATIONS @@ -0,0 +1,51 @@ +50 +0 39.48283902145424 29.281513864182138 +0 43.998782050303745 37.19643899137363 +0 37.30760565117001 33.11401338760367 +0 41.68653979748724 35.934639928020964 +0 36.61537788634567 23.78498599183464 +0 39.53372622366508 23.841070463667265 +0 40.35236327081236 19.52357011656586 +0 40.521021601341126 15.382805946506043 +0 40.652338638485574 15.43974831654911 +0 36.06181789303116 31.492644232896822 +0 40.220383199721056 30.131592405768828 +0 32.690556139214564 29.12155270260603 +0 41.38557105851774 21.887079844236876 +0 31.5803169410531 15.828284584124932 +0 39.72076150617663 29.444060586520337 +0 39.153291824326395 15.348344308914173 +0 37.3196743759749 24.882795770531047 +0 45.38532464248119 31.54872211314764 +0 35.027710629652205 20.71225367598449 +0 34.73430718282967 30.761114486702205 +0 41.62771310002017 20.964465183242254 +0 41.96541753785979 22.638041556854436 +0 34.18819520502442 31.526202657153434 +0 33.289630995715136 26.11544195974523 +0 44.99003971165912 31.18999369792465 +0 43.71764805530941 27.09889711083143 +0 39.149408331767305 24.672389827246107 +0 40.94054916696042 19.539882515019904 +0 39.55054219303491 17.883860634990157 +0 45.51670367081901 35.889274144396786 +0 45.09106334932971 23.658196610348384 +0 45.3510270418072 33.647693941540325 +0 38.04870033400669 25.845480891830285 +0 40.2502568580665 27.674022408814878 +0 38.91110035012384 23.488821700130032 +0 33.038736736209884 31.45966132466628 +0 45.13288373382176 32.43630443882502 +0 38.95996799830328 24.837368712391495 +0 43.491229999719096 29.79312700226344 +0 35.465004203274056 33.62459653703114 +0 40.21403161430093 17.72710938876384 +0 39.55239238847392 19.234971464234178 +0 35.94933583184151 22.513051849149996 +0 44.119556199620654 20.89644919626955 +0 35.522471813078226 19.309847752271143 +0 41.32129208930305 29.532291144989525 +0 38.64267131605151 25.351066793111908 +0 34.925624689463994 33.227497100537946 +0 33.199759796131325 22.212825309023625 +0 34.47881106709583 28.51463648501263 diff --git a/test/old_tests/inversion_tele_one_src/fortran_code/ega5/input/inputdata.ipynb b/test/old_tests/inversion_tele_one_src/fortran_code/ega5/input/inputdata.ipynb new file mode 100644 index 0000000..ca5563c --- /dev/null +++ b/test/old_tests/inversion_tele_one_src/fortran_code/ega5/input/inputdata.ipynb @@ -0,0 +1,474 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "import random\n", + "import math\n", + "import matplotlib.pyplot as plt\n", + "\n", + "#震中距函数\n", + "def cal_dis(lat1, lon1,lat2, lon2):\n", + " latitude1 = (math.pi/180)*lat1\n", + " latitude2 = (math.pi/180)*lat2\n", + " longitude1 = (math.pi/180)*lon1\n", + " longitude2= (math.pi/180)*lon2\n", + " #因此AB两点的球面距离为:{arccos[sinb*siny+cosb*cosy*cos(a-x)]}*R\n", + " #地球半径\n", + " if((lat1-lat2)**2+(lon1-lon2)**2<0.0001):\n", + " return 0\n", + "\n", + " d = math.acos(math.sin(latitude1)*math.sin(latitude2)+ math.cos(latitude1)*math.cos(latitude2)*math.cos(longitude2-longitude1))/math.pi*180.0\n", + " return d\n", + "\n", + "#方位角函数\n", + "def cal_azimuth(lat1, lon1, lat2, lon2):\n", + " lat1_rad = lat1 * math.pi / 180\n", + " lon1_rad = lon1 * math.pi / 180\n", + " lat2_rad = lat2 * math.pi / 180\n", + " lon2_rad = lon2 * math.pi / 180\n", + " \n", + " y = math.sin(lon2_rad - lon1_rad) * math.cos(lat2_rad)\n", + " x = math.cos(lat1_rad) * math.sin(lat2_rad) - math.sin(lat1_rad) * math.cos(lat2_rad) * math.cos(lon2_rad - lon1_rad)\n", + " brng = math.atan2(y, x) * 180 / math.pi\n", + " if((lat1-lat2)**2+(lon1-lon2)**2<0.0001):\n", + " return 0\n", + " return float((brng + 360.0) % 360.0)\n", + "\n", + "\n", + "\n", + "# 研究区域范围\n", + "dep1 = 0; dep2 = 800; \n", + "lat1 = -1.0; lat2 = 1.0; \n", + "lon1 = 110.0; lon2 = 130.0; \n", + "clat = (lat1+lat2)/2.0; \n", + "clon = (lon1+lon2)/2.0; \n", + "\n", + "\n", + "# 生成一定数量的台站\n", + "Nst = 40; \n", + "pos_st=[]; \n", + "# 台站的范围\n", + "dep_st1 = -0.5; dep_st2 = 0.5; \n", + "lat_st1 = 0.0; lat_st2 = 0.0; \n", + "lon_st1 = 110.0; lon_st2 = 130.0; \n", + "\n", + "# 生成一定数量的地震\n", + "Nev_region = 200; \n", + "pos_ev_region=[]; \n", + "# 局部地震的范围\n", + "dep_ev_region1 = 1.0; dep_ev_region2 = 20.0; \n", + "lat_ev_region1 = 0.0; lat_ev_region2 = 0.0; \n", + "lon_ev_region1 = 110.0; lon_ev_region2 = 130.0; \n", + "\n", + "# 生成一定数量的远震\n", + "Nev_tele = 30; \n", + "pos_ev_tele=[]; \n", + "# 远震的范围\n", + "azi1 = 0.0; azi2 = 360.0; \n", + "degree1 = 40.0; degree2 = 80.0; \n", + "dep_ev_tele1 = 10.0; dep_ev_tele2 = 100.0; \n", + "\n", + "# 随机种子\n", + "random.seed(631)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.0 225.9511468651809 105.95114686518092 90.0\n", + "0.0 134.37263128921603 14.372631289216041 90.0\n", + "0.0 221.86291452364492 101.86291452364495 90.0\n", + "0.0 135.0265809510972 15.026580951097205 90.0\n", + "0.0 205.6327554209649 85.63275542096493 90.0\n", + "0.0 132.91673845591365 12.916738455913654 90.0\n", + "0.0 16.258737495319888 103.74126250468011 270.0\n", + "0.0 236.91222080019207 116.9122208001921 90.0\n", + "0.0 231.60534307538006 111.60534307538009 90.0\n", + "0.0 127.76937738221575 7.76937738221574 90.0\n", + "0.0 296.7089619188061 176.70896191880615 90.0\n", + "0.0 109.987388485231 10.012611514768977 270.0\n", + "0.0 167.7421462765811 47.74214627658114 90.0\n", + "0.0 143.53357078698778 23.53357078698778 90.0\n", + "0.0 76.89393688373681 43.10606311626317 270.0\n", + "0.0 243.99003464620372 123.99003464620375 90.0\n", + "0.0 107.72864961420355 12.271350385796454 270.0\n", + "0.0 192.24495483877945 72.24495483877948 90.0\n", + "0.0 131.78390165243425 11.783901652434272 90.0\n", + "0.0 28.764512000200227 91.23548799979977 270.0\n", + "0.0 334.7755278165224 145.2244721834776 270.0\n", + "0.0 210.25490259109463 90.25490259109465 90.0\n", + "0.0 339.62165350972003 140.37834649027994 270.0\n", + "0.0 356.65953464944505 123.34046535055498 270.0\n", + "0.0 310.73064432466316 169.26935567533684 270.0\n", + "0.0 14.362593311061245 105.63740668893875 270.0\n", + "0.0 219.55849454012824 99.55849454012825 90.0\n", + "0.0 216.37171778796466 96.37171778796468 90.0\n", + "0.0 17.888701551321237 102.11129844867875 270.0\n", + "0.0 171.2386125573614 51.23861255736139 90.0\n", + "0.0 341.33064526380423 138.66935473619577 270.0\n", + "0.0 210.8077223236536 90.8077223236536 90.0\n", + "0.0 289.112673508994 169.11267350899402 90.0\n", + "0.0 298.08845278767177 178.08845278767174 90.0\n", + "0.0 272.45026020019355 152.45026020019355 90.0\n", + "0.0 144.07425671018817 24.07425671018818 90.0\n", + "0.0 68.06864484053433 51.93135515946566 270.0\n", + "0.0 136.29773319963272 16.297733199632727 90.0\n", + "0.0 147.8123908849427 27.812390884942708 90.0\n", + "0.0 57.74720760152299 62.252792398477006 270.0\n", + "0.0 15.652724958883866 104.34727504111613 270.0\n", + "0.0 144.72146631701912 24.721466317019132 90.0\n", + "0.0 27.083088365413673 92.91691163458631 270.0\n", + "0.0 264.3101344354792 144.31013443547923 90.0\n", + "0.0 341.08957840202356 138.91042159797647 270.0\n", + "0.0 116.10814242841248 3.891857571587484 270.0\n", + "0.0 130.7610096663694 10.761009666369436 90.0\n", + "0.0 86.20775751226536 33.79224248773463 270.0\n", + "0.0 199.89381975746232 79.89381975746234 90.0\n", + "0.0 72.68053962138247 47.31946037861752 270.0\n", + "0.0 77.05144953292259 42.948550467077396 270.0\n", + "0.0 266.39229908576056 146.39229908576056 90.0\n", + "0.0 336.08487636106537 143.91512363893463 270.0\n", + "0.0 315.4798829868885 164.52011701311147 270.0\n", + "0.0 83.03381783702551 36.966182162974484 270.0\n", + "0.0 275.99647488706177 155.99647488706177 90.0\n", + "0.0 116.23838021530406 3.761619784695913 270.0\n", + "0.0 118.52414477992758 1.4758552200723425 270.0\n", + "0.0 220.74310560698524 100.74310560698525 90.0\n", + "0.0 338.40097536399816 141.59902463600184 270.0\n", + "0.0 203.62740080582384 83.62740080582384 90.0\n", + "0.0 355.8080215395081 124.1919784604919 270.0\n", + "0.0 9.404231671969384 110.5957683280306 270.0\n", + "0.0 343.5534959818642 136.4465040181358 270.0\n", + "0.0 6.66339734732301 113.33660265267699 270.0\n", + "0.0 358.0037637181944 121.99623628180552 270.0\n", + "0.0 247.98908263067963 127.98908263067965 90.0\n", + "0.0 97.64127642203272 22.358723577967275 270.0\n", + "0.0 99.53081429245076 20.46918570754922 270.0\n", + "0.0 128.9499990799955 8.949999079995527 90.0\n", + "0.0 261.6643380104868 141.6643380104868 90.0\n", + "0.0 329.5615005848541 150.43849941514588 270.0\n", + "0.0 217.67290357735305 97.67290357735308 90.0\n", + "0.0 205.18903585853536 85.18903585853536 90.0\n", + "0.0 228.97693699706412 108.97693699706413 90.0\n", + "0.0 8.881693318871182 111.11830668112881 270.0\n", + "0.0 356.57170393774953 123.42829606225041 270.0\n", + "0.0 189.16694569680052 69.16694569680054 90.0\n", + "0.0 121.50245011182267 1.5024501118226716 90.0\n", + "0.0 333.93797255055347 146.06202744944653 270.0\n", + "0.0 100.13308707398681 19.866912926013175 270.0\n", + "0.0 43.6084015041731 76.3915984958269 270.0\n", + "0.0 111.05944610086928 8.940553899130707 270.0\n", + "0.0 74.48107242651632 45.518927573483666 270.0\n", + "0.0 312.0462723650521 167.95372763494788 270.0\n", + "0.0 322.947704942887 157.05229505711299 270.0\n", + "0.0 208.95113264150558 88.9511326415056 90.0\n", + "0.0 175.24970913034872 55.24970913034874 90.0\n", + "0.0 140.9614395734827 20.961439573482696 90.0\n", + "0.0 166.3626290086637 46.3626290086637 90.0\n", + "0.0 90.41872798898056 29.581272011019415 270.0\n", + "0.0 222.8793862747397 102.8793862747397 90.0\n", + "0.0 68.85476821721676 51.14523178278323 270.0\n", + "0.0 28.214387666817153 91.78561233318284 270.0\n", + "0.0 91.48103529832157 28.518964701678417 270.0\n", + "0.0 89.50523941860742 30.494760581392573 270.0\n", + "0.0 193.54150713960806 73.54150713960807 90.0\n", + "0.0 7.161329384662456 112.83867061533753 270.0\n", + "0.0 213.18842190537316 93.18842190537318 90.0\n", + "0.0 172.07812140684445 52.07812140684447 90.0\n", + "0.0 334.8353619985278 145.1646380014722 270.0\n", + "0.0 191.0593578794778 71.0593578794778 90.0\n", + "0.0 56.60854133537719 63.39145866462279 270.0\n", + "0.0 92.26165787695894 27.738342123041054 270.0\n", + "0.0 286.9224658393914 166.9224658393914 90.0\n", + "0.0 176.89046670533634 56.890466705336365 90.0\n", + "0.0 276.0389970910487 156.0389970910487 90.0\n", + "0.0 137.64747685530494 17.647476855304948 90.0\n", + "0.0 1.4308610934428856 118.56913890655709 270.0\n", + "0.0 110.88137345107941 9.118626548920576 270.0\n", + "0.0 137.09485329193856 17.094853291938563 90.0\n", + "0.0 135.5690155005423 15.569015500542301 90.0\n", + "0.0 126.14097870235523 6.140978702355242 90.0\n", + "0.0 323.5471905278929 156.4528094721071 270.0\n", + "0.0 322.23762188343517 157.76237811656483 270.0\n", + "0.0 88.32263639560081 31.677363604399194 270.0\n", + "0.0 338.27038239137386 141.72961760862614 270.0\n", + "0.0 93.32529519621555 26.67470480378444 270.0\n", + "0.0 204.0513824389116 84.05138243891159 90.0\n", + "0.0 58.230491293900585 61.7695087060994 270.0\n", + "0.0 34.17234176219371 85.82765823780629 270.0\n", + "0.0 20.355778278035714 99.64422172196426 270.0\n", + "0.0 185.5169105695217 65.51691056952171 90.0\n", + "0.0 330.35248244149466 149.6475175585053 270.0\n", + "0.0 276.63332567163 156.63332567163005 90.0\n", + "0.0 358.5496625205124 121.45033747948762 270.0\n", + "0.0 7.590891759615754 112.40910824038424 270.0\n", + "0.0 167.7368613892805 47.73686138928051 90.0\n", + "0.0 244.68032032578964 124.68032032578965 90.0\n", + "0.0 156.8417344482591 36.84173444825912 90.0\n", + "0.0 269.4204866261951 149.42048662619513 90.0\n", + "0.0 190.265203959195 70.265203959195 90.0\n", + "0.0 136.57685361968288 16.57685361968289 90.0\n", + "0.0 260.9555979708692 140.95559797086918 90.0\n", + "0.0 103.67335828401178 16.32664171598821 270.0\n", + "0.0 184.95848872928786 64.95848872928788 90.0\n", + "0.0 47.777009530082694 72.22299046991728 270.0\n", + "0.0 62.22725457147253 57.772745428527465 270.0\n", + "0.0 278.7120149718238 158.71201497182383 90.0\n", + "0.0 195.428361258955 75.42836125895501 90.0\n", + "0.0 239.0927285144889 119.09272851448891 90.0\n", + "0.0 230.62021224665406 110.62021224665409 90.0\n", + "0.0 107.11731376192003 12.882686238079954 270.0\n", + "0.0 157.35907039424248 37.35907039424247 90.0\n", + "0.0 135.4058798399319 15.40587983993192 90.0\n", + "0.0 130.24064313799508 10.240643137995084 90.0\n", + "0.0 1.892581816404899 118.1074181835951 270.0\n", + "0.0 207.37075291430313 87.37075291430315 90.0\n", + "0.0 171.0869519017806 51.08695190178061 90.0\n", + "0.0 278.1067962102084 158.10679621020842 90.0\n", + "0.0 254.71648464073405 134.71648464073405 90.0\n", + "0.0 299.9432308787044 179.94323087870285 90.0\n", + "0.0 22.921838498505068 97.07816150149492 270.0\n", + "0.0 7.89398472687715 112.10601527312285 270.0\n", + "0.0 73.69196142088225 46.30803857911775 270.0\n" + ] + } + ], + "source": [ + "# -------------------- 数据生成 ------------------------\n", + "\n", + "# 首先生成台站\n", + "doc_st=open('STATIONS','w')\n", + "doc_st.write('%d \\n'%(Nst))\n", + "for i in range(Nst):\n", + " # dep_st = random.uniform(dep_st1,dep_st2); \n", + " dep_st = 0.0\n", + " lat_st = random.uniform(lat_st1,lat_st2); \n", + " # lon_st = random.uniform(lon_st1,lon_st2); \n", + " lon_st = (lon_st2-lon_st1)/(Nst)*(i+0.5)+lon_st1\n", + " doc_st.write('%8.3f %8.3f %8.3f \\n'%(dep_st,lat_st,lon_st))\n", + " pos_st.append((dep_st,lat_st,lon_st))\n", + "doc_st.close()\n", + "\n", + "# 生成区域地震\n", + "doc_ev_region = open('EARTHQUAKES_region','w')\n", + "doc_ev_region.write('%d \\n'%(Nev_region))\n", + "for i in range(Nev_region):\n", + " dep_ev = random.uniform(dep_ev_region1,dep_ev_region2); \n", + " lat_ev = random.uniform(lat_ev_region1,lat_ev_region2); \n", + " lon_ev = random.uniform(lon_ev_region1,lon_ev_region2); \n", + " doc_ev_region.write('%8.3f %8.3f %8.3f \\n'%(dep_ev,lat_ev,lon_ev))\n", + " pos_ev_region.append((dep_ev,lat_ev,lon_ev))\n", + "doc_ev_region.close()\n", + "\n", + "# 生成远震\n", + "doc_ev_tele = open('EARTHQUAKES_tele','w')\n", + "doc_ev_tele.write('%d \\n'%(Nev_tele))\n", + "count = 0\n", + "while (count < Nev_tele):\n", + " lat_ev = 0.0\n", + " lon_ev = random.uniform(0,360.0)\n", + " dep_ev = random.uniform(dep_ev_tele1,dep_ev_tele2)\n", + " degree = cal_dis(clat,clon,lat_ev,lon_ev)\n", + " azi = cal_azimuth(clat,clon,lat_ev,lon_ev)\n", + " print(lat_ev,lon_ev,degree,azi)\n", + " if (degree > degree1 and degree < degree2 and azi > azi1 and azi < azi2):\n", + " doc_ev_tele.write('%8.3f %8.3f %8.3f %8.3f %8.3f \\n'%(dep_ev,lat_ev,lon_ev,azi,degree))\n", + " count = count+1; \n", + " pos_ev_tele.append((dep_ev,degree,azi))\n", + "doc_ev_tele.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(-2.5, 2.5)" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# 台站分布\n", + "plt.figure(1)\n", + "for i in range(Nst):\n", + " plt.scatter(pos_st[i][2],pos_st[i][1],c='r',marker='o')\n", + "plt.xlabel('Longitude')\n", + "plt.ylabel('Latitude')\n", + "plt.xlim([lon1-1.5,lon2+1.5])\n", + "plt.ylim([lat1-1.5,lat2+1.5])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(-2.5, 2.5)" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# 地震分布\n", + "plt.figure(2)\n", + "for i in range(Nev_region):\n", + " plt.scatter(pos_ev_region[i][2],pos_ev_region[i][1],c='b',marker='p')\n", + "plt.xlabel('Longitude')\n", + "plt.ylabel('Latitude')\n", + "plt.xlim([lon1-1.5,lon2+1.5])\n", + "plt.ylim([lat1-1.5,lat2+1.5])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(93.75424024443853, 47.74214627658114, 90.0)\n", + "(91.74147058170392, 43.10606311626317, 270.0)\n", + "(28.519975785125162, 72.24495483877948, 90.0)\n", + "(99.8767124683807, 51.23861255736139, 90.0)\n", + "(29.960132387638367, 51.93135515946566, 270.0)\n", + "(63.20184963246517, 62.252792398477006, 270.0)\n", + "(25.90818571587431, 79.89381975746234, 90.0)\n", + "(60.869382359315146, 47.31946037861752, 270.0)\n", + "(58.76663282089372, 42.948550467077396, 270.0)\n", + "(12.108262720166383, 69.16694569680054, 90.0)\n", + "(46.00751259206518, 76.3915984958269, 270.0)\n", + "(10.170098357139967, 45.518927573483666, 270.0)\n", + "(89.79967671929133, 55.24970913034874, 90.0)\n", + "(31.693028518129445, 46.3626290086637, 90.0)\n", + "(93.75025622172483, 51.14523178278323, 270.0)\n", + "(51.259680088140676, 73.54150713960807, 90.0)\n", + "(86.11028572151156, 52.07812140684447, 90.0)\n", + "(10.66109955772044, 71.0593578794778, 90.0)\n", + "(22.843331848633156, 63.39145866462279, 270.0)\n", + "(61.43688934548696, 56.890466705336365, 90.0)\n", + "(62.97234405157307, 61.7695087060994, 270.0)\n", + "(39.05312782429853, 65.51691056952171, 90.0)\n", + "(32.690103384326115, 47.73686138928051, 90.0)\n", + "(78.76430267593933, 70.265203959195, 90.0)\n", + "(76.32278204224933, 64.95848872928788, 90.0)\n", + "(33.802179523988485, 72.22299046991728, 270.0)\n", + "(25.48858050569794, 57.772745428527465, 270.0)\n", + "(51.5795080124909, 75.42836125895501, 90.0)\n", + "(64.12652782728235, 51.08695190178061, 90.0)\n", + "(92.5735521149096, 46.30803857911775, 270.0)\n" + ] + }, + { + "data": { + "text/plain": [ + "(-80.0, 80.0)" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# 远震分布\n", + "plt.figure(3)\n", + "for i in range(Nev_tele):\n", + " print(pos_ev_tele[i])\n", + " x = pos_ev_tele[i][1]*math.cos(pos_ev_tele[i][2]/180*math.pi)\n", + " y = pos_ev_tele[i][1]*math.sin(pos_ev_tele[i][2]/180*math.pi)\n", + " plt.scatter(x,y,c='g',marker='p')\n", + "# plt.xlabel('Longitude')\n", + "# plt.ylabel('Latitude')\n", + "plt.xlim([-80,80])\n", + "plt.ylim([-80,80])" + ] + } + ], + "metadata": { + "interpreter": { + "hash": "cdd74c396a461f81d13d16403c726c38089d3c42a4b6e59262cdb9511d16556b" + }, + "kernelspec": { + "display_name": "Python 3.10.4 64-bit", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.4" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_tele_one_src/fortran_code/ega5/input/prem_model.txt b/test/old_tests/inversion_tele_one_src/fortran_code/ega5/input/prem_model.txt new file mode 100644 index 0000000..96a6218 --- /dev/null +++ b/test/old_tests/inversion_tele_one_src/fortran_code/ega5/input/prem_model.txt @@ -0,0 +1,89 @@ +88 + 0.00 5.80000 3.20000 2.60000 1456.0 600.0 + 15.00 5.80000 3.20000 2.60000 1456.0 600.0 + 15.00 6.80000 3.90000 2.90000 1350.0 600.0 + 24.40 6.80000 3.90000 2.90000 1350.0 600.0 + 24.40 8.11061 4.49094 3.38076 1446.0 600.0 + 40.00 8.10119 4.48486 3.37906 1446.0 600.0 + 60.00 8.08907 4.47715 3.37688 1447.0 600.0 + 80.00 8.07688 4.46953 3.37471 195.0 80.0 + 115.00 8.05540 4.45643 3.37091 195.0 80.0 + 150.00 8.03370 4.44361 3.36710 195.0 80.0 + 185.00 8.01180 4.43108 3.36330 195.0 80.0 + 220.00 7.98970 4.41885 3.35950 195.0 80.0 + 220.00 8.55896 4.64391 3.43578 362.0 143.0 + 265.00 8.64552 4.67540 3.46264 365.0 143.0 + 310.00 8.73209 4.70690 3.48951 367.0 143.0 + 355.00 8.81867 4.73840 3.51639 370.0 143.0 + 400.00 8.90522 4.76989 3.54325 372.0 143.0 + 400.00 9.13397 4.93259 3.72378 366.0 143.0 + 450.00 9.38990 5.07842 3.78678 365.0 143.0 + 500.00 9.64588 5.22428 3.84980 364.0 143.0 + 550.00 9.90185 5.37014 3.91282 363.0 143.0 + 600.00 10.15782 5.51602 3.97584 362.0 143.0 + 635.00 10.21203 5.54311 3.98399 362.0 143.0 + 670.00 10.26622 5.57020 3.99214 362.0 143.0 + 670.00 10.75131 5.94508 4.38071 759.0 312.0 + 721.00 10.91005 6.09418 4.41241 744.0 312.0 + 771.00 11.06557 6.24046 4.44317 730.0 312.0 + 871.00 11.24490 6.31091 4.50372 737.0 312.0 + 971.00 11.41560 6.37813 4.56307 743.0 312.0 + 1071.00 11.57828 6.44232 4.62129 750.0 312.0 + 1171.00 11.73357 6.50370 4.67844 755.0 312.0 + 1271.00 11.88209 6.56250 4.73460 761.0 312.0 + 1371.00 12.02445 6.61891 4.78983 766.0 312.0 + 1471.00 12.16126 6.67317 4.84422 770.0 312.0 + 1571.00 12.29316 6.72548 4.89783 775.0 312.0 + 1671.00 12.42075 6.77606 4.95073 779.0 312.0 + 1771.00 12.54466 6.82512 5.00299 784.0 312.0 + 1871.00 12.66550 6.87289 5.05469 788.0 312.0 + 1971.00 12.78389 6.91957 5.10590 792.0 312.0 + 2071.00 12.90045 6.96538 5.15669 795.0 312.0 + 2171.00 13.01579 7.01053 5.20713 799.0 312.0 + 2271.00 13.13055 7.05525 5.25729 803.0 312.0 + 2371.00 13.24532 7.09974 5.30724 807.0 312.0 + 2471.00 13.36074 7.14423 5.35706 811.0 312.0 + 2571.00 13.47742 7.18892 5.40681 815.0 312.0 + 2671.00 13.59597 7.23403 5.45657 819.0 312.0 + 2741.00 13.68041 7.26597 5.49145 822.0 312.0 + 2771.00 13.68753 7.26575 5.50642 823.0 312.0 + 2871.00 13.71168 7.26486 5.55641 826.0 312.0 + 2891.00 13.71660 7.26466 5.56645 826.0 312.0 + 2891.00 8.06482 0.00000 9.90349 57822.0 0.0 + 2971.00 8.19939 0.00000 10.02940 57822.0 0.0 + 3071.00 8.36019 0.00000 10.18134 57822.0 0.0 + 3171.00 8.51298 0.00000 10.32726 57822.0 0.0 + 3271.00 8.65805 0.00000 10.46727 57822.0 0.0 + 3371.00 8.79573 0.00000 10.60152 57822.0 0.0 + 3471.00 8.92632 0.00000 10.73012 57822.0 0.0 + 3571.00 9.05015 0.00000 10.85321 57822.0 0.0 + 3671.00 9.16752 0.00000 10.97091 57822.0 0.0 + 3771.00 9.27867 0.00000 11.08335 57822.0 0.0 + 3871.00 9.38418 0.00000 11.19067 57822.0 0.0 + 3971.00 9.48409 0.00000 11.29298 57822.0 0.0 + 4071.00 9.57881 0.00000 11.39042 57822.0 0.0 + 4171.00 9.66865 0.00000 11.48311 57822.0 0.0 + 4271.00 9.75393 0.00000 11.57119 57822.0 0.0 + 4371.00 9.83496 0.00000 11.65478 57822.0 0.0 + 4471.00 9.91206 0.00000 11.73401 57822.0 0.0 + 4571.00 9.98554 0.00000 11.80900 57822.0 0.0 + 4671.00 10.05572 0.00000 11.87990 57822.0 0.0 + 4771.00 10.12291 0.00000 11.94682 57822.0 0.0 + 4871.00 10.18743 0.00000 12.00989 57822.0 0.0 + 4971.00 10.24959 0.00000 12.06924 57822.0 0.0 + 5071.00 10.30971 0.00000 12.12500 57822.0 0.0 + 5149.50 10.35568 0.00000 12.16634 57822.0 0.0 + 5149.50 11.02827 3.50432 12.76360 445.0 85.0 + 5171.00 11.03643 3.51002 12.77493 445.0 85.0 + 5271.00 11.07249 3.53522 12.82501 443.0 85.0 + 5371.00 11.10542 3.55823 12.87073 440.0 85.0 + 5471.00 11.13521 3.57905 12.91211 439.0 85.0 + 5571.00 11.16186 3.59767 12.94912 437.0 85.0 + 5671.00 11.18538 3.61411 12.98178 436.0 85.0 + 5771.00 11.20576 3.62835 13.01009 434.0 85.0 + 5871.00 11.22301 3.64041 13.03404 433.0 85.0 + 5971.00 11.23712 3.65027 13.05364 432.0 85.0 + 6071.00 11.24809 3.65794 13.06888 432.0 85.0 + 6171.00 11.25593 3.66342 13.07977 431.0 85.0 + 6271.00 11.26064 3.66670 13.08630 431.0 85.0 + 6371.00 11.26220 3.66780 13.08848 431.0 85.0 diff --git a/test/old_tests/inversion_tele_one_src/fortran_code/ega5_sphe_3d_kernel.f90 b/test/old_tests/inversion_tele_one_src/fortran_code/ega5_sphe_3d_kernel.f90 new file mode 100644 index 0000000..4eae3d0 --- /dev/null +++ b/test/old_tests/inversion_tele_one_src/fortran_code/ega5_sphe_3d_kernel.f90 @@ -0,0 +1,1022 @@ +include "eikon_solver_mpi.f90" + + +! example: 3-D 3rd order anisotropic eikonal equation in cartesian coordinate (Point source) +! parameter setting: +! domain: R * Theta * Phi = [6275, 6375] * [49^\circ, 51^\circ] * [129^\circ, 131^\circ] +! analytic solution: T = |x-x_s|/c0 +! isotropic eik equ: Tx^2 + Ty^2 + Tz^2 = s^2, +! boundary condition: T(x0,y0,z0) = 0 (point source) +! test function: 'FSM_WENO3_PS_sphe_3d' in "eikon_solver.f90" +! + +program eikonal_2d + use mpi + +! ######################### 参数声明 parameters statement ######################### + + implicit none + + ! mesh grid + integer :: nr,nt,np + double precision,parameter :: pi=3.14159265358979323846264338327950288 + double precision,parameter :: Earth_Radius = 6371.0 + double precision :: rr1,rr2,tt1,tt2,pp1,pp2 + double precision,allocatable :: rr(:),tt(:),pp(:) + double precision :: dr,dt,dp + + ! STATIONS & EARTHQUAKES + integer :: nev + double precision,allocatable :: rev(:),tev(:),pev(:) ! earthquake (event) + integer :: nst + double precision,allocatable :: rst(:),tst(:),pst(:) ! station + integer :: nev_tele + double precision,allocatable :: rev_tele(:),tev_tele(:),pev_tele(:) ! tele seismic event + + ! model parameter + double precision,parameter :: gamma = 0.0 + double precision :: slow_p,ani_p + double precision,allocatable :: xi(:,:,:),eta(:,:,:),zeta(:,:,:) ! syn model (ani) + double precision,allocatable :: a(:,:,:),b(:,:,:),c(:,:,:),f(:,:,:),fun(:,:,:) ! syn model 猜测模型 + double precision,allocatable :: xiT(:,:,:),etaT(:,:,:),zetaT(:,:,:) ! true model (ani) + double precision,allocatable :: aT(:,:,:),bT(:,:,:),cT(:,:,:),fT(:,:,:),funT(:,:,:) ! true model 真实模型 + double precision :: sigma1,sigma2,psi + + ! teleseismic modeling + double precision,allocatable :: bd_N(:,:,:),bd_S(:,:,:),bd_W(:,:,:),bd_E(:,:,:),bd_B(:,:,:),bd_T(:,:,:) ! boundary conditions + double precision,allocatable :: bd_N_l(:,:,:),bd_S_l(:,:,:),bd_W_l(:,:,:),bd_E_l(:,:,:),bd_B_l(:,:,:),bd_T_l(:,:,:) ! local boundary conditions + + logical,allocatable :: isbd(:,:) + double precision :: max_deg,deg + + ! tele and regional control + double precision :: region_ratio, tele_ratio ! the ratio of regional kernel over tele kernel + logical :: is_region, is_tele + + + ! Eikonal solver + double precision,allocatable :: uT(:,:,:),TableT(:,:,:) !true timetable 真实走时场 + double precision,allocatable :: u(:,:,:),Table(:,:,:) !syn timetable 猜测走时场 + double precision,allocatable :: TableADJ(:,:,:) ! adjoint field 伴随场 + + ! adjoint source + double precision,allocatable :: TtimeT(:,:),Ttime_teleT(:,:),Ttime(:,:),Ttime_tele(:,:) ! 真实走时,合成走时 + double precision,allocatable :: TtimeT_l(:,:),Ttime_teleT_l(:,:),Ttime_l(:,:),Ttime_tele_l(:,:) ! 真实走时,合成走时 + double precision,allocatable :: sourceADJ(:) ! adjoint source 伴随源 + + ! sensitivity kernel + integer :: nk ! number of kernels + double precision,allocatable :: all_Ks_region(:,:,:),all_Kxi_region(:,:,:),all_Keta_region(:,:,:) ! sensitivity kernel + double precision,allocatable :: all_Ks_region_l(:,:,:),all_Kxi_region_l(:,:,:),all_Keta_region_l(:,:,:) ! sensitivity kernel + double precision,allocatable :: all_Ks_tele(:,:,:),all_Kxi_tele(:,:,:),all_Keta_tele(:,:,:) ! sensitivity kernel + double precision,allocatable :: all_Ks_tele_l(:,:,:),all_Kxi_tele_l(:,:,:),all_Keta_tele_l(:,:,:) ! sensitivity kernel + double precision,allocatable :: Ks(:,:,:),Kxi(:,:,:),Keta(:,:,:) ! event kernel + double precision,allocatable :: all_Kernel(:,:,:,:) ! kernels for all parameters together + + ! inversion parameterization + integer :: ninvr,ninvt,ninvp + double precision :: invr1,invr2,invt1,invt2,invp1,invp2 + integer :: ngrid ! number of nultigrid (multigrid technique) + double precision,allocatable :: invr(:,:),invt(:,:),invp(:,:) + double precision,allocatable :: inv_dep(:) + double precision :: dinvr,dinvt,dinvp + double precision,allocatable :: update_value(:,:,:,:) ! parameter update value 更新参数的变化量 + + ! model update (optimization) + double precision :: stepsize ! stepsize + integer :: stIter, edIter ! max iteration step + double precision :: old_obj, obj, obj_region, obj_region_l, obj_tele, obj_tele_l, tmp_obj ! 优化目标函数 objective function + double precision,allocatable :: weight_st(:),weight_ev(:),weight_ev_tele(:) !weight function + double precision :: dis_ij, dis_zero !weight function + logical :: weight_sou_bool=.false. , weight_rec_bool= .false. + + ! temp var + double precision :: depth,lat,lon + double precision :: tmp_dp,tmp_int + + ! input and output file + character(Len=80) :: filename,form,form2,TTfield_path + character(Len=80) :: input_path,output_path + logical :: isfile + logical :: isread_model + character(Len=80) :: read_model_name + + ! loop index + integer :: iir,iit,iip,idi,idj,idk,i,j,k,iter,igrid + + ! computing time + double precision :: time_begin,time_end,alpha + + ! mpi parameter + integer :: ierr,myid,nproc,tag,istat(mpi_status_size) + integer,allocatable :: my_tele_source_range(:,:),my_region_source_range(:,:) ! 负载平衡,当前 processor 负责的 最小最大震源序号 + integer :: iproc ! proc 循环index + double precision,allocatable :: dp_3d(:,:,:), dp_2d(:,:), dp_1d(:,:), dp_0d + + +! ############################# input parameters ############################## + ! this can be included in a input_parameter file later + + ! 正演网格 forward mesh + nr = 55; nt = 55; np = 55 ! number of grid for forward modeling + rr1 = 6070; rr2 = 6400 ! 6371 - 5571; 800 km depth + tt1 = (30.0 - 1.5)/180*pi; tt2 = (50.0 + 1.5)/180*pi + pp1 = (15.0 - 1.5)/180*pi; pp2 = (40.0 + 1.5)/180*pi + + ! 反演网格 + ninvr = 11; ninvt = 10; ninvp = 10 ! inversion grid size (coarse) + invr1 = rr1; invr2 = rr2 + invt1 = 30.0/180*pi; invt2 = 50.0/180*pi + invp1 = 15.0/180*pi; invp2 = 40.0/180*pi + ngrid = 5 + nk = 3 ! number of typies of kernel + allocate(inv_dep(ninvr)) + do i=1,ninvr + inv_dep(i) = (i-1)*(invr2-invr1)/(ninvr-1) + invr1 + enddo + + ! 迭代进程 iterative control + ! ############### 迭代中途开始反演,以下每个参数都值得仔细考虑和修改 + ! ############### allow starting from one iteration at any step. Please check all following parameters before start the inversion + stIter = 1; edIter = 1 ! 迭代次数 + isread_model = .false. + read_model_name = 'ega5/output/model_step100' + stepsize = 0.01 ! 初始迭代步长 + + + ! 反演相关参数 parameters for inversion + max_deg = 2.5/180.0*pi ! the distance threshold of stations for tele seismic inversion + slow_p=0.04; ani_p=0.03 ! 检测板异常大小 amplitude of checkerboard anomaly + + region_ratio = 1.0 ! 远近震比例 ratio for regional misfit + tele_ratio = 1.0 ! ratio for teleseismic misfit + is_region = .false. ! invert regional tarveltime data or not + is_tele = .true. ! invert teleseismic tarveltime data or not + + input_path = 'ega5/input' ! input and output path + output_path = 'ega5/output' + + +! ############################# Preparation ############################# + + ! -------------------- iteration check ------------------- + ! 如果当前目录下有生成的文件,暂停程序 if the velocity model file exists, pause + select case (stIter) + case (1:9) + write(form,'(I1)') stIter + case (10:99) + write(form,'(I2)') stIter + case (100:999) + write(form,'(I3)') stIter + end select + filename=trim(output_path)//'/model_step'//trim(form) + inquire(file=filename,exist = isfile) + if (isfile) then ! velocity model file exists, pause + print *, 'file exists, please check the output folder' + pause + end if + + ! -------------------- mpi initialization ------------------- + call mpi_init(ierr) + + call mpi_comm_rank(mpi_comm_world,myid,ierr) + call mpi_comm_size(mpi_comm_world,nproc,ierr) + + call CPU_TIME(time_begin) ! program start + + tag = 1 ! communcation tag + +! ################### read sources and receivers 读取地震台站数据 ################### + open(10,file=trim(input_path)//'/STATIONS') + read(10,*) nst + allocate(rst(nst),tst(nst),pst(nst),weight_st(nst)) + do i=1,nst + read(10,*) depth,lat,lon + rst(i) = Earth_Radius-depth + tst(i) = lat/180.0*pi + pst(i) = lon/180.0*pi + end do + close(10) + + if (is_region) then + open(10,file=trim(input_path)//'/EARTHQUAKES_region') + read(10,*) nev + allocate(rev(nev),tev(nev),pev(nev),weight_ev(nev)) + do i=1,nev + read(10,*) depth,lat,lon + rev(i) = Earth_Radius-depth + tev(i) = lat/180.0*pi + pev(i) = lon/180.0*pi + end do + close(10) + end if + + if (is_tele) then + open(10,file=trim(input_path)//'/EARTHQUAKES_tele') + read(10,*) nev_tele + allocate(rev_tele(nev_tele),tev_tele(nev_tele),pev_tele(nev_tele),weight_ev_tele(nev_tele)) + do i=1,nev_tele + read(10,*) depth,lat,lon + rev_tele(i) = Earth_Radius-depth + tev_tele(i) = lat/180.0*pi + pev_tele(i) = lon/180.0*pi + end do + close(10) + end if + ! ---- 数据记录 data record (earthquakes and stations) ---- + if (myid .eq. 0) then + open(100,file=trim(output_path)//'/STATIONS') + do i=1,nst + write(100,'(f13.7,f13.7,f13.7)') & + & Earth_Radius-rst(i),tst(i)*180.0/pi,pst(i)*180.0/pi + end do + close(100); + if (is_region) then + open(101,file=trim(output_path)//'/EARTHQUAKES_region') + do i=1,nev + write(101,'(f13.7,f13.7,f13.7)') & + & Earth_Radius-rev(i),tev(i)*180.0/pi,pev(i)*180.0/pi + end do + close(101); + end if + if (is_tele) then + open(102,file=trim(output_path)//'/EARTHQUAKES_tele') + do i=1,nev_tele + write(102,'(f13.7,f13.7,f13.7)') & + & Earth_Radius-rev_tele(i),tev_tele(i)*180.0/pi,pev_tele(i)*180.0/pi + end do + close(102) + end if + end if + + +! ######################### 生成网格 build mesh grid ##################################### + ! -------- forward modeling grid ---------- + dr=(rr2-rr1)/(nr-1); dt=(tt2-tt1)/(nt-1); dp=(pp2-pp1)/(np-1) + allocate(rr(nr),tt(nt),pp(np)) + do iir=1,nr + rr(iir)=rr1+(iir-1)*dr + end do + do iit=1,nt + tt(iit)=tt1+(iit-1)*dt + end do + do iip=1,np + pp(iip)=pp1+(iip-1)*dp + end do + + ! -------- inversion multigrid ---------- + dinvr=(invr2-invr1)/(ninvr-1); dinvt=(invt2-invt1)/(ninvt-1); dinvp=(invp2-invp1)/(ninvp-1) + allocate(invr(ngrid,ninvr),invt(ngrid,ninvt),invp(ngrid,ninvp)) + + + do igrid=1,ngrid + do iir=1,ninvr + if (iir .eq. 1) then + dinvr = inv_dep(ninvr)-inv_dep(ninvr-1) + else + dinvr = inv_dep(ninvr+1-iir+1)-inv_dep(ninvr+1-iir) + end if + invr(igrid,iir)=Earth_Radius-inv_dep(ninvr+1-iir)-(igrid-1)*dinvr/ngrid + end do + do iit=1,ninvt + invt(igrid,iit)=invt1+(iit-1)*dinvt-(igrid-1)*dinvt/ngrid + end do + do iip=1,ninvp + invp(igrid,iip)=invp1+(iip-1)*dinvp-(igrid-1)*dinvp/ngrid + end do + end do + + ! ------------ 数据记录 data record (multi grid for inversion) ------------- + if (myid==0) then + open(100,file=trim(output_path)//'/multigrid') + do igrid=1,Ngrid + write(100,'(i4,i4,i4,i4)') & + & igrid,ninvr,ninvt,ninvp + do iir=1,ninvr + do iit=1,ninvt + do iip=1,ninvp + write(100,'(f13.7,f13.7,f13.7)') & + & Earth_Radius-invr(igrid,iir),invt(igrid,iit)*180.0/pi,invp(igrid,iip)*180.0/pi + end do + end do + end do + end do + close(100) + end if + +! ######################### 构建背景模型 build the synthetic and true model ##################################### + ! ----------- allocation --------------- + allocate(xi(nr,nt,np),eta(nr,nt,np),zeta(nr,nt,np)) + allocate(a(nr,nt,np),b(nr,nt,np),c(nr,nt,np),f(nr,nt,np),fun(nr,nt,np)) + allocate(xiT(nr,nt,np),etaT(nr,nt,np),zetaT(nr,nt,np)) + allocate(aT(nr,nt,np),bT(nr,nt,np),cT(nr,nt,np),fT(nr,nt,np),funT(nr,nt,np)) + + + filename = trim(input_path)//'/prem_model.txt' + call Read_1D_velocity_3d(filename,rr,nr,nt,np,fun) + + do iir=1,nr + do iit=1,nt + do iip=1,np + + ! ! ega5 test velocity + ! if (rr(iir)>6351) then ! 6371 - 6351 20 km + ! fun(iir,iit,iip) = 1.0/(5.8+(6371-rr(iir))/20.0*0.7) + ! elseif (rr(iir)>6336) then ! 6351 - 6336 15 km + ! fun(iir,iit,iip) = 1.0/(6.5+(6351-rr(iir))/15.0*0.6) + ! elseif (rr(iir)>5961) then ! 6351 - 6336 15 km + ! fun(iir,iit,iip) = 1.0/(8.0+(6336-rr(iir))/375.0*1) + ! else + ! fun(iir,iit,iip) = 1.0/9.0 + ! end if + + + ! synthetic (initial) model + eta(iir,iit,iip)=0.0; + xi(iir,iit,iip)=0.0; + zeta(iir,iit,iip)=gamma*sqrt(eta(iir,iit,iip)**2+xi(iir,iit,iip)**2) + + if (rr(iir)>6351) then ! 6371 - 6351 20 km + fun(iir,iit,iip) = 1.0/(5.8+(6371-rr(iir))/20.0*0.7) + elseif (rr(iir)>6336) then ! 6351 - 6336 15 km + fun(iir,iit,iip) = 1.0/(6.5+(6351-rr(iir))/15.0*0.6) + elseif (rr(iir)>5961) then ! 6351 - 6336 15 km + fun(iir,iit,iip) = 1.0/(8.0+(6336-rr(iir))/375.0*1) + else + fun(iir,iit,iip) = 1.0/9.0 + end if + + a(iir,iit,iip)=1.0+2*zeta(iir,iit,iip); + b(iir,iit,iip)=1.0-2*xi(iir,iit,iip); + c(iir,iit,iip)=1.0+2*xi(iir,iit,iip); + f(iir,iit,iip)=-2*eta(iir,iit,iip); + + ! true (target) model + if (tt(iit)>=30.0/180*pi .and. tt(iit)<=50.0/180*pi .and. & + & pp(iip)>=15.0/180*pi .and. pp(iip)<=40.0/180*pi .and. & + & rr(iir)>=6211.0 .and. rr(iir)<=6371.0 ) then + sigma1 = sin(4*pi*(tt(iit)-30.0/180*pi)/(20.0/180*pi))* & + & sin(4*pi*(pp(iip)-15.0/180*pi)/(25.0/180*pi))* & + & sin(2*pi*(rr(iir)-6211)/160.0) + else + sigma1 = 0.0 + end if + + if (sigma1<0) then + psi = 60.0/180*pi + elseif (sigma1 > 0) then + psi = 150.0/180*pi + else + psi = 0 + end if + + etaT(iir,iit,iip)=ani_p*abs(sigma1)*sin(2*psi); + xiT(iir,iit,iip)=ani_p*abs(sigma1)*cos(2*psi); + zetaT(iir,iit,iip)=gamma*sqrt(etaT(iir,iit,iip)**2+xiT(iir,iit,iip)**2) + + aT(iir,iit,iip)=1.0+2*zetaT(iir,iit,iip); + bT(iir,iit,iip)=1.0-2*xiT(iir,iit,iip); + cT(iir,iit,iip)=1.0+2*xiT(iir,iit,iip); + fT(iir,iit,iip)=-2*etaT(iir,iit,iip); + funT(iir,iit,iip) = fun(iir,iit,iip)/(1+sigma1*slow_p) + end do + end do + end do + + ! 从外部读取模型文件,一般用于从迭代中途开始 + ! if we start the inversion from an input model: + if (isread_model) then + call read_model_3d(read_model_name,nr,nt,np,fun,xi,eta,zeta,a,b,c,f) + else + ! ---- 数据记录 data record (true and initial model)---- + if (myid .eq. 0) then + open(100,file=trim(output_path)//'/model_true') + open(101,file=trim(output_path)//'/model_init') + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & Earth_Radius-rr(iir),tt(iit)*180.0/pi,pp(iip)*180.0/pi, & + & funT(iir,iit,iip),xiT(iir,iit,iip),etaT(iir,iit,iip) + write(101,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & Earth_Radius-rr(iir),tt(iit)*180.0/pi,pp(iip)*180.0/pi, & + & fun(iir,iit,iip),xi(iir,iit,iip),eta(iir,iit,iip) + end do + end do + end do + close(100);close(101) + end if + end if + +! ###################### 震源并行, 负载平衡 load balancing ################################## + if (is_region) then + allocate(my_region_source_range(nproc,3)) + ! 分配,每个线程计算那些震源对应的到时 + do iproc=1,nproc + ! 前 k 个 processor 负责的总震源数,应该接近 震源总数的第k个nproc等分点 + my_region_source_range(iproc,1) = (nst*(iproc-1)/nproc)+1 + my_region_source_range(iproc,2) = (nst*(iproc)/nproc) + my_region_source_range(iproc,3) = my_region_source_range(iproc,2)-my_region_source_range(iproc,1)+1 + end do + end if + if (is_tele) then + allocate(my_tele_source_range(nproc,3)) + ! 分配,每个线程计算那些震源对应的到时 + do iproc=1,nproc + ! 前 k 个 processor 负责的总震源数,应该接近 震源总数的第k个nproc等分点 + my_tele_source_range(iproc,1) = (nev_tele*(iproc-1)/nproc)+1 + my_tele_source_range(iproc,2) = (nev_tele*(iproc)/nproc) + my_tele_source_range(iproc,3) = my_tele_source_range(iproc,2)-my_tele_source_range(iproc,1)+1 + end do + end if +! ###################### 计算远震波到达区域的边界 calculate the traveltime of teleseismic events on the boundary ##################### + + if (is_tele) then + allocate(bd_N(nev_tele,nr,np),bd_S(nev_tele,nr,np),bd_W(nev_tele,nr,nt), & + & bd_E(nev_tele,nr,nt),bd_B(nev_tele,nr,np),bd_T(nev_tele,nr,np)) + allocate(bd_N_l(nev_tele,nr,np),bd_S_l(nev_tele,nr,np),bd_W_l(nev_tele,nr,nt), & + & bd_E_l(nev_tele,nr,nt),bd_B_l(nev_tele,nr,np),bd_T_l(nev_tele,nr,np)) + allocate(isbd(nev_tele,5)) + bd_N = 0.0; bd_S = 0.0; bd_W = 0.0; bd_E = 0.0; bd_B = 0.0; bd_T = 0.0; isbd = .false. + bd_N_l = 0.0; bd_S_l = 0.0; bd_W_l = 0.0; bd_E_l = 0.0; bd_B_l = 0.0; bd_T_l = 0.0; + filename = trim(input_path)//'/prem_model.txt' + TTfield_path = trim(output_path)//'/tele_traveltime_field' + + ! calculate the boundary on each processor + do i = my_tele_source_range(myid+1,1),my_tele_source_range(myid+1,2) + print *, '----------------- calculating tele 2d timetable ... evid: ',i,'----------------' + call eikonal_boundary_traveltime(rr,tt,pp,nr,nt,np,rev_tele(i),tev_tele(i),pev_tele(i) & + & ,filename,TTfield_path,isbd(i,:), & + & bd_N_l(i,:,:),bd_S_l(i,:,:),bd_W_l(i,:,:),bd_E_l(i,:,:),bd_B_l(i,:,:),bd_T_l(i,:,:)) + end do + + + ! processor communication + ! 数据通信 步骤1, 其他线程传输给主线程 + call mpi_barrier(mpi_comm_world,ierr) + if (myid .eq. 0) then ! 负责接受数据 myid .eq. 0, receiver data + do iproc=1,nproc-1 + call mpi_recv(isbd(my_tele_source_range(iproc+1,1):my_tele_source_range(iproc+1,2),:), & + & my_tele_source_range(iproc+1,3)*5,mpi_logical,iproc,tag-1,mpi_comm_world,istat,ierr) + end do + else ! 负责发送数据 myid .ne. 0, send data + call mpi_send(isbd(my_tele_source_range(myid+1,1):my_tele_source_range(myid+1,2),:), & + & my_tele_source_range(myid+1,3)*5,mpi_logical,0,tag-1,mpi_comm_world,ierr) + end if + call mpi_allreduce(bd_N_l,bd_N,nev_tele*nr*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(bd_S_l,bd_S,nev_tele*nr*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(bd_W_l,bd_W,nev_tele*nr*nt,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(bd_E_l,bd_E,nev_tele*nr*nt,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(bd_B_l,bd_B,nev_tele*nt*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(bd_T_l,bd_T,nev_tele*nt*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + + ! 数据通信 步骤2, 主线程将更新后的level数据广播到其他线程 + call mpi_bcast(isbd,nev_tele*5,mpi_logical,0,mpi_comm_world,ierr) + end if + + +! ######################### 计算真实区域地震到时 regional event true traveltime ###################### + call mpi_barrier(mpi_comm_world,ierr) + allocate(TableT(nr,nt,np),uT(nr,nt,np)) ! 初始化走时场 initial the true timetable + + if (is_region) then + allocate(TtimeT(nev,nst),TtimeT_l(nev,nst)) ! 初始化区域地震真实到时表 initiate true traveltimes + TtimeT = 0.0; TtimeT_l = 0.0 + do j=my_region_source_range(myid+1,1),my_region_source_range(myid+1,2) ! loop STATIONS + ! -------- 求解程函方程 solve eikonal equations ------------ + print *, '----------------- calculating regional true timetable ... evid: ',j,'----------------' + + call FSM_WENO3_PS_sphe_3d_mul(rr,tt,pp,nr,nt,np,aT,bT,cT,fT,TableT,funT,rst(j),tst(j),pst(j),uT) + ! call FSM_WENO3_PS_sphe_3d_mul_mpi(rr,tt,pp,nr,nt,np,aT,bT,cT,fT,TableT,funT,rst(j),tst(j),pst(j),uT) + ! -------- 得到真实走时 calculate true arrival time -------- + do i=1,nev + call Linear_Interp_3D(rr,tt,pp,TableT,nr,nt,np,rev(i),tev(i),pev(i),TtimeT_l(i,j)) + end do + end do + + ! processor communication (true traveltime at stations) + ! 数据通信 归约 + call mpi_barrier(mpi_comm_world,ierr) + call mpi_allreduce(TtimeT_l,TtimeT,nev*nst,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + + + ! data record (traveltime from source to receiver) + if ((myid.eq.0) .and. .true.) then + open(100,file=trim(output_path)//'/traveltime_region') + do i=1,nev + do j=1,nst + write(100,'(i4,f8.3,f8.3,f8.3,i4,f8.3,f8.3,f8.3,f8.3)') & + & i,Earth_Radius-rev(i),tev(i)/pi*180,pev(i)/pi*180, & + & j,Earth_Radius-rst(j),tst(j)/pi*180,pst(j)/pi*180, TtimeT(i,j) + end do + end do + close(100) + end if + end if +! ######################### 计算真实远震到时 tele seismic event true traveltime ###################### + if (is_tele) then + allocate(Ttime_teleT(nev_tele,nst),Ttime_teleT_l(nev_tele,nst)); ! 初始化远震真实到时表 initiate true traveltimes + Ttime_teleT = 0.0; Ttime_teleT_l = 0.0 + + do i=my_tele_source_range(myid+1,1),my_tele_source_range(myid+1,2) ! loop ev_tele + ! -------- 求解远震程函方程 solve eikonal equations ------------ + print *, '----------------- calculating tele true timetable ... evid: ',i,'----------------' + call FSM_WENO3_tele_sphe_3d_ver2(rr,tt,pp,nr,nt,np,aT,bT,cT,fT,funT,isbd(i,:) & + & ,bd_N(i,:,:),bd_S(i,:,:),bd_W(i,:,:),bd_E(i,:,:),bd_B(i,:,:),TableT) + ! -------- 得到真实走时 calculate true arrival time -------- + do j=1,nst + call Linear_Interp_3D(rr,tt,pp,TableT,nr,nt,np,rst(j),tst(j),pst(j),Ttime_teleT_l(i,j)) + end do + end do + + ! processor communication (true traveltime at stations) + ! 数据通信 归约 + call mpi_barrier(mpi_comm_world,ierr) + call mpi_allreduce(Ttime_teleT_l,Ttime_teleT,nev_tele*nst,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + + ! data record (traveltime from source to receiver) + if ((myid.eq.0) .and. .true.) then + open(100,file=trim(output_path)//'/traveltime_tele') + do i=1,nev_tele + do j=1,nst + write(100,'(i4,f8.3,f8.3,f8.3,i4,f8.3,f8.3,f8.3,f8.3)') & + & i,Earth_Radius-rev_tele(i),tev_tele(i)/pi*180,pev_tele(i)/pi*180, & + & j,Earth_Radius-rst(j),tst(j)/pi*180,pst(j)/pi*180, Ttime_teleT(i,j) + end do + end do + close(100) + end if + end if +! ######################## 反演开始 inversion start ########################## + ! ----- 初始化反演参数 initiate inversion parameters ---- + old_obj = 0; obj = 0; obj_region=0; obj_tele=0; obj_tele_l=0;! 目标函数 objective function + + if (is_region) then + allocate(all_Ks_region(nr,nt,np),all_Kxi_region(nr,nt,np),all_Keta_region(nr,nt,np)) + allocate(Ttime(nev,nst)) + Ttime = 0.0; all_Ks_region = 0.0; all_Kxi_region = 0.0; all_Keta_region = 0.0 + allocate(all_Ks_region_l(nr,nt,np),all_Kxi_region_l(nr,nt,np),all_Keta_region_l(nr,nt,np)) + allocate(Ttime_l(nev,nst)) + Ttime_l = 0.0; all_Ks_region_l = 0.0; all_Kxi_region_l = 0.0; all_Keta_region_l = 0.0 + end if + if (is_tele) then + allocate(all_Ks_tele(nr,nt,np),all_Kxi_tele(nr,nt,np),all_Keta_tele(nr,nt,np)) + allocate(Ttime_tele(nev_tele,nst)) + Ttime_tele = 0.0; all_Ks_tele = 0.0; all_Kxi_tele = 0.0; all_Keta_tele = 0.0 + allocate(all_Ks_tele_l(nr,nt,np),all_Kxi_tele_l(nr,nt,np),all_Keta_tele_l(nr,nt,np)) + allocate(Ttime_tele_l(nev_tele,nst)) + Ttime_tele_l = 0.0; all_Ks_tele_l = 0.0; all_Kxi_tele_l = 0.0; all_Keta_tele_l = 0.0 + + end if + + allocate(Ks(nr,nt,np),Kxi(nr,nt,np),Keta(nr,nt,np)) + allocate(Table(nr,nt,np),u(nr,nt,np),TableADJ(nr,nt,np)) + allocate(all_Kernel(nr,nt,np,3),update_value(nr,nt,np,3)) + Ks = 0.0; Kxi = 0.0; Keta = 0.0; Table = 0.0; u = 0.0; TableADJ = 0.0; + all_Kernel = 0.0; update_value = 0.0; + + if (myid .eq. 0) then + print *, ' ' + print *, '----------------- inversion start ... ----------------' + print *, ' ' + end if + + do iter = stIter,edIter ! loop iterations + call mpi_barrier(mpi_comm_world,ierr) + if (myid .eq. 0) then + print *, '----------------- iteration ',iter,' starting ... ----------------' + end if + + ! ----- 初始化参数 initiate parameters ------ + obj = 0.0; obj_region=0.0; obj_region_l=0.0; obj_tele=0.0; obj_tele_l=0; + all_Kernel = 0.0; update_value = 0.0; + +! ######################## 区域地震敏感核计算 calculate sensitivity kernel for regional events ########################## + if (is_region) then + call mpi_barrier(mpi_comm_world,ierr) + ! ----- 初始化参数 initiate parameters ------ + all_Ks_region_l = 0; all_Kxi_region_l = 0; all_Keta_region_l = 0; + all_Ks_region = 0; all_Kxi_region = 0; all_Keta_region = 0; + + do j=my_region_source_range(myid+1,1),my_region_source_range(myid+1,2) ! loop STATIONS + ! ######################## 计算合成走时场 calculate synthetic timetable ######################## + print *, '----------------- calculating regional synthetic timetable and kernel ... evid: ',j,'----------------' + + call FSM_WENO3_PS_sphe_3d_mul(rr,tt,pp,nr,nt,np,a,b,c,f,Table,fun,rst(j),tst(j),pst(j),u) + + ! -------- 得到合成走时 calculate synthetic arrival time at receiver -------- + do i=1,nev + call Linear_Interp_3D(rr,tt,pp,Table,nr,nt,np,rev(i),tev(i),pev(i),Ttime_l(i,j)) + end do + + ! ######################## 计算伴随场 calculate adjoint timetable ######################## + + ! -------- 构造伴随源 build adjoint source (absolute traveltime difference) ------- + allocate(sourceADJ(nev)) + call Adjoint_Source_Dt(Ttime_l(:,j),TtimeT(:,j),nev,sourceADJ,tmp_obj) ! absolute traveltime difference + + call FSM_O1_Adj_sphe_3d(rr,tt,pp,nr,nt,np,Table,TableADJ,zeta,xi,eta,nev,rev,tev,pev,sourceADJ) + + deallocate(sourceADJ) + ! ######################## 计算敏感核 calculate sensitivity kernel ######################## + + call Sensitivity_Kernel(rr,tt,pp,nr,nt,np,Table,TableADJ,gamma,xi,eta,fun,Ks,Kxi,Keta) + + ! ------- 抹去伴随源处的大函数值 mask the source ------- + call Kernel_Mask_new(rr,tt,pp,nr,nt,np,Ks,rst(j),tst(j),pst(j)) + call Kernel_Mask_new(rr,tt,pp,nr,nt,np,Kxi,rst(j),tst(j),pst(j)) + call Kernel_Mask_new(rr,tt,pp,nr,nt,np,Keta,rst(j),tst(j),pst(j)) + + ! --------- 敏感核,obj叠加 sum kernels and objective function ------- + all_Ks_region_l = all_Ks_region_l + Ks; + all_Kxi_region_l = all_Kxi_region_l + Kxi; + all_Keta_region_l = all_Keta_region_l + Keta; + obj_region_l = obj_region_l + tmp_obj + + ! ----- data recored (local event kernel) ------ + if (.false. .and. myid .eq. 0) then + select case (j) + case (1:9) + write(form2,'(I1)') j + case (10:99) + write(form2,'(I2)') j + end select + filename=trim(output_path)//'/region_event_kernel_ev'//trim(form2) + open(100*(myid+1),file=trim(filename)) + tmp_dp = 0 + do iir=1,nr + do iit=1,nt + do iip=1,np + tmp_dp=max(tmp_dp,abs(Ks(iir,iit,iip))) + tmp_dp=max(tmp_dp,abs(Kxi(iir,iit,iip))) + tmp_dp=max(tmp_dp,abs(Keta(iir,iit,iip))) + end do + end do + end do + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & Earth_Radius-rr(iir),tt(iit)*180/pi,pp(iip)*180/pi, & + & Ks(iir,iit,iip)/tmp_dp,Kxi(iir,iit,iip)/tmp_dp,Keta(iir,iit,iip)/tmp_dp + end do + end do + end do + close(100*(myid+1)) + end if + end do + + ! processor communication (true traveltime at stations) + ! 数据通信 归约,把所有进程的kernel和obj求和,传输给所有进程 + call mpi_barrier(mpi_comm_world,ierr) + call mpi_allreduce(all_Ks_region_l,all_Ks_region,nr*nt*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(all_Kxi_region_l,all_Kxi_region,nr*nt*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(all_Keta_region_l,all_Keta_region,nr*nt*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(obj_region_l,obj_region,1,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(Ttime_l,Ttime,nev*nst,mpi_double_precision,mpi_max,mpi_comm_world,ierr) + + + + ! ----- data recored (regional traveltime misfit at each iteration) ------ + if (myid .eq. 0) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + case (100:999) + write(form,'(I3)') iter + end select + filename=trim(output_path)//'/misfit_step'//trim(form)//'_region' + open(998, file=trim(filename)) + do i=1,nev + do j=1,nst + write(998,'(f10.5,f10.5,f10.5)') & + & Ttime(i,j)-TtimeT(i,j), Ttime(i,j), TtimeT(i,j) + end do + end do + close(998) + end if + + ! ----- data recored (region misfit kernel) ------ + if (.false. .and. myid .eq. 0) then + filename=trim(output_path)//'/region_misfit_kernel' + open(100,file=trim(filename)) + tmp_dp = 0 + do iir=1,nr + do iit=1,nt + do iip=1,np + tmp_dp=max(tmp_dp,abs(all_Ks_region(iir,iit,iip))) + tmp_dp=max(tmp_dp,abs(all_Kxi_region(iir,iit,iip))) + tmp_dp=max(tmp_dp,abs(all_Keta_region(iir,iit,iip))) + end do + end do + end do + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & Earth_Radius-rr(iir),tt(iit)*180/pi,pp(iip)*180/pi, & + & all_Ks_region(iir,iit,iip)/tmp_dp,all_Kxi_region(iir,iit,iip)/tmp_dp, & + & all_Keta_region(iir,iit,iip)/tmp_dp + end do + end do + end do + close(100) + end if + + end if +! ######################## 远震敏感核计算 calculate sensitivity kernel for teleseismic events ########################## + if (is_tele) then + call mpi_barrier(mpi_comm_world,ierr) + ! ----- 初始化参数 initiate parameters ------ + all_Ks_tele_l = 0; all_Kxi_tele_l = 0; all_Keta_tele_l = 0; + all_Ks_tele = 0; all_Kxi_tele = 0; all_Keta_tele = 0; + + do i=my_tele_source_range(myid+1,1),my_tele_source_range(myid+1,2) + ! ######################## 计算合成走时场 calculate synthetic timetable ######################## + ! -------- 求解远震程函方程 solve eikonal equations ------------ + print *, '----------------- calculating tele synthetic timetable and kernel ... evid: ',i,' ----------------' + + call FSM_WENO3_tele_sphe_3d_ver2(rr,tt,pp,nr,nt,np,a,b,c,f,fun,isbd(i,:) & + & ,bd_N(i,:,:),bd_S(i,:,:),bd_W(i,:,:),bd_E(i,:,:),bd_B(i,:,:),Table) + ! -------- 得到真实走时 calculate true arrival time -------- + do j=1,nst + call Linear_Interp_3D(rr,tt,pp,Table,nr,nt,np,rst(j),tst(j),pst(j),Ttime_tele_l(i,j)) + end do + + ! ######################## 计算伴随场 calculate adjoint timetable ######################## + + allocate(sourceADJ(nst)) + call Adjoint_Source_DDt(Ttime_tele_l(i,:),Ttime_teleT(i,:),tst,pst,nst,max_deg,sourceADJ,tmp_obj) ! absolute traveltime difference + + call FSM_O1_Adj_tele_sphe_3d(rr,tt,pp,nr,nt,np,Table,TableADJ,zeta,xi,eta,Nst,rst,tst,pst,sourceADJ,isbd) + deallocate(sourceADJ) + + ! ######################## 计算敏感核 calculate sensitivity kernel ######################## + + call Sensitivity_Kernel(rr,tt,pp,nr,nt,np,Table,TableADJ,gamma,xi,eta,fun,Ks,Kxi,Keta) + + ! --------- 敏感核,obj叠加 sum kernels and objective function ------- + all_Ks_tele_l = all_Ks_tele_l + Ks; + all_Kxi_tele_l = all_Kxi_tele_l + Kxi; + all_Keta_tele_l = all_Keta_tele_l + Keta; + obj_tele_l = obj_tele_l + tmp_obj + + ! ----- data recored (tele event kernel) ------ + if (.true. .and. myid .eq. 0) then + select case (i) + case (1:9) + write(form2,'(I1)') i + case (10:99) + write(form2,'(I2)') i + end select + filename=trim(output_path)//'/tele_event_kernel_ev'//trim(form2) + open(100*(myid+1),file=trim(filename)) + tmp_dp = 0 + do iir=1,nr + do iit=1,nt + do iip=1,np + tmp_dp=max(tmp_dp,abs(Ks(iir,iit,iip))) + tmp_dp=max(tmp_dp,abs(Kxi(iir,iit,iip))) + tmp_dp=max(tmp_dp,abs(Keta(iir,iit,iip))) + end do + end do + end do + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & Earth_Radius-rr(iir),tt(iit)*180/pi,pp(iip)*180/pi, & + & Ks(iir,iit,iip)/tmp_dp,Kxi(iir,iit,iip)/tmp_dp,Keta(iir,iit,iip)/tmp_dp, & + & Table(iir,iit,iip),TableADJ(iir,iit,iip) + end do + end do + end do + close(100*(myid+1)) + end if + end do + + ! processor communication (true traveltime at stations) + ! 数据通信 归约,把所有进程的kernel和obj求和,传输给所有进程 + ! sum kernels and objective functions + call mpi_barrier(mpi_comm_world,ierr) + call mpi_allreduce(all_Ks_tele_l,all_Ks_tele,nr*nt*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(all_Kxi_tele_l,all_Kxi_tele,nr*nt*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(all_Keta_tele_l,all_Keta_tele,nr*nt*np,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(obj_tele_l,obj_tele,1,mpi_double_precision,mpi_sum,mpi_comm_world,ierr) + call mpi_allreduce(Ttime_tele_l,Ttime_tele,nev_tele*nst,mpi_double_precision,mpi_max,mpi_comm_world,ierr) + + + + + ! ----- data recored (teleseismic traveltime misfit at each iteration) ------ + if (myid .eq. 0) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + case (100:999) + write(form,'(I3)') iter + end select + filename=trim(output_path)//'/misfit_step'//trim(form)//'_tele' + open(998, file=trim(filename)) + do i=1,nev_tele + do j=1,nst-1 + do k=j+1,nst + call Epicenter_Distance_sphere(tst(j),pst(j),tst(k),pst(k),deg) + if (deg < max_deg) then + write(998,'(f10.5,f10.5,f10.5,f10.5,f10.5)') & + & (Ttime_tele(i,j)-Ttime_tele(i,k))-(Ttime_teleT(i,j)-Ttime_teleT(i,k)), & + & Ttime_tele(i,j), Ttime_tele(i,k), Ttime_teleT(i,j), Ttime_teleT(i,k) + end if + end do + end do + end do + close(998) + end if + + ! ----- data recored (tele misfit kernel) ------ + if (.true. .and. myid .eq. 0) then + filename=trim(output_path)//'/tele_misfit_kernel' + open(100,file=trim(filename)) + tmp_dp = 0 + do iir=1,nr + do iit=1,nt + do iip=1,np + tmp_dp=max(tmp_dp,abs(all_Ks_tele(iir,iit,iip))) + tmp_dp=max(tmp_dp,abs(all_Kxi_tele(iir,iit,iip))) + tmp_dp=max(tmp_dp,abs(all_Keta_tele(iir,iit,iip))) + end do + end do + end do + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & Earth_Radius-rr(iir),tt(iit)*180/pi,pp(iip)*180/pi, & + & all_Ks_tele(iir,iit,iip)/tmp_dp,all_Kxi_tele(iir,iit,iip)/tmp_dp, & + & all_Keta_tele(iir,iit,iip)/tmp_dp + end do + end do + end do + close(100) + end if + + end if + +! ################################### 模型更新 model update ########################################## + call mpi_barrier(mpi_comm_world,ierr) + if (myid .eq. 0) then + print *, '----------------- model update ... iter: ',iter,' ----------------' + end if + + ! ---- 更新目标函数 update objective function ------- + obj = region_ratio * obj_region + tele_ratio * obj_tele + + ! ----- data recored (misfit and step size at each iteration) ------ + if ((myid .eq. 0)) then + if (iter .eq. 1) then + open(999,file=trim(output_path)//'/obj') + else + open(999,file=trim(output_path)//'/obj',access='append') + end if + write(999,'(f11.2,f11.2,f11.2,f9.6)') obj, obj_region,obj_tele,stepsize + close(999) + end if + + ! --------- 整合kernel (sum kernels) --------------------- + if (is_region) then + all_Kernel(:,:,:,1) = all_Kernel(:,:,:,1) + region_ratio * all_Ks_region + all_Kernel(:,:,:,2) = all_Kernel(:,:,:,2) + region_ratio * all_Kxi_region + all_Kernel(:,:,:,3) = all_Kernel(:,:,:,3) + region_ratio * all_Keta_region + end if + if (is_tele) then + all_Kernel(:,:,:,1) = all_Kernel(:,:,:,1) + tele_ratio * all_Ks_tele + all_Kernel(:,:,:,2) = all_Kernel(:,:,:,2) + tele_ratio * all_Kxi_tele + all_Kernel(:,:,:,3) = all_Kernel(:,:,:,3) + tele_ratio * all_Keta_tele + end if + + + ! ------------ multiple grid parameterization ------------ + ! call Parameter_Update_Multigrid(rr,tt,pp,nr,nt,np,all_Kernel,nk, & + ! & invr,invt,invp,ninvr,ninvt,ninvp,ngrid,stepsize,update_value) + call Parameter_Update_Multigrid_ver2(rr,tt,pp,nr,nt,np,all_Kernel,nk, & + & invr,invt,invp,ninvr,ninvt,ninvp,ngrid,stepsize,update_value) + do iir=1,nr + do iit=1,nt + do iip=1,np + ! model parameter update + fun(iir,iit,iip) = fun(iir,iit,iip)*(1-update_value(iir,iit,iip,1)) + xi(iir,iit,iip) = xi(iir,iit,iip)-update_value(iir,iit,iip,2) + eta(iir,iit,iip) = eta(iir,iit,iip)-update_value(iir,iit,iip,3) + + b(iir,iit,iip)=1.0-2*xi(iir,iit,iip); + c(iir,iit,iip)=1.0+2*xi(iir,iit,iip); + f(iir,iit,iip)=-2*eta(iir,iit,iip); + end do + end do + end do + +! ################################## 调整下降步长 modify stepsize ############################## + + if (iter == 1 ) then + if (myid .eq. 0) then + write(*,'(a,f9.2)') 'iter 1, obj is', obj + write(*,'(a,f9.6)') 'iter 1, stepsize is', stepsize + end if + elseif (iter >= 2 .and. obj < old_obj) then + if (myid .eq. 0) then + write(*,'(a,f9.2,a,f9.2)') 'objective function decreases, from', old_obj, ' to', obj + write(*,'(a,f9.6)') 'new stepsize is ', stepsize + end if + elseif (iter >= 2 .and. obj >= old_obj) then + stepsize = max(0.003,stepsize*0.97) ! ega5 会注释掉步长变化 + if (myid .eq. 0) then + write(*,'(a,f9.2,a,f9.2)') 'objective function increases, from', old_obj, ' to', obj + write(*,'(a,f9.6)') 'new stepsize is ', stepsize + end if + end if + +! ################################## 迭代结束 iteration over ############################## + if (myid .eq. 0) then + print *, ' ' + print *, '----------------- iteration ',iter,' over ----------------' + print *, ' ' + end if + + old_obj = obj + + ! ---- data recored (parameters at each iteration) ---- + if ((myid .eq. 0) .and. .true.) then + select case (iter) + case (1:9) + write(form,'(I1)') iter + case (10:99) + write(form,'(I2)') iter + case (100:999) + write(form,'(I3)') iter + end select + + filename=trim(output_path)//'/model_step'//trim(form) + open(100,file=trim(filename)) + do iir=1,nr + do iit=1,nt + do iip=1,np + write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') & + & Earth_Radius-rr(iir),tt(iit)*180.0/pi,pp(iip)*180.0/pi, & + & fun(iir,iit,iip),xi(iir,iit,iip),eta(iir,iit,iip) + end do + end do + end do + close(100) + end if + + + if (myid .eq. 0) then + call CPU_TIME(time_end) + write(*,'(a,f10.2,a)') 'runtime is: ',time_end - time_begin, 'second' + end if + + + + end do + +! 储存释放 release space + if (is_tele) then + deallocate(rev_tele,tev_tele,pev_tele,weight_ev_tele) + deallocate(bd_N,bd_S,bd_W,bd_E,bd_B,bd_T,isbd) + deallocate(Ttime_teleT,Ttime_tele) + deallocate(Ttime_teleT_l,Ttime_tele_l) + deallocate(all_Ks_tele,all_Kxi_tele,all_Keta_tele) + deallocate(all_Ks_tele_l,all_Kxi_tele_l,all_Keta_tele_l) + deallocate(my_tele_source_range) + end if + if (is_region) then + deallocate(rev,tev,pev,weight_ev) + deallocate(TtimeT,Ttime) + deallocate(TtimeT_l,Ttime_l) + deallocate(all_Ks_region,all_Kxi_region,all_Keta_region) + deallocate(all_Ks_region_l,all_Kxi_region_l,all_Keta_region_l) + deallocate(my_region_source_range) + end if + + deallocate(rst,tst,pst,weight_st) + deallocate(rr,tt,pp,invr,invt,invp) + deallocate(xi,eta,zeta) + deallocate(a,b,c,f,fun) + deallocate(xiT,etaT,zetaT) + deallocate(aT,bT,cT,fT,funT) + deallocate(TableT,uT,Table,u,TableADJ) + + deallocate(Ks,Kxi,Keta) + deallocate(all_kernel,update_value) + + deallocate(inv_dep) + + + call mpi_finalize(ierr) + +end program eikonal_2d + diff --git a/test/old_tests/inversion_tele_one_src/fortran_code/eikon_solver_mpi.f90 b/test/old_tests/inversion_tele_one_src/fortran_code/eikon_solver_mpi.f90 new file mode 100644 index 0000000..b982886 --- /dev/null +++ b/test/old_tests/inversion_tele_one_src/fortran_code/eikon_solver_mpi.f90 @@ -0,0 +1,5333 @@ +subroutine FSM_WENO3_tele_sphe_3d(rr,tt,pp,nr,nt,np,spha,sphb,sphc,sphf,T,fun,u,ischange) + ! a -d -e + ! -d b -f + ! -e -f c + integer nr,nt,np + double precision :: dr,dt,dp,rr(nr),tt(nt),pp(np),a(nr,nt,np),b(nr,nt,np),c(nr,nt,np),f(nr,nt,np) + double precision :: spha(nr,nt,np),sphb(nr,nt,np),sphc(nr,nt,np),sphf(nr,nt,np) + double precision :: fun(nr,nt,np),T(nr,nt,np),ischange(nr,nt,np),u(nr,nt,np),xi(nr,nt,np),eta(nr,nt,np) + double precision :: T_old(nr,nt,np) + double precision :: sigr,sigt,sigp,coe,pr1,pr2,wr1,wr2,pt1,pt2,wt1,wt2,pp1,pp2,wp1,wp2,tpT + double precision :: L1_dif,Linf_dif,L1_err,Linf_err + double precision,parameter :: tol = (10.0)**(-5),eps=10.0**(-12) + integer,parameter :: MaxIter=500 + integer iter,rdirec,tdirec,pdirec,iir,iit,iip + double precision :: tmp + + ! ------------------------ 构造网格 ------------------------ + dr=rr(2)-rr(1); dt=tt(2)-tt(1); dp=pp(2)-pp(1) + + ! ------------------------ 构造矩阵 build eikonal matrix ------------------------- + ! a -d -e + ! -d b -f + ! -e -f c + do iir=1,nr + do iit=1,nt + do iip=1,np + a(iir,iit,iip) = spha(iir,iit,iip) + b(iir,iit,iip) = sphb(iir,iit,iip)/(rr(iir)**2) + c(iir,iit,iip) = sphc(iir,iit,iip)/(rr(iir)**2*cos(tt(iit))**2) + f(iir,iit,iip) = sphf(iir,iit,iip)/(rr(iir)**2*cos(tt(iit))) + end do + end do + end do + + ! 正式迭代,更新 iteration start, update T + do iter =1,MaxIter + T_old = T + L1_dif=0; Linf_dif=0;L1_err=0;Linf_err=0; + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + + !x: nr <-> 1, y: nt <-> 1, z: np <-> 1 + + do iir=nint(0.5+nr/2.0+(nr/2.0-0.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+0.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-0.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+0.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-0.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+0.5)*pdirec),-pdirec + + + if(ischange(iir,iit,iip)==1) then + if( iir>1 .and. iir1 .and. iit1 .and. iip0) then + T(i,j,1) = bd_W_interp(i,j) + u(i,j,1) = bd_W_interp(i,j) + ischange(i,j,1) = 0 + else + T(i,j,1) = infT + ischange(i,j,1) = 1 + end if + else + if (bd_W_interp(i,j)>0) then + u(i,j,1) = bd_W_interp(i,j) + end if + end if + + end do + end do + + ! 释放动态数组 + deallocate(bd_rr,bd_tt,bd_W) + + + + ! #--------------------------- 东 E 边界 ---------------------------# + open(10, file='ega1/input/boundary_condition_E') + read(10, *) ni,nj,x1,x2,y1,y2 + allocate(bd_E(ni,nj),bd_rr(ni),bd_tt(nj)) + do i=1,ni + do j=1,nj + read(10, *) read_tmp, read_tmp, read_tmp, bd_E(i,j), read_tmp, read_tmp + end do + end do + x1 = Radius - x1 + x2 = Radius - x2 + y1 = y1/180*pi + y2 = y2/180*pi + + bd_dr = (x2-x1)/(ni-1) + bd_dt = (y2-y1)/(nj-1) + do i=1,ni + bd_rr(i) = x1 + (i-1)*bd_dr + end do + do j=1,nj + bd_tt(j) = y1 + (j-1)*bd_dt + end do + + ! 远震到时 插值到 计算区域边界 + call boundary_interp(bd_rr,bd_tt,ni,nj,bd_E,rr,tt,nr,nt,bd_E_interp) + + ! 赋值给 走时场T + do i=1,nr + do j=1,nt + if (isE) then + if (bd_E_interp(i,j)>0) then + T(i,j,np) = bd_E_interp(i,j) + u(i,j,np) = bd_E_interp(i,j) + ischange(i,j,np) = 0 + else + T(i,j,np) = infT + ischange(i,j,np) = 1 + end if + else + if (bd_E_interp(i,j)>0) then + u(i,j,np) = bd_E_interp(i,j) + end if + end if + end do + end do + + ! 释放动态数组 + deallocate(bd_rr,bd_tt,bd_E) + + + + ! #--------------------------- 北 N 边界 ---------------------------# + open(10, file='ega1/input/boundary_condition_N') + read(10, *) ni,nj,x1,x2,y1,y2 + allocate(bd_N(ni,nj),bd_rr(ni),bd_pp(nj)) + do i=1,ni + do j=1,nj + read(10, *) read_tmp, read_tmp, read_tmp, bd_N(i,j), read_tmp, read_tmp + end do + end do + x1 = Radius - x1 + x2 = Radius - x2 + y1 = y1/180*pi + y2 = y2/180*pi + + bd_dr = (x2-x1)/(ni-1) + bd_dp = (y2-y1)/(nj-1) + do i=1,ni + bd_rr(i) = x1 + (i-1)*bd_dr + end do + do j=1,nj + bd_pp(j) = y1 + (j-1)*bd_dp + end do + + ! 远震到时 插值到 计算区域边界 + call boundary_interp(bd_rr,bd_pp,ni,nj,bd_N,rr,pp,nr,np,bd_N_interp) + + ! 赋值给 走时场T + do i=1,nr + do j=1,np + if (isN) then + if (bd_N_interp(i,j)>0) then + T(i,nt,j) = bd_N_interp(i,j) + u(i,nt,j) = bd_N_interp(i,j) + ischange(i,nt,j) = 0 + else + T(i,nt,j) = infT + ischange(i,nt,j) = 1 + end if + else + if (bd_N_interp(i,j)>0) then + u(i,nt,j) = bd_N_interp(i,j) + end if + end if + end do + end do + + ! 释放动态数组 + deallocate(bd_rr,bd_pp,bd_N) + + + + ! #--------------------------- 南 S 边界 ---------------------------# + open(10, file='ega1/input/boundary_condition_S') + read(10, *) ni,nj,x1,x2,y1,y2 + allocate(bd_S(ni,nj),bd_rr(ni),bd_pp(nj)) + do i=1,ni + do j=1,nj + read(10, *) read_tmp, read_tmp, read_tmp, bd_S(i,j), read_tmp, read_tmp + end do + end do + x1 = Radius - x1 + x2 = Radius - x2 + y1 = y1/180*pi + y2 = y2/180*pi + + bd_dr = (x2-x1)/(ni-1) + bd_dp = (y2-y1)/(nj-1) + do i=1,ni + bd_rr(i) = x1 + (i-1)*bd_dr + end do + do j=1,nj + bd_pp(j) = y1 + (j-1)*bd_dp + end do + + ! 远震到时 插值到 计算区域边界 + call boundary_interp(bd_rr,bd_pp,ni,nj,bd_S,rr,pp,nr,np,bd_S_interp) + + ! 赋值给 走时场T + do i=1,nr + do j=1,np + if (isS) then + if (bd_S_interp(i,j)>0) then + T(i,1,j) = bd_S_interp(i,j) + u(i,1,j) = bd_S_interp(i,j) + ischange(i,1,j) = 0 + else + T(i,1,j) = infT + ischange(i,1,j) = 1 + end if + else + if (bd_S_interp(i,j)>0) then + u(i,1,j) = bd_S_interp(i,j) + end if + end if + end do + end do + + ! 释放动态数组 + deallocate(bd_rr,bd_pp,bd_S) + + + ! #--------------------------- 顶 Top 边界 ---------------------------# + open(10, file='ega1/input/boundary_condition_T') + read(10, *) ni,nj,x1,x2,y1,y2 + allocate(bd_T(ni,nj),bd_tt(ni),bd_pp(nj)) + do i=1,ni + do j=1,nj + read(10, *) read_tmp, read_tmp, read_tmp, bd_T(i,j), read_tmp, read_tmp + end do + end do + x1 = x1/180*pi + x2 = x2/180*pi + y1 = y1/180*pi + y2 = y2/180*pi + + bd_dt = (x2-x1)/(ni-1) + bd_dp = (y2-y1)/(nj-1) + do i=1,ni + bd_tt(i) = x1 + (i-1)*bd_dt + end do + do j=1,nj + bd_pp(j) = y1 + (j-1)*bd_dp + end do + + ! 远震到时 插值到 计算区域边界 + call boundary_interp(bd_tt,bd_pp,ni,nj,bd_T,tt,pp,nt,np,bd_T_interp) + + ! 赋值给 走时场T + do i=1,nt + do j=1,np + if (isT) then + if (bd_T_interp(i,j)>0) then + T(nr,i,j) = bd_T_interp(i,j) + ischange(nr,i,j) = 0 + surface(i,j) = bd_T_interp(i,j) + else + T(nr,i,j) = infT + ischange(nr,i,j) = 1 + end if + else + if (bd_T_interp(i,j)>0) then + surface(i,j) = bd_T_interp(i,j) + end if + end if + end do + end do + + ! 释放动态数组 + deallocate(bd_tt,bd_pp,bd_T) + + + ! #--------------------------- 底 Bottom 边界 ---------------------------# + open(10, file='ega1/input/boundary_condition_B') + read(10, *) ni,nj,x1,x2,y1,y2 + allocate(bd_B(ni,nj),bd_tt(ni),bd_pp(nj)) + do i=1,ni + do j=1,nj + read(10, *) read_tmp, read_tmp, read_tmp, bd_B(i,j), read_tmp, read_tmp + end do + end do + x1 = x1/180*pi + x2 = x2/180*pi + y1 = y1/180*pi + y2 = y2/180*pi + + bd_dt = (x2-x1)/(ni-1) + bd_dp = (y2-y1)/(nj-1) + do i=1,ni + bd_tt(i) = x1 + (i-1)*bd_dt + end do + do j=1,nj + bd_pp(j) = y1 + (j-1)*bd_dp + end do + + ! 远震到时 插值到 计算区域边界 + call boundary_interp(bd_tt,bd_pp,ni,nj,bd_B,tt,pp,nt,np,bd_B_interp) + + ! 赋值给 走时场T + do i=1,nt + do j=1,np + if (isB) then + if (bd_T_interp(i,j)>0) then + T(1,i,j) = bd_B_interp(i,j) + u(1,i,j) = bd_B_interp(i,j) + ischange(1,i,j) = 0 + else + T(1,i,j) = infT + ischange(1,i,j) = 1 + end if + else + if (bd_T_interp(i,j)>0) then + u(1,i,j) = bd_B_interp(i,j) + end if + end if + end do + end do + + ! 释放动态数组 + deallocate(bd_tt,bd_pp,bd_B) + +end subroutine + +subroutine boundary_interp(xx1,yy1,nx1,ny1,val1,xx2,yy2,nx2,ny2,val2) + ! 将 1 套网格的值 插值到 2套网格上,允许外插 + integer :: nx1,ny1,nx2,ny2 + double precision :: xx1(nx1),yy1(ny1),xx2(nx2),yy2(ny2) + double precision :: dx1,dy1,val1(nx1,ny1),val2(nx2,ny2) + double precision :: r1,r2 + integer i,j,idx0,idy0 + dx1 = xx1(2)-xx1(1) + dy1 = yy1(2)-yy1(1) + + + + do i=1,nx2 + do j=1,ny2 + idx0 = floor((xx2(i)-xx1(1))/dx1)+1 + idy0 = floor((yy2(j)-yy1(1))/dy1)+1 + + if (idx0<1 .or. idx0>nx1-1 .or. idy0<1 .or. idy0>ny1-1) then + ! 允许外插 + idx0 = min(nx1-1,max(1,idx0)) + idy0 = min(ny1-1,max(1,idy0)) + end if + + + r1 = min(1.0, (xx2(i)-xx1(idx0))/dx1 ) + r2 = min(1.0, (yy2(j)-yy1(idy0))/dy1 ) + + val2(i,j) = (1-r1)*(1-r2)*val1(idx0,idy0) + (1-r1)*(r2)*val1(idx0,idy0+1) & + & + (r1)*(1-r2)*val1(idx0+1,idy0) + (r1)*(r2)*val1(idx0+1,idy0+1) + + end do + end do +end subroutine + +subroutine tele_error_estimation(rr,tt,pp,nr,nt,np,T,filename,dep,error) + integer :: nr,nt,np + double precision :: T(nr,nt,np),rr(nr),tt(nt),pp(np) + double precision :: error(nt,np,3),dep + double precision,parameter :: Radius = 6371.0 + double precision,parameter :: pi=3.14159265358979323846264338327950288 + character(Len=80) :: filename + + double precision,allocatable :: tauP_solution(:,:),tauP_tt(:),tauP_pp(:) + double precision :: tauP_dt,tauP_dp,tauP_solution_interp(nt,np) + + double precision :: L1_err, Linf_err + + ! 边界的index + integer :: ni,nj + double precision :: x1,x2,y1,y2,r1 + integer :: i,j,idx0,iit,iip + double precision :: read_tmp + + dr = rr(2)-rr(1) + + + ! 读取指定文件 + open(10, file=filename) + read(10, *) ni,nj,x1,x2,y1,y2 + allocate(tauP_solution(ni,nj),tauP_tt(ni),tauP_pp(nj)) + + + do i=1,ni + do j=1,nj + read(10, *) read_tmp, read_tmp, read_tmp, tauP_solution(i,j), read_tmp, read_tmp + end do + end do + x1 = x1/180*pi + x2 = x2/180*pi + y1 = y1/180*pi + y2 = y2/180*pi + + tauP_dt = (x2-x1)/(ni-1) + tauP_dp = (y2-y1)/(nj-1) + do i=1,ni + tauP_tt(i) = x1 + (i-1)*tauP_dt + end do + do j=1,nj + tauP_pp(j) = y1 + (j-1)*tauP_dp + end do + + ! 远震到时 插值到 计算区域 + call boundary_interp(tauP_tt,tauP_pp,ni,nj,tauP_solution,tt,pp,nt,np,tauP_solution_interp) + + ! 走时场 T 插值到指定深度 + idx0 = floor(((Radius-dep) -rr(1))/dr)+1 + r1 = min(1.0,((Radius-dep)-rr(idx0))/dr ) + L1_err=0; Linf_err=0 + + do iit=1,nt + do iip=1,np + error(iit,iip,1) = tauP_solution_interp(iit,iip) + error(iit,iip,2) = (1-r1)*T(idx0,iit,iip)+r1*T(idx0+1,iit,iip) + error(iit,iip,3) = error(iit,iip,1) - error(iit,iip,2) + L1_err = L1_err + abs(error(iit,iip,3)) + Linf_err = max(Linf_err, abs(error(iit,iip,3))) + end do + end do + L1_err = L1_err/(nt*np) + ! 释放动态数组 + deallocate(tauP_solution,tauP_tt,tauP_pp) + + write(*,'(a,f5.1,a,es10.3,a,es10.3,a)') 'L1 and Linf errors at depth ', dep, 'km are ', L1_err, ' s and ', Linf_err,' s.' + + +end subroutine +! ----------------------- end for ega1 ---------------------- + + +! ----------------------- for ega2 ---------------------- +subroutine load_boundary(rr,tt,pp,nr,nt,np,T,ischange,taup_fn,isbd,tele_location) + integer :: nr,nt,np + double precision :: T(nr,nt,np),rr(nr),tt(nt),pp(np),ischange(nr,nt,np) + double precision,parameter :: Radius = 6371.0,pi=3.14159265358979323846264338327950288 + logical :: isbd(6),isN,isS,isW,isE,isT,isB ! N S W E T B + double precision :: tele_location(3) + + ! tauP database + character(Len=80) :: taup_fn + integer :: taup_nsrc_dep,taup_nrec_dep,taup_ndegree + double precision,allocatable :: taup_time(:,:,:),taup_src_dep(:),taup_rec_dep(:),taup_degree(:) + double precision :: tmp_read ! useless for read + + ! boundary points + double precision :: epicenter_dis(nt,np),lat1,lon1,lat2,lon2 + double precision :: r1,r2,r3 ! linear interpolation + double precision :: src,rec,dis + integer :: id1,id2,id3 + ! otheres + integer :: i,j,k !iterative index + + + ! 读取 tauP 数据库 三列分别是 震源深度,台站深度,和震中距 + open(10, file=taup_fn) + read(10, *) taup_nsrc_dep,taup_nrec_dep,taup_ndegree + + allocate(taup_time(taup_nsrc_dep,taup_nrec_dep,taup_ndegree)) + allocate(taup_src_dep(taup_nsrc_dep),taup_rec_dep(taup_nrec_dep),taup_degree(taup_ndegree)) + + read(10, *) taup_src_dep + read(10, *) taup_rec_dep + read(10, *) taup_degree + + do i=1,taup_nsrc_dep + do j=1,taup_nrec_dep + do k=1,taup_ndegree + read(10, *) tmp_read,tmp_read,tmp_read,taup_time(i,j,k) + end do + end do + end do + close(10) + ! 插值边界 + + isN=isbd(1);isS=isbd(2) + isW=isbd(3);isE=isbd(4) + isT=isbd(5);isB=isbd(6) + + ! 统一计算震中距 + do i=1,nt + do j=1,np + lat1 = tt(i); lon1 = pp(j) + lat2 = tele_location(2); lon2 = tele_location(3); + epicenter_dis(i,j)=acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon2-lon1))/pi*180 + end do + end do + + + ! 北边界 North + if (isN) then + do i=1,nr + do j=1,np + ! 震源位置: tele_location(1), 台站位置 Radius-rr(i),震中距:epicenter_dis(nt,j), + src = tele_location(1) + rec = Radius-rr(i) + dis = epicenter_dis(nt,j) + + call taup_data_interp(taup_src_dep,taup_rec_dep,taup_degree, & + & taup_time,taup_nsrc_dep,taup_nrec_dep,taup_ndegree,src,rec,dis,T(i,nt,j)) + ischange(i,nt,j) = 0 + end do + end do + end if + + ! 南边界 South + if (isS) then + do i=1,nr + do j=1,np + ! 震源位置: tele_location(1), 台站位置 Radius-rr(i),震中距:epicenter_dis(1,j), + src = tele_location(1) + rec = Radius-rr(i) + dis = epicenter_dis(1,j) + + call taup_data_interp(taup_src_dep,taup_rec_dep,taup_degree, & + & taup_time,taup_nsrc_dep,taup_nrec_dep,taup_ndegree,src,rec,dis,T(i,1,j)) + ischange(i,1,j) = 0 + end do + end do + end if + + ! 西边界 West + if (isW) then + do i=1,nr + do j=1,nt + ! 震源位置: tele_location(1), 台站位置 Radius-rr(i),震中距:epicenter_dis(j,1), + src = tele_location(1) + rec = Radius-rr(i) + dis = epicenter_dis(j,1) + + call taup_data_interp(taup_src_dep,taup_rec_dep,taup_degree, & + & taup_time,taup_nsrc_dep,taup_nrec_dep,taup_ndegree,src,rec,dis,T(i,j,1)) + ischange(i,j,1) = 0 + end do + end do + end if + + ! 东边界 East + if (isE) then + do i=1,nr + do j=1,nt + ! 震源位置: tele_location(1), 台站位置 Radius-rr(i),震中距:epicenter_dis(j,np), + src = tele_location(1) + rec = Radius-rr(i) + dis = epicenter_dis(j,np) + + call taup_data_interp(taup_src_dep,taup_rec_dep,taup_degree, & + & taup_time,taup_nsrc_dep,taup_nrec_dep,taup_ndegree,src,rec,dis,T(i,j,np)) + ischange(i,j,np) = 0 + end do + end do + end if + + ! 上边界 top (一般是不插值的,遂略去) + + ! 下边界 bottom + if (isB) then + do i=1,nt + do j=1,np + ! 震源位置: tele_location(1), 台站位置 Radius-rr(1),震中距:epicenter_dis(i,j), + src = tele_location(1) + rec = Radius-rr(1) + dis = epicenter_dis(i,j) + + call taup_data_interp(taup_src_dep,taup_rec_dep,taup_degree, & + & taup_time,taup_nsrc_dep,taup_nrec_dep,taup_ndegree,src,rec,dis,T(1,i,j)) + ischange(1,i,j) = 0 + end do + end do + end if + + + deallocate(taup_time,taup_src_dep,taup_rec_dep,taup_degree) + +end subroutine + +subroutine taup_data_interp(src,rec,deg,time,ns,nr,nd,s,r,d,v) + integer :: ns,nr,nd + double precision :: time(ns,nr,nd),src(ns),rec(nr),deg(nd) + double precision :: s,r,d,v + + integer :: id1,id2,id3,k + double precision :: r1,r2,r3 + ! 震源插值 + ! do k=1,ns-1 + ! if (src(k)<= s .and. src(k+1) > s ) then + ! id1=k + ! exit + ! elseif (src(1) > s) then + ! id1=1 + ! exit + ! elseif (src(ns) <= s) then + ! id1=ns-1 + ! exit + ! end if + ! end do + ! r1 = (s - src(id1)) / (src(id1+1)-src(id1)) + + id1 = 1 + + ! 台站插值 (允许外插) + do k=1,nr-1 + if (rec(k)<= r .and. rec(k+1) > r ) then + id2=k + exit + elseif (rec(1) > r) then + id2=1 + exit + elseif (rec(nr) <= r) then + id2=nr-1 + exit + end if + end do + r2 = (r - rec(id2)) / (rec(id2+1)-rec(id2)) + + ! 震中距插值 (允许外插) + do k=1,nd-1 + if (deg(k)<= d .and. deg(k+1) > d ) then + id3=k + exit + elseif (deg(1) > d) then + id3=1 + exit + elseif (deg(nd) <= d) then + id3=nd-1 + exit + end if + end do + r3 = (d - deg(id3)) / (deg(id3+1)-deg(id3)) + + ! v = (1-r1)*(1-r2)*(1-r3)*time(id1,id2,id3) + (1-r1)*(1-r2)*(r3)*time(id1,id2,id3+1) & + ! & + (1-r1)*(r2)*(1-r3)*time(id1,id2+1,id3) + (1-r1)*(r2)*(r3)*time(id1,id2+1,id3+1) & + ! & + (r1)*(1-r2)*(1-r3)*time(id1+1,id2,id3) + (r1)*(1-r2)*(r3)*time(id1+1,id2,id3+1) & + ! & + (r1)*(r2)*(1-r3)*time(id1+1,id2+1,id3) + (r1)*(r2)*(r3)*time(id1+1,id2+1,id3+1) + + v = (1-r2)*(1-r3)*time(id1,id2,id3) + (1-r2)*(r3)*time(id1,id2,id3+1) & + & + (r2)*(1-r3)*time(id1,id2+1,id3) + (r2)*(r3)*time(id1,id2+1,id3+1) + + +end subroutine + +subroutine tele_error_estimation_ver2(rr,tt,pp,nr,nt,np,T,taup_fn,tele_location,dep,error) + integer :: nr,nt,np + double precision :: T(nr,nt,np),rr(nr),tt(nt),pp(np) + double precision :: error(nt,np,3),dep,tele_location(3) + double precision,parameter :: Radius = 6371.0 + double precision,parameter :: pi=3.14159265358979323846264338327950288 + + ! tauP database + character(Len=80) :: taup_fn + integer :: taup_nsrc_dep,taup_nrec_dep,taup_ndegree + double precision,allocatable :: taup_time(:,:,:),taup_src_dep(:),taup_rec_dep(:),taup_degree(:) + double precision :: tmp_read ! useless for read + + double precision :: epicenter_dis(nt,np),lat1,lon1,lat2,lon2 + double precision :: src,rec,dis,traveltime + + double precision :: L1_err, Linf_err + + + + ! 边界的index + integer :: ni,nj + double precision :: x1,x2,y1,y2,r1 + integer :: i,j,k,idx0,iit,iip + double precision :: read_tmp + + dr = rr(2)-rr(1) + + + ! 读取 tauP 数据库 三列分别是 震源深度,台站深度,和震中距 + open(10, file=taup_fn) + read(10, *) taup_nsrc_dep,taup_nrec_dep,taup_ndegree + + allocate(taup_time(taup_nsrc_dep,taup_nrec_dep,taup_ndegree)) + allocate(taup_src_dep(taup_nsrc_dep),taup_rec_dep(taup_nrec_dep),taup_degree(taup_ndegree)) + + read(10, *) taup_src_dep + read(10, *) taup_rec_dep + read(10, *) taup_degree + + do i=1,taup_nsrc_dep + do j=1,taup_nrec_dep + do k=1,taup_ndegree + read(10, *) tmp_read,tmp_read,tmp_read,taup_time(i,j,k) + end do + end do + end do + close(10) + ! 统一计算震中距 + do i=1,nt + do j=1,np + lat1 = tt(i); lon1 = pp(j) + lat2 = tele_location(2); lon2 = tele_location(3); + epicenter_dis(i,j)=acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon2-lon1))/pi*180 + end do + end do + + ! 指定深度 tauP 走时 + idx0 = floor(((Radius-dep) -rr(1))/dr)+1 + r1 = min(1.0,((Radius-dep)-rr(idx0))/dr ) + L1_err=0; Linf_err=0 + + do iit=1,nt + do iip=1,np + ! 震源位置: tele_location(1), 台站位置 Radius-dep,震中距:epicenter_dis(iit,iip), + src = tele_location(1) + rec = dep + dis = epicenter_dis(iit,iip) + + call taup_data_interp(taup_src_dep,taup_rec_dep,taup_degree, & + & taup_time,taup_nsrc_dep,taup_nrec_dep,taup_ndegree,src,rec,dis,traveltime) + + error(iit,iip,1) = traveltime + error(iit,iip,2) = (1-r1)*T(idx0,iit,iip)+r1*T(idx0+1,iit,iip) + error(iit,iip,3) = error(iit,iip,1) - error(iit,iip,2) + L1_err = L1_err + abs(error(iit,iip,3)) + Linf_err = max(Linf_err, abs(error(iit,iip,3))) + + end do + end do + L1_err = L1_err/(nt*np) + + ! 释放动态数组 + deallocate(taup_time,taup_src_dep,taup_rec_dep,taup_degree) + + write(*,'(a,f5.1,a,es10.3,a,es10.3,a)') 'L1 and Linf errors at depth ', dep, 'km are ', L1_err, ' s and ', Linf_err,' s.' + + +end subroutine +! ----------------------- end for ega2 ---------------------- + + +! ----------------------- for ega3 ---------------------- + +subroutine FSM_WENO3_PS_sphe_2d(rr,tt,nr,nt,spha,sphb,T,fun,r0,t0,u) + integer :: nr,nt + double precision :: spha(nr,nt),sphb(nr,nt) + double precision :: rr(nr),tt(nt),a(nr,nt),b(nr,nt),T(nr,nt),fun(nr,nt),r0,t0,ischange(nr,nt),u(nr,nt) + double precision :: dr,dt,T0v(nr,nt),T0r(nr,nt),T0t(nr,nt),a0,b0,fun0 + double precision :: tau(nr,nt),px1,px2,py1,py2,tpT,Htau,wx1,wx2,wy1,wy2 + integer :: iir,iit,iter,xdirec,ydirec + double precision :: L1_dif,Linf_dif,L1_err,Linf_err,tau_old(nr,nt),sigr,sigt + integer,parameter :: MaxIter = 2000 + double precision,parameter :: tol=(10.0)**(-4),eps=(10.0)**(-12) + + ! ------------------------ 构造网格 ------------------------ + dr=rr(2)-rr(1); dt=tt(2)-tt(1); + + ! ------------------------ 构造 T0 ------------------------ + + ! 震源处参数离散化 + idr0=floor((r0-rr(1))/dr+1); idt0=floor((t0-tt(1))/dt+1); + r1 = min(1.0,(r0-rr(idr0))/dr); r2 = min(1.0,(t0-tt(idt0))/dt); + + do iir=1,nr + do iit=1,nt + a(iir,iit) = spha(iir,iit) + b(iir,iit) = sphb(iir,iit)/(rr(iir)**2) + end do + end do + + a0=(1-r1)*(1-r2)*a(idr0,idt0)+(1-r1)*r2*a(idr0,idt0+1) & + & +r1*(1-r2)*a(idr0+1,idt0)+r1*r2*a(idr0+1,idt0+1) + + b0=(1-r1)*(1-r2)*b(idr0,idt0)+(1-r1)*r2*b(idr0,idt0+1) & + & +r1*(1-r2)*b(idr0+1,idt0)+r1*r2*b(idr0+1,idt0+1) + + fun0=(1-r1)*(1-r2)*fun(idr0,idt0)+(1-r1)*r2*fun(idr0,idt0+1) & + & +r1*(1-r2)*fun(idr0+1,idt0)+r1*r2*fun(idr0+1,idt0+1) + + do iir=1,nr + do iit=1,nt + T0v(iir,iit) = fun0*sqrt((1.0/a0)*(rr(iir)-r0)**2 + 1.0/b0*(tt(iit)-t0)**2) + if (T0v(iir,iit) .eq. 0) then + T0r(iir,iit) = 0 + T0t(iir,iit) = 0 + else + T0r(iir,iit) = fun0**2*(1.0/a0*(rr(iir)-r0))/T0v(iir,iit) + T0t(iir,iit) = fun0**2*(1.0/b0*(tt(iit)-y0))/T0v(iir,iit) + end if + + if ( abs((rr(iir)-r0)/dr)<=2 .and. abs((tt(iit)-t0)/dt)<=2) then + tau(iir,iit) = 1 !震源周围几个点,直接认为是常速度结构,给出解析解,即和T0相等 + ischange(iir,iit)=0 + if (iir==1 .or. iir==nr .or. iit==1 .or. iit==nt) then + write(*,*) 'source on the boundary, mesh error' + pause + end if + else + tau(iir,iit) = 1 + ischange(iir,iit)=1 + end if + + end do + end do + + ! step 2, solve Tau, H(tau) = a tau_x^2+ b tau_y^2 + (2aTx-2cTy) tau_x + (2bTy-2cTx) tau_y + ! -2c tau_x tau_y + (aTx^2+bTy^2-2cTxTy) = f^2 + + do iter =1,MaxIter + L1_dif=10000; Linf_dif=10000;L1_err=0;Linf_err=0; + tau_old = tau + do xdirec = -1,1,2 + do ydirec = -1,1,2 + ! iter 1 x: 1 -> nr, y: 1 -> nt + ! iter 2 x: 1 -> nr, y: nt -> 1 + ! iter 3 x: nr -> 1, y: 1 -> nt + ! iter 4 x: nr -> 1, y: nt -> 1 + do iir=nint(0.5+nr/2.0+(nr/2.0-1.5)*xdirec),nint(0.5+nr/2.0+(-nr/2.0+1.5)*xdirec),-xdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-1.5)*ydirec),nint(0.5+nt/2.0+(-nt/2.0+1.5)*ydirec),-ydirec + if(ischange(iir,iit)==1) then + + sigr=sqrt(a(iir,iit))*T0v(iir,iit);sigt=sqrt(b(iir,iit))*T0v(iir,iit) + coe=1.0/((sigr/dr)+(sigt/dt)) + + if(iir==2) then + px1=(tau(iir,iit)-tau(iir-1,iit))/dr; + wx2=1.0/(1+2*((eps+(tau(iir,iit)-2*tau(iir+1,iit)+tau(iir+2,iit))**2)/ & + & (eps+(tau(iir-1,iit)-2*tau(iir,iit)+tau(iir+1,iit))**2))**2) + px2=(1-wx2)*(tau(iir+1,iit)-tau(iir-1,iit))/2/dr+ & + & wx2*(-3*tau(iir,iit)+4*tau(iir+1,iit)-tau(iir+2,iit))/2/dr; + elseif (iir==nr-1) then + wx1=1.0/(1+2*((eps+(tau(iir,iit)-2*tau(iir-1,iit)+tau(iir-2,iit))**2)/ & + & (eps+(tau(iir+1,iit)-2*tau(iir,iit)+tau(iir-1,iit))**2))**2) + px1=(1-wx1)*(tau(iir+1,iit)-tau(iir-1,iit))/2/dr+ & + & wx1*(3*tau(iir,iit)-4*tau(iir-1,iit)+tau(iir-2,iit))/2/dr; + px2=(tau(iir+1,iit)-tau(iir,iit))/dr; + else + wx1=1.0/(1.0+2*((eps+(tau(iir,iit)-2*tau(iir-1,iit)+tau(iir-2,iit))**2)/ & + & (eps+(tau(iir+1,iit)-2*tau(iir,iit)+tau(iir-1,iit))**2))**2) + px1=(1.0-wx1)*(tau(iir+1,iit)-tau(iir-1,iit))/2/dr+ & + & wx1*(3*tau(iir,iit)-4*tau(iir-1,iit)+tau(iir-2,iit))/2/dr; + wx2=1.0/(1.0+2*((eps+(tau(iir,iit)-2*tau(iir+1,iit)+tau(iir+2,iit))**2)/ & + & (eps+(tau(iir-1,iit)-2*tau(iir,iit)+tau(iir+1,iit))**2))**2) + px2=(1.0-wx2)*(tau(iir+1,iit)-tau(iir-1,iit))/2/dr+ & + & wx2*(-3*tau(iir,iit)+4*tau(iir+1,iit)-tau(iir+2,iit))/2/dr; + end if + + + if(iit==2) then + py1=(tau(iir,iit)-tau(iir,iit-1))/dt; + wy2=1.0/(1+2*((eps+(tau(iir,iit)-2*tau(iir,iit+1)+tau(iir,iit+2))**2)/ & + & (eps+(tau(iir,iit-1)-2*tau(iir,iit)+tau(iir,iit+1))**2))**2) + py2=(1-wy2)*(tau(iir,iit+1)-tau(iir,iit-1))/2/dt+ & + & wy2*(-3*tau(iir,iit)+4*tau(iir,iit+1)-tau(iir,iit+2))/2/dt; + elseif (iit==nt-1) then + wy1=1.0/(1+2*((eps+(tau(iir,iit)-2*tau(iir,iit-1)+tau(iir,iit-2))**2)/ & + & (eps+(tau(iir,iit+1)-2*tau(iir,iit)+tau(iir,iit-1))**2))**2) + py1=(1-wy1)*(tau(iir,iit+1)-tau(iir,iit-1))/2/dt+ & + & wy1*(3*tau(iir,iit)-4*tau(iir,iit-1)+tau(iir,iit-2))/2/dt; + py2=(tau(iir,iit+1)-tau(iir,iit))/dt; + else + wy1=1.0/(1+2*((eps+(tau(iir,iit)-2*tau(iir,iit-1)+tau(iir,iit-2))**2)/ & + & (eps+(tau(iir,iit+1)-2*tau(iir,iit)+tau(iir,iit-1))**2))**2) + py1=(1-wy1)*(tau(iir,iit+1)-tau(iir,iit-1))/2/dt+ & + & wy1*(3*tau(iir,iit)-4*tau(iir,iit-1)+tau(iir,iit-2))/2/dt; + wy2=1.0/(1+2*((eps+(tau(iir,iit)-2*tau(iir,iit+1)+tau(iir,iit+2))**2)/ & + & (eps+(tau(iir,iit-1)-2*tau(iir,iit)+tau(iir,iit+1))**2))**2) + py2=(1-wy2)*(tau(iir,iit+1)-tau(iir,iit-1))/2/dt+ & + & wy2*(-3*tau(iir,iit)+4*tau(iir,iit+1)-tau(iir,iit+2))/2/dt; + end if + + + + Htau = sqrt( a(iir,iit)*(T0r(iir,iit)*tau(iir,iit)+T0v(iir,iit)*(px1+px2)/2)**2 & + & + b(iir,iit)*(T0t(iir,iit)*tau(iir,iit)+T0v(iir,iit)*(py1+py2)/2)**2 ) + + tpT=coe*(fun(iir,iit)-Htau) + coe*(sigr*(px2-px1)/2+sigt*(py2-py1)/2)+tau(iir,iit); + + tau(iir,iit)=tpT + + + end if + + end do + end do + + ! 处理边界 + do iit=1,nt + tau(1,iit) = max(2*tau(2,iit)-tau(3,iit),tau(3,iit)) + tau(nr,iit) = max(2*tau(nr-1,iit)-tau(nr-2,iit),tau(nr-2,iit)) + end do + do iir=1,nr + tau(iir,1) = max(2*tau(iir,2)-tau(iir,3),tau(iir,3)) + tau(iir,nt) = max(2*tau(iir,nt-1)-tau(iir,nt-2),tau(iir,nt-2)) + end do + + end do + end do + + L1_dif=0; Linf_dif=0 + do iir=1,nr + do iit=1,nt + L1_dif=L1_dif+abs(tau(iir,iit)-tau_old(iir,iit)) + Linf_dif=max(Linf_dif,abs(tau(iir,iit)-tau_old(iir,iit))) + end do + end do + L1_dif = L1_dif/(nr*nt) + + do iir=3,nr-2 + do iit=3,nt-2 + L1_err=L1_err+abs(tau(iir,iit)*T0v(iir,iit)-u(iir,iit)) + Linf_err=max(Linf_err,abs(tau(iir,iit)*T0v(iir,iit)-u(iir,iit))) + end do + end do + L1_err = L1_err/(nr-4)/(nt-4) + + + if (abs(L1_dif)= layer_dep(nlayer)) then + vel = layer_vel(nlayer) + else + do i=1,nlayer-1 + if ( layer_dep(i)+small_eps <= dep .and. layer_dep(i+1) > dep-small_eps ) then + vel = (dep-layer_dep(i))/(layer_dep(i+1)-layer_dep(i))*(layer_vel(i+1)-layer_vel(i))+layer_vel(i) + exit + end if + end do + end if + + do iit=1,nt + fun(iir,iit) = 1.0/vel + end do + + end do + + close(10) + deallocate(layer_dep,layer_vel) + + +end subroutine + +subroutine Read_1D_velocity_3d(filename,rr,nr,nt,np,fun) + integer :: nr,nt,np + double precision :: fun(nr,nt,np),rr(nr) + character(len=80) filename + + ! input velocity file + integer :: nlayer + double precision,allocatable :: layer_dep(:), layer_vel(:) + double precision,parameter :: Radius = 6371.0, small_eps=0.001 + + ! others + integer i,iir,iit,iip ! iterative index + double precision :: read_tmp,dep,vel ! read temp variable + + + + open(10,file=trim(filename)) + read(10,*) nlayer + allocate(layer_dep(nlayer),layer_vel(nlayer)) + + do i=1,nlayer + read(10,*) layer_dep(i),layer_vel(i) + end do + + do iir=1,nr + ! 计算 dep 处的速度 + dep = Radius - rr(iir) + if (dep < layer_dep(1)) then + vel = layer_vel(1) + elseif (dep >= layer_dep(nlayer)) then + vel = layer_vel(nlayer) + else + do i=1,nlayer-1 + if ( layer_dep(i)+small_eps <= dep .and. layer_dep(i+1) > dep-small_eps ) then + vel = (dep-layer_dep(i))/(layer_dep(i+1)-layer_dep(i))*(layer_vel(i+1)-layer_vel(i))+layer_vel(i) + exit + end if + end do + end if + + do iit=1,nt + do iip=1,np + fun(iir,iit,iip) = 1.0/vel + end do + end do + + end do + + close(10) + deallocate(layer_dep,layer_vel) + + +end subroutine + +subroutine Ray_tracing_sphe_2d(rr,tt,nr,nt,T,recr,rect,srcr,srct,time,filename) + integer :: nr,nt + double precision :: rr(nr),tt(nt),T(nr,nt) + double precision :: srcr,srct,recr,rect,time + character(len=80) :: filename + + integer :: Ntime,traceid + double precision,allocatable :: trace(:,:) + double precision :: dt,grad_r,grad_t,Tgrad_r(nr,nt),Tgrad_t(nr,nt) + double precision :: tol + + integer :: iir,iit,it ! 循环 index + double precision,parameter :: pi=3.14159265358979323846264338327950288 + + + + dtime=0.1; + Ntime = int(time*1.5/dtime) ! 总时间 + allocate(trace(Ntime,2)) + + ! 初始化 + trace(1,1) = recr; trace(1,2) = rect; ! 起始点 + + dr = rr(2)-rr(1); dt=tt(2)-tt(1) + tol = sqrt(dr**2+(dt*srcr)**2) + + + ! 梯度场 + do iir=2,nr-1 + do iit=2,nt-1 + Tgrad_r(iir,iit) = (T(iir+1,iit) - T(iir-1,iit))/dr/2 + Tgrad_t(iir,iit) = (T(iir,iit+1) - T(iir,iit-1))/dt/2 + end do + end do + do iir=1,nr + Tgrad_t(iir,1) = (T(iir,2) - T(iir,1))/dt + Tgrad_t(iir,nt) = (T(iir,nt) - T(iir,nt-1))/dt + end do + do iit=1,nt + Tgrad_r(1,iit) = (T(2,iit) - T(1,iit))/dr + Tgrad_r(nr,iit) = (T(nr,iit) - T(nr-1,iit))/dr + end do + + traceid=-1 + + + + ! 主循环 + do it=1,Ntime-1 + + ! 该点位置 trace(it,1), trace(it,2) + if ( trace(it,1)<=rr(1) .or. trace(it,1)>=rr(nr) .or. trace(it,2)<=tt(1) .or. trace(it,2)>=tt(nt)) then + print *, 'ray out of region, stop' + exit + end if + + ! 如果当前点离震源非常近,判定收敛 + if ( (trace(it,1)-srcr)**2+(trace(it,2)-srct)**2*trace(it,1)**2 < tol**2 ) then + print *, 'ray arrive source' + trace(it+1,1) = srcr + trace(it+1,2) = srct + traceid = it+1 + exit + end if + + + ! 计算该点的梯度 + call interp2d(rr,tt,nr,nt,Tgrad_r,trace(it,1),trace(it,2),grad_r) + call interp2d(rr,tt,nr,nt,Tgrad_t,trace(it,1),trace(it,2),grad_t) + + slowness_squared = grad_r**2 + grad_t**2/trace(it,1)**2 + ! 沿负梯度走 dtime 长度 r = r- dtime*Tr/(s^2); theta = theta - dtime*Ttheta/(r^2 s^2) + trace(it+1,1) = trace(it,1) - dtime*grad_r / slowness_squared + trace(it+1,2) = trace(it,2) - dtime*grad_t / slowness_squared / ((trace(it,1)+trace(it+1,1))**2/4) + + !print *, trace(it+1,1),trace(it+1,2),xsou,ysou + + end do + + if (traceid<0) then + ! 没打到震源,存在问题 + print *, filename, 'not arrive' + open(10,file=trim(filename)//'_NotArrive') + do it=1,Ntime + write(10,*) trace(it,1),trace(it,2)*180.0/pi,dtime*(it-1) + end do + close(10) + else + ! 达到震源,输出射线路径 + open(10,file=trim(filename)) + do it=1,traceid + write(10,*) trace(it,1),trace(it,2)*180.0/pi,dtime*(it-1) + end do + close(10) + end if + + + + deallocate(trace) +end subroutine + +subroutine interp2d(xx,yy,nx,ny,val,x0,y0,v0) + integer :: nx,ny,idx0,idy0 + double precision :: xx(nx),yy(ny),val(nx,ny),x0,y0,v0,dx,dy,r1,r2 + integer :: iix,iiy + + dx=xx(2)-xx(1); dy=yy(2)-yy(1) + + + if ( x0<=xx(1) .or. x0>=xx(nx) .or. y0<=yy(1) .or. y0>=yy(ny)) then + print *, x0,xx(1),xx(nx),y0,yy(1),yy(ny) + print *, 'out of mesh' + pause + end if + + idx0 = floor((x0-xx(1))/dx)+1 + idy0 = floor((y0-yy(1))/dy)+1 + + r1 = min(1.0, (x0-xx(idx0))/dx ) + r2 = min(1.0, (y0-yy(idy0))/dy ) + + v0 = (1-r1)*(1-r2)*val(idx0,idy0) + (1-r1)*r2*val(idx0,idy0+1) & + & + r1*(1-r2)*val(idx0+1,idy0) + r1*r2*val(idx0+1,idy0+1) + + +end subroutine + +subroutine load_boundary_ver2(rr,tt,pp,nr,nt,np,T,ischange,bd_fn,isbd,tele_location) + integer :: nr,nt,np + double precision :: T(nr,nt,np),rr(nr),tt(nt),pp(np),ischange(nr,nt,np) + double precision,parameter :: Radius = 6371.0,pi=3.14159265358979323846264338327950288 + logical :: isbd(6),isN,isS,isW,isE,isT,isB ! N S W E T B + double precision :: tele_location(3) + + ! boundary database + character(Len=80) :: bd_fn + integer :: bd_nr,bd_nt + double precision :: bd_srcr + double precision,allocatable :: bd_time(:,:),bd_r(:),bd_t(:) + double precision :: tmp_read ! useless for read + + ! boundary points + double precision :: epicenter_dis(nt,np),lat1,lon1,lat2,lon2 + double precision :: r1,r2,r3 ! linear interpolation + double precision :: rec,dis + integer :: id1,id2,id3 + ! otheres + integer :: i,j,k !iterative index + + ! 读取 2d eikonal 计算的到时数据 + open(10, file=bd_fn) + read(10, *) bd_srcr + if (abs(bd_srcr - tele_location(1))>0.1) then + print *, 'source depth is not consistent with the boundary data' + pause + end if + + read(10, *) bd_nr,bd_nt + + allocate(bd_time(bd_nr,bd_nt),bd_r(bd_nr),bd_t(bd_nt)) + + read(10, *) bd_r + read(10, *) bd_t + + do i=1,bd_nr + do j=1,bd_nt + read(10, *) bd_time(i,j) + end do + end do + close(10) + ! 插值边界 + + + + isN=isbd(1);isS=isbd(2) + isW=isbd(3);isE=isbd(4) + isT=isbd(5);isB=isbd(6) + + ! 统一计算震中距 + do i=1,nt + do j=1,np + lat1 = tt(i); lon1 = pp(j) + lat2 = tele_location(2); lon2 = tele_location(3); + epicenter_dis(i,j)=acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon2-lon1))/pi*180 + end do + end do + + + ! 北边界 North + if (isN) then + do i=1,nr + do j=1,np + ! 震源位置: tele_location(1), 台站位置 Radius-rr(i),震中距:epicenter_dis(nt,j), + rec = rr(i) + dis = epicenter_dis(nt,j) + + call interp2d(bd_r,bd_t,bd_nr,bd_nt,bd_time,rec,dis,T(i,nt,j)) + ischange(i,nt,j) = 0 + end do + end do + end if + + ! 南边界 South + if (isS) then + do i=1,nr + do j=1,np + ! 震源位置: tele_location(1), 台站位置 Radius-rr(i),震中距:epicenter_dis(1,j), + rec = rr(i) + dis = epicenter_dis(1,j) + call interp2d(bd_r,bd_t,bd_nr,bd_nt,bd_time,rec,dis,T(i,1,j)) + ischange(i,1,j) = 0 + end do + end do + end if + + ! 西边界 West + if (isW) then + do i=1,nr + do j=1,nt + ! 震源位置: tele_location(1), 台站位置 Radius-rr(i),震中距:epicenter_dis(j,1), + rec = rr(i) + dis = epicenter_dis(j,1) + + call interp2d(bd_r,bd_t,bd_nr,bd_nt,bd_time,rec,dis,T(i,j,1)) + + ischange(i,j,1) = 0 + end do + end do + end if + + ! 东边界 East + if (isE) then + do i=1,nr + do j=1,nt + ! 震源位置: tele_location(1), 台站位置 Radius-rr(i),震中距:epicenter_dis(j,np), + rec = rr(i) + dis = epicenter_dis(j,np) + + call interp2d(bd_r,bd_t,bd_nr,bd_nt,bd_time,rec,dis,T(i,j,np)) + + ischange(i,j,np) = 0 + end do + end do + end if + + ! 上边界 top (一般是不插值的,遂略去) + + ! 下边界 bottom + if (isB) then + do i=1,nt + do j=1,np + ! 震源位置: tele_location(1), 台站位置 Radius-rr(1),震中距:epicenter_dis(i,j), + rec = rr(1) + dis = epicenter_dis(i,j) + + call interp2d(bd_r,bd_t,bd_nr,bd_nt,bd_time,rec,dis,T(1,i,j)) + + ischange(1,i,j) = 0 + end do + end do + end if + + + deallocate(bd_time,bd_r,bd_t) + +end subroutine + +subroutine tele_error_estimation_ver3(rr,tt,pp,nr,nt,np,T,bd_fn,tele_location,dep,error) + integer :: nr,nt,np + double precision :: T(nr,nt,np),rr(nr),tt(nt),pp(np) + double precision :: error(nt,np,3),dep,tele_location(3) + double precision,parameter :: Radius = 6371.0 + double precision,parameter :: pi=3.14159265358979323846264338327950288 + + ! boundary database + character(Len=80) :: bd_fn + integer :: bd_nr,bd_nt + double precision :: bd_srcr + double precision,allocatable :: bd_time(:,:),bd_r(:),bd_t(:) + double precision :: tmp_read ! useless for read + + + double precision :: epicenter_dis(nt,np),lat1,lon1,lat2,lon2 + double precision :: src,rec,dis,traveltime + double precision :: L1_err, Linf_err + + + + ! 边界的index + integer :: ni,nj + double precision :: x1,x2,y1,y2,r1 + integer :: i,j,k,idx0,iit,iip + double precision :: read_tmp + + dr = rr(2)-rr(1) + + + ! 读取 2d eikonal 计算的到时数据 + open(10, file=bd_fn) + read(10, *) bd_srcr + if (abs(bd_srcr - tele_location(1))>0.1) then + print *, 'source depth is not consistent with the boundary data' + pause + end if + + read(10, *) bd_nr,bd_nt + + allocate(bd_time(bd_nr,bd_nt),bd_r(bd_nr),bd_t(bd_nt)) + + read(10, *) bd_r + read(10, *) bd_t + + do i=1,bd_nr + do j=1,bd_nt + read(10, *) bd_time(i,j) + end do + end do + close(10) + + + ! 统一计算震中距 + do i=1,nt + do j=1,np + lat1 = tt(i); lon1 = pp(j) + lat2 = tele_location(2); lon2 = tele_location(3); + epicenter_dis(i,j)=acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon2-lon1))/pi*180 + end do + end do + + ! 指定深度 计算 走时 + idx0 = floor(((Radius-dep) -rr(1))/dr)+1 + r1 = min(1.0,((Radius-dep)-rr(idx0))/dr ) + L1_err=0; Linf_err=0 + + do iit=1,nt + do iip=1,np + ! 震源位置: tele_location(1), 台站位置 Radius-dep,震中距:epicenter_dis(iit,iip), + rec = Radius-dep + dis = epicenter_dis(iit,iip) + + call interp2d(bd_r,bd_t,bd_nr,bd_nt,bd_time,rec,dis,traveltime) + + error(iit,iip,1) = traveltime + error(iit,iip,2) = (1-r1)*T(idx0,iit,iip)+r1*T(idx0+1,iit,iip) + error(iit,iip,3) = error(iit,iip,1) - error(iit,iip,2) + L1_err = L1_err + abs(error(iit,iip,3)) + Linf_err = max(Linf_err, abs(error(iit,iip,3))) + end do + end do + L1_err = L1_err/(nt*np) + + ! dep = 6071.0 + ! do iit=1,10 + ! call interp2d(bd_r,bd_t,bd_nr,bd_nt,bd_time,dep+iit,epicenter_dis(3,3),traveltime) + ! print *, dep+iit,traveltime + ! end do + + ! 释放动态数组 + deallocate(bd_time,bd_r,bd_t) + + write(*,'(a,f5.1,a,es10.3,a,es10.3,a)') 'L1 and Linf errors at depth ', dep, 'km are ', L1_err, ' s and ', Linf_err,' s.' + + + + +end subroutine +! ----------------------- end for ega3 ---------------------- + +! ----------------------- for ega4 ---------------------- +subroutine eikonal_boundary_traveltime(rr,tt,pp,nr,nt,np,r0,t0,p0,velo_1d_fn,TTfield_path,isbd,bd_N,bd_S,bd_W,bd_E,bd_B,bd_T) + ! input parameter + integer :: nr,nt,np + double precision :: rr(nr),tt(nt),pp(np) + double precision :: r0,t0,p0 + character(len=80) :: velo_1d_fn,TTfield_path + + ! output parameter + double precision :: bd_N(nr,np),bd_S(nr,np),bd_W(nr,nt),bd_E(nr,nt),bd_B(nt,np),bd_T(nt,np) + logical :: isbd(5) + + ! + double precision :: degree(4),azimuthal(4) + double precision :: maxdegree + double precision :: epicenter_dis(nt,np) ! epicenter distance from tele source to study region + + ! mesh for 2d eikonal + integer :: nr_2d,nt_2d + double precision :: rr1_2d,rr2_2d,tt1_2d,tt2_2d,dr_2d,dt_2d,r0_2d,t0_2d + double precision,allocatable :: rr_2d(:),tt_2d(:),spha_2d(:,:),sphb_2d(:,:) + double precision,allocatable :: fun_2d(:,:),u_2d(:,:),T_2d(:,:) + character(len=80) :: filename,form1,form2 + logical :: isfile,iscal + integer :: file_nr_2d,file_nt_2d + double precision,allocatable :: file_rr_2d(:),file_tt_2d(:) + + + ! others + double precision,parameter :: pi=3.14159265358979323846264338327950288 + double precision,parameter :: Earth_Radius = 6371.0 + double precision,parameter :: tol=0.001 + integer :: iir,iit,iip,iter ! iteration index + + + ! ---------- 首先,确定二维程函方程的计算范围 first, determine the region for 2d eikonal -------------------- + + ! calculate the degree and azimuthal from the tele-source to the region + ! S-W + call Epicenter_Distance_sphere(tt(1),pp(1),t0,p0,degree(1)) + call Azimuthal_sphere(tt(1),pp(1),t0,p0,azimuthal(1)) + ! S-E + call Epicenter_Distance_sphere(tt(1),pp(np),t0,p0,degree(2)) + call Azimuthal_sphere(tt(1),pp(np),t0,p0,azimuthal(2)) + ! N-W + call Epicenter_Distance_sphere(tt(nt),pp(1),t0,p0,degree(3)) + call Azimuthal_sphere(tt(nt),pp(1),t0,p0,azimuthal(3)) + ! N-E + call Epicenter_Distance_sphere(tt(nt),pp(np),t0,p0,degree(4)) + call Azimuthal_sphere(tt(nt),pp(np),t0,p0,azimuthal(4)) + + ! print *, 'source (lat,lon) = ', t0*180/pi, ' ', p0*180/pi + ! print *, 'degree is ', degree*180/pi + ! print *, 'azimuthal is ', azimuthal*180/pi + + ! ---------- 然后,根据震中距和方位角,确定计算哪些边界,只有4种情况,出现其他情况,请报错 ------------ + ! ---------- determine to activate which boundaries. Only 4 cases, otherwise print error ------------ + maxdegree = max(degree(1),degree(2),degree(3),degree(4)) + if (maxdegree== degree(1)) then + ! N + E + isbd = [ .true. , .false. , .false. , .true. , .true. ] ! isbd: N,S,W,E,B + else if (maxdegree == degree(2)) then + ! N + W + isbd = [ .true. , .false. , .true. , .false. , .true. ] + else if (maxdegree == degree(3)) then + ! S + E + isbd = [ .false. , .true. , .false. , .true. , .true. ] + else if (maxdegree == degree(4)) then + ! S + W + isbd = [ .false. , .true. , .true. , .false. , .true. ] + end if + + ! ---------- if source is on the west or ease direction, N and S boundaries are deactivated + if (t0 > tt(1) .and. t0 < tt(nt)) then + isbd(1) = .false. + isbd(2) = .false. + end if + ! ---------- if source is on the north or south direction, west and east boundaries are deactivated + if (p0 > pp(1) .and. p0 < pp(np)) then + isbd(3) = .false. + isbd(4) = .false. + end if + + + ! ---------- 生成二维网格 ---------------------- + ! ---------- generate 2d mesh ---------------------- + dr_2d = 2.0; dt_2d = pi/1000; + rr1_2d = Earth_Radius-3000; rr2_2d = Earth_Radius+100; + tt1_2d = -10.0/180.0*pi; tt2_2d = 100.0/180.0*pi; + nr_2d = floor((rr2_2d-rr1_2d)/dr_2d)+1; + nt_2d = floor((tt2_2d-tt1_2d)/dt_2d)+1; + + allocate(rr_2d(nr_2d),tt_2d(nt_2d)) + + do iir=1,nr_2d + rr_2d(iir)=rr1_2d+(iir-1)*dr_2d + end do + do iit=1,nt_2d + tt_2d(iit)=tt1_2d+(iit-1)*dt_2d + end do + + + + ! ----------- 读取一维速度文件,产生速度场 ----------------------- + ! ----------- read the 1d velocity file ----------------------- + allocate(fun_2d(nr_2d,nt_2d),spha_2d(nr_2d,nt_2d),sphb_2d(nr_2d,nt_2d),u_2d(nr_2d,nt_2d),T_2d(nr_2d,nt_2d)) + + call Read_1D_velocity_2d(velo_1d_fn,rr_2d,nr_2d,nt_2d,fun_2d) + do iir=1,nr_2d + do iit=1,nt_2d + spha_2d(iir,iit)=1.0; + sphb_2d(iir,iit)=1.0; + u_2d(iir,iit) = 0.0 + T_2d(iir,iit) = 0.0 + end do + end do + ! --------- 速度场文件输出 output 2d velocity file ------------- + filename=trim(TTfield_path)//'/model2d' + inquire(file=filename, exist=isfile) + if (.not. isfile) then + open(10,file=filename) + write(10,*) nr_2d,' ',nt_2d + write(10,*) rr_2d + write(10,*) tt_2d + do iir =1,nr_2d + do iit =1,nt_2d + write(10,*) 1.0/fun_2d(iir,iit) + end do + print *, Earth_Radius - rr_2d(iir), 1.0/fun_2d(iir,1) + end do + close(10) + end if + + ! ----------- 核心,计算对应远震产生的二维走时场 ------------------- + ! ----------- calculate the 2d traveltime field ----------------- + r0_2d = r0; t0_2d = 0.0 + write(*,'(a)') & + & 'calculating 2d traveltime field, region: ' + write(*,'(a, f7.2,a,f7.2,a)') & + & 'Depth: ', Earth_Radius-rr2_2d, ' km - ' ,Earth_Radius-rr1_2d, ' km' + write(*,'(a, f7.2,a,f7.2)') & + & 'Epicenter dis: ', tt1_2d*180.0/pi, ' - ' ,tt2_2d*180.0/pi + write(*,'(a,f7.2,f7.2,i5,i5)') & + & '(dr,dt,nr,nt) = ', dr_2d,dt_2d*180.0/pi,nr_2d,nt_2d + + ! determine the 2d time file name + write(form1,'(i4)') floor(r0) + write(form2,'(i3)') int((r0-floor(r0))*1000) + filename=trim(TTfield_path)//'/traveltime2d_'//trim(form1)//'_'//trim(form2) + + + ! load or calculate the traveltime + inquire(file=filename, exist=isfile) + if (isfile) then + ! if the traveltime file exist, just read it + write(*,'(a,a)') 'file exist, loading ... :', filename + open(10,file=filename) + read(10,*) file_nr_2d,file_nt_2d + allocate(file_rr_2d(file_nr_2d),file_tt_2d(file_nt_2d)) + read(10,*) file_rr_2d + read(10,*) file_tt_2d + if (file_nr_2d == nr_2d .and. file_nt_2d == nt_2d .and. & + & abs(file_rr_2d(1)-rr_2d(1)) old_L1_dif) then + stop_count = stop_count+1 + end if + old_L1_dif = L1_dif + L1_dif=0; Linf_dif=0; + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + + !x: nr <-> 1, y: nt <-> 1, z: np <-> 1 + + do iir=nint(0.5+nr/2.0+(nr/2.0-0.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+0.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-0.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+0.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-0.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+0.5)*pdirec),-pdirec + + + if(ischange(iir,iit,iip)==1) then + if( iir>1 .and. iir1 .and. iit1 .and. iip= 5) then + write(*,*) 'iter ',iter,', T is oscillating' + exit + else + ! write(*,*) 'iter ',iter,', T is changing, L1 dif = ', L1_dif,'L inf dif = ', Linf_dif + end if + + if (iter==MaxIter) then + write(*,*) 'iter ',iter,', max iteration steps' + end if + + end do + +end subroutine + +subroutine FSM_O1_Adj_tele_sphe_3d(rr,tt,pp,nr,nt,np,Table,TableADJ,zeta,xi,eta,Nrec,rrec,trec,prec,sourceADJ,isbd) + + integer :: nr,nt,np,Nrec + double precision :: dr,dt,dp,rr(nr),tt(nt),pp(np) + double precision :: Table(nr,nt,np),TableADJ(nr,nt,np),delta(nr,nt,np) + double precision :: zeta(nr,nt,np),xi(nr,nt,np),eta(nr,nt,np) + double precision :: rrec(Nrec),trec(Nrec),prec(Nrec),sourceADJ(Nrec) + double precision :: a1,a1m(nr,nt,np),a1p(nr,nt,np),a2,a2m(nr,nt,np),a2p(nr,nt,np) + double precision :: b1,b1m(nr,nt,np),b1p(nr,nt,np),b2,b2m(nr,nt,np),b2p(nr,nt,np) + double precision :: c1,c1m(nr,nt,np),c1p(nr,nt,np),c2,c2m(nr,nt,np),c2p(nr,nt,np) + double precision :: coe + logical :: isbd(5) + + integer,parameter :: MaxIter=100 + double precision,parameter :: tol=10.0**(-6),eps=10.0**(-6) + + integer :: iir,iit,iip,idi,idj,idk,rdirec,tdirec,pdirec + double precision :: r1,r2,r3,Linf_dif,tpTabldADJ,Hamilton + double precision :: tmpr1,tmpr2,tmpt1,tmpt2 + + ! ####### 网格间距 mesh size ######## + dr = rr(2)-rr(1) + dt = tt(2)-tt(1) + dp = pp(2)-pp(1) + + ! ################# 构造源项 build the sourece term, the delta function ################# + do iir = 1,nr + do iit = 1,nt + do iip= 1,np + delta(iir,iit,iip) = 0 + TableADJ(iir,iit,iip) = 0 + end do + end do + end do + + + + + ! ------- 遍历每个台站,给予delta函数贡献 loop each station to contribute the delta function ------- + do ir=1,Nrec + idi=floor((rrec(ir)-rr(1))/dr+1); + idj=floor((trec(ir)-tt(1))/dt+1); + idk=floor((prec(ir)-pp(1))/dp+1); + + r1 = min(1.0,(rrec(ir)-rr(idi))/dr); + r2 = min(1.0,(trec(ir)-tt(idj))/dt); + r3 = min(1.0,(prec(ir)-pp(idk))/dp); + + delta(idi,idj,idk) = delta(idi,idj,idk) + sourceADJ(ir)*(1-r1)*(1-r2)*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj,idk) = delta(idi+1,idj,idk) + sourceADJ(ir)*r1*(1-r2)*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi,idj+1,idk) = delta(idi,idj+1,idk) + sourceADJ(ir)*(1-r1)*r2*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj+1,idk) = delta(idi+1,idj+1,idk) + sourceADJ(ir)*r1*r2*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi,idj,idk+1) = delta(idi,idj,idk+1) + sourceADJ(ir)*(1-r1)*(1-r2)*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj,idk+1) = delta(idi+1,idj,idk+1) + sourceADJ(ir)*r1*(1-r2)*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi,idj+1,idk+1) = delta(idi,idj+1,idk+1) + sourceADJ(ir)*(1-r1)*r2*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj+1,idk+1) = delta(idi+1,idj+1,idk+1) + sourceADJ(ir)*r1*r2*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + end do + + ! ################# 构造方程系数 calculate coefficients of equations ################# + do iir = 2,nr-1 + do iit = 2,nt-1 + do iip= 2,np-1 + tmpr1 = (rr(iir-1)+rr(iir))/2; tmpt1 = (tt(iit-1)+tt(iit))/2; + tmpr2 = (rr(iir)+rr(iir+1))/2; tmpt2 = (tt(iit)+tt(iit-1))/2; + + a1 = -(1+zeta(iir-1,iit,iip)+zeta(iir,iit,iip))*(Table(iir,iit,iip)-Table(iir-1,iit,iip))/dr + a1m(iir,iit,iip) = (a1-abs(a1))/2; a1p(iir,iit,iip) = (a1+abs(a1))/2; + a2 = -(1+zeta(iir,iit,iip)+zeta(iir+1,iit,iip))*(Table(iir+1,iit,iip)-Table(iir,iit,iip))/dr + a2m(iir,iit,iip) = (a2-abs(a2))/2; a2p(iir,iit,iip) = (a2+abs(a2))/2; + + !b1 = -(1-xi(iir,iit-1,iip)-xi(iir,iit,iip))/(tmpr1**2)*(Table(iir,iit,iip)-Table(iir,iit-1,iip))/dt & + ! & -(eta(iir,iit-1,iip)+eta(iir,iit,iip))/(cos(tmpt1)*tmpr1**2)/(4*dp) & + b1 = -(1-xi(iir,iit-1,iip)-xi(iir,iit,iip))/(rr(iir)**2)*(Table(iir,iit,iip)-Table(iir,iit-1,iip))/dt & + & -(eta(iir,iit-1,iip)+eta(iir,iit,iip))/(cos(tmpt1)*rr(iir)**2)/(4*dp) & + & *((Table(iir,iit-1,iip+1)-Table(iir,iit-1,iip-1))+(Table(iir,iit,iip+1)-Table(iir,iit,iip-1))) + b1m(iir,iit,iip) = (b1-abs(b1))/2; b1p(iir,iit,iip) = (b1+abs(b1))/2; + + !b2 = -(1-xi(iir,iit,iip)-xi(iir,iit+1,iip))/(tmpr2**2)*(Table(iir,iit+1,iip)-Table(iir,iit,iip))/dt & + ! & -(eta(iir,iit,iip)+eta(iir,iit+1,iip))/(cos(tmpt2)*tmpr2**2)/(4*dp) & + b2 = -(1-xi(iir,iit,iip)-xi(iir,iit+1,iip))/(rr(iir)**2)*(Table(iir,iit+1,iip)-Table(iir,iit,iip))/dt & + & -(eta(iir,iit,iip)+eta(iir,iit+1,iip))/(cos(tmpt2)*rr(iir)**2)/(4*dp) & + & *((Table(iir,iit,iip+1)-Table(iir,iit,iip-1))+(Table(iir,iit+1,iip+1)-Table(iir,iit+1,iip-1))) + b2m(iir,iit,iip) = (b2-abs(b2))/2; b2p(iir,iit,iip) = (b2+abs(b2))/2; + + !c1 = -(eta(iir,iit,iip-1)+eta(iir,iit,iip))/(cos(tmpt1)*tmpr1**2)/(4*dt) & + c1 = -(eta(iir,iit,iip-1)+eta(iir,iit,iip))/(cos(tt(iit))*rr(iir)**2)/(4*dt) & + & *((Table(iir,iit+1,iip-1)-Table(iir,iit-1,iip-1))+(Table(iir,iit+1,iip)-Table(iir,iit-1,iip))) & + ! & -(1+xi(iir,iit,iip-1)+xi(iir,iit,iip))/(cos(tmpt1)**2*tmpr1**2)*(Table(iir,iit,iip)-Table(iir,iit,iip-1))/dp + & -(1+xi(iir,iit,iip-1)+xi(iir,iit,iip))/ & + & (cos(tt(iit))**2*rr(iir)**2)*(Table(iir,iit,iip)-Table(iir,iit,iip-1))/dp + c1m(iir,iit,iip) = (c1-abs(c1))/2; c1p(iir,iit,iip) = (c1+abs(c1))/2; + + !c2 = -(eta(iir,iit,iip)+eta(iir,iit,iip+1))/(cos(tmpt2)*tmpr2**2)/(4*dt) & + c2 = -(eta(iir,iit,iip)+eta(iir,iit,iip+1))/(cos(tt(iit))*rr(iir)**2)/(4*dt) & + & *((Table(iir,iit+1,iip)-Table(iir,iit-1,iip))+(Table(iir,iit+1,iip+1)-Table(iir,iit-1,iip+1))) & + ! & -(1+xi(iir,iit,iip)+xi(iir,iit,iip+1))/(cos(tmpt2)**2*tmpr2**2)*(Table(iir,iit,iip+1)-Table(iir,iit,iip))/dp + & -(1+xi(iir,iit,iip)+xi(iir,iit,iip+1)) & + & /(cos(tt(iit))**2*rr(iir)**2)*(Table(iir,iit,iip+1)-Table(iir,iit,iip))/dp + c2m(iir,iit,iip) = (c2-abs(c2))/2; c2p(iir,iit,iip) = (c2+abs(c2))/2; + + end do + end do + end do + + ! ################ 使用FSM计算伴随场 calculate adjoint field by FSM ###################### + + do iter =1,MaxIter + Linf_dif=0; + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + + !x: nr-1 <-> 2, y: nt-1 <-> 2, z: np-1 <-> 2 + do iir=nint(0.5+nr/2.0+(nr/2.0-0.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+0.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-0.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+0.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-0.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+0.5)*pdirec),-pdirec + + if (iir == 1) then + ! bottom boundary + if (isbd(5)) then + if (TableADJ(3,iit,iip)>=0) then + TableADJ(1,iit,iip) = max(0.0,2*TableADJ(2,iit,iip)-TableADJ(3,iit,iip)) + else + TableADJ(1,iit,iip) = min(0.0,2*TableADJ(2,iit,iip)-TableADJ(3,iit,iip)) + end if + else + TableADJ(1,iit,iip) = 0.0 + end if + + elseif (iir == nr) then + ! Top boundary + TableADJ(nr,iit,iip) = 0.0 + + elseif (iit == 1) then + ! south boundary + if (isbd(2)) then + if (TableADJ(iir,3,iip)>=0) then + TableADJ(iir,1,iip) = max(0.0,2*TableADJ(iir,2,iip)-TableADJ(iir,3,iip)) + else + TableADJ(iir,1,iip) = min(0.0,2*TableADJ(iir,2,iip)-TableADJ(iir,3,iip)) + end if + else + TableADJ(iir,1,iip) = 0.0 + end if + + elseif (iit == nt) then + ! north boundary + if (isbd(1)) then + if (TableADJ(iir,nt-2,iip)>=0) then + TableADJ(iir,nt,iip) = max(0.0,2*TableADJ(iir,nt-1,iip)-TableADJ(iir,nt-2,iip)) + else + TableADJ(iir,nt,iip) = min(0.0,2*TableADJ(iir,nt-1,iip)-TableADJ(iir,nt-2,iip)) + end if + else + TableADJ(iir,nt,iip) = 0.0 + end if + + elseif (iip == 1) then + ! west boundary + if (isbd(3)) then + if (TableADJ(iir,iit,3)>=0) then + TableADJ(iir,iit,1) = max(0.0,2*TableADJ(iir,iit,2)-TableADJ(iir,iit,3)) + else + TableADJ(iir,iit,1) = min(0.0,2*TableADJ(iir,iit,2)-TableADJ(iir,iit,3)) + end if + else + TableADJ(iir,iit,1) = 0.0 + end if + elseif (iip == np) then + ! east boundary + if (isbd(4)) then + if (TableADJ(iir,iit,np-2)>=0) then + TableADJ(iir,iit,np) = max(0.0,2*TableADJ(iir,iit,np-1)-TableADJ(iir,iit,np-2)) + else + TableADJ(iir,iit,np) = min(0.0,2*TableADJ(iir,iit,np-1)-TableADJ(iir,iit,np-2)) + end if + else + TableADJ(iir,iit,np) = 0.0 + end if + else + coe = (a2p(iir,iit,iip)-a1m(iir,iit,iip))/dr & + & +(b2p(iir,iit,iip)-b1m(iir,iit,iip))/dt & + & +(c2p(iir,iit,iip)-c1m(iir,iit,iip))/dp + + if (abs(coe)Linf_dif) then + ! print *, iir,iit,iip,tpTableADJ,TableADJ(iir,iit,iip) + !end if + Linf_dif = max(Linf_dif, abs(tpTableADJ-TableADJ(iir,iit,iip))) + + TableADJ(iir,iit,iip) = tpTableADJ + end if + + end if + + end do + end do + end do + + end do + end do + end do + + + + if (abs(Linf_dif) 2, y: nt-1 <-> 2, z: np-1 <-> 2 + do iir=nint(0.5+nr/2.0+(nr/2.0-1.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+1.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-1.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+1.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-1.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+1.5)*pdirec),-pdirec + + if(ischange(iir,iit,iip)==1) then + sigr = 1.0*sqrt(a(iir,iit,iip))*T0v(iir,iit,iip) + sigt = 1.0*sqrt(b(iir,iit,iip))*T0v(iir,iit,iip) + sigp = 1.0*sqrt(c(iir,iit,iip))*T0v(iir,iit,iip) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + ! 构造单方向梯度 3阶 WENO 格式 + + if (iir==2) then + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + wr2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir+1,iit,iip)+tau(iir+2,iit,iip))**2)/ & + & (eps+(tau(iir-1,iit,iip)-2*tau(iir,iit,iip)+tau(iir+1,iit,iip))**2))**2) + pr2=(1-wr2)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr2*(-3*tau(iir,iit,iip)+4*tau(iir+1,iit,iip)-tau(iir+2,iit,iip))/2/dr; + elseif (iir==nr-1) then + wr1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))**2)/ & + & (eps+(tau(iir+1,iit,iip)-2*tau(iir,iit,iip)+tau(iir-1,iit,iip))**2))**2) + pr1=(1-wr1)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr1*(3*tau(iir,iit,iip)-4*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))/2/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + else + wr1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))**2)/ & + & (eps+(tau(iir+1,iit,iip)-2*tau(iir,iit,iip)+tau(iir-1,iit,iip))**2))**2) + pr1=(1.0-wr1)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr1*(3*tau(iir,iit,iip)-4*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))/2/dr; + wr2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir+1,iit,iip)+tau(iir+2,iit,iip))**2)/ & + & (eps+(tau(iir-1,iit,iip)-2*tau(iir,iit,iip)+tau(iir+1,iit,iip))**2))**2) + pr2=(1.0-wr2)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr2*(-3*tau(iir,iit,iip)+4*tau(iir+1,iit,iip)-tau(iir+2,iit,iip))/2/dr; + end if + + if (iit==2) then + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + wt2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit+1,iip)+tau(iir,iit+2,iip))**2)/ & + & (eps+(tau(iir,iit-1,iip)-2*tau(iir,iit,iip)+tau(iir,iit+1,iip))**2))**2) + pt2=(1.0-wt2)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt2*(-3*tau(iir,iit,iip)+4*tau(iir,iit+1,iip)-tau(iir,iit+2,iip))/2/dt; + elseif (iit==nt-1) then + wt1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))**2)/ & + & (eps+(tau(iir,iit+1,iip)-2*tau(iir,iit,iip)+tau(iir,iit-1,iip))**2))**2) + pt1=(1.0-wt1)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt1*(3*tau(iir,iit,iip)-4*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))/2/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + else + wt1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))**2)/ & + & (eps+(tau(iir,iit+1,iip)-2*tau(iir,iit,iip)+tau(iir,iit-1,iip))**2))**2) + pt1=(1.0-wt1)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt1*(3*tau(iir,iit,iip)-4*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))/2/dt; + wt2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit+1,iip)+tau(iir,iit+2,iip))**2)/ & + & (eps+(tau(iir,iit-1,iip)-2*tau(iir,iit,iip)+tau(iir,iit+1,iip))**2))**2) + pt2=(1-wt2)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt2*(-3*tau(iir,iit,iip)+4*tau(iir,iit+1,iip)-tau(iir,iit+2,iip))/2/dt; + end if + + if (iip==2) then + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + wp2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip+1)+tau(iir,iit,iip+2))**2)/ & + & (eps+(tau(iir,iit,iip-1)-2*tau(iir,iit,iip)+tau(iir,iit,iip+1))**2))**2) + pp2=(1.0-wp2)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp2*(-3*tau(iir,iit,iip)+4*tau(iir,iit,iip+1)-tau(iir,iit,iip+2))/2/dp; + elseif (iip==np-1) then + wp1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))**2)/ & + & (eps+(tau(iir,iit,iip+1)-2*tau(iir,iit,iip)+tau(iir,iit,iip-1))**2))**2) + pp1=(1.0-wp1)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp1*(3*tau(iir,iit,iip)-4*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))/2/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + else + wp1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))**2)/ & + & (eps+(tau(iir,iit,iip+1)-2*tau(iir,iit,iip)+tau(iir,iit,iip-1))**2))**2) + pp1=(1.0-wp1)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp1*(3*tau(iir,iit,iip)-4*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))/2/dp; + wp2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip+1)+tau(iir,iit,iip+2))**2)/ & + & (eps+(tau(iir,iit,iip-1)-2*tau(iir,iit,iip)+tau(iir,iit,iip+1))**2))**2) + pp2=(1.0-wp2)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp2*(-3*tau(iir,iit,iip)+4*tau(iir,iit,iip+1)-tau(iir,iit,iip+2))/2/dp; + end if + + !计算 LF Hamiltonian + + Htau = sqrt( & + & a(iir,iit,iip)*(T0r(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pr1+pr2)/2)**2 & + & + b(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2)**2 & + &-2*f(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2) & + & *(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2) ) + + if (isnan(Htau)) then + print *, iir,iit,iip + print *, a(iir,iit,iip)*(T0r(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pr1+pr2)/2)**2 + print *, b(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2)**2 + print *, c(iir,iit,iip)*(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2)**2 + pause + end if + + ! 更新 timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + !write(*,*) fun(iir,iit,iip),Htau + + tau(iir,iit,iip) = tpT + end if + + + end do + end do + end do + + ! 处理边界 + + do iit=1,nt + do iip=1,np + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + end do + end do + do iir=1,nr + do iip=1,np + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + end do + end do + do iir=1,nr + do iit=1,nt + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + end do + end do + + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip)) + end do + end do + end do + + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_err=L1_err+abs(u(iir,iit,iip)-T0v(iir,iit,iip)*tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(T0v(iir,iit,iip)*tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-2)*(nt-2)*(np-2)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (abs(L1_dif) invr(igrid,ii_invr) .and. rr(iir)<=invr(igrid,ii_invr+1)) then + idr = ii_invr + r1 = (rr(iir) - invr(igrid,idr)) / (invr(igrid,idr+1) - invr(igrid,idr)) ! r1=0 -> r=invr(idr); r1=1 -> r=invr(idr+1) + exit + end if + end do + if (r1 < 0) then + cycle ! 如果与反演网格点无关,考察下一个点 if r is out of inversion grid invr, turn to next point + end if + + do iit=1,nt + + r2 = -1 + do ii_invt = 1,ninvt-1 + if (tt(iit)> invt(igrid,ii_invt) .and. tt(iit)<=invt(igrid,ii_invt+1)) then + idt = ii_invt + r2 = (tt(iit) - invt(igrid,idt)) / (invt(igrid,idt+1) - invt(igrid,idt)) ! r2=0 -> t=invt(idt); r2=1 -> t=invt(idt+1) + exit + end if + end do + if (r2 < 0) then + cycle ! 如果与反演网格点无关,考察下一个点 if t is out of inversion grid invt, turn to next point + end if + + do iip=1,np + r3 = -1 + do ii_invp = 1,ninvp-1 + if (pp(iip)> invp(igrid,ii_invp) .and. pp(iip)<=invp(igrid,ii_invp+1)) then + idp = ii_invp + r3 = (pp(iip) - invp(igrid,idp)) / (invp(igrid,idp+1) - invp(igrid,idp)) ! r3=0 -> p=invp(idp); r3=1 -> p=invp(idp+1) + exit + end if + end do + if (r3 < 0) then + cycle ! 如果与反演网格点无关,考察下一个点 if p is out of inversion grid invp, turn to next point + end if + + do iik=1,nk + invkernel(idr,idt,idp,iik) = invkernel(idr,idt,idp,iik) & + & + (1-r1)*(1-r2)*(1-r3)*all_Kernel(iir,iit,iip,iik) + invkernel(idr+1,idt,idp,iik) = invkernel(idr+1,idt,idp,iik) & + & + r1*(1-r2)*(1-r3)*all_Kernel(iir,iit,iip,iik) + invkernel(idr,idt+1,idp,iik) = invkernel(idr,idt+1,idp,iik) & + & + (1-r1)*r2*(1-r3)*all_Kernel(iir,iit,iip,iik) + invkernel(idr+1,idt+1,idp,iik) = invkernel(idr+1,idt+1,idp,iik) & + & + r1*r2*(1-r3)*all_Kernel(iir,iit,iip,iik) + invkernel(idr,idt,idp+1,iik) = invkernel(idr,idt,idp+1,iik) & + & + (1-r1)*(1-r2)*r3*all_Kernel(iir,iit,iip,iik) + invkernel(idr+1,idt,idp+1,iik) = invkernel(idr+1,idt,idp+1,iik) & + & + r1*(1-r2)*r3*all_Kernel(iir,iit,iip,iik) + invkernel(idr,idt+1,idp+1,iik) = invkernel(idr,idt+1,idp+1,iik) & + & + (1-r1)*r2*r3*all_Kernel(iir,iit,iip,iik) + invkernel(idr+1,idt+1,idp+1,iik) = invkernel(idr+1,idt+1,idp+1,iik) & + & + r1*r2*r3*all_Kernel(iir,iit,iip,iik) + end do + + end do + end do + end do + + ! build update value + do iir=1,nr + r1 = -1 + do ii_invr = 1,ninvr-1 + if (rr(iir)> invr(igrid,ii_invr) .and. rr(iir)<=invr(igrid,ii_invr+1)) then + idr = ii_invr + r1 = (rr(iir) - invr(igrid,idr)) / (invr(igrid,idr+1) - invr(igrid,idr)) ! r1=0 -> r=invr(idr); r1=1 -> r=invr(idr+1) + exit + end if + end do + if (r1 < 0) then + cycle ! 如果与反演网格点无关,考察下一个点 if r is out of inversion grid invr, turn to next point + end if + + do iit=1,nt + r2 = -1 + do ii_invt = 1,ninvt-1 + if (tt(iit)> invt(igrid,ii_invt) .and. tt(iit)<=invt(igrid,ii_invt+1)) then + idt = ii_invt + r2 = (tt(iit) - invt(igrid,idt)) / (invt(igrid,idt+1) - invt(igrid,idt)) ! r2=0 -> t=invt(idt); r2=1 -> t=invt(idt+1) + exit + end if + end do + if (r2 < 0) then + cycle ! 如果与反演网格点无关,考察下一个点 if t is out of inversion grid invt, turn to next point + end if + + do iip=1,np + r3 = -1 + do ii_invp = 1,ninvp-1 + if (pp(iip)> invp(igrid,ii_invp) .and. pp(iip)<=invp(igrid,ii_invp+1)) then + idp = ii_invp + r3 = (pp(iip) - invp(igrid,idp)) / (invp(igrid,idp+1) - invp(igrid,idp)) ! r3=0 -> p=invp(idp); r3=1 -> p=invp(idp+1) + exit + end if + end do + if (r3 < 0) then + cycle ! 如果与反演网格点无关,考察下一个点 if p is out of inversion grid invp, turn to next point + end if + + + do iik=1,nk + pert = 0.0 + pert = pert + invkernel(idr,idt,idp,iik)*(1-r1)*(1-r2)*(1-r3) + pert = pert + invkernel(idr+1,idt,idp,iik)*r1*(1-r2)*(1-r3) + pert = pert + invkernel(idr,idt+1,idp,iik)*(1-r1)*r2*(1-r3) + pert = pert + invkernel(idr+1,idt+1,idp,iik)*r1*r2*(1-r3) + pert = pert + invkernel(idr,idt,idp+1,iik)*(1-r1)*(1-r2)*r3 + pert = pert + invkernel(idr+1,idt,idp+1,iik)*r1*(1-r2)*r3 + pert = pert + invkernel(idr,idt+1,idp+1,iik)*(1-r1)*r2*r3 + pert = pert + invkernel(idr+1,idt+1,idp+1,iik)*r1*r2*r3 + para(iir,iit,iip,iik) = para(iir,iit,iip,iik)+pert + end do + + + end do + end do + end do + + + end do + + + ! rescale + Linf = 0.0 + do iir=1,nr + do iit=1,nt + do iip=1,np + do iik=1,nk + if (Linf < abs(para(iir,iit,iip,iik))) then + Linf = abs(para(iir,iit,iip,iik)) + end if + end do + end do + end do + end do + + do iir=1,nr + do iit=1,nt + do iip=1,np + do iik=1,nk + update_value(iir,iit,iip,iik) = para(iir,iit,iip,iik)/Linf*stepsize + end do + end do + end do + end do + +end subroutine + +! ----------------------- end for ega4 ---------------------- + +! 并行版本 +subroutine FSM_WENO3_PS_sphe_3d_mul_mpi(rr,tt,pp,nr,nt,np,spha,sphb,sphc,sphf,T,fun,r0,t0,p0,u) + + use mpi + ! a -d -e + ! -d b -f + ! -e -f c + integer nr,nt,np + double precision :: dr,dt,dp,rr(nr),tt(nt),pp(np),a(nr,nt,np),b(nr,nt,np),c(nr,nt,np),f(nr,nt,np) + double precision :: spha(nr,nt,np),sphb(nr,nt,np),sphc(nr,nt,np),sphf(nr,nt,np) + double precision :: fun(nr,nt,np),T(nr,nt,np),ischange(nr,nt,np),u(nr,nt,np),xi(nr,nt,np),eta(nr,nt,np) + double precision :: r1,r2,r3,a0,b0,c0,d0,f0,T0v(nr,nt,np),T0r(nr,nt,np),T0t(nr,nt,np),T0p(nr,nt,np) + double precision :: tau(nr,nt,np),tau_old(nr,nt,np),r0,t0,p0 + integer :: idr0,idt0,idp0 + double precision :: sigr,sigt,sigp,coe,pr1,pr2,wr1,wr2,pt1,pt2,wt1,wt2,pp1,pp2,wp1,wp2,tpT + double precision :: L1_dif,Linf_dif,L1_err,Linf_err + double precision :: t1,p1 + double precision,parameter :: tol = (10.0)**(-5),eps=10.0**(-12) + integer,parameter :: MaxIter=1000 + integer iter,rdirec,tdirec,pdirec,iir,iit,iip + double precision :: x0,y0,z0,x,y,z,xst,yst,zst,e11,e12,e13,e21,e22,e23,e31,e32,e33 + double precision :: xstr,xstt,xstp,ystr,ystt,ystp,zstr,zstt,zstp + integer :: ileft,iright,jleft,jright,ii,jj,kk + logical :: isexit + + integer :: ierr,myid,nproc,tag,istat(mpi_status_size),iproc,ptid(nr,np,nt) + integer :: mpi_ptijk(3,np*nt),mpi_ptn,ipt,int_temp,my_npt + double precision :: mpi_ptv(np*nt),dp_temp + + integer :: ptr1,ptr2,iNumber,total_ptn,Nptn,sNptn,tpNptn + double precision :: ave_ni + integer,allocatable :: proc_irange(:,:,:) + + + isexit = .false. + tag=99 + call mpi_comm_rank(mpi_comm_world,myid,ierr) + call mpi_comm_size(mpi_comm_world,nproc,ierr) + + + ! ------------------------ 构造网格 ------------------------ + dr=rr(2)-rr(1); dt=tt(2)-tt(1); dp=pp(2)-pp(1) + + ! ------------------------ 构造矩阵 ------------------------- + ! a -d -e + ! -d b -f + ! -e -f c + + ! ------------------------ 构造 T0 ------------------------ + + ! 震源处参数离散化 + idr0=floor((r0-rr(1))/dr+1); idt0=floor((t0-tt(1))/dt+1); idp0=floor((p0-pp(1))/dp+1); + r1 = min(1.0,(r0-rr(idr0))/dr); r2 = min(1.0,(t0-tt(idt0))/dt); r3 = min(1.0,(p0-pp(idp0))/dp); + + do iir=1,nr + do iit=1,nt + do iip=1,np + a(iir,iit,iip) = spha(iir,iit,iip) + b(iir,iit,iip) = sphb(iir,iit,iip)/(rr(iir)**2) + c(iir,iit,iip) = sphc(iir,iit,iip)/(rr(iir)**2*cos(tt(iit))**2) + f(iir,iit,iip) = sphf(iir,iit,iip)/(rr(iir)**2*cos(tt(iit))) + end do + end do + end do + + a0=(1-r1)*(1-r2)*(1-r3)*a(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*a(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*a(idr0,idt0+1,idp0)+(1-r1)*r2*r3*a(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*a(idr0+1,idt0,idp0)+r1*(1-r2)*r3*a(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*a(idr0+1,idt0+1,idp0)+r1*r2*r3*a(idr0+1,idt0+1,idp0+1) + + b0=(1-r1)*(1-r2)*(1-r3)*b(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*b(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*b(idr0,idt0+1,idp0)+(1-r1)*r2*r3*b(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*b(idr0+1,idt0,idp0)+r1*(1-r2)*r3*b(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*b(idr0+1,idt0+1,idp0)+r1*r2*r3*b(idr0+1,idt0+1,idp0+1) + + c0=(1-r1)*(1-r2)*(1-r3)*c(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*c(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*c(idr0,idt0+1,idp0)+(1-r1)*r2*r3*c(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*c(idr0+1,idt0,idp0)+r1*(1-r2)*r3*c(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*c(idr0+1,idt0+1,idp0)+r1*r2*r3*c(idr0+1,idt0+1,idp0+1) + + f0=(1-r1)*(1-r2)*(1-r3)*f(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*f(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*f(idr0,idt0+1,idp0)+(1-r1)*r2*r3*f(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*f(idr0+1,idt0,idp0)+r1*(1-r2)*r3*f(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*f(idr0+1,idt0+1,idp0)+r1*r2*r3*f(idr0+1,idt0+1,idp0+1) + !d0=-d0 + + fun0=(1-r1)*(1-r2)*(1-r3)*fun(idr0,idt0,idp0)+(1-r1)*(1-r2)*r3*fun(idr0,idt0,idp0+1) & + & +(1-r1)*r2*(1-r3)*fun(idr0,idt0+1,idp0)+(1-r1)*r2*r3*fun(idr0,idt0+1,idp0+1) & + & +r1*(1-r2)*(1-r3)*fun(idr0+1,idt0,idp0)+r1*(1-r2)*r3*fun(idr0+1,idt0,idp0+1) & + & +r1*r2*(1-r3)*fun(idr0+1,idt0+1,idp0)+r1*r2*r3*fun(idr0+1,idt0+1,idp0+1) + + + + ! 构造T0 + do iir=1,nr + do iit=1,nt + do iip=1,np + r1 = rr(iir) + t1 = tt(iit) + p1 = pp(iip) + + T0v(iir,iit,iip) = fun0*sqrt( 1.0/a0*(r1-r0)**2 + c0/(c0*b0-f0**2)*(t1-t0)**2 & + & + b0/(c0*b0-f0**2)*(p1-p0)**2 + 2*f0/(c0*b0-f0**2)*(t1-t0)*(p1-p0) ) + ischange(iir,iit,iip)=1 + if ( T0v(iir,iit,iip)==0 ) then + T0r(iir,iit,iip) = 0 + T0t(iir,iit,iip) = 0 + T0p(iir,iit,iip) = 0 + else + T0r(iir,iit,iip) = fun0**2*(1.0/a0*(r1-r0))/T0v(iir,iit,iip) + T0t(iir,iit,iip) = fun0**2*(c0/(c0*b0-f0**2)*(t1-t0)+f0/(c0*b0-f0**2)*(p1-p0))/T0v(iir,iit,iip) + T0p(iir,iit,iip) = fun0**2*(b0/(c0*b0-f0**2)*(p1-p0)+f0/(c0*b0-f0**2)*(t1-t0))/T0v(iir,iit,iip) + end if + + + if ( abs((rr(iir)-r0)/dr)<=2 .and. abs((tt(iit)-t0)/dt)<=2 .and. abs((pp(iip)-p0)/dp)<= 2) then + tau(iir,iit,iip) = 1 !震源周围几个点,直接认为是常速度结构,给出解析解,即和T0相等 + !tau(iir,iit,iip) = u(iir,iit,iip) - T0v(iir,iit,iip) + ischange(iir,iit,iip)=0 + if (iir==1 .or. iir==nr .or. iit==1 .or. iit==nt .or. iip==1 .or. iip==np) then + write(*,*) 'source on the boundary, mesh error' + print *, rr(iir),iir,t0*180/3.1415927,iit,p0*180/3.1415927,iip + ! pause + end if + !write(*,*) iir-idr0,iit-idt0,iip-idp0,u(iir,iit,iip),T0v(iir,iit,iip),u(iir,iit,iip)-T0v(iir,iit,iip) + else + !tau(iir,iit,iip) = T(iir,iit,iip)/T0v(iir,iit,iip) + tau(iir,iit,iip) = 1 + ischange(iir,iit,iip)=1 + end if + end do + end do + end do + + L1_err=0; Linf_err=0 + do iir=1,nr + do iit=1,nt + do iip=1,np + L1_err=L1_err+abs(u(iir,iit,iip)-T0v(iir,iit,iip)) + Linf_err=max(Linf_err,abs(T0v(iir,iit,iip)-u(iir,iit,iip))) + if(isnan(L1_err)) then + print *, u(iir,iit,iip),T0v(iir,iit,iip) + pause + end if + end do + end do + end do + L1_err = L1_err/(nr*np*nt) + print *, L1_err + + + allocate(proc_irange(2,nproc,nr+nt+np-3-6+1)) + + ! 给每个线程分配计算点 + Nptn=0 + sNptn=0 + + do level = 6,nr+nt+np-3 + ileft = max(2,level-np-nt+2) + iright = min(level-4,nr-1) + + iNumber = iright - ileft + 1 + + total_ptn = 0 + do ip = ileft,iright + total_ptn = total_ptn+(min(level-ip-2,nt-1)-max(2,level-ip-np+1)+1) + end do + Nptn = Nptn + total_ptn ! 总点数 + ave_ni = total_ptn*1.0/nproc + + if (iNumber <= nproc) then + ! 即i的数量小于等于线程数,每个线程分配一个i就好 + tpNptn = 0 + MaxtpNptn = 0 + do ip = ileft,iright + proc_irange(:,ip-ileft+1,level-5)=(/ip,ip/) + tpNptn = (min(level-ip-2,nt-1)-max(2,level-ip-np+1)+1) + MaxtpNptn = max(MaxtpNptn,tpNptn) + end do + do ip = iright+1,ileft+nproc-1 + proc_irange(:,ip-ileft+1,level-5)=(/-1,-2/) + end do + sNptn = sNptn + MaxtpNptn + else + !if (myid .eq. 0) then + ! print *, ileft,iright + !end if + !call sleep(2) + + ! i的数量大于线程数,平均分配,接近 total_ptn/nproc + int_temp = 0 + tpNptn = 0 + MaxtpNptn = 0 + ptr1 = ileft + iproc = 1 + do ptr2 = ileft,iright + int_temp = int_temp + (min(level-ptr2-2,nt-1)-max(2,level-ptr2-np+1)+1) + tpNptn = tpNptn + (min(level-ptr2-2,nt-1)-max(2,level-ptr2-np+1)+1) + !if (myid .eq. 0) then + ! print *, ptr2,(min(level-ptr2-2,nt-1)-max(2,level-ptr2-np+1)+1),int_temp,ave_ni + !end if + !call sleep(2) + if ((int_temp>=ave_ni*iproc) .or. (ptr2 .eq.iright)) then + !if (iproc>nproc) then + ! print *, iproc,nproc + !end if + proc_irange(:,iproc,level-5) = (/ptr1,ptr2/) + ptr1 = ptr2+1 + iproc = iproc +1 + MaxtpNptn = max(MaxtpNptn,tpNptn) + tpNptn = 0 + end if + end do + sNptn = sNptn + MaxtpNptn + !call sleep(2) + end if + !if (myid .eq. 0) then + ! print *, proc_irange(1,:,level-5) + ! print *, proc_irange(2,:,level-5) + ! print *, ' ' + !end if + end do + + ! print *, Nptn*1.0/sNptn + + + ! 正式迭代,更新tau + do iter =1,MaxIter + tau_old = tau + L1_dif=0; Linf_dif=0;L1_err=0;Linf_err=0; + + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + my_npt = 0 + do level = 6,nr+nt+np-3 + ! 2<= ir <= nr-1; 2<= it <= nr-1; 2<=ip <=np-1 + + ileft = max(2,level-np-nt+2) + iright = min(level-4,nr-1) + + mpi_ptn=0 + do ii = proc_irange(1,myid+1,level-5),proc_irange(2,myid+1,level-5) + + jleft = max(2,level-ii-np+1) + jright = min(level-ii-2,nt-1) + do jj = jleft,jright + + kk = level-ii-jj + + if(rdirec<0) then + iir=ii + else + iir=nr+1-ii + end if + if(tdirec<0) then + iit=jj + else + iit=nt+1-jj + end if + if(pdirec<0) then + iip=kk + else + iip=np+1-kk + end if + + + if(ischange(iir,iit,iip)==1) then + + + !sigr=2*sqrt(a(iir,iit,iip)); sigt=2*sqrt(b(iir,iit,iip)); sigp=2*sqrt(c(iir,iit,iip)) + !coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + sigr = 1.0*sqrt(a(iir,iit,iip))*T0v(iir,iit,iip) + sigt = 1.0*sqrt(b(iir,iit,iip))*T0v(iir,iit,iip) + sigp = 1.0*sqrt(c(iir,iit,iip))*T0v(iir,iit,iip) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + ! 构造单方向梯度 3阶 WENO 格式 + + if (iir==2) then + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + wr2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir+1,iit,iip)+tau(iir+2,iit,iip))**2)/ & + & (eps+(tau(iir-1,iit,iip)-2*tau(iir,iit,iip)+tau(iir+1,iit,iip))**2))**2) + pr2=(1-wr2)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr2*(-3*tau(iir,iit,iip)+4*tau(iir+1,iit,iip)-tau(iir+2,iit,iip))/2/dr; + elseif (iir==nr-1) then + wr1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))**2)/ & + & (eps+(tau(iir+1,iit,iip)-2*tau(iir,iit,iip)+tau(iir-1,iit,iip))**2))**2) + pr1=(1-wr1)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr1*(3*tau(iir,iit,iip)-4*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))/2/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + else + wr1=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))**2)/ & + & (eps+(tau(iir+1,iit,iip)-2*tau(iir,iit,iip)+tau(iir-1,iit,iip))**2))**2) + pr1=(1.0-wr1)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr1*(3*tau(iir,iit,iip)-4*tau(iir-1,iit,iip)+tau(iir-2,iit,iip))/2/dr; + wr2=1.0/(1.0+2*((eps+(tau(iir,iit,iip)-2*tau(iir+1,iit,iip)+tau(iir+2,iit,iip))**2)/ & + & (eps+(tau(iir-1,iit,iip)-2*tau(iir,iit,iip)+tau(iir+1,iit,iip))**2))**2) + pr2=(1.0-wr2)*(tau(iir+1,iit,iip)-tau(iir-1,iit,iip))/2/dr+ & + & wr2*(-3*tau(iir,iit,iip)+4*tau(iir+1,iit,iip)-tau(iir+2,iit,iip))/2/dr; + end if + + if (iit==2) then + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + wt2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit+1,iip)+tau(iir,iit+2,iip))**2)/ & + & (eps+(tau(iir,iit-1,iip)-2*tau(iir,iit,iip)+tau(iir,iit+1,iip))**2))**2) + pt2=(1-wt2)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt2*(-3*tau(iir,iit,iip)+4*tau(iir,iit+1,iip)-tau(iir,iit+2,iip))/2/dt; + elseif (iit==nt-1) then + wt1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))**2)/ & + & (eps+(tau(iir,iit+1,iip)-2*tau(iir,iit,iip)+tau(iir,iit-1,iip))**2))**2) + pt1=(1-wt1)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt1*(3*tau(iir,iit,iip)-4*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))/2/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + else + wt1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))**2)/ & + & (eps+(tau(iir,iit+1,iip)-2*tau(iir,iit,iip)+tau(iir,iit-1,iip))**2))**2) + pt1=(1-wt1)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt1*(3*tau(iir,iit,iip)-4*tau(iir,iit-1,iip)+tau(iir,iit-2,iip))/2/dt; + wt2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit+1,iip)+tau(iir,iit+2,iip))**2)/ & + & (eps+(tau(iir,iit-1,iip)-2*tau(iir,iit,iip)+tau(iir,iit+1,iip))**2))**2) + pt2=(1-wt2)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/2/dt+ & + & wt2*(-3*tau(iir,iit,iip)+4*tau(iir,iit+1,iip)-tau(iir,iit+2,iip))/2/dt; + end if + + if (iip==2) then + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + wp2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip+1)+tau(iir,iit,iip+2))**2)/ & + & (eps+(tau(iir,iit,iip-1)-2*tau(iir,iit,iip)+tau(iir,iit,iip+1))**2))**2) + pp2=(1-wp2)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp2*(-3*tau(iir,iit,iip)+4*tau(iir,iit,iip+1)-tau(iir,iit,iip+2))/2/dp; + elseif (iip==np-1) then + wp1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))**2)/ & + & (eps+(tau(iir,iit,iip+1)-2*tau(iir,iit,iip)+tau(iir,iit,iip-1))**2))**2) + pp1=(1-wp1)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp1*(3*tau(iir,iit,iip)-4*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))/2/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + else + wp1=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))**2)/ & + & (eps+(tau(iir,iit,iip+1)-2*tau(iir,iit,iip)+tau(iir,iit,iip-1))**2))**2) + pp1=(1-wp1)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp1*(3*tau(iir,iit,iip)-4*tau(iir,iit,iip-1)+tau(iir,iit,iip-2))/2/dp; + wp2=1.0/(1+2*((eps+(tau(iir,iit,iip)-2*tau(iir,iit,iip+1)+tau(iir,iit,iip+2))**2)/ & + & (eps+(tau(iir,iit,iip-1)-2*tau(iir,iit,iip)+tau(iir,iit,iip+1))**2))**2) + pp2=(1-wp2)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/2/dp+ & + & wp2*(-3*tau(iir,iit,iip)+4*tau(iir,iit,iip+1)-tau(iir,iit,iip+2))/2/dp; + end if + + !计算 LF Hamiltonian + + !Htau=sqrt( a(iir,iit,iip)*((pr1+pr2)/2)**2 + b(iir,iit,iip)*((pt1+pt2)/2)**2 & + !& + c(iir,iit,iip)*((pp1+pp2)/2)**2 -2*f(iir,iit,iip)*(pt1+pt2)/2*(pp1+pp2)/2 & + !& + a(iir,iit,iip)*(pr1+pr2)*T0r(iir,iit,iip) & + !& + b(iir,iit,iip)*(pt1+pt2)*T0t(iir,iit,iip) - f(iir,iit,iip)*(pt1+pt2)*T0p(iir,iit,iip) & + !& + c(iir,iit,iip)*(pp1+pp2)*T0p(iir,iit,iip) - f(iir,iit,iip)*(pp1+pp2)*T0t(iir,iit,iip) & + !& + a(iir,iit,iip)*T0r(iir,iit,iip)**2 & + !& + b(iir,iit,iip)*T0t(iir,iit,iip)**2 + c(iir,iit,iip)*T0p(iir,iit,iip)**2 & + !& - 2*f(iir,iit,iip)*T0t(iir,iit,iip)*T0p(iir,iit,iip) ) + + Htau = sqrt( & + & a(iir,iit,iip)*(T0r(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pr1+pr2)/2)**2 & + & + b(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2)**2 & + &-2*f(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2) & + & *(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2) ) + + + ! 更新 timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + !write(*,*) fun(iir,iit,iip),Htau + + tau(iir,iit,iip) = tpT + + + mpi_ptn=mpi_ptn+1 + mpi_ptijk(:,mpi_ptn) = (/iir,iit,iip/) + mpi_ptv(mpi_ptn) = tpT + my_npt = my_npt + 1 + end if + end do + end do + + !if (1>2) then + ! 数据通信 步骤1, 其他线程传输给主线程 + if (myid .eq. 0) then + ! 负责接受数据 + do iproc=1,nproc-1 + call mpi_recv(int_temp,1,mpi_integer,iproc,tag,mpi_comm_world,istat,ierr) + if (int_temp .ne. 0) then + call mpi_recv(mpi_ptijk(1,mpi_ptn+1),int_temp*3,mpi_integer,iproc,tag+1, & + & mpi_comm_world,istat,ierr) + call mpi_recv(mpi_ptv(mpi_ptn+1),int_temp,mpi_double_precision,iproc,tag+2, & + & mpi_comm_world,istat,ierr) + ! 接收完数据,赋值 + do ipt=mpi_ptn+1,mpi_ptn+int_temp + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + mpi_ptn = mpi_ptn + int_temp + end if + end do + else + ! 负责发送数据 + call mpi_send(mpi_ptn,1,mpi_integer,0,tag,mpi_comm_world,ierr) + !print *, mpi_ptn, mpi_ptijk(:,1:mpi_ptn), mpi_ptv(1:mpi_ptn) + if (mpi_ptn .ne. 0) then + call mpi_send(mpi_ptijk,3*mpi_ptn,mpi_integer,0,tag+1,mpi_comm_world,ierr) + call mpi_send(mpi_ptv,mpi_ptn,mpi_double_precision,0,tag+2,mpi_comm_world,ierr) + end if + end if + + ! 数据通信 步骤2, 主线程将更新后的level数据广播到其他线程 + + call mpi_bcast(mpi_ptn,1,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptijk,3*mpi_ptn,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptv,mpi_ptn,mpi_double_precision,0,mpi_comm_world,ierr) + + ! 数据广播完成,开始赋值 + if (myid .ne. 0) then + do ipt=1,mpi_ptn + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + end if + + call mpi_barrier(mpi_comm_world,ierr) + !end if + end do + + ! print *, my_npt, Nptn + + ! 处理边界 + + do iit=1,nt + do iip=1,np + if (tau(3,iit,iip)>0) then + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + else + tau(1,iit,iip) = min(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + end if + if (tau(nr-2,iit,iip)>0) then + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + else + tau(nr,iit,iip) = min(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + end if + end do + end do + do iir=1,nr + do iip=1,np + if (tau(iir,3,iip)>0) then + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + else + tau(iir,1,iip) = min(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + end if + if (tau(iir,nt-2,iip)>0) then + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + else + tau(iir,nt,iip) = min(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + end if + end do + end do + do iir=1,nr + do iit=1,nt + if (tau(iir,iit,3)>0) then + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + else + tau(iir,iit,1) = min(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + end if + if (tau(iir,iit,np-2)>0) then + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + else + tau(iir,iit,np) = min(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + end if + end do + end do + + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip)) + end do + end do + end do + + do iir=3,nr-2 + do iit=3,nt-2 + do iip=3,np-2 + L1_err=L1_err+abs(u(iir,iit,iip)-T0v(iir,iit,iip)*tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(T0v(iir,iit,iip)*tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-4)*(nt-4)*(np-4)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (myid .eq. 0) then + ! ################ iteration information ################# + if (abs(L1_dif)=ave_ni*iproc) .or. (ptr2 .eq.iright)) then + !if (iproc>nproc) then + ! print *, iproc,nproc + !end if + proc_irange(:,iproc,level-5) = (/ptr1,ptr2/) + ptr1 = ptr2+1 + iproc = iproc +1 + MaxtpNptn = max(MaxtpNptn,tpNptn) + tpNptn = 0 + end if + end do + sNptn = sNptn + MaxtpNptn + !call sleep(2) + end if + !if (myid .eq. 0) then + ! print *, proc_irange(1,:,level-5) + ! print *, proc_irange(2,:,level-5) + ! print *, ' ' + !end if + end do + + ! print *, Nptn*1.0/sNptn + + + ! 正式迭代,更新tau + do iter =1,MaxIter + tau_old = tau + L1_dif=0; Linf_dif=0;L1_err=0;Linf_err=0; + + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + my_npt = 0 + do level = 6,nr+nt+np-3 + ! 2<= ir <= nr-1; 2<= it <= nr-1; 2<=ip <=np-1 + + ileft = max(2,level-np-nt+2) + iright = min(level-4,nr-1) + + mpi_ptn=0 + do ii = proc_irange(1,myid+1,level-5),proc_irange(2,myid+1,level-5) + + jleft = max(2,level-ii-np+1) + jright = min(level-ii-2,nt-1) + do jj = jleft,jright + + kk = level-ii-jj + + if(rdirec<0) then + iir=ii + else + iir=nr+1-ii + end if + if(tdirec<0) then + iit=jj + else + iit=nt+1-jj + end if + if(pdirec<0) then + iip=kk + else + iip=np+1-kk + end if + + + if(ischange(iir,iit,iip)==1) then + + + !sigr=2*sqrt(a(iir,iit,iip)); sigt=2*sqrt(b(iir,iit,iip)); sigp=2*sqrt(c(iir,iit,iip)) + !coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + sigr = 2*sqrt(a(iir,iit,iip))*T0v(iir,iit,iip) + sigt = 2*sqrt(b(iir,iit,iip))*T0v(iir,iit,iip) + sigp = 2*sqrt(c(iir,iit,iip))*T0v(iir,iit,iip) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + ! 构造单方向梯度 1 阶格式 + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + + !计算 LF Hamiltonian + + ! additive + !Htau=sqrt( a(iir,iit,iip)*((pr1+pr2)/2)**2 + b(iir,iit,iip)*((pt1+pt2)/2)**2 & + !& + c(iir,iit,iip)*((pp1+pp2)/2)**2 -2*f(iir,iit,iip)*(pt1+pt2)/2*(pp1+pp2)/2 & + !& + a(iir,iit,iip)*(pr1+pr2)*T0r(iir,iit,iip) & + !& + b(iir,iit,iip)*(pt1+pt2)*T0t(iir,iit,iip) - f(iir,iit,iip)*(pt1+pt2)*T0p(iir,iit,iip) & + !& + c(iir,iit,iip)*(pp1+pp2)*T0p(iir,iit,iip) - f(iir,iit,iip)*(pp1+pp2)*T0t(iir,iit,iip) & + !& + a(iir,iit,iip)*T0r(iir,iit,iip)**2 & + !& + b(iir,iit,iip)*T0t(iir,iit,iip)**2 + c(iir,iit,iip)*T0p(iir,iit,iip)**2 & + !& - 2*f(iir,iit,iip)*T0t(iir,iit,iip)*T0p(iir,iit,iip) ) + + ! multiplicative + Htau = sqrt( & + & a(iir,iit,iip)*(T0r(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pr1+pr2)/2)**2 & + & + b(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2)**2 & + &-2*f(iir,iit,iip)*(T0t(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pt1+pt2)/2) & + & *(T0p(iir,iit,iip)*tau(iir,iit,iip)+T0v(iir,iit,iip)*(pp1+pp2)/2) ) + + + ! 更新 timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + !write(*,*) fun(iir,iit,iip),Htau + + tau(iir,iit,iip) = tpT + + + mpi_ptn=mpi_ptn+1 + mpi_ptijk(:,mpi_ptn) = (/iir,iit,iip/) + mpi_ptv(mpi_ptn) = tpT + my_npt = my_npt + 1 + end if + end do + end do + + !if (1>2) then + ! 数据通信 步骤1, 其他线程传输给主线程 + if (myid .eq. 0) then + ! 负责接受数据 + do iproc=1,nproc-1 + call mpi_recv(int_temp,1,mpi_integer,iproc,tag,mpi_comm_world,istat,ierr) + if (int_temp .ne. 0) then + call mpi_recv(mpi_ptijk(1,mpi_ptn+1),int_temp*3,mpi_integer,iproc,tag+1, & + & mpi_comm_world,istat,ierr) + call mpi_recv(mpi_ptv(mpi_ptn+1),int_temp,mpi_double_precision,iproc,tag+2, & + & mpi_comm_world,istat,ierr) + ! 接收完数据,赋值 + do ipt=mpi_ptn+1,mpi_ptn+int_temp + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + mpi_ptn = mpi_ptn + int_temp + end if + end do + else + ! 负责发送数据 + call mpi_send(mpi_ptn,1,mpi_integer,0,tag,mpi_comm_world,ierr) + !print *, mpi_ptn, mpi_ptijk(:,1:mpi_ptn), mpi_ptv(1:mpi_ptn) + if (mpi_ptn .ne. 0) then + call mpi_send(mpi_ptijk,3*mpi_ptn,mpi_integer,0,tag+1,mpi_comm_world,ierr) + call mpi_send(mpi_ptv,mpi_ptn,mpi_double_precision,0,tag+2,mpi_comm_world,ierr) + end if + end if + + ! 数据通信 步骤2, 主线程将更新后的level数据广播到其他线程 + + call mpi_bcast(mpi_ptn,1,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptijk,3*mpi_ptn,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptv,mpi_ptn,mpi_double_precision,0,mpi_comm_world,ierr) + + ! 数据广播完成,开始赋值 + if (myid .ne. 0) then + do ipt=1,mpi_ptn + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + end if + + call mpi_barrier(mpi_comm_world,ierr) + !end if + end do + + ! print *, my_npt, Nptn + + ! 处理边界 + + do iit=1,nt + do iip=1,np + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + end do + end do + do iir=1,nr + do iip=1,np + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + end do + end do + do iir=1,nr + do iit=1,nt + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + end do + end do + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))*T0v(iir,iit,iip)) + end do + end do + end do + + do iir=3,nr-2 + do iit=3,nt-2 + do iip=3,np-2 + L1_err=L1_err+abs(u(iir,iit,iip)-T0v(iir,iit,iip)*tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(T0v(iir,iit,iip)*tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-4)*(nt-4)*(np-4)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (myid .eq. 0) then + ! ################ iteration information ################# + if (abs(L1_dif)=ave_ni*iproc) .or. (ptr2 .eq.iright)) then + + proc_irange(:,iproc,level-5) = (/ptr1,ptr2/) + ptr1 = ptr2+1 + iproc = iproc +1 + MaxtpNptn = max(MaxtpNptn,tpNptn) + tpNptn = 0 + end if + end do + sNptn = sNptn + MaxtpNptn + end if + end do + + ! print *, Nptn*1.0/sNptn + + + ! 正式迭代,更新tau + do iter =1,MaxIter + tau_old = tau + L1_dif=0; Linf_dif=0;L1_err=0;Linf_err=0; + + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + my_npt = 0 + do level = 6,nr+nt+np-3 + ! 2<= ir <= nr-1; 2<= it <= nr-1; 2<=ip <=np-1 + + ileft = max(2,level-np-nt+2) + iright = min(level-4,nr-1) + + mpi_ptn=0 + do ii = proc_irange(1,myid+1,level-5),proc_irange(2,myid+1,level-5) + + jleft = max(2,level-ii-np+1) + jright = min(level-ii-2,nt-1) + do jj = jleft,jright + + kk = level-ii-jj + + if(rdirec<0) then + iir=ii + else + iir=nr+1-ii + end if + if(tdirec<0) then + iit=jj + else + iit=nt+1-jj + end if + if(pdirec<0) then + iip=kk + else + iip=np+1-kk + end if + + + if(ischange(iir,iit,iip)==1) then + + + !sigr=2*sqrt(a(iir,iit,iip)); sigt=2*sqrt(b(iir,iit,iip)); sigp=2*sqrt(c(iir,iit,iip)) + !coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + sigr = sqrt(a(iir,iit,iip)) + sigt = sqrt(b(iir,iit,iip)) + sigp = sqrt(c(iir,iit,iip)) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + ! partial derivatives + + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + + !计算 LF Hamiltonian + + Htau=sqrt( a(iir,iit,iip)*((pr1+pr2)/2)**2 + b(iir,iit,iip)*((pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*((pp1+pp2)/2)**2 -2*f(iir,iit,iip)*(pt1+pt2)/2*(pp1+pp2)/2) + + ! 更新 update timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + tau(iir,iit,iip) = tpT + + + mpi_ptn=mpi_ptn+1 + mpi_ptijk(:,mpi_ptn) = (/iir,iit,iip/) + mpi_ptv(mpi_ptn) = tpT + my_npt = my_npt + 1 + end if + end do + end do + + !if (1>2) then + ! 数据通信 步骤1, 其他线程传输给主线程 + if (myid .eq. 0) then + ! 负责接受数据 + do iproc=1,nproc-1 + call mpi_recv(int_temp,1,mpi_integer,iproc,tag,mpi_comm_world,istat,ierr) + if (int_temp .ne. 0) then + call mpi_recv(mpi_ptijk(1,mpi_ptn+1),int_temp*3,mpi_integer,iproc,tag+1, & + & mpi_comm_world,istat,ierr) + call mpi_recv(mpi_ptv(mpi_ptn+1),int_temp,mpi_double_precision,iproc,tag+2, & + & mpi_comm_world,istat,ierr) + ! 接收完数据,赋值 + do ipt=mpi_ptn+1,mpi_ptn+int_temp + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + mpi_ptn = mpi_ptn + int_temp + end if + end do + else + ! 负责发送数据 + call mpi_send(mpi_ptn,1,mpi_integer,0,tag,mpi_comm_world,ierr) + !print *, mpi_ptn, mpi_ptijk(:,1:mpi_ptn), mpi_ptv(1:mpi_ptn) + if (mpi_ptn .ne. 0) then + call mpi_send(mpi_ptijk,3*mpi_ptn,mpi_integer,0,tag+1,mpi_comm_world,ierr) + call mpi_send(mpi_ptv,mpi_ptn,mpi_double_precision,0,tag+2,mpi_comm_world,ierr) + end if + end if + + ! 数据通信 步骤2, 主线程将更新后的level数据广播到其他线程 + + call mpi_bcast(mpi_ptn,1,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptijk,3*mpi_ptn,mpi_integer,0,mpi_comm_world,ierr) + call mpi_bcast(mpi_ptv,mpi_ptn,mpi_double_precision,0,mpi_comm_world,ierr) + + ! 数据广播完成,开始赋值 + if (myid .ne. 0) then + do ipt=1,mpi_ptn + tau(mpi_ptijk(1,ipt),mpi_ptijk(2,ipt),mpi_ptijk(3,ipt)) = mpi_ptv(ipt) + end do + end if + + call mpi_barrier(mpi_comm_world,ierr) + !end if + end do + + ! print *, my_npt, Nptn + + ! 处理边界 + + do iit=2,nt-1 + do iip=2,np-1 + if (tau(3,iit,iip)>0) then + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + else + tau(1,iit,iip) = min(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + end if + if (tau(nr-2,iit,iip)>0) then + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + else + tau(nr,iit,iip) = min(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + end if + end do + end do + do iir=2,nr-1 + do iip=2,np-1 + if (tau(iir,3,iip)>0) then + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + else + tau(iir,1,iip) = min(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + end if + if (tau(iir,nt-2,iip)>0) then + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + else + tau(iir,nt,iip) = min(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + end if + end do + end do + do iir=2,nr-1 + do iit=2,nt-1 + if (tau(iir,iit,3)>0) then + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + else + tau(iir,iit,1) = min(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + end if + if (tau(iir,iit,np-2)>0) then + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + else + tau(iir,iit,np) = min(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + end if + end do + end do + + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip)) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))) + end do + end do + end do + + do iir=3,nr-2 + do iit=3,nt-2 + do iip=3,np-2 + L1_err=L1_err+abs(u(iir,iit,iip)-tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-4)*(nt-4)*(np-4)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (myid .eq. 0) then + ! ################ iteration information ################# + if (abs(L1_dif) 2, y: nt-1 <-> 2, z: np-1 <-> 2 + + do iir=nint(0.5+nr/2.0+(nr/2.0-1.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+1.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-1.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+1.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-1.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+1.5)*pdirec),-pdirec + + if(ischange(iir,iit,iip)==1) then + sigr=sqrt(a(iir,iit,iip)); sigt=sqrt(b(iir,iit,iip)); sigp=sqrt(c(iir,iit,iip)) + coe=1.0/((sigr/dr)+(sigt/dt)+(sigp/dp)) + + ! forward and backward partial derivatives + + + pr1=(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr; + pr2=(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr; + + pt1=(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt; + pt2=(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt; + + pp1=(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp; + pp2=(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp; + + + ! calculate LF Hamiltonian + + Htau=sqrt( a(iir,iit,iip)*((pr1+pr2)/2)**2 + b(iir,iit,iip)*((pt1+pt2)/2)**2 & + & + c(iir,iit,iip)*((pp1+pp2)/2)**2 -2*f(iir,iit,iip)*(pt1+pt2)/2*(pp1+pp2)/2 ) + + ! 更新 update timetable + tpT=coe*(fun(iir,iit,iip)-Htau) & + & +coe*(sigr*(pr2-pr1)/2+sigt*(pt2-pt1)/2+sigp*(pp2-pp1)/2)+tau(iir,iit,iip); + + !write(*,*) fun(iir,iit,iip),Htau + + if (tpT < tau(iir,iit,iip)) then + tau(iir,iit,iip) = tpT + end if + + end if + + + end do + end do + end do + + ! boundary + + do iit=1,nt + do iip=1,np + tau(1,iit,iip) = max(2*tau(2,iit,iip)-tau(3,iit,iip),tau(3,iit,iip)) + tau(nr,iit,iip) = max(2*tau(nr-1,iit,iip)-tau(nr-2,iit,iip),tau(nr-2,iit,iip)) + end do + end do + do iir=1,nr + do iip=1,np + tau(iir,1,iip) = max(2*tau(iir,2,iip)-tau(iir,3,iip),tau(iir,3,iip)) + tau(iir,nt,iip) = max(2*tau(iir,nt-1,iip)-tau(iir,nt-2,iip),tau(iir,nt-2,iip)) + end do + end do + do iir=1,nr + do iit=1,nt + tau(iir,iit,1) = max(2*tau(iir,iit,2)-tau(iir,iit,3),tau(iir,iit,3)) + tau(iir,iit,np) = max(2*tau(iir,iit,np-1)-tau(iir,iit,np-2),tau(iir,iit,np-2)) + end do + end do + + + end do + end do + end do + + + + ! 统计误差,判断迭代终止条件 + do iir=2,nr-1 + do iit=2,nt-1 + do iip=2,np-1 + L1_dif=L1_dif+abs(tau(iir,iit,iip)-tau_old(iir,iit,iip)) + Linf_dif=max(Linf_dif,abs(tau(iir,iit,iip)-tau_old(iir,iit,iip))) + end do + end do + end do + + do iir=3,nr-2 + do iit=3,nt-2 + do iip=3,np-2 + L1_err=L1_err+abs(u(iir,iit,iip)-tau(iir,iit,iip)) + Linf_err=max(Linf_err,abs(tau(iir,iit,iip)-u(iir,iit,iip))) + end do + end do + end do + L1_err=L1_err/((nr-4)*(nt-4)*(np-4)) + L1_dif=L1_dif/((nr-2)*(nt-2)*(np-2)) + + if (myid .eq. 0) then + ! ################ iteration information ################# + if (abs(L1_dif)x0 ) then + idx0=iix + exit + end if + end do + do iiy=1,ny-1 + if (yy(iiy)<= y0 .and. yy(iiy+1)>y0 ) then + idy0=iiy + exit + end if + end do + do iiy=1,ny-1 + if (zz(iiz)<= z0 .and. zz(iiz+1)>z0 ) then + idz0=iiz + exit + end if + end do + + if (idx0<=0 .or. idy0<0 .or. idz0<0) then + write(*,*) 'point out of the mesh' + pause + return + end if + + dx = xx(idx0+1)-xx(idx0) + dy = yy(idy0+1)-yy(idy0) + dz = zz(idz0+1)-zz(idz0) + + r1 = min(1.0, (x0-xx(idx0))/dx ) + r2 = min(1.0, (y0-yy(idy0))/dy ) + r3 = min(1.0, (z0-zz(idz0))/dz ) + + v0 = (1-r1)*(1-r2)*(1-r3)*val(idx0,idy0,idz0) + (1-r1)*(1-r2)*r3*val(idx0,idy0,idz0+1) & + & + (1-r1)*r2*(1-r3)*val(idx0,idy0+1,idz0) + (1-r1)*r2*r3*val(idx0,idy0+1,idz0+1) & + & + r1*(1-r2)*(1-r3)*val(idx0+1,idy0,idz0) + r1*(1-r2)*r3*val(idx0+1,idy0,idz0+1) & + & + r1*r2*(1-r3)*val(idx0+1,idy0+1,idz0) + r1*r2*r3*val(idx0+1,idy0+1,idz0+1) +end subroutine + +! 3-D interpolation uniform mesh +subroutine Linear_Interp_3D(xx,yy,zz,val,nx,ny,nz,x0,y0,z0,v0) + integer :: nx,ny,nz,idx0,idy0,idz0 + double precision :: xx(nx),yy(ny),zz(nz),val(nx,ny,nz),x0,y0,z0,v0,dx,dy,dz + double precision :: r1,r2,r3 + integer :: iix,iiy,iiz + + dx = xx(2)-xx(1) + dy = yy(2)-yy(1) + dz = zz(2)-zz(1) + + idx0 = floor((x0-xx(1))/dx)+1 + idy0 = floor((y0-yy(1))/dy)+1 + idz0 = floor((z0-zz(1))/dz)+1 + + if (idx0<1 .or. idx0>nx-1 .or. idy0<1 .or. idy0>ny-1 .or. idz0<1 .or. idz0>nz-1) then + write(*,*) 'point out of the mesh' + pause + return + end if + + r1 = min(1.0, (x0-xx(idx0))/dx ) + r2 = min(1.0, (y0-yy(idy0))/dy ) + r3 = min(1.0, (z0-zz(idz0))/dz ) + + v0 = (1-r1)*(1-r2)*(1-r3)*val(idx0,idy0,idz0) + (1-r1)*(1-r2)*r3*val(idx0,idy0,idz0+1) & + & + (1-r1)*r2*(1-r3)*val(idx0,idy0+1,idz0) + (1-r1)*r2*r3*val(idx0,idy0+1,idz0+1) & + & + r1*(1-r2)*(1-r3)*val(idx0+1,idy0,idz0) + r1*(1-r2)*r3*val(idx0+1,idy0,idz0+1) & + & + r1*r2*(1-r3)*val(idx0+1,idy0+1,idz0) + r1*r2*r3*val(idx0+1,idy0+1,idz0+1) + +end subroutine + +subroutine FSM_O1_Adj_sphe_3d(rr,tt,pp,nr,nt,np,Table,TableADJ,zeta,xi,eta,Nrec,rrec,trec,prec,sourceADJ) + + integer :: nr,nt,np,Nrec + double precision :: dr,dt,dp,rr(nr),tt(nt),pp(np) + double precision :: Table(nr,nt,np),TableADJ(nr,nt,np),delta(nr,nt,np) + double precision :: zeta(nr,nt,np),xi(nr,nt,np),eta(nr,nt,np) + double precision :: rrec(Nrec),trec(Nrec),prec(Nrec),sourceADJ(Nrec) + double precision :: a1,a1m(nr,nt,np),a1p(nr,nt,np),a2,a2m(nr,nt,np),a2p(nr,nt,np) + double precision :: b1,b1m(nr,nt,np),b1p(nr,nt,np),b2,b2m(nr,nt,np),b2p(nr,nt,np) + double precision :: c1,c1m(nr,nt,np),c1p(nr,nt,np),c2,c2m(nr,nt,np),c2p(nr,nt,np) + double precision :: coe + + integer,parameter :: MaxIter=100 + double precision,parameter :: tol=10.0**(-6),eps=10.0**(-6) + + integer :: iir,iit,iip,idi,idj,idk,rdirec,tdirec,pdirec + double precision :: r1,r2,r3,Linf_dif,tpTabldADJ,Hamilton + double precision :: tmpr1,tmpr2,tmpt1,tmpt2 + + ! ####### 网格间距 mesh size ######## + dr = rr(2)-rr(1) + dt = tt(2)-tt(1) + dp = pp(2)-pp(1) + + ! ################# 构造源项 build the sourece term, the delta function ################# + do iir = 1,nr + do iit = 1,nt + do iip= 1,np + delta(iir,iit,iip) = 0 + TableADJ(iir,iit,iip) = 0 + end do + end do + end do + + ! ------- 遍历每个台站,给予delta函数贡献 loop each station to contribute the delta function ------- + do ir=1,Nrec + idi=floor((rrec(ir)-rr(1))/dr+1); + idj=floor((trec(ir)-tt(1))/dt+1); + idk=floor((prec(ir)-pp(1))/dp+1); + + r1 = min(1.0,(rrec(ir)-rr(idi))/dr); + r2 = min(1.0,(trec(ir)-tt(idj))/dt); + r3 = min(1.0,(prec(ir)-pp(idk))/dp); + + delta(idi,idj,idk) = delta(idi,idj,idk) + sourceADJ(ir)*(1-r1)*(1-r2)*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj,idk) = delta(idi+1,idj,idk) + sourceADJ(ir)*r1*(1-r2)*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi,idj+1,idk) = delta(idi,idj+1,idk) + sourceADJ(ir)*(1-r1)*r2*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj+1,idk) = delta(idi+1,idj+1,idk) + sourceADJ(ir)*r1*r2*(1-r3)/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi,idj,idk+1) = delta(idi,idj,idk+1) + sourceADJ(ir)*(1-r1)*(1-r2)*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj,idk+1) = delta(idi+1,idj,idk+1) + sourceADJ(ir)*r1*(1-r2)*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi,idj+1,idk+1) = delta(idi,idj+1,idk+1) + sourceADJ(ir)*(1-r1)*r2*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + delta(idi+1,idj+1,idk+1) = delta(idi+1,idj+1,idk+1) + sourceADJ(ir)*r1*r2*r3/(dr*dp*dt*rrec(ir)**2*cos(trec(ir))) + !print *, delta(idi,idj,idk),delta(idi+1,idj+1,idk+1) + end do + + ! ################# 构造方程系数 calculate coefficients of equations ################# + do iir = 2,nr-1 + do iit = 2,nt-1 + do iip= 2,np-1 + tmpr1 = (rr(iir-1)+rr(iir))/2; tmpt1 = (tt(iit-1)+tt(iit))/2; + tmpr2 = (rr(iir)+rr(iir+1))/2; tmpt2 = (tt(iit)+tt(iit-1))/2; + + a1 = -(1+zeta(iir-1,iit,iip)+zeta(iir,iit,iip))*(Table(iir,iit,iip)-Table(iir-1,iit,iip))/dr + a1m(iir,iit,iip) = (a1-abs(a1))/2; a1p(iir,iit,iip) = (a1+abs(a1))/2; + a2 = -(1+zeta(iir,iit,iip)+zeta(iir+1,iit,iip))*(Table(iir+1,iit,iip)-Table(iir,iit,iip))/dr + a2m(iir,iit,iip) = (a2-abs(a2))/2; a2p(iir,iit,iip) = (a2+abs(a2))/2; + + !b1 = -(1-xi(iir,iit-1,iip)-xi(iir,iit,iip))/(tmpr1**2)*(Table(iir,iit,iip)-Table(iir,iit-1,iip))/dt & + ! & -(eta(iir,iit-1,iip)+eta(iir,iit,iip))/(cos(tmpt1)*tmpr1**2)/(4*dp) & + b1 = -(1-xi(iir,iit-1,iip)-xi(iir,iit,iip))/(rr(iir)**2)*(Table(iir,iit,iip)-Table(iir,iit-1,iip))/dt & + & -(eta(iir,iit-1,iip)+eta(iir,iit,iip))/(cos(tmpt1)*rr(iir)**2)/(4*dp) & + & *((Table(iir,iit-1,iip+1)-Table(iir,iit-1,iip-1))+(Table(iir,iit,iip+1)-Table(iir,iit,iip-1))) + b1m(iir,iit,iip) = (b1-abs(b1))/2; b1p(iir,iit,iip) = (b1+abs(b1))/2; + + !b2 = -(1-xi(iir,iit,iip)-xi(iir,iit+1,iip))/(tmpr2**2)*(Table(iir,iit+1,iip)-Table(iir,iit,iip))/dt & + ! & -(eta(iir,iit,iip)+eta(iir,iit+1,iip))/(cos(tmpt2)*tmpr2**2)/(4*dp) & + b2 = -(1-xi(iir,iit,iip)-xi(iir,iit+1,iip))/(rr(iir)**2)*(Table(iir,iit+1,iip)-Table(iir,iit,iip))/dt & + & -(eta(iir,iit,iip)+eta(iir,iit+1,iip))/(cos(tmpt2)*rr(iir)**2)/(4*dp) & + & *((Table(iir,iit,iip+1)-Table(iir,iit,iip-1))+(Table(iir,iit+1,iip+1)-Table(iir,iit+1,iip-1))) + b2m(iir,iit,iip) = (b2-abs(b2))/2; b2p(iir,iit,iip) = (b2+abs(b2))/2; + + !c1 = -(eta(iir,iit,iip-1)+eta(iir,iit,iip))/(cos(tmpt1)*tmpr1**2)/(4*dt) & + c1 = -(eta(iir,iit,iip-1)+eta(iir,iit,iip))/(cos(tt(iit))*rr(iir)**2)/(4*dt) & + & *((Table(iir,iit+1,iip-1)-Table(iir,iit-1,iip-1))+(Table(iir,iit+1,iip)-Table(iir,iit-1,iip))) & + ! & -(1+xi(iir,iit,iip-1)+xi(iir,iit,iip))/(cos(tmpt1)**2*tmpr1**2)*(Table(iir,iit,iip)-Table(iir,iit,iip-1))/dp + & -(1+xi(iir,iit,iip-1)+xi(iir,iit,iip))/ & + & (cos(tt(iit))**2*rr(iir)**2)*(Table(iir,iit,iip)-Table(iir,iit,iip-1))/dp + c1m(iir,iit,iip) = (c1-abs(c1))/2; c1p(iir,iit,iip) = (c1+abs(c1))/2; + + !c2 = -(eta(iir,iit,iip)+eta(iir,iit,iip+1))/(cos(tmpt2)*tmpr2**2)/(4*dt) & + c2 = -(eta(iir,iit,iip)+eta(iir,iit,iip+1))/(cos(tt(iit))*rr(iir)**2)/(4*dt) & + & *((Table(iir,iit+1,iip)-Table(iir,iit-1,iip))+(Table(iir,iit+1,iip+1)-Table(iir,iit-1,iip+1))) & + ! & -(1+xi(iir,iit,iip)+xi(iir,iit,iip+1))/(cos(tmpt2)**2*tmpr2**2)*(Table(iir,iit,iip+1)-Table(iir,iit,iip))/dp + & -(1+xi(iir,iit,iip)+xi(iir,iit,iip+1)) & + & /(cos(tt(iit))**2*rr(iir)**2)*(Table(iir,iit,iip+1)-Table(iir,iit,iip))/dp + c2m(iir,iit,iip) = (c2-abs(c2))/2; c2p(iir,iit,iip) = (c2+abs(c2))/2; + + end do + end do + end do + + + ! ################# 固定伴随场边界条件 fix the boundary of the adjoint field ###################### + ! -------- R,Theta boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(iir,iit,1) = 0 + TableADJ(iir,iit,np) = 0 + end do + end do + ! -------- R,Phi boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(iir,1,iip) = 0 + TableADJ(iir,nt,iip) = 0 + end do + end do + ! -------- Theta,Phi boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(1,iit,iip) = 0 + TableADJ(nr,iit,iip) = 0 + end do + end do + + + + + ! ################ 使用FSM计算伴随场 calculate adjoint field by FSM ###################### + + do iter =1,MaxIter + Linf_dif=0; + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + + !x: nr-1 <-> 2, y: nt-1 <-> 2, z: np-1 <-> 2 + do iir=nint(0.5+nr/2.0+(nr/2.0-1.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+1.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-1.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+1.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-1.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+1.5)*pdirec),-pdirec + + + coe = (a2p(iir,iit,iip)-a1m(iir,iit,iip))/dr & + & +(b2p(iir,iit,iip)-b1m(iir,iit,iip))/dt & + & +(c2p(iir,iit,iip)-c1m(iir,iit,iip))/dp + + if (abs(coe)Linf_dif) then + ! print *, iir,iit,iip,tpTableADJ,TableADJ(iir,iit,iip) + !end if + Linf_dif = max(Linf_dif, abs(tpTableADJ-TableADJ(iir,iit,iip))) + + TableADJ(iir,iit,iip) = tpTableADJ + end if + + end do + end do + end do + + end do + end do + end do + + + + if (abs(Linf_dif) r1+(iir+0.5)*dr, t1+iit*dt, p1+iip*dp + a0 = T0para(1); b0 = T0para(2); c0 = T0para(3); f0 = T0para(4); fun0 = T0para(5); + r0 = T0para(6); t0 = T0para(7); p0 = T0para(8); + + do iir=1,nr-1 + do iit=1,nt + do iip=1,np + r1 = rr(iir)+0.5*dr; t1 = tt(iit); p1 = pp(iip) + T0v_hr(iir,iit,iip) = fun0*sqrt( 1.0/a0*(r1-r0)**2 + c0/(c0*b0-f0**2)*(t1-t0)**2 & + & + b0/(c0*b0-f0**2)*(p1-p0)**2 + 2*f0/(c0*b0-f0**2)*(t1-t0)*(p1-p0) ) + if ( T0v_hr(iir,iit,iip)==0 ) then + T0r_hr(iir,iit,iip) = 0 + else + T0r_hr(iir,iit,iip) = fun0**2*(1.0/a0*(r1-r0))/T0v_hr(iir,iit,iip) + end if + end do + end do + end do + ! 构造T0_ht iir,iit,iip -> r1+iir*dr, t1+(iit+0.5)*dt, p1+iip*dp + do iir=1,nr + do iit=1,nt-1 + do iip=1,np + r1 = rr(iir); t1 = tt(iit)+0.5*dt; p1 = pp(iip) + T0v_ht(iir,iit,iip) = fun0*sqrt( 1.0/a0*(r1-r0)**2 + c0/(c0*b0-f0**2)*(t1-t0)**2 & + & + b0/(c0*b0-f0**2)*(p1-p0)**2 + 2*f0/(c0*b0-f0**2)*(t1-t0)*(p1-p0) ) + if ( T0v_ht(iir,iit,iip)==0 ) then + T0t_ht(iir,iit,iip) = 0 + T0p_ht(iir,iit,iip) = 0 + else + T0t_ht(iir,iit,iip) = fun0**2*(c0/(c0*b0-f0**2)*(t1-t0)+f0/(c0*b0-f0**2)*(p1-p0))/T0v_ht(iir,iit,iip) + T0p_ht(iir,iit,iip) = fun0**2*(b0/(c0*b0-f0**2)*(p1-p0)+f0/(c0*b0-f0**2)*(t1-t0))/T0v_ht(iir,iit,iip) + end if + end do + end do + end do + ! 构造T0_hp iir,iit,iip -> r1+iir*dr, t1+iit*dt, p1+(iip+0.5)*dp + do iir=1,nr + do iit=1,nt + do iip=1,np-1 + r1 = rr(iir); t1 = tt(iit); p1 = pp(iip)+0.5*dp + T0v_hp(iir,iit,iip) = fun0*sqrt( 1.0/a0*(r1-r0)**2 + c0/(c0*b0-f0**2)*(t1-t0)**2 & + & + b0/(c0*b0-f0**2)*(p1-p0)**2 + 2*f0/(c0*b0-f0**2)*(t1-t0)*(p1-p0) ) + if ( T0v_hp(iir,iit,iip)==0 ) then + T0t_hp(iir,iit,iip) = 0 + T0p_hp(iir,iit,iip) = 0 + else + T0t_hp(iir,iit,iip) = fun0**2*(c0/(c0*b0-f0**2)*(t1-t0)+f0/(c0*b0-f0**2)*(p1-p0))/T0v_hp(iir,iit,iip) + T0p_hp(iir,iit,iip) = fun0**2*(b0/(c0*b0-f0**2)*(p1-p0)+f0/(c0*b0-f0**2)*(t1-t0))/T0v_hp(iir,iit,iip) + end if + end do + end do + end do + + + + + ! ################# 构造方程系数 calculate coefficients of equations ################# + do iir = 2,nr-1 + do iit = 2,nt-1 + do iip= 2,np-1 + tmpt1 = (tt(iit-1)+tt(iit))/2; + tmpt2 = (tt(iit)+tt(iit-1))/2; + + a1 = -(1+zeta(iir-1,iit,iip)+zeta(iir,iit,iip)) & + & *(T0r_hr(iir-1,iit,iip)*(tau(iir,iit,iip)+tau(iir-1,iit,iip))/2 & + & + T0v_hr(iir-1,iit,iip)*(tau(iir,iit,iip)-tau(iir-1,iit,iip))/dr) + a1m(iir,iit,iip) = (a1-abs(a1))/2; a1p(iir,iit,iip) = (a1+abs(a1))/2; + a2 = -(1+zeta(iir,iit,iip)+zeta(iir+1,iit,iip)) & + & *(T0r_hr(iir,iit,iip)*(tau(iir+1,iit,iip)+tau(iir,iit,iip))/2 & + & + T0v_hr(iir,iit,iip)*(tau(iir+1,iit,iip)-tau(iir,iit,iip))/dr) + a2m(iir,iit,iip) = (a2-abs(a2))/2; a2p(iir,iit,iip) = (a2+abs(a2))/2; + + b1 = -(1-xi(iir,iit-1,iip)-xi(iir,iit,iip))/(rr(iir)**2)* & + & (T0t_ht(iir,iit-1,iip)*(tau(iir,iit,iip)+tau(iir,iit-1,iip))/2 & + & + T0v_ht(iir,iit-1,iip)*(tau(iir,iit,iip)-tau(iir,iit-1,iip))/dt) & + & -(eta(iir,iit-1,iip)+eta(iir,iit,iip))/(cos(tmpt1)*rr(iir)**2)* & + & (T0p_ht(iir,iit-1,iip)*(tau(iir,iit,iip)+tau(iir,iit-1,iip))/2 & + & + T0v_ht(iir,iit-1,iip)*(tau(iir,iit-1,iip+1)-tau(iir,iit-1,iip-1) & + & + tau(iir,iit,iip+1)-tau(iir,iit,iip-1))/(4*dp)) + b1m(iir,iit,iip) = (b1-abs(b1))/2; b1p(iir,iit,iip) = (b1+abs(b1))/2; + b2 = -(1-xi(iir,iit,iip)-xi(iir,iit+1,iip))/(rr(iir)**2)* & + & (T0t_ht(iir,iit,iip)*(tau(iir,iit+1,iip)+tau(iir,iit,iip))/2 & + & + T0v_ht(iir,iit,iip)*(tau(iir,iit+1,iip)-tau(iir,iit,iip))/dt) & + & -(eta(iir,iit,iip)+eta(iir,iit+1,iip))/(cos(tmpt2)*rr(iir)**2)* & + & (T0p_ht(iir,iit,iip)*(tau(iir,iit+1,iip)+tau(iir,iit,iip))/2 & + & + T0v_ht(iir,iit,iip)*(tau(iir,iit,iip+1)-tau(iir,iit,iip-1) & + & + tau(iir,iit+1,iip+1)-tau(iir,iit+1,iip-1))/(4*dp)) + b2m(iir,iit,iip) = (b2-abs(b2))/2; b2p(iir,iit,iip) = (b2+abs(b2))/2; + + c1 = -(eta(iir,iit,iip-1)+eta(iir,iit,iip))/(cos(tt(iit))*rr(iir)**2)* & + & (T0t_hp(iir,iit,iip-1)*(tau(iir,iit,iip)+tau(iir,iit,iip-1))/2 & + & + T0v_hp(iir,iit,iip-1)*(tau(iir,iit+1,iip-1)-tau(iir,iit-1,iip-1) & + & +tau(iir,iit+1,iip)-tau(iir,iit-1,iip))/(4*dt)) & + & -(1+xi(iir,iit,iip-1)+xi(iir,iit,iip))/(cos(tt(iit))**2*rr(iir)**2)* & + & (T0p_hp(iir,iit,iip-1)*(tau(iir,iit,iip)+tau(iir,iit,iip-1))/2 & + & + T0v_hp(iir,iit,iip-1)*(tau(iir,iit,iip)-tau(iir,iit,iip-1))/dp) + c1m(iir,iit,iip) = (c1-abs(c1))/2; c1p(iir,iit,iip) = (c1+abs(c1))/2; + c2 = -(eta(iir,iit,iip)+eta(iir,iit,iip+1))/(cos(tt(iit))*rr(iir)**2)* & + & (T0t_hp(iir,iit,iip)*(tau(iir,iit,iip+1)+tau(iir,iit,iip))/2 & + & + T0v_hp(iir,iit,iip)*(tau(iir,iit+1,iip)-tau(iir,iit-1,iip) & + & +tau(iir,iit+1,iip+1)-tau(iir,iit-1,iip+1))/(4*dt)) & + & -(1+xi(iir,iit,iip)+xi(iir,iit,iip+1))/(cos(tt(iit))**2*rr(iir)**2)* & + & (T0p_hp(iir,iit,iip)*(tau(iir,iit,iip+1)+tau(iir,iit,iip))/2 & + & + T0v_hp(iir,iit,iip)*(tau(iir,iit,iip+1)-tau(iir,iit,iip))/dp) + c2m(iir,iit,iip) = (c2-abs(c2))/2; c2p(iir,iit,iip) = (c2+abs(c2))/2; + + end do + end do + end do + + + ! ################# 固定伴随场边界条件 fix the boundary of the adjoint field ###################### + ! -------- R,Theta boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(iir,iit,1) = 0 + TableADJ(iir,iit,np) = 0 + end do + end do + ! -------- R,Phi boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(iir,1,iip) = 0 + TableADJ(iir,nt,iip) = 0 + end do + end do + ! -------- Theta,Phi boundary----- + do iir=1,nr + do iit=1,nt + TableADJ(1,iit,iip) = 0 + TableADJ(nr,iit,iip) = 0 + end do + end do + + + + + ! ################ 使用FSM计算伴随场 calculate adjoint field by FSM ###################### + + do iter =1,MaxIter + Linf_dif=0; + do rdirec = -1,1,2 + do tdirec = -1,1,2 + do pdirec = -1,1,2 + + !x: nr-1 <-> 2, y: nt-1 <-> 2, z: np-1 <-> 2 + do iir=nint(0.5+nr/2.0+(nr/2.0-1.5)*rdirec),nint(0.5+nr/2.0+(-nr/2.0+1.5)*rdirec),-rdirec + do iit=nint(0.5+nt/2.0+(nt/2.0-1.5)*tdirec),nint(0.5+nt/2.0+(-nt/2.0+1.5)*tdirec),-tdirec + do iip=nint(0.5+np/2.0+(np/2.0-1.5)*pdirec),nint(0.5+np/2.0+(-np/2.0+1.5)*pdirec),-pdirec + + + coe = (a2p(iir,iit,iip)-a1m(iir,iit,iip))/dr & + & +(b2p(iir,iit,iip)-b1m(iir,iit,iip))/dt & + & +(c2p(iir,iit,iip)-c1m(iir,iit,iip))/dp + + if (abs(coe)Linf_dif) then + ! print *, iir,iit,iip,tpTableADJ,TableADJ(iir,iit,iip) + !end if + Linf_dif = max(Linf_dif, abs(tpTableADJ-TableADJ(iir,iit,iip))) + + TableADJ(iir,iit,iip) = tpTableADJ + end if + + end do + end do + end do + + end do + end do + end do + + + + if (abs(Linf_dif)ninvr) then + cycle ! 如果与反演网格点无关,考察下一个点 if r is out of inversion grid invr, turn to next point + end if + r1 = (rr(iir)-invr(igrid,1)-(idr-1)*dinvr)/dinvr ! r1=0 -> r=invr(idr); r1=1 -> r=invr(idr+1) + + do iit=1,nt + idt = floor((tt(iit)-invt(igrid,1))/dinvt)+1 + if (idt<0 .or. idt>ninvt) then + cycle ! 如果与反演网格点无关,考察下一个点 + end if + r2 = (tt(iit)-invt(igrid,1)-(idt-1)*dinvt)/dinvt + + do iip=1,np + idp = floor((pp(iip)-invp(igrid,1))/dinvp)+1 + if (idp<0 .or. idp>ninvp) then + cycle ! 如果与反演网格点无关,考察下一个点 + end if + r3 = (pp(iip)-invp(igrid,1)-(idp-1)*dinvp)/dinvp + + if (r1<0 .or. r1>1 .or. r2<0 .or. r2>1 .or. r3<0 .or. r3>1) then + print *, 'error ratio' + pause + end if + + do iik=1,nk + if (idr>=1 .and. idr<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp>=1 .and. idp<=ninvp) then + invkernel(idr,idt,idp,iik) = invkernel(idr,idt,idp,iik) & + & + (1-r1)*(1-r2)*(1-r3)*all_Kernel(iir,iit,iip,iik) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp>=1 .and. idp<=ninvp) then + invkernel(idr+1,idt,idp,iik) = invkernel(idr+1,idt,idp,iik) & + & + r1*(1-r2)*(1-r3)*all_Kernel(iir,iit,iip,iik) + end if + if (idr>=1 .and. idr<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp>=1 .and. idp<=ninvp) then + invkernel(idr,idt+1,idp,iik) = invkernel(idr,idt+1,idp,iik) & + & + (1-r1)*r2*(1-r3)*all_Kernel(iir,iit,iip,iik) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp>=1 .and. idp<=ninvp) then + invkernel(idr+1,idt+1,idp,iik) = invkernel(idr+1,idt+1,idp,iik) & + & + r1*r2*(1-r3)*all_Kernel(iir,iit,iip,iik) + end if + if (idr>=1 .and. idr<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + invkernel(idr,idt,idp+1,iik) = invkernel(idr,idt,idp+1,iik) & + & + (1-r1)*(1-r2)*r3*all_Kernel(iir,iit,iip,iik) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + invkernel(idr+1,idt,idp+1,iik) = invkernel(idr+1,idt,idp+1,iik) & + & + r1*(1-r2)*r3*all_Kernel(iir,iit,iip,iik) + end if + if (idr>=1 .and. idr<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + invkernel(idr,idt+1,idp+1,iik) = invkernel(idr,idt+1,idp+1,iik) & + & + (1-r1)*r2*r3*all_Kernel(iir,iit,iip,iik) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + invkernel(idr+1,idt+1,idp+1,iik) = invkernel(idr+1,idt+1,idp+1,iik) & + & + r1*r2*r3*all_Kernel(iir,iit,iip,iik) + end if + + + end do + + end do + end do + end do + + ! build update value + do iir=1,nr + idr = floor((rr(iir)-invr(igrid,1))/dinvr)+1 ! invr(idr) <= rr(iir) < invr(idr+1) + if (idr<0 .or. idr>ninvr) then + cycle ! 如果与反演网格点无关,考察下一个点 if r is out of inversion grid invr, turn to next point + end if + r1 = (rr(iir)-invr(igrid,1)-(idr-1)*dinvr)/dinvr ! r1=0 -> r=invr(idr); r1=1 -> r=invr(idr+1) + + do iit=1,nt + idt = floor((tt(iit)-invt(igrid,1))/dinvt)+1 + if (idt<0 .or. idt>ninvt) then + cycle ! 如果与反演网格点无关,考察下一个点 + end if + r2 = (tt(iit)-invt(igrid,1)-(idt-1)*dinvt)/dinvt + + do iip=1,np + idp = floor((pp(iip)-invp(igrid,1))/dinvp)+1 + if (idp<0 .or. idp>ninvp) then + cycle ! 如果与反演网格点无关,考察下一个点 + end if + r3 = (pp(iip)-invp(igrid,1)-(idp-1)*dinvp)/dinvp + + if (r1<0 .or. r1>1 .or. r2<0 .or. r2>1 .or. r3<0 .or. r3>1) then + print *, 'error ratio' + pause + end if + + + do iik=1,nk + pert = 0.0 + if (idr>=1 .and. idr<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp>=1 .and. idp<=ninvp) then + pert = pert + invkernel(idr,idt,idp,iik)*(1-r1)*(1-r2)*(1-r3) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp>=1 .and. idp<=ninvp) then + pert = pert + invkernel(idr+1,idt,idp,iik)*r1*(1-r2)*(1-r3) + end if + if (idr>=1 .and. idr<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp>=1 .and. idp<=ninvp) then + pert = pert + invkernel(idr,idt+1,idp,iik)*(1-r1)*r2*(1-r3) + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp>=1 .and. idp<=ninvp) then + pert = pert + invkernel(idr+1,idt+1,idp,iik)*r1*r2*(1-r3) + end if + if (idr>=1 .and. idr<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + pert = pert + invkernel(idr,idt,idp+1,iik)*(1-r1)*(1-r2)*r3 + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt>=1 .and. idt<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + pert = pert + invkernel(idr+1,idt,idp+1,iik)*r1*(1-r2)*r3 + end if + if (idr>=1 .and. idr<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + pert = pert + invkernel(idr,idt+1,idp+1,iik)*(1-r1)*r2*r3 + end if + if (idr+1>=1 .and. idr+1<=ninvr .and. idt+1>=1 .and. idt+1<=ninvt .and.idp+1>=1 .and. idp+1<=ninvp) then + pert = pert + invkernel(idr+1,idt+1,idp+1,iik)*r1*r2*r3 + end if + para(iir,iit,iip,iik) = para(iir,iit,iip,iik)+pert + end do + + + end do + end do + end do + + + end do + + + ! rescale + Linf = 0.0 + do iir=1,nr + do iit=1,nt + do iip=1,np + do iik=1,nk + if (Linf < abs(para(iir,iit,iip,iik))) then + Linf = abs(para(iir,iit,iip,iik)) + end if + end do + end do + end do + end do + + do iir=1,nr + do iit=1,nt + do iip=1,np + do iik=1,nk + update_value(iir,iit,iip,iik) = para(iir,iit,iip,iik)/Linf*stepsize + end do + end do + end do + end do + +end subroutine + +subroutine Kernel_Mask(rr,tt,pp,nr,nt,np,kernel,rsou,tsou,psou,radius) + integer :: nr,nt,np + double precision :: rr(nr),tt(nt),pp(np),rsou,tsou,psou,radius + double precision :: kernel(nr,nt,np),dis + integer :: i,j,k + + do i=1,nr + do j=1,nt + do k=1,np + dis = sqrt((rr(i)-rsou)**2+(rsou*(tt(j)-tsou))**2+(rsou*cos(tsou)*(pp(k)-psou))**2) + if ( dis < radius) then + kernel(i,j,k) = kernel(i,j,k) * 0 + end if + end do + end do + end do +end subroutine + +subroutine Kernel_Mask_new(rr,tt,pp,nr,nt,np,kernel,rsou,tsou,psou) + integer :: nr,nt,np + double precision :: rr(nr),tt(nt),pp(np),rsou,tsou,psou,radius + double precision :: kernel(nr,nt,np),dis + integer :: i,j,k + dr = rr(2)-rr(1); dt = tt(2)-tt(1); dp = pp(2)-pp(1); + do i=1,nr + do j=1,nt + do k=1,np + if ( abs(rr(i)-rsou)6351):\n", + " fun_init[ir,it,ip] = 1.0/(5.8+(6371-rr[ir])/20.0*0.7)\n", + " elif (rr[ir]>6336):\n", + " fun_init[ir,it,ip] = 1.0/(6.5+(6351-rr[ir])/15.0*0.6)\n", + " elif (rr[ir]>5961):\n", + " fun_init[ir,it,ip] = 1.0/(8.0+(6336-rr[ir])/375.0*1) \n", + " else:\n", + " fun_init[ir,it,ip] = 1.0/9.0\n", + "\n", + " vel_init[ir,it,ip] = 1.0/fun_init[ir,it,ip]\n", + "\n", + " # true model\n", + " if (tt[it] >= 30.0/180.0*math.pi and tt[it] <= 50.0/180.0*math.pi \\\n", + " and pp[ip] >= 15.0/180.0*math.pi and pp[ip] <= 40.0/180.0*math.pi \\\n", + " and rr[ir] >= 6211.0 and rr[ir] <= 6371.0):\n", + " c+=1\n", + " sigma = math.sin(4.0*math.pi*(tt[it]-30.0/180.0*math.pi)/(20.0/180.0*math.pi)) \\\n", + " *math.sin(4.0*math.pi*(pp[ip]-15.0/180.0*math.pi)/(25.0/180.0*math.pi)) \\\n", + " *math.sin(2.0*math.pi*(rr[ir]-6211.0)/160.0)\n", + " else:\n", + " sigma = 0.0\n", + "\n", + " if sigma < 0:\n", + " psi = 60.0/180.0*math.pi\n", + " elif sigma > 0:\n", + " psi = 150.0/180.0*math.pi\n", + " else:\n", + " psi = 0.0\n", + "\n", + " eta_true[ir,it,ip] = ani_p*abs(sigma)*math.sin(2.0*psi)\n", + " xi_true[ir,it,ip] = ani_p*abs(sigma)*math.cos(2.0*psi)\n", + " zeta_true[ir,it,ip] = gamma*math.sqrt(eta_true[ir,it,ip]**2 + xi_true[ir,it,ip]**2)\n", + " fun_true[ir,it,ip] = fun_init[ir,it,ip]/(1.0+sigma*slow_p)\n", + " vel_true[ir,it,ip] = 1.0/fun_true[ir,it,ip] \n", + "\n", + "\n", + "\n", + "r_earth = R_earth #6378.1370\n", + "print(\"depminmax {} {}\".format(r_earth-rr1,r_earth-rr2))\n", + "print(c)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# write out\n", + "import h5py\n", + "\n", + "fout_init = h5py.File('test_model_init.h5', 'w')\n", + "fout_true = h5py.File('test_model_true.h5', 'w')\n", + "\n", + "# write out the arrays eta_init, xi_init, zeta_init, fun_init, a_init, b_init, c_init, f_init\n", + "fout_init.create_dataset('eta', data=eta_init)\n", + "fout_init.create_dataset('xi', data=xi_init)\n", + "fout_init.create_dataset('zeta',data=zeta_init)\n", + "fout_init.create_dataset('vel', data=vel_init)\n", + "\n", + "# writeout the arrays eta_true, xi_true, zeta_true, fun_true, a_true, b_true, c_true, f_true\n", + "fout_true.create_dataset('eta', data=eta_true)\n", + "fout_true.create_dataset('xi', data=xi_true)\n", + "fout_true.create_dataset('zeta',data=zeta_true)\n", + "fout_true.create_dataset('vel', data=vel_true)\n", + "\n", + "fout_init.close()\n", + "fout_true.close()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# prepare src station file\n", + "\n", + "```\n", + " 26 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- src  : id_src year month day hour min sec lat lon dep_km mag num_recs id_event\n", + " 26 1 PCBI 1.8900 98.9253 1000.0000 P 10.40 18.000 <- arrival : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arrival_time_sec\n", + " 26 2 MRPI 1.6125 99.3172 1100.0000 P 50.84 19.400\n", + " 26 3 HUTI 2.3153 98.9711 1600.0000 P 57.84 19.200\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "random.seed(123456789)\n", + "\n", + "# dummys\n", + "year_dummy = 1998\n", + "month_dummy = 1\n", + "day_dummy = 1\n", + "hour_dummy = 0\n", + "minute_dummy = 0\n", + "second_dummy = 0\n", + "mag_dummy = 3.0\n", + "id_dummy = 1000\n", + "st_name_dummy = 'AAAA'\n", + "phase_dummy = 'P'\n", + "dist_dummy = 100.0\n", + "arriv_t_dummy = 0.0\n", + "\n", + "tt1deg = tt1 * 180.0/math.pi\n", + "tt2deg = tt2 * 180.0/math.pi\n", + "pp1deg = pp1 * 180.0/math.pi\n", + "pp2deg = pp2 * 180.0/math.pi\n", + "\n", + "\n", + "n_src = 1\n", + "n_rec = [1 for x in range(n_src)]\n", + "\n", + "\n", + "lines = []\n", + "\n", + "pos_src=[]\n", + "pos_rec=[]\n", + "\n", + "# teleseismic events\n", + "n_src_tele = 1\n", + "center_lon = (pp2deg+pp1deg)/2.0\n", + "center_lat = (tt2deg+tt1deg)/2.0\n", + "r_src = 40 # deg\n", + "d_r = 360.0/n_src_tele\n", + "\n", + "# use fixed coordinate for test\n", + "dep_srcs = [50.0]\n", + "lon_srcs = [67.5]\n", + "lat_srcs = [40.0]\n", + "\n", + "elev_recs = []\n", + "lon_recs = []\n", + "lat_recs = []\n", + "\n", + "# read STATIONS\n", + "f = open('fortran_code/ega5/input/STATIONS', 'r')\n", + "for line in f:\n", + " lines.append(line)\n", + "f.close()\n", + "\n", + "n_rec_tmp=0\n", + "for l in lines:\n", + " if l[0] == '#':\n", + " continue\n", + " else:\n", + " items = l.split()\n", + " if (len(items) == 3):\n", + " elev_recs.append(float(items[0]))\n", + " lat_recs.append(float(items[1]))\n", + " lon_recs.append(float(items[2]))\n", + " n_rec_tmp += 1\n", + "\n", + "n_rec[0] = n_rec_tmp\n", + "\n", + "#for i in range(n_src_tele):\n", + "# dep = 50.0\n", + "# lon = math.cos(d_r*i/180.0*math.pi)*r_src + center_lon\n", + "# lat = math.sin(d_r*i/180.0*math.pi)*r_src + center_lat\n", + "# dep_srcs.append(dep)\n", + "# lon_srcs.append(lon)\n", + "# lat_srcs.append(lat)\n", + "#\n", + "## regional events\n", + "#n_src_reg = 0\n", + "#for i in range(n_src_reg):\n", + "# dep = random.uniform(r_earth-rr1,r_earth-rr2)\n", + "# lon = random.uniform(pp1deg,pp2deg)\n", + "# lat = random.uniform(tt1deg,tt2deg)\n", + "# dep_srcs.append(dep)\n", + "# lon_srcs.append(lon)\n", + "# lat_srcs.append(lat)\n", + "#\n", + "#n_src = n_src_tele + n_src_reg\n", + "#\n", + "## create receiver coordinates\n", + "#n_rec = [50 for i in range(n_src)]\n", + "#elev_recs=[]\n", + "#lon_recs=[]\n", + "#lat_recs=[]\n", + "#rec_names=[]\n", + "#for i in range(n_rec[0]):\n", + "# #elev_recs.append(random.uniform(-100.0,-100.0)) # elevation in m\n", + "# elev_recs.append(0) # elevation in m\n", + "# lon_recs .append(random.uniform(pp1deg*1.1,pp2deg*0.9))\n", + "# lat_recs .append(random.uniform(tt1deg*1.1,tt2deg*0.9))\n", + "# rec_names.append(i)\n", + "\n", + "\n", + "\n", + "# create dummy src\n", + "lines=[]\n", + "for i_src in range(n_src):\n", + " # define one point in the domain (rr1 bottom, rr2 top)\n", + " dep = dep_srcs[i_src]\n", + " lon = lon_srcs[i_src]\n", + " lat = lat_srcs[i_src]\n", + "\n", + " src = [i_src, year_dummy, month_dummy, day_dummy, hour_dummy, minute_dummy, second_dummy, lat, lon, dep, mag_dummy, n_rec[i_src], id_dummy]\n", + " lines.append(src)\n", + "\n", + " pos_src.append([lon,lat,dep])\n", + "\n", + " # create dummy station\n", + " for i_rec in range(n_rec[i_src]):\n", + " #elev_rec = random.uniform(0.0,-10.0) # elevation in m\n", + " #lon_rec = random.uniform(pp1deg,pp2deg)\n", + " #lat_rec = random.uniform(tt1deg,tt2deg)\n", + "\n", + " rec = [i_src, i_rec, st_name_dummy+\"_\"+str(i_rec), lat_recs[i_rec], lon_recs[i_rec], elev_recs[i_rec], phase_dummy, dist_dummy, arriv_t_dummy]\n", + " lines.append(rec)\n", + "\n", + " pos_rec.append([lon_recs[i_rec],lat_recs[i_rec],elev_recs[i_rec]])\n", + "\n", + "# write out ev_arrivals file\n", + "fname = 'src_rec_test.dat'\n", + "\n", + "with open(fname, 'w') as f:\n", + " for line in lines:\n", + " for elem in line:\n", + " f.write('{} '.format(elem))\n", + " f.write('\\n')\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# draw src and rec positions\n", + "import matplotlib.pyplot as plt\n", + "\n", + "for i_src in range(n_src):\n", + " plt.scatter(pos_src[i_src][1],pos_src[i_src][0],c='r',marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot receivers\n", + "for i_rec in range(n_rec[0]):\n", + " plt.scatter(pos_rec[i_rec][1],pos_rec[i_rec][0],c='b',marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# output source and receiver file for fortran code\n", + "fname_source = \"EARTHQUAKES_tele\"\n", + "fname_station=\"STATIONS\"\n", + "\n", + "# write out number of sources\n", + "with open(fname_source, 'w') as f:\n", + " f.write('{}\\n'.format(n_src))\n", + " # write out depth lat lon \n", + " for i_src in range(n_src):\n", + " f.write('{} {} {}\\n'.format(dep_srcs[i_src],lat_srcs[i_src],lon_srcs[i_src]))\n", + "\n", + "\n", + "# write out number of stations\n", + "with open(fname_station, 'w') as f:\n", + " f.write('{}\\n'.format(n_rec[0]))\n", + " # write out depth lat lon (convert elevation to depth)\n", + " for i_rec in range(n_rec[0]):\n", + " f.write('{} {} {}\\n'.format(elev_recs[i_rec],lat_recs[i_rec],lon_recs[i_rec]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# write out in ASCIII\n", + "\n", + "#\n", + "\n", + "fname_init = 'test_model_init.dat'\n", + "fname_true = 'test_model_true.dat'\n", + "\n", + "\n", + "# write init model\n", + "with open(fname_init, 'w') as f:\n", + " # write nodes in rtp\n", + " for ir in range(n_rtp[2]):\n", + " for it in range(n_rtp[1]):\n", + " for ip in range(n_rtp[0]):\n", + " # write out eta xi zeta fun fac_a fac_b fac_c fac_f\n", + " f.write(\"{:.16f} {:.16f} {:.16f} {:.16f} {:.16f} {:.16f} {:.16f} {:.16f} {:.16f}\\n\".format(eta_init[ir,it,ip],xi_init[ir,it,ip],zeta_init[ir,it,ip],fun_init[ir,it,ip],vel_init[ir,it,ip],a_init[ir,it,ip],b_init[ir,it,ip],c_init[ir,it,ip],f_init[ir,it,ip]))\n", + "\n", + "\n", + "# write true model\n", + "with open(fname_true, 'w') as f:\n", + " # write nodes in rtp\n", + " for ir in range(n_rtp[2]):\n", + " for it in range(n_rtp[1]):\n", + " for ip in range(n_rtp[0]):\n", + " # write out eta xi zeta fun fac_a fac_b fac_c fac_f\n", + " f.write(\"{:.16f} {:.16f} {:.16f} {:.16f} {:.16f} {:.16f} {:.16f} {:.16f} {:.16f}\\n\".format(eta_true[ir,it,ip],xi_true[ir,it,ip],zeta_true[ir,it,ip],fun_true[ir,it,ip],vel_true[ir,it,ip],a_true[ir,it,ip],b_true[ir,it,ip],c_true[ir,it,ip],f_true[ir,it,ip]))\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "vscode": { + "interpreter": { + "hash": "fbd0b2a7df497f398d93ab2f589d8a5daa3108cfb7ff2b90736653cca3aeadc0" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/inversion_tele_one_src/make_test_model.py b/test/old_tests/inversion_tele_one_src/make_test_model.py new file mode 100644 index 0000000..f6ed5e2 --- /dev/null +++ b/test/old_tests/inversion_tele_one_src/make_test_model.py @@ -0,0 +1,331 @@ +# %% [markdown] +# # notebook for create init and true test model + +# %% +import numpy as np +import math + +# grid +R_earth = 6371.0 #6378.1370 + +rr1=6070 +rr2=6400 +tt1=(30.0-1.5)/180*math.pi +tt2=(50.0+1.5)/180*math.pi +pp1=(15.0-1.5)/180*math.pi +pp2=(40.0+1.5)/180*math.pi + +n_rtp = [55,55,55] +dr = (rr2-rr1)/(n_rtp[0]-1) +dt = (tt2-tt1)/(n_rtp[1]-1) +dp = (pp2-pp1)/(n_rtp[2]-1) +rr = np.array([rr1 + x*dr for x in range(n_rtp[0])]) +tt = np.array([tt1 + x*dt for x in range(n_rtp[1])]) +pp = np.array([pp1 + x*dp for x in range(n_rtp[2])]) + +# initial model +gamma = 0.0 +#s0 = 1.0/6.0 +slow_p=0.04 +ani_p=0.03 + +eta_init = np.zeros(n_rtp) +xi_init = np.zeros(n_rtp) +zeta_init = np.zeros(n_rtp) +fun_init = np.zeros(n_rtp) +vel_init = np.zeros(n_rtp) + +# true model +eta_true = np.zeros(n_rtp) +xi_true = np.zeros(n_rtp) +zeta_true = np.zeros(n_rtp) +fun_true = np.zeros(n_rtp) +vel_true = np.zeros(n_rtp) + +c=0 +for ir in range(n_rtp[2]): + for it in range(n_rtp[1]): + for ip in range(n_rtp[0]): + #eta_init[ir,it,ip] = 0.0 + #xi_init[ir,it,ip] = 0.0 + zeta_init[ir,it,ip] = gamma*math.sqrt(eta_init[ir,it,ip]**2 + xi_init[ir,it,ip]**2) + + if (rr[ir]>6351): + fun_init[ir,it,ip] = 1.0/(5.8+(6371-rr[ir])/20.0*0.7) + elif (rr[ir]>6336): + fun_init[ir,it,ip] = 1.0/(6.5+(6351-rr[ir])/15.0*0.6) + elif (rr[ir]>5961): + fun_init[ir,it,ip] = 1.0/(8.0+(6336-rr[ir])/375.0*1) + else: + fun_init[ir,it,ip] = 1.0/9.0 + + vel_init[ir,it,ip] = 1.0/fun_init[ir,it,ip] + + # true model + if (tt[it] >= 30.0/180.0*math.pi and tt[it] <= 50.0/180.0*math.pi \ + and pp[ip] >= 15.0/180.0*math.pi and pp[ip] <= 40.0/180.0*math.pi \ + and rr[ir] >= 6211.0 and rr[ir] <= 6371.0): + c+=1 + sigma = math.sin(4.0*math.pi*(tt[it]-30.0/180.0*math.pi)/(20.0/180.0*math.pi)) \ + *math.sin(4.0*math.pi*(pp[ip]-15.0/180.0*math.pi)/(25.0/180.0*math.pi)) \ + *math.sin(2.0*math.pi*(rr[ir]-6211.0)/160.0) + else: + sigma = 0.0 + + if sigma < 0: + psi = 60.0/180.0*math.pi + elif sigma > 0: + psi = 150.0/180.0*math.pi + else: + psi = 0.0 + + eta_true[ir,it,ip] = ani_p*abs(sigma)*math.sin(2.0*psi) + xi_true[ir,it,ip] = ani_p*abs(sigma)*math.cos(2.0*psi) + zeta_true[ir,it,ip] = gamma*math.sqrt(eta_true[ir,it,ip]**2 + xi_true[ir,it,ip]**2) + fun_true[ir,it,ip] = fun_init[ir,it,ip]/(1.0+sigma*slow_p) + vel_true[ir,it,ip] = 1.0/fun_true[ir,it,ip] + + + +r_earth = R_earth #6378.1370 +print("depminmax {} {}".format(r_earth-rr1,r_earth-rr2)) +print(c) + + +# %% +# write out +import h5py + +fout_init = h5py.File('test_model_init.h5', 'w') +fout_true = h5py.File('test_model_true.h5', 'w') + +# write out the arrays eta_init, xi_init, zeta_init, fun_init, a_init, b_init, c_init, f_init +fout_init.create_dataset('eta', data=eta_init) +fout_init.create_dataset('xi', data=xi_init) +fout_init.create_dataset('zeta',data=zeta_init) +fout_init.create_dataset('vel', data=vel_init) + +# writeout the arrays eta_true, xi_true, zeta_true, fun_true, a_true, b_true, c_true, f_true +fout_true.create_dataset('eta', data=eta_true) +fout_true.create_dataset('xi', data=xi_true) +fout_true.create_dataset('zeta',data=zeta_true) +fout_true.create_dataset('vel', data=vel_true) + +fout_init.close() +fout_true.close() + + +# %% [markdown] +# # prepare src station file +# +# ``` +# 26 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- src  : id_src year month day hour min sec lat lon dep_km mag num_recs id_event +# 26 1 PCBI 1.8900 98.9253 1000.0000 P 10.40 18.000 <- arrival : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arrival_time_sec +# 26 2 MRPI 1.6125 99.3172 1100.0000 P 50.84 19.400 +# 26 3 HUTI 2.3153 98.9711 1600.0000 P 57.84 19.200 +# +# ``` + +# %% +import random +random.seed(123456789) + +# dummys +year_dummy = 1998 +month_dummy = 1 +day_dummy = 1 +hour_dummy = 0 +minute_dummy = 0 +second_dummy = 0 +mag_dummy = 3.0 +id_dummy = 1000 +st_name_dummy = 'AAAA' +phase_dummy = 'P' +arriv_t_dummy = 0.0 + +tt1deg = tt1 * 180.0/math.pi +tt2deg = tt2 * 180.0/math.pi +pp1deg = pp1 * 180.0/math.pi +pp2deg = pp2 * 180.0/math.pi + + +n_src = 1 +n_rec = [1 for x in range(n_src)] + + +lines = [] + +pos_src=[] +pos_rec=[] + +# teleseismic events +n_src_tele = 1 +center_lon = (pp2deg+pp1deg)/2.0 +center_lat = (tt2deg+tt1deg)/2.0 +r_src = 40 # deg +d_r = 360.0/n_src_tele + +# use fixed coordinate for test +dep_srcs = [50.0] +lon_srcs = [67.5] +lat_srcs = [40.0] + +elev_recs = [] +lon_recs = [] +lat_recs = [] + +# read STATIONS +f = open('fortran_code/ega5/input/STATIONS', 'r') +for line in f: + lines.append(line) +f.close() + +n_rec_tmp=0 +for l in lines: + if l[0] == '#': + continue + else: + items = l.split() + if (len(items) == 3): + elev_recs.append(float(items[0])) + lat_recs.append(float(items[1])) + lon_recs.append(float(items[2])) + n_rec_tmp += 1 + +n_rec[0] = n_rec_tmp + +#for i in range(n_src_tele): +# dep = 50.0 +# lon = math.cos(d_r*i/180.0*math.pi)*r_src + center_lon +# lat = math.sin(d_r*i/180.0*math.pi)*r_src + center_lat +# dep_srcs.append(dep) +# lon_srcs.append(lon) +# lat_srcs.append(lat) +# +## regional events +#n_src_reg = 0 +#for i in range(n_src_reg): +# dep = random.uniform(r_earth-rr1,r_earth-rr2) +# lon = random.uniform(pp1deg,pp2deg) +# lat = random.uniform(tt1deg,tt2deg) +# dep_srcs.append(dep) +# lon_srcs.append(lon) +# lat_srcs.append(lat) +# +#n_src = n_src_tele + n_src_reg +# +## create receiver coordinates +#n_rec = [50 for i in range(n_src)] +#elev_recs=[] +#lon_recs=[] +#lat_recs=[] +#rec_names=[] +#for i in range(n_rec[0]): +# #elev_recs.append(random.uniform(-100.0,-100.0)) # elevation in m +# elev_recs.append(0) # elevation in m +# lon_recs .append(random.uniform(pp1deg*1.1,pp2deg*0.9)) +# lat_recs .append(random.uniform(tt1deg*1.1,tt2deg*0.9)) +# rec_names.append(i) + + + +# create dummy src +lines=[] +for i_src in range(n_src): + # define one point in the domain (rr1 bottom, rr2 top) + dep = dep_srcs[i_src] + lon = lon_srcs[i_src] + lat = lat_srcs[i_src] + + src = [i_src, year_dummy, month_dummy, day_dummy, hour_dummy, minute_dummy, second_dummy, lat, lon, dep, mag_dummy, n_rec[i_src], id_dummy] + lines.append(src) + + pos_src.append([lon,lat,dep]) + + # create dummy station + for i_rec in range(n_rec[i_src]): + #elev_rec = random.uniform(0.0,-10.0) # elevation in m + #lon_rec = random.uniform(pp1deg,pp2deg) + #lat_rec = random.uniform(tt1deg,tt2deg) + + rec = [i_src, i_rec, st_name_dummy+"_"+str(i_rec), lat_recs[i_rec], lon_recs[i_rec], elev_recs[i_rec], phase_dummy, arriv_t_dummy] + lines.append(rec) + + pos_rec.append([lon_recs[i_rec],lat_recs[i_rec],elev_recs[i_rec]]) + +# write out ev_arrivals file +fname = 'src_rec_test.dat' + +with open(fname, 'w') as f: + for line in lines: + for elem in line: + f.write('{} '.format(elem)) + f.write('\n') + + +# %% +# draw src and rec positions +import matplotlib.pyplot as plt + +for i_src in range(n_src): + plt.scatter(pos_src[i_src][1],pos_src[i_src][0],c='r',marker='o') + +# %% +# plot receivers +for i_rec in range(n_rec[0]): + plt.scatter(pos_rec[i_rec][1],pos_rec[i_rec][0],c='b',marker='o') + +# %% +# output source and receiver file for fortran code +fname_source = "EARTHQUAKES_tele" +fname_station="STATIONS" + +# write out number of sources +with open(fname_source, 'w') as f: + f.write('{}\n'.format(n_src)) + # write out depth lat lon + for i_src in range(n_src): + f.write('{} {} {}\n'.format(dep_srcs[i_src],lat_srcs[i_src],lon_srcs[i_src])) + + +# write out number of stations +with open(fname_station, 'w') as f: + f.write('{}\n'.format(n_rec[0])) + # write out depth lat lon (convert elevation to depth) + for i_rec in range(n_rec[0]): + f.write('{} {} {}\n'.format(elev_recs[i_rec],lat_recs[i_rec],lon_recs[i_rec])) + +# %% +# write out in ASCIII + +# + +fname_init = 'test_model_init.dat' +fname_true = 'test_model_true.dat' + + +# write init model +with open(fname_init, 'w') as f: + # write nodes in rtp + for ir in range(n_rtp[2]): + for it in range(n_rtp[1]): + for ip in range(n_rtp[0]): + # write out eta xi zeta fun fac_a fac_b fac_c fac_f + f.write("{:.16f} {:.16f} {:.16f} {:.16f} {:.16f} {:.16f} {:.16f} {:.16f} {:.16f}\n".format(eta_init[ir,it,ip],xi_init[ir,it,ip],zeta_init[ir,it,ip],fun_init[ir,it,ip],vel_init[ir,it,ip],a_init[ir,it,ip],b_init[ir,it,ip],c_init[ir,it,ip],f_init[ir,it,ip])) + + +# write true model +with open(fname_true, 'w') as f: + # write nodes in rtp + for ir in range(n_rtp[2]): + for it in range(n_rtp[1]): + for ip in range(n_rtp[0]): + # write out eta xi zeta fun fac_a fac_b fac_c fac_f + f.write("{:.16f} {:.16f} {:.16f} {:.16f} {:.16f} {:.16f} {:.16f} {:.16f} {:.16f}\n".format(eta_true[ir,it,ip],xi_true[ir,it,ip],zeta_true[ir,it,ip],fun_true[ir,it,ip],vel_true[ir,it,ip],a_true[ir,it,ip],b_true[ir,it,ip],c_true[ir,it,ip],f_true[ir,it,ip])) + + + +# %% + + + diff --git a/test/old_tests/only_source/README.md b/test/old_tests/only_source/README.md new file mode 100644 index 0000000..bf55104 --- /dev/null +++ b/test/old_tests/only_source/README.md @@ -0,0 +1,52 @@ +# Example for Solver only mode + +This example shows how to use the Solver only mode of the tool. + +## compile TOMOATT with solver_only executable + +Uncomment "src/TOMOATT_solver_only.cxx" and "src/TOMOATT_2d_precalc.cxx" in CMakeLists.txt to compile the solver_only executable as below. + +```cmake +# add one by one +set(APP_SOURCES + src/TOMOATT.cxx + src/TOMOATT_solver_only.cxx + src/TOMOATT_2d_precalc.cxx + #src/SrcRecWeight.cxx + ) +``` + +Then recompile the code in the build directory. + + +## pre calculation of source boudary conditions + +As the 2d solver is not parallelized for one single teleseismic source yet, what user can do is calculate multiple teleseismic sources at the same time using simultaneous run. +The precalculation of source boundary conditions can be done by running the following command: + +```bash +mpirun -n 8 ../../build/bin/TOMOATT_2d_precalc -i input_params_pre.yml +``` + +## run the solver_only executable + +Before running the solver_only executable, you need to prepare the input files by running: + +```python +python make_test_model.py +``` + +This creates a src_only_test.dat which includes 8 sources without any receiver. + +Then run the solver_only executable as below. + +```bash +mpirun -n 8 ../../build/bin/TOMOATT_solver_only -i src_only_test.dat +``` + +## check the output files +The result file can be visualize with paraview: +```bash +paraview OUTPUT_FILES/out_data_sim.xmf +``` +or directly open with python etc. Please refer the check_3d_out.ipynb for more details. \ No newline at end of file diff --git a/test/old_tests/only_source/check_3d_out.ipynb b/test/old_tests/only_source/check_3d_out.ipynb new file mode 100644 index 0000000..a8e12b0 --- /dev/null +++ b/test/old_tests/only_source/check_3d_out.ipynb @@ -0,0 +1,91 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'T for source 1')" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# final model\n", + "fpath_T = './OUTPUT_FILES/out_data_sim.h5'\n", + "\n", + "import h5py\n", + "\n", + "# source id to be retrieved\n", + "i_src = 0\n", + "# dataset name\n", + "dsetname = 'T_res_merged_inv_0000'\n", + "\n", + "# read vel, xi, eta dataset \n", + "with h5py.File(fpath_T, 'r') as f:\n", + " T = f['src_{}'.format(i_src)][dsetname][:]\n", + "\n", + "# plot\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "# plot T\n", + "plt.figure()\n", + "plt.imshow(T[5,:,:], origin='lower', aspect='auto')\n", + "plt.colorbar()\n", + "plt.title('T for source {}'.format(i_src))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "vscode": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/only_source/input_params.yml b/test/old_tests/only_source/input_params.yml new file mode 100644 index 0000000..de2d117 --- /dev/null +++ b/test/old_tests/only_source/input_params.yml @@ -0,0 +1,33 @@ +version : 2 + +domain : + min_max_dep : [-10.0, 10.0] # depth in km + min_max_lat : [37.7,42.3] # latitude in degree + min_max_lon : [22.7,27.3] # longitude in degree + n_rtp : [10,50,50] # number of nodes + +source : + src_rec_file : 'src_only_test.dat' # source receiver file (if found, src_dep_lat_lon is ignored) + swap_src_rec : 0 # swap source and receiver # SHOLD BE 0 FOR SOURCE ONLY RUN + +model : + init_model_path : './test_model_true.h5' # path to initial model file (ignored if init_model_type is '1d_*') + +inversion : + run_mode : 0 # 0 for forward simulation only, 1 for inversion + +parallel : + n_sims : 1 # number of simultaneous run + ndiv_rtp : [2,1,1] # number of subdomains + nproc_sub : 2 # number of subprocess used for each subdomain + +calculation : + convergence_tolerance : 1e-4 + max_iterations : 500 + stencil_order : 3 # 1 or 3 + sweep_type : 1 # 0: legacy, 1: cuthill-mckee with shm parallelization + +output_setting : + is_output_source_field : 1 # output the calculated field of all sources 1 for yes; 0 for no; default: 1 + is_verbose_output : 0 # output internal parameters, if no, only model parameters are out. 1 for yes; 0 for no; default: 0 + is_output_model_dat : 0 # output model_parameters_inv_0000.dat or not. 1 for yes; 0 for no; default: 1 diff --git a/test/old_tests/only_source/input_params_pre.yml b/test/old_tests/only_source/input_params_pre.yml new file mode 100644 index 0000000..92b7482 --- /dev/null +++ b/test/old_tests/only_source/input_params_pre.yml @@ -0,0 +1,33 @@ +version : 2 + +domain : + min_max_dep : [-10.0, 10.0] # depth in km + min_max_lat : [37.7,42.3] # latitude in degree + min_max_lon : [22.7,27.3] # longitude in degree + n_rtp : [10,50,50] # number of nodes + +source : + src_rec_file : 'src_only_test.dat' # source receiver file (if found, src_dep_lat_lon is ignored) + swap_src_rec : 0 # swap source and receiver # SHOLD BE 0 FOR SOURCE ONLY RUN + +model : + init_model_path : './test_model_true.h5' # path to initial model file (ignored if init_model_type is '1d_*') + +inversion : + run_mode : 0 # 0 for forward simulation only, 1 for inversion + +parallel : # no mean for 2d pre calculation + n_sims : 8 # number of simultaneous run. use as much as possible for 2d source preparation + ndiv_rtp : [1,1,1] # number of subdomains + nproc_sub : 1 # number of subprocess used for each subdomain + +calculation : + convergence_tolerance : 1e-4 + max_iterations : 500 + stencil_order : 3 # 1 or 3 + sweep_type : 1 # 0: legacy, 1: cuthill-mckee with shm parallelization + +output_setting : + is_output_source_field : 1 # output the calculated field of all sources 1 for yes; 0 for no; default: 1 + is_verbose_output : 0 # output internal parameters, if no, only model parameters are out. 1 for yes; 0 for no; default: 0 + is_output_model_dat : 0 # output model_parameters_inv_0000.dat or not. 1 for yes; 0 for no; default: 1 diff --git a/test/old_tests/only_source/make_test_model.py b/test/old_tests/only_source/make_test_model.py new file mode 100644 index 0000000..15c3e40 --- /dev/null +++ b/test/old_tests/only_source/make_test_model.py @@ -0,0 +1,200 @@ +# %% [markdown] +# # notebook for create init and true test model + +# %% +import numpy as np +import math + +# grid +R_earth = 6371.0 + +rr1=6361 +rr2=6381 +tt1=(38.0-0.3)/180*math.pi +tt2=(42.0+0.3)/180*math.pi +pp1=(23.0-0.3)/180*math.pi +pp2=(27.0+0.3)/180*math.pi + +n_rtp = [10,50,50] +dr = (rr2-rr1)/(n_rtp[0]-1) +dt = (tt2-tt1)/(n_rtp[1]-1) +dp = (pp2-pp1)/(n_rtp[2]-1) +rr = np.array([rr1 + x*dr for x in range(n_rtp[0])]) +tt = np.array([tt1 + x*dt for x in range(n_rtp[1])]) +pp = np.array([pp1 + x*dp for x in range(n_rtp[2])]) + +# initial model +gamma = 0.0 +s0 = 1.0/6.0 +slow_p=0.06 +ani_p=0.04 + +eta_init = np.zeros(n_rtp) +xi_init = np.zeros(n_rtp) +zeta_init = np.zeros(n_rtp) +fun_init = np.zeros(n_rtp) +vel_init = np.zeros(n_rtp) + +# true model +eta_true = np.zeros(n_rtp) +xi_true = np.zeros(n_rtp) +zeta_true = np.zeros(n_rtp) +fun_true = np.zeros(n_rtp) +vel_true = np.zeros(n_rtp) + +c=0 +for ir in range(n_rtp[0]): + for it in range(n_rtp[1]): + for ip in range(n_rtp[2]): + # already initialized above + #eta_init[ir,it,ip] = 0.0 + #xi_init[ir,it,ip] = 0.0 + zeta_init[ir,it,ip] = gamma*math.sqrt(eta_init[ir,it,ip]**2 + xi_init[ir,it,ip]**2) + fun_init[ir,it,ip] = s0 + vel_init[ir,it,ip] = 1.0/s0 + + # true model + if (tt[it] >= 38.0/180.0*math.pi and tt[it] <= 42.0/180.0*math.pi \ + and pp[ip] >= 23.0/180.0*math.pi and pp[ip] <= 27.0/180.0*math.pi): + c+=1 + sigma = math.sin(2.0*math.pi*(tt[it]-38.0/180.0*math.pi)/(4.0/180.0*math.pi))*math.sin(2.0*math.pi*(pp[ip]-23.0/180.0*math.pi)/(4.0/180.0*math.pi)) + else: + sigma = 0.0 + + if sigma < 0: + psi = 60.0/180.0*math.pi + elif sigma > 0: + psi = 120.0/180.0*math.pi + else: + psi = 0.0 + + eta_true[ir,it,ip] = ani_p*abs(sigma)*math.sin(2.0*psi) + xi_true[ir,it,ip] = ani_p*abs(sigma)*math.cos(2.0*psi) + zeta_true[ir,it,ip] = gamma*math.sqrt(eta_true[ir,it,ip]**2 + xi_true[ir,it,ip]**2) + fun_true[ir,it,ip] = s0/(1.0+sigma*slow_p) + vel_true[ir,it,ip] = 1.0/fun_true[ir,it,ip] + + +#r_earth = 6378.1370 +print("depminmax {} {}".format(R_earth-rr1,R_earth-rr2)) +print(c) + + +# %% +# write out in hdf5 format +import h5py + +fout_init = h5py.File('test_model_init.h5', 'w') +fout_true = h5py.File('test_model_true.h5', 'w') + +# write out the arrays eta_init, xi_init, zeta_init, fun_init, a_init, b_init, c_init, f_init +fout_init.create_dataset('eta', data=eta_init) +fout_init.create_dataset('xi', data=xi_init) +fout_init.create_dataset('zeta', data=zeta_init) +fout_init.create_dataset('vel', data=vel_init) + +# writeout the arrays eta_true, xi_true, zeta_true, fun_true, a_true, b_true, c_true, f_true +fout_true.create_dataset('eta', data=eta_true) +fout_true.create_dataset('xi', data=xi_true) +fout_true.create_dataset('zeta', data=zeta_true) +fout_true.create_dataset('vel', data=vel_true) + +fout_init.close() +fout_true.close() + + +# %% [markdown] +# # prepare src station file +# +# The following code creates a src_rec_file for the inversion, which describes the source and receiver positions and arrival times. +# Format is as follows: +# +# ``` +# 26 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- src  : id_src year month day hour min sec lat lon dep_km mag num_recs id_event +# 26 1 PCBI 1.8900 98.9253 1000.0000 P 10.40 18.000 <- arrival : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arrival_time_sec +# 26 2 MRPI 1.6125 99.3172 1100.0000 P 50.84 19.400 +# 26 3 HUTI 2.3153 98.9711 1600.0000 P 57.84 19.200 +# .... +# +# ``` + +# %% +import random +random.seed(1145141919810) + +# dummys +year_dummy = 1998 +month_dummy = 1 +day_dummy = 1 +hour_dummy = 0 +minute_dummy = 0 +second_dummy = 0 +mag_dummy = 3.0 +id_dummy = 1000 +st_name_dummy = 'AAAA' +phase_dummy = 'P' +arriv_t_dummy = 0.0 + +tt1deg = tt1 * 180.0/math.pi +tt2deg = tt2 * 180.0/math.pi +pp1deg = pp1 * 180.0/math.pi +pp2deg = pp2 * 180.0/math.pi + + +n_srcs = 8 # source will be placed around the domain +r_src = 15 # radius of the source in degree + +lines = [] + +#nij_rec = math.sqrt(n_rec[0]) + +pos_src=[] +#pos_rec=[] + +# center of the domain +lon_c = (pp1deg+pp2deg)/2.0 +lat_c = (tt1deg+tt2deg)/2.0 + +# step of angle in degree = 360.0/n_srcs +d_deg = 360.0/n_srcs + +for i_src in range(n_srcs): + + i_deg = i_src*d_deg + lon = lon_c + r_src*math.cos(i_deg/180.0*math.pi) + lat = lat_c + r_src*math.sin(i_deg/180.0*math.pi) + # depth of the source + dep = 10.0 + 0.5*i_src + + src = [i_src, year_dummy, month_dummy, day_dummy, hour_dummy, minute_dummy, second_dummy, lat, lon, dep, mag_dummy, 0, id_dummy] + lines.append(src) + + pos_src.append([lon,lat,dep]) + + +# write out ev_arrivals file +fname = 'src_only_test.dat' + +with open(fname, 'w') as f: + for line in lines: + for elem in line: + f.write('{} '.format(elem)) + f.write('\n') + + +# %% +# draw src and rec positions +import matplotlib.pyplot as plt + +for i_src in range(n_srcs): + plt.scatter(pos_src[i_src][1],pos_src[i_src][0],c='r',marker='o') + +# %% +# plot receivers +#for i_rec in range(n_rec[0]): +# plt.scatter(pos_rec[i_rec][1],pos_rec[i_rec][0],c='b',marker='o') + +# %% + + + diff --git a/test/old_tests/solver_performance/analysis_iter.ipynb b/test/old_tests/solver_performance/analysis_iter.ipynb new file mode 100644 index 0000000..a6fd33a --- /dev/null +++ b/test/old_tests/solver_performance/analysis_iter.ipynb @@ -0,0 +1,98 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXgAAAD4CAYAAADmWv3KAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAhDklEQVR4nO3de5RcZbnn8e/TnW66A0wa0pmj6Q6nw1kxhxgSgg2KYVTCkYuHm4yEi4Nm5giDiAo4uIKuxWExzhDBdQIcHJGDTMwMCiGGGBQHGYIgokJCbiTIGPBCd+IhJCYY0iGd1DN/7KqkunpX16V31d5V9fus1au7qnZVvZ3Ls9969vM+r7k7IiJSf5riHoCIiFSGAryISJ1SgBcRqVMK8CIidUoBXkSkTo2J6407Ozu9p6cnrrcXEalJq1evftPdJxRzbGwBvqenh1WrVsX19iIiNcnM/lDssUrRiIjUKQV4EZE6pQAvIlKnYsvBi4iUanBwkL6+Pvbu3Rv3UCqura2N7u5uWlpayn4NBXgRqRl9fX0ceeSR9PT0YGZxD6di3J3t27fT19fH5MmTy36dxknRrF8CC6fDzR3B9/VL4h6RiJRo7969jB8/vq6DO4CZMX78+FF/UmmMGfz6JfDoF2BwILi96/XgNsCMufGNS0RKVu/BPSOK37MxZvBP3nIouGcMDsAjV2lGLyJ1qzFm8Lv6wu/3A+nHX2dg2TXMf3ANTx92Gmawc88gEzvaueHMqVwwq6t6YxWRujRv3jzOOeccPvGJT1TtPeszwK9fEszad/XBuG5oPwoGdoz4lHbe4YYxS/jhwKkH7+vfOcB1D63l2ofW0qVgLyI1pv4CfFi+vakFmlvhwL4Rn9plb/LaYZexxTu5bf9cVqROJbPfVf/OAW5ctgFAQV6kRixf08/tj7/Clp0DkX0iX7x4Md/4xjcwM2bMmEFzc/OQmfkRRxzB7t27cXc+//nP88QTTzBp0iRaW1sPvsYtt9zCo48+ysDAAB/84Af59re/XZFrC/WXgw/Lt6cGofUI9rS/mxTGfg//tc2gyaC76U0WtNzHeU3PDnl8YPAAtz/+SqVGLiIRWr6mnxuXbaB/5wDOoUna8jX9Zb/mxo0b+drXvsbKlStZt24dd955Z95jH3nkEV555RU2bdrE4sWLee655w4+ds011/DCCy/w0ksvMTAwwI9+9KOyxzSS2gzwI5U85sm3+8Cfed/uOzh27wNcP3gVe7w19LiMsbaPL48ZfuF1y86BkKNFJGluf/wVBgYPDLlvtJO0lStXctFFF9HZ2QnA0UcfnffYZ555hksvvZTm5mYmTpzInDlzDj721FNP8f73v5/jjz+elStXsnHjxrLHNJLaC/CZFMyu1wEPvi+/Gr4+OQj4Fv4r9afGH/zLXpE6lfmDn6Ev1UnKjXz7jk+07cPuc2D2gpWjmgWISOXlm4xFPUkbM2YMqVQKgFQqxb59I6eC9+7dy9VXX83SpUvZsGEDV1xxRcVW5tZegM+XghnYAfihypgse7yV2/YPrXdfkTqVU/fdxbHvPEC/d4a+1RYfH3p/FB/1RKSyJna0l3R/MebMmcPDDz/M9u3B5G/Hjh309PSwevVqAFasWMHg4CAAH/rQh3jooYc4cOAAW7du5amnngI4GMw7OzvZvXs3S5cuLXs8hdRegM9X8pjLmklh9KU6mT/4GVakTs176G375zKQm7JpaeedyX/Hr9q+yGuHXcazrV8YkpNXPl4k2W44cyrtLc1D7mtvaeaGM6eW/Zrvfe97+epXv8qHP/xhZs6cyfXXX88VV1zB008/zcyZM/nlL3/J4YcfDsDHP/5xpkyZwrRp0/jUpz7FKaecAkBHRwdXXHEF06dP58wzz+Skk04q/5cswDxffqLCent7vawNPxZOT6dnRpbCOHbvAyMeYwQpl66Odu6Y9ltOevWfD5VWTjkD1n1vyKeFPd465GRhwO8W/H3pv4OIlOXll1/muOOOK/r4SlTRVFPY72tmq929t5jn116Z5Ok3DS2DzGNLKjy9kjG8rn0O8J8PHbBw+rD3yFx4XbEvCPCj+agnIpV3wayumgroUau9AJ/pHZNZyNR+FOzbPaTGPSznntHe0sytFx5f+C89Tyooc+F1tB/1REQqrfYCPARBPrtJWNbK1b7U+IOLlHKVtBp1XHdoKiiF8VrbJ/kT4/n6w3O5/fGP1tzHPhFpDLUZ4HNlBfyLF6ykP6QMqqujnV/MnzPs/rzypILGWFAONZE3ubXlPua/BTcuCz49KMiLSJLUXhVNAZFdOZ8xF869C8ZNAgysedghmZy8KmpEJInqYwafJTOLjuTKeXYq6OaO0EMyOXmtcBWRpKmbAF/xcqg8OfnMYihV1IhI0tRFiqYSTYWGOf0maBkaxN/xZsbaXl477JM8YVdr0xARSZSCAd7MJpnZU2a2ycw2mtkXQ475iJntMrO16a+bKjPccJVoKjRMVk7eMXZyJIZxtO2myZyxA1uDi7IK8iLJUYG9mBcvXsyMGTOYOXMml19+OfPmzeOqq66it7eX97znPQc7Qy5atIhrrrnm4PPOOeccfvazn436/UtRTIpmP/Ald3/RzI4EVpvZE+6+Kee4n7v7OdEPsbBqNRXK5OQN6Fg4HXb9ZejjgwNBuab2eRWJXwX2Ys60C37uuefo7Oxkx44dXH/99fz+97/n+eef59VXX+W0005j8+bNEf0So1NwBu/uW939xfTPfwFeBhJVD1iJpkIF5WtLXGyvHBGprHx7MT95S9kvma9d8Ny5c2lqamLKlCkce+yx/OY3vyn7PaJUUg7ezHqAWcCvQx4+xczWmdlPzOy9eZ5/pZmtMrNV27ZtK320eVSiqVBB47pD797i49VlUiQJ8k22KjAJy92NycyGtBEGKtYSeCRFB3gzOwL4AXCtu7+V8/CLwF+7+0zgn4HlYa/h7ve6e6+7906YMKHMIR+yfE0/sxes5LqH1nLYmCaOGtuCESxqKqodwWicfhMDHDbkrj3eyv89cAIf+OGHI835iUgZ8kzC8t5fhLB2wQAPP/wwqVSKV199lddee42pU6fS09PD2rVrSaVSvP766zz//PNlv2+5iiqTNLMWguD+gLsvy308O+C7+2Nm9j/MrNPd34xuqENLIce1t/D2vv0MHgi6Ye4cGKS9pZmFF59QnRWlM+Yy/8E13DBmCRNtO1t8PE+mTuCi5mcYS7ovTgQ5PxEpU9hq9Jb24P4yZbcLbm5uZtasWQAcc8wxnHzyybz11lvcc889tLW1MXv2bCZPnsy0adM47rjjOPHEE0f7G5WsYLtgCz57fBfY4e7X5jnmXcC/urub2cnAUoIZfd4XL7VdcKYUMrdaJlfJLQlGYXZOW4RnW79Ad1PIOW3cJLjupaqMSaSeldouOLtPFeO6g+Ae8WRr3rx5QzbdjlI12gXPBi4HNpjZ2vR9XwGOAXD3e4BPAJ81s/3AAHDJSMG9HGGlkGGquaL0hjOnDjnpTLQ8H1h04VUkHrmNCRtMwQDv7s8S7G0x0jF3A3dHNagwxQbuaq4ozW2L8IZN4F2EXDweRc5PRJJt0aJFcQ8hr5ppVTCxoz20S2S2OHq0D9lQYP3bkef8RGQodx9WtVKPokiC1EyrgrBSyJYmq27lTCG5HSjHTYKZlwU5QFXViIxaW1sb27dvjyT4JZm7s337dtra2kb1OjUzg4+0S2QlZef8KrCSTqSRdXd309fXR5TraJKqra2N7u7RpXdrb9PtWpJvg3BV1YhImep70+2Ey67Vf7WtLzwHpqoaEamCmsnB14LctsVbUuPDD1RVjYhUgQJ8hHJr9W/bP5c93jr0IFXViEiVKMBHKLdWf0XqVOYPfoa+VCeqqhGRalOAj1DYIqsVqVO5eOy/wM07g5n7uu+lL7z6oaoaBXkRqQAF+AgVbFtcgf7UIiL5qIomQgVr9avYn1pERAE+YkNaF+Qa152nLl5VNSISPaVoqun0m4IqmmyqqhGRClGAr6awXjXn3qW2BSJSEUrRVFtYf+oqbEogIo1HAb6CstsW5G2OpoZkIlIhStFUSG7bgv6dA9y4bAPL1/QPPVClkyJSIQrwFRK2xeDA4AFuf/yVoQeqdFJEKkQBvkLybTE47P58JZIqnRSRUVKAr5B8e8MOu1+lkyJSIQrwFVKwbUGGSidFpEJURVMhJW0xmFs6uX5JejcolU2KSPkU4CtoxLYF+ahsUkQiohRN0qhsUkQiogCfNCqbFJGIKMAnjcomRSQiCvBVsnxNP7MXrGTy/B8ze8HK4StaM1Q2KSIRKRjgzWySmT1lZpvMbKOZfTHkGDOzu8xss5mtN7MTKzPc2lR02wJQ2aSIRKaYKpr9wJfc/UUzOxJYbWZPuPumrGPOBqakv94PfCv9XRi5bYHKJkWkUgrO4N19q7u/mP75L8DLQG5UOh9Y7IFfAR1m9u7IR1ujim5bECZTNqmNukWkRCXl4M2sB5gF/DrnoS4gey+6PoafBDCzK81slZmt2rZtW4lDrV1Fty0Io7JJESlT0QHezI4AfgBc6+5vlfNm7n6vu/e6e++ECRPKeYmaVHTbgjAqmxSRMhW1ktXMWgiC+wPuvizkkH5gUtbt7vR9QoltC3Jpo24RKVPBAG9mBnwHeNnd/ynPYSuAa8zsQYKLq7vcfWt0w6x9ZbUtgOCCanbrAlDZpIgUpZgZ/GzgcmCDma1N3/cV4BgAd78HeAz4GLAZ2AP8x8hH2qgy1TLas1VESmTuHssb9/b2+qpVq2J577qgjbpFGpKZrXb33mKOVTfJWqSOkyJSBLUqqEUqnRSRImgGH4Pla/rLq6jJUOmkiBRBM/gqK6kvTT7qOCkiRVCAr7KR+tIUTR0nRaQICvBVNqq+NBnqOCkiRVAOvsomdrTTHxLMi+pLky2346SISA7N4KtsVH1pRpJpKXxzR/Bd3SZFGp5m8FU2qr40+aguXkRCaCVrPVg4PU9Dsklw3UvVH4+IVEwpK1mVoqkHqosXkRAK8PVAdfEiEkIBvh6oLl5EQugia8xG3bYA1FJYREIpwMco07Ygs7I107YAKC/IZwf0TNmkAr5Iw1KKJkaRtC0Ikymb3PU64IfKJlUbL9JQFOBjFEnbgjBqJywiKMDHKl97gpLbFuRS2aSIoAAfq4q1LVDZpIigAB+rC2Z1ceuFx9PV0Y4BXR3t3Hrh8aNrWwAqmxQRQFU0sbtgVtfoA3oulU2KCArw9UvthEUanlI0jUQthUUaimbwCRLJqtZ81FJYpOFoBp8QkWzGPRLVxos0HAX4hKjYqtYM1caLNJyCAd7M7jezN8wsdOcIM/uIme0ys7XpL9XilaFiq1ozVBsv0nCKmcEvAs4qcMzP3f2E9Jc+85ehYqtaM1QbL9JwCgZ4d38G2FGFsTS0iq1qzZgxF869K9jGDwu+n3uXLrCK1LGoqmhOMbN1wBbgv7j7xrCDzOxK4EqAY445JqK3rg8V2Yw7l2rjRRpKUZtum1kP8CN3nx7y2L8BUu6+28w+Btzp7lMKvaY23U6A9Uu02lWkxlR10213f8vdd6d/fgxoMbPO0b6uVJh6xovUvVEHeDN7l5lZ+ueT06+5fbSvKxWmuniRulcwB29m3wc+AnSaWR/wj0ALgLvfA3wC+KyZ7QcGgEu8mLyPjKiiq1pBdfEiDaBggHf3Sws8fjdwd2Qjkmj3as1nXHc6PRNyv4jUBa1kTaCKr2oF1cWLNAAF+ASq+KpWUF28SANQN8kEmtjRTn9IMI9sVWuG6uJF6ppm8AlU8VWt+ahfvEhd0Qw+gaqyqjWX+sWL1J2iVrJWglayJszC6XmqaibBdaGNREUkBlVdySp1QnXxInVHKZoaUPFFT6C6eJE6pBl8wlV8K78M1cWL1B0F+ISryqInUF28SB1SiibhqrLoKSOsLl4thUVqlmbwCVfxrfxGopbCIjVNAT7hYlv0BGopLFLjlKJJuFgWPWWodFKkpinA14ALZnVVJ6DnUumkSE1TikbyU+mkSE3TDL7GVGXRU0amWkZVNCI1SQG+hlRlp6dcaiksUrOUoqkhVVv0NBK1FBapGZrB15CqLnoKo5bCIjVFM/gaEuuiJ1BdvEiNUYCvIbEuegLVxYvUGKVoakisi55AdfEiNUYBvsbEtugJghLJ7Bw8qC5eJMEU4GtYVWviQXXxIjVGAb5GxVITD8Pr4jNlkwr4Iomji6w1KjE18WonLJJYBQO8md1vZm+Y2Ut5Hjczu8vMNpvZejM7MfphSq7Ya+JBZZMiCVfMDH4RcNYIj58NTEl/XQl8a/TDkkJir4kHlU2KJFzBAO/uzwA7RjjkfGCxB34FdJjZu6MaoISLvSYe8pdHqmxSJBGiyMF3AdnF0X3p+4YxsyvNbJWZrdq2bVsEb924LpjVxa0XHk9XRzsGdHW0c+uFx1e3hFLthEUSrapVNO5+L3AvQG9vr1fzvetRrDXxoLJJkYSLIsD3A5Oybnen75MqqnpNfIbKJkUSK4oUzQrgU+lqmg8Au9x9awSvK0XK1MT37xzAOVQTv3xNlc+zKpsUSZRiyiS/D/wSmGpmfWb2D2Z2lZldlT7kMeA1YDPwL8DVFRuthEpETTyobFIkYQqmaNz90gKPO/C5yEYkJUtETTyobFIkYbSStQ4koiYeVDYpkjAK8HUgETXxoLJJkYRRs7E6EHuf+AyVTYokigUp9Orr7e31VatWxfLe9S62ksl81i9R0BeJiJmtdvfeYo7VDL7OxNZGOB9t1C0SG+Xg60xiSiYzVDopEhsF+DqTmJLJDJVOisRGAb7OJKZkMkOlkyKxUYCvM4kpmcxQ6aRIbBTg60xuG+GO9hbaWpq47qG1zF6wsvr9aWbMhXPvgnGTAAu+z7wsyMHf3BE0JlOvGpGKUJlkHcutqIFgNl/1vvHZcqtqIJjRn3uXqmpEilBKmaRm8HUscRU1oKoakSpSgK9jiauoAVXViFSRAnwdS1xFDaiqRqSKFODrWOIqakBVNSJVpABfxxJXUQPhVTXn3hU8tnC6KmtEIqQqmgaRyIqaDFXWiBRNVTQyTCIrajJUWSNSEQrwDSKRFTUZqqwRqQgF+AaRyIqaDFXWiFSEAnyDCKuoaWky9uzbz+T5P47voiuoskakQhTgG0RYRQ0Gf94ziHNoY5DEVNaoX43IqKmKpkHNXrCS/pD8e1dHO7+YPyeGEWVRVY1IXqqikYISfdFVVTUikVCAb1D5Lq46xJuPB1XViEREAb5BhV10zYg1Hw+qqhGJSFEB3szOMrNXzGyzmc0PeXyemW0zs7Xpr89EP1SJUvZF1zCxLoIKq6ppaoF9b+uiq0gJCgZ4M2sGvgmcDUwDLjWzaSGHPuTuJ6S/7ot4nFIBF8zq4hfz52B5Hu/fOZCMXaDajwYzGNgBOOx6PbgIqyAvMqJiZvAnA5vd/TV33wc8CJxf2WFJNY202Cm2dM2MuXDdS3DzTmg9HA7sG/q4LrqKFFRMgO8CXs+63Ze+L9e/N7P1ZrbUzCaFvZCZXWlmq8xs1bZt28oYrlTCSPl4SEDPGl10FSlLVBdZHwV63H0G8ATw3bCD3P1ed+91994JEyZE9NYyWoXy8RBz+aQuuoqUpZgA3w9kz8i70/cd5O7b3f2d9M37gPdFMzyplkw+Pl+Qj7V8Ml8rgylnqIe8yAiKCfAvAFPMbLKZtQKXACuyDzCzd2fdPA94ObohSjUlsnwyXyuDdd8LLrjqwqtIqDGFDnD3/WZ2DfA40Azc7+4bzewWYJW7rwC+YGbnAfuBHcC8Co5ZKiiz+cftj78S2sogk4+v+iYhM+YObVOwcHr+1a5qZyACqBeNjGDy/B+T719HV0c7N5w5Nb7doG7ugNDRWVB5I1Kn1ItGIpHI8smMfBdYrUk5eZE0BXjJq5jyyWvj2sA77MIrgB9AOXmRgAK85FVM+STENJvPvfBqISciLYaSBqccvBQlX//4XLHl5pWTlwahHLxErlC6JiO23Lxy8iLDKMBLUYpN10BMuXnl5EWGUYCXomVWu95x8QnJm80rJy8yjHLwUpbla/rzLoYKU/XcvHLyUqeUg5eKS/RsHvLn5NuPUv8aaRgK8DIqic3N590Varf610jDUIpGIrN8TT83LtvAwOCBgscaQQKloqmb9UuCnPuuvmBGv+/t9K5QOcZNCjYXEakBpaRoFOAlUqXm5qFKwR5GyMunRzGuO5j5q1mZJJhy8BKbUnPzcCjkVjxPP+IGIUrZSP1RgJeKKCU3n62iefp8tfLZVEopdUQpGqm4UnLz2VqajCPaxrBzzyATo0rfZOfl86ZrQCkbSSrl4CVxsnPzmZx7qSLP1S+cnq6oGUFLe7CASkFeEkIBXhItymDf0d6CGeXN8tcvCXLuuTtD5Wo/GloPP1SNo1m9xEgBXmpGOVU3Iyl5ll90yiaLZvUSIwV4qTnl5ulHUvIsv5iUzcEXbwZPaUYvVacALzUpM5vfsnOAce0tvL1vP4MHov/3mS/w3zHtt5y04R8Lp2xyaUYvVaQAL3Uhilx9KQw4t+lZ5rcu4V1sZ0tqPEc0vUMHfyniyZrRS3UowEvdqXawzziv6VkWtNzHWNtX/JNa2mHmZfDbn+rCrEROAV7qWm4qxwz+vGewYoH/vKZn+fKYJUy07aQwxliq4HNSDF1FuMdb+UnTHM5uW8fYgT8p6EvZFOClIVVjll/WjD4t5dBkh27vo5nd3k6Hvc2fGM/X983l6cNOK7/sUxqCArw0vErO8suZ0RfjHW/mbdrpYDdbvJPb9s/l0dSpwy4IjyvxZ50o6osCvEgeUQf+sBl97ky9XHu8lYcPfIjTm9Yy0d5ki3fyZOqEIbdv2z+XFalTC75W9vqA0/52Ak/9ZtuQP4NyThyj+VknnfIpwIuUaDSBP3tGv8XH82TqBC5qfiaSoJ/7PHewrNths34gPZ7wk0K5J4mohZWr5p4EknAyKvaEVepYyz3JRR7gzews4E6gGbjP3RfkPH4YsBh4H7AduNjdfz/SayrASy0IC/yZ/6gj1ekXE/Qr4R1vxjBabf/B+3JPCrm3i/mkEHZSgNJPJFE8J64TUiW0tzRz64XHlxTkIw3wZtYM/D/go0Af8AJwqbtvyjrmamCGu19lZpcAH3f3i0d6XQV4qXUjBf/cn/+8Z5Dzm57lhnTQ/7MfzpG2d0ggjlOhTwphnxxKPZFE9Zw93sr8wc/UTZDv6mjnF/PnFH18KQF+TBHHnAxsdvfX0i/+IHA+sCnrmPOBm9M/LwXuNjPzuPI/IlVwwayukmZey9ecwMWPf/TgCeFs/zmfS32PiU3b2cXhHO5DA35Uufxi5L6PFbh9mA1vKVGt54y1fXx5zBJW7KuPAL8loj5MYYoJ8F1AdoOOPuD9+Y5x9/1mtgsYD7yZfZCZXQlcCXDMMceUOWSR2jT8hHAG8F8BOAqG7SH7u47ZTPzDI7TzzsFn5M5wG9VE2x73ECIzscRNcUpRTICPjLvfC9wLQYqmmu8tkngz5g5Z+PQ3AOtPHxL0bcoZh1bIth8F+3bDgay8flNLcAbIus8JLmjmu527KKsWbPHxcQ8hEu0tzdxw5tSKvX4xAb4fmJR1uzt9X9gxfWY2BhhHcLFVREYjJ+gPkzPr5/SbgvvznRRCbjdNOQPWfa+0JmshJ5JynjMsB8/Qk89+mklhtDI0B//Npss4amxLQ1bRlKKYi6xjCC6ynk4QyF8ALnP3jVnHfA44Pusi64XuPuIabF1kFUmQ3BNFzklg2O2QE0nVntPgLR4qUSb5MeAOgjLJ+939v5nZLcAqd19hZm3A/wJmATuASzIXZfNRgBcRKV3UVTS4+2PAYzn33ZT1817golIGKSIilVVr11ZERKRICvAiInVKAV5EpE4pwIuI1KnYukma2TbgDyU8pZOclbEJo/GNXtLHqPGNjsY3Opnx/bW7TyjmCbEF+FKZ2apiS4PioPGNXtLHqPGNjsY3OuWMTykaEZE6pQAvIlKnainA3xv3AArQ+EYv6WPU+EZH4xudksdXMzl4EREpTS3N4EVEpAQK8CIidaomAryZnWVmr5jZZjObH/d4spnZJDN7ysw2mdlGM/ti3GMKY2bNZrbGzH4U91hymVmHmS01s9+Y2ctmdkrcY8pmZtel/25fMrPvp7unxj2m+83sDTN7Keu+o83sCTP7bfr7UQkb3+3pv+P1ZvaImXUkaXxZj33JzNzMOuMYW3oMoeMzs8+n/ww3mtlthV4n8QE+ven3N4GzgWnApWY2Ld5RDbEf+JK7TwM+AHwuYePL+CLwctyDyONO4P+4+98CM0nQOM2sC/gC0Ovu0wlaZl8S76gAWASclXPffOBJd58CPJm+HZdFDB/fE8B0d59BsMfEjdUeVJZFDB8fZjaJYC/FP1Z7QDkWkTM+MzuNYP/rme7+XuAbhV4k8QGerE2/3X0fkNn0OxHcfau7v5j++S8EwalyW7SUwcy6gb8H7ot7LLnMbBzwIeA7AO6+z913xjqo4cYA7enNb8YCW2IeD+7+DMHeC9nOB76b/vm7wAXVHFO2sPG5+0/dPbM1068IdoeLRZ4/P4CFwJcJNpeKTZ7xfRZY4O7vpI95o9Dr1EKAD9v0O1EBNMPMegg2Pfl1zEPJdQfBP9pUzOMIMxnYBvzPdArpPjM7PO5BZbh7P8FM6Y/AVmCXu/803lHl9VfuvjX985+Av4pzMAX8J+AncQ8im5mdD/S7+7q4x5LHe4B/Z2a/NrOnzeykQk+ohQBfE8zsCOAHwLXu/lbc48kws3OAN9x9ddxjyWMMcCLwLXefBbxNvKmFIdJ57PMJTkQTgcPN7D/EO6rCPKh/TmQNtJl9lSC1+UDcY8kws7HAV4CbCh0bozHA0QSp4BuAJWbZO9oOVwsBvphNv2NlZi0Ewf0Bd18W93hyzAbOM7PfE6S35pjZ/453SEP0AX3unvnUs5Qg4CfF3wG/c/dt7j4ILAM+GPOY8vlXM3s3QPp7wY/w1WZm84BzgE96shbh/A3BSXxd+v9KN/Cimb0r1lEN1Qcs88DzBJ/IR7wQXAsB/gVgiplNNrNWggtcK2Ie00HpM+h3gJfd/Z/iHk8ud7/R3bvdvYfgz26luydmBurufwJeN7Op6btOBzbFOKRcfwQ+YGZj03/Xp5Ogi8A5VgCfTv/8aeCHMY5lGDM7iyBVeJ6774l7PNncfYO7/1t370n/X+kDTkz/+0yK5cBpAGb2HqCVAt0vEx/g0xdlrgEeJ/iPtcTdN8Y7qiFmA5cTzIzXpr8+FvegaszngQfMbD1wAvDf4x3OIelPFkuBF4ENBP9nYl/SbmbfB34JTDWzPjP7B2AB8FEz+y3BJ48FCRvf3cCRwBPp/yf3JGx8iZFnfPcDx6ZLJx8EPl3oU5BaFYiI1KnEz+BFRKQ8CvAiInVKAV5EpE4pwIuI1CkFeBGROqUALyJSpxTgRUTq1P8H0O8Rf0GHW40AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "fcuda = \"iter_cuda.txt\"\n", + "fcpu = \"iter.txt\"\n", + "\n", + "v_cuda = []\n", + "v_cpu = []\n", + "t_cuda = []\n", + "t_cpu = []\n", + "\n", + "\n", + "# open file and read\n", + "with open(fcuda, \"r\") as f:\n", + " cuda = f.readlines()\n", + " t = 0\n", + " for line in cuda:\n", + " v = float(line.split(',')[0].split(\":\")[1])\n", + " v_cuda.append(v)\n", + " t += float(line.split(',')[-1])\n", + " t_cuda.append(t)\n", + "\n", + "with open(fcpu, \"r\") as f:\n", + " cpu = f.readlines()\n", + " t = 0\n", + " for line in cpu:\n", + " v = float(line.split(',')[0].split(\":\")[1])\n", + " v_cpu.append(v)\n", + " t += float(line.split(',')[-1])\n", + " t_cpu.append(t)\n", + "\n", + "# plot\n", + "plt.scatter(t_cuda, v_cuda, label=\"cuda\")\n", + "plt.scatter(t_cpu, v_cpu, label=\"cpu\")\n", + "#plt.plot(v_cuda, label=\"cuda\")\n", + "#plt.plot(v_cpu, label=\"cpu\")\n", + "\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/solver_performance/check_3d_out.ipynb b/test/old_tests/solver_performance/check_3d_out.ipynb new file mode 100644 index 0000000..7928dfe --- /dev/null +++ b/test/old_tests/solver_performance/check_3d_out.ipynb @@ -0,0 +1,126 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'vel_init')" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# final model\n", + "fpath_final_model = './OUTPUT_FILES/final_model.h5'\n", + "fpath_true_model = \"./test_model_init_100-100-100.h5\"\n", + "\n", + "import h5py\n", + "\n", + "# read vel, xi, eta dataset \n", + "with h5py.File(fpath_final_model, 'r') as f:\n", + " vel = f['vel'][:]\n", + " xi = f['xi'][:]\n", + " eta = f['eta'][:]\n", + " #zeta = f['zeta'][:]\n", + "\n", + "# read true model\n", + "with h5py.File(fpath_true_model, 'r') as f:\n", + " vel_true = f['vel'][:]\n", + " xi_true = f['xi'][:]\n", + " eta_true = f['eta'][:]\n", + " #zeta_true = f['zeta'][:]\n", + "# plot\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "# plot vel\n", + "plt.figure()\n", + "plt.imshow(vel[:,:,5], origin='lower', aspect='auto')\n", + "plt.colorbar()\n", + "plt.title('vel')\n", + "\n", + "# plot xi\n", + "#plt.figure()\n", + "#plt.imshow(xi[:,:,10], origin='lower', aspect='auto')\n", + "#plt.colorbar()\n", + "#plt.title('xi')\n", + "#\n", + "## plot eta\n", + "#plt.figure()\n", + "#plt.imshow(eta[:,:,10], origin='lower', aspect='auto')\n", + "#plt.colorbar()\n", + "#plt.title('eta')\n", + "\n", + "# plot vel_true\n", + "plt.figure()\n", + "plt.imshow(vel_true[:,:,5], origin='lower', aspect='auto')\n", + "plt.colorbar()\n", + "plt.title('vel_init')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "vscode": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/solver_performance/check_src_rec_file.ipynb b/test/old_tests/solver_performance/check_src_rec_file.ipynb new file mode 100644 index 0000000..6424d3b --- /dev/null +++ b/test/old_tests/solver_performance/check_src_rec_file.ipynb @@ -0,0 +1,145 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# read src_rec file and check its arrival time and distance from src to rec\n", + "import numpy as np\n", + "\n", + "# read file\n", + "fpath = \"./src_rec_test_out.dat\"\n", + "\n", + "with open(fpath, \"r\") as f:\n", + " lines = f.readlines()\n", + "\n", + " # list to store src lon lat\n", + " src_pos = []\n", + " # list to store rec lon lat\n", + " rec_pos_tmp=[]\n", + " rec_pos = []\n", + "\n", + " for line in lines:\n", + " # src line if there are 13 elements\n", + " if len(line.split()) == 13:\n", + " # store source lon lat dep\n", + " stlon = float(line.split()[8])\n", + " stlat = float(line.split()[7])\n", + " src_pos.append([stlon, stlat])\n", + "\n", + " nrec = float(line.split()[11])\n", + " # rec line if there are 9 elements\n", + " elif len(line.split()) == 9:\n", + " # store receiver lon lat dep\n", + " rclon = float(line.split()[4])\n", + " rclat = float(line.split()[3])\n", + " rctime= float(line.split()[8])\n", + " # calc epicentral distance from src\n", + " dist = np.sqrt((stlon-rclon)**2 + (stlat-rclat)**2)\n", + " rec_pos_tmp.append([rclon, rclat, rctime, dist])\n", + "\n", + " nrec-=1\n", + " else:\n", + " raise ValueError(\"src_rec_test_out.dat file is not correct\")\n", + "\n", + " if nrec==0:\n", + " rec_pos.append(rec_pos_tmp)\n", + " # remove all rec_pos_tmp\n", + " rec_pos_tmp = []\n", + "\n", + "\n", + "\n", + "src_pos = np.array(src_pos)\n", + "rec_pos = np.array(rec_pos)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot rec_pos for each src_pos with color by 3rd element\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# selected source\n", + "id_src = 0\n", + "\n", + "fig, axs = plt.subplots(2,1,figsize=(10,10))\n", + "\n", + "# plot arrival time\n", + "# src\n", + "axs[0].scatter(src_pos[id_src,0], src_pos[id_src,1], c='r', marker='o', s=100)\n", + "# rec\n", + "axs[0].scatter(rec_pos[id_src][:,0], rec_pos[id_src][:,1], c=rec_pos[id_src][:,2], s=10, marker='o')\n", + "\n", + "# colorbar\n", + "cbar = plt.colorbar(axs[0].scatter(rec_pos[id_src][:,0], rec_pos[id_src][:,1], c=rec_pos[id_src][:,2], s=10, marker='o'))\n", + "cbar.set_label('arrival time')\n", + "\n", + "# plot epicentral distance\n", + "# src\n", + "axs[1].scatter(src_pos[id_src,0], src_pos[id_src,1], c='r', marker='o', s=100)\n", + "# rec\n", + "\n", + "axs[1].scatter(rec_pos[id_src][:,0], rec_pos[id_src][:,1], c=rec_pos[id_src][:,3], s=10, marker='o')\n", + "\n", + "# colorbar\n", + "cbar = plt.colorbar(axs[1].scatter(rec_pos[id_src][:,0], rec_pos[id_src][:,1], c=rec_pos[id_src][:,3], s=10, marker='o'))\n", + "cbar.set_label('epicentral distance')\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rec_pos.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "min(rec_pos[id_src][:,2])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + }, + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/solver_performance/iter.txt b/test/old_tests/solver_performance/iter.txt new file mode 100644 index 0000000..99a05b4 --- /dev/null +++ b/test/old_tests/solver_performance/iter.txt @@ -0,0 +1,59 @@ +iteration 0: 2.68606, 6.23229, 0.226239 +iteration 1: 2.66762, 4.63719, 0.214316 +iteration 2: 2.73238, 4.08102, 0.213379 +iteration 3: 2.77977, 4.02757, 0.215531 +iteration 4: 2.75503, 3.96133, 0.213489 +iteration 5: 2.70629, 3.89322, 0.215038 +iteration 6: 2.64874, 3.82701, 0.228276 +iteration 7: 2.58487, 3.76405, 0.212526 +iteration 8: 2.5151, 3.70497, 0.210962 +iteration 9: 2.43957, 3.65005, 0.212779 +iteration 10: 2.35845, 3.59922, 0.215859 +iteration 11: 2.27194, 3.55211, 0.218057 +iteration 12: 2.18033, 3.50805, 0.223463 +iteration 13: 2.08403, 3.46617, 0.218698 +iteration 14: 1.98362, 3.42552, 0.215489 +iteration 15: 1.87984, 3.38526, 0.21415 +iteration 16: 1.77353, 3.34488, 0.211472 +iteration 17: 1.66557, 3.30434, 0.214 +iteration 18: 1.55685, 3.26406, 0.221782 +iteration 19: 1.44815, 3.22471, 0.21206 +iteration 20: 1.34022, 3.18704, 0.216203 +iteration 21: 1.23371, 3.15168, 0.212569 +iteration 22: 1.12917, 3.11898, 0.213464 +iteration 23: 1.02721, 3.08897, 0.213914 +iteration 24: 0.928483, 3.06131, 0.214082 +iteration 25: 0.833576, 3.03521, 0.214501 +iteration 26: 0.742987, 3.00939, 0.213422 +iteration 27: 0.657363, 2.98204, 0.221331 +iteration 28: 0.577238, 2.95076, 0.215693 +iteration 29: 0.502953, 2.9126, 0.223062 +iteration 30: 0.434765, 2.86425, 0.217287 +iteration 31: 0.372809, 2.811, 0.22508 +iteration 32: 0.317086, 2.74301, 0.213147 +iteration 33: 0.267455, 2.65645, 0.213563 +iteration 34: 0.223675, 2.55053, 0.214785 +iteration 35: 0.185412, 2.42585, 0.214462 +iteration 36: 0.152346, 2.28442, 0.213213 +iteration 37: 0.124075, 2.12939, 0.215673 +iteration 38: 0.100158, 1.96561, 0.214523 +iteration 39: 0.080066, 1.76634, 0.213322 +iteration 40: 0.0633697, 1.58065, 0.248635 +iteration 41: 0.0496571, 1.41768, 0.227537 +iteration 42: 0.0385206, 1.26136, 0.214846 +iteration 43: 0.0295813, 1.06553, 0.212869 +iteration 44: 0.0224539, 0.922364, 0.215505 +iteration 45: 0.0168533, 0.801121, 0.215831 +iteration 46: 0.012518, 0.676654, 0.222596 +iteration 47: 0.00919207, 0.572065, 0.212897 +iteration 48: 0.00666999, 0.473973, 0.215161 +iteration 49: 0.00478044, 0.388867, 0.214475 +iteration 50: 0.00338263, 0.313598, 0.212979 +iteration 51: 0.00236278, 0.246673, 0.213896 +iteration 52: 0.00162948, 0.185409, 0.216258 +iteration 53: 0.00111072, 0.122625, 0.220116 +iteration 54: 0.000747838, 0.0897312, 0.214795 +iteration 55: 0.000496874, 0.0652654, 0.214746 +iteration 56: 0.000325716, 0.0467522, 0.214539 +iteration 57: 0.000210643, 0.0329173, 0.222138 +iteration 58: 0.000134388, 0.0227652, 0.216016 diff --git a/test/old_tests/solver_performance/iter_cuda.txt b/test/old_tests/solver_performance/iter_cuda.txt new file mode 100644 index 0000000..a1de9f2 --- /dev/null +++ b/test/old_tests/solver_performance/iter_cuda.txt @@ -0,0 +1,100 @@ +iteration 0: 2.43339, 3.96179, 0.159862 +iteration 1: 2.44192, 3.78108, 0.154897 +iteration 2: 2.5263, 3.76444, 0.154628 +iteration 3: 2.63063, 3.75984, 0.155039 +iteration 4: 2.67147, 3.74936, 0.154697 +iteration 5: 2.69534, 3.72929, 0.15431 +iteration 6: 2.71752, 3.70022, 0.153941 +iteration 7: 2.73461, 3.70193, 0.153911 +iteration 8: 2.739, 3.95594, 0.152974 +iteration 9: 2.72188, 4.19984, 0.153161 +iteration 10: 2.67363, 4.43216, 0.153304 +iteration 11: 2.5887, 4.64604, 0.153101 +iteration 12: 2.46947, 4.72927, 0.152961 +iteration 13: 2.32484, 4.78864, 0.153142 +iteration 14: 2.16648, 4.85847, 0.152842 +iteration 15: 2.00464, 4.78123, 0.152974 +iteration 16: 1.84584, 4.55547, 0.153136 +iteration 17: 1.69311, 4.41426, 0.153256 +iteration 18: 1.54733, 4.18296, 0.152845 +iteration 19: 1.40845, 4.0995, 0.153227 +iteration 20: 1.27643, 4.03077, 0.152958 +iteration 21: 1.15168, 3.96649, 0.152978 +iteration 22: 1.03503, 3.90766, 0.153147 +iteration 23: 0.927456, 3.87121, 0.153028 +iteration 24: 0.829742, 3.77373, 0.15331 +iteration 25: 0.742219, 3.6127, 0.153352 +iteration 26: 0.664713, 3.40771, 0.153238 +iteration 27: 0.596583, 3.17937, 0.152994 +iteration 28: 0.536932, 2.9447, 0.153596 +iteration 29: 0.484754, 2.71571, 0.153629 +iteration 30: 0.439041, 2.49966, 0.15342 +iteration 31: 0.398856, 2.30025, 0.153487 +iteration 32: 0.363395, 2.11871, 0.153484 +iteration 33: 0.331981, 1.95478, 0.153198 +iteration 34: 0.304034, 1.80739, 0.152914 +iteration 35: 0.27906, 1.67506, 0.153539 +iteration 36: 0.256656, 1.55623, 0.152955 +iteration 37: 0.236486, 1.44935, 0.153024 +iteration 38: 0.218247, 1.35301, 0.153084 +iteration 39: 0.201717, 1.26594, 0.15378 +iteration 40: 0.186682, 1.187, 0.154371 +iteration 41: 0.172982, 1.11523, 0.15392 +iteration 42: 0.16048, 1.04978, 0.153982 +iteration 43: 0.14905, 0.989915, 0.153204 +iteration 44: 0.138585, 0.924638, 0.153238 +iteration 45: 0.128997, 0.856952, 0.153877 +iteration 46: 0.120206, 0.810159, 0.152934 +iteration 47: 0.112133, 0.767564, 0.152937 +iteration 48: 0.104707, 0.728427, 0.153035 +iteration 49: 0.097869, 0.692264, 0.15315 +iteration 50: 0.0915679, 0.658715, 0.152971 +iteration 51: 0.0857542, 0.6275, 0.153151 +iteration 52: 0.0803839, 0.598383, 0.153117 +iteration 53: 0.075418, 0.571163, 0.153092 +iteration 54: 0.0708228, 0.545663, 0.153108 +iteration 55: 0.0665671, 0.521722, 0.152929 +iteration 56: 0.0626222, 0.499192, 0.153113 +iteration 57: 0.0589632, 0.477937, 0.15294 +iteration 58: 0.0555681, 0.457812, 0.15317 +iteration 59: 0.0524166, 0.440694, 0.153242 +iteration 60: 0.0494894, 0.420541, 0.153075 +iteration 61: 0.046768, 0.400276, 0.152928 +iteration 62: 0.0442361, 0.383639, 0.153059 +iteration 63: 0.0418792, 0.368117, 0.153116 +iteration 64: 0.0396837, 0.353607, 0.153163 +iteration 65: 0.0376369, 0.339252, 0.152713 +iteration 66: 0.0357276, 0.324887, 0.152917 +iteration 67: 0.0339456, 0.312162, 0.153061 +iteration 68: 0.0322809, 0.300005, 0.153249 +iteration 69: 0.0307245, 0.288393, 0.153127 +iteration 70: 0.0292682, 0.277323, 0.153116 +iteration 71: 0.0279043, 0.266659, 0.153007 +iteration 72: 0.026626, 0.256528, 0.152774 +iteration 73: 0.0254269, 0.246895, 0.152918 +iteration 74: 0.0243012, 0.237501, 0.153007 +iteration 75: 0.0232433, 0.228719, 0.153019 +iteration 76: 0.0222484, 0.219205, 0.152934 +iteration 77: 0.0213118, 0.203637, 0.153179 +iteration 78: 0.0204296, 0.195446, 0.152973 +iteration 79: 0.0195979, 0.187844, 0.152942 +iteration 80: 0.0188131, 0.180718, 0.152817 +iteration 81: 0.0180721, 0.174, 0.15292 +iteration 82: 0.0173716, 0.167641, 0.152875 +iteration 83: 0.0167088, 0.161606, 0.153251 +iteration 84: 0.016081, 0.155857, 0.152889 +iteration 85: 0.0154857, 0.150374, 0.153223 +iteration 86: 0.0149207, 0.145136, 0.153109 +iteration 87: 0.014384, 0.140125, 0.153087 +iteration 88: 0.0138737, 0.135328, 0.152957 +iteration 89: 0.0133879, 0.130732, 0.152905 +iteration 90: 0.0129251, 0.126323, 0.153395 +iteration 91: 0.0124838, 0.122094, 0.153812 +iteration 92: 0.0120626, 0.118033, 0.153761 +iteration 93: 0.0116603, 0.114132, 0.153533 +iteration 94: 0.0112756, 0.110382, 0.153376 +iteration 95: 0.0109075, 0.106777, 0.153344 +iteration 96: 0.010555, 0.103309, 0.153178 +iteration 97: 0.0102171, 0.0999714, 0.153041 +iteration 98: 0.00989304, 0.0967585, 0.153617 +iteration 99: 0.00958196, 0.0936645, 0.153021 \ No newline at end of file diff --git a/test/old_tests/solver_performance/log_val b/test/old_tests/solver_performance/log_val new file mode 100644 index 0000000..9857711 --- /dev/null +++ b/test/old_tests/solver_performance/log_val @@ -0,0 +1,478 @@ +==24162== Memcheck, a memory error detector +==24162== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. +==24162== Using Valgrind-3.18.1 and LibVEX; rerun with -h for copyright info +==24162== Command: ../../build/TOMOATT -i input_params_100-100-100_1-1-1-1_gpu.yml +==24162== Parent PID: 24158 +==24162== +==24162== Warning: noted but unhandled ioctl 0x30000001 with no size/direction hints. +==24162== This could cause spurious value errors to appear. +==24162== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper. +==24162== Warning: noted but unhandled ioctl 0x27 with no size/direction hints. +==24162== This could cause spurious value errors to appear. +==24162== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper. +==24162== Warning: noted but unhandled ioctl 0x25 with no size/direction hints. +==24162== This could cause spurious value errors to appear. +==24162== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper. +==24162== Warning: noted but unhandled ioctl 0x37 with no size/direction hints. +==24162== This could cause spurious value errors to appear. +==24162== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper. +==24162== Warning: noted but unhandled ioctl 0x17 with no size/direction hints. +==24162== This could cause spurious value errors to appear. +==24162== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper. +==24162== Warning: set address range perms: large range [0x200000000, 0x300200000) (noaccess) +==24162== Warning: set address range perms: large range [0x8fa5000, 0x28fa4000) (noaccess) +==24162== Warning: noted but unhandled ioctl 0x19 with no size/direction hints. +==24162== This could cause spurious value errors to appear. +==24162== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper. +==24162== Warning: set address range perms: large range [0x10006000000, 0x10106000000) (noaccess) +==24162== Warning: noted but unhandled ioctl 0x49 with no size/direction hints. +==24162== This could cause spurious value errors to appear. +==24162== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper. +==24162== Warning: noted but unhandled ioctl 0x21 with no size/direction hints. +==24162== This could cause spurious value errors to appear. +==24162== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper. +==24162== Warning: noted but unhandled ioctl 0x1b with no size/direction hints. +==24162== This could cause spurious value errors to appear. +==24162== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper. +==24162== Warning: noted but unhandled ioctl 0x44 with no size/direction hints. +==24162== This could cause spurious value errors to appear. +==24162== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper. +==24162== Warning: set address range perms: large range [0x10006000000, 0x10106000000) (noaccess) +==24162== +==24162== HEAP SUMMARY: +==24162== in use at exit: 1,079,727 bytes in 174 blocks +==24162== total heap usage: 108,062 allocs, 107,888 frees, 2,182,558,459 bytes allocated +==24162== +==24162== 1 bytes in 1 blocks are definitely lost in loss record 1 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x53C960E: strdup (strdup.c:42) +==24162== by 0x75E2534: ??? +==24162== by 0x75DB373: ??? +==24162== by 0x568F61F: mca_base_framework_components_register (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libopen-pal.so.40.30.2) +==24162== by 0x568F9B5: mca_base_framework_register (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libopen-pal.so.40.30.2) +==24162== by 0x568FA13: mca_base_framework_open (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libopen-pal.so.40.30.2) +==24162== by 0x503CBD3: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 5 bytes in 1 blocks are definitely lost in loss record 4 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x53C960E: strdup (strdup.c:42) +==24162== by 0x5690090: opal_argv_append_nosize (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libopen-pal.so.40.30.2) +==24162== by 0x56901B8: opal_argv_append (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libopen-pal.so.40.30.2) +==24162== by 0x5690351: opal_argv_split_inter (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libopen-pal.so.40.30.2) +==24162== by 0x75F3FA7: ??? +==24162== by 0x75F5B26: ??? +==24162== by 0x56A76B1: mca_btl_base_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libopen-pal.so.40.30.2) +==24162== by 0x75C91B7: ??? +==24162== by 0x4FED533: mca_bml_base_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CBB3: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== +==24162== 8 bytes in 1 blocks are definitely lost in loss record 8 of 151 +==24162== at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x56A9469: dlopen_open (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libopen-pal.so.40.30.2) +==24162== by 0x75A955F: ??? +==24162== by 0x75D434D: ??? +==24162== by 0x56A76B1: mca_btl_base_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libopen-pal.so.40.30.2) +==24162== by 0x75C91B7: ??? +==24162== by 0x4FED533: mca_bml_base_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CBB3: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 8 bytes in 1 blocks are definitely lost in loss record 9 of 151 +==24162== at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x56A9469: dlopen_open (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libopen-pal.so.40.30.2) +==24162== by 0x75A955F: ??? +==24162== by 0x75F5834: ??? +==24162== by 0x56A76B1: mca_btl_base_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libopen-pal.so.40.30.2) +==24162== by 0x75C91B7: ??? +==24162== by 0x4FED533: mca_bml_base_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CBB3: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 13 bytes in 1 blocks are definitely lost in loss record 10 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x53C960E: strdup (strdup.c:42) +==24162== by 0x75A95EC: ??? +==24162== by 0x75D434D: ??? +==24162== by 0x56A76B1: mca_btl_base_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libopen-pal.so.40.30.2) +==24162== by 0x75C91B7: ??? +==24162== by 0x4FED533: mca_bml_base_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CBB3: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 13 bytes in 1 blocks are definitely lost in loss record 11 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x53C960E: strdup (strdup.c:42) +==24162== by 0x75A95EC: ??? +==24162== by 0x75F5834: ??? +==24162== by 0x56A76B1: mca_btl_base_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libopen-pal.so.40.30.2) +==24162== by 0x75C91B7: ??? +==24162== by 0x4FED533: mca_bml_base_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CBB3: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 72 bytes in 1 blocks are possibly lost in loss record 59 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x79BE805: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7893A0A: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7AC07B9: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x78AAAA2: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x2A8482: __cudart516 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2A8547: __cudart1336 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x53BAF67: __pthread_once_slow (pthread_once.c:116) +==24162== by 0x2F6AE8: __cudart1612 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x29F0E6: __cudart514 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2C8370: cudaGetDeviceCount (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x1FE548: initialize_cuda() (cuda_initialize.cuh:39) +==24162== +==24162== 72 bytes in 1 blocks are possibly lost in loss record 60 of 151 +==24162== at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x7890E34: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7892B41: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x78932B9: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7AC12D7: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x78AAAA2: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x2A8482: __cudart516 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2A8547: __cudart1336 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x53BAF67: __pthread_once_slow (pthread_once.c:116) +==24162== by 0x2F6AE8: __cudart1612 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x29F0E6: __cudart514 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2C8370: cudaGetDeviceCount (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== +==24162== 79 (64 direct, 15 indirect) bytes in 1 blocks are definitely lost in loss record 61 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x75C117A: ??? +==24162== by 0x568544E: mca_base_framework_components_open (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libopen-pal.so.40.30.2) +==24162== by 0x56F3E45: mca_mpool_base_open (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libopen-pal.so.40.30.2) +==24162== by 0x568FA88: mca_base_framework_open (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libopen-pal.so.40.30.2) +==24162== by 0x503CB74: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 152 bytes in 1 blocks are possibly lost in loss record 93 of 151 +==24162== at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x794043C: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7AC044A: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x78AAAA2: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x2A8482: __cudart516 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2A8547: __cudart1336 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x53BAF67: __pthread_once_slow (pthread_once.c:116) +==24162== by 0x2F6AE8: __cudart1612 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x29F0E6: __cudart514 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2C8370: cudaGetDeviceCount (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x1FE548: initialize_cuda() (cuda_initialize.cuh:39) +==24162== by 0x1FECA9: main (main.cpp:42) +==24162== +==24162== 152 bytes in 1 blocks are possibly lost in loss record 94 of 151 +==24162== at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x794043C: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7AC0479: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x78AAAA2: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x2A8482: __cudart516 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2A8547: __cudart1336 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x53BAF67: __pthread_once_slow (pthread_once.c:116) +==24162== by 0x2F6AE8: __cudart1612 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x29F0E6: __cudart514 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2C8370: cudaGetDeviceCount (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x1FE548: initialize_cuda() (cuda_initialize.cuh:39) +==24162== by 0x1FECA9: main (main.cpp:42) +==24162== +==24162== 152 bytes in 1 blocks are possibly lost in loss record 95 of 151 +==24162== at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x794043C: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7A12519: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7A1264D: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7A00E5B: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7AC0827: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x78AAAA2: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x2A8482: __cudart516 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2A8547: __cudart1336 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x53BAF67: __pthread_once_slow (pthread_once.c:116) +==24162== by 0x2F6AE8: __cudart1612 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x29F0E6: __cudart514 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== +==24162== 152 bytes in 1 blocks are possibly lost in loss record 96 of 151 +==24162== at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x794043C: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7A12519: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7A1264D: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7A00E81: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7AC0827: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x78AAAA2: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x2A8482: __cudart516 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2A8547: __cudart1336 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x53BAF67: __pthread_once_slow (pthread_once.c:116) +==24162== by 0x2F6AE8: __cudart1612 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x29F0E6: __cudart514 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== +==24162== 152 bytes in 1 blocks are possibly lost in loss record 97 of 151 +==24162== at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x794043C: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7AC0C01: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x78AAAA2: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x2A8482: __cudart516 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2A8547: __cudart1336 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x53BAF67: __pthread_once_slow (pthread_once.c:116) +==24162== by 0x2F6AE8: __cudart1612 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x29F0E6: __cudart514 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2C8370: cudaGetDeviceCount (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x1FE548: initialize_cuda() (cuda_initialize.cuh:39) +==24162== by 0x1FECA9: main (main.cpp:42) +==24162== +==24162== 152 bytes in 1 blocks are possibly lost in loss record 98 of 151 +==24162== at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x794043C: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7893021: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x78932D4: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7AC12D7: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x78AAAA2: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x2A8482: __cudart516 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2A8547: __cudart1336 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x53BAF67: __pthread_once_slow (pthread_once.c:116) +==24162== by 0x2F6AE8: __cudart1612 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x29F0E6: __cudart514 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2C8370: cudaGetDeviceCount (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== +==24162== 152 bytes in 1 blocks are possibly lost in loss record 99 of 151 +==24162== at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x794043C: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7AC0CB2: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x78AAAA2: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x2A8482: __cudart516 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2A8547: __cudart1336 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x53BAF67: __pthread_once_slow (pthread_once.c:116) +==24162== by 0x2F6AE8: __cudart1612 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x29F0E6: __cudart514 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2C8370: cudaGetDeviceCount (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x1FE548: initialize_cuda() (cuda_initialize.cuh:39) +==24162== by 0x1FECA9: main (main.cpp:42) +==24162== +==24162== 152 bytes in 1 blocks are possibly lost in loss record 100 of 151 +==24162== at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x794043C: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7AC0D4C: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x78AAAA2: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x2A8482: __cudart516 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2A8547: __cudart1336 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x53BAF67: __pthread_once_slow (pthread_once.c:116) +==24162== by 0x2F6AE8: __cudart1612 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x29F0E6: __cudart514 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2C8370: cudaGetDeviceCount (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x1FE548: initialize_cuda() (cuda_initialize.cuh:39) +==24162== by 0x1FECA9: main (main.cpp:42) +==24162== +==24162== 152 bytes in 1 blocks are possibly lost in loss record 101 of 151 +==24162== at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x794043C: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x799F135: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7AC0DC7: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x78AAAA2: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x2A8482: __cudart516 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2A8547: __cudart1336 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x53BAF67: __pthread_once_slow (pthread_once.c:116) +==24162== by 0x2F6AE8: __cudart1612 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x29F0E6: __cudart514 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2C8370: cudaGetDeviceCount (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x1FE548: initialize_cuda() (cuda_initialize.cuh:39) +==24162== +==24162== 152 bytes in 1 blocks are possibly lost in loss record 102 of 151 +==24162== at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x794043C: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x799F155: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7AC0DC7: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x78AAAA2: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x2A8482: __cudart516 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2A8547: __cudart1336 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x53BAF67: __pthread_once_slow (pthread_once.c:116) +==24162== by 0x2F6AE8: __cudart1612 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x29F0E6: __cudart514 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2C8370: cudaGetDeviceCount (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x1FE548: initialize_cuda() (cuda_initialize.cuh:39) +==24162== +==24162== 152 bytes in 1 blocks are possibly lost in loss record 103 of 151 +==24162== at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x794043C: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x799F175: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7AC0DC7: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x78AAAA2: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x2A8482: __cudart516 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2A8547: __cudart1336 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x53BAF67: __pthread_once_slow (pthread_once.c:116) +==24162== by 0x2F6AE8: __cudart1612 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x29F0E6: __cudart514 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2C8370: cudaGetDeviceCount (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x1FE548: initialize_cuda() (cuda_initialize.cuh:39) +==24162== +==24162== 320 bytes in 1 blocks are possibly lost in loss record 114 of 151 +==24162== at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x40147D9: calloc (rtld-malloc.h:44) +==24162== by 0x40147D9: allocate_dtv (dl-tls.c:375) +==24162== by 0x40147D9: _dl_allocate_tls (dl-tls.c:634) +==24162== by 0x53B6834: allocate_stack (allocatestack.c:430) +==24162== by 0x53B6834: pthread_create@@GLIBC_2.34 (pthread_create.c:647) +==24162== by 0x789EC26: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x794C75E: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x7AC1A49: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x78AAAA2: ??? (in /usr/lib/x86_64-linux-gnu/libcuda.so.515.65.01) +==24162== by 0x2A8482: __cudart516 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x2A8547: __cudart1336 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x53BAF67: __pthread_once_slow (pthread_once.c:116) +==24162== by 0x2F6AE8: __cudart1612 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== by 0x29F0E6: __cudart514 (in /home/masarunagaso/workspace/TomoATT/build/TOMOATT) +==24162== +==24162== 688 bytes in 1 blocks are definitely lost in loss record 122 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x502A9B6: ompi_op_base_op_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4F9EAB3: ompi_op_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CB0D: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 688 bytes in 1 blocks are definitely lost in loss record 123 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x756D41B: ??? +==24162== by 0x502ACAE: ompi_op_base_op_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4F9EAB3: ompi_op_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CB0D: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 688 bytes in 1 blocks are definitely lost in loss record 124 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x502A9B6: ompi_op_base_op_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4F9EB7A: ompi_op_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CB0D: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 688 bytes in 1 blocks are definitely lost in loss record 125 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x756D41B: ??? +==24162== by 0x502ACAE: ompi_op_base_op_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4F9EB7A: ompi_op_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CB0D: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 688 bytes in 1 blocks are definitely lost in loss record 126 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x502A9B6: ompi_op_base_op_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4F9EC26: ompi_op_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CB0D: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 688 bytes in 1 blocks are definitely lost in loss record 127 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x756D41B: ??? +==24162== by 0x502ACAE: ompi_op_base_op_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4F9EC26: ompi_op_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CB0D: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 688 bytes in 1 blocks are definitely lost in loss record 128 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x502A9B6: ompi_op_base_op_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4F9ECD4: ompi_op_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CB0D: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 688 bytes in 1 blocks are definitely lost in loss record 129 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x756D41B: ??? +==24162== by 0x502ACAE: ompi_op_base_op_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4F9ECD4: ompi_op_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CB0D: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 688 bytes in 1 blocks are definitely lost in loss record 130 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x502A9B6: ompi_op_base_op_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4F9EE36: ompi_op_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CB0D: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 688 bytes in 1 blocks are definitely lost in loss record 131 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x756D41B: ??? +==24162== by 0x502ACAE: ompi_op_base_op_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4F9EE36: ompi_op_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CB0D: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 688 bytes in 1 blocks are definitely lost in loss record 132 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x502A9B6: ompi_op_base_op_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4F9EF96: ompi_op_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CB0D: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 688 bytes in 1 blocks are definitely lost in loss record 133 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x756D41B: ??? +==24162== by 0x502ACAE: ompi_op_base_op_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4F9EF96: ompi_op_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CB0D: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 688 bytes in 1 blocks are definitely lost in loss record 134 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x502A9B6: ompi_op_base_op_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4F9F0F4: ompi_op_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CB0D: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== 688 bytes in 1 blocks are definitely lost in loss record 135 of 151 +==24162== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) +==24162== by 0x756D41B: ??? +==24162== by 0x502ACAE: ompi_op_base_op_select (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4F9F0F4: ompi_op_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x503CB0D: ompi_mpi_init (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x4FD0878: PMPI_Init_thread (in /home/masarunagaso/workspace/TomoATT/external_libs/local_mpi_hdf5/lib/libmpi.so.40.30.3) +==24162== by 0x20EE52: initialize_mpi() (mpi_funcs.h:68) +==24162== by 0x1FEC1D: main (main.cpp:28) +==24162== +==24162== LEAK SUMMARY: +==24162== definitely lost: 9,744 bytes in 21 blocks +==24162== indirectly lost: 15 bytes in 1 blocks +==24162== possibly lost: 2,136 bytes in 14 blocks +==24162== still reachable: 1,067,832 bytes in 138 blocks +==24162== suppressed: 0 bytes in 0 blocks +==24162== Reachable blocks (those to which a pointer was found) are not shown. +==24162== To see them, rerun with: --leak-check=full --show-leak-kinds=all +==24162== +==24162== For lists of detected and suppressed errors, rerun with: -s +==24162== ERROR SUMMARY: 35 errors from 35 contexts (suppressed: 0 from 0) diff --git a/test/old_tests/solver_performance/make_test_model.py b/test/old_tests/solver_performance/make_test_model.py new file mode 100644 index 0000000..5c1c563 --- /dev/null +++ b/test/old_tests/solver_performance/make_test_model.py @@ -0,0 +1,298 @@ +# %% [markdown] +# # notebook for create init and true test model + +# %% +import numpy as np +import math + +if __name__ == "__main__": + + # get arguments + import argparse + parser = argparse.ArgumentParser() + parser.add_argument("--n_rtp", type=int, nargs=3, default=[55,55,55]) + # n_sweep + parser.add_argument("--n_sweep", type=int, default=1) + # ndiv_rtp + parser.add_argument("--ndiv_rtp", type=int, nargs=3, default=[1,1,1]) + # use_gpu + parser.add_argument("--use_gpu", type=int, default=0) + + + n_rtp = parser.parse_args().n_rtp + n_sweep = parser.parse_args().n_sweep + ndiv_rtp = parser.parse_args().ndiv_rtp + use_gpu = parser.parse_args().use_gpu + + # + # create model file if not exists + # + + # filename + str_nrtp = str(n_rtp[0])+"-"+str(n_rtp[1])+"-"+str(n_rtp[2]) + fname_init = 'test_model_init_{}.h5'.format(str_nrtp) + fname_true = 'test_model_true_{}.h5'.format(str_nrtp) + + # grid params + R_earth = 6371.0 #6378.1370 + rr1=6070 + rr2=6400 + tt1=(30.0-1.5)/180*math.pi + tt2=(50.0+1.5)/180*math.pi + pp1=(15.0-1.5)/180*math.pi + pp2=(40.0+1.5)/180*math.pi + + import os + if not os.path.exists(fname_true): + + #n_rtp = [55,55,55] + dr = (rr2-rr1)/(n_rtp[0]-1) + dt = (tt2-tt1)/(n_rtp[1]-1) + dp = (pp2-pp1)/(n_rtp[2]-1) + rr = np.array([rr1 + x*dr for x in range(n_rtp[0])]) + tt = np.array([tt1 + x*dt for x in range(n_rtp[1])]) + pp = np.array([pp1 + x*dp for x in range(n_rtp[2])]) + + # initial model + gamma = 0.0 + #s0 = 1.0/6.0 + slow_p=0.04 + ani_p=0.03 + + eta_init = np.zeros(n_rtp) + xi_init = np.zeros(n_rtp) + zeta_init = np.zeros(n_rtp) + fun_init = np.zeros(n_rtp) + vel_init = np.zeros(n_rtp) + + # true model + eta_true = np.zeros(n_rtp) + xi_true = np.zeros(n_rtp) + zeta_true = np.zeros(n_rtp) + fun_true = np.zeros(n_rtp) + vel_true = np.zeros(n_rtp) + + c=0 + for ir in range(n_rtp[2]): + for it in range(n_rtp[1]): + for ip in range(n_rtp[0]): + #eta_init[ir,it,ip] = 0.0 + #xi_init[ir,it,ip] = 0.0 + zeta_init[ir,it,ip] = gamma*math.sqrt(eta_init[ir,it,ip]**2 + xi_init[ir,it,ip]**2) + + if (rr[ir]>6351): + fun_init[ir,it,ip] = 1.0/(5.8+(6371-rr[ir])/20.0*0.7) + elif (rr[ir]>6336): + fun_init[ir,it,ip] = 1.0/(6.5+(6351-rr[ir])/15.0*0.6) + elif (rr[ir]>5961): + fun_init[ir,it,ip] = 1.0/(8.0+(6336-rr[ir])/375.0*1) + else: + fun_init[ir,it,ip] = 1.0/9.0 + + vel_init[ir,it,ip] = 1.0/fun_init[ir,it,ip] + + # true model + if (tt[it] >= 30.0/180.0*math.pi and tt[it] <= 50.0/180.0*math.pi \ + and pp[ip] >= 15.0/180.0*math.pi and pp[ip] <= 40.0/180.0*math.pi \ + and rr[ir] >= 6211.0 and rr[ir] <= 6371.0): + c+=1 + sigma = math.sin(4.0*math.pi*(tt[it]-30.0/180.0*math.pi)/(20.0/180.0*math.pi)) \ + *math.sin(4.0*math.pi*(pp[ip]-15.0/180.0*math.pi)/(25.0/180.0*math.pi)) \ + *math.sin(2.0*math.pi*(rr[ir]-6211.0)/160.0) + else: + sigma = 0.0 + + if sigma < 0: + psi = 60.0/180.0*math.pi + elif sigma > 0: + psi = 150.0/180.0*math.pi + else: + psi = 0.0 + + eta_true[ir,it,ip] = ani_p*abs(sigma)*math.sin(2.0*psi) + xi_true[ir,it,ip] = ani_p*abs(sigma)*math.cos(2.0*psi) + zeta_true[ir,it,ip] = gamma*math.sqrt(eta_true[ir,it,ip]**2 + xi_true[ir,it,ip]**2) + fun_true[ir,it,ip] = fun_init[ir,it,ip]/(1.0+sigma*slow_p) + vel_true[ir,it,ip] = 1.0/fun_true[ir,it,ip] + + + + r_earth = R_earth #6378.1370 + print("depminmax {} {}".format(r_earth-rr1,r_earth-rr2)) + print(c) + + + # %% + # write out + import h5py + + # n_rtp to storing + fout_init = h5py.File(fname_init, 'w') + fout_true = h5py.File(fname_true, 'w') + + # write out the arrays eta_init, xi_init, zeta_init, fun_init, a_init, b_init, c_init, f_init + fout_init.create_dataset('eta', data=eta_init) + fout_init.create_dataset('xi', data=xi_init) + fout_init.create_dataset('zeta',data=zeta_init) + fout_init.create_dataset('vel', data=vel_init) + + # writeout the arrays eta_true, xi_true, zeta_true, fun_true, a_true, b_true, c_true, f_true + fout_true.create_dataset('eta', data=eta_true) + fout_true.create_dataset('xi', data=xi_true) + fout_true.create_dataset('zeta',data=zeta_true) + fout_true.create_dataset('vel', data=vel_true) + + fout_init.close() + fout_true.close() + + # + # create src rec file + + # %% [markdown] + # # prepare src station file + # + # ``` + # 26 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- src  : id_src year month day hour min sec lat lon dep_km mag num_recs id_event + # 26 1 PCBI 1.8900 98.9253 1000.0000 P 10.40 18.000 <- arrival : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arrival_time_sec + # 26 2 MRPI 1.6125 99.3172 1100.0000 P 50.84 19.400 + # 26 3 HUTI 2.3153 98.9711 1600.0000 P 57.84 19.200 + # + # ``` + + # %% + #import random + #random.seed(123456789) + + # dummys + year_dummy = 1998 + month_dummy = 1 + day_dummy = 1 + hour_dummy = 0 + minute_dummy = 0 + second_dummy = 0 + mag_dummy = 3.0 + id_dummy = 1000 + st_name_dummy = 'AAAA' + phase_dummy = 'P' + arriv_t_dummy = 0.0 + + tt1deg = tt1 * 180.0/math.pi + tt2deg = tt2 * 180.0/math.pi + pp1deg = pp1 * 180.0/math.pi + pp2deg = pp2 * 180.0/math.pi + + + n_src = 1 + n_rec = [1 for x in range(n_src)] + + + lines = [] + + pos_src=[] + pos_rec=[] + + dep_srcs=[12.902894] + lon_srcs=[16.794572] + lat_srcs=[37.503373] + + elev_recs = [0.0] + lon_recs = [29.812050] + lat_recs = [36.472809] + + + # create dummy src + for i_src in range(n_src): + # define one point in the domain (rr1 bottom, rr2 top) + dep = dep_srcs[i_src] + lon = lon_srcs[i_src] + lat = lat_srcs[i_src] + + src = [i_src, year_dummy, month_dummy, day_dummy, hour_dummy, minute_dummy, second_dummy, lat, lon, dep, mag_dummy, n_rec[i_src], id_dummy] + lines.append(src) + + pos_src.append([lon,lat,dep]) + + # create dummy station + for i_rec in range(n_rec[i_src]): + #elev_rec = random.uniform(0.0,-10.0) # elevation in m + #lon_rec = random.uniform(pp1deg,pp2deg) + #lat_rec = random.uniform(tt1deg,tt2deg) + + rec = [i_src, i_rec, st_name_dummy+"_"+str(i_rec), lat_recs[i_rec], lon_recs[i_rec], elev_recs[i_rec], phase_dummy, arriv_t_dummy] + lines.append(rec) + + pos_rec.append([lon_recs[i_rec],lat_recs[i_rec],elev_recs[i_rec]]) + + # write out ev_arrivals file + fname = 'src_rec_test.dat' + + with open(fname, 'w') as f: + for line in lines: + for elem in line: + f.write('{} '.format(elem)) + f.write('\n') + + + # %% + # draw src and rec positions + #import matplotlib.pyplot as plt + # + #for i_src in range(n_src): + # plt.scatter(pos_src[i_src][1],pos_src[i_src][0],c='r',marker='o') + # + ## %% + ## plot receivers + #for i_rec in range(n_rec[0]): + # plt.scatter(pos_rec[i_rec][1],pos_rec[i_rec][0],c='b',marker='o') + + +str_input_file = """version : 2 + +domain : + #min_max_dep : [-21.863,308.8137] # depth in km + min_max_dep : [-29.0, 301.0] # depth in km with R = 6371.0 + min_max_lat : [28.5,51.5] # latitude in degree + min_max_lon : [13.5,41.5] # longitude in degree + n_rtp : [{},{},{}] # number of nodes + +source : + #src_dep_lat_lon : [5.0,40.0,24.0] # source depth in km, latitude, longitude in degree + #src_dep_lat_lon : [5750.6370,46.0,36.0] # source depth in km, latitude, longitude in degree + src_rec_file : 'src_rec_test.dat' # source receiver file (if found, src_dep_lat_lon is ignored) + swap_src_rec : 1 # swap source and receiver + +model : + init_model_type : '' # 'fd' (input file) or '1d_ak135' + init_model_path : './test_model_true_{}-{}-{}.h5' # path to initial model file (ignored if init_model_type is '1d_*') + +inversion : + run_mode : 0 # 0 for forward simulation only, 1 for inversion + n_inversion_grid : 1 + + +parallel : + n_sims : 1 # number of simultaneous run + ndiv_rtp : [{},{},{}] # number of subdomains + nproc_sub : {} # number of subprocess used for each subdomain + use_gpu : {} + +calculation : + convergence_tolerance : 1e-4 + max_iterations : 200 + stencil_order : 3 # 1 or 3 + sweep_type : 1 # 0: legacy, 1: cuthill-mckee with shm parallelization + +output_setting : + is_output_source_field : 0 # output the calculated field of all sources 1 for yes; 0 for no; default: 1 + is_verbose_output : 0 # output internal parameters, if no, only model parameters are out. 1 for yes; 0 for no; default: 0 + is_output_model_dat : 0 # output model_parameters_inv_0000.dat or not. 1 for yes; 0 for no; default: 1 + +""".format(n_rtp[0],n_rtp[1],n_rtp[2],n_rtp[0],n_rtp[1],n_rtp[2], ndiv_rtp[0],ndiv_rtp[1],ndiv_rtp[2], n_sweep, use_gpu) + +str_nsweep_ndiv_rtp = str(n_sweep) + '-' + str(ndiv_rtp[0]) + '-' + str(ndiv_rtp[1]) + '-' + str(ndiv_rtp[2]) + +# write out +with open('input_params_{}_{}.yml'.format(str_nrtp, str_nsweep_ndiv_rtp), 'w') as f: + f.write(str_input_file) + + diff --git a/test/old_tests/solver_performance/plot_SIMD_effect.ipynb b/test/old_tests/solver_performance/plot_SIMD_effect.ipynb new file mode 100644 index 0000000..0ca2bae --- /dev/null +++ b/test/old_tests/solver_performance/plot_SIMD_effect.ipynb @@ -0,0 +1,163 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# notebook for plotting the effect of SIMD on the solver performance\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "# data is the fastest time among more than 10 iteration\n", + "# grid size is 100 x 100 x 100\n", + "\n", + "\n", + "t_local_no_simd=0.955768\n", + "t_local_avx=0.281595\n", + "t_fugaku_no_simd=5.10849\n", + "t_fugaku_avx=2.58907\n", + "t_local_cuda=0.058076\n", + "\n", + "speedup_local = t_local_no_simd / t_local_avx\n", + "speedup_fugaku = t_fugaku_no_simd / t_fugaku_avx\n", + "speedup_cuda = t_local_no_simd / t_local_cuda\n", + "\n", + "# plot\n", + "\n", + "\n", + "fig, ax = plt.subplots()\n", + "ax.set_title('Solver performance: 100x100x100 on single core')\n", + "#ax.set_xlabel('Grid size')\n", + "ax.set_ylabel('Elapsed time 1 iteration (best) [s]')\n", + "ax.set_xticks([0, 1, 2])\n", + "ax.set_xticklabels(['intel core i7', 'Fujitsu A64FX', 'NVIDIA GeForce GTX 1070'])\n", + "ax.set_ylim(0, 10)\n", + "ax.bar(0, t_local_no_simd, color='r', label='local (no SIMD)')\n", + "ax.bar(0, t_local_avx, color='b', label='local (AVX+FMA 256bits)')\n", + "ax.bar(1, t_fugaku_no_simd, color='r', label='Fugaku (no SIMD)')\n", + "ax.bar(1, t_fugaku_avx, color='b', label='Fugaku (ARM SVE+FMA 512bits)')\n", + "ax.bar(2, t_local_no_simd, color='r', label='local (no SIMD)')\n", + "ax.bar(2, t_local_cuda, color='b', label='local (CUDA NVIDIA GeForce GTX 1070)')\n", + "ax.legend()\n", + "\n", + "# add text speed up large font\n", + "ax.text(0, 1.4, 'speed up: {:.2f}x'.format(speedup_local), fontsize=15, ha='center')\n", + "ax.text(1, 5.5, 'speed up: {:.2f}x'.format(speedup_fugaku), fontsize=15, ha='center')\n", + "ax.text(2, 1.4, 'speed up: {:.2f}x'.format(speedup_cuda), fontsize=15, ha='center')\n", + "\n", + "plt.show()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnIAAAHWCAYAAADzS2TwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAACYV0lEQVR4nOzdd1gU1/s28HsBKVKlg6JgQYoNjQWNSJSIGFs0FiwgYsdC1FjytffeomKjaOwGo8QkGjWKBLGLFbEERSN2BUEBhfP+4Y95XXcpqyis3p/r2ivZM2fOeWZ2XJ49M3NGJoQQICIiIiK1o1HSARARERHRu2EiR0RERKSmmMgRERERqSkmckRERERqiokcERERkZpiIkdERESkppjIEREREakpJnJEREREaoqJHBEREZGaYiJHEplMhsmTJ5d0GB9FREQEZDIZbty4UWxtnjhxAo0bN4a+vj5kMhni4+OLrW1lrl69ipYtW8LY2BgymQw7d+78oP2VlBs3bkAmkyEiIuK925o8eTJkMtn7B/UOinM73mRvb4/evXsXa5sfkqenJzw9PYtct0aNGh82IPqs9e7dG/b29oXW+1D/fosDE7lidv78eXz33XeoVKkSdHV1Ub58eXz99df46aefSjq0z9LMmTM/SoLz8uVLdO7cGY8fP8aiRYvw888/o1KlSh+0T39/f5w/fx4zZszAzz//jC+++OKD9kcl58iRI5g8eTKePn1a0qEUuzt37mDy5MnF/sPn+fPnWL58OVq2bAkbGxsYGhrCzc0NISEhyMnJUaifm5uLuXPnwsHBAbq6uqhVqxY2b96stO2EhAS0atUKBgYGMDU1Ra9evfDgwYN3ivPEiRMYMmQIXF1doa+vj4oVK6JLly64cuXKe/WtyvYURl325WdLULGJjY0V2traomrVqmLatGlizZo1YuLEiaJly5aiSpUqJR1eoQCISZMmlXQYxUpfX1/4+/srlL969Uq8ePFC5ObmFks/CQkJAoBYs2ZNsbRXmOfPnwsA4n//+99H6a8kJSUlCQAiPDz8vdt6+fKlePHixfsH9Q7eZzvmzZsnAIikpCSFZZmZmSI7O/v9A/xIsrKyRFZWlvT+xIkT+e6XZs2aCVdX13fq5/z580ImkwkvLy8xd+5csXLlSvHtt98KAMLPz0+h/tixYwUA0a9fP7F69WrxzTffCABi8+bNcvVu3bolzM3NRZUqVcSSJUvEjBkzRLly5UTt2rXltquoOnXqJKytrcXQoUPFmjVrxLRp04SVlZXQ19cX58+ff+e+i7o9RaEu+/JdZGdni8zMzELrFef3UHFjIleMWrduLSwsLMSTJ08Ult27d+/jB6Si0p7I5eTkqPxHOL9ErrhFR0cLAGL79u3F1mZ6enq+y27evCkAiHnz5n2U/j60jIyMfJeV5i9QVXyoRE7dfahE7sGDB+LChQsK5QEBAQKAuHr1qlR2+/ZtUaZMGREUFCSV5ebmiqZNm4oKFSqIV69eSeWDBg0Senp64ubNm1LZvn37BACxatUqleOMjY1VSFquXLkidHR0RI8ePeTKi9q3KttTFOqyL1Wh6vddaf4eYiJXjKpXry48PT2LVBeACAoKEhs2bBCOjo5CR0dH1K1bV0RHRyvUvX37tggICBCWlpZCW1tbuLi4iNDQUIV6mZmZYuLEiaJKlSpCW1tbVKhQQfzwww8KvzYyMzNFcHCwMDc3FwYGBqJt27bi1q1bRUrkwsPDlf5BOXjwoAAgDh48KJXlfQmfPHlSuLu7C11dXWFvby9CQkJU3kcuLi5CS0tL/Prrr0KI13/Y3N3dhampqdDV1RV169ZVSKIAKLzykrr8tmP58uXCxcVFaGtrCxsbGzF48GClifmb/P39Ffpp1qyZtPzAgQPiyy+/FGXLlhXGxsaiXbt24tKlS3JtTJo0SQAQFy9eFL6+vsLExETUqVNHaX95dd98VapUSVp++vRp0apVK2FoaCj09fVF8+bNRVxcnFwbedt/6NAhMWjQIGFhYSFMTEzE2bNnBQCxa9cuqe7JkycFAOHm5ibXRqtWrUSDBg2k9zt37hStW7cWNjY2QltbW1SuXFlMnTpV4Y/Gm8dF06ZNhZ6enhg+fLgQQognT54If39/YWRkJIyNjYWfn584c+ZMkb5As7OzxeTJk0XVqlWFjo6OMDU1FU2aNBF//fWXwr57U95xtm3bNuHs7Cx0dXVFo0aNxLlz54QQQqxcuVJUqVJF6OjoiGbNmikcM5UqVVL6Y6FZs2Zyx4GyPwRnz54V/v7+wsHBQejo6AgrKysREBAgHj58qBDz26+8OJT1f/36dfHdd9+JcuXKCT09PdGwYUOxe/duuTp5/2a3bt0qpk+fLsqXLy90dHRE8+bN5f4wK/M+x8mb+yUvhrdfefso71i5ePGi8PT0FHp6esLW1lbMmTOnwPgKEhUVJQCIqKgoqWz58uXSv783bdq0SQAQMTExUpmlpaXo3LmzQruOjo6iRYsWQojXiYunp6cwNzeX+xGflZUlatSoISpXrlxoIlG3bl1Rt25dubKi9K3K9hw4cEDIZDIxYcIEuXobN24UAMSKFSsKjPFj7MuCPHz4UPTs2VMYGhpK3xfx8fEK/878/f2Fvr6+uHbtmvDx8REGBgaiffv20rI3vz+FeL/voZKgpfrJWMpPpUqVEBcXhwsXLhTpAt3o6Ghs3boVw4YNg46ODlasWIFWrVrh+PHj0vr37t1Do0aNIJPJMGTIEFhYWODPP/9EYGAg0tLSEBwcDOD1NQnt2rXDP//8g/79+8PZ2Rnnz5/HokWLcOXKFbnrxPr27YsNGzage/fuaNy4Mf7++2988803H2KX4MmTJ2jdujW6dOkCX19fbNu2DYMGDYK2tjb69OlT6Pp///03tm3bhiFDhsDc3Fy6KHXJkiVo164devTogezsbGzZsgWdO3fG7t27pW35+eef0bdvXzRo0AD9+/cHAFSpUiXfviZPnowpU6bAy8sLgwYNQmJiIkJCQnDixAnExsaiTJkyStcbMGAAypcvj5kzZ2LYsGGoX78+rKysAAD79++Hj48PKleujMmTJ+PFixf46aef0KRJE5w+fVrhItvOnTujWrVqmDlzJoQQSvvr2LEjTExM8P3338PX1xetW7eGgYEBAODixYto2rQpjIyMMHr0aJQpUwarVq2Cp6cnoqOj0bBhQ7m2Bg8eDAsLC0ycOBEZGRmoUaMGTExMcPjwYbRr1w4AEBMTAw0NDZw9exZpaWkwMjJCbm4ujhw5Iu1X4PUNJAYGBhgxYgQMDAzw999/Y+LEiUhLS8O8efPk+n306BF8fHzQrVs39OzZE1ZWVhBCoH379vjnn38wcOBAODs749dff4W/v3++n9nbn9+sWbOkzzwtLQ0nT57E6dOn8fXXXxe4bkxMDKKiohAUFAQAmDVrFtq0aYPRo0djxYoVGDx4MJ48eYK5c+eiT58++Pvvv4sUU2H27duHf//9FwEBAbC2tsbFixexevVqXLx4EUePHoVMJkPHjh1x5coVbN68GYsWLYK5uTkAwMLCQmmb9+7dQ+PGjfH8+XMMGzYMZmZmWLduHdq1a4dffvkF3377rVz92bNnQ0NDA6NGjUJqairmzp2LHj164NixY/nG/T7HyZucnZ0xdepUTJw4Ef3790fTpk0BAI0bN5bqPHnyBK1atULHjh3RpUsX/PLLLxgzZgxq1qwJHx+fou/s/3P37l0AkPYjAJw5cwb6+vpwdnaWq9ugQQNp+Zdffon//vsP9+/fV3o9aoMGDfDHH38AeH3jWFhYGGrVqoWBAwdix44dAIBJkybh4sWLOHToEPT19fONUQiBe/fuwdXVVSorat+qbE/z5s0xePBgzJo1Cx06dEDdunWRkpKCoUOHwsvLCwMHDsw3RuDj7Mv85Obmom3btjh+/DgGDRoEJycn7Nq1K9/vi1evXsHb2xtffvkl5s+fj7Jlyyqt977fQyWiZPPIT8tff/0lNDU1haampnB3dxejR48We/fuVXr9Cv7vl+fJkyelsps3bwpdXV3x7bffSmWBgYHCxsZG7he6EEJ069ZNGBsbi+fPnwshhPj555+FhoaG3K8dIV6PJgAQsbGxQggh/VoZPHiwXL3u3bt/kBE5AGLBggVSWVZWlqhTp46wtLQs9LoeAEJDQ0Phl50QQtruPNnZ2aJGjRqiefPmcuX5nVp9ezvu378vtLW1RcuWLUVOTo5Ub9myZQKACAsLKzDWvO1/e1Qwb1sfPXoklZ09e1ZoaGjIXVuSN+ri6+tbYD958kZ33j612qFDB6GtrS2uX78uld25c0cYGhoKDw8Phe3/8ssvFUbMvvnmG7kRlI4dO4qOHTsKTU1N8eeffwohXo/64a0Rmbc/EyGEGDBggChbtqzcqHDecbFy5Uq5ujt37hQAxNy5c6WyV69eiaZNmxbpl3Dt2rXFN998U2Cd/EbkdHR05I7pVatWCQDC2tpapKWlSeXjxo1TOP7fZ0RO2T7bvHmzACAOHz4slRV0avXt/oODgxVGPp49eyYcHByEvb29dHznHbPOzs5yp/aWLFkiAChcn/W2dz1O3t4vhZ1aBSDWr18vlWVlZQlra2vRqVOnAuNTJisrS7i4uAgHBwfx8uVLuW2pXLmyQv2MjAwBQIwdO1Yu1jfjyfPDDz8IAHLHet5xtGHDBnH06FGhqakpgoODC43z559/FgDkzryo0ndRtyevrGrVqsLV1VVkZmaKb775RhgZGcmd7lTmY+/Lt0VGRgoAYvHixVJZTk6OaN68udIRube3+81lb47Ive/3UEngXavF6Ouvv0ZcXBzatWuHs2fPYu7cufD29kb58uURFRWlUN/d3R316tWT3lesWBHt27fH3r17kZOTAyEEIiMj0bZtWwgh8PDhQ+nl7e2N1NRUnD59GgCwfft2ODs7w8nJSa5e8+bNAQAHDx4EAOlXzrBhw+RiyRvZK25aWloYMGCA9F5bWxsDBgzA/fv3cerUqULXb9asGVxcXBTK9fT0pP9/8uQJUlNT0bRpU2l/qGr//v3Izs5GcHAwNDT+/z+Lfv36wcjICL///rvKbaakpCA+Ph69e/eGqampVF6rVi18/fXXSn9xFvYLuCA5OTn466+/0KFDB1SuXFkqt7GxQffu3fHPP/8gLS1Nbp1+/fpBU1NTrixvP2ZkZAAA/vnnH7Ru3Rp16tRBTEwMgNejLzKZDF9++aW03pufybNnz/Dw4UM0bdoUz58/x+XLl+X60NHRQUBAgFzZH3/8AS0tLQwaNEgq09TUxNChQ4u0/SYmJrh48SKuXr1apPpvatGihdzoaN7IZadOnWBoaKhQ/u+//6rchzJv7rPMzEw8fPgQjRo1AoB3Ppb/+OMPNGjQQO6zMTAwQP/+/XHjxg1cunRJrn5AQAC0tbWl93mjYoVt47seJ6oyMDBAz549pffa2tpo0KDBO30GQ4YMwaVLl7Bs2TJoaf3/E1IvXryAjo6OQn1dXV1p+Zv/LUpdAOjfvz+8vb0xdOhQ9OrVC1WqVMHMmTMLjPHy5csICgqCu7u73CiQKn0XdXsAoGzZsoiIiEBCQgI8PDzw+++/Y9GiRahYsWKBcX7sffm2PXv2oEyZMujXr59UpqGhIY2qK/Pmd0t+3vd7qCQwkStm9evXx44dO/DkyRMcP34c48aNw7Nnz/Ddd98pfIFWq1ZNYX1HR0c8f/4cDx48wIMHD/D06VOsXr0aFhYWcq+8P4L3798H8HpOsYsXLyrUc3R0lKt38+ZNaGhoKJxirF69erHvCwCwtbVVOIWQF1NR5nBzcHBQWr579240atQIurq6MDU1hYWFBUJCQpCamvpOcd68eROA4n7Q1tZG5cqVpeXF0Sbw+pTSw4cPpT+CefLb3qJ48OABnj9/nm9/ubm5uHXrVqH9NW3aFK9evUJcXBwSExNx//59NG3aFB4eHnJ/oF1cXOQS1IsXL+Lbb7+FsbExjIyMYGFhIf0BfvtzKV++vFzyALzeXzY2NtJp4jxFPTanTp2Kp0+fwtHRETVr1sQPP/yAc+fOFWndt/9oGRsbAwDs7OyUlj958qRI7Rbm8ePHGD58OKysrKCnpwcLCwvpM3mfYzm/YyBv+Zve3vZy5coBKHwb3/U4UVWFChUU5v4rV66cyp/BvHnzsGbNGkybNg2tW7eWW6anp4esrCyFdTIzM6Xlb/63KHXzhIaG4vnz57h69SoiIiIUlr/p7t27+Oabb2BsbIxffvlF7keWKn0XdXvyNGnSBIMGDcLx48fh7e1d6GUvJbUv35T3ffH2KdKqVasqra+lpYUKFSrk297b7b7r91BJ4DVyH4i2tjbq16+P+vXrw9HREQEBAdi+fTsmTZpU5DZyc3MBAD179sz3/HytWrWkujVr1sTChQuV1nv7D9K7ym8yVWVzCRUHZf+QY2Ji0K5dO3h4eGDFihWwsbFBmTJlEB4ejk2bNn2QOD6Wgr64PlZ/X3zxBXR1dXH48GFUrFgRlpaWcHR0RNOmTbFixQpkZWUhJiZG7lqrp0+folmzZjAyMsLUqVNRpUoV6Orq4vTp0xgzZox0LBfU7/vy8PDA9evXsWvXLvz1119Yu3YtFi1ahJUrV6Jv374Frvv2qGRh5eKN6xcL+jeR3/p5unTpgiNHjuCHH35AnTp1YGBggNzcXLRq1Uphn30oRdlGZd7lOPmY8b0pIiICY8aMwcCBAzF+/HiF5TY2Njh48CCEEHKfZ0pKCoDXP0jz6r1Z/qaUlBSYmpoqjDAdOnRISlbOnz8Pd3d3pTGmpqbCx8cHT58+RUxMjNTnmzEWte+ibk+erKwsHDp0CABw/fp1PH/+PN9ryEpyX74PHR0dubMtnxImch9B3sWcbx+wyk4BXblyBWXLlpUuZDY0NEROTg68vLwK7KNKlSo4e/YsWrRoUeDM9ZUqVUJubi6uX78u9wsjMTGxSNuS92v97YlJ8xuxunPnDjIyMuRG5fImuizKbNrKREZGQldXF3v37pX7hx4eHq5Qt6iz+OdN3puYmCh3WjI7OxtJSUmF7v/C2nzb5cuXYW5uXuAFz6qysLBA2bJl8+1PQ0OjSAl93qmrmJgYVKxYUTrV1rRpU2RlZWHjxo24d+8ePDw8pHUOHTqER48eYceOHXLlSUlJRY6/UqVKOHDgANLT0+V+DRf12AQAU1NTBAQEICAgAOnp6fDw8MDkyZMLTeTeR7ly5ZRO1Hvz5k25Y+ltT548wYEDBzBlyhRMnDhRKlf2vaDK0ygqVaqU7zGQt7w4vMtxosyHftLGrl270LdvX3Ts2BHLly9XWqdOnTpYu3YtEhIS5C7lyLvho06dOgBejyRbWFjg5MmTCm0cP35cqpcn78aBli1bQltbG6NGjYK3t7fCZ5CZmYm2bdviypUr2L9/v9LLSVTpu6jbk2fSpElISEjA/PnzMWbMGIwdOxZLly5V6Kck9+XbKlWqhIMHDyokndeuXStwvcIUx/fQx/ZppqclJO9XyNvyroV6e2g2Li5O7jqYW7duYdeuXWjZsiU0NTWhqamJTp06ITIyEhcuXFBo983Zr7t06YL//vsPa9asUaj34sUL6RRe3l1eb/8jXbx4cZG2Me+U7OHDh6WynJwcrF69Wmn9V69eYdWqVdL77OxsrFq1ChYWFnLXB6pCU1MTMplMbhTwxo0bSp/goK+vX6TZ8L28vKCtrY2lS5fKfYahoaFITU19p7t6bWxsUKdOHaxbt04uhgsXLuCvv/5SOCXxvjQ1NdGyZUvs2rVL7rT1vXv3sGnTJnz55ZcwMjIqUltNmzbFsWPHcPDgQekPtLm5OZydnTFnzhypzpt9A/KjJNnZ2VixYkWR42/dujVevXqFkJAQqSwnJ6fIT0V59OiR3HsDAwNUrVpV6amb4lSlShUcPXoU2dnZUtnu3bsVTmO/Tdk+A5T/W8xL+ItyLLdu3RrHjx9HXFycVJaRkYHVq1fD3t5eaZLwrlQ9TpRRZdtUdfjwYXTr1g0eHh7YuHFjviMy7du3R5kyZeSOVyEEVq5cifLly8vdRdupUyeFz/fAgQO4cuUKOnfuLNduv379kJubi9DQUKxevRpaWloIDAyU+8xzcnLQtWtXxMXFYfv27fmO2KnStyrbc+zYMcyfPx/BwcEYOXIkfvjhByxbtgzR0dGlal++zdvbGy9fvpT7m5ebm5tvgllU7/s9VBI4IleMhg4diufPn+Pbb7+Fk5MTsrOzceTIEWzduhX29vYKF3fXqFED3t7ectOPAMCUKVOkOrNnz8bBgwfRsGFD9OvXDy4uLnj8+DFOnz6N/fv34/HjxwCAXr16Ydu2bRg4cCAOHjyIJk2aICcnB5cvX8a2bduwd+9efPHFF6hTpw58fX2xYsUKpKamonHjxjhw4ECRf8W4urqiUaNGGDduHB4/fgxTU1Ns2bIFr169Ulrf1tYWc+bMwY0bN+Do6IitW7ciPj4eq1evznc6j8J88803WLhwIVq1aoXu3bvj/v37WL58OapWrapwTVS9evWwf/9+LFy4ELa2tnBwcFCYggN4PZo1btw4TJkyBa1atUK7du2QmJiIFStWoH79+nIXW6ti3rx58PHxgbu7OwIDA6XpR4yNjT/Ic22nT5+Offv24csvv8TgwYOhpaWFVatWISsrC3Pnzi1yO02bNsWMGTNw69YtuT/EHh4eWLVqFezt7eWuN2ncuDHKlSsHf39/DBs2DDKZDD///LNKp7/atm2LJk2aYOzYsbhx4wZcXFywY8eOIl8r5uLiAk9PT9SrVw+mpqY4efIkfvnlFwwZMqTIMbyLvn374pdffkGrVq3QpUsXXL9+HRs2bChwqhsAMDIygoeHB+bOnYuXL1+ifPny+Ouvv5SOYub96Pnf//6Hbt26oUyZMmjbtq3SEd2xY8di8+bN8PHxwbBhw2Bqaop169YhKSkJkZGRxXp6SdXjRJkqVarAxMQEK1euhKGhIfT19dGwYcP3ul4UeD0i2q5dO8hkMnz33XfYvn273PJatWpJl6ZUqFABwcHBmDdvHl6+fIn69etj586diImJwcaNG+VO7/7444/Yvn07vvrqKwwfPhzp6emYN28eatasKfcdHx4ejt9//x0RERHSPvjpp5/Qs2dPhISEYPDgwQCAkSNHIioqCm3btsXjx4+xYcMGuTjf/O4pat9F3Z7MzEz4+/ujWrVqmDFjBoDXf39+++03BAQE4Pz589DX1y/xfalMhw4d0KBBA4wcORLXrl2Dk5MToqKipL+J7zrS+77fQyXio98n+wn7888/RZ8+fYSTk5MwMDCQHtc1dOhQhSc74I3JbqtVqyZ0dHSEm5ub3PQdee7duyeCgoKEnZ2dKFOmjLC2thYtWrQQq1evlquXnZ0t5syZI1xdXYWOjo4oV66cqFevnpgyZYpITU2V6r148UIMGzZMmJmZCX19fZUmBBbi9WSjXl5e0gSmP/74ozQbd2ETAleqVEksW7asSPszbx8pExoaKu03JycnER4ernRqicuXLwsPDw+hp6dXpAmBly1bJpycnESZMmWElZWVGDRoUKETAguR//QjQgixf/9+0aRJE6GnpyeMjIxE27Zt850Q+MGDB4X2JUT+048I8XrKB29vb2FgYCDKli0rvvrqK3HkyBG5Onnbf+LECaXtp6WlCU1NTWFoaCg3PcmGDRsEANGrVy+FdWJjY0WjRo2kSVvzpt/J77hQ5tGjR6JXr17SRJy9evUq8kSc06dPFw0aNBAmJiZCT09PODk5iRkzZshNc1PQhMBvym//5vc5L1iwQJpQt0mTJuLkyZNFmn7k9u3b4ttvvxUmJibC2NhYdO7cWdy5c0fpv8Vp06aJ8uXLCw0NjSJPCGxiYiJ0dXVFgwYN8p0Q+O1tUWUG+3c5Tt7eL0IIsWvXLmnS7zf7zu9YUTaJ69vym2w47/X2/s3JyREzZ84UlSpVEtra2sLV1VVs2LBBadsXLlwQLVu2FGXLlhUmJiaiR48e4u7du9LyW7duCWNjY9G2bVuFdb/99luhr68v/v33X2kbC4pT1b5V2Z7vv/9eaGpqimPHjsmVnzx5UmhpaYlBgwaV+L4syIMHD0T37t2lCYF79+4tYmNjBQCxZcsWqV7ehMDKKDuW3ud7qCTIhFDhJzMVG5lMhqCgICxbtqykQ/lgPD098fDhQ6WnhYmIiIrbzp078e233+Kff/5BkyZNSjqcj4LXyBEREZHaeXueubxr2YyMjFC3bt0Siurj4zVyREREpHaGDh2KFy9ewN3dHVlZWdixYweOHDmCmTNnfvSpnEoSEzkiIiJSO82bN8eCBQuwe/duZGZmomrVqvjpp58++A1OpQ2vkSMiIiJSU7xGjoiIiEhNMZEjIiIiUlOf/DVyubm5uHPnDgwNDT/4o2CIiIiI3pcQAs+ePYOtrW2hk3h/8oncnTt3iu2B8UREREQfy61btwp9Osonn8gZGhoCeL0zivqcSSIiIqKSkpaWBjs7OymHKcgnn8jlnU41MjJiIkdERERqoyiXhPFmByIiIiI1xUSOiIiISE0xkSMiIiJSUyV6jVxISAhCQkJw48YNAICrqysmTpwIHx8fAICnpyeio6Pl1hkwYABWrlxZ7LHk5OTg5cuXxd4uEdGnQltbu9CpEIjo4yrRRK5ChQqYPXs2qlWrBiEE1q1bh/bt2+PMmTNwdXUFAPTr1w9Tp06V1ilbtmyxxiCEwN27d/H06dNibZeI6FOjoaEBBwcHaGtrl3QoRPR/SjSRa9u2rdz7GTNmICQkBEePHpUSubJly8La2vqDxZCXxFlaWqJs2bKcNJiISIm8ydVTUlJQsWJFflcSlRKlZvqRnJwcbN++HRkZGXB3d5fKN27ciA0bNsDa2hpt27bFhAkTChyVy8rKQlZWlvQ+LS2twD7zkjgzM7Pi2RAiok+UhYUF7ty5g1evXqFMmTIlHQ4RoRQkcufPn4e7uzsyMzNhYGCAX3/9FS4uLgCA7t27o1KlSrC1tcW5c+cwZswYJCYmYseOHfm2N2vWLEyZMqVIfeddE1fcp2uJiD5FeadUc3JymMgRlRIyIYQoyQCys7ORnJyM1NRU/PLLL1i7di2io6OlZO5Nf//9N1q0aIFr166hSpUqSttTNiJnZ2eH1NRUhQmBMzMzkZSUBAcHB+jq6hbvhhERfWL4nUn0caSlpcHY2Fhp7vK2Eh+R09bWRtWqVQEA9erVw4kTJ7BkyRKsWrVKoW7Dhg0BoMBETkdHBzo6Oh8uYCIiIqJSotTdR56bmys3ovam+Ph4AICNjc1HjKj08fT0RHBwcInG0Lt3b3To0EF6/zFjmjBhAvr37//R+75x4wZkMpl0HJZmERERMDExKekwSr1Lly6hQoUKyMjIKOlQiIjeSYkmcuPGjcPhw4dx48YNnD9/HuPGjcOhQ4fQo0cPXL9+HdOmTcOpU6dw48YNREVFwc/PDx4eHqhVq9aHDUwm+7ivT8COHTswbdq0D97P3bt3sWTJEvzvf/97577VKSF7V127dsWVK1ek971794ZMJlN45d0d/jE9ePAAgwYNQsWKFaGjowNra2t4e3sjNjZWqmNvb4/FixfLvZfJZNiyZYtCe66urpDJZIiIiFCoL5PJoKenB3t7e3Tp0gV///233LouLi5o1KgRFi5cWOzbSUT0MZRoInf//n34+fmhevXqaNGiBU6cOIG9e/fi66+/hra2Nvbv34+WLVvCyckJI0eORKdOnfDbb7+VZMiUD1NTUxgaGn7wftauXYvGjRujUqVKH73vkpCdnf1O6+np6cHS0lJ6v2TJEqSkpEivW7duwdTUFJ07dy6uUIusU6dOOHPmDNatW4crV64gKioKnp6eePToUYHr2dnZITw8XK7s6NGjuHv3LvT19RXqT506FSkpKUhMTMT69ethYmICLy8vzJgxQ65eQEAAQkJC8OrVq/ffOCKij0184lJTUwUAkZqaqrDsxYsX4tKlS+LFixfyC4CP+1JRs2bNRFBQkAgKChJGRkbCzMxMjB8/XuTm5kp11q9fL+rVqycMDAyElZWV8PX1Fffu3ZOWP378WHTv3l2Ym5sLXV1dUbVqVREWFiYtT05OFp07dxbGxsaiXLlyol27diIpKUla7u/vL9q3by8X0/Dhw6X3lSpVEjNmzBABAQHCwMBA2NnZiVWrVsltR2F9KOPq6iqWLVumsD9U6RuA3KtZs2bSsjVr1ggnJyeho6MjqlevLpYvXy4tS0pKEgDEmTNn8o0vMzNTjB49WlSoUEFoa2uLKlWqiLVr10rLDx06JOrXry+0tbWFtbW1GDNmjHj58qXctgQFBYnhw4cLMzMz4enpKYQQ4vz586JVq1ZCX19fWFpaip49e4oHDx7kG0d4eLgwNjbOd/mvv/4qZDKZuHHjRqFt7NmzRzg5OQl9fX3h7e0t7ty5I9XJyckRU6ZMEeXLlxfa2tqidu3a4s8//8y3zSdPnggA4tChQ/nWEeL1Z7ho0SK592PHjhU6OjoiOTlZKu/Xr58YOnSoMDY2FuHh4fmun2fixIlCQ0NDXL58WSrLysoSOjo6Yv/+/QXGRAV8ZxJRsSood3lbqbtGjopm3bp10NLSwvHjx7FkyRIsXLgQa9eulZa/fPkS06ZNw9mzZ7Fz507cuHEDvXv3lpZPmDABly5dwp9//omEhASEhITA3NxcWtfb2xuGhoaIiYlBbGwsDAwM0KpVK5VGiBYsWIAvvvgCZ86cweDBgzFo0CAkJia+cx+PHz/GpUuX8MUXX7xX38ePHwcA7N+/HykpKdJ0Nhs3bsTEiRMxY8YMJCQkYObMmZgwYQLWrVtX5G328/PD5s2bsXTpUiQkJGDVqlUwMDAAAPz3339o3bo16tevj7NnzyIkJAShoaGYPn26XBvr1q2DtrY2YmNjsXLlSjx9+hTNmzeHm5sbTp48iT179uDevXvo0qVLkeN6W2hoKLy8vORGNpV5/vw55s+fj59//hmHDx9GcnIyRo0aJS1fsmQJFixYgPnz5+PcuXPw9vZGu3btcPXqVaXtGRgYwMDAADt37sz3Wtj8WFlZwdvbW/o8nj9/jq1bt6JPnz5FbmP48OEQQmDXrl1Smba2NurUqYOYmBiV4iEiKhU+fF5Zsj7VETlnZ2e5EbgxY8YIZ2fnfNc5ceKEACCePXsmhBCibdu2IiAgQGndn3/+WVSvXl2u/aysLKGnpyf27t0rhCjaiFzPnj2l97m5ucLS0lKEhIQUuY+3nTlzRgCQG5F5l77zG1mrUqWK2LRpk1zZtGnThLu7e4Hr5UlMTBQAxL59+5Qu//HHHxW2efny5cLAwEDk5ORI2+Lm5qYQQ8uWLeXKbt26JQCIxMREpX0VNCL333//CU1NTbF161aly99sA4C4du2aXLxWVlbSe1tbWzFjxgy59erXry8GDx6cb7u//PKLKFeunNDV1RWNGzcW48aNE2fPnpWro2xEbtGiRWLnzp2iSpUqIjc3V6xbt07aV0UdkRNCCCsrKzFo0CC5sm+//Vb07t0735jpNY7IEX0cHJH7DDRq1EjuETnu7u64evUqcnJyAACnTp1C27ZtUbFiRRgaGqJZs2YAgOTkZADAoEGDsGXLFtSpUwejR4/GkSNHpLbOnj2La9euwdDQUBpBMTU1RWZmJq5fv17kGN+8KUUmk8Ha2hr3799/5z5evHgBAEWav6qgvpXJyMjA9evXERgYKMVjYGCA6dOnF3mb4+PjoampKe3rtyUkJMDd3V3uc2vSpAnS09Nx+/ZtqaxevXpy6509exYHDx6Ui8vJyQkAVPo88qxbtw4mJiZydx3np2zZsnJT/djY2Ej7MS0tDXfu3EGTJk3k1mnSpAkSEhLybbNTp064c+cOoqKi0KpVKxw6dAh169aVu1khP9988w3S09Nx+PBhhIWFqTQal0cIofB4KT09PTx//lzltoiISlqJzyNHxS8jIwPe3t7w9vbGxo0bYWFhgeTkZHh7e0unLX18fHDz5k388ccf2LdvH1q0aIGgoCDMnz8f6enpqFevHjZu3KjQtoWFRZHjeHvmd5lMhtzcXAB4pz7yTv0+efKk0DgK6luZ9PR0AMCaNWuk+QrzaGpqFthXHj09vSLVK8zbF+6np6ejbdu2mDNnjkJdVafiEUIgLCwMvXr1KtKDz5XtR1EMc4jr6uri66+/xtdff40JEyagb9++mDRpktzpf2W0tLTQq1cvTJo0CceOHcOvv/6qUr+PHj3CgwcP4ODgIFf++PHjfOempE+PbMqnMVsAlRwxqUSfpSCHI3Jq6tixY3Lvjx49imrVqkFTUxOXL1/Go0ePMHv2bDRt2hROTk5KR6MsLCzg7++PDRs2YPHixVi9ejUAoG7durh69SosLS1RtWpVuZexsXGxxP8ufVSpUgVGRka4dOnSe/X95mOG8lhZWcHW1hb//vuvQjxv/9HPT82aNZGbm4vo6Gily52dnREXFyeXCMXGxsLQ0BAVKlTIt926devi4sWLsLe3V4hN2d2aBYmOjsa1a9cQGBio0nrKGBkZwdbWVm7aEOD1Nil7MktBXFxcijyXW58+fRAdHY327dujXLlyKvWzZMkSaGhoKIxGXrhwAW5ubiq1RURUGjCRU1PJyckYMWIEEhMTsXnzZvz0008YPnw4AKBixYrQ1tbGTz/9hH///RdRUVEK86xNnDgRu3btwrVr13Dx4kXs3r0bzs7OAIAePXrA3Nwc7du3R0xMDJKSknDo0CEMGzZM7hTg+3iXPjQ0NODl5YV//vnnvfq2tLSEnp6edNNAamoqAGDKlCmYNWsWli5diitXruD8+fMIDw8v8hxj9vb28Pf3R58+fbBz505pm7Zt2wYAGDx4MG7duoWhQ4fi8uXL2LVrFyZNmoQRI0ZAQyP/f4pBQUF4/PgxfH19ceLECVy/fh179+5FQECAXDJaFKGhoWjYsCFq1Kih0nr5+eGHHzBnzhxs3boViYmJGDt2LOLj46Vj8W2PHj1C8+bNsWHDBpw7dw5JSUnYvn075s6di/bt2xepT2dnZzx8+FBhKpK3PXv2DHfv3sWtW7dw+PBh9O/fH9OnT8eMGTOkp8kAr+cV/O+//+Dl5VX0DSciKiWYyKkpPz8/vHjxAg0aNEBQUBCGDx8uPe3AwsICERER2L59O1xcXDB79mzMnz9fbn1tbW2MGzcOtWrVgoeHBzQ1NaXJVsuWLYvDhw+jYsWK6NixI5ydnREYGIjMzMxCn/lWVO/aR9++fbFly5YCT5MWRktLC0uXLsWqVatga2srJRB9+/bF2rVrER4ejpo1a6JZs2aIiIgo8ogcAISEhOC7777D4MGD4eTkhH79+kkjTeXLl8cff/yB48ePo3bt2hg4cCACAwMxfvz4AtvMG/XKyclBy5YtUbNmTQQHB8PExKTABPBtqampiIyMLJbRuDzDhg3DiBEjMHLkSNSsWRN79uxBVFQUqlWrprS+gYEBGjZsiEWLFsHDwwM1atTAhAkT0K9fPyxbtqzI/ZqZmRV6KnvixImwsbFB1apV0atXL6SmpuLAgQMYM2aMXL3NmzejZcuWhd7BS0RUGslEcVzwUooV9OBZPgBa/Qgh0LBhQ3z//ffw9fUt6XBIzWVnZ6NatWrYtGmTwk0bpOhT+c7kNXL0vj70NXIF5S5v44gcqRWZTIbVq1dzFn4qFsnJyfjxxx+ZxBGR2uJdq6R26tSpgzp16pR0GPQJyLtphIhIXXFEjoiIiEhNMZEjIiIiUlNM5IiIiIjUFBM5IiIiIjXFRI6IiIhITTGRIyIiIlJTTOSIiIiI1BQTOTXk6emJ4ODgD97PjRs3IJPJEB8f/8H7el8REREwMTEp6TCIiIg+KiZyamjHjh2YNm1akeurU0L2rrp27YorV65I73v37g2ZTKbwcnV1LcEoiYiIihcTOTVkamoKQ0PDkg7jg8jOzn6n9fT09GBpaSm9X7JkCVJSUqTXrVu3YGpqis6dOxe5zYiICHh6er5TPERERB8DEzk19PapVXt7e8ycORN9+vSBoaEhKlasiNWrV0vLHRwcAABubm6QyWRyycnatWvh7OwMXV1dODk5YcWKFSrFkpWVhTFjxsDOzg46OjqoWrUqQkNDpeXR0dFo0KABdHR0YGNjg7Fjx8o9J9XT0xNDhgxBcHAwzM3N4e3tDQC4cOECfHx8YGBgACsrK/Tq1QsPHz7MN463T60aGxvD2tpaep08eRJPnjxBQECASttHRERUmjGR+0QsWLAAX3zxBc6cOYPBgwdj0KBBSExMBAAcP34cALB//36kpKRgx44dAICNGzdi4sSJmDFjBhISEjBz5kxMmDAB69atK3K/fn5+2Lx5M5YuXYqEhASsWrUKBgYGAID//vsPrVu3Rv369XH27FmEhIQgNDQU06dPl2tj3bp10NbWRmxsLFauXImnT5+iefPmcHNzw8mTJ7Fnzx7cu3cPXbp0eef9ExoaCi8vL1SqVOmd2yAiIipttEo6ACoerVu3xuDBgwEAY8aMwaJFi3Dw4EFUr14dFhYWAAAzMzNYW1tL60yaNAkLFixAx44dAbweubt06RJWrVoFf3//Qvu8cuUKtm3bhn379sHLywsAULlyZWn5ihUrYGdnh2XLlkEmk8HJyQl37tzBmDFjMHHiRGhovP4dUa1aNcydO1dab/r06XBzc8PMmTOlsrCwMNjZ2eHKlStwdHRUad/cuXMHf/75JzZt2qTSekRERKUdE7lPRK1ataT/l8lksLa2xv379/Otn5GRgevXryMwMBD9+vWTyl+9egVjY+Mi9RkfHw9NTU00a9ZM6fKEhAS4u7tDJpNJZU2aNEF6ejpu376NihUrAgDq1asnt97Zs2dx8OBBaWTvTdevX1c5kVu3bh1MTEzQoUOHAuslJyfDxcVFev/q1Su8fPlSLo4ff/wRP/74o0r9ExERfShM5D4RZcqUkXsvk8mQm5ubb/309HQAwJo1a9CwYUO5ZZqamkXqU09PT8UoldPX11eIrW3btpgzZ45CXRsbG5XaFkIgLCwMvXr1gra2doF1bW1t5e7s3bFjByIjI7Fx40apzNTUVKX+iYiIPiQmcp+BvAQmJydHKrOysoKtrS3+/fdf9OjR453arVmzJnJzcxEdHS2dWn2Ts7MzIiMjIYSQRuViY2NhaGiIChUq5Ntu3bp1ERkZCXt7e2hpvd8hGh0djWvXriEwMLDQulpaWqhatar03tLSEnp6enJlREREpQlvdvgM5CUkeTcNpKamAgCmTJmCWbNmYenSpbhy5QrOnz+P8PBwLFy4sEjt2tvbw9/fH3369MHOnTuRlJSEQ4cOYdu2bQCAwYMH49atWxg6dCguX76MXbt2YdKkSRgxYoR0fZwyQUFBePz4MXx9fXHixAlcv34de/fuRUBAgFwyWhShoaFo2LAhatSoodJ6RERE6oCJ3GdAS0sLS5cuxapVq2Bra4v27dsDAPr27Yu1a9ciPDwcNWvWRLNmzRARESFNV1IUISEh+O677zB48GA4OTmhX79+yMjIAACUL18ef/zxB44fP47atWtj4MCBCAwMxPjx4wts09bWFrGxscjJyUHLli1Rs2ZNBAcHw8TEpMAE8G2pqamIjIws0mgcERGROpIJIURJB/EhpaWlwdjYGKmpqTAyMpJblpmZiaSkJDg4OEBXV7eEIiQiUg+fynembIqs8EpEBRCTPmzqVFDu8jaOyBERERGpKSZyRERERGqKiRwRERGRmmIiR0RERKSmmMjRJy8iIgImJiYlHQYOHToEmUyGp0+flnQoRET0iWAiR/QBeHp6Ijg4WK6scePGSElJKfIj0IiIiArDRI4+uuzs7GJpJycnp8DHkJU22trasLa2lnv2LBER0ftgIqeETPZxX6ry9PTE0KFDERwcjHLlysHKygpr1qxBRkYGAgICYGhoiKpVq+LPP/+UW+/ChQvw8fGBgYEBrKys0KtXLzx8+PC9242OjkaDBg2go6MDGxsbjB07Fq9evZJrd8iQIQgODoa5uTm8vb3Rp08ftGnTRq6dly9fwtLSEqGhoUq3O+8UaVRUFFxcXKCjo4Pk5GRkZWVh1KhRKF++PPT19dGwYUMcOnSowH0YEhKCKlWqQFtbG9WrV8fPP/8st/zp06cYMGAArKysoKurixo1amD37t0AgEePHsHX1xfly5dH2bJlUbNmTWzevFlat3fv3oiOjsaSJUsgk8kgk8lw48YNpadWIyMj4erqCh0dHdjb22PBggVycdjb22PmzJno06cPDA0NUbFiRaxevbrAbSMios8HEzk1tW7dOpibm+P48eMYOnQoBg0ahM6dO6Nx48Y4ffo0WrZsiV69euH58+cAXicmzZs3h5ubG06ePCk9rqtLly7v1e5///2H1q1bo379+jh79ixCQkIQGhqK6dOnK7Srra2N2NhYrFy5En379sWePXuQkpIi1dm9ezeeP3+Orl275rvdz58/x5w5c7B27VpcvHgRlpaWGDJkCOLi4rBlyxacO3cOnTt3RqtWrXD16lWlbfz6668YPnw4Ro4ciQsXLmDAgAEICAjAwYMHAQC5ubnw8fFBbGwsNmzYgEuXLmH27NnQ1NQE8HpS1Hr16uH333/HhQsX0L9/f/Tq1QvHjx8HACxZsgTu7u7o168fUlJSkJKSAjs7O4U4Tp06hS5duqBbt244f/48Jk+ejAkTJiAiIkKu3oIFC/DFF1/gzJkzGDx4MAYNGoTExMR89xEREX0++GQHJbOUf+wzX6p+Ap6ensjJyUFMTAyA16cYjY2N0bFjR6xfvx4AcPfuXdjY2CAuLg6NGjXC9OnTERMTg71790rt3L59G3Z2dkhMTISjo+M7tfu///0PkZGRSEhIkE4ZrlixAmPGjEFqaio0NDTg6emJtLQ0nD59Wm47XF1d4e/vj9GjRwMA2rVrBzMzM4SHhyvd7oiICAQEBCA+Ph61a9cGACQnJ6Ny5cpITk6Gra2tVNfLywsNGjTAzJkzERERgeDgYGkkrEmTJnB1dZUb2erSpQsyMjLw+++/46+//oKPjw8SEhLg6OhYpM+kTZs2cHJywvz586XPqE6dOli8eLFU59ChQ/jqq6/w5MkTmJiYoEePHnjw4AH++usvqc7o0aPx+++/4+LFiwBej8g1bdpUGjEUQsDa2hpTpkzBwIEDixQbUXHhkx2IXuOTHei91apVS/p/TU1NmJmZoWbNmlKZlZUVAOD+/fsAgLNnz+LgwYMwMDCQXk5OTgCA69evv3O7CQkJcHd3l7vuq0mTJkhPT8ft27elsnr16ilsQ9++faWk7d69e/jzzz/Rp0+fArdbW1tbLsbz588jJycHjo6OctsWHR0tt11vSkhIQJMmTeTKmjRpgoSEBABAfHw8KlSokG8Sl5OTg2nTpqFmzZowNTWFgYEB9u7di+Tk5AJjL2ocV69eRU5OjlT25vbKZDJYW1tL+5+IiD5vWiUdAL2bMmXKyL2XyWRyZXmJVd7NAOnp6Wjbti3mzJmj0JaNjc07t1tU+vr6CmV+fn4YO3Ys4uLicOTIETg4OKBp06YFtqOnpyeXNKanp0NTUxOnTp2STn3mMTAwUCnGN/soyLx587BkyRIsXrwYNWvWhL6+PoKDg4vtJo63KftM1OkmDyIi+nCYyH0m6tati8jISNjb20NLq/g+dmdnZ0RGRkIIISVYsbGxMDQ0RIUKFQpc18zMDB06dEB4eDji4uIQEBCgcv9ubm7IycnB/fv3C00C34w5NjYW/v7+UllsbCxcXFwAvB4Bu337Nq5cuaJ0VC42Nhbt27dHz549AbxOaq9cuSKtD7weOXxzVK2gON5u29HRUSEpJSIiUoanVj8TQUFBePz4MXx9fXHixAlcv34de/fuRUBAQKEJR0EGDx6MW7duYejQobh8+TJ27dqFSZMmYcSIEdDQKPzw6tu3L9atW4eEhAS5xKqoHB0d0aNHD/j5+WHHjh1ISkrC8ePHMWvWLPz+++9K1/nhhx8QERGBkJAQXL16FQsXLsSOHTswatQoAECzZs3g4eGBTp06Yd++fUhKSsKff/6JPXv2AACqVauGffv24ciRI0hISMCAAQNw7949uT7s7e1x7Ngx3LhxAw8fPlQ6gjZy5EgcOHAA06ZNw5UrV7Bu3TosW7ZMioOIiKgwTOQ+E7a2toiNjUVOTg5atmyJmjVrIjg4GCYmJkVKuPJTvnx5/PHHHzh+/Dhq166NgQMHIjAwEOPHjy/S+l5eXrCxsYG3t7fczQqqCA8Ph5+fH0aOHInq1aujQ4cOOHHiBCpWrKi0focOHbBkyRLMnz8frq6uWLVqFcLDw+Hp6SnViYyMRP369eHr6wsXFxeMHj1aSnjHjx+PunXrwtvbG56enrC2tkaHDh3k+hg1ahQ0NTXh4uICCwsLpdfP1a1bF9u2bcOWLVtQo0YNTJw4EVOnTkXv3r3faT8QEdHnh3etquFdq5+S9PR0lC9fHuHh4ejYsWNJh0NEBeBdq0Sv8a7V/xMSEoJatWrByMgIRkZGcHd3l5tsNjMzE0FBQTAzM4OBgQE6deqkcArrQxDi474+R7m5ubh//z6mTZsGExMTtGvXrqRDIiIiUjslmshVqFABs2fPxqlTp3Dy5Ek0b94c7du3l+bQ+v777/Hbb79h+/btiI6Oxp07dzhq84lITk6GlZUVNm3ahLCwsGK9AYOIiOhzUaJ/Pdu2bSv3fsaMGQgJCcHRo0dRoUIFhIaGYtOmTWjevDmA19dCOTs74+jRo2jUqFFJhEzFxN7eHp/4WX0iIqIPrtTc7JCTk4MtW7YgIyMD7u7uOHXqFF6+fAkvLy+pjpOTEypWrIi4uLgSjJSIiIiodCjx81nnz5+Hu7s7MjMzYWBggF9//RUuLi6Ij4+HtrY2TExM5OpbWVnh7t27+baXlZWFrKws6X1aWtqHCp2IiIioRJX4iFz16tURHx+PY8eOYdCgQfD398elS5feub1Zs2bB2NhYeil7WDmpJw8PD2zatKmkwyAlJk+ejDp16hRYp3fv3grTtKji4cOHsLS0lHv0GxHR567EEzltbW1UrVoV9erVw6xZs1C7dm0sWbIE1tbWyM7Olh50nufevXuwtrbOt71x48YhNTVVet26desDb8GnYc2aNahduzYMDAxgYmICNzc3zJo1S1r+9h/qyZMnQyaToVWrVgptzZs3DzKZTG5etrz6MpkMWlpaMDc3h4eHBxYvXiw3gpqfqKgo3Lt3D926dVNYNmvWLGhqamLevHlSWWRkJDQ1NfHff/8pba9atWoYMWIEMjIyUKVKFYwYMUJu+Y0bN2BkZIQ1a9YUGpsyvXv3lrb3zde1a9fklit78H1QUBBkMpnS+eTi4uKgqamJb775ptAYXr58iTFjxkiPEbO1tYWfnx/u3LkjV8/e3l4hztmzZ8vVEUJg/vz5cHR0hI6ODsqXL48ZM2aosEeAJUuWICIiQnrv6emJ4ODgIq9vbm4OPz8/TJo0SaV+iYg+ZSWeyL0tNzcXWVlZqFevHsqUKYMDBw5IyxITE5GcnAx3d/d819fR0ZGmM8l7fW4iIiLkkqjChIWFITg4GMOGDUN8fDxiY2MxevRopKenF7iejY0NDh48qDBCEhYWpnQyXldXV6SkpCA5ORkHDx5E586dMWvWLDRu3BjPnj0rsK+lS5ciICBA6eTFYWFhGD16NMLCwqSydu3awczMDOvWrVOof/jwYVy7dg2BgYHQ19dHeHg4fvrpJ8TExAB4nbQEBASgSZMm6Nevn9J4irKPW7VqhZSUFLmXg4ODtNzOzg5btmzBixcvpLLMzExs2rQp38mMQ0NDMXToUBw+fFghIXvb8+fPcfr0aUyYMAGnT5/Gjh07kJiYqHSql6lTp8rFOXToULnlw4cPx9q1azF//nxcvnwZUVFRaNCgQYH9v83Y2FjhUglVBQQEYOPGjXj8+PF7tUNE9Kko0URu3LhxOHz4MG7cuIHz589j3LhxOHToEHr06AFjY2MEBgZixIgROHjwIE6dOoWAgAC4u7vzjtViFhUVhS5duiAwMBBVq1aFq6srfH19Cx1xsbS0RMuWLeWSpSNHjuDhw4dKR4y0tLRgbW0NW1tb1KxZE0OHDkV0dDQuXLiAOXPm5NvPgwcP8Pfffyvc5QwA0dHRePHiBaZOnYq0tDQcOXIEwOsHzffq1UtuBChPWFgYGjZsCFdXVwCvT9kOHToUAQEByMjIwJIlSxAfH4+1a9cWuP2F0dHRgbW1tdzrzWeo1q1bF3Z2dtixY4dUtmPHDlSsWBFubm4K7aWnp2Pr1q0YNGgQvvnmG6Xb9iZjY2Ps27cPXbp0QfXq1dGoUSMsW7YMp06dUnjShKGhoVyc+vr60rKEhASEhIRg165daNeuHRwcHFCvXj18/fXXCn2uWrUKdnZ2KFu2LLp06YLU1FRp2ZunVnv37o3o6GgsWbJEGgW8ceMGnjx5gh49esDCwgJ6enqoVq0awsPDpTZcXV1ha2uLX3/9tcBtJyL6XJRoInf//n34+fmhevXqaNGiBU6cOIG9e/dKfyAWLVqENm3aoFOnTvDw8IC1tbXcHz0qHtbW1jh69Chu3ryp8rp9+vSRSyjCwsLQo0cPaGtrF2l9Jycn+Pj4FPi5/vPPPyhbtiycnZ0VloWGhsLX1xdlypSBr68vQkNDpWWBgYG4evUqDh8+LJWlp6fjl19+QWBgoFw7M2bMgJaWFnr27Ikff/wRP/30E8qXL1+kbXgfffr0kUtUwsLCEBAQoLTutm3b4OTkhOrVq6Nnz54ICwtTeQqX1NRUyGQyhZGx2bNnw8zMDG5ubpg3bx5evXolLfvtt99QuXJl7N69Gw4ODrC3t0ffvn0VRsWuXbuGbdu24bfffsOePXtw5swZDB48WGkcS5Ysgbu7O/r16yeNAtrZ2WHChAm4dOkS/vzzTymBNDc3l1u3QYMG0ugpEdHnrkQTudDQUNy4cQNZWVm4f/8+9u/fL/crX1dXF8uXL8fjx4+RkZGBHTt2FHh9HL2bSZMmwcTEBPb29qhevTp69+6Nbdu2KX3Q+9vatGmDtLQ0HD58GBkZGdi2bRv69OmjUv9OTk64ceNGvstv3rwJKysrhdOqaWlp+OWXX9CzZ08AQM+ePbFt2zbplLCLiwsaNWokd8p127ZtEEIoXGunp6eHJUuWYOfOnfD09JTafB+7d++GgYGB9OrcubNCnZ49e+Kff/7BzZs3cfPmTcTGxubbd2hoqLSsVatWSE1NRXR0dJHjyczMxJgxY+Dr6yt3ycGwYcOwZcsWHDx4EAMGDMDMmTMxevRoafm///6LmzdvYvv27Vi/fj0iIiJw6tQpfPfddwrtr1+/HnXq1IGHhwd++uknbNmyReld5sbGxtDW1kbZsmXlRiuTk5Ph5uaGL774Avb29vDy8lIYibW1tX2nHx1ERJ+iEp9+hN5fcnIyXFxcpPevXr3Cy5cvYWBgIJX9+OOP+PHHH5Wub2Njg7i4OFy4cAGHDx/GkSNH4O/vj7Vr12LPnj1Kr0vLU6ZMGfTs2RPh4eH4999/4ejoiFq1aqkUvxACsgIecPvixQulz3XcvHkzqlSpgtq1awMA6tSpg0qVKmHr1q3SiFufPn3w/fff46effoKhoSHCwsLQuXNnGBoaKrQXGhqKsmXL4vz580hNTYWxsbG07F328VdffYWQkBDp/ZunK/NYWFhIp0mFEPjmm28URqCA19eHHj9+XDqlqKWlha5duyI0NLRI10O+fPkSXbp0gRBCLiYAcjd61KpVC9ra2hgwYABmzZoFHR0d6brV9evXw9HRUdpX9erVQ2JiIqpXrw4AqFixotwopru7O3Jzc5GYmFjkH2CDBg1Cp06dcPr0abRs2RIdOnRA48aN5ero6enh+fPnRWqPiOhTx0TuE2Bra4v4+Hjp/Y4dOxAZGYmNGzdKZaampoW2U6NGDdSoUQODBw/GwIED0bRpU0RHR+Orr74qcL0+ffqgYcOGuHDhgsqjccDra7DevAngbebm5njy5IlCeWhoKC5evCj3eK/c3FyEhYVJiVy3bt3w/fffY9u2bfDw8EBsbKzc3bh5tm7dit27dyMuLg6+vr74/vvv5Uby3mUf6+vro2rVqoVuf58+fTBkyBAAwPLly5XWCQ0NxatXr2BrayuVCSGgo6ODZcuWySWdb8tL4m7evIm///670BuAGjZsiFevXuHGjRuoXr06bGxsoKWlJSVxAKTT3MnJyVIiVxx8fHxw8+ZN/PHHH9i3bx9atGiBoKAgzJ8/X6rz+PFjWFhYFFufRETqjIncJ0BLS0suYbC0tISenl6Rkoj85I0+ZWRkFFrX1dUVrq6uOHfuHLp3765SP5cvX8aePXswbty4fOu4ubnh7t27ePLkCcqVKwfg9UTSJ0+exKFDh+QSqMePH8PT0xOXL1+Gk5MTDA0N0blzZ4SFheH69etwdHRE06ZN5dq/d+8egoKCMH36dNSuXRsRERFo3LgxOnfuDB8fHwAfZh/nadWqFbKzsyGTyeDt7a2w/NWrV1i/fj0WLFiAli1byi3r0KEDNm/erHQaE+D/J3FXr17FwYMHYWZmVmg88fHx0NDQgKWlJQCgSZMmePXqFa5fv44qVaoAAK5cuQIAqFSpkrRecnIy7ty5IyWbR48ehYaGRr6Jnra2NnJychTKLSws4O/vD39/fzRt2hQ//PCDXCJ34cIFle7KJiL6lDGRIwwaNAi2trZo3rw5KlSogJSUFEyfPh0WFhYFTvXypr///hsvX74scHqJV69e4e7du8jNzcWjR49w6NAhTJ8+HXXq1MEPP/yQ73pubm4wNzdHbGws2rRpA+D1CFWDBg3g4eGhUL9+/foIDQ2V5pULDAxE06ZNkZCQgDFjxijU79+/P5ydnaU5zRo0aIAffvgB/fv3x4ULFwoc7SoOmpqaSEhIkP7/bbt378aTJ08QGBioEEunTp0QGhqqNJF7+fIlvvvuO5w+fRq7d+9GTk6OdL2aqakptLW1ERcXh2PHjuGrr76CoaEh4uLi8P3336Nnz55S0uzl5YW6deuiT58+WLx4MXJzcxEUFISvv/5abpROV1cX/v7+mD9/PtLS0jBs2DB06dIl39Oq9vb2OHbsGG7cuAEDAwOYmppi8uTJqFevHlxdXZGVlYXdu3fL3eTy/PlznDp1CjNnzlRxLxMRfZpK3Txy9PF5eXnh6NGj6Ny5MxwdHdGpUyfo6uriwIEDRRrBAV6fRixsjrCLFy/CxsYGFStWhKenJ7Zt24Zx48YhJiZG7lqzt2lqakrzhwFAdnY2NmzYgE6dOimt36lTJ6xfvx4vX74EAHz55ZeoXr060tLS4OfnJ1d3/fr12L9/P8LDw+WuBZwyZQpMTEzw/fffF2Xz31tBcx6GhobCy8tLaULZqVMnnDx5EufOnVNY9t9//yEqKgq3b99GnTp1YGNjI73ypmnR0dHBli1b0KxZM7i6umLGjBn4/vvvsXr1aqkdDQ0N/Pbbb9Ikzt988w2cnZ2xZcsWuf6qVq2Kjh07onXr1mjZsiVq1aqFFStW5LvNo0aNgqamJlxcXGBhYYHk5GRoa2tj3LhxqFWrFjw8PKCpqSnXz65du1CxYkWFUVUios+VTKg6f4GaSUtLg7GxMVJTUxX+UGZmZiIpKQkODg5KL6an0uPu3btwdXXF6dOn5U7n0eelUaNGGDZsmMqn8Kl4fCrfmbIp+d9cRVQUYtKHTZ0Kyl3exhE5UgvW1tYIDQ1VmMiWPh8PHz5Ex44d4evrW9KhEBGVGrxGjtTG+zxwndSfubm53Px2RETEETkiIiIitcVEjoiIiEhNMZEjIiIiUlNM5IiIiIjUFBM5IiIiIjXFRI6IiIhITTGRo09eREREoU+d+BgOHToEmUyGp0+flnQoRET0iWAiR/QBeHp6Ss9uzdO4cWOkpKR88Ge3EhHR54OJHH102dnZxdJOTk4OcnNzi6Wtj0FbWxvW1taQyfh4ICIiKh5M5NSQp6cnhg4diuDgYJQrVw5WVlZYs2YNMjIyEBAQAENDQ1StWhV//vmn3HoXLlyAj48PDAwMYGVlhV69euHhw4fv3W50dDQaNGgAHR0d2NjYYOzYsXj16pVcu0OGDEFwcDDMzc3h7e2NPn36oE2bNnLtvHz5EpaWlggNDVW63XmnSKOiouDi4gIdHR0kJycjKysLo0aNQvny5aGvr4+GDRvi0KFDBe7DkJAQVKlSBdra2qhevTp+/vlnueVPnz7FgAEDYGVlBV1dXdSoUQO7d+8GADx69Ai+vr4oX748ypYti5o1a2Lz5s3Sur1790Z0dDSWLFkCmUwGmUyGGzduKD21GhkZCVdXV+jo6MDe3h4LFiyQi8Pe3h4zZ85Enz59YGhoiIoVK8o90J6IiD5vTOTU1Lp162Bubo7jx49j6NChGDRoEDp37ozGjRvj9OnTaNmyJXr16oXnz58DeJ2YNG/eHG5ubjh58iT27NmDe/fuoUuXLu/V7n///YfWrVujfv36OHv2LEJCQhAaGorp06crtKutrY3Y2FisXLkSffv2xZ49e5CSkiLV2b17N54/f46uXbvmu93Pnz/HnDlzsHbtWly8eBGWlpYYMmQI4uLisGXLFpw7dw6dO3dGq1atcPXqVaVt/Prrrxg+fDhGjhyJCxcuYMCAAQgICMDBgwcBALm5ufDx8UFsbCw2bNiAS5cuYfbs2dDU1ATw+sHh9erVw++//44LFy6gf//+6NWrF44fPw4AWLJkCdzd3dGvXz+kpKQgJSUFdnZ2CnGcOnUKXbp0Qbdu3XD+/HlMnjwZEyZMQEREhFy9BQsW4IsvvsCZM2cwePBgDBo0CImJifnuIyIi+nzIhBCipIP4kNLS0mBsbIzU1FQYGRnJLcvMzERSUhIcHBygq6tbQhGqztPTEzk5OYiJiQHw+hSjsbExOnbsiPXr1wMA7t69CxsbG8TFxaFRo0aYPn06YmJisHfvXqmd27dvw87ODomJiXB0dHyndv/3v/8hMjISCQkJ0inDFStWYMyYMUhNTYWGhgY8PT2RlpaG06dPy22Hq6sr/P39pedntmvXDmZmZggPD1e63REREQgICEB8fDxq164NAEhOTkblypWRnJwMW1tbqa6XlxcaNGiAmTNnIiIiAsHBwdJIWJMmTeDq6io3stWlSxdkZGTg999/x19//QUfHx8kJCTA0dGxSJ9JmzZt4OTkhPnz50ufUZ06dbB48WKpzqFDh/DVV1/hyZMnMDExQY8ePfDgwQP89ddfUp3Ro0fj999/x8WLFwG8HpFr2rSpNGIohIC1tTWmTJmCgQMHFik2ouKirt+Zb5NN4eUN9H7EpA+bOhWUu7yNI3JqqlatWtL/a2pqwszMDDVr1pTKrKysAAD3798HAJw9exYHDx6EgYGB9HJycgIAXL9+/Z3bTUhIgLu7u9x1X02aNEF6ejpu374tldWrV09hG/r27Sslbffu3cOff/6JPn36FLjd2tracjGeP38eOTk5cHR0lNu26Ohoue16U0JCApo0aSJX1qRJEyQkJAAA4uPjUaFChXyTuJycHEybNg01a9aEqakpDAwMsHfvXiQnJxcYe1HjuHr1KnJycqSyN7dXJpPB2tpa2v9ERPR50yrpAOjdlClTRu69TCaTK8tLrPJuBkhPT0fbtm0xZ84chbZsbGzeud2i0tfXVyjz8/PD2LFjERcXhyNHjsDBwQFNmzYtsB09PT25pDE9PR2ampo4deqUdOozj4GBgUoxvtlHQebNm4clS5Zg8eLFqFmzJvT19REcHFxsN3G8Tdlnok43eRAR0YfDRO4zUbduXURGRsLe3h5aWsX3sTs7OyMyMhJCCCnBio2NhaGhISpUqFDgumZmZujQoQPCw8MRFxeHgIAAlft3c3NDTk4O7t+/X2gS+GbMsbGx8Pf3l8piY2Ph4uIC4PUI2O3bt3HlyhWlo3KxsbFo3749evbsCeB1UnvlyhVpfeD1yOGbo2oFxfF2246OjgpJKRERkTI8tfqZCAoKwuPHj+Hr64sTJ07g+vXr2Lt3LwICAgpNOAoyePBg3Lp1C0OHDsXly5exa9cuTJo0CSNGjICGRuGHV9++fbFu3TokJCTIJVZF5ejoiB49esDPzw87duxAUlISjh8/jlmzZuH3339Xus4PP/yAiIgIhISE4OrVq1i4cCF27NiBUaNGAQCaNWsGDw8PdOrUCfv27UNSUhL+/PNP7NmzBwBQrVo17Nu3D0eOHEFCQgIGDBiAe/fuyfVhb2+PY8eO4caNG3j48KHSEbSRI0fiwIEDmDZtGq5cuYJ169Zh2bJlUhxERESFYSL3mbC1tUVsbCxycnLQsmVL1KxZE8HBwTAxMSlSwpWf8uXL448//sDx48dRu3ZtDBw4EIGBgRg/fnyR1vfy8oKNjQ28vb3lblZQRXh4OPz8/DBy5EhUr14dHTp0wIkTJ1CxYkWl9Tt06IAlS5Zg/vz5cHV1xapVqxAeHg5PT0+pTmRkJOrXrw9fX1+4uLhg9OjRUsI7fvx41K1bF97e3vD09IS1tTU6dOgg18eoUaOgqakJFxcXWFhYKL1+rm7duti2bRu2bNmCGjVqYOLEiZg6dSp69+79TvuBiIg+P7xrVckdWB/7jqYPffdLaZaeno7y5csjPDwcHTt2LOlwiKgAvGuV6LXSdNcqr5GjEpGbm4uHDx9iwYIFMDExQbt27Uo6JCIiIrXDRI5KRHJyMhwcHFChQgVEREQU6w0YREREnwv+9aQSYW9vj0/8rD4REdEHx5sdiIiIiNQUEzn66BITE2FtbY1nz56VdChE9H/Gjh2LoUOHlnQYRKQiJnL00Y0bNw5Dhw6FoaGhVCaEwOrVq9GwYUMYGBjAxMQEX3zxBRYvXoznz58DAHr37q0wzQfw+hmmMplMepZqREQEZDIZZDIZNDU1Ua5cOTRs2BBTp05Famqq0phmzZoFTU1NzJs3r0jbIJPJoKuri5s3b8qVd+jQQZo+pG3btmjVqpXS9WNiYiCTyXDu3DncuHEDMpkM8fHxACC9z3sZGhrC1dUVQUFBuHr1qlw7ERERMDExUWj/xYsXMDU1hbm5ObKysoq0TWlpaZgwYQJcXV2hp6cHMzMz1K9fH3PnzsWTJ0+K1Abw/z+Pt19FnZLmYxJCYM2aNXB3d4eRkREMDAzg6uqK4cOH49q1a3LHUn6vGzduoGvXrmjQoIHcnIwvX75EvXr10KNHj3z7P3z4MNq2bQtbW1vIZDLs3LlTaYwTJ06EjY0N9PT04OXlJXcc5Le/ZTIZTpw4IdU7d+4cmjZtCl1dXdjZ2WHu3Lly/YwaNQrr1q3Dv//++x57lIg+NiZynwBPT09ERESUdBhFkpycjN27dyvMldarVy8EBwejffv2OHjwIOLj4zFhwgTs2rVL7qHyRWVkZISUlBTcvn0bR44cQf/+/bF+/XrUqVMHd+7cUagfFhaG0aNHIywsrMh9yGQyTJw4Md/lgYGB2Ldvn9wzZ/OEh4fjiy++kHuO6tv279+PlJQUnD17FjNnzkRCQgJq166NAwcOFBpbZGQkXF1d4eTkpDQ5eNvjx4/RqFEjhIeHY9SoUTh27BhOnz6NGTNm4MyZM9i0aVOhbbwtMTERKSkp0mvs2LEqtwG8frbth3gkmRAC3bt3x7Bhw9C6dWv89ddfuHTpEkJDQ6Grq4vp06eja9euctvg7u6Ofv36yZXZ2dlhxYoVSE5OxuzZs6X2p02bhpSUFCxbtizfGDIyMlC7dm0sX7483zpz587F0qVLsXLlShw7dgz6+vrw9vZGZmYmAKBx48Zy8aSkpKBv375wcHDAF198AeB1kt6yZUtUqlQJp06dwrx58zB58mSsXr1a6sfc3Bze3t4ICQl5311LRB8RE7nP0LNnz9CjRw/o6+vDxsYGixYtgqenJ4KDg6U69vb2mDZtGnx9faGvr4/y5cvL/bF5exQJAJ4+fQqZTIZDhw7l2/e2bdtQu3ZtlC9fXq5s48aN2Lx5M3788UfUr18f9vb2aN++Pf7++2989dVXKm9j3sPlbWxs4OzsjMDAQBw5cgTp6ekYPXq0XN3o6Gi8ePECU6dORVpaGo4cOVKkPoYMGYINGzbgwoULSpe3adMGFhYWCkl2eno6tm/fjsDAwALbNzMzg7W1NSpXroz27dtj//79aNiwIQIDAwt9GkdoaCh69uyJnj17IjQ0tNBt+fHHH5GcnIzjx48jICAAtWrVQqVKldCyZUts3rwZgwcPlupmZWVh1KhRKF++PPT19dGwYUOln7mlpSWsra2lV96zb588eQI/Pz+UK1cOZcuWhY+Pj9wIU94oY1RUFFxcXKCjo4Pk5GRkZWVhzJgxsLOzg46ODqpWrSq3bRcuXICPjw8MDAxgZWWFXr164eHDh/lu89atW7FlyxZs3boVEyZMQKNGjVCxYkU0atQIc+bMQXh4OPT09OS2QVtbG2XLlpUr09TUhJmZGVavXo2pU6fi3LlzOHnyJGbNmoW1a9eiXLly+cbg4+OD6dOn49tvv1W6XAiBxYsXY/z48Wjfvj1q1aqF9evX486dO1KCrq2tLRePmZkZdu3ahYCAAOmxeRs3bkR2djbCwsLg6uqKbt26YdiwYVi4cKFcf23btsWWLVvyjZeISh8mcp+hESNGIDY2FlFRUdi3bx9iYmJw+vRphXrz5s1D7dq1cebMGYwdOxbDhw/Hvn373qvvmJgYaZQgz8aNG1G9enW0b99eob5MJoOxsfF79ZnH0tISPXr0QFRUlFwiFBoaCl9fX5QpUwa+vr5FSnwAoEmTJmjTpk2+I01aWlrw8/NDRESE3B2627dvR05ODnx9fVWKX0NDA8OHD8fNmzdx6tSpfOtdv34dcXFx6NKlC7p06YKYmBiFU8Bvys3NxdatW9GzZ898n66RlxAArxPYuLg4bNmyBefOnUPnzp3RqlUrhdO++enduzdOnjyJqKgoxMXFQQiB1q1b4+XLl1Kd58+fY86cOVi7di0uXrwIS0tL+Pn5YfPmzVi6dCkSEhKwatUqKTl8+vQpmjdvDjc3N5w8eRJ79uzBvXv30KVLl3zj2Lx5M6pXr57vHIZvbnNRtGvXDt26dYOfnx/8/f3h7++P1q1bq9TG25KSknD37l14eXlJZcbGxmjYsCHi4uKUrhMVFYVHjx7JPbs4Li4OHh4e0NbWlsq8vb2RmJgod9q8QYMGuH37Nm7cuPFecRPRx8PpR5T4lJ+08OzZM6xbtw6bNm1CixYtALw+zafsD3iTJk2kJMXR0RGxsbFYtGgRvv7663fu/+bNmwqJ3NWrV1G9evV3blMVTk5OePbsGR49egRLS0ukpaXhl19+kf4o9uzZE02bNsWSJUukJKEgs2bNQq1atRATE4OmTZsqLO/Tpw/mzZuH6Oho6RFg4eHh6NSp0zslqE5OTgBej4g2aNBAaZ2wsDD4+PhII0He3t4IDw/H5MmTldZ/8OABnj59qvAZ1KtXD4mJiQBej9Rs3rwZycnJCA8PR3JysnTMjBo1Cnv27EF4eDhmzpwprV+hQgW59m7evInHjx8jKioKsbGxaNy4MYDXibydnR127tyJzp07A3h9fdmKFStQu3ZtAMCVK1ewbds27Nu3T0pqKleuLLW9bNkyuLm5yfUfFhYGOzs7XLlyBY6OjgrbfeXKFYVtDg4Oxtq1awEAJiYmSk+LF2Tx4sUoX748jIyMFEa73sXdu3cBAFZWVnLlVlZW0rK3hYaGwtvbW27/3717Fw4ODgpt5C3LO1byPtObN2/C3t7+veMnog+PI3JqaObMmTAwMJBeMTExGDhwoFyZsmd7AsC///6Lly9fyiUBxsbGShMpd3d3hfcJCQnvFfuLFy8UHu3zMeeTy+srb7Rl8+bNqFKlipQw1KlTB5UqVcLWrVuL1J6Liwv8/PzyHZVzcnJC48aNpWvvrl27hpiYmEJPqxY1/rfl5ORg3bp16Nmzp1TWs2dPREREqHyd2a+//or4+Hh4e3vjxYsXAIDz588jJycHjo6OcsdbdHQ0rl+/Lrd+TEwM4uPjpVe5cuWQkJAALS0tNGzYUKpnZmaG6tWryx1b2tractcPxsfHQ1NTE82aNVMa69mzZ3Hw4EG5mPKS3rfjKsj//vc/xMfHY+LEiUhPTy/yenk2b94MmUyGhw8f4vLlyyqv/75u376NvXv3vvPxpaenBwDSDUZEVPpxRE4NDRw4UO6UUY8ePdCpUye5Z5W+6wPoi0pD4/VvgDeTsDdPjeXH3Nxc4Q5IR0fHIv3RMzIyUnqK8OnTp9DU1IS+vn6hbSQkJMDIyAhmZmYAXo9eXLx4Ue7JErm5uQgLCyvyH8MpU6bA0dEx35sKAgMDMXToUCxfvhzh4eGoUqVKvglJUeIHoDC6kmfv3r3477//0LVrV7nynJwcHDhwQOloqoWFBUxMTKTRtzwVK1YEABgaGkp3BKenp0NTUxOnTp2CpqamXP23RzAdHByU3lFbFHp6enLJal6CkZ/09HS0bdsWc+bMUVhmY2OjdJ1q1aopbLOFhQUsLCxgaWmpcsz//vsvRo8ejZCQEBw8eBC9e/fGmTNnoKOjo3JbeaytrQEA9+7dk9uOe/fuoU6dOgr1w8PDYWZmpnC62NraGvfu3ZMry3uf1wfw+qYX4PV+ICL1wBE5NWRqaoqqVatKLz09PVhaWsqV5ffIq8qVK6NMmTJy0xKkpqbiypUrCnWPHj2q8N7Z2RnA//+iT0lJkZa/eeNDftzc3HDp0iW5su7du+PKlSvYtWuXQn0hhDRlSPXq1XHx4kWF6TROnz4NBwcHlClTpsC+79+/j02bNqFDhw7Q0NDA+fPncfLkSRw6dEhu5OjQoUOIi4sr8oiKnZ0dhgwZgh9//FHpTQhdunSBhoYGNm3ahPXr16NPnz4qX38FvE4wly5dCgcHB7i5uSmtExoaim7dusltT3x8PLp165bvtX8aGhro0qULNmzYoPSO3je5ubkhJycH9+/flzveqlatKpcQ5MfZ2RmvXr3CsWPHpLJHjx4hMTERLi4u+a5Xs2ZN5ObmIjo6WunyunXr4uLFi7C3t1eIK78E39fXF4mJiUqPO1Xl5uaid+/eaNGiBfz8/LB48WI8e/aswLuai8LBwQHW1tZydyqnpaXh2LFjCiPmQgiEh4fDz89P4d+Cu7s7Dh8+LPdja9++fahevbrczRgXLlxAmTJl4Orq+l5xE9HHw0TuM2NoaAh/f3/88MMPOHjwIC5evIjAwEBoaGgoJBexsbGYO3curly5guXLl2P79u0YPnw4gNcjJI0aNcLs2bORkJCA6OjoIs0T5u3tjbi4OLmEp0uXLujatSt8fX0xc+ZMnDx5Ejdv3sTu3bvh5eWFgwcPAng98iiTyeDn54dTp07h2rVrCAsLw+LFizFy5Ei5foQQuHv3LlJSUpCQkICwsDA0btwYxsbG0hQRoaGhaNCgATw8PFCjRg3p5eHhgfr16xf5pgfg9dx4d+7cwf79+xWWGRgYoGvXrhg3bhxSUlIUpl7Jz6NHj3D37l38+++/iIqKgpeXF44fP47Q0FCF0TDg9bVuv/32G/z9/eW2p0aNGvDz88POnTulEZe3zZw5E+XLl0eDBg0QFhaGc+fO4fr16/j1118RFxcn9efo6IgePXrAz88PO3bsQFJSEo4fP45Zs2bh999/L3SbqlWrhvbt26Nfv374559/cPbsWfTs2RPly5dXerNLHnt7e/j7+6NPnz7YuXMnkpKScOjQIWzbtg0AEBQUhMePH8PX1xcnTpzA9evXsXfvXgQEBOR7h2+3bt3w3XffoVu3bpg6dSqOHTuGGzduIDo6Glu3blW6j/OzZMkSXLx4EatWrQLw+nKFtWvXYuHChTh+/Hi+66Wnp0vJNvD65ob4+Hjp0giZTIbg4GBMnz4dUVFROH/+PPz8/GBra6swp+Lff/+NpKQk9O3bV6Gf7t27Q1tbG4GBgbh48SK2bt2KJUuWYMSIEXL18q71LGwElIhKDyZyn6GFCxfC3d0dbdq0gZeXF5o0aQJnZ2eFa9dGjhyJkydPws3NDdOnT8fChQvh7e0tLQ8LC8OrV69Qr1496Y9NYXx8fKClpSWX8MhkMmzatAkLFy7Ezp070axZM9SqVQuTJ09G+/btpT5NTEwQExODly9fol27dqhTpw6WLl2KhQsXYsCAAXL9pKWlwcbGBuXLl4e7uztWrVoFf39/nDlzBjY2NsjOzsaGDRvQqVMnpXF26tQJ69evL9LpYuD1KOmYMWOkub3eFhgYiCdPnsDb27vIp729vLxgY2ODmjVrYuzYsXB2dsa5c+fynY5l/fr10NfXl25ieVOLFi2gp6eHDRs2KF3XzMwMx48fh5+fH+bNm4cGDRqgZs2amDx5Mrp27Yo1a9ZIdfNGfUaOHInq1aujQ4cOOHHihHQqtjDh4eGoV68e2rRpA3d3dwgh8McffxQ6ohoSEoLvvvsOgwcPhpOTE/r164eMjAwAry8liI2NRU5ODlq2bImaNWsiODgYJiYm0mUAb5PJZNi6dSsWL16MP/74Ay1atED16tXRp08f2NnZ4Z9//inS9ly5cgX/+9//8NNPP8mNSnp7eyMgIAC9e/fOd1LmvH9feSOsI0aMgJubm9xI3ujRozF06FD0798f9evXR3p6Ovbs2aPw7zU0NBSNGzeWrg18k7GxMf766y8kJSWhXr16GDlyJCZOnIj+/fvL1duyZQv69etXpO0motJBJj7xJ5enpaXB2NgYqampMDIykluWmZmJpKQkODg4KHwpfk4yMjJQvnx5LFiwQLouzN7eHsHBwXJzyxWX5cuXIyoqCnv37i32tono3fz5558YOXIkzp07l++lGZ/Kd6ZsiuqXNhC96UPPblFQ7vI23uzwGTpz5gwuX76MBg0aIDU1FVOnTgWAAk9tFacBAwbg6dOnePbsmdxjuoio5GRkZCA8PDzfJI6ISif+i/1MzZ8/H4mJidDW1ka9evUQExMDc3Pzj9K3lpYW/ve//32UvoioaL777ruSDoGI3gETuc+Qm5tbgU8GAMCZ3YmIiNRAid7sMGvWLNSvXx+GhoawtLREhw4dFOZ18vT0hEwmk3sNHDiwhCImIiIiKj1KNJGLjo5GUFAQjh49in379uHly5do2bKldCdann79+iElJUV6zZ07t4QiJiIiIio9SvTU6p49e+TeR0REwNLSEqdOnYKHh4dUXrZs2SJNNvquPvEbd4mIigW/K4lKn1I1j1zeDP6mpqZy5Rs3boS5uTlq1KiBcePGFdtzAPPmreJzBYmICpednQ0AKk2WTEQfVqm52SE3NxfBwcFo0qQJatSoIZV3794dlSpVgq2tLc6dO4cxY8YgMTERO3bsUNpOVlaW3OSbaWlp+fapqakJExMT3L9/H8Drkb93eXQSEdGnLjc3Fw8ePEDZsmU5RQlRKVJq/jUGBQXhwoULCrOpvznzeM2aNWFjY4MWLVrg+vXrqFKlikI7s2bNwpQpU4rcb94p27xkjoiIlNPQ0EDFihX5g5eoFCkVT3YYMmQIdu3ahcOHD8PBwaHAuhkZGTAwMMCePXvkHheVR9mInJ2dXaGzI+fk5BT5cUxERJ8jbW3tfB95pk74ZAd6X3yyw/8RQmDo0KH49ddfcejQoUKTOADSw6VtbGyULtfR0YGOjo7KsWhqavK6DyIiIlIrJZrIBQUFYdOmTdi1axcMDQ1x9+5dAK8f8Kynp4fr169j06ZNaN26NczMzHDu3Dl8//338PDwQK1atUoydCIiIqISV6KJXEhICIDXk/6+KTw8HL1794a2tjb279+PxYsXIyMjA3Z2dujUqRPGjx9fAtESERERlS4lfmq1IHZ2doiOjv5I0RARERGpF/W/apWIiIjoM8VEjoiIiEhNMZEjIiIiUlNM5IiIiIjUFBM5IiIiIjXFRI6IiIhITTGRIyIiIlJTTOSIiIiI1BQTOSIiIiI1xUSOiIiISE0xkSMiIiJSU0zkiIiIiNQUEzkiIiIiNcVEjoiIiEhNMZEjIiIiUlNM5IiIiIjUFBM5IiIiIjXFRI6IiIhITTGRIyIiIlJTTOSIiIiI1BQTOSIiIiI1xUSOiIiISE0xkSMiIiJSU1rvuuKDBw+QmJgIAKhevTosLCyKLSgiIiIiKpzKI3IZGRno06cPbG1t4eHhAQ8PD9ja2iIwMBDPnz//EDESERERkRIqJ3IjRoxAdHQ0oqKi8PTpUzx9+hS7du1CdHQ0Ro4c+SFiJCIiIiIlVD61GhkZiV9++QWenp5SWevWraGnp4cuXbogJCSkOOMjIiIionyoPCL3/PlzWFlZKZRbWlry1CoRERHRR6RyIufu7o5JkyYhMzNTKnvx4gWmTJkCd3f3Yg2OiIiIiPKn8qnVJUuWwNvbGxUqVEDt2rUBAGfPnoWuri727t1b7AESERERkXIqJ3I1atTA1atXsXHjRly+fBkA4Ovrix49ekBPT6/YAyQiIiIi5d5pHrmyZcuiX79+xR0LEREREamgSIlcVFQUfHx8UKZMGURFRRVYt127dsUSGBEREREVrEiJXIcOHXD37l1YWlqiQ4cO+daTyWTIyckprtiIiIiIqABFSuRyc3OV/j8RERERlRyVpx9Zv349srKyFMqzs7Oxfv36YgmKiIiIiAqnciIXEBCA1NRUhfJnz54hICCgWIIiIiIiosKpnMgJISCTyRTKb9++DWNj42IJioiIiIgKV+TpR9zc3CCTySCTydCiRQtoaf3/VXNycpCUlIRWrVp9kCCJiIiISFGRE7m8u1Xj4+Ph7e0NAwMDaZm2tjbs7e3RqVOnYg+QiIiIiJQrciI3adIkAIC9vT26du0KXV3dDxYUERERERVO5Sc7+Pv7f4g4iIiIiEhFKidyOTk5WLRoEbZt24bk5GRkZ2fLLX/8+HGxBUdERERE+VP5rtUpU6Zg4cKF6Nq1K1JTUzFixAh07NgRGhoamDx58gcIkYiIiIiUUTmR27hxI9asWYORI0dCS0sLvr6+WLt2LSZOnIijR49+iBiJiIiISAmVE7m7d++iZs2aAAADAwNpcuA2bdrg999/L97oiIiIiChfKidyFSpUQEpKCgCgSpUq+OuvvwAAJ06cgI6OjkptzZo1C/Xr14ehoSEsLS3RoUMHJCYmytXJzMxEUFAQzMzMYGBggE6dOuHevXuqhk1ERET0yVE5kfv2229x4MABAMDQoUMxYcIEVKtWDX5+fujTp49KbUVHRyMoKAhHjx7Fvn378PLlS7Rs2RIZGRlSne+//x6//fYbtm/fjujoaNy5cwcdO3ZUNWwiIiKiT45MCCHep4GjR4/iyJEjqFatGtq2bftewTx48ACWlpaIjo6Gh4cHUlNTYWFhgU2bNuG7774DAFy+fBnOzs6Ii4tDo0aNCm0zLS0NxsbGSE1NhZGR0XvFR0RE6k82RfExk0SqEJPeK3UqlCq5i0ojci9fvkSfPn2QlJQklTVq1AgjRox47yQOgHS9nampKQDg1KlTePnyJby8vKQ6Tk5OqFixIuLi4pS2kZWVhbS0NLkXERER0adIpUSuTJkyiIyM/CCB5ObmIjg4GE2aNEGNGjUAvL6xQltbGyYmJnJ1rayscPfuXaXtzJo1C8bGxtLLzs7ug8RLREREVNJUvkauQ4cO2LlzZ7EHEhQUhAsXLmDLli3v1c64ceOQmpoqvW7dulVMERIRERGVLio/2aFatWqYOnUqYmNjUa9ePejr68stHzZsmMpBDBkyBLt378bhw4dRoUIFqdza2hrZ2dl4+vSp3KjcvXv3YG1trbQtHR0dle+eJSIiIlJHKidyoaGhMDExwalTp3Dq1Cm5ZTKZTKVETgiBoUOH4tdff8WhQ4fg4OAgt7xevXooU6YMDhw4gE6dOgEAEhMTkZycDHd3d1VDJyIiIvqkqJzIvXmjw/sKCgrCpk2bsGvXLhgaGkrXvRkbG0NPTw/GxsYIDAzEiBEjYGpqCiMjIwwdOhTu7u5FumOViIiI6FOmciJXnEJCQgAAnp6ecuXh4eHo3bs3AGDRokXQ0NBAp06dkJWVBW9vb6xYseIjR0pERERU+rz3PHKlHeeRIyKiN3EeOXpfajuPHBERERGVHkzkiIiIiNQUEzkiIiIiNfVONzs8efIEoaGhSEhIAAA4OzujT58+0qO1iIiIiOjDU3lE7vDhw3BwcMDSpUvx5MkTPHnyBD/99BMcHBxw+PDhDxEjERERESmh8ohcUFAQunTpgpCQEGhqagIAcnJyMHjwYAQFBeH8+fPFHiQRERERKVJ5RO7atWsYOXKklMQBgKamJkaMGIFr164Va3BERERElD+VE7m6detK18a9KSEhAbVr1y6WoIiIiIiocCqfWh02bBiGDx+Oa9euSY/JOnr0KJYvX47Zs2fj3LlzUt1atWoVX6REREREJEflJztoaBQ8iCeTySCEgEwmQ05OznsFVxz4ZAciInoTn+xA76s0PdlB5RG5pKSkdw6MiIiIiIqPyolcpUqVPkQcRERERKQilRO59evXF7jcz8/vnYMhIiIioqJTOZEbPny43PuXL1/i+fPn0NbWRtmyZZnIEREREX0kKk8/kvc0h7xXeno6EhMT8eWXX2Lz5s0fIkYiIiIiUkLlRE6ZatWqYfbs2QqjdURERET04RRLIgcAWlpauHPnTnE1R0RERESFUPkauaioKLn3QgikpKRg2bJlaNKkSbEFRkREREQFUzmR69Chg9x7mUwGCwsLNG/eHAsWLCiuuIiIiIioEConcrm5uR8iDiIiIiJSUbFdI0dEREREHxcTOSIiIiI1xUSOiIiISE0xkSMiIiJSU0zkiIiIiNRUke5aPXfuXJEbrFWr1jsHQ0RERERFV6RErk6dOpDJZBBCQCaTFVg3JyenWAIjIiIiooIV6dRqUlIS/v33XyQlJSEyMhIODg5YsWIFzpw5gzNnzmDFihWoUqUKIiMjP3S8RERERPR/ijQiV6lSJen/O3fujKVLl6J169ZSWa1atWBnZ4cJEyYoPPmBiIiIiD4MlW92OH/+PBwcHBTKHRwccOnSpWIJioiIiIgKp3Ii5+zsjFmzZiE7O1sqy87OxqxZs+Ds7FyswRERERFR/lR+1urKlSvRtm1bVKhQQbpD9dy5c5DJZPjtt9+KPUAiIiIiUk7lRK5Bgwb4999/sXHjRly+fBkA0LVrV3Tv3h36+vrFHiARERERKadyIgcA+vr66N+/f3HHQkREREQqeKcnO/z888/48ssvYWtri5s3bwIAFi1ahF27dhVrcERERESUP5UTuZCQEIwYMQI+Pj548uSJNAFwuXLlsHjx4uKOj4iIiIjyoXIi99NPP2HNmjX43//+By2t/39m9osvvsD58+eLNTgiIiIiyp/KiVxSUhLc3NwUynV0dJCRkVEsQRERERFR4VRO5BwcHBAfH69QvmfPHs4jR0RERPQRqXzX6ogRIxAUFITMzEwIIXD8+HFs3rwZs2bNwtq1az9EjERERESkhMqJXN++faGnp4fx48fj+fPn6N69O2xtbbFkyRJ069btQ8RIREREREq80zxyPXr0QI8ePfD8+XOkp6fD0tKyuOMiIiIiokK80zxyr169wv79+/Hzzz9DT08PAHDnzh2kp6cXa3BERERElD+VR+Ru3ryJVq1aITk5GVlZWfj6669haGiIOXPmICsrCytXrvwQcRIRERHRW1QekRs+fDi++OILPHnyRBqNA4Bvv/0WBw4cKNbgiIiIiCh/KidyMTExGD9+PLS1teXK7e3t8d9//6nU1uHDh9G2bVvY2tpCJpNh586dcst79+4NmUwm92rVqpWqIRMRERF9klRO5HJzc6XHcr3p9u3bMDQ0VKmtjIwM1K5dG8uXL8+3TqtWrZCSkiK9Nm/erGrIRERERJ8kla+Ra9myJRYvXozVq1cDAGQyGdLT0zFp0iS0bt1apbZ8fHzg4+NTYB0dHR1YW1urGiYRERHRJ0/lEbkFCxYgNjYWLi4uyMzMRPfu3aXTqnPmzCn2AA8dOgRLS0tUr14dgwYNwqNHjwqsn5WVhbS0NLkXERER0adI5RG5ChUq4OzZs9iyZQvOnTuH9PR0BAYGokePHnI3PxSHVq1aoWPHjnBwcMD169fx448/wsfHB3FxcdDU1FS6zqxZszBlypRijYOIiIioNJIJIURJBwG8PkX766+/okOHDvnW+ffff1GlShXs378fLVq0UFonKysLWVlZ0vu0tDTY2dkhNTUVRkZGxR02ERGpGdkUWUmHQGpOTPqwqVNaWhqMjY2LlLu805MdEhMT8dNPPyEhIQEA4OzsjCFDhsDJyeldmiuyypUrw9zcHNeuXcs3kdPR0YGOjs4HjYOIiIioNFD5GrnIyEjUqFEDp06dQu3atVG7dm2cPn0aNWvWRGRk5IeIUXL79m08evQINjY2H7QfIiIiInWg8ojc6NGjMW7cOEydOlWufNKkSRg9ejQ6depU5LbS09Nx7do16X1SUhLi4+NhamoKU1NTTJkyBZ06dYK1tTWuX7+O0aNHo2rVqvD29lY1bCIiIqJPjsojcikpKfDz81Mo79mzJ1JSUlRq6+TJk3Bzc4ObmxsAYMSIEXBzc8PEiROhqamJc+fOoV27dnB0dERgYCDq1auHmJgYnjolIiIiwjuMyHl6eiImJgZVq1aVK//nn3/QtGlTldsq6F6LvXv3qhoeERER0WdD5USuXbt2GDNmDE6dOoVGjRoBAI4ePYrt27djypQpiIqKkqtLRERERB+GytOPaGgU7WysTCZT+iivj02VW3iJiOjTx+lH6H2p9fQjubm57xwYERERERUflW92ICIiIqLSociJXFxcHHbv3i1Xtn79ejg4OMDS0hL9+/eXe6ICEREREX1YRU7kpk6diosXL0rvz58/j8DAQHh5eWHs2LH47bffMGvWrA8SJBEREREpKnIiFx8fL/dYrC1btqBhw4ZYs2YNRowYgaVLl2Lbtm0fJEgiIiIiUlTkRO7JkyewsrKS3kdHR8PHx0d6X79+fdy6dat4oyMiIiKifBU5kbOyskJSUhIAIDs7G6dPn5bmkQOAZ8+eoUyZMsUfIREREREpVeRErnXr1hg7dixiYmIwbtw4lC1bVu5JDufOnUOVKlU+SJBEREREpKjI88hNmzYNHTt2RLNmzWBgYIB169ZBW1tbWh4WFoaWLVt+kCCJiIiISFGREzlzc3McPnwYqampMDAwgKamptzy7du3w8DAoNgDJCIiIiLlVH6yg7GxsdJyU1PT9w6GiIiIiIqOT3YgIiIiUlNM5IiIiIjUFBM5IiIiIjXFRI6IiIhITTGRIyIiIlJTTOSIiIiI1BQTOSIiIiI1xUSOiIiISE0xkSMiIiJSU0zkiIiIiNQUEzkiIiIiNcVEjoiIiEhNMZEjIiIiUlNM5IiIiIjUFBM5IiIiIjXFRI6IiIhITTGRIyIiIlJTTOSIiIiI1BQTOSIiIiI1xUSOiIiISE0xkSMiIiJSU0zkiIiIiNQUEzkiIiIiNcVEjoiIiEhNMZEjIiIiUlNM5IiIiIjUFBM5IiIiIjXFRI6IiIhITTGRIyIiIlJTTOSIiIiI1BQTOSIiIiI1xUSOiIiISE2VaCJ3+PBhtG3bFra2tpDJZNi5c6fcciEEJk6cCBsbG+jp6cHLywtXr14tmWCJiIiISpkSTeQyMjJQu3ZtLF++XOnyuXPnYunSpVi5ciWOHTsGfX19eHt7IzMz8yNHSkRERFT6aJVk5z4+PvDx8VG6TAiBxYsXY/z48Wjfvj0AYP369bCyssLOnTvRrVu3jxkqERERUalTaq+RS0pKwt27d+Hl5SWVGRsbo2HDhoiLiyvByIiIiIhKhxIdkSvI3bt3AQBWVlZy5VZWVtIyZbKyspCVlSW9T0tL+zABEhEREZWwUjsi965mzZoFY2Nj6WVnZ1fSIRERERF9EKU2kbO2tgYA3Lt3T6783r170jJlxo0bh9TUVOl169atDxonERERUUkptYmcg4MDrK2tceDAAaksLS0Nx44dg7u7e77r6ejowMjISO5FRERE9Ckq0Wvk0tPTce3aNel9UlIS4uPjYWpqiooVKyI4OBjTp09HtWrV4ODggAkTJsDW1hYdOnQouaCJiIiISokSTeROnjyJr776Sno/YsQIAIC/vz8iIiIwevRoZGRkoH///nj69Cm+/PJL7NmzB7q6uiUVMhEREVGpIRNCiJIO4kNKS0uDsbExUlNTeZqViIggmyIr6RBIzYlJHzZ1UiV3KbXXyBERERFRwZjIEREREakpJnJEREREaoqJHBEREZGaYiJHREREpKaYyBERERGpKSZyRERERGqKiRwRERGRmmIiR0RERKSmmMgRERERqSkmckRERERqiokcERERkZpiIkdERESkppjIEREREakpJnJEREREaoqJHBEREZGaYiJHREREpKaYyBERERGpKSZyRERERGqKiRwRERGRmmIiR0RERKSmmMgRERERqSkmckRERERqiokcERERkZpiIkdERESkprRKOgAiKr1kspKOgNSdECUdAdGnjSNyRERERGqKiRwRERGRmmIiR0RERKSmmMgRERERqSkmckRERERqiokcERERkZpiIkdERESkppjIEREREakpJnJEREREaoqJHBEREZGaYiJHREREpKaYyBERERGpKSZyRERERGqKiRwRERGRmmIiR0RERKSmmMgRERERqSkmckRERERqiokcERERkZpiIkdERESkpkp1Ijd58mTIZDK5l5OTU0mHRURERFQqaJV0AIVxdXXF/v37pfdaWqU+ZCIiIqKPotRnRVpaWrC2ti7pMIiIiIhKnVJ9ahUArl69CltbW1SuXBk9evRAcnJySYdEREREVCqU6hG5hg0bIiIiAtWrV0dKSgqmTJmCpk2b4sKFCzA0NFS6TlZWFrKysqT3aWlpHytcIiIioo+qVCdyPj4+0v/XqlULDRs2RKVKlbBt2zYEBgYqXWfWrFmYMmXKxwqRiIiIqMSU+lOrbzIxMYGjoyOuXbuWb51x48YhNTVVet26desjRkhERET08ahVIpeeno7r16/DxsYm3zo6OjowMjKSexERERF9ikp1Ijdq1ChER0fjxo0bOHLkCL799ltoamrC19e3pEMjIiIiKnGl+hq527dvw9fXF48ePYKFhQW+/PJLHD16FBYWFiUdGhEREVGJK9WJ3JYtW0o6BCIiIqJSq1SfWiUiIiKi/DGRIyIiIlJTTOSIiIiI1BQTOSIiIiI1xUSOiIiISE0xkSMiIiJSU0zkiIiIiNQUEzkiIiIiNcVEjoiIiEhNMZEjIiIiUlNM5IiIiIjUFBM5IiIiIjXFRI6IiIhITTGRIyIiIlJTTOSIiIiI1BQTOSIiIiI1xUSOiIiISE0xkSMiIiJSU0zkiIiIiNQUEzkiIiIiNcVEjoiIiEhNMZEjIiIiUlNM5IiIiIjUFBM5IiIiIjXFRI6IiIhITTGRIyIiIlJTTOSIiIiI1BQTOSIiIiI1xUSOiIiISE0xkSMiIiJSU0zkiIiIiNQUEzkiIiIiNcVEjoiIiEhNMZEjIiIiUlNM5IiIiIjUFBM5IiIiIjXFRI6IiIhITTGRIyIiIlJTTOSIiIiI1JRWSQfwyZDJSjoC+hQIUdIREBGRGuGIHBEREZGaYiJHREREpKaYyBERERGpKSZyRERERGqKiRwRERGRmmIiR0RERKSm1CKRW758Oezt7aGrq4uGDRvi+PHjJR0SERERUYkr9Ync1q1bMWLECEyaNAmnT59G7dq14e3tjfv375d0aEREREQlqtQncgsXLkS/fv0QEBAAFxcXrFy5EmXLlkVYWFhJh0ZERERUokr1kx2ys7Nx6tQpjBs3TirT0NCAl5cX4uLilK6TlZWFrKws6X1qaioAIC0t7cMGS1QceJzSJ6ZUHtKZJR0AqbsPnVPktS+K8LSfUp3IPXz4EDk5ObCyspIrt7KywuXLl5WuM2vWLEyZMkWh3M7O7oPESFSsjI1LOgKiYsVDmj5FxrM/zoH97NkzGBfyj6hUJ3LvYty4cRgxYoT0Pjc3F48fP4aZmRlkfB5qiUlLS4OdnR1u3boFIyOjkg6HqFjwuKZPDY/p0kEIgWfPnsHW1rbQuqU6kTM3N4empibu3bsnV37v3j1YW1srXUdHRwc6OjpyZSYmJh8qRFKRkZERvxzok8Pjmj41PKZLXmEjcXlK9c0O2traqFevHg4cOCCV5ebm4sCBA3B3dy/ByIiIiIhKXqkekQOAESNGwN/fH1988QUaNGiAxYsXIyMjAwEBASUdGhEREVGJKvWJXNeuXfHgwQNMnDgRd+/eRZ06dbBnzx6FGyCodNPR0cGkSZMUTnsTqTMe1/Sp4TGtfmSiKPe2EhEREVGpU6qvkSMiIiKi/DGRIyIiIlJTTOSIiIiI1BQTuc+Yp6cngoODS6z/3r17o0OHDqUmHvp4n8GNGzcgk8kQHx//wft6XxERER99LkqZTIadO3cWWOftfz9E9HliIkelxo4dOzBt2rSSDuOzpupnoE4J2bvq2rUrrly5Ir3v3bs3ZDKZwsvV1bXY+kxJSYGPjw+A4t3HOTk5mD17NpycnKCnpwdTU1M0bNgQa9euleq8nSDmbe/AgQMV2gsKCoJMJkPv3r0V6stkMpQpUwZWVlb4+uuvERYWhtzc3PeKP6/t2bNny5Xv3LlTenJPZGQkNDU18d9//ylto1q1atLTf97+4eLp6SnFrqOjg/Lly6Nt27bYsWOHQjv5JdsDBgyApqYmtm/fXuTtioyMRPPmzVGuXDno6emhevXq6NOnD86cOVPkNgDA3t5e4bisUKGCSm18LGfOnEHXrl1hY2MDHR0dVKpUCW3atMFvv/0GIYTSf2NvviZPnow//vgD2traOH36tFzbCxYsgLm5Oe7evau078zMTPTu3Rs1a9aElpZWvj+IDh06hLp160JHRwdVq1ZFRESE3HJl+1smkyEoKEiur6CgIJiZmcHAwACdOnVSeMjB+2IiR6WGqakpDA0NSzqMz9qn/BlkZ2e/03p6enqwtLSU3i9ZsgQpKSnS69atWzA1NUXnzp2LK1RYW1t/kOkfpkyZgkWLFmHatGm4dOkSDh48iP79++Pp06cFrmdnZ4ctW7bgxYsXUllmZiY2bdqEihUrKtRv1aoVUlJScOPGDfz555/46quvMHz4cLRp0wavXr16r23Q1dXFnDlz8OTJE6XL27VrBzMzM6xbt05h2eHDh3Ht2jUEBgbm236/fv2QkpKC69evIzIyEi4uLujWrRv69+9faGzPnz/Hli1bMHr0aISFhRVpe8aMGYOuXbuiTp06iIqKQmJiIjZt2oTKlStj3LhxRWrjTVOnTpU7PlVNBt/08uXLd163ILt27UKjRo2Qnp6OdevWISEhAXv27MG3336L8ePHIzU1VW4bFi9eDCMjI7myUaNGoXXr1vDz84Ofnx+ysrIAAJcuXcL48eOxfPnyfJ8AlZOTAz09PQwbNgxeXl5K6yQlJeGbb77BV199hfj4eAQHB6Nv377Yu3evVOfEiRNyMe3btw8A5L4Lvv/+e/z222/Yvn07oqOjcefOHXTs2LG4duVrgj5bzZo1E0FBQSIoKEgYGRkJMzMzMX78eJGbmyuEEGL9+vWiXr16wsDAQFhZWQlfX19x7949af3Hjx+L7t27C3Nzc6GrqyuqVq0qwsLCpOXJycmic+fOwtjYWJQrV060a9dOJCUlScv9/f1F+/bt5eIZPny49L5SpUpixowZIiAgQBgYGAg7OzuxatUquW0orA9SjaqfAQC5V7NmzaRla9asEU5OTkJHR0dUr15dLF++XFqWlJQkAIgzZ87kG0tmZqYYPXq0qFChgtDW1hZVqlQRa9eulZYfOnRI1K9fX2hrawtra2sxZswY8fLlS7ltCQoKEsOH/7/2zj0q5jT+4+9palImkmrLWQpbCl1QKlYia5BO265cNpptWodiN7KyWMW6tutycMitGxIWYZetJdUmJaySmpJS0bodFLnV1uf3h53vaZpLU8dvf7/OPq9z5px5rp/Pc/vO8/08lwmlnj17koeHBxERFRYW0oQJE6hr165kampKM2fOpMePH6vUIy4ujrp3764yPDk5mXg8HlVWVioNb25uJmNjY/r55585PwcHBzIzM+PcWVlZJBAI6OXLl0T0rl6Tk5O578rqWDZ+fvrpJzIzMyMjIyMKCQmhhoYGlbo6ODjQypUrVYa3zLe1e/DgwXTw4EHOPzExkezt7cnHx4fEYrHK9DLS0tIIAO3du1et/LZ0mzx5MtnY2NDixYs5/+TkZGr5cxYWFkZWVlZK07u4uHDu1v29tVtGbGwsAaBz585xfi3bSEZ8fDy5urpSbW0t6evrU3V1tdry5OTkEADaunWr0nDZs1jGyZMnaciQIaSrq0t9+/allStXyvV5CwsL2rJli0p5O3fupH79+pGOjg5ZW1vT/v375cIB0M6dO8nb25v09fUpMjKSiIhOnz5NTk5OpKurSz179qRPP/2US/PmzRtatGgR9erVi/T19Wn48OGUnp6uUof6+nrq2bMn+fr6qozTutzqxuDz58/JwsKCG/9OTk7k5+enMu/WqOqv4eHhNGjQIDm/adOmkUgkUplXaGgo9e/fn9O/traWdHR05Ma+VColAJSTk6Oxjm3BLHL/cRISEqCtrY28vDxs3boVmzdv5pZZGhsbsXr1ahQUFODkyZOorKyUW0JZsWIFiouL8dtvv0EqlSI6OhrGxsZcWpFIBAMDA2RlZSE7OxtCoRATJkxol2Vk06ZNcHJywvXr1xESEoLg4GCUlpa+VxkM9ahrg7y8PADA+fPncf/+fW4JKjExEREREVi7di2kUinWrVuHFStWKLWSqCIgIABJSUnYtm0bpFIpdu/eDaFQCACoqanBpEmT4OzsjIKCAkRHRyMmJgZr1qyRyyMhIQECgQDZ2dnYtWsXamtrMXbsWAwZMgRXr15FSkoKHj58iKlTp3a4fmJiYjBu3DhYWFgoDefxeHB3d0dGRgYA4NmzZ5BKpXj9+jVKSkoAAJmZmXB2doa+vr5CelV1DADp6ekoLy9Heno6EhISEB8fr7D80xIzMzNcuHABjx8/bnc5JRIJ4uLiOHdsbGy7/mFn7NixcHBwULpM2R74fD7WrVuH7du34969e0rjBAUFoaysDH/88QfnV19fj2PHjqm1xqlCLBajR48ebeoeExODmTNnonv37pg4caLatgCApKQkCIVChISEKA2XLRcDQFZWFgICAhAaGori4mLs3r0b8fHxWLt2rUZlSE5ORmhoKBYtWoSbN29izpw5CAwMRHp6uly8lStXwtfXF4WFhZBIJDhz5gx8fX0xadIkXL9+HWlpaRg+fDgXf/78+cjJycHhw4dx48YN+Pn5YcKECSgrK1Oqx++//44nT54gPDxcpa4ty90WBgYGiI2NxaZNm+Dv74+7d+8iOjpa4/SqyMnJUbDWiUQi5OTkKI3f0NCAgwcPQiKRcPpfu3YNjY2NcvnY2NigT58+KvPpEO9tSsjodIwePZpsbW3l3n6WLFlCtra2SuNfuXKFANCLFy+IiMjb25sCAwOVxj1w4AANGDBALu+3b9+Snp4epaamEpFmFrmZM2dy7ubmZjI1NaXo6GiNZTDaR3vbQJVlrX///nTo0CE5v9WrV5Obm5vadDJKS0sVLCAtWbZsmULb79ixg4RCITU1NXFlGTJkiIIO48ePl/O7e/cuAaDS0lKlstRZA2pqaojP59ORI0eUhsvYtm0b93Z/8uRJcnFxIR8fH64ex40bR8uWLePio4W1R1VdicVisrCwoL///pvz8/Pzo2nTpqnUo6ioiGxtbUlLS4vs7Oxozpw5dPbsWYV8lVnkHj16RLq6ulRZWUmVlZXUpUsXevz4scYWOaJ3Fg1VzxdNaJm3q6srSSQSIlK0yMnCW+oVExND+vr69Pz5c85PU4scEZGLiwtNnDiRc6OVRe7WrVuko6PDWXeTk5Opb9++CtallkyYMIHs7e3l/DZt2kRdu3blPrW1tURE5OnpSevWrZOLe+DAATI3N+fcFhYWJBAI5NLLrH0jRoyg2bNny6X38/OjSZMmyZVpwYIFcnHc3NzI399fqf5VVVXE5/OppqZGzt/T05OWLl2qNM2GDRsIAD19+pTzy8vLk9P5l19+kUvTllWciGj69OkEoM2x2BpV/dXKykqhvs+cOUMA6NWrVwrxjxw5olAXiYmJJBAIFOI6OztTeHh4u/RUB7PI/cdxdXWVe/txc3NDWVkZmpqacO3aNXh7e6NPnz4wMDDA6NGjAQDV1dUAgODgYBw+fBiOjo4IDw/HpUuXuHwKCgpw+/ZtGBgYQCgUQigUwsjICG/evEF5ebnG+tnb23PfeTwezMzM8OjRo/cqg6EedW2gjJcvX6K8vBxBQUFcuwiFQqxZs0bjdsnPzwefz+f6XGukUinc3Nzk+u7IkSNRX18vZ6UZNmyYXLqCggKkp6fL6WVjYwMAHeozCQkJMDQ0bPP06OjRo1FcXIzHjx8jMzMTHh4e8PDwQEZGBhobG3Hp0iV4eHi0W/6gQYPA5/M5t7m5udq2GThwIG7evInc3FxIJBI8evQI3t7e+Oqrr9qUZWJiAi8vL8THxyMuLg5eXl6cBV5T6J9N7O+DqKgobn+VMiQSCY4dO4YXL14AeGdB9PPz6/Ae0LZ0j42NhUgk4upk0qRJqKurw4ULF9olRyKRID8/H7t378bLly9B//z5UkFBAX744Qe5vivbz/fq1Ssu/eLFi5Gfn899AgICALwbMyNHjpSTNXLkSIX6c3JyknPn5+fD09NTqa6FhYVoamqCtbW1nF6ZmZntfs7L9H358mW791HW1NQgJSUF+vr6yMrKalfa90VMTAwmTpyIXr16/euy/9//1yrj/4Y3b95AJBJBJBIhMTERJiYmqK6uhkgk4pYtJ06ciKqqKpw9exbnzp2Dp6cn5s2bh40bN6K+vh7Dhg1DYmKiQt4mJiYa66GjoyPn5vF43Mm39yWDoR51baCM+vp6AMDevXvh4uIiF9Zy0qEOPT29dmqpnK5duyro5u3tjaioKIW45ubm7cqbiBAbG4tZs2ZBIBCojWtnZwcjIyNkZmYiMzMTa9euhZmZGaKionDlyhU0NjZixIgR7ZIPtL9tAEBLSwvOzs5wdnbGggULcPDgQcyaNQvLly9H37591aaVSCSYP38+AGDHjh3t1lcqlbYpQ1Pc3d0hEomwdOlSuS0fMqZPn46FCxfi6NGjcHd3R3Z2NtavX98hWU1NTSgrK4Ozs7PK8ISEBDx48ADa2tpy/rGxsSonQlZWVrh48SIaGxu5tjQ0NIShoaHCsnF9fT1WrVqldKN8ly5duO/Gxsb46KOP2l1GGa3HjLqxWF9fDz6fj2vXrimMbdk2iNZYWVkBAEpLS+Hq6goA3KnQjjJ79mwMGzYMy5cvxyeffIIpU6aofAnUFDMzM4XTpQ8fPkS3bt0U6qSqqgrnz59XWHo3MzNDQ0MDamtr5a4wevjwocqDGB2BTeT+41y+fFnOnZubCysrK5SUlODJkyfYsGEDevfuDQC4evWqQnoTExOIxWKIxWKMGjUKixcvxsaNGzF06FAcOXIEpqam6Nat2/+K7v+GDIZ6ZBOYpqYmzu+DDz5Ar169UFFRAX9//w7la2dnh+bmZmRmZio9VWZra4vjx4/LWUmys7NhYGCg9rqFoUOH4vjx47C0tJT7we0ImZmZbZ6AlMHj8TBq1CicOnUKRUVF+Pjjj6Gvr4+3b99i9+7dcHJyUvgBlaGsjt8nAwcOBPDOktoWsv2nPB4PIpGoXXIuXLiAwsJCLFy4sEN6KmPDhg1wdHTEgAEDFMIMDAzg5+eH2NhYlJeXw9raGqNGjeqQnISEBDx79gyff/650vCzZ8/ixYsXuH79utyE5ubNmwgMDFT4IZcxY8YMbN++HTt37kRoaKhaHYYOHYrS0tIOT3hsbW2RnZ0NsVjM+WVnZ3Ptrwp7e3ukpaUp3Q85ZMgQNDU14dGjRxrX7fjx42FkZISoqCgkJye3rxBK2LdvHy5evIjCwkJYWFggODgYEokEN27cUDmmNMHNzQ1nz56V8zt37hzc3NwU4sbFxcHU1BReXl5y/sOGDYOOjg7S0tK4vlNaWorq6mql+XQUtrT6H6e6uhphYWEoLS1FUlIStm/fjtDQUPTp0wcCgQDbt29HRUUFTp8+rXC/WEREBE6dOoXbt2+jqKgIv/76K2xtbQEA/v7+MDY2ho+PD7KysnDnzh1kZGTgm2++UblBub38GzIY6jE1NYWenh53aKCurg7Au2su1q9fj23btuHWrVsoLCxEXFwcNm/erFG+lpaWEIvFkEgkOHnyJNe2R48eBQCEhITg7t27+Prrr1FSUoJTp04hMjISYWFh0NJS/VibN28enj59ihkzZuDKlSsoLy9HamoqAgMD2z1RiomJgYuLCwYPHqxRfA8PDyQlJcHR0RFCoRBaWlpwd3dHYmKiWuuBqjruCFOmTMGWLVtw+fJlVFVVISMjA/PmzYO1tTW3xKwOPp8PqVSK4uJitdbVt2/f4sGDB6ipqcGff/6JdevWwcfHB5MnT+aW+t4HdnZ28Pf3x7Zt25SGBwUF4dKlS9i1axckEolGeb569QoPHjzAvXv3kJubiyVLlmDu3LkIDg7GmDFjlKaJiYmBl5cXHBwcMHjwYO4zdepUGBoaKl01AN5NFhYtWoRFixYhLCwMFy9eRFVVFXJzcxETEwMej8f154iICOzfvx+rVq1CUVERpFIpDh8+jO+//16jci1evBjx8fGIjo5GWVkZNm/ejBMnTuDbb79Vmy4yMhJJSUmIjIyEVCpFYWEhZ9G2traGv78/AgICcOLECdy5cwd5eXlYv349zpw5ozQ/oVCIffv24cyZM/Dy8kJqaioqKipw48YN/PjjjwA0t9xXVVUhLCwMGzdu5A4bRUVFgcfj4bvvvlObtri4GPn5+Xj69Cnq6uq4pV0Zc+fORUVFBcLDw1FSUoKdO3fi6NGjCi8izc3NiIuLg1gsVng57N69O4KCghAWFob09HRcu3YNgYGBcHNz46yR74X3ttuO0ekYPXo0hYSE0Ny5c6lbt27Uo0cPWrZsGbc599ChQ2RpaUm6urrk5uZGp0+fltt0vXr1arK1tSU9PT0yMjIiHx8fqqio4PK/f/8+BQQEkLGxMenq6lK/fv1o9uzZVFdXR0SaHXZofZTewcGBOxKviQxG++hIG+zdu5d69+5NWlpactePJCYmkqOjIwkEAurRowe5u7vTiRMniEiz60dev35NCxcuJHNzcxIIBArX22hy/Yiyjeu3bt0iX19fMjQ0JD09PbKxsaEFCxao3JSubKN1bW0t6enp0Z49e1Tq35rr168TAFqyZAnnt2XLFgJAKSkpcnHRaiO9sjpWtkk7NDRUrg1as2fPHhozZgyZmJiQQCCgPn360Jdffil3dYqqww6qUHbYAf9claKtrU0mJiY0btw4io2N5Q6idBRluty5c4cEAoHCYQcZAwYMID6fT3/99ZdCmLLDDjLdBQIBmZub0+TJk7l+2xJZGz148IC0tbXp6NGjSuUHBwcrHLppzZEjR8jDw4O6d+9OOjo69OGHH9IXX3xBubm5cvFSUlJoxIgRpKenR926daPhw4fL9cH3cf1I6ytViIiOHz/OjWVjY2P67LPPuLCGhgaKiIggS0tL0tHRIXNzc/L19aUbN26oLfOVK1doypQpZGpqStra2tSzZ08SiUR0+PBhja4faW5uJk9PT4XDS0TvrvPh8/mUkZGhUr6FhYXC1T6t+1B6ejpX7n79+lFcXJxCPqmpqWoPS71+/ZpCQkKoR48epK+vT76+vnT//n2VenUEHtE/OykZDAaDwWAwGJ0KtrTKYDAYDAaD0UlhEzkGg8FgMBiMTgqbyDEYDAaDwWB0UthEjsFgMBgMBqOTwiZyDAaDwWAwGJ0UNpFjMBgMBoPB6KSwiRyDwWAwGAxGJ4VN5BgMBoPBYDA6KWwix2AwGAwGg9FJYRM5BoPBYDAYjE4Km8gxGAwGg8FgdFLYRI7BYDAYDAajk/I/j902NQfO53wAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot speed up for 200 200 200 grid\n", + "\n", + "t_local_no_simd=186.571/10\n", + "t_local_avx=25.903/10\n", + "t_gpu=5.45952/10\n", + "\n", + "speedup_local = 1.0\n", + "speedup_avx = t_local_no_simd / t_local_avx\n", + "speedup_cuda = t_local_no_simd / t_gpu\n", + "\n", + "\n", + "fig, ax = plt.subplots()\n", + "\n", + "ax.set_title('Speed up ratio for forward simulation with 200x200x200 grid')\n", + "\n", + "ax.set_ylabel('Speed up ratio')\n", + "ax.set_xticks([0, 1, 2])\n", + "ax.set_xticklabels(['baseline', 'intel core i7 with SIMD', 'NVIDIA GeForce GTX 1070'])\n", + "\n", + "\n", + "#ax.set_ylim(0, 10)\n", + "ax.bar(0, 1, color='r', label='baseline (intel core i7 no SIMD)') \n", + "ax.bar(1, speedup_avx, color='b', label='intel core i7 + \\nmemory relocation\\n + SIMD (AVX+FMA 256bits)')\n", + "ax.bar(2, speedup_cuda, color='g', label='memory relocation \\n+ gpu (CUDA NVIDIA GeForce GTX 1070)')\n", + "ax.legend()\n", + "\n", + "plt.tight_layout()\n", + "plt.savefig('speedup_200x200x200.png', dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "1472887337ddd1717660a5ad84f7170e87aa3d39bd2f4b7d54c31e0901f516a9" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/solver_performance/pvpython_test.py b/test/old_tests/solver_performance/pvpython_test.py new file mode 100644 index 0000000..276b7fb --- /dev/null +++ b/test/old_tests/solver_performance/pvpython_test.py @@ -0,0 +1,139 @@ +from paraview.simple import * + + +if __name__ == '__main__': + # get args + args = sys.argv + if len(args) != 3: + print("Usage: pvpython draw_slice.py ") + sys.exit(1) + + # get data + fpath = args[1] + name_dset = args[2] + + + #fpath = "OUTPUT_FILES/out_data_sim_0.xmf" + #name_dset = 'fun_inv_0000' + + # create a new 'XDMF Reader' + out_data_sim_0xmf = XDMFReader(registrationName=fpath.split('/')[-1], FileNames=[fpath]) + + # Limit the data array to be read + # Properties modified on out_data_sim_0xmf + out_data_sim_0xmf.PointArrayStatus = [name_dset] + + # get active view + renderView1 = GetActiveViewOrCreate('RenderView') + + ## show data in view + #out_data_sim_0xmfDisplay = Show(out_data_sim_0xmf, renderView1, 'UnstructuredGridRepresentation') + + ## trace defaults for the display properties. + #out_data_sim_0xmfDisplay.Representation = 'Surface' + + # reset view to fit data + #renderView1.ResetCamera(False) + + # get the material library + materialLibrary1 = GetMaterialLibrary() + + # get color transfer function/color map for 'T_res_src_0_inv_0000' + name_dsetLUT = GetColorTransferFunction(name_dset) + + # get opacity transfer function/opacity map for 'T_res_src_0_inv_0000' + name_dsetPWF = GetOpacityTransferFunction(name_dset) + + + # show color bar/color legend + #out_data_sim_0xmfDisplay.SetScalarBarVisibility(renderView1, True) + + # update the view to ensure updated data information + #renderView1.Update() + + # create a new 'Slice' + slice1 = Slice(registrationName='Slice1', Input=out_data_sim_0xmf) + + # Properties modified on slice1.SliceType + slice1.SliceType.Normal = [0.0, 0.0, 1.0] + + # show data in view + slice1Display = Show(slice1, renderView1, 'GeometryRepresentation') + + # trace defaults for the display properties. + slice1Display.Representation = 'Surface' + + # hide data in view + Hide(out_data_sim_0xmf, renderView1) + + # show color bar/color legend + slice1Display.SetScalarBarVisibility(renderView1, True) + + # trace defaults for the display properties. + slice1Display.Representation = 'Surface' + + + # rescale color and/or opacity maps used to include current data range + slice1Display.RescaleTransferFunctionToDataRange(True, False) + + # show color bar/color legend + slice1Display.SetScalarBarVisibility(renderView1, True) + + + # + # change the position of color bar + # + # Properties modified on slice1Display.DataAxesGrid + slice1Display.DataAxesGrid.GridAxesVisibility = 1 + + # get color legend/bar for t_res_src_0_inv_0000LUT in view renderView1 + name_dsetLUTColorBar = GetScalarBar(name_dsetLUT, renderView1) + + # change scalar bar placement + name_dsetLUTColorBar.Orientation = 'Horizontal' + name_dsetLUTColorBar.WindowLocation = 'Any Location' + name_dsetLUTColorBar.Position = [0.33262344353799916, 0.24363636363636363] + name_dsetLUTColorBar.ScalarBarLength = 0.3299999999999998 + + + + # update the view to ensure updated data information + #renderView1.Update() + + + # + # axis options + # + + # toggle 3D widget visibility (only when running from the GUI) + Hide3DWidgets(proxy=slice1.SliceType) + + # Properties modified on slice1Display.DataAxesGrid + slice1Display.DataAxesGrid.GridAxesVisibility = 1 + + + # + # window layout and camera settings + # + layout1 = GetLayout() + + #-------------------------------- + # saving layout sizes for layouts + + # layout/tab size in pixels + layout1.SetSize(1280, 980) + + #----------------------------------- + # saving camera placements for views + + # current camera placement for renderView1 + renderView1.CameraPosition = [6086.06543558693, 0.0, 7825.811009542308] + renderView1.CameraFocalPoint = [6086.06543558693, 0.0, -3.410605131648481e-13] + renderView1.CameraViewUp = [1.0, 2.220446049250313e-16, 0.0] + renderView1.CameraParallelScale = 2025.468932642534 + + # save screenshot + SaveScreenshot('test_screenshot.png', renderView1, ImageResolution=[2560,1280]) + + Render() + Interact() \ No newline at end of file diff --git a/test/old_tests/solver_performance/pyscript_written_by_paraview.py b/test/old_tests/solver_performance/pyscript_written_by_paraview.py new file mode 100644 index 0000000..5677639 --- /dev/null +++ b/test/old_tests/solver_performance/pyscript_written_by_paraview.py @@ -0,0 +1,115 @@ +# trace generated using paraview version 5.10.1 +#import paraview +#paraview.compatibility.major = 5 +#paraview.compatibility.minor = 10 + +#### import the simple module from the paraview +from paraview.simple import * +#### disable automatic camera reset on 'Show' +paraview.simple._DisableFirstRenderCameraReset() + +# create a new 'XDMF Reader' +out_data_sim_0xmf = XDMFReader(registrationName='out_data_sim_0.xmf', FileNames=['/home/masarunagaso/workspace/TomoATT/test/solver_performance/OUTPUT_FILES/out_data_sim_0.xmf']) + +# get active view +renderView1 = GetActiveViewOrCreate('RenderView') + +# show data in view +out_data_sim_0xmfDisplay = Show(out_data_sim_0xmf, renderView1, 'UnstructuredGridRepresentation') + +# trace defaults for the display properties. +out_data_sim_0xmfDisplay.Representation = 'Surface' + +# reset view to fit data +renderView1.ResetCamera(False) + +# get the material library +materialLibrary1 = GetMaterialLibrary() + +# show color bar/color legend +out_data_sim_0xmfDisplay.SetScalarBarVisibility(renderView1, True) + +# update the view to ensure updated data information +renderView1.Update() + +# get color transfer function/color map for 'procid' +procidLUT = GetColorTransferFunction('procid') + +# get opacity transfer function/opacity map for 'procid' +procidPWF = GetOpacityTransferFunction('procid') + +# create a new 'Slice' +slice1 = Slice(registrationName='Slice1', Input=out_data_sim_0xmf) + +# show data in view +slice1Display = Show(slice1, renderView1, 'GeometryRepresentation') + +# trace defaults for the display properties. +slice1Display.Representation = 'Surface' + +# hide data in view +Hide(out_data_sim_0xmf, renderView1) + +# show color bar/color legend +slice1Display.SetScalarBarVisibility(renderView1, True) + +# update the view to ensure updated data information +renderView1.Update() + +# Properties modified on slice1.SliceType +slice1.SliceType.Normal = [0.0, 0.0, 1.0] + +# update the view to ensure updated data information +renderView1.Update() + +# set scalar coloring +ColorBy(slice1Display, ('POINTS', 'T_res_src_0_inv_0000')) + +# Hide the scalar bar for this color map if no visible data is colored by it. +HideScalarBarIfNotNeeded(procidLUT, renderView1) + +# rescale color and/or opacity maps used to include current data range +slice1Display.RescaleTransferFunctionToDataRange(True, False) + +# show color bar/color legend +slice1Display.SetScalarBarVisibility(renderView1, True) + +# get color transfer function/color map for 'T_res_src_0_inv_0000' +t_res_src_0_inv_0000LUT = GetColorTransferFunction('T_res_src_0_inv_0000') + +# get opacity transfer function/opacity map for 'T_res_src_0_inv_0000' +t_res_src_0_inv_0000PWF = GetOpacityTransferFunction('T_res_src_0_inv_0000') + +# toggle 3D widget visibility (only when running from the GUI) +Hide3DWidgets(proxy=slice1.SliceType) + +# Properties modified on slice1Display.DataAxesGrid +slice1Display.DataAxesGrid.GridAxesVisibility = 1 + +#================================================================ +# addendum: following script captures some of the application +# state to faithfully reproduce the visualization during playback +#================================================================ + +# get layout +layout1 = GetLayout() + +#-------------------------------- +# saving layout sizes for layouts + +# layout/tab size in pixels +layout1.SetSize(2329, 1650) + +#----------------------------------- +# saving camera placements for views + +# current camera placement for renderView1 +renderView1.CameraPosition = [6086.06543558693, 0.0, 7825.811009542308] +renderView1.CameraFocalPoint = [6086.06543558693, 0.0, -3.410605131648481e-13] +renderView1.CameraViewUp = [1.0, 2.220446049250313e-16, 0.0] +renderView1.CameraParallelScale = 2025.468932642534 + +#-------------------------------------------- +# uncomment the following to render all views +# RenderAllViews() +# alternatively, if you want to write images, you can use SaveScreenshot(...). \ No newline at end of file diff --git a/test/old_tests/solver_performance/pyscript_written_by_paraview2.py b/test/old_tests/solver_performance/pyscript_written_by_paraview2.py new file mode 100644 index 0000000..d35365e --- /dev/null +++ b/test/old_tests/solver_performance/pyscript_written_by_paraview2.py @@ -0,0 +1,106 @@ +# trace generated using paraview version 5.10.1 +#import paraview +#paraview.compatibility.major = 5 +#paraview.compatibility.minor = 10 + +#### import the simple module from the paraview +from paraview.simple import * +#### disable automatic camera reset on 'Show' +paraview.simple._DisableFirstRenderCameraReset() + +# create a new 'XDMF Reader' +out_data_sim_0xmf = XDMFReader(registrationName='out_data_sim_0.xmf', FileNames=['/home/masarunagaso/workspace/TomoATT/test/solver_performance/OUTPUT_FILES/out_data_sim_0.xmf']) + +# Properties modified on out_data_sim_0xmf +out_data_sim_0xmf.PointArrayStatus = ['T_res_src_0_inv_0000'] + +# get active view +renderView1 = GetActiveViewOrCreate('RenderView') + +# show data in view +out_data_sim_0xmfDisplay = Show(out_data_sim_0xmf, renderView1, 'UnstructuredGridRepresentation') + +# trace defaults for the display properties. +out_data_sim_0xmfDisplay.Representation = 'Surface' + +# reset view to fit data +renderView1.ResetCamera(False) + +# get the material library +materialLibrary1 = GetMaterialLibrary() + +# show color bar/color legend +out_data_sim_0xmfDisplay.SetScalarBarVisibility(renderView1, True) + +# update the view to ensure updated data information +renderView1.Update() + +# get color transfer function/color map for 'T_res_src_0_inv_0000' +t_res_src_0_inv_0000LUT = GetColorTransferFunction('T_res_src_0_inv_0000') + +# get opacity transfer function/opacity map for 'T_res_src_0_inv_0000' +t_res_src_0_inv_0000PWF = GetOpacityTransferFunction('T_res_src_0_inv_0000') + +# create a new 'Slice' +slice1 = Slice(registrationName='Slice1', Input=out_data_sim_0xmf) + +# Properties modified on slice1.SliceType +slice1.SliceType.Normal = [0.0, 0.0, 1.0] + +# show data in view +slice1Display = Show(slice1, renderView1, 'GeometryRepresentation') + +# trace defaults for the display properties. +slice1Display.Representation = 'Surface' + +# hide data in view +Hide(out_data_sim_0xmf, renderView1) + +# show color bar/color legend +slice1Display.SetScalarBarVisibility(renderView1, True) + +# update the view to ensure updated data information +renderView1.Update() + +# toggle 3D widget visibility (only when running from the GUI) +Hide3DWidgets(proxy=slice1.SliceType) + +# Properties modified on slice1Display.DataAxesGrid +slice1Display.DataAxesGrid.GridAxesVisibility = 1 + +# get color legend/bar for t_res_src_0_inv_0000LUT in view renderView1 +t_res_src_0_inv_0000LUTColorBar = GetScalarBar(t_res_src_0_inv_0000LUT, renderView1) + +# change scalar bar placement +t_res_src_0_inv_0000LUTColorBar.Orientation = 'Horizontal' +t_res_src_0_inv_0000LUTColorBar.WindowLocation = 'Any Location' +t_res_src_0_inv_0000LUTColorBar.Position = [0.33262344353799916, 0.34363636363636363] +t_res_src_0_inv_0000LUTColorBar.ScalarBarLength = 0.3299999999999998 + +#================================================================ +# addendum: following script captures some of the application +# state to faithfully reproduce the visualization during playback +#================================================================ + +# get layout +layout1 = GetLayout() + +#-------------------------------- +# saving layout sizes for layouts + +# layout/tab size in pixels +layout1.SetSize(2329, 1650) + +#----------------------------------- +# saving camera placements for views + +# current camera placement for renderView1 +renderView1.CameraPosition = [6086.06543558693, 0.0, 7825.811009542308] +renderView1.CameraFocalPoint = [6086.06543558693, 0.0, -3.410605131648481e-13] +renderView1.CameraViewUp = [1.0, 2.220446049250313e-16, 0.0] +renderView1.CameraParallelScale = 2025.468932642534 + +#-------------------------------------------- +# uncomment the following to render all views +# RenderAllViews() +# alternatively, if you want to write images, you can use SaveScreenshot(...). \ No newline at end of file diff --git a/test/old_tests/solver_performance/run_performance_test.ipynb b/test/old_tests/solver_performance/run_performance_test.ipynb new file mode 100644 index 0000000..c4dc4a3 --- /dev/null +++ b/test/old_tests/solver_performance/run_performance_test.ipynb @@ -0,0 +1,420 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# grid size\n", + "\n", + "def run_single_test(n_grid, n_sweep, ndiv_r, ndiv_t, ndiv_p, use_gpu=False, run_on_hpc=False):\n", + " print(\"start test ngrid = {}, n_sweep = {}, ndiv_r = {}, ndiv_t = {}, ndiv_p = {}\".format(n_grid, n_sweep, ndiv_r, ndiv_t, ndiv_p))\n", + "\n", + " # create simulation file by running make_test_model.py\n", + " import os\n", + " if (use_gpu == False):\n", + " os.system('python3 make_test_model.py --n_rtp {} {} {} --n_sweep {} --ndiv_rtp {} {} {}'. format(n_grid, n_grid, n_grid, n_sweep, ndiv_r, ndiv_t, ndiv_p))\n", + " else:\n", + " os.system('python3 make_test_model.py --n_rtp {} {} {} --n_sweep {} --ndiv_rtp {} {} {} --use_gpu 1'. format(n_grid, n_grid, n_grid, n_sweep, ndiv_r, ndiv_t, ndiv_p))\n", + " \n", + "\n", + " #\n", + " # run simulatoin and store time file\n", + " #\n", + " total_nprocs = n_sweep * ndiv_r * ndiv_t * ndiv_p\n", + " print('total number of processes: {}'.format(total_nprocs))\n", + "\n", + " if (run_on_hpc == False):\n", + " # run simulation\n", + " tomo_exec = \"../../build/TOMOATT\"\n", + " mpi_path = \"../../external_libs/local_mpi_hdf5/bin/\"\n", + " os.system('{}/mpirun --use-hwthread-cpus -np {} {} -i input_params_{}-{}-{}_{}-{}-{}-{}.yml'.format(mpi_path,total_nprocs, tomo_exec, n_grid, n_grid, n_grid, n_sweep, ndiv_r, ndiv_t, ndiv_p))\n", + "\n", + " # change filename of time.txt to time_{}-{}-{}_{}-{}-{}-{}.txt\n", + " os.system('mv time.txt time_{}-{}-{}_{}-{}-{}-{}.txt'.format(n_grid, n_grid, n_grid, n_sweep, ndiv_r, ndiv_t, ndiv_p))\n", + " else:\n", + " # total number of processes\n", + " total_nprocs = n_sweep * ndiv_r * ndiv_t * ndiv_p\n", + "\n", + " # write out job script (append)\n", + " job_script = open('job_script.sh', 'a')\n", + " job_script.write('''\n", + "# run simulation \n", + "mpirun -np {0} $EXEC -i input_params_{1}-{2}-{3}_{4}-{5}-{6}-{7}.yml\n", + "# change filename of time.txt to time_{1}-{2}-{3}_{4}-{5}-{6}-{7}.txt\n", + "mv time.txt time_{1}-{2}-{3}_{4}-{5}-{6}-{7}.txt\n", + "\n", + " '''.format(total_nprocs,n_grid, n_grid, n_grid, n_sweep, ndiv_r, ndiv_t, ndiv_p))\n", + "\n", + " job_script.close()\n", + "\n", + " # modify the jobscript file name\n", + " import os\n", + " os.system('mv job_script.sh job_script_{}-{}-{}_{}-{}-{}-{}.sh'.format(n_grid, n_grid, n_grid, n_sweep, ndiv_r, ndiv_t, ndiv_p))\n", + "\n", + "def prepare_job_script_header(nnodes, nprocs, id_proj, path_TATT):\n", + " job_script = open('job_script.sh', 'w')\n", + "\n", + " aspire = False\n", + " fugaku = True\n", + "\n", + " if (aspire):\n", + " # for aspire 1\n", + " # normal queue has 24 cores per node, 4GB per core or 96GB per node\n", + " job_script.write('''\n", + "#!/bin/bash\n", + "#PBS -q normal\n", + "#PBS -l select={0}:ncpus={1}:mpiprocs={1}\n", + "#PBS -l walltime=05:00:00\n", + "#PBS -N tomoatt\n", + "#PBS -j oe\n", + "#PBS -o tomoatt.out\n", + "#PBS -P {2}\n", + "\n", + "module load intel/2018.3\n", + "module load intelmpi/2018.3\n", + "module load hdf5/1.10.4\n", + "\n", + "cd $PBS_O_WORKDIR\n", + "\n", + "EXEC={3}\n", + "\n", + "\n", + " '''.format(nnodes, nprocs, id_proj, path_TATT))\n", + "\n", + " if (fugaku):\n", + " # for Fugaku\n", + " # normal queue has 48 cores per node \n", + " job_script.write('''\n", + "#!/bin/bash\n", + "#PJM -L \"node={0}\" # number of nodes\n", + "#PJM -L \"rscgrp=small-s1\" # resource group\n", + "#PJM -L \"elapse=01:00:00\" # elapse time limit\n", + "#PJM --mpi \"max-proc-per-node={1}\" # number of processes for each node\n", + "#PJM -x PJM_LLIO_GFSCACHE=/vol0004 # use temporal data directory for large output\n", + "#PJM -g {2} # specify the group\n", + "#PJM -S # output statistics file\n", + "\n", + "export OMP_NUM_THREADS=1\n", + "\n", + ". /vol0004/apps/oss/spack/share/spack/setup-env.sh\n", + "spack load /jfzaut5\n", + "\n", + "EXEC={3}\n", + "\n", + "\n", + " '''.format(nnodes, (int)(nprocs/nnodes), id_proj, path_TATT))\n", + "\n", + "def assign_procs(nprocs, nnodes):\n", + "\n", + " # assersion if nprocs is not divisible by nnodes\n", + " assert (nprocs % nnodes == 0), \"nprocs is not divisible by nnodes\"\n", + "\n", + " if nnodes == 1:\n", + " return nprocs, 1,1,1\n", + "\n", + " if nnodes == 2:\n", + " return (int)(nprocs/2), 2,1,1\n", + " \n", + " if nnodes == 4:\n", + " return (int)(nprocs/4), 2,2,1\n", + "\n", + " if nnodes == 8:\n", + " return (int)(nprocs/8), 2,2,2\n", + "\n", + " if nnodes == 16:\n", + " return (int)(nprocs/16), 2,2,4\n", + " \n", + " if nnodes == 32:\n", + " return (int)(nprocs/32), 2,4,4\n", + "\n", + " if nnodes == 64:\n", + " return (int)(nprocs/64), 4,4,4\n", + " \n", + " else:\n", + " #error\n", + " print (\"error: nnodes = {}\".format(nnodes))\n", + " return 0,0,0,0\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "start test ngrid = 100, n_sweep = 1, ndiv_r = 1, ndiv_t = 1, ndiv_p = 1\n", + "total number of processes: 1\n", + "start test ngrid = 100, n_sweep = 12, ndiv_r = 1, ndiv_t = 1, ndiv_p = 1\n", + "total number of processes: 12\n", + "start test ngrid = 100, n_sweep = 12, ndiv_r = 2, ndiv_t = 1, ndiv_p = 1\n", + "total number of processes: 24\n", + "start test ngrid = 100, n_sweep = 12, ndiv_r = 2, ndiv_t = 2, ndiv_p = 1\n", + "total number of processes: 48\n", + "start test ngrid = 200, n_sweep = 12, ndiv_r = 2, ndiv_t = 1, ndiv_p = 1\n", + "total number of processes: 24\n", + "start test ngrid = 200, n_sweep = 12, ndiv_r = 2, ndiv_t = 2, ndiv_p = 1\n", + "total number of processes: 48\n", + "start test ngrid = 200, n_sweep = 12, ndiv_r = 2, ndiv_t = 2, ndiv_p = 2\n", + "total number of processes: 96\n", + "start test ngrid = 200, n_sweep = 12, ndiv_r = 2, ndiv_t = 2, ndiv_p = 4\n", + "total number of processes: 192\n", + "start test ngrid = 400, n_sweep = 12, ndiv_r = 2, ndiv_t = 2, ndiv_p = 2\n", + "total number of processes: 96\n", + "start test ngrid = 400, n_sweep = 12, ndiv_r = 2, ndiv_t = 2, ndiv_p = 4\n", + "total number of processes: 192\n", + "start test ngrid = 400, n_sweep = 12, ndiv_r = 2, ndiv_t = 4, ndiv_p = 4\n", + "total number of processes: 384\n", + "start test ngrid = 400, n_sweep = 12, ndiv_r = 4, ndiv_t = 4, ndiv_p = 4\n", + "total number of processes: 768\n" + ] + } + ], + "source": [ + "#n_grids = [10,50,100,150]\n", + "n_grids = [100, 200, 400]\n", + "\n", + "hpc_analysis = True # output for hpc analysis\n", + "\n", + "if hpc_analysis == True:\n", + "\n", + " #\n", + " # ASPIRE 1 @ NSCC (24 processes per node)\n", + " #\n", + " #id_proj = \"...\"\n", + " #path_TATT = \"/home/.../tomoatt\"\n", + "\n", + " #n_procs = [[1,6,12,24], # single node\n", + " # [24,48,96,8], # 1-4 nodes\n", + " # [48,96,192,384]] # 2-16 nodes\n", + " \n", + " # calculate required nodes for each grid and n_procs\n", + " #n_nodes = [[1,1,1,1],\n", + " # [1,2,4,8],\n", + " # [2,4,8,16]]\n", + "\n", + " #\n", + " # Fugaku @ RIKEN (48 processes per node, but it becomes 12 when using sve)\n", + " #\n", + " id_proj = \"hp220155\" # project ID\n", + " path_TATT = \"/home/u10304/TomoATT/build/TOMOATT\" # path to tomoatt executable on Fugaku\n", + "\n", + " n_procs = [[1,12,24,48], # 1-4 nodes\n", + " [24,48,96,192], # 2-16 nodes\n", + " [96,192,384,768]] # 4-32 nodes\n", + " \n", + " # calculate required nodes for each grid and n_procs\n", + " n_nodes = [[1,1,2,4],\n", + " [2,4,8,16],\n", + " [8,16,32,64]]\n", + "\n", + "\n", + "for i, n_grid in enumerate(n_grids):\n", + "\n", + " n_sweep = 1\n", + " ndiv_r = 1\n", + " ndiv_t = 1\n", + " ndiv_p = 1 \n", + "\n", + " # test on local\n", + " if (hpc_analysis == False): \n", + "\n", + " # baseline\n", + " run_single_test(n_grid, n_sweep, ndiv_r, ndiv_t, ndiv_p, use_gpu=False)\n", + "\n", + " # parallel on sweep\n", + " n_sweep = 2\n", + " run_single_test(n_grid, n_sweep, ndiv_r, ndiv_t, ndiv_p)\n", + " n_sweep = 4\n", + " run_single_test(n_grid, n_sweep, ndiv_r, ndiv_t, ndiv_p)\n", + " n_sweep = 8\n", + " run_single_test(n_grid, n_sweep, ndiv_r, ndiv_t, ndiv_p)\n", + " n_sweep = 12\n", + " run_single_test(n_grid, n_sweep, ndiv_r, ndiv_t, ndiv_p)\n", + "\n", + " # reset n_sweep\n", + " n_sweep = 1\n", + "\n", + " # parallel on rtp\n", + " ndiv_r = 2 # total 2 procs\n", + " run_single_test(n_grid, n_sweep, ndiv_r, ndiv_t, ndiv_p)\n", + " ndiv_t = 2 # total 4 procs\n", + " run_single_test(n_grid, n_sweep, ndiv_r, ndiv_t, ndiv_p)\n", + " ndiv_p = 2 # total 8 procs\n", + " run_single_test(n_grid, n_sweep, ndiv_r, ndiv_t, ndiv_p)\n", + " ndiv_r = 2; ndiv_t = 2; ndiv_p = 3 # total 12 procs\n", + " run_single_test(n_grid, n_sweep, ndiv_r, ndiv_t, ndiv_p)\n", + "\n", + " # test on hpc\n", + " else:\n", + " for j, n_proc in enumerate(n_procs[i]):\n", + " nnode = n_nodes[i][j]\n", + " prepare_job_script_header(nnode, n_proc, id_proj, path_TATT)\n", + " n_sweep, ndiv_r, ndiv_t, ndiv_p = assign_procs(n_proc, nnode)\n", + " run_single_test(n_grid, n_sweep, ndiv_r, ndiv_t, ndiv_p, run_on_hpc=True)\n", + "\n", + "\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "./bench_fugaku/time_100-100-100_1-1-1-1.txt\n", + "./bench_fugaku/time_100-100-100_12-1-1-1.txt\n", + "./bench_fugaku/time_100-100-100_12-2-1-1.txt\n", + "./bench_fugaku/time_100-100-100_12-2-2-1.txt\n", + "./bench_fugaku/time_200-200-200_12-2-1-1.txt\n", + "./bench_fugaku/time_200-200-200_12-2-2-1.txt\n", + "./bench_fugaku/time_200-200-200_12-2-2-2.txt\n", + "./bench_fugaku/time_200-200-200_12-2-2-4.txt\n", + "./bench_fugaku/time_400-400-400_12-2-2-2.txt\n", + "./bench_fugaku/time_400-400-400_12-2-2-4.txt\n", + "./bench_fugaku/time_400-400-400_12-2-4-4.txt\n", + "./bench_fugaku/time_400-400-400_12-4-4-4.txt\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# read results from text_*.txt\n", + "import glob\n", + "\n", + "n_grids = [100, 200, 400]\n", + "\n", + "n_procs = [[1,12,24,48], # 1-4 nodes\n", + " [24,48,96,192], # 2-16 nodes\n", + " [96,192,384,768]] # 4-32 nodes\n", + "\n", + "# calculate required nodes for each grid and n_procs\n", + "n_nodes = [[1,1,2,4],\n", + " [2,4,8,16],\n", + " [8,16,32,64]]\n", + "\n", + "times = [[],[],[]]\n", + "spups = [[],[],[]]\n", + "\n", + "\n", + "path_dir = \"./bench_fugaku\"\n", + "for i, ngrid in enumerate(n_grids):\n", + " for j, nproc in enumerate(n_procs[i]):\n", + " nnode = n_nodes[i][j]\n", + " n_sweep, ndiv_r, ndiv_t, ndiv_p = assign_procs(nproc, nnode)\n", + " \n", + " fname = path_dir + \"/time_{0}-{0}-{0}_{1}-{2}-{3}-{4}.txt\".format(ngrid, n_sweep, ndiv_r, ndiv_t, ndiv_p)\n", + " print(fname)\n", + "\n", + " with open(fname, \"r\") as f:\n", + " lines = f.readlines()\n", + " line = lines[0]\n", + " n_iters = int(line.split(',')[0].split(' ')[-1])\n", + " l1 = float(line.split(',')[1].split(' ')[-1])\n", + " linf = float(line.split(',')[2].split(' ')[-1])\n", + " time = float(line.split(',')[3].split(' ')[-1])\n", + "\n", + " times[i].append(time)\n", + " spups[i].append(1/(times[i][-1]/(times[i][0]*n_procs[i][0])))\n", + "\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "fig, ax = plt.subplots(1, 1, figsize=(8, 6))\n", + "\n", + "markers = ['o', 's', 'v', 'd', 'p', 'h', 'x', 'D', 'H', '8', 'P', 'X', 'd', 'p', 'h', 'x', 'D', 'H', '8', 'P', 'X']\n", + "\n", + "# plot speed up\n", + "for i, ngrid in enumerate(n_grids):\n", + " #print(n_procs[i])\n", + " #print(times[i])\n", + " ntotal = ngrid**3\n", + " ax.plot(n_procs[i], spups[i], marker=markers[i], label=\"total grid points={0}\".format(ntotal))\n", + "\n", + "# log x \n", + "#ax.set_xscale('log')\n", + "# log y\n", + "#ax.set_yscale('log')\n", + "# y axis title speed up\n", + "ax.set_ylabel(\"Speed up\")\n", + "# x axis title number of processes\n", + "ax.set_xlabel(\"Number of processes\")\n", + "\n", + "nprocs_total = np.unique(np.array(n_procs).flatten())\n", + "#speedup_total = np.unique(np.array(spups).flatten())\n", + "# set ticks\n", + "ax.set_xticks(nprocs_total)\n", + "#ax.set_yticks(speedup_total)\n", + "\n", + "# write perfect scaling\n", + "ax.plot(nprocs_total, nprocs_total, linestyle='dashed', color='black', label=\"perfect scaling\")\n", + "# 90% perfect scaling\n", + "ax.plot(nprocs_total, nprocs_total*0.9, linestyle='dashed', color='gray', label=\"90% perfect scaling\")\n", + "# 80% perfect scaling\n", + "ax.plot(nprocs_total, nprocs_total*0.8, linestyle=':', color='gray', label=\"80% perfect scaling\")\n", + "\n", + "# legend\n", + "ax.legend()\n", + "\n", + "# title\n", + "ax.set_title(\"Benchmark result on A64FX (Fugaku)\")\n", + "\n", + "# save figure\n", + "fig.savefig(\"tomoatt_bench_fugaku.png\", dpi=300)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13 (main, Dec 4 2022, 14:57:02) \n[GCC 12.2.0]" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "1472887337ddd1717660a5ad84f7170e87aa3d39bd2f4b7d54c31e0901f516a9" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/solver_performance/speedup_200x200x200.png b/test/old_tests/solver_performance/speedup_200x200x200.png new file mode 100644 index 0000000..f60c1a1 Binary files /dev/null and b/test/old_tests/solver_performance/speedup_200x200x200.png differ diff --git a/test/old_tests/solver_performance/test_screenshot.png b/test/old_tests/solver_performance/test_screenshot.png new file mode 100644 index 0000000..fe78426 Binary files /dev/null and b/test/old_tests/solver_performance/test_screenshot.png differ diff --git a/test/old_tests/test_cg_smooth/check_pattern.ipynb b/test/old_tests/test_cg_smooth/check_pattern.ipynb new file mode 100644 index 0000000..aca098a --- /dev/null +++ b/test/old_tests/test_cg_smooth/check_pattern.ipynb @@ -0,0 +1,90 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "import numpy as np\n", + "\n", + "fname_in=\"./test_cg_smooth_0_in\"\n", + "fname_out=\"./test_cg_smooth_0_out\"\n", + "\n", + "nx=50\n", + "ny=50\n", + "nz=50\n", + "\n", + "# Read in the input file and convert to a 3D numpy array by genfromtxt\n", + "data_in = np.genfromtxt(fname_in, delimiter=' ', dtype=None)\n", + "data_in = data_in.reshape((nx,ny,nz))\n", + "\n", + "# Read in the output file and convert to a 3D numpy array by genfromtxt\n", + "data_out = np.genfromtxt(fname_out, delimiter=' ', dtype=None)\n", + "data_out = data_out.reshape((nx,ny,nz))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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15CbXMVMFgAAAAA4iEEWAAAAADgoySbuAKAdpMhb/5smWQUnAIABuclVzGQBAAAAgIMYZAEAAACAg7w0iQgAnRMVnAAAXkNuchUzWQAAAADgIAZZAAAAAOCgJJu4A4B2kCJvVU3yUl8AAO4gN7mKmSwAAAAAcBCDLAAAAABwEMsFASBRVHACAHgNuclVzGQBAAAAgIMYZAEAAACAg5Js4g4A2gFLMgAAXkNuchUzWQAAAADgIAZZAAAAAOCgJJu4A4B20E3euskifz4DAJCbXJVkuwsAAAAA7YtBFgAAAAA4iOWCAJAoKjgBALyG3OQqZrLgiocfflg+n0+vvPKK213RsWPHtGTJEr344otudwUA0EH+9re/6Utf+pI+8YlPyO/3Kz8/XzfddJP+9re/nfY2v/Od72jDhg3OdfIk/vjHP2rJkiWqq6vrkPcDEB8GWUh6x44d0z333MMgCwCSxPr163XBBRdo06ZNuvnmm/XQQw9p+vTp+v3vf68LLrhATz/99Gltt6MHWffccw+DLMCjkmziDgDaAUsygE5j7969+vKXv6wzzzxTL730kvr16xd57o477tBnPvMZffnLX9bOnTt15plnuthTIEHkJlcxkwVPmDp1qnr27Km33npLEydOVM+ePdWvXz99/etfVygUirTbv3+/fD6f7r//fj344IMaNGiQMjIydOmll2rXrl1R2xw7dqzGjh1rfK/CwsLI9j5MsPfcc498Pp98Pp+WLFnSXrsKAHDR9773PR07dkw/+clPogZYktS3b1/9+Mc/VkNDg5YvXy4pOmd83JIlS+Tz+SI/+3w+NTQ06JFHHonkkqlTp0a1ff311/X5z39eWVlZys7O1h133KHGxsbINj7McQ8//HDM+308Ny1ZskTf+MY3JElFRUWR99u/f//pHxgAjkqyMSW8LBQKady4cSopKdH999+vyspKff/731dxcbFuvfXWqLaPPvqojhw5otmzZ6uxsVE/+MEPdNlll+nVV19VTk5Om9+zX79+Wr16tW699VZdd911uv766yVJI0aMcHTfAADe8Oyzz6qwsFCf+cxnjM9fcsklKiws1G9/+9u4tvvzn/9ct9xyiz71qU9p5syZkqTi4uKoNp///OdVWFio8vJyvfzyy1q5cqX+9a9/6dFHH43rva6//nq98cYbeuKJJ/Tggw+qb9++khQzaATgHgZZ8IzGxkZ94Qtf0N133y1JmjVrli644AKtXbs2ZpC1Z88e7d69W5/4xCckSVdddZVKSkr03e9+Vw888ECb37NHjx76v//3/+rWW2/ViBEj9KUvfcm5HULySJG3bvjopb4AHlJfX6/q6mpNmDDhpO1GjBihZ555RkeOHGnztr/0pS9p1qxZOvPMM625pKioSL/+9a8lSbNnz1ZWVpYeeughff3rX4/rj3sjRozQBRdcoCeeeEITJ040zrQB5CZ3sVwQnjJr1qyonz/zmc/oH//4R0y7iRMnRgZYkvSpT31KJSUl+q//+q927yMAoHP6cNDUq1evk7b78PlgMOjo+8+ePTvq59tvv12SyF1AF8QgC56Rnp4es9ThjDPO0L/+9a+YtoMHD46JffKTn2Q9OgDA6sPB06lmqNo6GIvXibmruLhY3bp1I3cBXRDLBeEZKSnOziP7fD6Fw+GY+McLaQCOoIIT0CkEAgHl5eVp586dJ223c+dOfeITn1BWVlZUcYuPcyKXnLjt9nwvJCFyk6uYyUKntHv37pjYG2+8EbUu/YwzzjDeP+TAgQNRP9uSGgCg6/nc5z6nffv26Q9/+IPx+f/5n//R/v379bnPfU5S23OJdOp8cmLu2rNnj1pbWyO564wzzpCkmPc7nfcC4C4GWeiUNmzYoLfeeivy85/+9Cdt3bpV48ePj8SKi4v1+uuv65///Gck9te//lX/+7//G7WtzMxMSbFJDQDQ9XzjG99QRkaGvvrVr+rdd9+Neu69997TrFmzlJmZGSmRXlxcrPr6+qjZr7ffftt4w+IePXqcNJesWrUq6ucf/vCHkhTJXVlZWerbt69eeumlqHYPPfSQ8b0kchfgVUk2cYeu4qyzztKYMWN06623qqmpSStWrFB2drbmz58faTNt2jQ98MADGjdunKZPn6533nlHa9as0bnnnhv1ZeaMjAwNHTpUv/jFL/TJT35Sffr00bBhwzRs2DA3dg2dUYq89b9pklVwAuIxePBgPfLII7rppps0fPhwTZ8+XUVFRdq/f7/Wrl2rw4cP64knnoiUX588ebLuuusuXXfddfra176mY8eOafXq1frkJz+pP//5z1HbHjVqlCorK/XAAw8oPz9fRUVFKikpiTy/b98+/Z//83901VVXacuWLXrsscd044036rzzzou0ueWWW7Rs2TLd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q6SkRH/605/c7tJpeemll3TttdcqPz9fPp9PGzZsiHo+HA5r0aJFysvLU0ZGhsrKyrR79253OnsaysvLdeGFF6pXr17q37+/Jk6cqKqqqqg2jY2Nmj17trKzs9WzZ09NmjRJtbW1LvU4fqtXr9aIESMid5cvLS3V7373u8jznX3/TrRs2TL5fD7NmTMnEutq+wicjq6SlyRyk9S5/18jL3W9fUTX4tlB1i9+8QvNmzdPixcv1p///Gedd955GjdunN555x23uxa3hoYGnXfeeVq1apXx+eXLl2vlypVas2aNtm7dqh49emjcuHFqbGzs4J6ens2bN2v27Nl6+eWX9fzzz+v48eO68sor1dDQEGkzd+5cPfvss3rqqae0efNmVVdX6/rrr3ex1/EZMGCAli1bpu3bt+uVV17RZZddpgkTJuhvf/ubpM6/fx+3bds2/fjHP9aIESOi4l1pHx3X4sEHHNeV8pJEbpI69/9r5KWutY/twu08lOy5KexRn/rUp8KzZ8+O/BwKhcL5+fnh8vJyF3uVOEnhp59+OvJza2trODc3N/y9730vEqurqwv7/f7wE0884UIPE/fOO++EJYU3b94cDoc/2J/u3buHn3rqqUibv//972FJ4S1btrjVzYSdccYZ4Z/97Gddav+OHDkSHjx4cPj5558PX3rppeE77rgjHA533XOYqPr6+rCksJ6oD+vXYe88nvigX/X19W4foi6lq+alcJjc9KHO/v8aealz7qPTyE3e4MmZrObmZm3fvl1lZWWRWLdu3VRWVqYtW7a42DPn7du3TzU1NVH7GggEVFJS0mn3tb6+XpLUp08fSdL27dt1/PjxqH0cMmSIBg4c2Cn3MRQK6cknn1RDQ4NKS0u71P7Nnj1b11xzTdS+SF3vHALxSqa8JJGbOts+kpc+0Fn3EV2TJ6sLHj58WKFQSDk5OVHxnJwcvf766y71qn3U1NRIknFfP3yuM2ltbdWcOXN08cUXa9iwYZI+2Me0tDT17t07qm1n28dXX31VpaWlamxsVM+ePfX0009r6NCh2rFjR5fYvyeffFJ//vOftW3btpjnuso5bDdeWwbhpb50EcmUlyRyU2fZR/JS59/HdkVucpUnB1novGbPnq1du3bpD3/4g9tdcdzZZ5+tHTt2qL6+Xr/85S81ZcoUbd682e1uOeLQoUO644479Pzz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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#plot\n", + "import matplotlib.pyplot as plt\n", + "\n", + "plt.figure(figsize=(10,10))\n", + "plt.subplot(1,2,1)\n", + "plt.imshow(data_in[:,25,:], origin='lower', cmap='jet')\n", + "plt.colorbar()\n", + "plt.title('Input')\n", + "plt.subplot(1,2,2)\n", + "plt.imshow(data_out[:,25,:], origin='lower', cmap='jet')\n", + "plt.colorbar()\n", + "plt.title('Output')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/test_cg_smooth/smooth_test.h b/test/old_tests/test_cg_smooth/smooth_test.h new file mode 100644 index 0000000..7828f12 --- /dev/null +++ b/test/old_tests/test_cg_smooth/smooth_test.h @@ -0,0 +1,200 @@ +#ifndef SMOOTH_H +#define SMOOTH_H + +#include +#include "../../include/config.h" +#include "../../include/utils.h" + + +void calc_inversed_laplacian(CUSTOMREAL* d, CUSTOMREAL* Ap, + const int i, const int j, const int k, + const CUSTOMREAL lr, const CUSTOMREAL lt, const CUSTOMREAL lp, + const CUSTOMREAL dr, const CUSTOMREAL dt, const CUSTOMREAL dp) { + // calculate inversed laplacian operator + CUSTOMREAL termx = _0_CR, termy = _0_CR, termz = _0_CR; + + if (i==0) { + termx = dp*lp/3.0 * (1/(lp*dp)*(d[I2V(i,j,k)]) - lp/(dp*dp*dp)*(-2.0*d[I2V(i,j,k)]+2*d[I2V(i+1,j,k)])); + } else if (i==loc_I-1) { + termx = dp*lp/3.0 * (1/(lp*dp)*(d[I2V(i,j,k)]) - lp/(dp*dp*dp)*(-2.0*d[I2V(i,j,k)]+2*d[I2V(i-1,j,k)])); + } else { + termx = dp*lp/3.0 * (1/(lp*dp)*(d[I2V(i,j,k)]) - lp/(dp*dp*dp)*(-2.0*d[I2V(i,j,k)]+d[I2V(i-1,j,k)]+d[I2V(i+1,j,k)])); + } + + if (j==0) { + termy = dt*lt/3.0 * (1/(lt*dt)*(d[I2V(i,j,k)]) - lt/(dt*dt*dt)*(-2.0*d[I2V(i,j,k)]+2*d[I2V(i,j+1,k)])); + } else if (j==loc_J-1) { + termy = dt*lt/3.0 * (1/(lt*dt)*(d[I2V(i,j,k)]) - lt/(dt*dt*dt)*(-2.0*d[I2V(i,j,k)]+2*d[I2V(i,j-1,k)])); + } else { + termy = dt*lt/3.0 * (1/(lt*dt)*(d[I2V(i,j,k)]) - lt/(dt*dt*dt)*(-2.0*d[I2V(i,j,k)]+d[I2V(i,j-1,k)]+d[I2V(i,j+1,k)])); + } + + if (k==0) { + termz = dr*lr/3.0 * (1/(lr*dr)*(d[I2V(i,j,k)]) - lr/(dr*dr*dr)*(-2.0*d[I2V(i,j,k)]+2*d[I2V(i,j,k+1)])); + } else if (k==loc_K-1) { + termz = dr*lr/3.0 * (1/(lr*dr)*(d[I2V(i,j,k)]) - lr/(dr*dr*dr)*(-2.0*d[I2V(i,j,k)]+2*d[I2V(i,j,k-1)])); + } else { + termz = dr*lr/3.0 * (1/(lr*dr)*(d[I2V(i,j,k)]) - lr/(dr*dr*dr)*(-2.0*d[I2V(i,j,k)]+d[I2V(i,j,k-1)]+d[I2V(i,j,k+1)])); + } + + Ap[I2V(i,j,k)] = termx+termy+termz; +} + + +void CG_smooth(CUSTOMREAL* arr_in, CUSTOMREAL* arr_out, CUSTOMREAL lr, CUSTOMREAL lt, CUSTOMREAL lp) { + // arr: array to be smoothed + // lr: smooth length on r + // lt: smooth length on theta + // lp: smooth length on phi + + // arrays : + // x_array model + // g_array gradient + // d_array descent direction + // Ap stiffness scalar (laplacian) + // pAp = d_array*Ap + // rr = g_array * g_array (dot product) + + const int max_iter_cg = 1000; + const CUSTOMREAL xtol = 0.001; + const bool use_scaling = true; + + CUSTOMREAL dr=1, dt=100, dp=100; + + // allocate memory + CUSTOMREAL* x_array = new CUSTOMREAL[loc_I*loc_J*loc_K]; + CUSTOMREAL* r_array = new CUSTOMREAL[loc_I*loc_J*loc_K]; + CUSTOMREAL* p_array = new CUSTOMREAL[loc_I*loc_J*loc_K]; + CUSTOMREAL* Ap = new CUSTOMREAL[loc_I*loc_J*loc_K]; + CUSTOMREAL pAp=_0_CR, rr_0=_0_CR, rr=_0_CR, rr_new=_0_CR, aa=_0_CR, bb=_0_CR, tmp=_0_CR; + + CUSTOMREAL scaling_A=_1_CR, scaling_coeff = _1_CR; + + if (use_scaling) { + // calculate scaling factor + //scaling_A = std::sqrt(_1_CR / (_8_CR * PI * lr * lt * lp)); + // scaling coefficient for gradient + scaling_coeff = find_absmax(arr_in, loc_I*loc_J*loc_K); + //tmp = scaling_coeff; + //allreduce_cr_single_max(tmp, scaling_coeff); + //if (scaling_coeff == _0_CR) + if (isZero(scaling_coeff)) + scaling_coeff = _1_CR; + } + // std out scaling factors + //if (myrank == 0) { + std::cout << "scaling_A = " << scaling_A << std::endl; + std::cout << "scaling_coeff = " << scaling_coeff << std::endl; + //} + + + // array initialization + for (int i=0; i +#include "smooth_test.h" +#include "../../include/config.h" + + +void out_file(CUSTOMREAL* arr, std::string fname){ + // output initial and final grid in file + std::ofstream out_file; + out_file.open(fname); + for (int k=0; k" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgcAAAGzCAYAAAC7ErTFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAABG9klEQVR4nO3de3hU1b3/8c/MZGYSkIRLIQEJGG9cFJCCImLrjZZa8fHCUUuxUou2tXgB6tPT9CcFaQvaVkXPQRCLUNuD8UrVnipFKlCPIIrlPKIVL2CJyMUbBAJJJrP37w81x5FkfWeycxvyfj3PPDqz9tp7zZ49w8pa+7u+Id/3fQEAAHwq3NoNAAAAbQudAwAAkILOAQAASEHnAAAApKBzAAAAUtA5AAAAKegcAACAFHQOAABACjoHAAAgBZ0DoJWsWrVKoVBIq1atau2mAEAKOgdAFnnttdc0c+ZMvfPOO63dFACHMToHQBZ57bXXdPPNN9M5ANCs6BwAhynf93Xw4MHWbgaALETnAEjTI488olAopNWrVx9Sds899ygUCmnTpk2SpNdff13/9m//pq5duyo3N1fDhw/XE088Eej4S5Ys0SWXXCJJOuussxQKhVLuWTjqqKM0duxYLV++XMOHD1deXp7uuecevfPOOwqFQlqyZMkh+wyFQpo5c2bKa9u3b9f3vvc9FRYWKh6P64QTTtB9990XqO0AsktOazcAyBbnnXeejjjiCD300EM644wzUsoefPBBnXDCCTrxxBP16quvatSoUTryyCP105/+VB07dtRDDz2kCy+8UI8++qguuuiiRh3/q1/9qq6//nrddddd+tnPfqYBAwZIUt1/JWnz5s0aP368fvCDH+jqq69Wv379MjrGrl27dOqppyoUCunaa69V9+7d9dRTT2nSpEmqqKjQlClTGtV2AFnGB5C28ePH+z169PBra2vrXtuxY4cfDof9WbNm+b7v++ecc44/aNAgv6qqqm4bz/P80047zT/uuOPqXnv22Wd9Sf6zzz6b9vEffvjhBuv07dvXl+Q//fTTKa9v3brVl+QvXrz4kDqS/BkzZtQ9nzRpkt+zZ0//gw8+SNnuW9/6ll9QUOAfOHAg7bYCyF5MKwAZuOyyy7R79+6U8MNHHnlEnufpsssu00cffaS//e1vuvTSS7Vv3z598MEH+uCDD/Thhx9qzJgxevPNN7V9+/Zma19JSYnGjBnTqLq+7+vRRx/V+eefL9/369r+wQcfaMyYMdq7d69efvnlJm4xgLaIaQUgA9/4xjdUUFCgBx98UOecc46kT6YUTjrpJB1//PFav369fN/X9OnTNX369Hr3sXv3bh155JHN0r6SkpJG133//fe1Z88eLVy4UAsXLqx3m927dzd6/wCyB50DIAPxeFwXXnihli1bprvvvlu7du3S//zP/2j27NmSJM/zJEk33nhjg3/BH3vssc3Wvry8vENeC4VC9W6bTCZTnn/W9ssvv1wTJ06st87gwYMDthBANqBzAGTosssu0+9//3utXLlS//znP+X7vi677DJJ0tFHHy1JikajGj16dJMfu6F/6F26dOkiSdqzZ0/K6//6179Snnfv3l2dOnVSMplslrYDyB7ccwBkaPTo0eratasefPBBPfjggzrllFPqhvN79OihM888U/fcc4927NhxSN33338/0LE7duwo6dB/6F3y8/P1pS99SWvWrEl5/e677055HolENG7cOD366KN1IZmfF7TtALIHIwdAhqLRqC6++GKVlZWpsrJSv/3tb1PK582bp9NPP12DBg3S1VdfraOPPlq7du3S2rVr9e677+p///d/G33sk046SZFIRLfeeqv27t2reDyus88+Wz169HDWu+qqq3TLLbfoqquu0vDhw7VmzRq98cYbh2x3yy236Nlnn9WIESN09dVXa+DAgfroo4/08ssv65lnntFHH33U6LYDyCKtGywBZKcVK1b4kvxQKOSXl5cfUv7222/7V1xxhV9UVORHo1H/yCOP9MeOHes/8sgjdds0JpTR933/3nvv9Y8++mg/Eomk1O/bt69/3nnn1VvnwIED/qRJk/yCggK/U6dO/qWXXurv3r37kFBG3/f9Xbt2+ZMnT/aLi4v9aDTqFxUV+eecc46/cOHCjNoJIHuFfN/3W7d7AgAA2hLuOQAAACm45wBoAw4ePKi9e/c6t+natatisVgLtQhAe0bnAGgDHnzwQV155ZXObZ599lmdeeaZLdMgAO0a9xwAbcCOHTv06quvOrcZNmxY3ZoFANCc6BwAAIAU3JAIAABStLl7DjzP03vvvadOnTo1aqlYAED74fu+9u3bp169eikcbr6/d6uqqlRTUxN4P7FYTLm5uU3QoubV5joH7733noqLi1u7GQCA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6bnPX7Xj/Nd47uu+1mib52XPX7StqT3dkEjnAACANLSnew6YVgAAACkYOQAAIA1MKwAAgBTtaVqBzgEAAGnwA44cZFPngHsOAABACkYOAABIgy87+6lVP1vQOahPyP0RWimXrVh4z7GOgSQlow3vIBwz1gnINdYJsNYhsFIa19a6y61vjpFy2VrHQHH3+/Nz3fW9uPuS9xznXrI/O3ONi2ZN2WxcV0ase1Wt+9wdTLrL9ybznOV7wh2c5eY6BoaqsPvajAZMuVzlu6/dPcY6Bns89/vf57nP375kboNl1mdjffbmcHcWDYc3J08hhVghEQAAtEeMHAAAkAaiFQAAQArPDynUTtY5YFoBAIA2avv27br88svVrVs35eXladCgQXrppZca3H7Hjh369re/reOPP17hcFhTpkxp1HHpHAAAkAbfD/7IxMcff6xRo0YpGo3qqaee0muvvabbbrtNXbp0abBOdXW1unfvrptuuklDhgxp9HtlWgEAgDS09D0Ht956q4qLi7V48eK610pKSpx1jjrqKN15552SpPvuuy/zRn6KzkE9zKged0STjOypSkbdB/DiDQ/oeHnunYc8d9c0bIUqGimPQ7XucDCza2yFgVopl61QxQ7uUMdkrvvD8+JWmKnx2QUMdQySstlKu5uodb/3g0Yo477ahkPpJOnjREdneW7ICIM1VEXc7evgu1M+R4xgxaQxkGqlrLZCET9MHuEs/7jWff5c5/9Arfu6r0m6P/tk0vrRcxcjMxUVFSnP4/G44vFDQ2GfeOIJjRkzRpdccolWr16tI488Uj/60Y909dVXN3sbmVYAACANn40cBHlIUnFxsQoKCuoec+bMqfd4W7Zs0fz583Xcccdp+fLluuaaa3T99dfr97//fbO/V0YOAABIQ1NFK5SXlys/P7/u9fpGDSTJ8zwNHz5cs2fPliQNHTpUmzZt0oIFCzRx4sRGtyMdjBwAAJCGprohMT8/P+XRUOegZ8+eGjhwYMprAwYM0LZt25r7rdI5AACgLRo1apQ2b96c8tobb7yhvn37NvuxmVYAACANn/z1HyRaIbPtp06dqtNOO02zZ8/WpZdeqvXr12vhwoVauHBh3TalpaXavn277r///rrXNm7cKEnav3+/3n//fW3cuFGxWOyQUQgXOgcAAKShpUMZTz75ZC1btkylpaWaNWuWSkpK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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# final model\n", + "fpath_final_model = './OUTPUT_FILES/final_model.h5'\n", + "fpath_true_model = \"./test_model_true.h5\"\n", + "\n", + "import h5py\n", + "\n", + "# read vel, xi, eta dataset \n", + "with h5py.File(fpath_final_model, 'r') as f:\n", + " vel = f['vel'][:]\n", + " xi = f['xi'][:]\n", + " eta = f['eta'][:]\n", + " #zeta = f['zeta'][:]\n", + "\n", + "# read true model\n", + "with h5py.File(fpath_true_model, 'r') as f:\n", + " vel_true = f['vel'][:]\n", + " xi_true = f['xi'][:]\n", + " eta_true = f['eta'][:]\n", + " #zeta_true = f['zeta'][:]\n", + "# plot\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "# plot vel\n", + "plt.figure()\n", + "plt.imshow(vel[5,:,:], origin='lower', aspect='auto')\n", + "plt.colorbar()\n", + "plt.title('vel')\n", + "\n", + "# plot xi\n", + "#plt.figure()\n", + "#plt.imshow(xi[:,:,10], origin='lower', aspect='auto')\n", + "#plt.colorbar()\n", + "#plt.title('xi')\n", + "#\n", + "## plot eta\n", + "#plt.figure()\n", + "#plt.imshow(eta[:,:,10], origin='lower', aspect='auto')\n", + "#plt.colorbar()\n", + "#plt.title('eta')\n", + "\n", + "# plot vel_true\n", + "plt.figure()\n", + "plt.imshow(vel_true[5,:,:], origin='lower', aspect='auto')\n", + "plt.colorbar()\n", + "plt.title('vel_true')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + }, + "vscode": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/update_input_file/convert_param_file_2to3.py b/test/old_tests/update_input_file/convert_param_file_2to3.py new file mode 100644 index 0000000..51a82d6 --- /dev/null +++ b/test/old_tests/update_input_file/convert_param_file_2to3.py @@ -0,0 +1,181 @@ +import argparse +from ruamel.yaml import YAML +from contextlib import suppress + +def map_value_to_bool(params_in, target_key, orig_key=None): + """ + Map an integer value to a boolean and update the target key in params_in. + + Parameters: + params_in (dict): The input dictionary. + target_key (str): The key whose value needs to be mapped to a boolean. + + Returns: + None + """ + if orig_key is None: + orig_key = target_key + print('key name {} is changed to {}'.format(orig_key, target_key)) + + value = params_in.get(orig_key, None) + if value is not None: + params_in[target_key] = bool(value) + print('value {} type is changed from int to bool'.format(target_key)) + + # remove the old key + if orig_key != target_key: + params_in.pop(orig_key, None) + + +def move_value(params_out, params_in): + try: + params_out = params_in + except KeyError: + print('Cannot move value from {} to {}'.format(params_in, params_out)) + + +if __name__ == '__main__': + # parse the argument for the input file + parser = argparse.ArgumentParser(description='Convert a parameter file from version 2 to version 3') + parser.add_argument('-i', '--input', help='Input file name', required=True) + + args = parser.parse_args() + infile = args.input + + # path to the v3 model file + v3_model_file = './params_model_v3.yaml' + + yaml = YAML() + + # read the input file + try: + with open(infile, 'r') as f: + str_in = f.read() + params_in = yaml.load(str_in) + + except IOError: + raise ValueError('Cannot read the input file') + + # read the v3 model file + try: + with open(v3_model_file, 'r') as f: + str_v3 = f.read() + params_v3 = yaml.load(str_v3) + except IOError: + raise ValueError('Cannot read the v3 model file') + + # check the version of the input file + if params_in['version'] != 2: + raise ValueError('The input file is not version 2') + + # change version to 3 + params_v3['version'] = 3 + + # copy the values in the input file to the output file + # + # domain section + # + params_v3['domain'] = params_in['domain'] + + # + # source section + # + params_v3['source'] = params_in['source'] + map_value_to_bool(params_v3['source'], 'swap_src_rec') + + # + # model section + # + params_v3['model'] = params_in['model'] + + # + # parallel section + # + params_v3['parallel'] = params_in['parallel'] + + # change parallel->use_gpu from 0,1 to false,true + map_value_to_bool(params_v3['parallel'], 'use_gpu') + + # + # output_setting section + # + move_value(params_v3['output_setting']['output_dir'],params_in['inversion']['output_dir']) + + map_value_to_bool(params_v3['output_setting'], 'output_source_field', 'is_output_source_field') + map_value_to_bool(params_v3['output_setting'], 'output_model_dat', 'is_output_model_dat') + map_value_to_bool(params_v3['output_setting'], 'output_final_model', 'is_output_final_model') + map_value_to_bool(params_v3['output_setting'], 'output_in_process', 'is_output_in_process') + map_value_to_bool(params_v3['output_setting'], 'single_precision_output', 'is_single_precision_output') + + # remove the old key 'output_setting'->'is_verbose_output' + params_v3['output_setting'].pop('is_verbose_output', None) + + move_value(params_v3['output_setting']['output_file_format'], params_in['calculation']['output_file_format']) + + # + # run_mode section + # + move_value(params_v3['run_mode'], params_in['inversion']['run_mode']) + + # + # model_update section + # + move_value(params_v3['model_update']['max_iterations'], params_in['inversion']['max_iterations_inv']) + move_value(params_v3['model_update']['optim_method'], params_in['inversion']['optim_method']) + move_value(params_v3['model_update']['step_length'], params_in['inversion']['step_size']) + move_value(params_v3['model_update']['optim_method_0']['step_length_decay'], params_in['inversion']['step_size_decay']) + move_value(params_v3['model_update']['optim_method_0']['step_length_sc'], params_in['inversion']['step_size_sc']) + move_value(params_v3['model_update']['optim_method_1_2']['max_sub_iterations'], params_in['inversion']['max_sub_iterations']) + move_value(params_v3['model_update']['optim_method_1_2']['regularization_weight'], params_in['inversion']['regularization_weight']) + move_value(params_v3['model_update']['smoothing']['smooth_method'], params_in['inversion']['smooth_method']) + move_value(params_v3['model_update']['smoothing']['l_smooth_rtp'], params_in['inversion']['l_smooth_rtp']) + move_value(params_v3['model_update']['n_inversion_grid'], params_in['inversion']['n_inversion_grid']) + with suppress(KeyError) : move_value(params_v3['model_update']['type_invgrid_dep'], params_in['inversion']['type_dep_inv']) + with suppress(KeyError) : move_value(params_v3['model_update']['type_invgrid_lat'], params_in['inversion']['type_lat_inv']) + with suppress(KeyError) : move_value(params_v3['model_update']['type_invgrid_lon'], params_in['inversion']['type_lon_inv']) + with suppress(KeyError) : move_value(params_v3['model_update']['n_inv_dep_lat_lon'], params_in['inversion']['n_inv_dep_lat_lon']) + with suppress(KeyError) : move_value(params_v3['model_update']['min_max_dep_inv'], params_in['inversion']['min_max_dep_inv']) + with suppress(KeyError) : move_value(params_v3['model_update']['min_max_lat_inv'], params_in['inversion']['min_max_lat_inv']) + with suppress(KeyError) : move_value(params_v3['model_update']['min_max_lon_inv'], params_in['inversion']['min_max_lon_inv']) + with suppress(KeyError) : move_value(params_v3['model_update']['dep_inv'], params_in['inversion']['dep_inv']) + with suppress(KeyError) : move_value(params_v3['model_update']['lat_inv'], params_in['inversion']['lat_inv']) + with suppress(KeyError) : move_value(params_v3['model_update']['lon_inv'], params_in['inversion']['lon_inv']) + with suppress(KeyError) : move_value(params_v3['model_update']['sta_correction_file'], params_in['inversion']['sta_correction_file']) + with suppress(KeyError) : move_value(params_v3['model_update']['update_slowness'], params_in['inv_strategy']['is_inv_slowness']) + with suppress(KeyError) : move_value(params_v3['model_update']['update_azi_ani'], params_in['inv_strategy']['is_inv_azi_ani']) + with suppress(KeyError) : move_value(params_v3['model_update']['update_rad_ani'], params_in['inv_strategy']['is_inv_rad_ani']) + map_value_to_bool(params_v3['model_update'], 'update_slowness') + map_value_to_bool(params_v3['model_update'], 'update_azi_ani') + map_value_to_bool(params_v3['model_update'], 'update_rad_ani') + + with suppress(KeyError) : move_value(params_v3['model_update']['depth_taper'], params_in['inv_strategy']['kernel_taper']) + with suppress(KeyError) : move_value(params_v3['model_update']['use_sta_correction'], params_in['inv_strategy']['is_sta_correction']) + map_value_to_bool(params_v3['model_update'], 'use_sta_correction') + + + # + # relocation section + # + # replocation section is completely new in v3, so we don't need to move any value + + # + # inversion_strategy section + # + # inversion_strategy section is completely new in v3, so we don't need to move any value + + # + # calculation section + # + move_value(params_v3['calculation'], params_in['calculation']) + + + # write the output file with adding .v3 to the file name + outfile = infile + '.v3.yaml' + with open(outfile, 'w') as f: + yaml.dump(params_v3, f) + + + + + + diff --git a/test/old_tests/update_input_file/data_post_process.py b/test/old_tests/update_input_file/data_post_process.py new file mode 100644 index 0000000..c267e47 --- /dev/null +++ b/test/old_tests/update_input_file/data_post_process.py @@ -0,0 +1,71 @@ +# This script shows how to recompose the output data for further analysis +# As the result data is collectively written out by each process, the data is composed on subgrid basis. +# the data needs to be reindexed and reassembled to a global grid. + +import numpy as np +import sys + +sys.path.append("../../utils/") +from tomoatt_data_retrieval import get_data_from_h5 + + +# +# plot calculated travel time field + +# number of grids +nx = 50 +ny = 50 +nz = 10 + +# number of subgrid +ndiv_x = 2 +ndiv_y = 2 +ndiv_z = 1 + +# read data +_src_id = 0 +_inv_id = 0 + +# filling 0 for digit +inv_id = str(_inv_id).zfill(4) +src_id = str(_src_id).zfill(4) + +# file name +#fname_data = "OUTPUT_FILES/T_res_inv_{}_src_{}.dat".format(inv_id, src_id) +fname_data = "OUTPUT_FILES/out_data_sim_{}.h5".format(_src_id) +# path for grid data +fname_grid = "OUTPUT_FILES/out_data_grid.h5" +# name dataset to be read +dataset_name = "/Data/fun_inv_{}".format(inv_id) + +data, r, t, p = get_data_from_h5(fname_data, fname_grid, dataset_name, nz, ny, nx, ndiv_z, ndiv_y, ndiv_x, verbose=True) + +# plot +import matplotlib.pyplot as plt + +fig, axs = plt.subplots(3, 1, figsize=(15, 5)) + +#axs[0].imshow(data[5,:,:], cmap='jet', interpolation='bilinear') +ir_slice=5 +axs[0].pcolormesh(p[ir_slice,0,:], t[ir_slice,:,0], data[ir_slice,:,:], shading='auto') +axs[0].set_title('lon-lat') +axs[0].set_xlabel('longitude') +axs[0].set_ylabel('latitude') +axs[0].set_aspect(1) + +it_slice=15 +axs[1].pcolormesh(p[0,it_slice,:], r[:,it_slice,0], data[:,it_slice,:], shading='auto') +axs[1].set_title('r-lon') +axs[1].set_xlabel('longitude') +axs[1].set_ylabel('latitude') +axs[1].set_aspect(10) + +ip_slice=15 +axs[2].pcolormesh(t[0,:,ip_slice], r[:,0,ip_slice], data[:,:,ip_slice], shading='auto') +axs[2].set_title('r-lat') +axs[2].set_xlabel('longitude') +axs[2].set_ylabel('latitude') +axs[2].set_aspect(10) + +plt.tight_layout() +plt.show() \ No newline at end of file diff --git a/test/old_tests/update_input_file/input_params.yml b/test/old_tests/update_input_file/input_params.yml new file mode 100644 index 0000000..d7bb5a3 --- /dev/null +++ b/test/old_tests/update_input_file/input_params.yml @@ -0,0 +1,49 @@ +version : 2 + +domain : + min_max_dep : [-10.0, 10.0] # depth in km + min_max_lat : [37.7,42.3] # latitude in degree + min_max_lon : [22.7,27.3] # longitude in degree + n_rtp : [10,50,50] # number of nodes + +source : + src_rec_file : 'OUTPUT_FILES/src_rec_file_forward.dat' # source receiver file (if found, src_dep_lat_lon is ignored) + swap_src_rec : 1 # swap source and receiver (1: yes, 0: no) + +model : + init_model_path : './test_model_init.h5' # path to initial model file (ignored if init_model_type is '1d_*') + +inversion : + run_mode : 1 # 0 for forward simulation only, 1 for inversion + optim_method : 1 # optimization method. 0 : "grad_descent", 1 : "halve-stepping", 2 : "lbfgs", + max_iterations_inv : 3 # maximum number of inversion iterations + step_size : 0.001 # step size for inversion + + # parameters for multiparametric inversion + n_inversion_grid : 5 # number of inversion grid sets + n_inv_dep_lat_lon : [5,10,10] # number of the base inversion grid points + min_max_dep_inv : [-10.0, 10.0] # depth in km with R = 6371.0 + min_max_lat_inv : [37.7,42.3] # latitude in degree + min_max_lon_inv : [22.7,27.3] # longitude in degree + + # parameter for halving-stepping or lbfgs + max_sub_iterations : 10 # maximum number of sub-iterations + regularization_weight : 100.0 # regularization weight + #l_smooth_rtp : [10,10,10] # + +parallel : + n_sims : 1 # number of simultaneous run + ndiv_rtp : [1,1,1] # number of subdomains + nproc_sub : 2 # number of subprocess used for each subdomain + +calculation : + convergence_tolerance : 1e-4 + max_iterations : 500 + stencil_order : 3 # 1 or 3 + sweep_type : 1 # 0: legacy, 1: cuthill-mckee with shm parallelization + +output_setting : + is_output_source_field : 0 # output the calculated field of all sources 1 for yes; 0 for no; default: 1 + is_verbose_output : 0 # output internal parameters, if no, only model parameters are out. 1 for yes; 0 for no; default: 0 + is_output_model_dat : 0 # output model_parameters_inv_0000.dat or not. 1 for yes; 0 for no; default: 1 + diff --git a/test/old_tests/update_input_file/input_params_flexible_inv_grid.yml b/test/old_tests/update_input_file/input_params_flexible_inv_grid.yml new file mode 100644 index 0000000..6dc3a6b --- /dev/null +++ b/test/old_tests/update_input_file/input_params_flexible_inv_grid.yml @@ -0,0 +1,56 @@ +version : 2 + +domain : + min_max_dep : [-10.0, 10.0] # depth in km + min_max_lat : [37.7,42.3] # latitude in degree + min_max_lon : [22.7,27.3] # longitude in degree + n_rtp : [10,50,50] # number of nodes + +source : + src_rec_file : 'OUTPUT_FILES/src_rec_file_forward.dat' # source receiver file (if found, src_dep_lat_lon is ignored) + swap_src_rec : 1 # swap source and receiver (1: yes, 0: no) + +model : + init_model_path : './test_model_init.h5' # path to initial model file (ignored if init_model_type is '1d_*') + +inversion : + run_mode : 1 # 0 for forward simulation only, 1 for inversion + max_iterations_inv : 20 # maximum number of inversion iterations + step_size : 0.03 # step size for inversion + step_size_decay : 0.7 # if objective function increase, step size -> step size * step_size_decay. default: 0.9 + + #output_dir : './OUTPUT_FILES_inversion_asc' # default: "./OUTPUT_FILES/" + + # parameters for multiparametric inversion + n_inversion_grid : 5 # number of inversion grid sets + n_inv_dep_lat_lon : [5,10,10] # number of the base inversion grid points + min_max_dep_inv : [-10.0, 10.0] # depth in km with R = 6371.0 + min_max_lat_inv : [37.7,42.3] # latitude in degree + min_max_lon_inv : [22.7,27.3] # longitude in degree + + + type_dep_inv : 1 # 0: uniform inversion grid (above), 1: flexible grid, manually designed (following) + dep_inv : [-15,-10,-5,0,5,10,15] + type_lat_inv : 0 # 0: uniform inversion grid (above), 1: flexible grid, manually designed (following) + lat_inv : [] + type_lon_inv : 0 # 0: uniform inversion grid (above), 1: flexible grid, manually designed (following) + lon_inv : [] + + +parallel : + n_sims : 1 # number of simultaneous run + ndiv_rtp : [2,2,2] # number of subdomains + nproc_sub : 1 # number of subprocess used for each subdomain + +calculation : + convergence_tolerance : 1e-4 + max_iterations : 200 + stencil_order : 3 # 1 or 3 + sweep_type : 1 # 0: legacy, 1: cuthill-mckee with shm parallelization + output_file_format : 0 # 0: hdf5, 1: ascii + +output_setting : + is_output_source_field : 0 # output the calculated field of all sources 1 for yes; 0 for no; default: 1 + is_verbose_output : 0 # output internal parameters, if no, only model parameters are out. 1 for yes; 0 for no; default: 0 + is_output_model_dat : 0 # output model_parameters_inv_0000.dat or not. 1 for yes; 0 for no; default: 1 + #is_output_in_process : 0 # output the model file in process or not. 1 for yes; 0 for no; default: 1 diff --git a/test/old_tests/update_input_file/input_params_pre.yml b/test/old_tests/update_input_file/input_params_pre.yml new file mode 100644 index 0000000..0d73cc1 --- /dev/null +++ b/test/old_tests/update_input_file/input_params_pre.yml @@ -0,0 +1,34 @@ +version : 2 + +domain : + min_max_dep : [-10.0, 10.0] # depth in km + min_max_lat : [37.7,42.3] # latitude in degree + min_max_lon : [22.7,27.3] # longitude in degree + n_rtp : [10,50,50] # number of nodes + +source : + src_rec_file : 'src_rec_test.dat' # source receiver file (if found, src_dep_lat_lon is ignored) + swap_src_rec : 1 # swap source and receiver (1: yes, 0: no) + +model : + init_model_path : './test_model_true.h5' # path to initial model file (ignored if init_model_type is '1d_*') + +inversion : + run_mode : 0 # 0 for forward simulation only, 1 for inversion + n_inversion_grid : 1 + +parallel : + n_sims : 1 # number of simultaneous run + ndiv_rtp : [1,1,1] # number of subdomains + nproc_sub : 2 # number of subprocess used for each subdomain + +calculation : + convergence_tolerance : 1e-4 + max_iterations : 500 + stencil_order : 3 # 1 or 3 + sweep_type : 1 # 0: legacy, 1: cuthill-mckee with shm parallelization + +output_setting : + is_output_source_field : 0 # output the calculated field of all sources 1 for yes; 0 for no; default: 1 + is_verbose_output : 0 # output internal parameters, if no, only model parameters are out. 1 for yes; 0 for no; default: 0 + is_output_model_dat : 0 # output model_parameters_inv_0000.dat or not. 1 for yes; 0 for no; default: 1 diff --git a/test/old_tests/update_input_file/input_params_ver3.yml b/test/old_tests/update_input_file/input_params_ver3.yml new file mode 100644 index 0000000..74f2724 --- /dev/null +++ b/test/old_tests/update_input_file/input_params_ver3.yml @@ -0,0 +1,182 @@ +version : 3 # the third version of input parameters + +################################################# +# computational domian # +################################################# +domain : # computational domain for forward simulation and inversion + min_max_dep : [-10.0, 50.0] # depth in km + min_max_lat : [34.5,40.5] # latitude in degree + min_max_lon : [34.5,40.5] # longitude in degree + n_rtp : [61,61,61] # number of nodes for forward modeling. 'ntp' represents dep,lat,lon + + +################################################# +# traveltime data file path # +################################################# +source : + src_rec_file : 'src_rec.dat' # source receiver file (if found, src_dep_lat_lon is ignored) + swap_src_rec : 0 # swap source and receiver (1: yes, 0: no) + + +################################################# +# initial model file path # +################################################# +model : + init_model_path : 'model_init_N61_61_61.h5' # path to initial model file (ignored if init_model_type is '1d_*') + + +################################################# +# parallel setting for HPC # +################################################# +parallel : + n_sims : 5 # number of simultaneous run: (highest parallel efficiency) parallel the source, usually less than Number of sources over 4 + ndiv_rtp : [1,1,1] # number of subdomains in depth, latitude, longitude: (moderate parallel efficiency) use domain decomposition to parallel the computational of traveltime field of each source + nproc_sub : 1 # number of subprocess used for each subdomain (low parallel efficiency, usually set 1) + use_gpu: 0 # 1 if use gpu (EXPERIMENTAL) + +############################################ +# output file setting # +############################################ +output_setting : + output_dir : 'progrma_test/2-local_image/OUTPUT_FILES_abs_single' # default: "./OUTPUT_FILES/" + is_output_source_field : no # output the calculated field of all sources default: yes + is_output_model_dat : yes # output model_parameters_inv_0000.dat (txt format) or not (high I/O cost). default: no + is_output_final_model: yes # output merged final model or not. default: yes + is_output_in_process: yes # output model at each inv iteration or not. default: yes + is_single_precision_output: no # output results in single precision or not. default: no + verbose_output_level : 0 # output internal parameters, if 0, only model parameters are out. Higher level, more internal parameters are output. default: 0 + + +################################################# +# inversion or forward modeling # +################################################# +run_mode : 1 # 0 for forward simulation only, 1 for inversion and location + + +################################################### +# model update parameters setting # +################################################### +model_update : # update model parameters (when run_mode : 1) + yes_or_no : yes # 'yes' for updating model parameters; 'no' for not updating model paramters (no need to set parameters in this section); + + # -------------- model_update_strategy ----------------- + max_iterations : 5 # maximum number of iterations for model update + + optim_method: 0 # optimization method. 0 : grad_descent, 1 : halve-stepping, 2 : lbfgs (EXPERIMENTAL) + + optim_method_0: # for gradient descent method + step_length : 0.01 # step length of model perturbation at each iteration. 0.01 means maximum 1% perturbation for each iteration. + step_length_decay : 0.9 # if objective function increase, step size -> step length * step_length_decay. default: 0.9 + + optim_method_1_2: # for halve-stepping or lbfgs method + max_sub_iterations: 20 # maximum number of each sub-iteration + l_smooth_rtp: [1, 1, 1] # smoothing coefficients for laplacian smoothing + regularization_weight: 0.5 # weight value for regularization (lbfgs mode only) + + + # -------------- multigrid model parameterization ----------------- + n_inversion_grid : 5 # number of inversion grid sets + # flexible inversion grid (if type_*_inv : 1) + type_dep_inv : 1 # 0: use to generate uniform inversion grid for depth, 1: use to generate flexible inversion grid for depth + dep_inv : [-7.0, -3.0, 0.0, 3.0, 7.0, 12.0, 18.0, 25.0, 33.0, 42.0, 52.0, 63.0] + type_lat_inv : 0 # 0: use to generate uniform inversion grid for latitude, 1: use to generate flexible inversion grid for latitude + lat_inv : [0.0, 1.0] + type_lon_inv : 0 # 0: use to generate uniform inversion grid for longitude, 1: use to generate flexible inversion grid for longitude + lon_inv : [0.0, 1.0] + # uniform inversion grid (if type_*_inv : 0) + n_inv_dep_lat_lon : [10,10,10] # number of the base inversion grid points + min_max_dep_inv : [-10.0, 40.0] # depth in km with R = 6371.0 + min_max_lat_inv : [34.5,40.5] # latitude in degree + min_max_lon_inv : [34.5,40.5] # longitude in degree + + + # -------------- using absolute traveltime data -------------- + abs_time: + yes_or_no : yes # 'yes' for using absolute traveltime data to update model parameters; 'no' for not using (no need to set parameters in this section) + residual_weight : [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. wt = residual_weight[2] for res < residual_weight[0]. wt = residual_weight[3] for res > residual_weight[1], and linear weight in between. + distance_weight : [50.0, 150.0, 1.0, 0.1] # weight of epicenter distance. wt = distance_weight[2] for dis < distance_weight[0]. wt = distance_weight[3] for dis > distance_weight[1], and linear weight in between. + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + yes_or_no : yes # 'yes' for using common source differential traveltime data to update model parameters; 'no' for not using (no need to set parameters in this section) + residual_weight : [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. + azimuthal_weight : [15.0, 30.0, 1.0, 0.1] # weight of azimuth between two stations. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + yes_or_no : yes # 'yes' for using common receiver differential traveltime data to update model parameters; 'no' for not using (no need to set parameters in this section) + residual_weight : [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. + azimuthal_weight : [15.0, 30.0, 1.0, 0.1] # weight of azimuth between two earthquakes. + + # -------------- global weight of different types of data (to balance the weight of different data) -------------- + global_weight: + is_balance_data_weight : yes # yes: over the total weight of the each type of the data. the obj of different data means the average data misfit; no: use original weight (below weight for each type of data needs to be set) + abs_time_weight : 1.0 # weight of absolute traveltime data, default: 1.0 + cs_dif_time_local_weight : 1.0 # weight of common source differential traveltime data, default: 1.0 + cr_dif_time_local_weight : 1.0 # weight of common receiver differential traveltime data, default: 1.0 + teleseismic_weight : 1.0 # weight of teleseismic data, default: 1.0 (exclude in this version) + + # -------------- inversion parameters (exclude in this version) -------------- + is_inv_slowness : yes # update slowness (velocity) or not. default: yes + is_inv_azi_ani : no # update azimuthal anisotropy (xi, eta) or not. default: no + is_inv_rad_ani : no # update radial anisotropy (in future) or not. default: no + + # -------------- for teleseismic inversion (exclude in this version) -------------- + depth_taper : [-200.0, -100.0] # kernel weight : depth. --> 0: -inf ~ taper[0]; 0 ~ 1 : taper[0] ~ taper[1]; 1 : taper[1] ~ inf + + +################################################# +# relocation parameters setting # +################################################# +relocation: # update earthquake hypocenter and origin time (when run_mode : 1) + yes_or_no : yes # 'yes' for relocating earthquakes; 'no' for not relocating earthquakes (no need to set parameters in this section); + + # relocation_strategy + step_length : 0.01 # step length of relocation perturbation at each iteration. 0.01 means maximum 1% perturbation for each iteration. + step_length_decay : 0.9 # if objective function increase, step size -> step length * step_length_decay. default: 0.9 + rescaling_dep_lat_lon_ortime : [10.0, 10.0, 10.0, 1.0] # The perturbation is related to . Unit: km,km,km,second + max_change_dep_lat_lon_ortime : [5.0, 5.0, 5.0, 0.5] # the change of dep,lat,lon,ortime do not exceed max_change. Unit: km,km,km,second + max_iterations : 100 # maximum number of iterations for relocation + + # more option for using different types of data is under development (following) + # -------------- using absolute traveltime data -------------- + abs_time: + yes_or_no : yes # 'yes' for using absolute traveltime data to update model parameters; 'no' for not using (no need to set parameters in this section) + residual_weight : [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. wt = residual_weight[2] for res < residual_weight[0]. wt = residual_weight[3] for res > residual_weight[1], and linear weight in between. + distance_weight : [50.0, 150.0, 1.0, 0.1] # weight of epicenter distance. wt = distance_weight[2] for dis < distance_weight[0]. wt = distance_weight[3] for dis > distance_weight[1], and linear weight in between. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + yes_or_no : yes # 'yes' for using common receiver differential traveltime data to update model parameters; 'no' for not using (no need to set parameters in this section) + residual_weight : [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. + distance_weight : [10.0, 30.0, 1.0, 0.1] # weight of distance (km) between two earthquakes. + + +#################################################################### +# inversion strategy for tomography and relocation # +#################################################################### +inversion_strategy: # if both update model parameters (yes) and relocation (yes), set inversion strategies here + inv_mode : 0 # 0 for update model parameters and relocation iteratively. (other options for future work) + + # for inv_mode : 0, parameters below are required + inv_mode_0: # Fristly, do relocation; Subsequently, do relocation every N steps; Finally, do relocation + relocation_first : yes # yes: do relocation first; no: do not relocation first. default: yes + relocation_first_iterations : 10 # maximum number of iterations for relocation in the beginning. default: 10 + relocation_every_N_steps : 5 # subsequently, do relocation every N steps of updating model parameters. The iteration of relocation follows in Section + relocation_final : yes # yes: do relocation finally; no: do not relocation finally. default: yes + relocation_final_iterations : 10 # maximum number of iterations for relocation in the beginning. default: 10 + + +######################################################################## +# Scheme of Eikonal solver (fast sweeping method) # +######################################################################## +calculation : # prefer not to change the default value unless well know the detail + convergence_tolerance : 1e-6 # threshold for determining the convergence of the eikonal solver, default: 1e-6 + max_iterations : 500 # max itertions of the eikonal solver default: 500 + stencil_order : 1 # 1 for first order discretization; 3 for 3rd order WENO discretization. default: 1 + stencil_type : 1 # 0 for no upwind scheme; 1 for upwind scheme; default: 1 + sweep_type : 0 # 0: legacy, 1: cuthill-mckee with shm parallelization default: 0 + + + + diff --git a/test/old_tests/update_input_file/make_test_model.ipynb b/test/old_tests/update_input_file/make_test_model.ipynb new file mode 100644 index 0000000..3fc066d --- /dev/null +++ b/test/old_tests/update_input_file/make_test_model.ipynb @@ -0,0 +1,347 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# notebook for create init and true test model" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "depminmax 10.0 -10.0\n", + "17640\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import math\n", + "\n", + "# grid\n", + "R_earth = 6371.0\n", + "\n", + "rr1=6361 \n", + "rr2=6381\n", + "tt1=(38.0-0.3)/180*math.pi\n", + "tt2=(42.0+0.3)/180*math.pi\n", + "pp1=(23.0-0.3)/180*math.pi\n", + "pp2=(27.0+0.3)/180*math.pi\n", + "\n", + "n_rtp = [10,50,50]\n", + "dr = (rr2-rr1)/(n_rtp[0]-1)\n", + "dt = (tt2-tt1)/(n_rtp[1]-1)\n", + "dp = (pp2-pp1)/(n_rtp[2]-1)\n", + "rr = np.array([rr1 + x*dr for x in range(n_rtp[0])])\n", + "tt = np.array([tt1 + x*dt for x in range(n_rtp[1])])\n", + "pp = np.array([pp1 + x*dp for x in range(n_rtp[2])])\n", + "\n", + "# initial model\n", + "gamma = 0.0\n", + "s0 = 1.0/6.0\n", + "slow_p=0.06\n", + "ani_p=0.04\n", + "\n", + "eta_init = np.zeros(n_rtp)\n", + "xi_init = np.zeros(n_rtp)\n", + "zeta_init = np.zeros(n_rtp)\n", + "fun_init = np.zeros(n_rtp)\n", + "vel_init = np.zeros(n_rtp)\n", + "\n", + "# true model\n", + "eta_true = np.zeros(n_rtp)\n", + "xi_true = np.zeros(n_rtp)\n", + "zeta_true = np.zeros(n_rtp)\n", + "fun_true = np.zeros(n_rtp)\n", + "vel_true = np.zeros(n_rtp)\n", + "\n", + "c=0\n", + "for ir in range(n_rtp[0]):\n", + " for it in range(n_rtp[1]):\n", + " for ip in range(n_rtp[2]):\n", + " # already initialized above\n", + " #eta_init[ir,it,ip] = 0.0\n", + " #xi_init[ir,it,ip] = 0.0\n", + " zeta_init[ir,it,ip] = gamma*math.sqrt(eta_init[ir,it,ip]**2 + xi_init[ir,it,ip]**2)\n", + " fun_init[ir,it,ip] = s0\n", + " vel_init[ir,it,ip] = 1.0/s0\n", + "\n", + " # true model\n", + " if (tt[it] >= 38.0/180.0*math.pi and tt[it] <= 42.0/180.0*math.pi \\\n", + " and pp[ip] >= 23.0/180.0*math.pi and pp[ip] <= 27.0/180.0*math.pi):\n", + " c+=1\n", + " sigma = math.sin(2.0*math.pi*(tt[it]-38.0/180.0*math.pi)/(4.0/180.0*math.pi))*math.sin(2.0*math.pi*(pp[ip]-23.0/180.0*math.pi)/(4.0/180.0*math.pi))\n", + " else:\n", + " sigma = 0.0\n", + "\n", + " if sigma < 0:\n", + " psi = 60.0/180.0*math.pi\n", + " elif sigma > 0:\n", + " psi = 120.0/180.0*math.pi\n", + " else:\n", + " psi = 0.0\n", + "\n", + " eta_true[ir,it,ip] = ani_p*abs(sigma)*math.sin(2.0*psi)\n", + " xi_true[ir,it,ip] = ani_p*abs(sigma)*math.cos(2.0*psi)\n", + " zeta_true[ir,it,ip] = gamma*math.sqrt(eta_true[ir,it,ip]**2 + xi_true[ir,it,ip]**2)\n", + " fun_true[ir,it,ip] = s0/(1.0+sigma*slow_p)\n", + " vel_true[ir,it,ip] = 1.0/fun_true[ir,it,ip] \n", + "\n", + "\n", + "#r_earth = 6378.1370\n", + "print(\"depminmax {} {}\".format(R_earth-rr1,R_earth-rr2))\n", + "print(c)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# write out in hdf5 format\n", + "import h5py\n", + "\n", + "fout_init = h5py.File('test_model_init.h5', 'w')\n", + "fout_true = h5py.File('test_model_true.h5', 'w')\n", + "\n", + "# write out the arrays eta_init, xi_init, zeta_init, fun_init, a_init, b_init, c_init, f_init\n", + "fout_init.create_dataset('eta', data=eta_init)\n", + "fout_init.create_dataset('xi', data=xi_init)\n", + "fout_init.create_dataset('zeta', data=zeta_init)\n", + "fout_init.create_dataset('vel', data=vel_init)\n", + "\n", + "# writeout the arrays eta_true, xi_true, zeta_true, fun_true, a_true, b_true, c_true, f_true\n", + "fout_true.create_dataset('eta', data=eta_true)\n", + "fout_true.create_dataset('xi', data=xi_true)\n", + "fout_true.create_dataset('zeta', data=zeta_true)\n", + "fout_true.create_dataset('vel', data=vel_true)\n", + "\n", + "fout_init.close()\n", + "fout_true.close()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# prepare src station file\n", + "\n", + "The following code creates a src_rec_file for the inversion, which describes the source and receiver positions and arrival times.\n", + "Format is as follows:\n", + "\n", + "```\n", + " 26 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- src  : id_src year month day hour min sec lat lon dep_km mag num_recs id_event\n", + " 26 1 PCBI 1.8900 98.9253 1000.0000 P 10.40 18.000 <- arrival : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arrival_time_sec\n", + " 26 2 MRPI 1.6125 99.3172 1100.0000 P 50.84 19.400\n", + " 26 3 HUTI 2.3153 98.9711 1600.0000 P 57.84 19.200\n", + " ....\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "random.seed(1145141919810)\n", + "\n", + "# dummys\n", + "year_dummy = 1998\n", + "month_dummy = 1\n", + "day_dummy = 1\n", + "hour_dummy = 0\n", + "minute_dummy = 0\n", + "second_dummy = 0\n", + "mag_dummy = 3.0\n", + "id_dummy = 1000\n", + "st_name_dummy = 'AAAA'\n", + "phase_dummy = 'P'\n", + "dist_dummy = 100.0\n", + "arriv_t_dummy = 0.0\n", + "\n", + "tt1deg = tt1 * 180.0/math.pi\n", + "tt2deg = tt2 * 180.0/math.pi\n", + "pp1deg = pp1 * 180.0/math.pi\n", + "pp2deg = pp2 * 180.0/math.pi\n", + "\n", + "\n", + "n_srcs = [20,20,20]\n", + "n_src = n_srcs[0]*n_srcs[1]*n_srcs[2]\n", + "n_rec = [30 for x in range(n_src)]\n", + "\n", + "\n", + "lines = []\n", + "\n", + "nij_src = math.sqrt(n_src)\n", + "nij_rec = math.sqrt(n_rec[0])\n", + "\n", + "pos_src=[]\n", + "pos_rec=[]\n", + "\n", + "\n", + "# create receiver coordinates\n", + "elev_recs=[]\n", + "lon_recs=[]\n", + "lat_recs=[]\n", + "rec_names=[]\n", + "for i in range(n_rec[0]):\n", + " #elev_recs.append(random.uniform(-100.0,-100.0)) # elevation in m\n", + " #elev_recs.append(0) # elevation in m\n", + " #lon_recs .append(random.uniform(pp1deg*1.1,pp2deg*0.9))\n", + " #lat_recs .append(random.uniform(tt1deg*1.1,tt2deg*0.9))\n", + " rec_names.append(i)\n", + " # regularly\n", + " elev_recs.append(0.0)\n", + " tmp_ilon = i%nij_rec\n", + " tmp_ilat = int(i/nij_rec)\n", + " lon_recs.append(pp1deg + tmp_ilon*(pp2deg-pp1deg)/nij_rec)\n", + " lat_recs.append(tt1deg + tmp_ilat*(tt2deg-tt1deg)/nij_rec)\n", + "\n", + "\n", + "\n", + "# create source coordinates\n", + "for ir in range(n_srcs[0]):\n", + " for it in range(n_srcs[1]):\n", + " for ip in range(n_srcs[2]):\n", + " i_src = ir*n_srcs[1]*n_srcs[2] + it*n_srcs[2] + ip\n", + " # define one point in the domain (rr1 bottom, rr2 top)\n", + " # random\n", + " #dep = random.uniform((R_earth-rr1)*0.5,(R_earth-rr1)*0.98)\n", + " #lon = random.uniform(pp1deg,pp2deg)\n", + " #lat = random.uniform(tt1deg,tt2deg)\n", + "\n", + " # regular\n", + " dep = (R_earth-rr1)/n_srcs[0]*ir\n", + " lon = pp1deg + ip*(pp2deg-pp1deg)/n_srcs[2]\n", + " lat = tt1deg + it*(tt2deg-tt1deg)/n_srcs[1]\n", + "\n", + " # put independent name for each source\n", + " id_dummy = \"src_\"+str(i_src)\n", + " \n", + " src = [i_src, year_dummy, month_dummy, day_dummy, hour_dummy, minute_dummy, second_dummy, lat, lon, dep, mag_dummy, n_rec[i_src], id_dummy]\n", + " lines.append(src)\n", + "\n", + " pos_src.append([lon,lat,dep])\n", + "\n", + "\n", + " # create dummy station\n", + " for i_rec in range(n_rec[i_src]):\n", + " elev_rec = elev_recs[i_rec]\n", + " lon_rec = lon_recs[i_rec]\n", + " lat_rec = lat_recs[i_rec]\n", + " st_name_dummy = \"rec_\"+str(rec_names[i_rec])\n", + "\n", + " rec = [i_src, i_rec, st_name_dummy, lat_rec, lon_rec, elev_rec, phase_dummy, dist_dummy, arriv_t_dummy]\n", + " lines.append(rec)\n", + " \n", + " pos_rec.append([lon_rec,lat_rec,elev_rec])\n", + "\n", + "\n", + "# write out ev_arrivals file\n", + "fname = 'src_rec_test.dat'\n", + "\n", + "with open(fname, 'w') as f:\n", + " for line in lines:\n", + " for elem in line:\n", + " f.write('{} '.format(elem))\n", + " f.write('\\n')\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD4CAYAAAD1jb0+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAbm0lEQVR4nO2dX4xuV1nGf6u0/GnagrEFj5zOGRMgpkIgpRKj1YRKFY9GTfUCU4kX4pELoaGIhGBQNE3UqBxiIsQgSu0hYuCiQggVwwn+iSnOgcOxLdhgbA9gIpJIojca8PVi9mam37enM7P2+tbez9rPL/lyZr6Z9a2ne737We96116dFBEYY4zR44qpBRhjjMnDBm6MMaLYwI0xRhQbuDHGiGIDN8YYUa6s2dn1118f29vbNbs0xhh5Lly48NWIuGH1/aoGvr29zc7OTs0ujTFGnpTS40Pvu4RijDGi2MCNMUYUG7gxxohiAzfGGFFs4MYYI4oN3JianDsH29twxRW7/547N7UiI4wNfBWFG0xBo1nn3Dk4cwYefxwidv89c2ae4+cY0yAiqr1e+tKXxqy5776Iq6+O2L29dl9XX737/lxQ0Nhz330Rp05FpLT77xw11uTUqSeOW/86dWpqZU9EJcYWFF/ATgx46vwNvOYgKdxgChojbAJDpDQ8dinNS6dCjKnEVyE0Dbz2ICncYAoaI2wCQ+ReE5X7wPG1MTQNvPYgKdxgChojNCaa2vGVOwYK94Hja6NoGnjtQVK4wRQ0jumvphFMYQI57cbozCFnDBxfG0XTwKcYpNo3WO5E06IJRNQ1AhUTGHNNak00TrY2iqaBqwySghEomEBEXSNQia9cnQrx1XqyVQhNA4/QGCQFI1AwgYj6RqAQX7ntFOLLydaR0DXwHFrPBlo1gV7j3I1AxQRc2hvWOPf4GmBZBq4ySN7tL9euphG0HF8RGqWXXmeL8TWAroG3PEje7Z+HToX4cmmvTLtcVDNw4EbgPPAI8DBwV/f+B4CL3esx4OJhnzX7gzwK2YBNoJxOlfhyaW8dhfgqyBgDPwHc3H19LfAocNPK7/we8LbDPmv2B3kUsoHWTSC3v5x2KvGlsOpyaW+jFCuhAPcDt+/7PgFfBJ5/WNvZH+TJbaew5FQwgYi6RqASXwqrLsfXRili4MA2cBm4bt97P3DQh3c/PwPsADtbW1vHU60ySN7tH9Y494lGJb4UVl0Kk0zE5LXsXEYbOHANcAG4Y+X9dwFvPMpn+CDPCgqll15ni9mmSnwp6FSYZCKWeZAHuAp4ALh75f0rgX8HTh7lc3yQZwWF0kvr2aZCfE2h87go3ANj+hPexEzAvcDZgZ+9EvjkYZ/Rv3yQZwXv9g9rnLsRqJhA7VWXwmSoEF8DjDHwW4EALu17bPB097M/BV572Gf0Lx/kKdBf6/X93HY1J0OV+FJYdbWebBXCB3layQYUJpkIjWxTyQRaXXWpTIaqGXjJV7MHebzbv45CtqliAiqrLpVkKwfVGnjJV7MHeVqvv7aabaqYgMJEo5Js9VprTTSF0DRwBRMYq/O4tGwCERr1116nQny1WtpTqO8XRNPAFUxgjM5eq3f791Cov6rEV8ulvdx2E9eyc9E0cAUTGKNTIdtsvfSiYAIK94FKsrXEgzylXs0e5Mltp5BtuvSyjkp8ubRXrj9vYjZ+kCcH7/YPa5y7EajEl0t7w23mHl8DLMvAVQbJu/3l2vkgTzmdLu2t44M8Psgz2Ma7/WWoPRkqxFduO5f2pu9vBU0DVzCBsTq9218GhclQpfTSemmv5qqrEJoGrmACtXW2bgK91hpGoGICChONk62NomngCiYwVudxadkEIlx/HUJhonGytVE0DVzBBMbo7LV6t38P11/L9efSXlmdE6Jp4Co3mMJGn4IJRGgc5PGjleX6aj3ZKoSmgUdomEBuO2eb5fpTmAx7nQrZ5nH7U4kvhWRrAF0Dz0HBBCK8239Qm7kbgYoJ1L4PFOIrt93EtXNdA2/VBHL7a90E+ra1jKBlE1C4D1pPtgqhaeAqJpDbn3f7y6EwGapkm36qavr+VtA0cJVB8m5/WZ05KEyGKtnmGJ0K8VVzVV8ITQNXMIEILzlL6uy11jACFRNQWHWpxFftVX0hNA1cwQQivNtfUqfC0yStl/Zy2qnE18SlkFw0DVzBBCK821+yncLTJC69rKMSXz7IU9HAI+ZvAr3GuRuBgglE+CDPQRodX9Pq7LW6hFIBZwPD+uZuAmP6Uyi99DoV4sulvTLtCrEsA1cwgbE6WzSBvs3cjUDFBFzaK9du4tq5roG3agK5Ols3gb5tLSNo2QQU7gOVZMsHeXyQp0g7m0C5/pRMQGHV1XKy5QzcB3mK0LoJ5PaXMwaOr3I6W0+2XAMX+IMOCtlAyyYwVudxx9zxVU7nEiZDP4Ui8Acd5p4NtGwCtXU6vsq186OVG0XTwFUGybv989B5XBxf02vsdSrElzNwgT/okIOCESiYwBidvdacssbcTUAhvsYkIwrx5Rq4wHPgERrZQKsmMEanQrbZeuklp41KfPkplIoGrmACEd7tL9lOIdt06WUdlfhSfQ4cuBE4DzwCPAzcte9nrwM+373/O4d9VrUSSm47hWzAJjCMwkEel/bK9aWQbBVkjIGfAG7uvr4WeBS4CXg58NfA07qfPfuwz6p6kCcHhWzAJlCuPyUTUJhoXNrbGMVKKMD9wO3AXwCvOE5bH+SZUGOvc+4mkNufwmrGpb2D2849vsa0K0ARAwe2gcvAdcBF4O3Ag8Ange8+oM0ZYAfY2draOp5qBROI0Ki/KpjAWJ01VzMu7U2rUSHZKshoAweuAS4Ad3TfPwT8AZCAlwH/CqQn+wwf5CnUX6smUFunigkoTDQu7W2UUQYOXAU8ANy9772PAS/f9/2/ADc82ef4IM8K3u0vq/O4OL6m19jrVIgvxRJKl2HfC5xdef+1wG90X78A+GLxDDxi/ibQa5y7ESiYwBidvdYaqxmX9sppVIkv1U1M4FYggEtd3fsicBp4KnBfV0r5NHDbYZ/lgzwreLe/nE6FbNOlvXVU4mvi0osP8szNBCK821+ynUK26dLLOirxpXqQp+TLB3kGNHq3vwytH+RpddWlEl/OwH2Qp0g7m0C5/lRMQGXV1XJ8qdbAS758kEdUY6vZpooJKNwHrcfXmHYF0DRwBROIcP21ZH81jUDFBBSeqlpCfE2IpoErmECExm6/gglEuP5aUmev1aW9PSauZeeiaeAqg6RgBAomEFHXCFTiK1enQny1nmwVQtPAIzQGScEIFEwgor4RKMRXbjuF+HKydSR0DTyH1rOBVk2g1zh3I1AxAZf2hjXOPb4GWJaBqwxS7d3+HFSyTf8/VMr1p1B66XW2GF8D6Bp4y4Pk3f556FSIL5f2yrTLxRm4wEEehWzAJlBOp0p8ubS3jkJ8FUTTwFUGSWHJqWICuf3ltFOJL4VVl0t7G0XTwFUGSWHJqWACEXWNQCW+XNor19/EmXQumgauMkje7R/WOPeJRiW+XNobbjP3+CqIpoGrDJKCESiYQIQP8pTUqRBfSyjtFUDTwCM0BknBCBRMIKK+ESjEV247hfhysnUkdA08h9azgVZNoNc4dyNQMYHWS3utJlsDLMvAVQbJu/3l2tWcDFuOrwiXXobwQZ7GD/LUMgKbQDmdSibQ6kSjoHGK/lbQNHAFExir07v9ZfBkeHDbOa9mamvMxTXwhg/ytF5/Vcg2c9qpmIDCRKOSbPVaa000hdA0cAUTGKvzuLRsAhEa9ddep0J8tVraG/PUkQ/yzDwDbz0baNUEIjTqryrx1XJpL7fdxLXsXDQNXMEExuhUyDZbL70omIDCfaCSbPkgT0UDj9Awgdx2CtmmSy/rqMSXS3vl+vMmZuMHeXLwbv+wxrkbgUp8ubQ33Gbu8TXAsgxcZZC821+unQ/ylNPp0t46PsjjgzyDbbzbX4bak6FCfOW2c2lv+v5W0DRwBRMYq9O7/WVQmAxVSi+tl/ZqrroKoWngCiZQW2frJtBrrWEEru+X68/J1kbRNHAFExir87i0bAIRGvXXXqdCfLm0N63OQmgauIIJjNHZa/Vu/x4K9VeV+HJpr6zOCdE0cAUTGKNTIdtsfaOv1fp+bZ1OtjaKpoFHaJhAbjuFbNOll3VU4qumTpX4Uki2Bsg2cOBG4DzwCPAwcFf3/q8DXwYudq/Th32WD/Ks4N3+4TZzNwKV+KqtUyG+cttNXDsfY+AngJu7r68FHgVu6gz8lw9rv/9VLQNXMIHc/lo3gb5tLSNoOb4UdKpMhq0c5AHuB26vYuAqJpDbn3f7y1F7MlSIryl0HpeW46sgRQwc2AYuA9d1Bv4YcAl4L/AtB7Q5A+wAO1tbW8dTrTJI3u0vqzMHhclQJdsco1Mhvmquugox2sCBa4ALwB3d988BngJcAdwDvPewz6j6HHgOCtlA6ybQa61hBComoLDqUomv2quuQowycOAq4AHg7gN+vg08dNjnVD2J2Wo20LIJjGmXg4oJKKy6VOJr4lJILmM2MRNwL3B25f0T+75+A/Dnh31WtRp469lAqyYQUfcGUzEBhVWXSnwt7SAPcCsQXa37m48MAn8G/FP3/l/uN/SDXtWeQnE2UK4vpd3+3LLG3E3A8TW9zl6rYgml1Kvac+DOBob1zd0ExvSnUHrpdSrEl0t7ZdoVYlkGrmACY3W2aAJ9m7kbgYoJuLRXrt3EtXNdA2/VBHJ1tm4CfdtaRtCyCSjcByrJVisHeca8fJCnQDubQLn+lExAYdXVcrLlDFzgDzooZAOtm0Bufzlj4Pgqp7P1ZMs1cB/kKULLJjBW53FvTBUTUFh1LWEy9FMoPsgzur+WTaC2ThUTUFh1OdnaKJoG7t3+g9u1aAJjdR4XFRNQWHU52doomgYe4d3+UiiYwBidvdacssbcTUAhvpxsbRRdA8+h9WyzVRMYo1Mh22y99OJka2Msy8BVZlnv9pdrp5BtuvSyjkp8+TlwH+QpotMmMIzCQR5v9JXrSyHZKoimgTvbLKsxBwUTyO1PyQQUJhonWxtD08AVTCBCo/7a65y7CeT2p7CaUajvR7i0V7pdATQNXMEEIjTqrwomMFZnzdVMq/X9XuPcJ0OFZKsgmgauYAIR3u0/SOPcJ0MVE1CYaFza2yiaBq4ySApGoGACY3UeF8fX9Bp7nQrx5RJKpadQnA2U60ul9NJrrbGacWmvnEaV+PImpsBz4BEa2UCrJjBGp0K26dLeOirxNXHpZVkGrmACEd7tL9lOIdt06WUdlfjyQZ6KJZTcdgrZgE1gmNYP8rS66lKJL2fglQ/y5KCQDdgEyvWnYgIqq66W48s1cB/kkdXYarapYgIK90Hr8TWmXQE0DVzBBCJcfy3ZX00jUDEBhaeqlhBfE6Jp4AomEKGx269gAhGuv5bU2Wt1aW+PiWvZuWgauMogKRiBgglE1DUClfjK1akQX60nW4XQNPAIjUFSMAIFE4iobwQK8ZXbTiG+nGwdCV0Dz6H1bKBVE+g1zt0IVEzApb1hjXOPrwGWZeAqg1R7tz8HlWzT/w+Vcv0plF56nQrxVaD0omvgKoOUg3f756FTIb5c2ivTLpeJ7wNNA1cZpF6rd/v3UCi9qMSXS3vrKMRXQZ2aBq4ySApLThUTyO0vp51KfCmsulzaK69zH5oGrjJICktOBROIqGsEKvHl0l65/lRWXStoGrjKIHm3f1jj3CcalfhyaW+4zdzja4zOFTQNXGWQFIxAwQQifJCnpE6F+HJp70hkGzhwI3AeeAR4GLhr5edvBAK4/rDP8kGeFRRKLyrZ5pj/vrnHV247hfhysnUkxhj4CeDm7utrgUeBm2LP3B8AHt+YgefQejbQqgn0GuduBCom0Hppr9Vka4BiJRTgfuD27usPAi8GHpuVgasMknf7y7WrORm2HF8RLr0M0cJBHmAbuAxcB/wE8M7u/QMNHDgD7AA7W1tbxxYuYQK5/Xm3f1qdrZuAwkSjoHFMf3PZxASuAS4AdwBXAw8Cz4xDDHz/q9mDPDWNwCZQTucSTGDuq5naGnOZ+D4YZeDAVV2t++7u+xcBX+mM+zHg611m/m1P9jnNHuRpvf6qkG3mtFuYCRwZhdLemGsiONGM2cRMwL3A2Sf5nc1k4AomMFbncWnZBCI06q+9ToX4arW0lxsnShPNPsYY+K3dY4KXgIvd6/TK72zGwBVMYIzOXqt3+/dQqL+qxFfLpb3cdioTzQo+yDPHQVLINlsvvbRsAq2X9nJQmWhW0DTwCA0TyG2nkG269LKOSny5tFeuv9oTzQq6Bp6DyiB5t39Y49yNQCW+XNobbjP3+BpgWQauMkje7S/Xzgd5yul0aW+dFg7yjH01/Rd5vNtfpl0utSdDhfjKbefSXrn+vIk5cxMYq9O7/WVQmAxVSi8u7Q1rVD3IU+rlgzwFaN0Eeq01jGBhJnBkXNor127qgzwlXz7IU4CWTSBCo/7a61SIL5f2yrTLxRn4zE1gjM5eq3f791Cov6rEl0t766hMNCtoGriCCYzRqZBttr7R17IJuLS3jspEs4KmgUdomEBuO4Vs06WXdVTiq6ZOx9dG0TXwHFQGqfXd/lZLLyrxVVun42tj6Bp4y4PU8m6/Suml5fhS0Nl6fOX2t4Kmgbc+SC3v9rc+GSrE1xQ6j0vL8RWx8E3MJQxSq7v9Cs9YLyG+autUiC/BVZemgSuYQET7S86aOnutNYxgYSZwZHJ0qsSX0qprH5oGrmACEd7tL6mzphEswQRq3Qcq8aWy6lpB08AVTCDCu/0l29W8wVo3gZr3gUp8qazqV9A08P4CzNkEeo1zNwIFE4jQOMijYgKOr3I6e621JpoVdA08B2cDw/rmbgJj+lMovfQ6FeLLpb0y7QqxLANXMIGxOls0gb7N3I1AxQRc2ivXrvZEs4KugbdqArk6WzeBvm0tI2jZBBTuA5Vkywd5fJCnSDubQLn+lmACLu2VYeKJRtPAFzZIR8ImcLBGH+SZXqdCfAmu6jUNXMEEIrzkLKmz11rDCBZmAkfGpb2D206UyGgauIIJRHi3v6ROhadJlEzApb1pdS46A1cwgQjv9pdsp/A0iYoJuLQ3vc5F18D7CzBnE+g1zt0IFEwgov2DPK2WXlTiS2XVtYKugefQejbQqgmM6c+ll3Vc2tPVucKyDFzBBHJ1tmwCfZu532AKGsf059JeWZ0F0DXwVk0gV2frJtC3nfNqprbGXBTug5aTrf1aF1lCUTGB3P5y2tkEyvW3BBOY+2SoEl8TP1ChaeAKJhChUX/tdc7dBHL7U1jNTGwCR8alvXLtCsWYpoErmECERv1VwQTG6qy5mhE0gSOjMBkqJFsRPsgzexOI0Hj0TcEEautcggm4tPdEVCaaFbINHLgROA88AjwM3NW9/5vAJeAi8FfAtx/2WdVq4CqDVNMIFExgrM7j4viaXmOvUyG+aq7qVxhj4CeAm7uvrwUeBW4Crtv3O68H3n3YZ1V7CsXZQLm+VEovvdYaqxkVE3Bpbx2VVf0KxUoowP3A7SvvvQV412FtZ/8ceIRGNtCqCYzRqZBturS3jkp81da5QhEDB7aBy332DdwDfBF4CLjhgDZngB1gZ2trq8p/rIQJRHi3v2Q7hWzTpZd1VOJrCp37GG3gwDXABeCOgZ+9BXj7YZ9RrYSS204hG7AJDNP6QZ5WV10q8TWxzlEGDlwFPADcfcDPt4CHDvucqgd5clDIBlzfL9ffEkzApb0yTKxzzCZmAu4Fzq68//x9X78O+OBhn+WDPBNq7HU629xjYSZwZFzam4fOfYwx8FuB2PfI4EXgNPChrvZ9Cfgw8NzDPssHeQrQcn1/rM6aqxlBEzgyCpOhQrI1RucKPsjTUjbQan2/ts4lmIBCaa/VZGuMzhU0DVxlkBSMYAnZ5nH7U4kvhVWXk63y7fahaeARGoOkYAQKk8wUOhXiK7edQmnPydaR0DXwHFrPBlqdZFR0qpiAQmlPob4fUf8+WGFZBq4ySN7tn4fO49JyfEVolF56nQrx5RLKqfkPUg7e7Z+HTsfXE1EovSjFlzcxZz5IY6i525+rb+4mkKvT8TXMFDE25/p+r1HxIE/J1+wP8ky8UXEkbALldDq+hpm43nskFOKroE5NA1cZpJrYBMrh+BpGIcYU4ivCGbjEINXGJlAGx9fBzD3GFOIrwjVwiUEyw9gEzCaZe3z1bPAplLT7szrccsstsbOzc7xG587BW98Kly/D1hbccw/ceedmBJrl4fgyAqSULkTELWvvz97AjTFm4Rxk4FdMIcYYY8x4bODGGCOKDdwYY0SxgRtjjCg2cGOMEaXqUygppf8AHq/W4ZNzPfDVqUXMCF+PPXwt9vC12GPKa3EqIm5YfbOqgc+JlNLO0GM5S8XXYw9fiz18LfaY47VwCcUYY0SxgRtjjChLNvA/mlrAzPD12MPXYg9fiz1mdy0WWwM3xhh1lpyBG2OMNDZwY4wRZREGnlJ6ekrpUymlz6aUHk4pvb17/wdTSp9OKV1MKf1dSul5U2vdNE9yLW7rrsVDKaX3pZSunFprLVJKT0kpfSal9JHu++9IKT2YUvpCSukDKaWnTq2xFgPX4pe66xAppeun1leTgWtxLqX0z9098t6U0lVTa1yEgQP/A9wWES8GXgK8MqX0PcC7gDsj4iXA+4FfnUxhPYauxfcC7wNeFREvZPew1c9NJ7E6dwGf2/f9bwPviIjnAf8J/PwkqqZh9Vr8PfAK5nMAryar1+Ic8J3Ai4BnAK+ZQtR+FmHg3R+1+O/u26u6V3Sv67r3nwn82wTyqnLAtfgG8L8R8Wj3/seBn5pCX21SSieBHwXe032fgNuAD3a/8j7gJycRV5nVawEQEZ+JiMcmEzURB1yLj+77CzmfAk5Opa9nEQYO31wOXQS+Anw8Ih5kdwb9aErpS8Crgd+aUGI1Vq8Fu8F4ZUqpP2X208CNE8mrzVngV4D/677/VuBrEfH17vsvAc+dQNcUnOWJ12LJnOWAa9GVTl4NfKyypjUWY+AR8Y2uVHISeFlK6YXAG4DTEXES+BPg9yeUWI3VawF8F/Aq4B0ppU8B/8VuVt40KaUfA74SERem1jI1vhZ7HOFa/CHwNxHxtxVlDbKYjaqeiPhaSuk88CPAi7tMHOADzGBGrcm+a/HKiPhd4PsBUko/BLxgUnF1+D7gx1NKp4Gns1tOeyfwrJTSlV0WfhL48oQaa7F2LVJK90XEz06sawoOvBYppV8DbgB+cVKFHYvIwFNKN6SUntV9/QzgdnY3J56ZUuqNqn+vaQ64Fp9PKT27e+9pwJuBd08mshIR8ZaIOBkR2+yuQD4REXcC59ktI8HuZu79E0msxgHXYonmfeC1SCm9Bvhh4GciYhZlpkUYOHACOJ9SugT8I7s18I8AvwB8KKX0WXZrWm+aUGMtDroWb0opfQ64BHw4Ij4xpciJeTNwd0rpC+zWxP94Yj2TkVJ6fbdHdBK4lFJ6z2FtGubdwHOAf+gePX7b1IJ8lN4YY0RZSgZujDHNYQM3xhhRbODGGCOKDdwYY0SxgRtjjCg2cGOMEcUGbowxovw/g47aIBo60iUAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# draw src and rec positions\n", + "import matplotlib.pyplot as plt\n", + "\n", + "for i_src in range(n_src):\n", + " plt.scatter(pos_src[i_src][1],pos_src[i_src][0],c='r',marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# plot receivers\n", + "for i_rec in range(n_rec[0]):\n", + " plt.scatter(pos_rec[i_rec][1],pos_rec[i_rec][0],c='b',marker='o')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8 (main, Dec 18 2022, 17:23:16) [GCC 12.2.0]" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "c8112a80bcc57e66f52aa6c921b20667122cfa5e8b1ad09e9dfbd3a3ba336bd6" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/update_input_file/make_test_model.py b/test/old_tests/update_input_file/make_test_model.py new file mode 100644 index 0000000..6f195e6 --- /dev/null +++ b/test/old_tests/update_input_file/make_test_model.py @@ -0,0 +1,241 @@ +# %% [markdown] +# # notebook for create init and true test model + +# %% +import numpy as np +import math + +# grid +R_earth = 6371.0 + +rr1=6361 +rr2=6381 +tt1=(38.0-0.3)/180*math.pi +tt2=(42.0+0.3)/180*math.pi +pp1=(23.0-0.3)/180*math.pi +pp2=(27.0+0.3)/180*math.pi + +n_rtp = [10,50,50] +dr = (rr2-rr1)/(n_rtp[0]-1) +dt = (tt2-tt1)/(n_rtp[1]-1) +dp = (pp2-pp1)/(n_rtp[2]-1) +rr = np.array([rr1 + x*dr for x in range(n_rtp[0])]) +tt = np.array([tt1 + x*dt for x in range(n_rtp[1])]) +pp = np.array([pp1 + x*dp for x in range(n_rtp[2])]) + +# initial model +gamma = 0.0 +s0 = 1.0/6.0 +slow_p=0.06 +ani_p=0.04 + +eta_init = np.zeros(n_rtp) +xi_init = np.zeros(n_rtp) +zeta_init = np.zeros(n_rtp) +fun_init = np.zeros(n_rtp) +vel_init = np.zeros(n_rtp) + +# true model +eta_true = np.zeros(n_rtp) +xi_true = np.zeros(n_rtp) +zeta_true = np.zeros(n_rtp) +fun_true = np.zeros(n_rtp) +vel_true = np.zeros(n_rtp) + +c=0 +for ir in range(n_rtp[0]): + for it in range(n_rtp[1]): + for ip in range(n_rtp[2]): + # already initialized above + #eta_init[ir,it,ip] = 0.0 + #xi_init[ir,it,ip] = 0.0 + zeta_init[ir,it,ip] = gamma*math.sqrt(eta_init[ir,it,ip]**2 + xi_init[ir,it,ip]**2) + fun_init[ir,it,ip] = s0 + vel_init[ir,it,ip] = 1.0/s0 + + # true model + if (tt[it] >= 38.0/180.0*math.pi and tt[it] <= 42.0/180.0*math.pi \ + and pp[ip] >= 23.0/180.0*math.pi and pp[ip] <= 27.0/180.0*math.pi): + c+=1 + sigma = math.sin(2.0*math.pi*(tt[it]-38.0/180.0*math.pi)/(4.0/180.0*math.pi))*math.sin(2.0*math.pi*(pp[ip]-23.0/180.0*math.pi)/(4.0/180.0*math.pi)) + else: + sigma = 0.0 + + if sigma < 0: + psi = 60.0/180.0*math.pi + elif sigma > 0: + psi = 120.0/180.0*math.pi + else: + psi = 0.0 + + eta_true[ir,it,ip] = ani_p*abs(sigma)*math.sin(2.0*psi) + xi_true[ir,it,ip] = ani_p*abs(sigma)*math.cos(2.0*psi) + zeta_true[ir,it,ip] = gamma*math.sqrt(eta_true[ir,it,ip]**2 + xi_true[ir,it,ip]**2) + fun_true[ir,it,ip] = s0/(1.0+sigma*slow_p) + vel_true[ir,it,ip] = 1.0/fun_true[ir,it,ip] + + +#r_earth = 6378.1370 +print("depminmax {} {}".format(R_earth-rr1,R_earth-rr2)) +print(c) + + +# %% +# write out in hdf5 format +import h5py + +fout_init = h5py.File('test_model_init.h5', 'w') +fout_true = h5py.File('test_model_true.h5', 'w') + +# write out the arrays eta_init, xi_init, zeta_init, fun_init, a_init, b_init, c_init, f_init +fout_init.create_dataset('eta', data=eta_init) +fout_init.create_dataset('xi', data=xi_init) +fout_init.create_dataset('zeta', data=zeta_init) +fout_init.create_dataset('vel', data=vel_init) + +# writeout the arrays eta_true, xi_true, zeta_true, fun_true, a_true, b_true, c_true, f_true +fout_true.create_dataset('eta', data=eta_true) +fout_true.create_dataset('xi', data=xi_true) +fout_true.create_dataset('zeta', data=zeta_true) +fout_true.create_dataset('vel', data=vel_true) + +fout_init.close() +fout_true.close() + + +# %% [markdown] +# # prepare src station file +# +# The following code creates a src_rec_file for the inversion, which describes the source and receiver positions and arrival times. +# Format is as follows: +# +# ``` +# 26 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- src  : id_src year month day hour min sec lat lon dep_km mag num_recs id_event +# 26 1 PCBI 1.8900 98.9253 1000.0000 P 10.40 18.000 <- arrival : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arrival_time_sec +# 26 2 MRPI 1.6125 99.3172 1100.0000 P 50.84 19.400 +# 26 3 HUTI 2.3153 98.9711 1600.0000 P 57.84 19.200 +# .... +# +# ``` + +# %% +import random +random.seed(1145141919810) + +# dummys +year_dummy = 1998 +month_dummy = 1 +day_dummy = 1 +hour_dummy = 0 +minute_dummy = 0 +second_dummy = 0 +mag_dummy = 3.0 +id_dummy = 1000 +st_name_dummy = 'AAAA' +phase_dummy = 'P' +arriv_t_dummy = 0.0 +weight_dummy = 0.444 + +tt1deg = tt1 * 180.0/math.pi +tt2deg = tt2 * 180.0/math.pi +pp1deg = pp1 * 180.0/math.pi +pp2deg = pp2 * 180.0/math.pi + + +n_srcs = [10,20,20] +#n_srcs = [2,1,1] +n_src = n_srcs[0]*n_srcs[1]*n_srcs[2] +n_rec = [30 for x in range(n_src)] + +lines = [] + +nij_rec = math.sqrt(n_rec[0]) + +pos_src=[] +pos_rec=[] + + +# create receiver coordinates +elev_recs=[] +lon_recs=[] +lat_recs=[] +rec_names=[] +for i in range(n_rec[0]): + #elev_recs.append(random.uniform(-100.0,-100.0)) # elevation in m + #elev_recs.append(0) # elevation in m + #lon_recs .append(random.uniform(pp1deg*1.1,pp2deg*0.9)) + #lat_recs .append(random.uniform(tt1deg*1.1,tt2deg*0.9)) + rec_names.append(i) + # regularly + elev_recs.append(0.0) + tmp_ilon = i%nij_rec + tmp_ilat = int(i/nij_rec) + lon_recs.append(pp1deg + tmp_ilon*(pp2deg-pp1deg)/nij_rec) + lat_recs.append(tt1deg + tmp_ilat*(tt2deg-tt1deg)/nij_rec) + + + +# create source coordinates +for ir in range(n_srcs[0]): + for it in range(n_srcs[1]): + for ip in range(n_srcs[2]): + i_src = ir*n_srcs[1]*n_srcs[2] + it*n_srcs[2] + ip + # define one point in the domain (rr1 bottom, rr2 top) + # random + #dep = random.uniform((R_earth-rr1)*0.5,(R_earth-rr1)*0.98) + #lon = random.uniform(pp1deg,pp2deg) + #lat = random.uniform(tt1deg,tt2deg) + + # regular + dep = (R_earth-rr1)/n_srcs[0]*ir + lon = pp1deg + ip*(pp2deg-pp1deg)/n_srcs[2] + lat = tt1deg + it*(tt2deg-tt1deg)/n_srcs[1] + + # put independent name for each source + id_dummy = "src_"+str(i_src) + + src = [i_src, year_dummy, month_dummy, day_dummy, hour_dummy, minute_dummy, second_dummy, lat, lon, dep, mag_dummy, n_rec[i_src], id_dummy, weight_dummy] + lines.append(src) + + pos_src.append([lon,lat,dep]) + + + # create dummy station + for i_rec in range(n_rec[i_src]): + elev_rec = elev_recs[i_rec] + lon_rec = lon_recs[i_rec] + lat_rec = lat_recs[i_rec] + st_name_dummy = "rec_"+str(rec_names[i_rec]) + + rec = [i_src, i_rec, st_name_dummy, lat_rec, lon_rec, elev_rec, phase_dummy, arriv_t_dummy, weight_dummy] + lines.append(rec) + + pos_rec.append([lon_rec,lat_rec,elev_rec]) + + +# write out ev_arrivals file +fname = 'src_rec_test.dat' + +with open(fname, 'w') as f: + for line in lines: + for elem in line: + f.write('{} '.format(elem)) + f.write('\n') + + +# %% +# draw src and rec positions +import matplotlib.pyplot as plt + +for i_src in range(n_src): + plt.scatter(pos_src[i_src][1],pos_src[i_src][0],c='r',marker='o') + +# %% +# plot receivers +for i_rec in range(n_rec[0]): + plt.scatter(pos_rec[i_rec][1],pos_rec[i_rec][0],c='b',marker='o') + +# %% + + + diff --git a/test/old_tests/update_input_file/params_log.yaml b/test/old_tests/update_input_file/params_log.yaml new file mode 100644 index 0000000..b70a224 --- /dev/null +++ b/test/old_tests/update_input_file/params_log.yaml @@ -0,0 +1,236 @@ +version: 2 + +domain: + min_max_dep: [-10, 10] # depth in km + min_max_lat: [37.7, 42.3] # latitude in degree + min_max_lon: [22.7, 27.3] # longitude in degree + n_rtp: [10, 50, 50] # number of nodes in depth,latitude,longitude direction + +source: + src_rec_file: OUTPUT_FILES/src_rec_file_forward.dat # source receiver file path + swap_src_rec: true # swap source and receiver + +model: + init_model_path: ./test_model_init.h5 # path to initial model file +# model_1d_name: dummy_model_1d_name # 1D model name used in teleseismic 2D solver (iasp91, ak135, user_defined is available), defined in include/1d_model.h + +parallel: # parameters for parallel computation + n_sims: 1 # number of simultanoues runs + ndiv_rtp: [1, 2, 2] # number of subdivision on each direction + nproc_sub: 2 # number of processors for sweep parallelization + use_gpu: true # 1 if use gpu (EXPERIMENTAL) + +output_setting: + ######### moved to here + output_dir: ./OUTPUT_FILES/ # path to output director (default is ./OUTPUT_FILES/) + + output_source_field: false # output the calculated field of all sources 1 for yes; 0 for no; default: 1 + output_model_dat: false # output model_parameters_inv_0000.dat or not. 1 for yes; 0 for no; default: 1 + ######is_verbose_output: 0 # output internal parameters, if no, only model parameters are out. 1 for yes; 0 for no; default: 0 + output_final_model: true # output merged final model or not. 1 for yes; 0 for no; default: 1 + output_in_process: true # output model at each inv iteration or not. 1 for yes; 0 for no; default: 1 + single_precision_output: false # output results in single precision or not. 1 for yes; 0 for no; default: 0 + ##### new feature !!! + verbose_output_level: 0 # output internal parameters, if 0, only model parameters are out. Higher level, more internal parameters are output. default: 0 + + output_file_format: 0 + +##### moved to here!! +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion+earthquake relocation +run_mode: 1 + +##### new section +# parameters for model update (inversion) +# ignored if run_mode is not 1 or 3 +model_update: + #run_or_not: true # true for run model update, false for not model update + #### name slighly changed !!! + max_iterations: 3 # maximum number of inversion iterations + + optim_method: 1 # optimization method. 0 : grad_descent, 1 : halve-stepping, 2 : lbfgs (EXPERIMENTAL) + + # common parameters for all optim methods + step_length: 0.01 # step length of model perturbation at each iteration. 0.01 means maximum 1% perturbation for each iteration. + + # parameters for optim_method 0 (grad_descent) + optim_method_0: + step_length_decay: 0.9 # if objective function increase, step size -> step length * step_length_decay. default: 0.9 + #####step_size_sc: 0.001 # ... # use it also ? + + # parameters for optim_method 1 (halve-stepping) or 2 (lbfgs) + optim_method_1_2: + max_sub_iterations: 10 # maximum number of each sub-iteration + regularization_weight: 100 # weight value for regularization (lbfgs mode only) + + # smoothing + smoothing: + smooth_method: 0 # 0: multiparametrization, 1: laplacian smoothing (EXPERIMENTAL) + l_smooth_rtp: [1, 1, 1] # smoothing coefficients for laplacian smoothing + + # parameters for smooth method 0 (multigrid model parametrization) + n_inversion_grid: 5 # number of inversion grid sets + + # inversion grid type + type_invgrid_dep: 1 # 0: uniform inversion grid, 1: flexible grid + type_invgrid_lat: 0 # 0: uniform inversion grid, 1: flexible grid + type_invgrid_lon: 0 # 0: uniform inversion grid, 1: flexible grid + + # settings for uniform inversion grid (if type_*_inv : 0) + n_inv_dep_lat_lon: [5, 10, 10] # number of the base inversion grid points (ignored if type_*_inv : 1) + min_max_dep_inv: [-10, 10] # depth in km (Radius of the earth is defined in config.h/R_earth) (ignored if type_dep_inv : 1) + min_max_lat_inv: [37.7, 42.3] # latitude in degree + min_max_lon_inv: [22.7, 27.3] # longitude in degree + + # settings for flexible inversion grid (if type_*_inv : 1) + dep_inv: [-10.0, -7.5, -5.0, -2.5, 0.0, 2.5, 5.0, 7.5, 10.0] # depth in km (Radius of the earth is defined in config.h/R_earth) + lat_inv: [0.0, 1.0] # latitude in degree (ignored if type_lat_inv : 0) + lon_inv: [0.0, 1.0] # longitude in degree (ignored if type_lon_inv : 0) + + # path to station correction file + sta_correction_file: dummy_sta_correction_file # station correction file path + + ## + ## new feature !!! + ## + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time: true # 'true' for using absolute traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. wt = residual_weight[2] for res < residual_weight[0]. wt = residual_weight[3] for res > residual_weight[1], and linear weight in between. + distance_weight: [50.0, 150.0, 1.0, 0.1] # weight of epicenter distance. wt = distance_weight[2] for dis < distance_weight[0]. wt = distance_weight[3] for dis > distance_weight[1], and linear weight in between. + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + use_cs_time: true # 'true' for using common source differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. + azimuthal_weight: [15.0, 30.0, 1.0, 0.1] # weight of azimuth between two stations. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time: true # 'true' for using common receiver differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. + azimuthal_weight: [15.0, 30.0, 1.0, 0.1] # weight of azimuth between two earthquakes. + + # -------------- global weight of different types of data (to balance the weight of different data) -------------- + global_weight: + balance_data_weight: true # yes: over the total weight of the each type of the data. the obj of different data means the average data misfit; no: use original weight (below weight for each type of data needs to be set) + abs_time_weight: 1.0 # weight of absolute traveltime data, default: 1.0 + cs_dif_time_local_weight: 1.0 # weight of common source differential traveltime data, default: 1.0 + cr_dif_time_local_weight: 1.0 # weight of common receiver differential traveltime data, default: 1.0 + teleseismic_weight: 1.0 # weight of teleseismic data, default: 1.0 (exclude in this version) + + # -------------- inversion parameters (exclude in this version) -------------- + update_slowness : true # update slowness (velocity) or not. default: true + update_azi_ani : false # update azimuthal anisotropy (xi, eta) or not. default: false + update_rad_ani : false # update radial anisotropy (in future) or not. default: false + + # -------------- for teleseismic inversion (exclude in this version) -------------- + ## changed from kernel_taper + depth_taper : [-200.0, -100.0] # kernel weight : depth. --> 0: -inf ~ taper[0]; 0 ~ 1 : taper[0] ~ taper[1]; 1 : taper[1] ~ inf + + +# this top tag is not necessary +########inversion: + ###########run_mode: 1 # 0 for forward simulation only, 1 for inversion + ###########output_dir: ./OUTPUT_FILES/ # path to output director (default is ./OUTPUT_FILES/) + ###########optim_method: 1 # optimization method. 0 : grad_descent, 1 : halve-stepping, 2 : lbfgs (EXPERIMENTAL) + ####max_iterations_inv: 3 # maximum number of inversion iterations + #####step_size: 0.001 # initial step size for model update + #####step_size_sc: 0.001 # ... + #####step_size_decay: 0.9 # ... + #####smooth_method: 0 # 0: multiparametrization, 1: laplacian smoothing (EXPERIMENTAL) + + # parameters for multiparametric inversion + ######n_inversion_grid: 5 # number of inversion grid sets + #######n_inv_dep_lat_lon: [5, 10, 10] # number of the base inversion grid points + ########sta_correction_file: dummy_sta_correction_file # station correction file path + #######type_dep_inv: 0 # 0: uniform inversion grid, 1: flexible grid + #######type_lat_inv: 0 # 0: uniform inversion grid, 1: flexible grid + #######type_lon_inv: 0 # 0: uniform inversion grid, 1: flexible grid + + # parameters for uniform inversion grid + #####min_max_dep_inv: [-10, 10] # depth in km (Radius of the earth is defined in config.h/R_earth) + #####min_max_lat_inv: [37.7, 42.3] # latitude in degree + #####min_max_lon_inv: [22.7, 27.3] # longitude in degree + + # parameters for flexible inversion grid +# n_inv_r_flex: 3 +# dep_inv: [1, 1, 1] +# n_inv_t_flex: 3 +# lat_inv: [1, 1, 1] +# n_inv_p_flex: 3 +# lon_inv: [1, 1, 1] + +# parameters for halve-stepping or lbfg mode +####max_sub_iterations: 10 # maximum number of each sub-iteration +######l_smooth_rtp: [1, 1, 1] # smoothing coefficients for laplacian smoothing +######regularization_weight: 100 # weight value for regularization (lbfgs mode only) + +### new section !!! +################################################# +# relocation parameters setting # +################################################# +relocation: # update earthquake hypocenter and origin time (when run_mode : 1) + ###yes_or_no : yes # 'yes' for relocating earthquakes; 'no' for not relocating earthquakes (no need to set parameters in this section); + + # relocation_strategy + step_length : 0.01 # step length of relocation perturbation at each iteration. 0.01 means maximum 1% perturbation for each iteration. + step_length_decay : 0.9 # if objective function increase, step size -> step length * step_length_decay. default: 0.9 + rescaling_dep_lat_lon_ortime : [10.0, 10.0, 10.0, 1.0] # The perturbation is related to . Unit: km,km,km,second + max_change_dep_lat_lon_ortime : [5.0, 5.0, 5.0, 0.5] # the change of dep,lat,lon,ortime do not exceed max_change. Unit: km,km,km,second + max_iterations : 100 # maximum number of iterations for relocation + + # more option for using different types of data is under development (following) + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time : yes # 'yes' for using absolute traveltime data to update model parameters; 'no' for not using (no need to set parameters in this section) + residual_weight : [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. wt = residual_weight[2] for res < residual_weight[0]. wt = residual_weight[3] for res > residual_weight[1], and linear weight in between. + distance_weight : [50.0, 150.0, 1.0, 0.1] # weight of epicenter distance. wt = distance_weight[2] for dis < distance_weight[0]. wt = distance_weight[3] for dis > distance_weight[1], and linear weight in between. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time : true # 'yes' for using common receiver differential traveltime data to update model parameters; 'no' for not using (no need to set parameters in this section) + residual_weight : [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. + distance_weight : [10.0, 30.0, 1.0, 0.1] # weight of distance (km) between two earthquakes. + + + +#### the name of this tag is changed !!! +#inv_strategy: # flags for selecting the target parameters to be inversed +inversion_strategy: + + # this flag is not used, because the function is duplicated with "run_mode" + #inv_mode : 0 # 0 for update model parameters and relocation iteratively. (other options for future work) + + ####is_inv_slowness: true # 1: slowness value will be calculated in inversion, 0: will not be calculated + ####is_inv_azi_ani: true # 1: azimuth anisotropy value will be calculated in inversion, 0: will not be calculated + ####is_inv_rad_ani: 0 # flag for radial anisotropy (Not implemented yet) + ####kernel_taper: [-1e+07, -1e+07] + ####is_sta_correction: 0 + + inv_mode : 0 # 0 for update model parameters and relocation iteratively. (other options for future work) + + # for inv_mode : 0, parameters below are required + inv_mode_0: # Fristly, do relocation; Subsequently, do relocation every N steps; Finally, do relocation + relocation_first : true # yes: do relocation first; no: do not relocation first. default: yes + relocation_first_iterations : 10 # maximum number of iterations for relocation in the beginning. default: 10 + relocation_every_N_steps : 5 # subsequently, do relocation every N steps of updating model parameters. The iteration of relocation follows in Section + relocation_final : true # yes: do relocation finally; no: do not relocation finally. default: yes + relocation_final_iterations : 10 # maximum number of iterations for relocation in the beginning. default: 10 + + + + +######################################################################## +# Scheme of Eikonal solver (fast sweeping method) # +######################################################################## +calculation: + convergence_tolerance: 0.0001 # threshold value for checking the convergence for each forward/adjoint run + max_iterations: 500 # number of maximum iteration for each forward/adjoint run + stencil_order: 3 # order of stencil, 1 or 3 + stencil_type: 0 # 0: , 1: first-order upwind scheme (only sweep_type 0 is supported) + sweep_type: 1 # 0: legacy, 1: cuthill-mckee with shm parallelization + #######output_file_format: 0 diff --git a/test/old_tests/update_input_file/params_log_old.yaml b/test/old_tests/update_input_file/params_log_old.yaml new file mode 100644 index 0000000..bc702fb --- /dev/null +++ b/test/old_tests/update_input_file/params_log_old.yaml @@ -0,0 +1,80 @@ +version: 2 + +domain: + min_max_dep: [-10, 10] # depth in km + min_max_lat: [37.7, 42.3] # latitude in degree + min_max_lon: [22.7, 27.3] # longitude in degree + n_rtp: [10, 50, 50] # number of nodes in depth,latitude,longitude direction + +source: + src_rec_file: OUTPUT_FILES/src_rec_file_forward.dat # source receiver file path + swap_src_rec: 1 # swap source and receiver (1: yes, 0: no) + +model: + init_model_path: ./test_model_init.h5 # path to initial model file +# model_1d_name: dummy_model_1d_name # 1D model name used in teleseismic 2D solver (iasp91, ak135, user_defined is available), defined in include/1d_model.h + +inversion: + run_mode: 1 # 0 for forward simulation only, 1 for inversion + output_dir: ./OUTPUT_FILES/ # path to output director (default is ./OUTPUT_FILES/) + optim_method: 1 # optimization method. 0 : grad_descent, 1 : halve-stepping, 2 : lbfgs (EXPERIMENTAL) + max_iterations_inv: 3 # maximum number of inversion iterations + step_size: 0.001 # initial step size for model update + step_size_sc: 0.001 # ... + step_size_decay: 0.9 # ... + smooth_method: 0 # 0: multiparametrization, 1: laplacian smoothing (EXPERIMENTAL) + + # parameters for multiparametric inversion + n_inversion_grid: 5 # number of inversion grid sets + n_inv_dep_lat_lon: [5, 10, 10] # number of the base inversion grid points +# sta_correction_file: dummy_sta_correction_file # station correction file path + type_dep_inv: 0 # 0: uniform inversion grid, 1: flexible grid + type_lat_inv: 0 # 0: uniform inversion grid, 1: flexible grid + type_lon_inv: 0 # 0: uniform inversion grid, 1: flexible grid + + # parameters for uniform inversion grid + min_max_dep_inv: [-10, 10] # depth in km (Radius of the earth is defined in config.h/R_earth) + min_max_lat_inv: [37.7, 42.3] # latitude in degree + min_max_lon_inv: [22.7, 27.3] # longitude in degree + + # parameters for flexible inversion grid +# n_inv_r_flex: 3 +# dep_inv: [1, 1, 1] +# n_inv_t_flex: 3 +# lat_inv: [1, 1, 1] +# n_inv_p_flex: 3 +# lon_inv: [1, 1, 1] + + # parameters for halve-stepping or lbfg mode + max_sub_iterations: 10 # maximum number of each sub-iteration + l_smooth_rtp: [1, 1, 1] # smoothing coefficients for laplacian smoothing + regularization_weight: 100 # weight value for regularization (lbfgs mode only) + +inv_strategy: # flags for selecting the target parameters to be inversed + is_inv_slowness: 1 # 1: slowness value will be calculated in inversion, 0: will not be calculated + is_inv_azi_ani: 1 # 1: azimuth anisotropy value will be calculated in inversion, 0: will not be calculated + is_inv_rad_ani: 0 # flag for radial anisotropy (Not implemented yet) + kernel_taper: [-1e+07, -1e+07] + is_sta_correction: 0 + +parallel: # parameters for parallel computation + n_sims: 1 # number of simultanoues runs + ndiv_rtp: [1, 2, 2] # number of subdivision on each direction + nproc_sub: 2 # number of processors for sweep parallelization + use_gpu: 0 # 1 if use gpu (EXPERIMENTAL) + +calculation: + convergence_tolerance: 0.0001 # threshold value for checking the convergence for each forward/adjoint run + max_iterations: 500 # number of maximum iteration for each forward/adjoint run + stencil_order: 3 # order of stencil, 1 or 3 + stencil_type: 0 # 0: , 1: first-order upwind scheme (only sweep_type 0 is supported) + sweep_type: 1 # 0: legacy, 1: cuthill-mckee with shm parallelization + output_file_format: 0 + +output_setting: + is_output_source_field: 0 # output the calculated field of all sources 1 for yes; 0 for no; default: 1 + is_output_model_dat: 0 # output model_parameters_inv_0000.dat or not. 1 for yes; 0 for no; default: 1 + is_verbose_output: 0 # output internal parameters, if no, only model parameters are out. 1 for yes; 0 for no; default: 0 + is_output_final_model: 1 # output merged final model or not. 1 for yes; 0 for no; default: 1 + is_output_in_process: 1 # output model at each inv iteration or not. 1 for yes; 0 for no; default: 1 + is_single_precision_output: 0 # output results in single precision or not. 1 for yes; 0 for no; default: 0 diff --git a/test/old_tests/update_input_file/params_log_old.yaml.v3.yaml b/test/old_tests/update_input_file/params_log_old.yaml.v3.yaml new file mode 100644 index 0000000..a6d5722 --- /dev/null +++ b/test/old_tests/update_input_file/params_log_old.yaml.v3.yaml @@ -0,0 +1,182 @@ +version: 3 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-10, 10] # depth in km + min_max_lat: [37.7, 42.3] # latitude in degree + min_max_lon: [22.7, 27.3] # longitude in degree + n_rtp: [10, 50, 50] # number of nodes in depth,latitude,longitude direction + +source: + src_rec_file: OUTPUT_FILES/src_rec_file_forward.dat # source receiver file path + swap_src_rec: 1 # swap source and receiver (1: yes, 0: no) + +model: + init_model_path: ./test_model_init.h5 # path to initial model file +# model_1d_name: dummy_model_1d_name # 1D model name used in teleseismic 2D solver (iasp91, ak135, user_defined is available), defined in include/1d_model.h + +parallel: # parameters for parallel computation + n_sims: 1 # number of simultanoues runs + ndiv_rtp: [1, 2, 2] # number of subdivision on each direction + nproc_sub: 2 # number of processors for sweep parallelization + use_gpu: false # 1 if use gpu (EXPERIMENTAL) + +output_setting: + output_dir: ./OUTPUT_FILES/ # path to output director (default is ./OUTPUT_FILES/) + output_source_field: false # output the calculated field of all sources 1 for yes; 0 for no; default: 1 + output_model_dat: false # output model_parameters_inv_0000.dat or not. 1 for yes; 0 for no; default: 1 + output_final_model: true # output merged final model or not. 1 for yes; 0 for no; default: 1 + output_in_process: true # output model at each inv iteration or not. 1 for yes; 0 for no; default: 1 + single_precision_output: false # output results in single precision or not. 1 for yes; 0 for no; default: 0 + verbose_output_level: 0 # output internal parameters, if 0, only model parameters are out. Higher level, more internal parameters are output. default: 0 + output_file_format: 0 + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion+earthquake relocation +run_mode: 1 + + +################################################### +# model update parameters setting # +################################################### +model_update: # update model parameters (when run_mode : 1 and 3) + max_iterations: 3 # maximum number of inversion iterations + optim_method: 1 # optimization method. 0 : grad_descent, 1 : halve-stepping, 2 : lbfgs (EXPERIMENTAL) + + # common parameters for all optim methods + step_length: 0.01 # step length of model perturbation at each iteration. 0.01 means maximum 1% perturbation for each iteration. + + # parameters for optim_method 0 (grad_descent) + optim_method_0: + step_length_decay: 0.9 # if objective function increase, step size -> step length * step_length_decay. default: 0.9 + step_length_sc: 0.001 # ... # use it also ? + + # parameters for optim_method 1 (halve-stepping) or 2 (lbfgs) + optim_method_1_2: + max_sub_iterations: 10 # maximum number of each sub-iteration + regularization_weight: 100 # weight value for regularization (lbfgs mode only) + + # smoothing + smoothing: + smooth_method: 0 # 0: multiparametrization, 1: laplacian smoothing (EXPERIMENTAL) + l_smooth_rtp: [1, 1, 1] # smoothing coefficients for laplacian smoothing + + # parameters for smooth method 0 (multigrid model parametrization) + n_inversion_grid: 5 # number of inversion grid sets + + # inversion grid type + type_invgrid_dep: 1 # 0: uniform inversion grid, 1: flexible grid + type_invgrid_lat: 0 # 0: uniform inversion grid, 1: flexible grid + type_invgrid_lon: 0 # 0: uniform inversion grid, 1: flexible grid + + # settings for uniform inversion grid (if type_*_inv : 0) + n_inv_dep_lat_lon: [5, 10, 10] # number of the base inversion grid points (ignored if type_*_inv : 1) + min_max_dep_inv: [-10, 10] # depth in km (Radius of the earth is defined in config.h/R_earth) (ignored if type_dep_inv : 1) + min_max_lat_inv: [37.7, 42.3] # latitude in degree + min_max_lon_inv: [22.7, 27.3] # longitude in degree + + # settings for flexible inversion grid (if type_*_inv : 1) + dep_inv: [-10.0, -7.5, -5.0, -2.5, 0.0, 2.5, 5.0, 7.5, 10.0] # depth in km (Radius of the earth is defined in config.h/R_earth) + lat_inv: [0.0, 1.0] # latitude in degree (ignored if type_lat_inv : 0) + lon_inv: [0.0, 1.0] # longitude in degree (ignored if type_lon_inv : 0) + + # path to station correction file + sta_correction_file: dummy_sta_correction_file # station correction file path + + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time: true # 'true' for using absolute traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. wt = residual_weight[2] for res < residual_weight[0]. wt = residual_weight[3] for res > residual_weight[1], and linear weight in between. + distance_weight: [50.0, 150.0, 1.0, 0.1] # weight of epicenter distance. wt = distance_weight[2] for dis < distance_weight[0]. wt = distance_weight[3] for dis > distance_weight[1], and linear weight in between. + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + use_cs_time: true # 'true' for using common source differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. + azimuthal_weight: [15.0, 30.0, 1.0, 0.1] # weight of azimuth between two stations. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time: true # 'true' for using common receiver differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. + azimuthal_weight: [15.0, 30.0, 1.0, 0.1] # weight of azimuth between two earthquakes. + + # -------------- global weight of different types of data (to balance the weight of different data) -------------- + global_weight: + balance_data_weight: true # yes: over the total weight of the each type of the data. the obj of different data means the average data misfit; no: use original weight (below weight for each type of data needs to be set) + abs_time_weight: 1.0 # weight of absolute traveltime data, default: 1.0 + cs_dif_time_local_weight: 1.0 # weight of common source differential traveltime data, default: 1.0 + cr_dif_time_local_weight: 1.0 # weight of common receiver differential traveltime data, default: 1.0 + teleseismic_weight: 1.0 # weight of teleseismic data, default: 1.0 (exclude in this version) + + # -------------- inversion parameters (exclude in this version) -------------- + update_slowness: true # update slowness (velocity) or not. default: true + update_azi_ani: false # update azimuthal anisotropy (xi, eta) or not. default: false + update_rad_ani: false # update radial anisotropy (in future) or not. default: false + + # -------------- for teleseismic inversion (exclude in this version) -------------- + depth_taper: [-200.0, -100.0] # kernel weight : depth. --> 0: -inf ~ taper[0]; 0 ~ 1 : taper[0] ~ taper[1]; 1 : taper[1] ~ inf + +################################################# +# relocation parameters setting # +################################################# +relocation: # update earthquake hypocenter and origin time (when run_mode : 1) + + # relocation_strategy + step_length: 0.01 # step length of relocation perturbation at each iteration. 0.01 means maximum 1% perturbation for each iteration. + step_length_decay: 0.9 # if objective function increase, step size -> step length * step_length_decay. default: 0.9 + rescaling_dep_lat_lon_ortime: [10.0, 10.0, 10.0, 1.0] # The perturbation is related to . Unit: km,km,km,second + max_change_dep_lat_lon_ortime: [5.0, 5.0, 5.0, 0.5] # the change of dep,lat,lon,ortime do not exceed max_change. Unit: km,km,km,second + max_iterations: 100 # maximum number of iterations for relocation + + # more option for using different types of data is under development (following) + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time: yes # 'yes' for using absolute traveltime data to update model parameters; 'no' for not using (no need to set parameters in this section) + residual_weight: [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. wt = residual_weight[2] for res < residual_weight[0]. wt = residual_weight[3] for res > residual_weight[1], and linear weight in between. + distance_weight: [50.0, 150.0, 1.0, 0.1] # weight of epicenter distance. wt = distance_weight[2] for dis < distance_weight[0]. wt = distance_weight[3] for dis > distance_weight[1], and linear weight in between. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time: true # 'yes' for using common receiver differential traveltime data to update model parameters; 'no' for not using (no need to set parameters in this section) + residual_weight: [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. + distance_weight: [10.0, 30.0, 1.0, 0.1] # weight of distance (km) between two earthquakes. + + +#################################################################### +# inversion strategy for tomography and relocation # +#################################################################### +inversion_strategy: # update model parameters and earthquake hypocenter iteratively (when run_mode : 3) + + inv_mode: 0 # 0 for update model parameters and relocation iteratively. (other options for future work) + + # for inv_mode : 0, parameters below are required + inv_mode_0: # Fristly, do relocation; Subsequently, do relocation every N steps; Finally, do relocation + relocation_first: true # yes: do relocation first; no: do not relocation first. default: yes + relocation_first_iterations: 10 # maximum number of iterations for relocation in the beginning. default: 10 + relocation_every_N_steps: 5 # subsequently, do relocation every N steps of updating model parameters. The iteration of relocation follows in Section + relocation_final: true # yes: do relocation finally; no: do not relocation finally. default: yes + relocation_final_iterations: 10 # maximum number of iterations for relocation in the beginning. default: 10 + + + +# --- parameters for core solver --------------------------------------------------------- +# --- please do not change the following parameters unless you know what you are doing --- + +######################################################################## +# Scheme of Eikonal solver (fast sweeping method) # +######################################################################## +calculation: + convergence_tolerance: 0.0001 # threshold value for checking the convergence for each forward/adjoint run + max_iterations: 500 # number of maximum iteration for each forward/adjoint run + stencil_order: 3 # order of stencil, 1 or 3 + stencil_type: 0 # 0: , 1: first-order upwind scheme (only sweep_type 0 is supported) + sweep_type: 1 # 0: legacy, 1: cuthill-mckee with shm parallelization diff --git a/test/old_tests/update_input_file/params_model_v3.yaml b/test/old_tests/update_input_file/params_model_v3.yaml new file mode 100644 index 0000000..f02aa14 --- /dev/null +++ b/test/old_tests/update_input_file/params_model_v3.yaml @@ -0,0 +1,206 @@ +version: 2 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-10, 10] # depth in km + min_max_lat: [37.7, 42.3] # latitude in degree + min_max_lon: [22.7, 27.3] # longitude in degree + n_rtp: [10, 50, 50] # number of nodes in depth,latitude,longitude direction + + +################################################# +# traveltime data file path # +################################################# +source: + src_rec_file: OUTPUT_FILES/src_rec_file_forward.dat ### source receiver file path + swap_src_rec: true # swap source and receiver + + +################################################# +# initial model file path # +################################################# +model: + init_model_path: ./test_model_init.h5 # path to initial model file + + +################################################# +# parallel computation settings # +################################################# +parallel: # parameters for parallel computation + n_sims: 1 # number of simultanoues runs + ndiv_rtp: [1, 2, 2] # number of subdivision on each direction + nproc_sub: 2 # number of processors for sweep parallelization + use_gpu: true # true if use gpu (EXPERIMENTAL) + + +############################################ +# output file setting # +############################################ +output_setting: + output_dir: ./OUTPUT_FILES/ # path to output director (default is ./OUTPUT_FILES/) + output_source_field: false # output the calculated field of all sources 1 for yes; 0 for no; default: 1 + output_model_dat: false # output model_parameters_inv_0000.dat or not. 1 for yes; 0 for no; default: 1 + output_final_model: true # output merged final model or not. 1 for yes; 0 for no; default: 1 + output_in_process: true # output model at each inv iteration or not. 1 for yes; 0 for no; default: 1 + single_precision_output: false # output results in single precision or not. 1 for yes; 0 for no; default: 0 + verbose_output_level: 0 # output internal parameters, if 0, only model parameters are out. Higher level, more internal parameters are output. default: 0 + output_file_format: 0 # in/output file format, if 0: HDF5, if 1: ASCII + + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion+earthquake relocation +run_mode: 1 + + +################################################### +# model update parameters setting # +################################################### +model_update: # update model parameters (when run_mode : 1 and 3) + max_iterations: 3 # maximum number of inversion iterations + optim_method: 1 # optimization method. 0 : grad_descent, 1 : halve-stepping, 2 : lbfgs (EXPERIMENTAL) + + # common parameters for all optim methods + step_length: 0.01 # step length of model perturbation at each iteration. 0.01 means maximum 1% perturbation for each iteration. + + # parameters for optim_method 0 (grad_descent) + optim_method_0: + step_length_decay: 0.9 # if objective function increase, step size -> step length * step_length_decay. default: 0.9 + step_length_sc: 0.001 # ... # use it also ? + + # parameters for optim_method 1 (halve-stepping) or 2 (lbfgs) + optim_method_1_2: + max_sub_iterations: 10 # maximum number of each sub-iteration + regularization_weight: 100 # weight value for regularization (lbfgs mode only) + + # smoothing + smoothing: + smooth_method: 0 # 0: multiparametrization, 1: laplacian smoothing (EXPERIMENTAL) + l_smooth_rtp: [1, 1, 1] # smoothing coefficients for laplacian smoothing + + # parameters for smooth method 0 (multigrid model parametrization) + n_inversion_grid: 5 # number of inversion grid sets + + # inversion grid type + type_invgrid_dep: 1 # 0: uniform inversion grid, 1: flexible grid + type_invgrid_lat: 0 # 0: uniform inversion grid, 1: flexible grid + type_invgrid_lon: 0 # 0: uniform inversion grid, 1: flexible grid + + # settings for uniform inversion grid (if type_*_inv : 0) + n_inv_dep_lat_lon: [5, 10, 10] # number of the base inversion grid points (ignored if type_*_inv : 1) + min_max_dep_inv: [-10, 10] # depth in km (Radius of the earth is defined in config.h/R_earth) (ignored if type_dep_inv : 1) + min_max_lat_inv: [37.7, 42.3] # latitude in degree + min_max_lon_inv: [22.7, 27.3] # longitude in degree + + # settings for flexible inversion grid (if type_*_inv : 1) + dep_inv: [-10.0, -7.5, -5.0, -2.5, 0.0, 2.5, 5.0, 7.5, 10.0] # depth in km (Radius of the earth is defined in config.h/R_earth) + lat_inv: [0.0, 1.0] # latitude in degree (ignored if type_lat_inv : 0) + lon_inv: [0.0, 1.0] # longitude in degree (ignored if type_lon_inv : 0) + + # path to station correction file + use_sta_correction: false + sta_correction_file: dummy_sta_correction_file # station correction file path + + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time: true # 'true' for using absolute traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. wt = residual_weight[2] for res < residual_weight[0]. wt = residual_weight[3] for res > residual_weight[1], and linear weight in between. + distance_weight: [50.0, 150.0, 1.0, 0.1] # weight of epicenter distance. wt = distance_weight[2] for dis < distance_weight[0]. wt = distance_weight[3] for dis > distance_weight[1], and linear weight in between. + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + use_cs_time: true # 'true' for using common source differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. + azimuthal_weight: [15.0, 30.0, 1.0, 0.1] # weight of azimuth between two stations. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time: true # 'true' for using common receiver differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. + azimuthal_weight: [15.0, 30.0, 1.0, 0.1] # weight of azimuth between two earthquakes. + + # -------------- global weight of different types of data (to balance the weight of different data) -------------- + global_weight: + balance_data_weight: true # yes: over the total weight of the each type of the data. the obj of different data means the average data misfit; no: use original weight (below weight for each type of data needs to be set) + abs_time_weight: 1.0 # weight of absolute traveltime data, default: 1.0 + cs_dif_time_local_weight: 1.0 # weight of common source differential traveltime data, default: 1.0 + cr_dif_time_local_weight: 1.0 # weight of common receiver differential traveltime data, default: 1.0 + teleseismic_weight: 1.0 # weight of teleseismic data, default: 1.0 (exclude in this version) + + # -------------- inversion parameters (exclude in this version) -------------- + update_slowness : true # update slowness (velocity) or not. default: true + update_azi_ani : false # update azimuthal anisotropy (xi, eta) or not. default: false + update_rad_ani : false # update radial anisotropy (in future) or not. default: false + + # -------------- for teleseismic inversion (exclude in this version) -------------- + depth_taper : [-200.0, -100.0] # kernel weight : depth. --> 0: -inf ~ taper[0]; 0 ~ 1 : taper[0] ~ taper[1]; 1 : taper[1] ~ inf + +################################################# +# relocation parameters setting # +################################################# +relocation: # update earthquake hypocenter and origin time (when run_mode : 1) + + # relocation_strategy + step_length : 0.01 # step length of relocation perturbation at each iteration. 0.01 means maximum 1% perturbation for each iteration. + step_length_decay : 0.9 # if objective function increase, step size -> step length * step_length_decay. default: 0.9 + rescaling_dep_lat_lon_ortime : [10.0, 10.0, 10.0, 1.0] # The perturbation is related to . Unit: km,km,km,second + max_change_dep_lat_lon_ortime : [5.0, 5.0, 5.0, 0.5] # the change of dep,lat,lon,ortime do not exceed max_change. Unit: km,km,km,second + max_iterations : 100 # maximum number of iterations for relocation + tol_gradient : 0.0001 # threshold value for checking the convergence for each iteration + + # params keeped for current version of relocation but may not be required + ortime_local_search : true # true: do local search for origin time; false: do not do local search for origin time + ref_ortime_change : 0.5 # reference value for origin time change (unit: second). If the change of origin time is larger than ref_ortime_change, do local search for origin time. + step_length_ortime_rescale : 0.1 # step length for rescaling origin time + + + # more option for using different types of data is under development (following) + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time : yes # 'yes' for using absolute traveltime data to update model parameters; 'no' for not using (no need to set parameters in this section) + residual_weight : [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. wt = residual_weight[2] for res < residual_weight[0]. wt = residual_weight[3] for res > residual_weight[1], and linear weight in between. + distance_weight : [50.0, 150.0, 1.0, 0.1] # weight of epicenter distance. wt = distance_weight[2] for dis < distance_weight[0]. wt = distance_weight[3] for dis > distance_weight[1], and linear weight in between. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time : true # 'yes' for using common receiver differential traveltime data to update model parameters; 'no' for not using (no need to set parameters in this section) + residual_weight : [1.0, 3.0, 1.0, 0.1] # weight (wt) of residual. + azimuthal_weight : [10.0, 30.0, 1.0, 0.1] # weight of azimuth (deg.) between two earthquakes. + + +#################################################################### +# inversion strategy for tomography and relocation # +#################################################################### +inversion_strategy: # update model parameters and earthquake hypocenter iteratively (when run_mode : 3) + + inv_mode : 0 # 0 for update model parameters and relocation iteratively. (other options for future work) + + # for inv_mode : 0, parameters below are required + inv_mode_0: # Fristly, do relocation; Subsequently, do relocation every N steps; Finally, do relocation + relocation_first : true # true: do relocation first; false: do not relocation first. default: true + relocation_first_iterations : 10 # maximum number of iterations for relocation in the beginning. default: 10 + relocation_every_N_steps : 5 # subsequently, do relocation every N steps of updating model parameters. The iteration of relocation follows in Section + relocation_final : true # true: do relocation finally; false: do not relocation finally. default: true + relocation_final_iterations : 10 # maximum number of iterations for relocation in the beginning. default: 10 + + + +# --- parameters for core solver --------------------------------------------------------- +# --- please do not change the following parameters unless you know what you are doing --- + +######################################################################## +# Scheme of Eikonal solver (fast sweeping method) # +######################################################################## +calculation: + convergence_tolerance: 0.0001 # threshold value for checking the convergence for each forward/adjoint run + max_iterations: 500 # number of maximum iteration for each forward/adjoint run + stencil_order: 3 # order of stencil, 1 or 3 + stencil_type: 0 # 0: , 1: first-order upwind scheme (only sweep_type 0 is supported) + sweep_type: 1 # 0: legacy, 1: cuthill-mckee with shm parallelization diff --git a/test/old_tests/update_input_file/run_this_example.sh b/test/old_tests/update_input_file/run_this_example.sh new file mode 100755 index 0000000..82830eb --- /dev/null +++ b/test/old_tests/update_input_file/run_this_example.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +python make_test_model.py + +# run for preparing true travel times +mpirun -n 2 ../../build/bin/TOMOATT -i input_params_pre.yml + +# run for inversion +mpirun -n 2 ../../build/bin/TOMOATT -i input_params.yml +#mpirun -n 8 ../../build/bin/TOMOATT -i input_params_flexible_inv_grid.yml + +# then final model can be plot by e.g. check_3d_out.ipynb +#paraview OUTPUT_FILES/out_data_sim.xmf diff --git a/test/old_tests/update_input_file/test.ipynb b/test/old_tests/update_input_file/test.ipynb new file mode 100644 index 0000000..255e98c --- /dev/null +++ b/test/old_tests/update_input_file/test.ipynb @@ -0,0 +1,312 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 165, + "metadata": {}, + "outputs": [], + "source": [ + "# load yaml files with ruamel.yaml\n", + "import sys\n", + "from ruamel.yaml import YAML\n", + "\n", + "yaml=YAML()\n", + "\n", + "fold = \"./params_log_old.yaml\"\n", + "fnew = \"./params_model_v3.yaml\"\n", + "\n", + "# load the old file as string\n", + "with open(fold, 'r') as f:\n", + " str_old = f.read()\n", + " params_in = yaml.load(str_old)\n", + "\n", + "# load the new file as string\n", + "with open(fnew, 'r') as f:\n", + " str_new = f.read()\n", + " params_v3 = yaml.load(str_new)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "metadata": {}, + "outputs": [], + "source": [ + "params_v3['domain'] = params_in['domain']" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "metadata": {}, + "outputs": [], + "source": [ + "params_v3['source'] = params_in['source']" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": {}, + "outputs": [], + "source": [ + "params_v3['model'] = params_in['model']" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": {}, + "outputs": [], + "source": [ + "params_v3['parallel'] = params_in['parallel']" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'n_sims': 1, 'ndiv_rtp': [1, 2, 2], 'nproc_sub': 2, 'use_gpu': 0}" + ] + }, + "execution_count": 170, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "params_v3['parallel']" + ] + }, + { + "cell_type": "code", + "execution_count": 171, + "metadata": {}, + "outputs": [], + "source": [ + "params_v3['parallel']['use_gpu'] = True" + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'n_sims': 1, 'ndiv_rtp': [1, 2, 2], 'nproc_sub': 2, 'use_gpu': True}" + ] + }, + "execution_count": 172, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "params_v3['parallel']" + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "metadata": {}, + "outputs": [], + "source": [ + "# dump params_v3 as a new file\n", + "fout = fold+\".v3.yaml\"\n", + "\n", + "with open(fout, 'w') as fp:\n", + " yaml.dump(params_v3, fp)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'src_rec_file': 'OUTPUT_FILES/src_rec_file_forward.dat', 'swap_src_rec': 1}" + ] + }, + "execution_count": 135, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "params_v3['source']" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'src_rec_file': 'OUTPUT_FILES/src_rec_file_forward.dat', 'swap_src_rec': 1}" + ] + }, + "execution_count": 124, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "params_in['source']" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'min_max_dep': [-10, 10],\n", + " 'min_max_lat': [37.7, 42.3],\n", + " 'min_max_lon': [22.7, 27.3],\n", + " 'n_rtp': [10, 50, 50]}" + ] + }, + "execution_count": 125, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "params_in['domain']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/old_tests/update_input_file/time.txt b/test/old_tests/update_input_file/time.txt new file mode 100644 index 0000000..2fbd9bb --- /dev/null +++ b/test/old_tests/update_input_file/time.txt @@ -0,0 +1,34561 @@ +Converged at iteration 41, L1 7.42432e-05, Linf 0.0183869, total time[s] 0.206752 +Converged at iteration 38, L1 9.21847e-05, Linf 0.0175603, total time[s] 0.228053 +Converged at iteration 30, L1 5.49574e-05, Linf 0.00759999, total time[s] 0.169244 +Converged at iteration 33, L1 7.20087e-05, Linf 0.0072676, total time[s] 0.218334 +Converged at iteration 23, L1 7.44298e-05, Linf 0.00681255, total time[s] 0.110601 +Converged at iteration 25, L1 6.29886e-05, Linf 0.00475444, total time[s] 0.165025 +Converged at iteration 28, L1 9.26739e-05, Linf 0.0162405, total time[s] 0.142694 +Converged at iteration 25, L1 5.41452e-05, Linf 0.00674061, total time[s] 0.143725 +Converged at iteration 29, L1 7.33528e-05, Linf 0.00911797, total time[s] 0.141193 +Converged at iteration 29, L1 7.1909e-05, Linf 0.0041999, total time[s] 0.148687 +Converged at iteration 21, L1 7.24063e-05, Linf 0.00386858, total time[s] 0.110028 +Converged at iteration 26, L1 9.15716e-05, Linf 0.0102676, total time[s] 0.167497 +Converged at iteration 23, L1 6.26362e-05, Linf 0.00569336, total time[s] 0.181866 +Converged at iteration 32, L1 6.42488e-05, Linf 0.00580398, total time[s] 0.18281 +Converged at iteration 35, L1 8.37157e-05, Linf 0.00775608, total time[s] 0.315682 +Converged at iteration 30, L1 7.41106e-05, Linf 0.00884236, total time[s] 0.185328 +Converged at iteration 27, L1 6.48901e-05, Linf 0.00743368, total time[s] 0.163285 +Converged at iteration 28, L1 8.05975e-05, Linf 0.00540306, total time[s] 0.157304 +Converged at iteration 29, L1 8.01748e-05, Linf 0.00450107, total time[s] 0.147741 +Converged at iteration 27, L1 8.6927e-05, Linf 0.00461716, total time[s] 0.124029 +Converged at iteration 37, L1 9.16411e-05, Linf 0.00737832, total time[s] 0.264089 +Converged at iteration 34, L1 6.56961e-05, Linf 0.00580949, total time[s] 0.157887 +Converged at iteration 34, L1 4.57576e-05, Linf 0.00751586, total time[s] 0.231009 +Converged at iteration 35, L1 9.40656e-05, Linf 0.00568961, total time[s] 0.161483 +Converged at iteration 36, L1 7.19972e-05, Linf 0.00699143, total time[s] 0.247116 +Converged at iteration 34, L1 5.3822e-05, Linf 0.00595232, total time[s] 0.156635 +Converged at iteration 33, L1 4.86311e-05, Linf 0.00836183, total time[s] 0.176122 +Converged at iteration 37, L1 6.09595e-05, Linf 0.0156775, total time[s] 0.171018 +Converged at iteration 29, L1 9.69467e-05, Linf 0.0123414, total time[s] 0.15328 +Converged at iteration 31, L1 8.20304e-05, Linf 0.0103058, total time[s] 0.235173 +Converged at iteration 35, L1 7.32632e-05, Linf 0.00328763, total time[s] 0.155084 +Converged at iteration 39, L1 9.80774e-05, Linf 0.00419203, total time[s] 0.180077 +Converged at iteration 31, L1 6.02421e-05, Linf 0.00496108, total time[s] 0.143241 +Converged at iteration 30, L1 9.37224e-05, Linf 0.00423518, total time[s] 0.138056 +Converged at iteration 22, L1 8.40505e-05, Linf 0.00446709, total time[s] 0.097747 +Converged at iteration 27, L1 6.1254e-05, Linf 0.00495794, total time[s] 0.152451 +Converged at iteration 24, L1 8.64275e-05, Linf 0.00479291, total time[s] 0.121408 +Converged at iteration 20, L1 9.34896e-05, Linf 0.0039534, total time[s] 0.09453 +Converged at iteration 26, L1 7.71676e-05, Linf 0.00536056, total time[s] 0.124622 +Converged at iteration 28, L1 7.15015e-05, Linf 0.00439544, total time[s] 0.122362 +Converged at iteration 19, L1 6.18591e-05, Linf 0.00384773, total time[s] 0.091729 +Converged at iteration 22, L1 7.10648e-05, Linf 0.00506896, total time[s] 0.105769 +Converged at iteration 20, L1 7.92957e-05, Linf 0.00447797, total time[s] 0.097436 +Converged at iteration 30, L1 7.47316e-05, Linf 0.0031698, total time[s] 0.151117 +Converged at iteration 31, L1 8.31401e-05, Linf 0.00538843, total time[s] 0.147199 +Converged at iteration 24, L1 6.53786e-05, Linf 0.00455289, total time[s] 0.10675 +Converged at iteration 24, L1 8.2642e-05, Linf 0.00444846, total time[s] 0.115126 +Converged at iteration 27, L1 9.26856e-05, Linf 0.00545834, total time[s] 0.118452 +Converged at iteration 26, L1 6.79241e-05, Linf 0.0042593, total time[s] 0.117244 +Converged at iteration 23, L1 8.71856e-05, Linf 0.00393248, total time[s] 0.107356 +Converged at iteration 33, L1 9.79803e-05, Linf 0.00481788, total time[s] 0.146323 +Converged at iteration 29, L1 7.33944e-05, Linf 0.00459106, total time[s] 0.155115 +Converged at iteration 28, L1 8.8278e-05, Linf 0.00301638, total time[s] 0.121668 +Converged at iteration 30, L1 8.99922e-05, Linf 0.00425831, total time[s] 0.146182 +Converged at iteration 37, L1 7.14867e-05, Linf 0.0031975, total time[s] 0.162136 +Converged at iteration 32, L1 8.97978e-05, Linf 0.00361223, total time[s] 0.162216 +Converged at iteration 28, L1 9.31858e-05, Linf 0.00419491, total time[s] 0.132478 +Converged at iteration 26, L1 8.59308e-05, Linf 0.00370952, total time[s] 0.1221 +Converged at iteration 33, L1 8.26796e-05, Linf 0.0046157, total time[s] 0.161335 +Converged at iteration 24, L1 8.25016e-05, Linf 0.00315268, total time[s] 0.098503 +Converged at iteration 35, L1 9.56299e-05, Linf 0.00636877, total time[s] 0.155892 +Converged at iteration 39, L1 5.8581e-05, Linf 0.0067558, total time[s] 0.180012 +Converged at iteration 30, L1 9.22524e-05, Linf 0.00593171, total time[s] 0.133701 +Converged at iteration 24, L1 7.54719e-05, Linf 0.00443952, total time[s] 0.118026 +Converged at iteration 21, L1 7.74136e-05, Linf 0.00409756, total time[s] 0.096807 +Converged at iteration 24, L1 8.1595e-05, Linf 0.00560002, total time[s] 0.107314 +Converged at iteration 19, L1 5.0347e-05, Linf 0.00464904, total time[s] 0.088007 +Converged at iteration 21, L1 3.53929e-05, Linf 0.00569443, total time[s] 0.09809 +Converged at iteration 23, L1 9.88082e-05, Linf 0.00626928, total time[s] 0.105478 +Converged at iteration 24, L1 6.09705e-05, Linf 0.00475574, total time[s] 0.114936 +Converged at iteration 20, L1 5.68793e-05, Linf 0.00530747, total time[s] 0.090439 +Converged at iteration 16, L1 8.92829e-05, Linf 0.00347308, total time[s] 0.084666 +Converged at iteration 19, L1 9.35951e-05, Linf 0.00700141, total time[s] 0.106061 +Converged at iteration 31, L1 7.28474e-05, Linf 0.00274743, total time[s] 0.142654 +Converged at iteration 26, L1 5.4562e-05, Linf 0.00496172, total time[s] 0.123168 +Converged at iteration 23, L1 7.17846e-05, Linf 0.00687562, total time[s] 0.10912 +Converged at iteration 20, L1 5.51942e-05, Linf 0.00356682, total time[s] 0.12177 +Converged at iteration 23, L1 4.99051e-05, Linf 0.00338349, total time[s] 0.103803 +Converged at iteration 22, L1 9.57456e-05, Linf 0.00486089, total time[s] 0.103482 +Converged at iteration 25, L1 8.51961e-05, Linf 0.00451546, total time[s] 0.123063 +Converged at iteration 28, L1 6.58443e-05, Linf 0.00333225, total time[s] 0.125331 +Converged at iteration 29, L1 6.54508e-05, Linf 0.00617529, total time[s] 0.144613 +Converged at iteration 27, L1 6.91984e-05, Linf 0.00379722, total time[s] 0.121697 +Converged at iteration 29, L1 6.31764e-05, Linf 0.0037093, total time[s] 0.14091 +Converged at iteration 29, L1 7.76869e-05, Linf 0.00282334, total time[s] 0.169268 +Converged at iteration 27, L1 9.62136e-05, Linf 0.00290939, total time[s] 0.121821 +Converged at iteration 32, L1 7.55118e-05, Linf 0.00661927, total time[s] 0.166984 +Converged at iteration 26, L1 7.20402e-05, Linf 0.00295121, total time[s] 0.161834 +Converged at iteration 25, L1 7.4973e-05, Linf 0.00244029, total time[s] 0.140945 +Converged at iteration 23, L1 6.52474e-05, Linf 0.00279665, total time[s] 0.185158 +Converged at iteration 35, L1 5.93939e-05, Linf 0.00946085, total time[s] 0.165407 +Converged at iteration 38, L1 6.12505e-05, Linf 0.011002, total time[s] 0.180286 +Converged at iteration 25, L1 4.75377e-05, Linf 0.00657587, total time[s] 0.116737 +Converged at iteration 30, L1 5.73495e-05, Linf 0.00586596, total time[s] 0.14266 +Converged at iteration 23, L1 5.06247e-05, Linf 0.00349052, total time[s] 0.113526 +Converged at iteration 22, L1 5.95477e-05, Linf 0.00477834, total time[s] 0.105776 +Converged at iteration 21, L1 5.38108e-05, Linf 0.00532297, total time[s] 0.101156 +Converged at iteration 19, L1 7.26704e-05, Linf 0.00727005, total time[s] 0.096084 +Converged at iteration 22, L1 6.03668e-05, Linf 0.00541518, total time[s] 0.106047 +Converged at iteration 23, L1 5.28349e-05, Linf 0.00372311, total time[s] 0.112128 +Converged at iteration 17, L1 9.26194e-05, Linf 0.00197894, total time[s] 0.085679 +Converged at iteration 20, L1 5.44158e-05, Linf 0.00432323, total time[s] 0.093576 +Converged at iteration 19, L1 9.33096e-05, Linf 0.00662314, total time[s] 0.096183 +Converged at iteration 31, L1 5.34956e-05, Linf 0.00505112, total time[s] 0.14564 +Converged at iteration 25, L1 8.76661e-05, Linf 0.00548242, total time[s] 0.136877 +Converged at iteration 22, L1 9.07936e-05, Linf 0.00658955, total time[s] 0.120082 +Converged at iteration 22, L1 6.66444e-05, Linf 0.00190822, total time[s] 0.122745 +Converged at iteration 24, L1 9.13523e-05, Linf 0.0030977, total time[s] 0.116508 +Converged at iteration 25, L1 7.31293e-05, Linf 0.00308859, total time[s] 0.131651 +Converged at iteration 23, L1 6.78589e-05, Linf 0.00278705, total time[s] 0.107891 +Converged at iteration 26, L1 7.58542e-05, Linf 0.00328977, total time[s] 0.129277 +Converged at iteration 30, L1 4.9913e-05, Linf 0.00355054, total time[s] 0.167637 +Converged at iteration 28, L1 8.53923e-05, Linf 0.00258764, total time[s] 0.13223 +Converged at iteration 29, L1 8.99289e-05, Linf 0.00543438, total time[s] 0.14581 +Converged at iteration 29, L1 8.58523e-05, Linf 0.00210003, total time[s] 0.187551 +Converged at iteration 29, L1 6.83462e-05, Linf 0.00256661, total time[s] 0.151716 +Converged at iteration 32, L1 5.42237e-05, Linf 0.00866026, total time[s] 0.171208 +Converged at iteration 26, L1 6.86562e-05, Linf 0.00398928, total time[s] 0.179841 +Converged at iteration 25, L1 8.8837e-05, Linf 0.00383863, total time[s] 0.120048 +Converged at iteration 23, L1 8.16061e-05, Linf 0.00365245, total time[s] 0.107156 +Converged at iteration 35, L1 3.95729e-05, Linf 0.0120517, total time[s] 0.169475 +Converged at iteration 37, L1 8.08597e-05, Linf 0.0175058, total time[s] 0.184164 +Converged at iteration 25, L1 6.78587e-05, Linf 0.00944575, total time[s] 0.122121 +Converged at iteration 28, L1 9.92812e-05, Linf 0.00827531, total time[s] 0.138618 +Converged at iteration 22, L1 4.73599e-05, Linf 0.00472631, total time[s] 0.106925 +Converged at iteration 22, L1 8.54219e-05, Linf 0.00406096, total time[s] 0.121589 +Converged at iteration 21, L1 8.77303e-05, Linf 0.00630079, total time[s] 0.108894 +Converged at iteration 20, L1 3.55671e-05, Linf 0.00576936, total time[s] 0.103626 +Converged at iteration 22, L1 6.68824e-05, Linf 0.00321947, total time[s] 0.118948 +Converged at iteration 23, L1 6.04812e-05, Linf 0.00326221, total time[s] 0.121837 +Converged at iteration 20, L1 9.14177e-05, Linf 0.00312112, total time[s] 0.090499 +Converged at iteration 18, L1 9.22643e-05, Linf 0.00308715, total time[s] 0.147685 +Converged at iteration 19, L1 9.31198e-05, Linf 0.00534201, total time[s] 0.101767 +Converged at iteration 31, L1 5.73703e-05, Linf 0.00694234, total time[s] 0.154034 +Converged at iteration 26, L1 5.04184e-05, Linf 0.00457167, total time[s] 0.133684 +Converged at iteration 22, L1 7.80172e-05, Linf 0.00507117, total time[s] 0.118917 +Converged at iteration 23, L1 6.32207e-05, Linf 0.00200875, total time[s] 0.111336 +Converged at iteration 25, L1 9.52579e-05, Linf 0.00331006, total time[s] 0.124864 +Converged at iteration 23, L1 7.83055e-05, Linf 0.00271869, total time[s] 0.108238 +Converged at iteration 24, L1 9.72831e-05, Linf 0.00394965, total time[s] 0.169713 +Converged at iteration 24, L1 6.80206e-05, Linf 0.00289292, total time[s] 0.112584 +Converged at iteration 31, L1 7.48217e-05, Linf 0.00447001, total time[s] 0.165091 +Converged at iteration 29, L1 8.56842e-05, Linf 0.00322109, total time[s] 0.14723 +Converged at iteration 30, L1 5.27263e-05, Linf 0.00552693, total time[s] 0.1376 +Converged at iteration 30, L1 5.94824e-05, Linf 0.00192502, total time[s] 0.139279 +Converged at iteration 31, L1 6.97355e-05, Linf 0.00349693, total time[s] 0.135414 +Converged at iteration 32, L1 4.79024e-05, Linf 0.0117912, total time[s] 0.148531 +Converged at iteration 24, L1 6.17473e-05, Linf 0.00446385, total time[s] 0.121003 +Converged at iteration 25, L1 8.51533e-05, Linf 0.00453752, total time[s] 0.116948 +Converged at iteration 24, L1 6.54649e-05, Linf 0.0029654, total time[s] 0.132109 +Converged at iteration 35, L1 4.3174e-05, Linf 0.0144629, total time[s] 0.162914 +Converged at iteration 37, L1 5.22618e-05, Linf 0.0192627, total time[s] 0.177691 +Converged at iteration 28, L1 6.29676e-05, Linf 0.00754555, total time[s] 0.136713 +Converged at iteration 25, L1 7.01891e-05, Linf 0.0101207, total time[s] 0.138074 +Converged at iteration 21, L1 8.32619e-05, Linf 0.00895717, total time[s] 0.103809 +Converged at iteration 22, L1 9.82689e-05, Linf 0.00441436, total time[s] 0.109435 +Converged at iteration 20, L1 5.93549e-05, Linf 0.00912361, total time[s] 0.131695 +Converged at iteration 22, L1 3.48519e-05, Linf 0.00320961, total time[s] 0.158579 +Converged at iteration 23, L1 7.46997e-05, Linf 0.00365999, total time[s] 0.174895 +Converged at iteration 23, L1 7.54855e-05, Linf 0.00294913, total time[s] 0.150145 +Converged at iteration 21, L1 7.01447e-05, Linf 0.00236251, total time[s] 0.113676 +Converged at iteration 19, L1 6.43291e-05, Linf 0.00331403, total time[s] 0.097727 +Converged at iteration 20, L1 5.81346e-05, Linf 0.00374722, total time[s] 0.106702 +Converged at iteration 31, L1 5.83327e-05, Linf 0.00857564, total time[s] 0.199403 +Converged at iteration 26, L1 4.92843e-05, Linf 0.00381928, total time[s] 0.146081 +Converged at iteration 22, L1 7.63046e-05, Linf 0.00501169, total time[s] 0.137336 +Converged at iteration 23, L1 8.42829e-05, Linf 0.00262704, total time[s] 0.139537 +Converged at iteration 26, L1 7.85438e-05, Linf 0.002714, total time[s] 0.122756 +Converged at iteration 23, L1 9.15225e-05, Linf 0.00274453, total time[s] 0.111709 +Converged at iteration 24, L1 8.18634e-05, Linf 0.00387576, total time[s] 0.214205 +Converged at iteration 23, L1 7.25029e-05, Linf 0.00114801, total time[s] 0.103743 +Converged at iteration 32, L1 5.0867e-05, Linf 0.00408134, total time[s] 0.238362 +Converged at iteration 30, L1 6.25066e-05, Linf 0.00251724, total time[s] 0.158985 +Converged at iteration 30, L1 6.54323e-05, Linf 0.00805307, total time[s] 0.179671 +Converged at iteration 30, L1 7.68596e-05, Linf 0.00327952, total time[s] 0.161115 +Converged at iteration 32, L1 3.75383e-05, Linf 0.00250371, total time[s] 0.205604 +Converged at iteration 32, L1 4.7634e-05, Linf 0.0154585, total time[s] 0.190902 +Converged at iteration 25, L1 8.07719e-05, Linf 0.00463342, total time[s] 0.117984 +Converged at iteration 25, L1 8.6462e-05, Linf 0.00290642, total time[s] 0.134429 +Converged at iteration 24, L1 9.50757e-05, Linf 0.00545624, total time[s] 0.145934 +Converged at iteration 37, L1 4.12906e-05, Linf 0.0200494, total time[s] 0.185557 +Converged at iteration 35, L1 5.76022e-05, Linf 0.018222, total time[s] 0.201288 +Converged at iteration 25, L1 6.75561e-05, Linf 0.00984571, total time[s] 0.117325 +Converged at iteration 27, L1 8.94647e-05, Linf 0.00892078, total time[s] 0.132911 +Converged at iteration 23, L1 6.96152e-05, Linf 0.00402439, total time[s] 0.115373 +Converged at iteration 21, L1 6.93247e-05, Linf 0.00812086, total time[s] 0.118493 +Converged at iteration 20, L1 9.24658e-05, Linf 0.0131671, total time[s] 0.092963 +Converged at iteration 22, L1 4.40129e-05, Linf 0.00437325, total time[s] 0.121712 +Converged at iteration 24, L1 4.76857e-05, Linf 0.00245455, total time[s] 0.108118 +Converged at iteration 24, L1 6.69535e-05, Linf 0.00409492, total time[s] 0.124199 +Converged at iteration 21, L1 9.85936e-05, Linf 0.00305193, total time[s] 0.100981 +Converged at iteration 19, L1 8.21128e-05, Linf 0.00439962, total time[s] 0.096242 +Converged at iteration 31, L1 7.03235e-05, Linf 0.00841183, total time[s] 0.137752 +Converged at iteration 20, L1 6.47817e-05, Linf 0.00393172, total time[s] 0.133642 +Converged at iteration 22, L1 8.15155e-05, Linf 0.00468968, total time[s] 0.112485 +Converged at iteration 26, L1 6.68713e-05, Linf 0.00426344, total time[s] 0.144049 +Converged at iteration 27, L1 5.80952e-05, Linf 0.00182778, total time[s] 0.125956 +Converged at iteration 24, L1 5.02869e-05, Linf 0.00167246, total time[s] 0.131727 +Converged at iteration 23, L1 9.35283e-05, Linf 0.00285861, total time[s] 0.126694 +Converged at iteration 24, L1 6.72179e-05, Linf 0.0035396, total time[s] 0.123366 +Converged at iteration 25, L1 9.77472e-05, Linf 0.00341196, total time[s] 0.107911 +Converged at iteration 32, L1 6.71046e-05, Linf 0.00495125, total time[s] 0.184057 +Converged at iteration 30, L1 7.63731e-05, Linf 0.0027775, total time[s] 0.133872 +Converged at iteration 30, L1 8.21456e-05, Linf 0.00989983, total time[s] 0.154447 +Converged at iteration 31, L1 5.46593e-05, Linf 0.00360771, total time[s] 0.160288 +Converged at iteration 32, L1 5.22213e-05, Linf 0.0197042, total time[s] 0.147443 +Converged at iteration 32, L1 5.80535e-05, Linf 0.00349202, total time[s] 0.203034 +Converged at iteration 25, L1 7.21548e-05, Linf 0.00350287, total time[s] 0.123718 +Converged at iteration 27, L1 5.45911e-05, Linf 0.00552487, total time[s] 0.153968 +Converged at iteration 25, L1 7.11829e-05, Linf 0.0053406, total time[s] 0.111866 +Converged at iteration 35, L1 6.69705e-05, Linf 0.0235334, total time[s] 0.166102 +Converged at iteration 37, L1 3.95917e-05, Linf 0.0208762, total time[s] 0.168913 +Converged at iteration 27, L1 6.75017e-05, Linf 0.00778746, total time[s] 0.128589 +Converged at iteration 25, L1 6.50938e-05, Linf 0.00943879, total time[s] 0.126917 +Converged at iteration 21, L1 6.15803e-05, Linf 0.00699754, total time[s] 0.101305 +Converged at iteration 23, L1 6.69117e-05, Linf 0.00381559, total time[s] 0.112053 +Converged at iteration 22, L1 6.94778e-05, Linf 0.00762634, total time[s] 0.104534 +Converged at iteration 21, L1 3.38972e-05, Linf 0.00647348, total time[s] 0.10101 +Converged at iteration 24, L1 9.84807e-05, Linf 0.00670125, total time[s] 0.113131 +Converged at iteration 24, L1 7.25617e-05, Linf 0.00479134, total time[s] 0.127368 +Converged at iteration 19, L1 9.43622e-05, Linf 0.00518928, total time[s] 0.085769 +Converged at iteration 22, L1 6.62384e-05, Linf 0.0028432, total time[s] 0.104424 +Converged at iteration 20, L1 7.95365e-05, Linf 0.00458636, total time[s] 0.089064 +Converged at iteration 31, L1 9.13049e-05, Linf 0.0101269, total time[s] 0.153343 +Converged at iteration 26, L1 9.80087e-05, Linf 0.00408361, total time[s] 0.118663 +Converged at iteration 22, L1 9.80063e-05, Linf 0.00550017, total time[s] 0.096744 +Converged at iteration 24, L1 6.46136e-05, Linf 0.00203344, total time[s] 0.110567 +Converged at iteration 27, L1 7.69337e-05, Linf 0.00246688, total time[s] 0.136105 +Converged at iteration 23, L1 9.74445e-05, Linf 0.00520546, total time[s] 0.104762 +Converged at iteration 23, L1 9.07638e-05, Linf 0.00314887, total time[s] 0.127179 +Converged at iteration 32, L1 8.93105e-05, Linf 0.00937399, total time[s] 0.154974 +Converged at iteration 27, L1 6.57619e-05, Linf 0.00432275, total time[s] 0.132283 +Converged at iteration 30, L1 9.73776e-05, Linf 0.0139998, total time[s] 0.151751 +Converged at iteration 30, L1 8.52506e-05, Linf 0.00279566, total time[s] 0.187461 +Converged at iteration 32, L1 8.30189e-05, Linf 0.00492965, total time[s] 0.185204 +Converged at iteration 31, L1 7.33958e-05, Linf 0.00528352, total time[s] 0.14601 +Converged at iteration 27, L1 6.77599e-05, Linf 0.00733834, total time[s] 0.118529 +Converged at iteration 32, L1 6.32181e-05, Linf 0.024638, total time[s] 0.15126 +Converged at iteration 26, L1 5.15587e-05, Linf 0.00484237, total time[s] 0.116206 +Converged at iteration 25, L1 6.7525e-05, Linf 0.00353224, total time[s] 0.101878 +Converged at iteration 35, L1 7.72863e-05, Linf 0.0268312, total time[s] 0.182688 +Converged at iteration 37, L1 5.02259e-05, Linf 0.0241002, total time[s] 0.200796 +Converged at iteration 25, L1 6.56999e-05, Linf 0.00984284, total time[s] 0.128315 +Converged at iteration 27, L1 4.8002e-05, Linf 0.00631026, total time[s] 0.154284 +Converged at iteration 21, L1 6.25528e-05, Linf 0.00624135, total time[s] 0.119223 +Converged at iteration 22, L1 6.41207e-05, Linf 0.00249868, total time[s] 0.15869 +Converged at iteration 23, L1 4.54588e-05, Linf 0.00662395, total time[s] 0.135641 +Converged at iteration 21, L1 4.35663e-05, Linf 0.00784772, total time[s] 0.130799 +Converged at iteration 25, L1 6.19939e-05, Linf 0.0058434, total time[s] 0.187791 +Converged at iteration 25, L1 5.16353e-05, Linf 0.00509538, total time[s] 0.14972 +Converged at iteration 19, L1 9.53237e-05, Linf 0.00532987, total time[s] 0.15967 +Converged at iteration 22, L1 8.06127e-05, Linf 0.00384772, total time[s] 0.209019 +Converged at iteration 20, L1 9.55532e-05, Linf 0.00557951, total time[s] 0.102381 +Converged at iteration 32, L1 3.28961e-05, Linf 0.00537098, total time[s] 0.223024 +Converged at iteration 27, L1 8.22281e-05, Linf 0.00252794, total time[s] 0.218271 +Converged at iteration 23, L1 6.82264e-05, Linf 0.004598, total time[s] 0.158942 +Converged at iteration 24, L1 8.132e-05, Linf 0.00304434, total time[s] 0.192765 +Converged at iteration 27, L1 9.40442e-05, Linf 0.00307904, total time[s] 0.23369 +Converged at iteration 23, L1 9.57974e-05, Linf 0.00603097, total time[s] 0.205583 +Converged at iteration 24, L1 5.7451e-05, Linf 0.00240847, total time[s] 0.176432 +Converged at iteration 33, L1 5.20859e-05, Linf 0.00529488, total time[s] 0.213804 +Converged at iteration 27, L1 9.75755e-05, Linf 0.00574228, total time[s] 0.180981 +Converged at iteration 31, L1 4.23576e-05, Linf 0.00728041, total time[s] 0.175504 +Converged at iteration 30, L1 8.80844e-05, Linf 0.00252322, total time[s] 0.225976 +Converged at iteration 33, L1 4.24238e-05, Linf 0.00368859, total time[s] 0.175438 +Converged at iteration 31, L1 8.81639e-05, Linf 0.0067371, total time[s] 0.213326 +Converged at iteration 27, L1 5.7641e-05, Linf 0.0068364, total time[s] 0.184815 +Converged at iteration 26, L1 6.98268e-05, Linf 0.00680034, total time[s] 0.176811 +Converged at iteration 32, L1 9.06995e-05, Linf 0.0299527, total time[s] 0.190183 +Converged at iteration 25, L1 7.48252e-05, Linf 0.00569669, total time[s] 0.11582 +Converged at iteration 36, L1 2.39165e-05, Linf 0.0106404, total time[s] 0.169377 +Converged at iteration 37, L1 9.99983e-05, Linf 0.0303431, total time[s] 0.183849 +Converged at iteration 26, L1 7.924e-05, Linf 0.00727624, total time[s] 0.125489 +Converged at iteration 25, L1 7.58915e-05, Linf 0.0105731, total time[s] 0.127932 +Converged at iteration 21, L1 6.23398e-05, Linf 0.00594465, total time[s] 0.096763 +Converged at iteration 21, L1 9.30062e-05, Linf 0.00346562, total time[s] 0.102653 +Converged at iteration 23, L1 7.53846e-05, Linf 0.0108131, total time[s] 0.113175 +Converged at iteration 21, L1 4.97076e-05, Linf 0.00795149, total time[s] 0.137654 +Converged at iteration 25, L1 6.90849e-05, Linf 0.00741874, total time[s] 0.18561 +Converged at iteration 25, L1 7.37969e-05, Linf 0.00830976, total time[s] 0.205613 +Converged at iteration 19, L1 9.27621e-05, Linf 0.00491126, total time[s] 0.185608 +Converged at iteration 22, L1 9.02271e-05, Linf 0.00479164, total time[s] 0.125266 +Converged at iteration 32, L1 3.58623e-05, Linf 0.00525933, total time[s] 0.197497 +Converged at iteration 21, L1 6.46018e-05, Linf 0.0046448, total time[s] 0.21513 +Converged at iteration 23, L1 8.47422e-05, Linf 0.00550169, total time[s] 0.123222 +Converged at iteration 27, L1 9.63207e-05, Linf 0.00301858, total time[s] 0.136242 +Converged at iteration 28, L1 5.84218e-05, Linf 0.00217642, total time[s] 0.134878 +Converged at iteration 25, L1 5.08327e-05, Linf 0.00305491, total time[s] 0.134648 +Converged at iteration 24, L1 6.74106e-05, Linf 0.00270237, total time[s] 0.146397 +Converged at iteration 24, L1 6.86144e-05, Linf 0.00536374, total time[s] 0.186269 +Converged at iteration 28, L1 7.93351e-05, Linf 0.00552078, total time[s] 0.22159 +Converged at iteration 33, L1 6.56481e-05, Linf 0.00616298, total time[s] 0.186185 +Converged at iteration 30, L1 8.85202e-05, Linf 0.00223219, total time[s] 0.213453 +Converged at iteration 30, L1 9.81601e-05, Linf 0.0165813, total time[s] 0.154093 +Converged at iteration 31, L1 9.11779e-05, Linf 0.00712863, total time[s] 0.14597 +Converged at iteration 33, L1 5.30424e-05, Linf 0.00460957, total time[s] 0.146781 +Converged at iteration 33, L1 3.99048e-05, Linf 0.0222754, total time[s] 0.149408 +Converged at iteration 27, L1 4.44481e-05, Linf 0.0051892, total time[s] 0.120883 +Converged at iteration 25, L1 8.2013e-05, Linf 0.00731899, total time[s] 0.117668 +Converged at iteration 26, L1 8.79714e-05, Linf 0.00860378, total time[s] 0.114956 +Converged at iteration 36, L1 4.14989e-05, Linf 0.0147561, total time[s] 0.164049 +Converged at iteration 38, L1 6.95096e-05, Linf 0.0230451, total time[s] 0.174923 +Converged at iteration 25, L1 9.31471e-05, Linf 0.0108171, total time[s] 0.117549 +Converged at iteration 27, L1 4.12526e-05, Linf 0.00536485, total time[s] 0.124575 +Converged at iteration 21, L1 6.86785e-05, Linf 0.00623095, total time[s] 0.099669 +Converged at iteration 22, L1 9.55113e-05, Linf 0.00408457, total time[s] 0.10621 +Converged at iteration 24, L1 4.04087e-05, Linf 0.00742269, total time[s] 0.116292 +Converged at iteration 21, L1 5.09449e-05, Linf 0.00626751, total time[s] 0.099429 +Converged at iteration 25, L1 8.48528e-05, Linf 0.010236, total time[s] 0.112341 +Converged at iteration 25, L1 6.88932e-05, Linf 0.00774202, total time[s] 0.137959 +Converged at iteration 22, L1 9.38285e-05, Linf 0.00555657, total time[s] 0.099791 +Converged at iteration 19, L1 8.97849e-05, Linf 0.00398879, total time[s] 0.090686 +Converged at iteration 21, L1 7.54993e-05, Linf 0.00522575, total time[s] 0.102253 +Converged at iteration 32, L1 3.6155e-05, Linf 0.00449932, total time[s] 0.143421 +Converged at iteration 27, L1 8.50623e-05, Linf 0.00292286, total time[s] 0.12662 +Converged at iteration 23, L1 9.99002e-05, Linf 0.00602144, total time[s] 0.112621 +Converged at iteration 25, L1 6.40371e-05, Linf 0.00510941, total time[s] 0.124631 +Converged at iteration 28, L1 6.3865e-05, Linf 0.00251341, total time[s] 0.140631 +Converged at iteration 25, L1 6.11966e-05, Linf 0.00508183, total time[s] 0.150524 +Converged at iteration 24, L1 7.65837e-05, Linf 0.0030812, total time[s] 0.134283 +Converged at iteration 29, L1 6.55111e-05, Linf 0.00505338, total time[s] 0.142819 +Converged at iteration 33, L1 6.8141e-05, Linf 0.0057289, total time[s] 0.159496 +Converged at iteration 30, L1 8.52411e-05, Linf 0.00184375, total time[s] 0.165582 +Converged at iteration 30, L1 8.22005e-05, Linf 0.014535, total time[s] 0.15749 +Converged at iteration 31, L1 7.64039e-05, Linf 0.00533123, total time[s] 0.148155 +Converged at iteration 33, L1 5.90296e-05, Linf 0.00492671, total time[s] 0.227163 +Converged at iteration 34, L1 2.32545e-05, Linf 0.0158842, total time[s] 0.151141 +Converged at iteration 26, L1 6.67433e-05, Linf 0.00435786, total time[s] 0.125799 +Converged at iteration 25, L1 8.87154e-05, Linf 0.00839726, total time[s] 0.14414 +Converged at iteration 26, L1 9.86653e-05, Linf 0.00990828, total time[s] 0.157878 +Converged at iteration 36, L1 6.00428e-05, Linf 0.0169755, total time[s] 0.16042 +Converged at iteration 39, L1 4.04946e-05, Linf 0.0158424, total time[s] 0.204871 +Converged at iteration 27, L1 9.36684e-05, Linf 0.00646011, total time[s] 0.129328 +Converged at iteration 25, L1 7.5657e-05, Linf 0.00960712, total time[s] 0.164716 +Converged at iteration 21, L1 8.52589e-05, Linf 0.00664966, total time[s] 0.108414 +Converged at iteration 23, L1 6.28331e-05, Linf 0.00347774, total time[s] 0.145651 +Converged at iteration 24, L1 4.61223e-05, Linf 0.00909485, total time[s] 0.139576 +Converged at iteration 21, L1 5.35987e-05, Linf 0.00457672, total time[s] 0.113091 +Converged at iteration 25, L1 6.79938e-05, Linf 0.00803958, total time[s] 0.130519 +Converged at iteration 25, L1 8.60762e-05, Linf 0.0111156, total time[s] 0.122039 +Converged at iteration 19, L1 9.41807e-05, Linf 0.00332076, total time[s] 0.090876 +Converged at iteration 21, L1 9.06453e-05, Linf 0.00569908, total time[s] 0.100119 +Converged at iteration 22, L1 9.94556e-05, Linf 0.00654892, total time[s] 0.12381 +Converged at iteration 27, L1 6.97688e-05, Linf 0.00238288, total time[s] 0.134409 +Converged at iteration 32, L1 3.77376e-05, Linf 0.00509364, total time[s] 0.171398 +Converged at iteration 24, L1 6.12487e-05, Linf 0.0042523, total time[s] 0.11369 +Converged at iteration 25, L1 7.63906e-05, Linf 0.00711265, total time[s] 0.150968 +Converged at iteration 28, L1 6.63152e-05, Linf 0.00272715, total time[s] 0.128642 +Converged at iteration 25, L1 8.27187e-05, Linf 0.00638817, total time[s] 0.190044 +Converged at iteration 24, L1 8.06925e-05, Linf 0.00333386, total time[s] 0.141569 +Converged at iteration 33, L1 6.91068e-05, Linf 0.00599081, total time[s] 0.151626 +Converged at iteration 30, L1 5.85196e-05, Linf 0.00477303, total time[s] 0.139959 +Converged at iteration 30, L1 6.40548e-05, Linf 0.0118804, total time[s] 0.153395 +Converged at iteration 30, L1 9.04661e-05, Linf 0.00209011, total time[s] 0.183926 +Converged at iteration 33, L1 6.27883e-05, Linf 0.00476832, total time[s] 0.151975 +Converged at iteration 31, L1 5.8362e-05, Linf 0.00355532, total time[s] 0.155869 +Converged at iteration 26, L1 5.46959e-05, Linf 0.00320966, total time[s] 0.136609 +Converged at iteration 34, L1 5.12534e-05, Linf 0.0209744, total time[s] 0.193956 +Converged at iteration 27, L1 5.51607e-05, Linf 0.00615459, total time[s] 0.16926 +Converged at iteration 25, L1 9.48188e-05, Linf 0.0091232, total time[s] 0.127908 +Converged at iteration 36, L1 4.87094e-05, Linf 0.0133979, total time[s] 0.169766 +Converged at iteration 39, L1 5.52161e-05, Linf 0.0144834, total time[s] 0.182034 +Converged at iteration 27, L1 5.63033e-05, Linf 0.00432825, total time[s] 0.123599 +Converged at iteration 25, L1 5.55439e-05, Linf 0.00924898, total time[s] 0.115059 +Converged at iteration 22, L1 6.49857e-05, Linf 0.00458989, total time[s] 0.101524 +Converged at iteration 24, L1 6.88941e-05, Linf 0.00378371, total time[s] 0.106548 +Converged at iteration 24, L1 3.80451e-05, Linf 0.0108259, total time[s] 0.11774 +Converged at iteration 21, L1 3.99663e-05, Linf 0.00448027, total time[s] 0.106743 +Converged at iteration 25, L1 5.42776e-05, Linf 0.00652263, total time[s] 0.117683 +Converged at iteration 25, L1 7.3571e-05, Linf 0.00927602, total time[s] 0.119045 +Converged at iteration 19, L1 6.2979e-05, Linf 0.00228376, total time[s] 0.09411 +Converged at iteration 22, L1 8.20331e-05, Linf 0.00641525, total time[s] 0.105478 +Converged at iteration 22, L1 6.17064e-05, Linf 0.0049964, total time[s] 0.110817 +Converged at iteration 31, L1 9.24563e-05, Linf 0.00794568, total time[s] 0.17104 +Converged at iteration 26, L1 7.88911e-05, Linf 0.00737181, total time[s] 0.129413 +Converged at iteration 24, L1 7.19945e-05, Linf 0.00546369, total time[s] 0.107309 +Converged at iteration 25, L1 7.18469e-05, Linf 0.00805291, total time[s] 0.117258 +Converged at iteration 28, L1 5.46841e-05, Linf 0.0026133, total time[s] 0.165924 +Converged at iteration 27, L1 6.87112e-05, Linf 0.00530574, total time[s] 0.129811 +Converged at iteration 33, L1 7.49817e-05, Linf 0.0076345, total time[s] 0.154567 +Converged at iteration 25, L1 6.72533e-05, Linf 0.00319192, total time[s] 0.138235 +Converged at iteration 29, L1 7.47368e-05, Linf 0.00336738, total time[s] 0.162207 +Converged at iteration 30, L1 4.4458e-05, Linf 0.00744249, total time[s] 0.141118 +Converged at iteration 33, L1 6.48571e-05, Linf 0.00533399, total time[s] 0.166247 +Converged at iteration 31, L1 5.94295e-05, Linf 0.00168708, total time[s] 0.184476 +Converged at iteration 26, L1 5.46868e-05, Linf 0.00292791, total time[s] 0.130982 +Converged at iteration 29, L1 9.44349e-05, Linf 0.00843857, total time[s] 0.134814 +Converged at iteration 26, L1 9.48766e-05, Linf 0.0103126, total time[s] 0.133787 +Converged at iteration 34, L1 7.19284e-05, Linf 0.0185398, total time[s] 0.141726 +Converged at iteration 25, L1 9.90445e-05, Linf 0.00864, total time[s] 0.105049 +Converged at iteration 36, L1 7.10015e-05, Linf 0.0162177, total time[s] 0.162985 +Converged at iteration 39, L1 7.87666e-05, Linf 0.0173467, total time[s] 0.171056 +Converged at iteration 27, L1 8.88646e-05, Linf 0.00547725, total time[s] 0.122474 +Converged at iteration 25, L1 5.45357e-05, Linf 0.00812095, total time[s] 0.125149 +Converged at iteration 22, L1 6.00036e-05, Linf 0.0043928, total time[s] 0.101912 +Converged at iteration 23, L1 9.31943e-05, Linf 0.00434301, total time[s] 0.113782 +Converged at iteration 24, L1 4.6371e-05, Linf 0.0109527, total time[s] 0.109816 +Converged at iteration 21, L1 4.80055e-05, Linf 0.00516234, total time[s] 0.129148 +Converged at iteration 25, L1 5.77352e-05, Linf 0.00737348, total time[s] 0.114298 +Converged at iteration 25, L1 7.87604e-05, Linf 0.0101381, total time[s] 0.116282 +Converged at iteration 19, L1 6.75366e-05, Linf 0.00270609, total time[s] 0.089703 +Converged at iteration 22, L1 8.95139e-05, Linf 0.0072816, total time[s] 0.110619 +Converged at iteration 22, L1 6.06187e-05, Linf 0.00492439, total time[s] 0.103245 +Converged at iteration 32, L1 5.18252e-05, Linf 0.00554886, total time[s] 0.157547 +Converged at iteration 26, L1 8.35001e-05, Linf 0.00777124, total time[s] 0.119565 +Converged at iteration 24, L1 7.71474e-05, Linf 0.00506441, total time[s] 0.112955 +Converged at iteration 25, L1 8.29948e-05, Linf 0.00897507, total time[s] 0.112404 +Converged at iteration 26, L1 9.64613e-05, Linf 0.00650145, total time[s] 0.117497 +Converged at iteration 28, L1 5.82959e-05, Linf 0.00327422, total time[s] 0.130739 +Converged at iteration 25, L1 5.84998e-05, Linf 0.002914, total time[s] 0.116967 +Converged at iteration 33, L1 8.02878e-05, Linf 0.00820958, total time[s] 0.151552 +Converged at iteration 30, L1 6.29038e-05, Linf 0.00403792, total time[s] 0.143365 +Converged at iteration 30, L1 4.61339e-05, Linf 0.00809822, total time[s] 0.135048 +Converged at iteration 30, L1 9.9725e-05, Linf 0.00236626, total time[s] 0.140373 +Converged at iteration 33, L1 6.83859e-05, Linf 0.00544297, total time[s] 0.154868 +Converged at iteration 30, L1 5.18691e-05, Linf 0.00359651, total time[s] 0.139441 +Converged at iteration 26, L1 4.43347e-05, Linf 0.0020176, total time[s] 0.116423 +Converged at iteration 27, L1 5.38292e-05, Linf 0.00628627, total time[s] 0.124771 +Converged at iteration 34, L1 8.30813e-05, Linf 0.0209341, total time[s] 0.155131 +Converged at iteration 26, L1 4.22233e-05, Linf 0.00345182, total time[s] 0.102609 +Converged at iteration 36, L1 8.96062e-05, Linf 0.0177842, total time[s] 0.162638 +Converged at iteration 39, L1 8.37321e-05, Linf 0.0175545, total time[s] 0.175797 +Converged at iteration 28, L1 6.03309e-05, Linf 0.00543763, total time[s] 0.126331 +Converged at iteration 25, L1 6.12689e-05, Linf 0.00651782, total time[s] 0.11432 +Converged at iteration 22, L1 5.37537e-05, Linf 0.004174, total time[s] 0.100485 +Converged at iteration 23, L1 7.64077e-05, Linf 0.00394378, total time[s] 0.102501 +Converged at iteration 24, L1 6.0057e-05, Linf 0.0123705, total time[s] 0.110212 +Converged at iteration 21, L1 6.21865e-05, Linf 0.0060012, total time[s] 0.097879 +Converged at iteration 25, L1 8.46235e-05, Linf 0.0108617, total time[s] 0.117142 +Converged at iteration 25, L1 6.0793e-05, Linf 0.00828773, total time[s] 0.130094 +Converged at iteration 19, L1 7.95197e-05, Linf 0.00315183, total time[s] 0.095551 +Converged at iteration 22, L1 9.87503e-05, Linf 0.0087843, total time[s] 0.10383 +Converged at iteration 22, L1 5.80224e-05, Linf 0.00506091, total time[s] 0.103577 +Converged at iteration 32, L1 6.64762e-05, Linf 0.00830451, total time[s] 0.140124 +Converged at iteration 26, L1 9.43721e-05, Linf 0.00998503, total time[s] 0.117549 +Converged at iteration 24, L1 7.52819e-05, Linf 0.00494378, total time[s] 0.108173 +Converged at iteration 25, L1 9.90173e-05, Linf 0.0105511, total time[s] 0.132597 +Converged at iteration 28, L1 6.11829e-05, Linf 0.00291157, total time[s] 0.126819 +Converged at iteration 24, L1 9.02715e-05, Linf 0.00393677, total time[s] 0.108008 +Converged at iteration 26, L1 8.32002e-05, Linf 0.00607656, total time[s] 0.131971 +Converged at iteration 30, L1 7.35792e-05, Linf 0.0049034, total time[s] 0.137396 +Converged at iteration 33, L1 8.48018e-05, Linf 0.00827242, total time[s] 0.159272 +Converged at iteration 30, L1 9.23624e-05, Linf 0.00223966, total time[s] 0.142638 +Converged at iteration 30, L1 4.59355e-05, Linf 0.00636766, total time[s] 0.139793 +Converged at iteration 29, L1 9.48877e-05, Linf 0.00666087, total time[s] 0.135197 +Converged at iteration 33, L1 7.33926e-05, Linf 0.00572206, total time[s] 0.147702 +Converged at iteration 26, L1 9.82953e-05, Linf 0.0041176, total time[s] 0.124906 +Converged at iteration 34, L1 9.44813e-05, Linf 0.0224745, total time[s] 0.155396 +Converged at iteration 27, L1 5.83202e-05, Linf 0.0070212, total time[s] 0.13774 +Converged at iteration 26, L1 4.2769e-05, Linf 0.00369225, total time[s] 0.127027 +Converged at iteration 36, L1 7.11392e-05, Linf 0.0158828, total time[s] 0.161155 +Converged at iteration 39, L1 7.97427e-05, Linf 0.017295, total time[s] 0.175959 +Converged at iteration 25, L1 5.70467e-05, Linf 0.00702643, total time[s] 0.115379 +Converged at iteration 27, L1 7.64774e-05, Linf 0.00496537, total time[s] 0.137448 +Converged at iteration 24, L1 5.93917e-05, Linf 0.00344832, total time[s] 0.105754 +Converged at iteration 22, L1 6.21996e-05, Linf 0.00462555, total time[s] 0.11497 +Converged at iteration 21, L1 5.03232e-05, Linf 0.00550407, total time[s] 0.092213 +Converged at iteration 24, L1 5.01161e-05, Linf 0.0135418, total time[s] 0.113524 +Converged at iteration 25, L1 7.7374e-05, Linf 0.00973372, total time[s] 0.113187 +Converged at iteration 25, L1 5.45399e-05, Linf 0.00741219, total time[s] 0.129121 +Converged at iteration 22, L1 8.91853e-05, Linf 0.00804432, total time[s] 0.098187 +Converged at iteration 19, L1 6.3424e-05, Linf 0.00263719, total time[s] 0.091194 +Converged at iteration 22, L1 6.24477e-05, Linf 0.00504423, total time[s] 0.101817 +Converged at iteration 32, L1 5.21375e-05, Linf 0.00655265, total time[s] 0.133958 +Converged at iteration 26, L1 8.83245e-05, Linf 0.00903849, total time[s] 0.119186 +Converged at iteration 24, L1 7.86662e-05, Linf 0.00518844, total time[s] 0.105973 +Converged at iteration 25, L1 8.91655e-05, Linf 0.0101107, total time[s] 0.13274 +Converged at iteration 28, L1 5.51152e-05, Linf 0.00346328, total time[s] 0.135216 +Converged at iteration 27, L1 6.30165e-05, Linf 0.00508829, total time[s] 0.123645 +Converged at iteration 25, L1 6.36878e-05, Linf 0.00316783, total time[s] 0.112282 +Converged at iteration 33, L1 8.85433e-05, Linf 0.00969366, total time[s] 0.151842 +Converged at iteration 29, L1 9.59773e-05, Linf 0.00463616, total time[s] 0.131965 +Converged at iteration 30, L1 3.93277e-05, Linf 0.00658077, total time[s] 0.164888 +Converged at iteration 31, L1 6.0318e-05, Linf 0.00181175, total time[s] 0.137772 +Converged at iteration 33, L1 7.0209e-05, Linf 0.00562325, total time[s] 0.144994 +Converged at iteration 29, L1 9.113e-05, Linf 0.00744686, total time[s] 0.128695 +Converged at iteration 26, L1 4.65958e-05, Linf 0.0019998, total time[s] 0.116946 +Converged at iteration 34, L1 8.38503e-05, Linf 0.0202569, total time[s] 0.148252 +Converged at iteration 27, L1 5.47378e-05, Linf 0.00648116, total time[s] 0.124245 +Converged at iteration 26, L1 4.34117e-05, Linf 0.00365001, total time[s] 0.114 +Converged at iteration 39, L1 8.22154e-05, Linf 0.0168321, total time[s] 0.175762 +Converged at iteration 36, L1 8.27524e-05, Linf 0.0168538, total time[s] 0.174745 +Converged at iteration 25, L1 7.34758e-05, Linf 0.00592364, total time[s] 0.112971 +Converged at iteration 28, L1 5.09057e-05, Linf 0.00472701, total time[s] 0.128486 +Converged at iteration 23, L1 8.42125e-05, Linf 0.00417526, total time[s] 0.105708 +Converged at iteration 22, L1 5.79026e-05, Linf 0.00441003, total time[s] 0.103275 +Converged at iteration 21, L1 6.14156e-05, Linf 0.00592565, total time[s] 0.095648 +Converged at iteration 24, L1 6.13467e-05, Linf 0.0149195, total time[s] 0.115064 +Converged at iteration 25, L1 8.34807e-05, Linf 0.0104497, total time[s] 0.114643 +Converged at iteration 25, L1 5.88802e-05, Linf 0.0083246, total time[s] 0.121486 +Converged at iteration 22, L1 9.73295e-05, Linf 0.00933049, total time[s] 0.098787 +Converged at iteration 19, L1 7.19714e-05, Linf 0.00293532, total time[s] 0.098624 +Converged at iteration 22, L1 5.9325e-05, Linf 0.00517865, total time[s] 0.103139 +Converged at iteration 32, L1 6.79872e-05, Linf 0.00724679, total time[s] 0.151527 +Converged at iteration 26, L1 9.50549e-05, Linf 0.0110438, total time[s] 0.124192 +Converged at iteration 24, L1 7.74413e-05, Linf 0.00502941, total time[s] 0.130325 +Converged at iteration 26, L1 4.7864e-05, Linf 0.00619401, total time[s] 0.116915 +Converged at iteration 28, L1 5.90021e-05, Linf 0.00297209, total time[s] 0.128233 +Converged at iteration 26, L1 9.34289e-05, Linf 0.00650858, total time[s] 0.125507 +Converged at iteration 24, L1 9.8363e-05, Linf 0.00426338, total time[s] 0.110703 +Converged at iteration 33, L1 8.82388e-05, Linf 0.00849629, total time[s] 0.153692 +Converged at iteration 30, L1 6.83782e-05, Linf 0.00453909, total time[s] 0.133075 +Converged at iteration 30, L1 9.88207e-05, Linf 0.0025054, total time[s] 0.138215 +Converged at iteration 30, L1 3.92981e-05, Linf 0.00458732, total time[s] 0.137316 +Converged at iteration 29, L1 8.07039e-05, Linf 0.00663503, total time[s] 0.137522 +Converged at iteration 33, L1 7.43785e-05, Linf 0.00605147, total time[s] 0.148816 +Converged at iteration 26, L1 9.79564e-05, Linf 0.00428126, total time[s] 0.121449 +Converged at iteration 34, L1 9.34544e-05, Linf 0.0218366, total time[s] 0.165651 +Converged at iteration 27, L1 5.72853e-05, Linf 0.00704866, total time[s] 0.125612 +Converged at iteration 26, L1 4.66402e-05, Linf 0.00318423, total time[s] 0.120307 +Converged at iteration 36, L1 6.93652e-05, Linf 0.0153316, total time[s] 0.161949 +Converged at iteration 39, L1 7.75008e-05, Linf 0.0162682, total time[s] 0.17634 +Converged at iteration 27, L1 6.9059e-05, Linf 0.00470913, total time[s] 0.122984 +Converged at iteration 25, L1 7.78914e-05, Linf 0.00621682, total time[s] 0.119471 +Converged at iteration 22, L1 6.42203e-05, Linf 0.00477494, total time[s] 0.101464 +Converged at iteration 24, L1 6.29038e-05, Linf 0.0036439, total time[s] 0.1085 +Converged at iteration 21, L1 5.14762e-05, Linf 0.00560895, total time[s] 0.096153 +Converged at iteration 24, L1 5.15281e-05, Linf 0.0117318, total time[s] 0.109313 +Converged at iteration 25, L1 7.69206e-05, Linf 0.00930662, total time[s] 0.112644 +Converged at iteration 25, L1 5.32348e-05, Linf 0.00740806, total time[s] 0.114586 +Converged at iteration 19, L1 5.86525e-05, Linf 0.00246641, total time[s] 0.089586 +Converged at iteration 22, L1 8.89401e-05, Linf 0.00860857, total time[s] 0.101385 +Converged at iteration 22, L1 6.30939e-05, Linf 0.00513066, total time[s] 0.10138 +Converged at iteration 32, L1 5.17349e-05, Linf 0.00647197, total time[s] 0.144508 +Converged at iteration 26, L1 9.97122e-05, Linf 0.0103033, total time[s] 0.116081 +Converged at iteration 24, L1 7.92791e-05, Linf 0.00528055, total time[s] 0.122948 +Converged at iteration 25, L1 9.35072e-05, Linf 0.0109753, total time[s] 0.119169 +Converged at iteration 28, L1 5.26956e-05, Linf 0.00351132, total time[s] 0.124482 +Converged at iteration 27, L1 6.99648e-05, Linf 0.0054369, total time[s] 0.124638 +Converged at iteration 25, L1 6.87143e-05, Linf 0.00338033, total time[s] 0.114215 +Converged at iteration 33, L1 9.44182e-05, Linf 0.0101744, total time[s] 0.147386 +Converged at iteration 29, L1 8.89802e-05, Linf 0.00415237, total time[s] 0.128258 +Converged at iteration 30, L1 3.7421e-05, Linf 0.00464793, total time[s] 0.132307 +Converged at iteration 31, L1 6.46451e-05, Linf 0.00203179, total time[s] 0.139267 +Converged at iteration 33, L1 7.25887e-05, Linf 0.00578367, total time[s] 0.141494 +Converged at iteration 30, L1 3.73436e-05, Linf 0.00344957, total time[s] 0.137921 +Converged at iteration 26, L1 4.95255e-05, Linf 0.00211576, total time[s] 0.127836 +Converged at iteration 34, L1 8.23221e-05, Linf 0.0194363, total time[s] 0.171505 +Converged at iteration 27, L1 5.37124e-05, Linf 0.00647592, total time[s] 0.122076 +Converged at iteration 26, L1 4.41376e-05, Linf 0.00370449, total time[s] 0.116939 +Converged at iteration 36, L1 7.7199e-05, Linf 0.0159577, total time[s] 0.163758 +Converged at iteration 39, L1 8.20806e-05, Linf 0.0171644, total time[s] 0.178987 +Converged at iteration 28, L1 4.09714e-05, Linf 0.00421247, total time[s] 0.127953 +Converged at iteration 25, L1 9.50018e-05, Linf 0.00542886, total time[s] 0.117031 +Converged at iteration 22, L1 6.18797e-05, Linf 0.00461972, total time[s] 0.102194 +Converged at iteration 23, L1 9.30937e-05, Linf 0.00440505, total time[s] 0.106285 +Converged at iteration 24, L1 6.11408e-05, Linf 0.0144329, total time[s] 0.110898 +Converged at iteration 21, L1 5.9499e-05, Linf 0.00582897, total time[s] 0.098329 +Converged at iteration 25, L1 5.69715e-05, Linf 0.00816651, total time[s] 0.111683 +Converged at iteration 25, L1 8.17205e-05, Linf 0.0099718, total time[s] 0.11448 +Converged at iteration 19, L1 6.37003e-05, Linf 0.00269807, total time[s] 0.088926 +Converged at iteration 22, L1 9.49935e-05, Linf 0.00955815, total time[s] 0.102159 +Converged at iteration 22, L1 6.13546e-05, Linf 0.00527978, total time[s] 0.095702 +Converged at iteration 32, L1 6.61557e-05, Linf 0.00728083, total time[s] 0.148275 +Converged at iteration 27, L1 5.03036e-05, Linf 0.00728239, total time[s] 0.116203 +Converged at iteration 24, L1 7.98041e-05, Linf 0.00512209, total time[s] 0.112196 +Converged at iteration 26, L1 4.79117e-05, Linf 0.00653371, total time[s] 0.116266 +Converged at iteration 28, L1 5.60906e-05, Linf 0.00391298, total time[s] 0.163687 +Converged at iteration 27, L1 6.17075e-05, Linf 0.00496168, total time[s] 0.11908 +Converged at iteration 25, L1 5.97421e-05, Linf 0.00310542, total time[s] 0.129736 +Converged at iteration 33, L1 9.32771e-05, Linf 0.00906414, total time[s] 0.144734 +Converged at iteration 30, L1 6.30718e-05, Linf 0.00413918, total time[s] 0.136443 +Converged at iteration 30, L1 3.59714e-05, Linf 0.00383224, total time[s] 0.131507 +Converged at iteration 31, L1 5.97164e-05, Linf 0.00187746, total time[s] 0.134561 +Converged at iteration 33, L1 7.36637e-05, Linf 0.00596084, total time[s] 0.143072 +Converged at iteration 29, L1 8.84206e-05, Linf 0.00728639, total time[s] 0.128058 +Converged at iteration 26, L1 9.10872e-05, Linf 0.00413382, total time[s] 0.114816 +Converged at iteration 34, L1 9.01127e-05, Linf 0.0209345, total time[s] 0.164982 +Converged at iteration 27, L1 5.65591e-05, Linf 0.00713511, total time[s] 0.121945 +Converged at iteration 26, L1 5.03759e-05, Linf 0.00284605, total time[s] 0.103414 +Converged at iteration 36, L1 6.58105e-05, Linf 0.0145177, total time[s] 0.159721 +Converged at iteration 39, L1 7.43702e-05, Linf 0.0158802, total time[s] 0.186262 +Converged at iteration 27, L1 5.89292e-05, Linf 0.00419521, total time[s] 0.121359 +Converged at iteration 26, L1 8.58494e-05, Linf 0.00341946, total time[s] 0.118564 +Converged at iteration 22, L1 7.22758e-05, Linf 0.00496795, total time[s] 0.098565 +Converged at iteration 24, L1 7.12181e-05, Linf 0.00387511, total time[s] 0.107119 +Converged at iteration 24, L1 5.55048e-05, Linf 0.0109088, total time[s] 0.113395 +Converged at iteration 21, L1 5.45295e-05, Linf 0.00584762, total time[s] 0.094141 +Converged at iteration 25, L1 5.05403e-05, Linf 0.00749037, total time[s] 0.11708 +Converged at iteration 25, L1 7.79222e-05, Linf 0.00861741, total time[s] 0.115394 +Converged at iteration 19, L1 5.45391e-05, Linf 0.00223894, total time[s] 0.088713 +Converged at iteration 22, L1 9.08446e-05, Linf 0.00939019, total time[s] 0.09729 +Converged at iteration 22, L1 6.4148e-05, Linf 0.00521593, total time[s] 0.09965 +Converged at iteration 32, L1 4.72417e-05, Linf 0.00489242, total time[s] 0.15632 +Converged at iteration 27, L1 6.33665e-05, Linf 0.00692182, total time[s] 0.12875 +Converged at iteration 24, L1 8.00806e-05, Linf 0.00537307, total time[s] 0.120394 +Converged at iteration 26, L1 4.80097e-05, Linf 0.00701095, total time[s] 0.116349 +Converged at iteration 28, L1 5.10449e-05, Linf 0.00343781, total time[s] 0.123703 +Converged at iteration 27, L1 8.15685e-05, Linf 0.00586366, total time[s] 0.120154 +Converged at iteration 25, L1 7.49559e-05, Linf 0.00363459, total time[s] 0.12271 +Converged at iteration 34, L1 5.42497e-05, Linf 0.0082434, total time[s] 0.149122 +Converged at iteration 29, L1 7.8227e-05, Linf 0.00346627, total time[s] 0.132984 +Converged at iteration 29, L1 9.12514e-05, Linf 0.00963694, total time[s] 0.126454 +Converged at iteration 31, L1 7.32948e-05, Linf 0.00241892, total time[s] 0.144922 +Converged at iteration 33, L1 7.36477e-05, Linf 0.00588296, total time[s] 0.147813 +Converged at iteration 30, L1 5.23023e-05, Linf 0.00335462, total time[s] 0.138993 +Converged at iteration 26, L1 5.51358e-05, Linf 0.00256083, total time[s] 0.113886 +Converged at iteration 34, L1 7.8687e-05, Linf 0.0183609, total time[s] 0.161443 +Converged at iteration 27, L1 5.2566e-05, Linf 0.00662367, total time[s] 0.123295 +Converged at iteration 26, L1 4.24777e-05, Linf 0.00268826, total time[s] 0.103578 +Converged at iteration 36, L1 7.6962e-05, Linf 0.0154069, total time[s] 0.163517 +Converged at iteration 39, L1 8.53235e-05, Linf 0.017346, total time[s] 0.175892 +Converged at iteration 27, L1 7.98147e-05, Linf 0.0051377, total time[s] 0.119729 +Converged at iteration 26, L1 9.86599e-05, Linf 0.00368212, total time[s] 0.131183 +Converged at iteration 22, L1 6.73363e-05, Linf 0.00485036, total time[s] 0.099125 +Converged at iteration 24, L1 6.00612e-05, Linf 0.00354001, total time[s] 0.114007 +Converged at iteration 24, L1 6.22046e-05, Linf 0.0121192, total time[s] 0.108524 +Converged at iteration 21, L1 6.02859e-05, Linf 0.00586999, total time[s] 0.108863 +Converged at iteration 25, L1 5.27195e-05, Linf 0.00802311, total time[s] 0.117887 +Converged at iteration 25, L1 8.17611e-05, Linf 0.00921171, total time[s] 0.113449 +Converged at iteration 19, L1 5.57572e-05, Linf 0.00238922, total time[s] 0.089395 +Converged at iteration 22, L1 9.25301e-05, Linf 0.00984744, total time[s] 0.10806 +Converged at iteration 22, L1 6.39242e-05, Linf 0.00539124, total time[s] 0.099467 +Converged at iteration 32, L1 6.25893e-05, Linf 0.00722829, total time[s] 0.167755 +Converged at iteration 27, L1 6.20673e-05, Linf 0.00799288, total time[s] 0.118737 +Converged at iteration 24, L1 8.24634e-05, Linf 0.00521479, total time[s] 0.106313 +Converged at iteration 26, L1 5.10313e-05, Linf 0.00723839, total time[s] 0.1269 +Converged at iteration 28, L1 5.17592e-05, Linf 0.00377224, total time[s] 0.129356 +Converged at iteration 27, L1 6.93724e-05, Linf 0.00545733, total time[s] 0.142273 +Converged at iteration 25, L1 6.69104e-05, Linf 0.00346628, total time[s] 0.120208 +Converged at iteration 34, L1 5.24695e-05, Linf 0.00613927, total time[s] 0.184945 +Converged at iteration 29, L1 9.32676e-05, Linf 0.00456844, total time[s] 0.134735 +Converged at iteration 29, L1 9.43164e-05, Linf 0.00912029, total time[s] 0.148415 +Converged at iteration 31, L1 6.82594e-05, Linf 0.00220564, total time[s] 0.142947 +Converged at iteration 33, L1 7.3384e-05, Linf 0.00593647, total time[s] 0.139328 +Converged at iteration 30, L1 4.79272e-05, Linf 0.00333249, total time[s] 0.13263 +Converged at iteration 26, L1 8.50994e-05, Linf 0.00390844, total time[s] 0.115458 +Converged at iteration 34, L1 8.61754e-05, Linf 0.019825, total time[s] 0.15222 +Converged at iteration 27, L1 5.59869e-05, Linf 0.007355, total time[s] 0.118878 +Converged at iteration 26, L1 4.85362e-05, Linf 0.00263415, total time[s] 0.10997 +Converged at iteration 38, L1 9.21848e-05, Linf 0.0175603, total time[s] 0.568919 +Converged at iteration 41, L1 7.42432e-05, Linf 0.0183869, total time[s] 0.563622 +Converged at iteration 33, L1 7.20087e-05, Linf 0.0072676, total time[s] 0.519471 +Converged at iteration 30, L1 5.49574e-05, Linf 0.00759999, total time[s] 0.511813 +Converged at iteration 23, L1 7.44314e-05, Linf 0.00681256, total time[s] 0.384278 +Converged at iteration 25, L1 6.29886e-05, Linf 0.00475444, total time[s] 0.396374 +Converged at iteration 25, L1 5.41452e-05, Linf 0.00674061, total time[s] 0.36998 +Converged at iteration 28, L1 9.26739e-05, Linf 0.0162405, total time[s] 0.433416 +Converged at iteration 29, L1 7.33557e-05, Linf 0.00913521, total time[s] 0.437405 +Converged at iteration 29, L1 7.1909e-05, Linf 0.0041999, total time[s] 0.460875 +Converged at iteration 21, L1 7.2407e-05, Linf 0.00386858, total time[s] 0.336296 +Converged at iteration 26, L1 9.15716e-05, Linf 0.0102676, total time[s] 0.380443 +Converged at iteration 23, L1 6.26382e-05, Linf 0.00569336, total time[s] 0.361055 +Converged at iteration 35, L1 8.37158e-05, Linf 0.00775608, total time[s] 0.509544 +Converged at iteration 32, L1 6.4239e-05, Linf 0.00574874, total time[s] 0.493464 +Converged at iteration 27, L1 6.48901e-05, Linf 0.00743368, total time[s] 0.413829 +Converged at iteration 30, L1 7.41226e-05, Linf 0.00886432, total time[s] 0.45263 +Converged at iteration 29, L1 8.01769e-05, Linf 0.00451561, total time[s] 0.431939 +Converged at iteration 28, L1 8.06124e-05, Linf 0.00540179, total time[s] 0.430083 +Converged at iteration 27, L1 8.69299e-05, Linf 0.00463287, total time[s] 0.412676 +Converged at iteration 37, L1 9.16377e-05, Linf 0.00735545, total time[s] 0.542117 +Converged at iteration 34, L1 6.56961e-05, Linf 0.00580949, total time[s] 0.555449 +Converged at iteration 34, L1 4.57574e-05, Linf 0.00751586, total time[s] 0.543224 +Converged at iteration 35, L1 9.40393e-05, Linf 0.00568958, total time[s] 0.526049 +Converged at iteration 36, L1 7.20186e-05, Linf 0.00713034, total time[s] 0.54755 +Converged at iteration 34, L1 5.3822e-05, Linf 0.00595232, total time[s] 0.522561 +Converged at iteration 33, L1 4.86312e-05, Linf 0.00836183, total time[s] 0.482531 +Converged at iteration 37, L1 6.09595e-05, Linf 0.0156775, total time[s] 0.54774 +Converged at iteration 31, L1 8.20304e-05, Linf 0.0103058, total time[s] 0.464431 +Converged at iteration 29, L1 9.69467e-05, Linf 0.0123414, total time[s] 0.430922 +Converged at iteration 35, L1 7.32632e-05, Linf 0.00328763, total time[s] 0.474128 +Converged at iteration 39, L1 9.80774e-05, Linf 0.00419203, total time[s] 0.539777 +Converged at iteration 31, L1 6.02421e-05, Linf 0.00496108, total time[s] 0.433647 +Converged at iteration 30, L1 9.37224e-05, Linf 0.00423518, total time[s] 0.416162 +Converged at iteration 22, L1 8.40505e-05, Linf 0.00446709, total time[s] 0.338409 +Converged at iteration 27, L1 6.12541e-05, Linf 0.00495794, total time[s] 0.3918 +Converged at iteration 24, L1 8.64275e-05, Linf 0.00479291, total time[s] 0.339176 +Converged at iteration 20, L1 9.34896e-05, Linf 0.0039534, total time[s] 0.288433 +Converged at iteration 26, L1 7.71676e-05, Linf 0.00536053, total time[s] 0.363231 +Converged at iteration 28, L1 7.15015e-05, Linf 0.00439544, total time[s] 0.402484 +Converged at iteration 19, L1 6.18591e-05, Linf 0.00384773, total time[s] 0.272635 +Converged at iteration 22, L1 7.10646e-05, Linf 0.00506904, total time[s] 0.333258 +Converged at iteration 20, L1 7.92971e-05, Linf 0.00448337, total time[s] 0.287741 +Converged at iteration 30, L1 7.47342e-05, Linf 0.00316981, total time[s] 0.445307 +Converged at iteration 31, L1 8.31402e-05, Linf 0.0053885, total time[s] 0.480851 +Converged at iteration 24, L1 6.53789e-05, Linf 0.00455187, total time[s] 0.431876 +Converged at iteration 24, L1 8.26279e-05, Linf 0.00436298, total time[s] 0.36166 +Converged at iteration 27, L1 9.2689e-05, Linf 0.00548065, total time[s] 0.438934 +Converged at iteration 26, L1 6.79241e-05, Linf 0.0042593, total time[s] 0.405181 +Converged at iteration 23, L1 8.7186e-05, Linf 0.00393227, total time[s] 0.366889 +Converged at iteration 33, L1 9.79805e-05, Linf 0.00481908, total time[s] 0.492921 +Converged at iteration 29, L1 7.33936e-05, Linf 0.00458546, total time[s] 0.440658 +Converged at iteration 28, L1 8.82753e-05, Linf 0.00299779, total time[s] 0.42539 +Converged at iteration 30, L1 8.99922e-05, Linf 0.00425831, total time[s] 0.474939 +Converged at iteration 37, L1 7.14866e-05, Linf 0.00319747, total time[s] 0.53484 +Converged at iteration 32, L1 8.97961e-05, Linf 0.00361214, total time[s] 0.463961 +Converged at iteration 28, L1 9.3186e-05, Linf 0.00419491, total time[s] 0.424886 +Converged at iteration 33, L1 8.26796e-05, Linf 0.0046157, total time[s] 0.476201 +Converged at iteration 26, L1 8.59343e-05, Linf 0.00372938, total time[s] 0.387788 +Converged at iteration 24, L1 8.25016e-05, Linf 0.00315268, total time[s] 0.346402 +Converged at iteration 35, L1 9.56299e-05, Linf 0.00636877, total time[s] 0.513146 +Converged at iteration 39, L1 5.85809e-05, Linf 0.0067558, total time[s] 0.542537 +Converged at iteration 24, L1 7.54888e-05, Linf 0.00443921, total time[s] 0.342713 +Converged at iteration 30, L1 9.22532e-05, Linf 0.00593171, total time[s] 0.460135 +Converged at iteration 24, L1 8.15962e-05, Linf 0.00560002, total time[s] 0.369805 +Converged at iteration 21, L1 7.74134e-05, Linf 0.00409757, total time[s] 0.339068 +Converged at iteration 19, L1 5.03476e-05, Linf 0.00464904, total time[s] 0.292355 +Converged at iteration 21, L1 3.53929e-05, Linf 0.00569443, total time[s] 0.312878 +Converged at iteration 23, L1 9.88106e-05, Linf 0.00626925, total time[s] 0.364706 +Converged at iteration 24, L1 6.09737e-05, Linf 0.00475574, total time[s] 0.367819 +Converged at iteration 16, L1 8.92834e-05, Linf 0.00347308, total time[s] 0.268893 +Converged at iteration 20, L1 5.68814e-05, Linf 0.00530747, total time[s] 0.326866 +Converged at iteration 19, L1 9.35961e-05, Linf 0.00700141, total time[s] 0.286078 +Converged at iteration 31, L1 7.28481e-05, Linf 0.00274743, total time[s] 0.452826 +Converged at iteration 26, L1 5.45595e-05, Linf 0.0049271, total time[s] 0.393388 +Converged at iteration 23, L1 7.17846e-05, Linf 0.00687562, total time[s] 0.33056 +Converged at iteration 20, L1 5.51893e-05, Linf 0.00354046, total time[s] 0.30449 +Converged at iteration 23, L1 4.98986e-05, Linf 0.00334627, total time[s] 0.366299 +Converged at iteration 25, L1 8.51977e-05, Linf 0.00451546, total time[s] 0.381228 +Converged at iteration 22, L1 9.57504e-05, Linf 0.00487476, total time[s] 0.319489 +Converged at iteration 29, L1 6.54495e-05, Linf 0.00614583, total time[s] 0.434549 +Converged at iteration 28, L1 6.58442e-05, Linf 0.00333225, total time[s] 0.400804 +Converged at iteration 29, L1 6.31758e-05, Linf 0.0037093, total time[s] 0.427888 +Converged at iteration 27, L1 6.91983e-05, Linf 0.00379722, total time[s] 0.39327 +Converged at iteration 27, L1 9.62143e-05, Linf 0.00290939, total time[s] 0.424092 +Converged at iteration 29, L1 7.76869e-05, Linf 0.00282334, total time[s] 0.410595 +Converged at iteration 26, L1 7.20264e-05, Linf 0.00295112, total time[s] 0.424664 +Converged at iteration 32, L1 7.55118e-05, Linf 0.00661927, total time[s] 0.459965 +Converged at iteration 23, L1 6.52474e-05, Linf 0.00279665, total time[s] 0.384553 +Converged at iteration 25, L1 7.49716e-05, Linf 0.00244029, total time[s] 0.357085 +Converged at iteration 35, L1 5.93939e-05, Linf 0.00946085, total time[s] 0.529365 +Converged at iteration 38, L1 6.12505e-05, Linf 0.011002, total time[s] 0.534081 +Converged at iteration 25, L1 4.75377e-05, Linf 0.00657587, total time[s] 0.358983 +Converged at iteration 30, L1 5.73496e-05, Linf 0.00586596, total time[s] 0.426772 +Converged at iteration 23, L1 5.06257e-05, Linf 0.00349052, total time[s] 0.343305 +Converged at iteration 22, L1 5.95477e-05, Linf 0.00477834, total time[s] 0.36054 +Converged at iteration 19, L1 7.26698e-05, Linf 0.00727005, total time[s] 0.284469 +Converged at iteration 21, L1 5.38191e-05, Linf 0.00532297, total time[s] 0.354083 +Converged at iteration 23, L1 5.29243e-05, Linf 0.00409513, total time[s] 0.364848 +Converged at iteration 22, L1 6.03667e-05, Linf 0.00541518, total time[s] 0.329435 +Converged at iteration 20, L1 5.44156e-05, Linf 0.00432323, total time[s] 0.339008 +Converged at iteration 17, L1 9.26206e-05, Linf 0.00197835, total time[s] 0.266593 +Converged at iteration 19, L1 9.33102e-05, Linf 0.00662331, total time[s] 0.333285 +Converged at iteration 31, L1 5.34959e-05, Linf 0.00505112, total time[s] 0.495644 +Converged at iteration 25, L1 8.7665e-05, Linf 0.00548508, total time[s] 0.421894 +Converged at iteration 22, L1 9.07936e-05, Linf 0.00658955, total time[s] 0.367304 +Converged at iteration 24, L1 9.13523e-05, Linf 0.0030977, total time[s] 0.385299 +Converged at iteration 22, L1 6.66447e-05, Linf 0.00190824, total time[s] 0.401103 +Converged at iteration 23, L1 6.7863e-05, Linf 0.00278686, total time[s] 0.346703 +Converged at iteration 25, L1 7.31372e-05, Linf 0.00310018, total time[s] 0.376841 +Converged at iteration 26, L1 7.58543e-05, Linf 0.00328966, total time[s] 0.402617 +Converged at iteration 30, L1 4.9913e-05, Linf 0.00355054, total time[s] 0.444864 +Converged at iteration 28, L1 8.53923e-05, Linf 0.00258764, total time[s] 0.440902 +Converged at iteration 29, L1 8.9922e-05, Linf 0.00539248, total time[s] 0.463444 +Converged at iteration 29, L1 8.58523e-05, Linf 0.00210003, total time[s] 0.61989 +Converged at iteration 29, L1 6.83463e-05, Linf 0.00256826, total time[s] 0.593328 +Converged at iteration 32, L1 5.42237e-05, Linf 0.00866026, total time[s] 0.535988 +Converged at iteration 26, L1 6.86562e-05, Linf 0.00398784, total time[s] 0.407735 +Converged at iteration 23, L1 8.1606e-05, Linf 0.00365245, total time[s] 0.346427 +Converged at iteration 25, L1 8.8837e-05, Linf 0.00383863, total time[s] 0.400221 +Converged at iteration 35, L1 3.95729e-05, Linf 0.0120517, total time[s] 0.556948 +Converged at iteration 37, L1 8.08597e-05, Linf 0.0175058, total time[s] 0.607415 +Converged at iteration 25, L1 6.78587e-05, Linf 0.00944575, total time[s] 0.386444 +Converged at iteration 28, L1 9.92812e-05, Linf 0.00827531, total time[s] 0.442115 +Converged at iteration 22, L1 8.54223e-05, Linf 0.00406096, total time[s] 0.381916 +Converged at iteration 22, L1 4.73595e-05, Linf 0.00472631, total time[s] 0.374979 +Converged at iteration 20, L1 3.55671e-05, Linf 0.00576936, total time[s] 0.367139 +Converged at iteration 21, L1 8.77298e-05, Linf 0.00630078, total time[s] 0.337146 +Converged at iteration 23, L1 6.04815e-05, Linf 0.00326221, total time[s] 0.402537 +Converged at iteration 22, L1 6.6358e-05, Linf 0.00183848, total time[s] 0.334211 +Converged at iteration 20, L1 9.14174e-05, Linf 0.00312112, total time[s] 0.412407 +Converged at iteration 18, L1 9.22642e-05, Linf 0.00308715, total time[s] 0.380381 +Converged at iteration 19, L1 9.31198e-05, Linf 0.00534201, total time[s] 0.329763 +Converged at iteration 31, L1 5.73703e-05, Linf 0.00694234, total time[s] 0.507259 +Converged at iteration 26, L1 5.04184e-05, Linf 0.00457167, total time[s] 0.447774 +Converged at iteration 22, L1 7.80176e-05, Linf 0.00507117, total time[s] 0.341948 +Converged at iteration 23, L1 6.32176e-05, Linf 0.00200144, total time[s] 0.323199 +Converged at iteration 25, L1 9.52583e-05, Linf 0.00331006, total time[s] 0.362847 +Converged at iteration 24, L1 9.72818e-05, Linf 0.00394336, total time[s] 0.360562 +Converged at iteration 23, L1 7.83073e-05, Linf 0.00271863, total time[s] 0.322977 +Converged at iteration 24, L1 6.80202e-05, Linf 0.00289314, total time[s] 0.343303 +Converged at iteration 31, L1 7.48219e-05, Linf 0.00447001, total time[s] 0.450467 +Converged at iteration 29, L1 8.56867e-05, Linf 0.0032223, total time[s] 0.40535 +Converged at iteration 30, L1 5.27259e-05, Linf 0.00552633, total time[s] 0.432015 +Converged at iteration 30, L1 5.94826e-05, Linf 0.00192502, total time[s] 0.42306 +Converged at iteration 31, L1 6.97355e-05, Linf 0.00349686, total time[s] 0.447576 +Converged at iteration 24, L1 6.17497e-05, Linf 0.00446387, total time[s] 0.334839 +Converged at iteration 32, L1 4.79024e-05, Linf 0.0117912, total time[s] 0.449714 +Converged at iteration 24, L1 6.5466e-05, Linf 0.00296875, total time[s] 0.355809 +Converged at iteration 25, L1 8.51533e-05, Linf 0.00453752, total time[s] 0.361908 +Converged at iteration 37, L1 5.22618e-05, Linf 0.0192627, total time[s] 0.500794 +Converged at iteration 35, L1 4.3174e-05, Linf 0.0144629, total time[s] 0.515461 +Converged at iteration 28, L1 6.29676e-05, Linf 0.00754555, total time[s] 0.422577 +Converged at iteration 25, L1 7.01893e-05, Linf 0.0101207, total time[s] 0.422148 +Converged at iteration 21, L1 8.32607e-05, Linf 0.0089572, total time[s] 0.318915 +Converged at iteration 22, L1 9.8271e-05, Linf 0.00441436, total time[s] 0.36922 +Converged at iteration 22, L1 3.48523e-05, Linf 0.00320961, total time[s] 0.35125 +Converged at iteration 20, L1 5.93551e-05, Linf 0.00912361, total time[s] 0.346489 +Converged at iteration 38, L1 9.21847e-05, Linf 0.0175603, total time[s] 0.169416 +Converged at iteration 41, L1 7.42432e-05, Linf 0.0183869, total time[s] 0.19616 +Converged at iteration 30, L1 5.86046e-05, Linf 0.00930135, total time[s] 0.139435 +Converged at iteration 33, L1 7.20087e-05, Linf 0.0072676, total time[s] 0.166806 +Converged at iteration 23, L1 7.44314e-05, Linf 0.00681256, total time[s] 0.10472 +Converged at iteration 25, L1 6.29721e-05, Linf 0.00472528, total time[s] 0.143604 +Converged at iteration 28, L1 9.26687e-05, Linf 0.0162042, total time[s] 0.147562 +Converged at iteration 25, L1 5.41452e-05, Linf 0.00674061, total time[s] 0.144994 +Converged at iteration 29, L1 7.33528e-05, Linf 0.00911797, total time[s] 0.147617 +Converged at iteration 29, L1 7.1909e-05, Linf 0.0041999, total time[s] 0.158256 +Converged at iteration 21, L1 7.24063e-05, Linf 0.00386858, total time[s] 0.116656 +Converged at iteration 26, L1 9.15715e-05, Linf 0.0102676, total time[s] 0.153246 +Converged at iteration 23, L1 6.26362e-05, Linf 0.00569336, total time[s] 0.125427 +Converged at iteration 35, L1 8.37144e-05, Linf 0.00775608, total time[s] 0.17602 +Converged at iteration 32, L1 6.42487e-05, Linf 0.00580398, total time[s] 0.172347 +Converged at iteration 27, L1 6.48901e-05, Linf 0.00743368, total time[s] 0.128375 +Converged at iteration 30, L1 7.41106e-05, Linf 0.00884234, total time[s] 0.149522 +Converged at iteration 29, L1 8.01748e-05, Linf 0.00450107, total time[s] 0.172209 +Converged at iteration 28, L1 8.06011e-05, Linf 0.00540179, total time[s] 0.146979 +Converged at iteration 27, L1 8.69266e-05, Linf 0.00461717, total time[s] 0.135765 +Converged at iteration 37, L1 9.16407e-05, Linf 0.00738147, total time[s] 0.218396 +Converged at iteration 34, L1 6.56961e-05, Linf 0.00580949, total time[s] 0.216692 +Converged at iteration 34, L1 4.57576e-05, Linf 0.00751586, total time[s] 0.178231 +Converged at iteration 36, L1 7.20186e-05, Linf 0.00713034, total time[s] 0.176452 +Converged at iteration 35, L1 9.40656e-05, Linf 0.0056896, total time[s] 0.32334 +Converged at iteration 33, L1 4.86312e-05, Linf 0.00836183, total time[s] 0.217196 +Converged at iteration 34, L1 5.3822e-05, Linf 0.00595232, total time[s] 0.175779 +Converged at iteration 31, L1 8.20304e-05, Linf 0.0103058, total time[s] 0.153354 +Converged at iteration 37, L1 6.09587e-05, Linf 0.0156776, total time[s] 0.182277 +Converged at iteration 29, L1 9.69467e-05, Linf 0.0123414, total time[s] 0.176059 +Converged at iteration 35, L1 7.32632e-05, Linf 0.00328763, total time[s] 0.162753 +Converged at iteration 39, L1 9.80774e-05, Linf 0.00419203, total time[s] 0.168667 +Converged at iteration 31, L1 6.02421e-05, Linf 0.00496108, total time[s] 0.131898 +Converged at iteration 30, L1 9.37224e-05, Linf 0.00423518, total time[s] 0.144865 +Converged at iteration 22, L1 8.40508e-05, Linf 0.00446709, total time[s] 0.198288 +Converged at iteration 27, L1 6.1254e-05, Linf 0.00495794, total time[s] 0.130156 +Converged at iteration 24, L1 8.64275e-05, Linf 0.00479291, total time[s] 0.132668 +Converged at iteration 20, L1 9.34895e-05, Linf 0.0039534, total time[s] 0.097099 +Converged at iteration 26, L1 7.7167e-05, Linf 0.00535821, total time[s] 0.141569 +Converged at iteration 28, L1 7.1476e-05, Linf 0.00441772, total time[s] 0.128419 +Converged at iteration 19, L1 6.18591e-05, Linf 0.00384773, total time[s] 0.100128 +Converged at iteration 22, L1 7.10648e-05, Linf 0.00506899, total time[s] 0.101309 +Converged at iteration 20, L1 7.92957e-05, Linf 0.00447797, total time[s] 0.096518 +Converged at iteration 30, L1 7.47339e-05, Linf 0.0031698, total time[s] 0.139872 +Converged at iteration 31, L1 8.31398e-05, Linf 0.00538805, total time[s] 0.186055 +Converged at iteration 24, L1 6.53789e-05, Linf 0.00455187, total time[s] 0.114103 +Converged at iteration 27, L1 9.26856e-05, Linf 0.00545834, total time[s] 0.147065 +Converged at iteration 24, L1 8.26421e-05, Linf 0.00444871, total time[s] 0.119762 +Converged at iteration 26, L1 6.79403e-05, Linf 0.00435057, total time[s] 0.131795 +Converged at iteration 23, L1 8.71857e-05, Linf 0.00393227, total time[s] 0.159264 +Converged at iteration 33, L1 9.79803e-05, Linf 0.00481788, total time[s] 0.161208 +Converged at iteration 29, L1 7.33979e-05, Linf 0.0046089, total time[s] 0.138751 +Converged at iteration 30, L1 9.00052e-05, Linf 0.00433799, total time[s] 0.146837 +Converged at iteration 28, L1 8.82752e-05, Linf 0.00299779, total time[s] 0.1448 +Converged at iteration 37, L1 7.14867e-05, Linf 0.00319747, total time[s] 0.18554 +Converged at iteration 32, L1 8.97965e-05, Linf 0.00361214, total time[s] 0.185911 +Converged at iteration 28, L1 9.3186e-05, Linf 0.00419491, total time[s] 0.180868 +Converged at iteration 33, L1 8.26796e-05, Linf 0.0046157, total time[s] 0.160411 +Converged at iteration 24, L1 8.25016e-05, Linf 0.00315268, total time[s] 0.125182 +Converged at iteration 26, L1 8.59343e-05, Linf 0.00372938, total time[s] 0.169538 +Converged at iteration 35, L1 9.56299e-05, Linf 0.00636877, total time[s] 0.201193 +Converged at iteration 39, L1 5.85812e-05, Linf 0.0067558, total time[s] 0.236495 +Converged at iteration 24, L1 7.54888e-05, Linf 0.00443921, total time[s] 0.127445 +Converged at iteration 30, L1 9.22525e-05, Linf 0.00593171, total time[s] 0.174575 +Converged at iteration 21, L1 7.74134e-05, Linf 0.00409757, total time[s] 0.143286 +Converged at iteration 24, L1 8.1595e-05, Linf 0.00560002, total time[s] 0.170403 +Converged at iteration 21, L1 3.53929e-05, Linf 0.00569444, total time[s] 0.169079 +Converged at iteration 19, L1 5.03477e-05, Linf 0.00464904, total time[s] 0.130863 +Converged at iteration 23, L1 9.88106e-05, Linf 0.00626925, total time[s] 0.11146 +Converged at iteration 24, L1 6.09707e-05, Linf 0.00475574, total time[s] 0.151361 +Converged at iteration 16, L1 8.92829e-05, Linf 0.00347308, total time[s] 0.084729 +Converged at iteration 20, L1 5.68793e-05, Linf 0.00530747, total time[s] 0.122407 +Converged at iteration 19, L1 9.35958e-05, Linf 0.00700309, total time[s] 0.109826 +Converged at iteration 31, L1 7.28481e-05, Linf 0.00274743, total time[s] 0.213599 +Converged at iteration 26, L1 5.4562e-05, Linf 0.00496172, total time[s] 0.129559 +Converged at iteration 23, L1 7.17846e-05, Linf 0.00687562, total time[s] 0.105954 +Converged at iteration 20, L1 5.5194e-05, Linf 0.00356682, total time[s] 0.111548 +Converged at iteration 23, L1 4.98979e-05, Linf 0.00334628, total time[s] 0.112767 +Converged at iteration 25, L1 8.51964e-05, Linf 0.00451546, total time[s] 0.132975 +Converged at iteration 22, L1 9.57456e-05, Linf 0.00486089, total time[s] 0.160474 +Converged at iteration 29, L1 6.5457e-05, Linf 0.00618707, total time[s] 0.190355 +Converged at iteration 28, L1 6.58445e-05, Linf 0.00333223, total time[s] 0.174437 +Converged at iteration 29, L1 6.31764e-05, Linf 0.00370929, total time[s] 0.156564 +Converged at iteration 27, L1 6.91988e-05, Linf 0.00379722, total time[s] 0.242879 +Converged at iteration 27, L1 9.62141e-05, Linf 0.00290939, total time[s] 0.180313 +Converged at iteration 29, L1 7.76869e-05, Linf 0.00282334, total time[s] 0.146291 +Converged at iteration 26, L1 7.2027e-05, Linf 0.00295109, total time[s] 0.134583 +Converged at iteration 32, L1 7.55118e-05, Linf 0.00661927, total time[s] 0.146612 +Converged at iteration 23, L1 6.52474e-05, Linf 0.00279665, total time[s] 0.154623 +Converged at iteration 25, L1 7.49716e-05, Linf 0.00244029, total time[s] 0.114699 +Converged at iteration 35, L1 5.93939e-05, Linf 0.00946085, total time[s] 0.216115 +Converged at iteration 38, L1 6.12505e-05, Linf 0.011002, total time[s] 0.270431 +Converged at iteration 30, L1 5.73542e-05, Linf 0.00586593, total time[s] 0.226258 +Converged at iteration 25, L1 4.75373e-05, Linf 0.00657587, total time[s] 0.133913 +Converged at iteration 23, L1 5.06257e-05, Linf 0.00349052, total time[s] 0.150184 +Converged at iteration 22, L1 5.95509e-05, Linf 0.0047788, total time[s] 0.178781 +Converged at iteration 21, L1 5.38086e-05, Linf 0.005323, total time[s] 0.137748 +Converged at iteration 19, L1 7.26676e-05, Linf 0.00727005, total time[s] 0.139669 +Converged at iteration 22, L1 6.03667e-05, Linf 0.00541518, total time[s] 0.202945 +Converged at iteration 23, L1 5.28349e-05, Linf 0.00372311, total time[s] 0.199155 +Converged at iteration 17, L1 9.26194e-05, Linf 0.00197894, total time[s] 0.113482 +Converged at iteration 20, L1 5.44168e-05, Linf 0.00432325, total time[s] 0.219204 +Converged at iteration 19, L1 9.33048e-05, Linf 0.00660479, total time[s] 0.120667 +Converged at iteration 25, L1 8.76661e-05, Linf 0.00548242, total time[s] 0.119791 +Converged at iteration 31, L1 5.34958e-05, Linf 0.00505112, total time[s] 0.148288 +Converged at iteration 22, L1 6.66445e-05, Linf 0.00190824, total time[s] 0.116352 +Converged at iteration 22, L1 9.07936e-05, Linf 0.00658955, total time[s] 0.132347 +Converged at iteration 24, L1 9.13518e-05, Linf 0.0030977, total time[s] 0.11787 +Converged at iteration 25, L1 7.31297e-05, Linf 0.00308859, total time[s] 0.173663 +Converged at iteration 23, L1 6.78576e-05, Linf 0.00278686, total time[s] 0.144607 +Converged at iteration 30, L1 4.99157e-05, Linf 0.00355575, total time[s] 0.178801 +Converged at iteration 26, L1 7.58536e-05, Linf 0.00328966, total time[s] 0.197287 +Converged at iteration 29, L1 8.99215e-05, Linf 0.00539248, total time[s] 0.279423 +Converged at iteration 28, L1 8.53935e-05, Linf 0.00258828, total time[s] 0.304732 +Converged at iteration 29, L1 8.58525e-05, Linf 0.00210003, total time[s] 0.168868 +Converged at iteration 29, L1 6.83461e-05, Linf 0.00256828, total time[s] 0.24857 +Converged at iteration 32, L1 5.42237e-05, Linf 0.00866026, total time[s] 0.164854 +Converged at iteration 26, L1 6.8656e-05, Linf 0.00398786, total time[s] 0.212914 +Converged at iteration 25, L1 8.8903e-05, Linf 0.00383863, total time[s] 0.217131 +Converged at iteration 23, L1 8.1606e-05, Linf 0.00365245, total time[s] 0.16037 +Converged at iteration 37, L1 8.08597e-05, Linf 0.0175058, total time[s] 0.261095 +Converged at iteration 35, L1 3.95729e-05, Linf 0.0120517, total time[s] 0.333416 +Converged at iteration 28, L1 9.92812e-05, Linf 0.00827531, total time[s] 0.208309 +Converged at iteration 25, L1 6.78593e-05, Linf 0.0094451, total time[s] 0.232493 +Converged at iteration 22, L1 4.73617e-05, Linf 0.00472756, total time[s] 0.215946 +Converged at iteration 22, L1 8.54218e-05, Linf 0.00406096, total time[s] 0.149627 +Converged at iteration 20, L1 3.55671e-05, Linf 0.00576936, total time[s] 0.134801 +Converged at iteration 21, L1 8.77298e-05, Linf 0.00630078, total time[s] 0.113602 +Converged at iteration 22, L1 6.63576e-05, Linf 0.00183848, total time[s] 0.103553 +Converged at iteration 23, L1 6.07165e-05, Linf 0.00326221, total time[s] 0.222362 +Converged at iteration 18, L1 9.22676e-05, Linf 0.00308715, total time[s] 0.090442 +Converged at iteration 20, L1 9.14168e-05, Linf 0.00312112, total time[s] 0.104077 +Converged at iteration 19, L1 9.31201e-05, Linf 0.00534046, total time[s] 0.182935 +Converged at iteration 31, L1 5.73703e-05, Linf 0.00694234, total time[s] 0.148597 +Converged at iteration 22, L1 7.85203e-05, Linf 0.00507118, total time[s] 0.159667 +Converged at iteration 26, L1 5.04185e-05, Linf 0.00457167, total time[s] 0.19089 +Converged at iteration 25, L1 9.52579e-05, Linf 0.00331006, total time[s] 0.186366 +Converged at iteration 23, L1 6.32206e-05, Linf 0.00200875, total time[s] 0.205975 +Converged at iteration 23, L1 7.83068e-05, Linf 0.00272719, total time[s] 0.133735 +Converged at iteration 24, L1 9.72832e-05, Linf 0.00394965, total time[s] 0.191699 +Converged at iteration 24, L1 6.80204e-05, Linf 0.00289279, total time[s] 0.222249 +Converged at iteration 31, L1 7.48222e-05, Linf 0.00447001, total time[s] 0.231585 +Converged at iteration 29, L1 8.56852e-05, Linf 0.00322261, total time[s] 0.182758 +Converged at iteration 30, L1 5.27262e-05, Linf 0.00552633, total time[s] 0.230571 +Converged at iteration 30, L1 5.94824e-05, Linf 0.00192502, total time[s] 0.166811 +Converged at iteration 31, L1 6.97355e-05, Linf 0.00349686, total time[s] 0.252663 +Converged at iteration 32, L1 4.79327e-05, Linf 0.0120107, total time[s] 0.176205 +Converged at iteration 24, L1 6.1748e-05, Linf 0.00446388, total time[s] 0.134438 +Converged at iteration 25, L1 8.51533e-05, Linf 0.00453751, total time[s] 0.277573 +Converged at iteration 24, L1 6.5466e-05, Linf 0.00296875, total time[s] 0.17958 +Converged at iteration 35, L1 4.31742e-05, Linf 0.0144629, total time[s] 0.177618 +Converged at iteration 37, L1 5.22618e-05, Linf 0.0192627, total time[s] 0.179091 +Converged at iteration 28, L1 6.29676e-05, Linf 0.00754555, total time[s] 0.20137 +Converged at iteration 25, L1 7.02097e-05, Linf 0.0101207, total time[s] 0.174003 +Converged at iteration 21, L1 8.32607e-05, Linf 0.0089572, total time[s] 0.115966 +Converged at iteration 22, L1 9.82707e-05, Linf 0.00441436, total time[s] 0.139813 +Converged at iteration 22, L1 3.48523e-05, Linf 0.0032096, total time[s] 0.201869 +Converged at iteration 20, L1 5.93545e-05, Linf 0.00912361, total time[s] 0.117546 +Converged at iteration 23, L1 7.54855e-05, Linf 0.00294913, total time[s] 0.226987 +Converged at iteration 23, L1 7.47045e-05, Linf 0.00365997, total time[s] 0.120055 +Converged at iteration 19, L1 6.43283e-05, Linf 0.00331403, total time[s] 0.099604 +Converged at iteration 21, L1 7.01447e-05, Linf 0.00236251, total time[s] 0.209042 +Converged at iteration 20, L1 5.81346e-05, Linf 0.00374722, total time[s] 0.127323 +Converged at iteration 26, L1 4.9284e-05, Linf 0.00381928, total time[s] 0.141232 +Converged at iteration 31, L1 5.83323e-05, Linf 0.00857564, total time[s] 0.27523 +Converged at iteration 23, L1 8.42829e-05, Linf 0.00262704, total time[s] 0.125256 +Converged at iteration 22, L1 7.63226e-05, Linf 0.00508047, total time[s] 0.111199 +Converged at iteration 24, L1 8.18635e-05, Linf 0.00387576, total time[s] 0.128623 +Converged at iteration 26, L1 7.85438e-05, Linf 0.002714, total time[s] 0.222139 +Converged at iteration 32, L1 5.08669e-05, Linf 0.00408132, total time[s] 0.211462 +Converged at iteration 30, L1 6.54318e-05, Linf 0.00805305, total time[s] 0.14822 +Converged at iteration 23, L1 9.15227e-05, Linf 0.00274453, total time[s] 0.23948 +Converged at iteration 23, L1 7.25039e-05, Linf 0.00114801, total time[s] 0.151764 +Converged at iteration 32, L1 3.75377e-05, Linf 0.00250364, total time[s] 0.227428 +Converged at iteration 25, L1 8.6462e-05, Linf 0.00290642, total time[s] 0.135521 +Converged at iteration 30, L1 6.25038e-05, Linf 0.00251732, total time[s] 0.22904 +Converged at iteration 24, L1 9.50757e-05, Linf 0.00545624, total time[s] 0.118699 +Converged at iteration 30, L1 7.686e-05, Linf 0.00327952, total time[s] 0.157295 +Converged at iteration 32, L1 4.76343e-05, Linf 0.0154585, total time[s] 0.149265 +Converged at iteration 25, L1 8.07719e-05, Linf 0.00463342, total time[s] 0.139589 +Converged at iteration 35, L1 5.76022e-05, Linf 0.018222, total time[s] 0.179177 +Converged at iteration 37, L1 4.12906e-05, Linf 0.0200494, total time[s] 0.222499 +Converged at iteration 27, L1 8.95353e-05, Linf 0.00892078, total time[s] 0.141009 +Converged at iteration 25, L1 6.75563e-05, Linf 0.00984571, total time[s] 0.138535 +Converged at iteration 21, L1 6.93247e-05, Linf 0.00812086, total time[s] 0.115688 +Converged at iteration 23, L1 6.96147e-05, Linf 0.00402439, total time[s] 0.144577 +Converged at iteration 22, L1 4.40138e-05, Linf 0.00437362, total time[s] 0.10863 +Converged at iteration 20, L1 9.24702e-05, Linf 0.0131671, total time[s] 0.133896 +Converged at iteration 24, L1 6.69535e-05, Linf 0.00409492, total time[s] 0.152583 +Converged at iteration 19, L1 8.2113e-05, Linf 0.00439962, total time[s] 0.09873 +Converged at iteration 24, L1 4.76876e-05, Linf 0.00245617, total time[s] 0.235756 +Converged at iteration 21, L1 9.85936e-05, Linf 0.00305193, total time[s] 0.110798 +Converged at iteration 20, L1 6.47898e-05, Linf 0.00396388, total time[s] 0.176322 +Converged at iteration 26, L1 6.68721e-05, Linf 0.00426344, total time[s] 0.165908 +Converged at iteration 31, L1 7.03253e-05, Linf 0.00841183, total time[s] 0.160805 +Converged at iteration 22, L1 8.15163e-05, Linf 0.00468969, total time[s] 0.127771 +Converged at iteration 24, L1 5.02872e-05, Linf 0.00167246, total time[s] 0.168317 +Converged at iteration 27, L1 5.80952e-05, Linf 0.00182778, total time[s] 0.118991 +Converged at iteration 24, L1 6.72262e-05, Linf 0.00353976, total time[s] 0.164527 +Converged at iteration 23, L1 9.35297e-05, Linf 0.0028586, total time[s] 0.15531 +Converged at iteration 25, L1 9.77478e-05, Linf 0.00341165, total time[s] 0.113671 +Converged at iteration 32, L1 6.71046e-05, Linf 0.00495125, total time[s] 0.219713 +Converged at iteration 30, L1 7.63731e-05, Linf 0.0027775, total time[s] 0.138167 +Converged at iteration 30, L1 8.21484e-05, Linf 0.00990598, total time[s] 0.159151 +Converged at iteration 31, L1 5.46541e-05, Linf 0.00359684, total time[s] 0.205789 +Converged at iteration 32, L1 5.80523e-05, Linf 0.00349103, total time[s] 0.172967 +Converged at iteration 32, L1 5.22213e-05, Linf 0.0197042, total time[s] 0.162372 +Converged at iteration 27, L1 5.46e-05, Linf 0.00552487, total time[s] 0.1274 +Converged at iteration 25, L1 7.21548e-05, Linf 0.00350287, total time[s] 0.204914 +Converged at iteration 25, L1 7.11829e-05, Linf 0.0053406, total time[s] 0.17878 +Converged at iteration 35, L1 6.69706e-05, Linf 0.0235334, total time[s] 0.176053 +Converged at iteration 37, L1 3.95917e-05, Linf 0.0208762, total time[s] 0.185478 +Converged at iteration 27, L1 6.75017e-05, Linf 0.00778747, total time[s] 0.129184 +Converged at iteration 25, L1 6.50938e-05, Linf 0.00943879, total time[s] 0.124536 +Converged at iteration 21, L1 6.15818e-05, Linf 0.00699697, total time[s] 0.108928 +Converged at iteration 23, L1 6.69114e-05, Linf 0.00381559, total time[s] 0.176912 +Converged at iteration 22, L1 6.94782e-05, Linf 0.00763226, total time[s] 0.131727 +Converged at iteration 21, L1 3.38933e-05, Linf 0.00647297, total time[s] 0.098679 +Converged at iteration 24, L1 9.84806e-05, Linf 0.00670125, total time[s] 0.120765 +Converged at iteration 24, L1 7.25611e-05, Linf 0.00478253, total time[s] 0.148799 +Converged at iteration 19, L1 9.43624e-05, Linf 0.00518928, total time[s] 0.094872 +Converged at iteration 22, L1 6.62384e-05, Linf 0.0028432, total time[s] 0.093228 +Converged at iteration 20, L1 7.94932e-05, Linf 0.0045934, total time[s] 0.118656 +Converged at iteration 31, L1 9.13043e-05, Linf 0.0101269, total time[s] 0.140812 +Converged at iteration 26, L1 9.80088e-05, Linf 0.00408361, total time[s] 0.119535 +Converged at iteration 22, L1 9.80061e-05, Linf 0.00550021, total time[s] 0.124299 +Converged at iteration 24, L1 6.46181e-05, Linf 0.0020411, total time[s] 0.111397 +Converged at iteration 27, L1 7.6934e-05, Linf 0.00246688, total time[s] 0.14823 +Converged at iteration 23, L1 9.74444e-05, Linf 0.00520546, total time[s] 0.105821 +Converged at iteration 23, L1 9.07639e-05, Linf 0.00314887, total time[s] 0.132637 +Converged at iteration 32, L1 8.93101e-05, Linf 0.00937405, total time[s] 0.162965 +Converged at iteration 27, L1 6.57619e-05, Linf 0.00432275, total time[s] 0.215432 +Converged at iteration 30, L1 9.73891e-05, Linf 0.0139995, total time[s] 0.137832 +Converged at iteration 30, L1 8.52508e-05, Linf 0.00279566, total time[s] 0.154452 +Converged at iteration 32, L1 8.30164e-05, Linf 0.00492969, total time[s] 0.143271 +Converged at iteration 27, L1 6.77599e-05, Linf 0.00733834, total time[s] 0.194309 +Converged at iteration 31, L1 7.33936e-05, Linf 0.00528352, total time[s] 0.229985 +Converged at iteration 26, L1 5.15587e-05, Linf 0.00484237, total time[s] 0.124715 +Converged at iteration 32, L1 6.32181e-05, Linf 0.024638, total time[s] 0.148846 +Converged at iteration 25, L1 6.7525e-05, Linf 0.00353224, total time[s] 0.105154 +Converged at iteration 35, L1 7.72861e-05, Linf 0.0268312, total time[s] 0.156688 +Converged at iteration 37, L1 5.02259e-05, Linf 0.0241002, total time[s] 0.192656 +Converged at iteration 27, L1 4.8002e-05, Linf 0.00631026, total time[s] 0.162634 +Converged at iteration 25, L1 6.56993e-05, Linf 0.00984284, total time[s] 0.12825 +Converged at iteration 21, L1 6.25528e-05, Linf 0.00624135, total time[s] 0.114405 +Converged at iteration 22, L1 6.41207e-05, Linf 0.00249868, total time[s] 0.157738 +Converged at iteration 23, L1 4.54588e-05, Linf 0.00662395, total time[s] 0.102786 +Converged at iteration 21, L1 4.35663e-05, Linf 0.00784771, total time[s] 0.09802 +Converged at iteration 25, L1 6.19942e-05, Linf 0.0058434, total time[s] 0.138277 +Converged at iteration 25, L1 5.164e-05, Linf 0.00509535, total time[s] 0.120313 +Converged at iteration 19, L1 9.53244e-05, Linf 0.00532987, total time[s] 0.093768 +Converged at iteration 22, L1 8.06128e-05, Linf 0.00384772, total time[s] 0.11153 +Converged at iteration 20, L1 9.5553e-05, Linf 0.00557956, total time[s] 0.115333 +Converged at iteration 32, L1 3.2896e-05, Linf 0.00537098, total time[s] 0.15282 +Converged at iteration 27, L1 8.22283e-05, Linf 0.00252794, total time[s] 0.163397 +Converged at iteration 23, L1 6.82265e-05, Linf 0.004598, total time[s] 0.124274 +Converged at iteration 24, L1 8.1322e-05, Linf 0.00305248, total time[s] 0.153216 +Converged at iteration 27, L1 9.40437e-05, Linf 0.00307904, total time[s] 0.163673 +Converged at iteration 23, L1 9.57976e-05, Linf 0.00602953, total time[s] 0.119348 +Converged at iteration 24, L1 5.7451e-05, Linf 0.00240847, total time[s] 0.113887 +Converged at iteration 33, L1 5.20859e-05, Linf 0.00529486, total time[s] 0.150424 +Converged at iteration 27, L1 9.7578e-05, Linf 0.00573914, total time[s] 0.153642 +Converged at iteration 31, L1 4.23672e-05, Linf 0.00728982, total time[s] 0.151836 +Converged at iteration 30, L1 8.80842e-05, Linf 0.00252322, total time[s] 0.171187 +Converged at iteration 33, L1 4.24202e-05, Linf 0.00368859, total time[s] 0.189204 +Converged at iteration 31, L1 8.81646e-05, Linf 0.00673725, total time[s] 0.192584 +Converged at iteration 27, L1 5.7641e-05, Linf 0.0068364, total time[s] 0.172478 +Converged at iteration 32, L1 9.06995e-05, Linf 0.0299527, total time[s] 0.150261 +Converged at iteration 26, L1 6.98264e-05, Linf 0.00679955, total time[s] 0.200137 +Converged at iteration 25, L1 7.48248e-05, Linf 0.00569326, total time[s] 0.115872 +Converged at iteration 37, L1 9.99983e-05, Linf 0.0303431, total time[s] 0.199249 +Converged at iteration 36, L1 2.39165e-05, Linf 0.0106404, total time[s] 0.192123 +Converged at iteration 26, L1 7.924e-05, Linf 0.00727624, total time[s] 0.169564 +Converged at iteration 25, L1 7.58898e-05, Linf 0.0105731, total time[s] 0.168581 +Converged at iteration 21, L1 6.23416e-05, Linf 0.00594463, total time[s] 0.103582 +Converged at iteration 21, L1 9.30046e-05, Linf 0.00346562, total time[s] 0.107175 +Converged at iteration 21, L1 4.97077e-05, Linf 0.00795149, total time[s] 0.131868 +Converged at iteration 23, L1 7.53832e-05, Linf 0.0108045, total time[s] 0.15527 +Converged at iteration 25, L1 6.90848e-05, Linf 0.00741874, total time[s] 0.12253 +Converged at iteration 25, L1 7.38163e-05, Linf 0.00831039, total time[s] 0.140888 +Converged at iteration 19, L1 9.27607e-05, Linf 0.00491052, total time[s] 0.103381 +Converged at iteration 22, L1 9.02273e-05, Linf 0.00479166, total time[s] 0.124116 +Converged at iteration 21, L1 6.46014e-05, Linf 0.00464479, total time[s] 0.144685 +Converged at iteration 32, L1 3.58623e-05, Linf 0.00525933, total time[s] 0.170343 +Converged at iteration 27, L1 9.63207e-05, Linf 0.00301858, total time[s] 0.177029 +Converged at iteration 23, L1 8.60625e-05, Linf 0.00550125, total time[s] 0.234909 +Converged at iteration 25, L1 5.08327e-05, Linf 0.00305491, total time[s] 0.187356 +Converged at iteration 28, L1 5.84218e-05, Linf 0.00217642, total time[s] 0.134448 +Converged at iteration 24, L1 6.74108e-05, Linf 0.00270237, total time[s] 0.125332 +Converged at iteration 24, L1 6.86144e-05, Linf 0.00536374, total time[s] 0.139019 +Converged at iteration 28, L1 7.93365e-05, Linf 0.00551972, total time[s] 0.136677 +Converged at iteration 33, L1 6.56482e-05, Linf 0.00616297, total time[s] 0.19794 +Converged at iteration 30, L1 8.85204e-05, Linf 0.00223219, total time[s] 0.196812 +Converged at iteration 30, L1 9.81582e-05, Linf 0.0165813, total time[s] 0.238766 +Converged at iteration 31, L1 9.11777e-05, Linf 0.00712863, total time[s] 0.150418 +Converged at iteration 33, L1 5.30417e-05, Linf 0.00460964, total time[s] 0.188441 +Converged at iteration 33, L1 3.99048e-05, Linf 0.0222754, total time[s] 0.181317 +Converged at iteration 25, L1 8.20135e-05, Linf 0.0073245, total time[s] 0.126455 +Converged at iteration 27, L1 4.44482e-05, Linf 0.0051892, total time[s] 0.156844 +Converged at iteration 26, L1 8.79722e-05, Linf 0.00860547, total time[s] 0.128899 +Converged at iteration 38, L1 6.95096e-05, Linf 0.0230451, total time[s] 0.197558 +Converged at iteration 36, L1 4.14989e-05, Linf 0.0147561, total time[s] 0.204093 +Converged at iteration 25, L1 9.31468e-05, Linf 0.0108171, total time[s] 0.118496 +Converged at iteration 27, L1 4.12525e-05, Linf 0.00536485, total time[s] 0.1526 +Converged at iteration 21, L1 6.86785e-05, Linf 0.00623095, total time[s] 0.112943 +Converged at iteration 22, L1 9.55119e-05, Linf 0.00408457, total time[s] 0.145411 +Converged at iteration 24, L1 4.04089e-05, Linf 0.00742347, total time[s] 0.150371 +Converged at iteration 21, L1 5.09434e-05, Linf 0.00626751, total time[s] 0.132982 +Converged at iteration 25, L1 8.48587e-05, Linf 0.0102341, total time[s] 0.162954 +Converged at iteration 25, L1 6.88932e-05, Linf 0.00774202, total time[s] 0.229606 +Converged at iteration 22, L1 9.38282e-05, Linf 0.00555657, total time[s] 0.105696 +Converged at iteration 19, L1 8.97845e-05, Linf 0.00398879, total time[s] 0.112609 +Converged at iteration 32, L1 3.61514e-05, Linf 0.00449934, total time[s] 0.156119 +Converged at iteration 21, L1 7.54989e-05, Linf 0.0052275, total time[s] 0.113771 +Converged at iteration 23, L1 9.99228e-05, Linf 0.0061944, total time[s] 0.152621 +Converged at iteration 27, L1 8.50623e-05, Linf 0.00292286, total time[s] 0.190462 +Converged at iteration 25, L1 6.40274e-05, Linf 0.00510928, total time[s] 0.12443 +Converged at iteration 36, L1 9.6171e-05, Linf 0.00105974, total time[s] 0.253449 +Converged at iteration 25, L1 6.11966e-05, Linf 0.00508183, total time[s] 0.203308 +Converged at iteration 24, L1 7.65837e-05, Linf 0.0030812, total time[s] 0.265288 +Converged at iteration 34, L1 7.64519e-05, Linf 0.00155546, total time[s] 0.18344 +Converged at iteration 29, L1 6.55111e-05, Linf 0.00505338, total time[s] 0.132802 +Converged at iteration 30, L1 8.22005e-05, Linf 0.014535, total time[s] 0.136911 +Converged at iteration 30, L1 8.5238e-05, Linf 0.00184375, total time[s] 0.144509 +Converged at iteration 31, L1 7.6404e-05, Linf 0.00533123, total time[s] 0.164232 +Converged at iteration 33, L1 5.90313e-05, Linf 0.00492675, total time[s] 0.21094 +Converged at iteration 26, L1 6.67433e-05, Linf 0.00435786, total time[s] 0.15644 +Converged at iteration 34, L1 2.32545e-05, Linf 0.0158842, total time[s] 0.166186 +Converged at iteration 26, L1 9.86653e-05, Linf 0.00990828, total time[s] 0.127281 +Converged at iteration 25, L1 8.87155e-05, Linf 0.00839726, total time[s] 0.145286 +Converged at iteration 39, L1 2.77781e-05, Linf 0.013433, total time[s] 0.188206 +Converged at iteration 36, L1 5.47293e-05, Linf 0.0165166, total time[s] 0.258651 +Converged at iteration 25, L1 9.98248e-05, Linf 0.00981068, total time[s] 0.14604 +Converged at iteration 27, L1 8.41981e-05, Linf 0.0061147, total time[s] 0.148512 +Converged at iteration 22, L1 9.63194e-05, Linf 0.00394783, total time[s] 0.109559 +Converged at iteration 21, L1 7.78172e-05, Linf 0.00711862, total time[s] 0.105221 +Converged at iteration 21, L1 5.218e-05, Linf 0.0071329, total time[s] 0.127827 +Converged at iteration 24, L1 3.73347e-05, Linf 0.00881695, total time[s] 0.121637 +Converged at iteration 25, L1 8.99044e-05, Linf 0.0114716, total time[s] 0.157704 +Converged at iteration 25, L1 6.8455e-05, Linf 0.00864098, total time[s] 0.106996 +Converged at iteration 19, L1 8.19585e-05, Linf 0.00334177, total time[s] 0.083829 +Converged at iteration 22, L1 8.45333e-05, Linf 0.00565977, total time[s] 0.177577 +Converged at iteration 21, L1 8.71e-05, Linf 0.00551204, total time[s] 0.092242 +Converged at iteration 27, L1 8.49387e-05, Linf 0.00312668, total time[s] 0.119648 +Converged at iteration 32, L1 4.2828e-05, Linf 0.00594954, total time[s] 0.170392 +Converged at iteration 25, L1 8.06031e-05, Linf 0.00621518, total time[s] 0.16181 +Converged at iteration 24, L1 5.9757e-05, Linf 0.00421275, total time[s] 0.112831 +Converged at iteration 25, L1 7.43417e-05, Linf 0.00574647, total time[s] 0.125571 +Converged at iteration 28, L1 6.80508e-05, Linf 0.00284641, total time[s] 0.152201 +Converged at iteration 24, L1 8.12148e-05, Linf 0.00330567, total time[s] 0.112483 +Converged at iteration 33, L1 5.42725e-05, Linf 0.00550201, total time[s] 0.221655 +Converged at iteration 29, L1 9.1473e-05, Linf 0.00624531, total time[s] 0.18277 +Converged at iteration 30, L1 7.61678e-05, Linf 0.0149527, total time[s] 0.133377 +Converged at iteration 30, L1 8.69621e-05, Linf 0.00205903, total time[s] 0.282599 +Converged at iteration 33, L1 5.68812e-05, Linf 0.00685946, total time[s] 0.180007 +Converged at iteration 26, L1 7.74806e-05, Linf 0.00478198, total time[s] 0.115778 +Converged at iteration 31, L1 6.84423e-05, Linf 0.00488363, total time[s] 0.162516 +Converged at iteration 34, L1 3.98029e-05, Linf 0.0195552, total time[s] 0.15271 +Converged at iteration 27, L1 4.95325e-05, Linf 0.00654556, total time[s] 0.123448 +Converged at iteration 25, L1 9.00689e-05, Linf 0.0073987, total time[s] 0.117105 +Converged at iteration 36, L1 5.2967e-05, Linf 0.0155319, total time[s] 0.173051 +Converged at iteration 39, L1 3.25454e-05, Linf 0.0150568, total time[s] 0.201712 +Converged at iteration 25, L1 9.85189e-05, Linf 0.0105822, total time[s] 0.128633 +Converged at iteration 27, L1 5.84715e-05, Linf 0.00435494, total time[s] 0.19392 +Converged at iteration 23, L1 7.89778e-05, Linf 0.00389702, total time[s] 0.113141 +Converged at iteration 21, L1 9.62351e-05, Linf 0.00483638, total time[s] 0.109721 +Converged at iteration 21, L1 3.53234e-05, Linf 0.00458276, total time[s] 0.126356 +Converged at iteration 23, L1 9.01829e-05, Linf 0.0154575, total time[s] 0.129497 +Converged at iteration 25, L1 6.10969e-05, Linf 0.00705648, total time[s] 0.118124 +Converged at iteration 25, L1 7.86583e-05, Linf 0.00974341, total time[s] 0.122425 +Converged at iteration 19, L1 6.55961e-05, Linf 0.00290995, total time[s] 0.095192 +Converged at iteration 22, L1 7.67019e-05, Linf 0.00498351, total time[s] 0.130553 +Converged at iteration 21, L1 9.54985e-05, Linf 0.00592343, total time[s] 0.125898 +Converged at iteration 32, L1 3.74753e-05, Linf 0.00529019, total time[s] 0.198215 +Converged at iteration 26, L1 9.91734e-05, Linf 0.00607516, total time[s] 0.128485 +Converged at iteration 24, L1 6.37785e-05, Linf 0.00463423, total time[s] 0.106107 +Converged at iteration 28, L1 6.01738e-05, Linf 0.00287093, total time[s] 0.135024 +Converged at iteration 25, L1 6.69318e-05, Linf 0.00584743, total time[s] 0.163477 +Converged at iteration 26, L1 5.96427e-05, Linf 0.00494171, total time[s] 0.120997 +Converged at iteration 25, L1 5.506e-05, Linf 0.00257665, total time[s] 0.173618 +Converged at iteration 33, L1 6.00183e-05, Linf 0.00587224, total time[s] 0.185141 +Converged at iteration 29, L1 8.58698e-05, Linf 0.00529227, total time[s] 0.181842 +Converged at iteration 30, L1 6.22886e-05, Linf 0.0105568, total time[s] 0.196475 +Converged at iteration 30, L1 9.15256e-05, Linf 0.00203635, total time[s] 0.139781 +Converged at iteration 33, L1 5.31206e-05, Linf 0.00461634, total time[s] 0.213743 +Converged at iteration 30, L1 9.72445e-05, Linf 0.0047468, total time[s] 0.138655 +Converged at iteration 25, L1 9.21588e-05, Linf 0.0038799, total time[s] 0.162021 +Converged at iteration 34, L1 4.801e-05, Linf 0.0197829, total time[s] 0.190122 +Converged at iteration 26, L1 8.39773e-05, Linf 0.00930704, total time[s] 0.147796 +Converged at iteration 25, L1 8.54195e-05, Linf 0.0064543, total time[s] 0.11522 +Converged at iteration 36, L1 8.4102e-05, Linf 0.0205942, total time[s] 0.173855 +Converged at iteration 39, L1 4.79524e-05, Linf 0.0170395, total time[s] 0.170544 +Converged at iteration 25, L1 8.3438e-05, Linf 0.00922836, total time[s] 0.114381 +Converged at iteration 27, L1 9.44887e-05, Linf 0.00632773, total time[s] 0.152365 +Converged at iteration 21, L1 8.56302e-05, Linf 0.0069095, total time[s] 0.118197 +Converged at iteration 23, L1 5.66212e-05, Linf 0.00327272, total time[s] 0.16866 +Converged at iteration 24, L1 3.86171e-05, Linf 0.00841463, total time[s] 0.123151 +Converged at iteration 21, L1 4.06769e-05, Linf 0.00356765, total time[s] 0.111445 +Converged at iteration 25, L1 8.40535e-05, Linf 0.010561, total time[s] 0.123841 +Converged at iteration 25, L1 6.60944e-05, Linf 0.00805138, total time[s] 0.130209 +Converged at iteration 19, L1 7.37188e-05, Linf 0.00278381, total time[s] 0.102561 +Converged at iteration 22, L1 8.53156e-05, Linf 0.00605288, total time[s] 0.122885 +Converged at iteration 21, L1 9.5231e-05, Linf 0.0058596, total time[s] 0.118192 +Converged at iteration 32, L1 6.247e-05, Linf 0.00739109, total time[s] 0.154149 +Converged at iteration 24, L1 6.22958e-05, Linf 0.00430393, total time[s] 0.143281 +Converged at iteration 27, L1 6.57858e-05, Linf 0.00286119, total time[s] 0.172668 +Converged at iteration 25, L1 8.17784e-05, Linf 0.0069748, total time[s] 0.117074 +Converged at iteration 28, L1 6.36531e-05, Linf 0.00283122, total time[s] 0.163418 +Converged at iteration 25, L1 7.77541e-05, Linf 0.00600499, total time[s] 0.113555 +Converged at iteration 24, L1 8.19018e-05, Linf 0.00337909, total time[s] 0.104945 +Converged at iteration 33, L1 6.63387e-05, Linf 0.00727304, total time[s] 0.208454 +Converged at iteration 30, L1 6.71396e-05, Linf 0.0053458, total time[s] 0.156589 +Converged at iteration 30, L1 6.09409e-05, Linf 0.0114066, total time[s] 0.142697 +Converged at iteration 30, L1 9.53829e-05, Linf 0.00209446, total time[s] 0.157427 +Converged at iteration 30, L1 9.89881e-05, Linf 0.00514385, total time[s] 0.128798 +Converged at iteration 33, L1 6.37317e-05, Linf 0.00513862, total time[s] 0.232233 +Converged at iteration 26, L1 8.27162e-05, Linf 0.0046461, total time[s] 0.131392 +Converged at iteration 34, L1 5.994e-05, Linf 0.0223694, total time[s] 0.182901 +Converged at iteration 25, L1 9.22607e-05, Linf 0.00739317, total time[s] 0.113287 +Converged at iteration 26, L1 9.76461e-05, Linf 0.0106999, total time[s] 0.146152 +Converged at iteration 39, L1 5.64854e-05, Linf 0.0170141, total time[s] 0.169334 +Converged at iteration 36, L1 5.7034e-05, Linf 0.0153282, total time[s] 0.18107 +Converged at iteration 25, L1 6.71677e-05, Linf 0.00950714, total time[s] 0.118878 +Converged at iteration 27, L1 5.73265e-05, Linf 0.00436013, total time[s] 0.126481 +Converged at iteration 23, L1 9.56562e-05, Linf 0.00432096, total time[s] 0.107465 +Converged at iteration 22, L1 5.56697e-05, Linf 0.00415259, total time[s] 0.138329 +Converged at iteration 20, L1 9.85367e-05, Linf 0.00884208, total time[s] 0.090564 +Converged at iteration 24, L1 3.7048e-05, Linf 0.00977108, total time[s] 0.145572 +Converged at iteration 25, L1 7.79829e-05, Linf 0.00957227, total time[s] 0.114192 +Converged at iteration 25, L1 6.0515e-05, Linf 0.00706531, total time[s] 0.15095 +Converged at iteration 22, L1 8.03647e-05, Linf 0.00577389, total time[s] 0.157704 +Converged at iteration 19, L1 5.33707e-05, Linf 0.00214232, total time[s] 0.102552 +Converged at iteration 22, L1 5.78706e-05, Linf 0.00474851, total time[s] 0.134422 +Converged at iteration 32, L1 4.32945e-05, Linf 0.00493667, total time[s] 0.147449 +Converged at iteration 26, L1 9.52195e-05, Linf 0.00725222, total time[s] 0.134451 +Converged at iteration 24, L1 7.03679e-05, Linf 0.00507143, total time[s] 0.133214 +Converged at iteration 25, L1 7.16361e-05, Linf 0.00703434, total time[s] 0.110091 +Converged at iteration 28, L1 5.87423e-05, Linf 0.00307846, total time[s] 0.163998 +Converged at iteration 26, L1 8.3804e-05, Linf 0.00598904, total time[s] 0.123667 +Converged at iteration 25, L1 6.22031e-05, Linf 0.00288409, total time[s] 0.108142 +Converged at iteration 29, L1 9.22154e-05, Linf 0.00453066, total time[s] 0.134565 +Converged at iteration 33, L1 7.07914e-05, Linf 0.0066264, total time[s] 0.275609 +Converged at iteration 31, L1 5.9411e-05, Linf 0.00159147, total time[s] 0.146445 +Converged at iteration 30, L1 5.00896e-05, Linf 0.0087558, total time[s] 0.155182 +Converged at iteration 30, L1 7.58359e-05, Linf 0.00388476, total time[s] 0.133629 +Converged at iteration 33, L1 6.20729e-05, Linf 0.00507538, total time[s] 0.228164 +Converged at iteration 34, L1 7.12564e-05, Linf 0.0205037, total time[s] 0.19125 +Converged at iteration 25, L1 8.31497e-05, Linf 0.00304048, total time[s] 0.125005 +Converged at iteration 25, L1 8.89637e-05, Linf 0.00693554, total time[s] 0.139238 +Converged at iteration 26, L1 8.93012e-05, Linf 0.00968362, total time[s] 0.135135 +Converged at iteration 36, L1 8.39653e-05, Linf 0.0182951, total time[s] 0.174292 +Converged at iteration 39, L1 7.82648e-05, Linf 0.0183394, total time[s] 0.192347 +Converged at iteration 27, L1 9.92865e-05, Linf 0.00588331, total time[s] 0.137439 +Converged at iteration 25, L1 6.37735e-05, Linf 0.00848547, total time[s] 0.136828 +Converged at iteration 23, L1 7.52783e-05, Linf 0.00388691, total time[s] 0.13596 +Converged at iteration 22, L1 5.18872e-05, Linf 0.00386781, total time[s] 0.105229 +Converged at iteration 21, L1 3.81835e-05, Linf 0.00380355, total time[s] 0.107329 +Converged at iteration 24, L1 4.34955e-05, Linf 0.0102983, total time[s] 0.110769 +Converged at iteration 25, L1 8.259e-05, Linf 0.0103131, total time[s] 0.106472 +Converged at iteration 25, L1 6.2314e-05, Linf 0.00782851, total time[s] 0.174778 +Converged at iteration 22, L1 8.4757e-05, Linf 0.00648693, total time[s] 0.097559 +Converged at iteration 19, L1 5.66675e-05, Linf 0.00184698, total time[s] 0.109233 +Converged at iteration 32, L1 6.65632e-05, Linf 0.00868445, total time[s] 0.180168 +Converged at iteration 22, L1 5.65456e-05, Linf 0.00481964, total time[s] 0.100297 +Converged at iteration 24, L1 7.12898e-05, Linf 0.00473908, total time[s] 0.12533 +Converged at iteration 27, L1 5.69164e-05, Linf 0.00434493, total time[s] 0.141084 +Converged at iteration 28, L1 6.22297e-05, Linf 0.00292214, total time[s] 0.156307 +Converged at iteration 25, L1 8.4285e-05, Linf 0.00799223, total time[s] 0.131321 +Converged at iteration 24, L1 9.53848e-05, Linf 0.00388508, total time[s] 0.113634 +Converged at iteration 26, L1 6.94539e-05, Linf 0.00533709, total time[s] 0.158437 +Converged at iteration 30, L1 7.16959e-05, Linf 0.00477654, total time[s] 0.144841 +Converged at iteration 31, L1 5.71953e-05, Linf 0.00155486, total time[s] 0.167686 +Converged at iteration 33, L1 7.75182e-05, Linf 0.00818422, total time[s] 0.219844 +Converged at iteration 30, L1 5.38672e-05, Linf 0.00962331, total time[s] 0.14878 +Converged at iteration 30, L1 7.66907e-05, Linf 0.00349224, total time[s] 0.171189 +Converged at iteration 33, L1 6.95605e-05, Linf 0.00554116, total time[s] 0.190063 +Converged at iteration 34, L1 8.55412e-05, Linf 0.0227639, total time[s] 0.180228 +Converged at iteration 25, L1 9.08313e-05, Linf 0.00756713, total time[s] 0.130364 +Converged at iteration 26, L1 6.81678e-05, Linf 0.0033697, total time[s] 0.174701 +Converged at iteration 27, L1 4.92503e-05, Linf 0.00576441, total time[s] 0.119535 +Converged at iteration 36, L1 6.68549e-05, Linf 0.0158089, total time[s] 0.160937 +Converged at iteration 39, L1 7.68051e-05, Linf 0.0165765, total time[s] 0.181737 +Converged at iteration 27, L1 6.85761e-05, Linf 0.00459711, total time[s] 0.116505 +Converged at iteration 25, L1 6.82916e-05, Linf 0.00705774, total time[s] 0.154809 +Converged at iteration 22, L1 6.15687e-05, Linf 0.0046034, total time[s] 0.138468 +Converged at iteration 24, L1 5.95805e-05, Linf 0.00346574, total time[s] 0.150481 +Converged at iteration 24, L1 4.86992e-05, Linf 0.0127794, total time[s] 0.151324 +Converged at iteration 21, L1 4.24501e-05, Linf 0.00451493, total time[s] 0.139715 +Converged at iteration 25, L1 5.73334e-05, Linf 0.00733097, total time[s] 0.123462 +Converged at iteration 25, L1 7.95621e-05, Linf 0.00945853, total time[s] 0.119864 +Converged at iteration 18, L1 9.77313e-05, Linf 0.00261836, total time[s] 0.0973 +Converged at iteration 22, L1 6.19498e-05, Linf 0.00501153, total time[s] 0.109591 +Converged at iteration 22, L1 8.59445e-05, Linf 0.0073997, total time[s] 0.17355 +Converged at iteration 27, L1 5.28994e-05, Linf 0.00501365, total time[s] 0.202236 +Converged at iteration 32, L1 5.00629e-05, Linf 0.00670452, total time[s] 0.215274 +Converged at iteration 25, L1 9.06431e-05, Linf 0.00956431, total time[s] 0.120414 +Converged at iteration 24, L1 7.62981e-05, Linf 0.00514121, total time[s] 0.141508 +Converged at iteration 27, L1 6.21178e-05, Linf 0.00504009, total time[s] 0.121434 +Converged at iteration 28, L1 5.77213e-05, Linf 0.00345607, total time[s] 0.178947 +Converged at iteration 33, L1 9.87644e-05, Linf 0.010003, total time[s] 0.207139 +Converged at iteration 25, L1 6.54976e-05, Linf 0.00315121, total time[s] 0.141467 +Converged at iteration 30, L1 3.96943e-05, Linf 0.00684911, total time[s] 0.143243 +Converged at iteration 29, L1 9.35509e-05, Linf 0.00437073, total time[s] 0.180206 +Converged at iteration 33, L1 7.93178e-05, Linf 0.00598629, total time[s] 0.174826 +Converged at iteration 25, L1 9.79342e-05, Linf 0.00351324, total time[s] 0.175131 +Converged at iteration 31, L1 6.75937e-05, Linf 0.0019576, total time[s] 0.182207 +Converged at iteration 27, L1 4.96183e-05, Linf 0.00559305, total time[s] 0.123433 +Converged at iteration 29, L1 9.41937e-05, Linf 0.0075622, total time[s] 0.130944 +Converged at iteration 34, L1 8.60403e-05, Linf 0.0205471, total time[s] 0.141864 +Converged at iteration 25, L1 9.73781e-05, Linf 0.00824142, total time[s] 0.113591 +Converged at iteration 36, L1 9.03551e-05, Linf 0.0176877, total time[s] 0.199785 +Converged at iteration 39, L1 9.393e-05, Linf 0.0179195, total time[s] 0.249719 +Converged at iteration 25, L1 8.19512e-05, Linf 0.00617666, total time[s] 0.134857 +Converged at iteration 28, L1 4.28341e-05, Linf 0.00425564, total time[s] 0.216566 +Converged at iteration 22, L1 5.82527e-05, Linf 0.00439387, total time[s] 0.119289 +Converged at iteration 23, L1 8.66697e-05, Linf 0.00422822, total time[s] 0.143153 +Converged at iteration 24, L1 5.46471e-05, Linf 0.0139895, total time[s] 0.134891 +Converged at iteration 21, L1 4.91281e-05, Linf 0.0048286, total time[s] 0.121819 +Converged at iteration 25, L1 8.58775e-05, Linf 0.0102306, total time[s] 0.133167 +Converged at iteration 25, L1 5.9157e-05, Linf 0.00798683, total time[s] 0.145018 +Converged at iteration 22, L1 9.04813e-05, Linf 0.00802259, total time[s] 0.104953 +Converged at iteration 19, L1 4.77048e-05, Linf 0.00140937, total time[s] 0.105096 +Converged at iteration 22, L1 5.94121e-05, Linf 0.00518795, total time[s] 0.159194 +Converged at iteration 32, L1 6.72298e-05, Linf 0.0072381, total time[s] 0.266952 +Converged at iteration 27, L1 5.57212e-05, Linf 0.00646934, total time[s] 0.161676 +Converged at iteration 24, L1 7.53607e-05, Linf 0.00494887, total time[s] 0.144866 +Converged at iteration 25, L1 9.90831e-05, Linf 0.0101452, total time[s] 0.108596 +Converged at iteration 28, L1 5.87395e-05, Linf 0.00360684, total time[s] 0.151421 +Converged at iteration 26, L1 9.65776e-05, Linf 0.00646795, total time[s] 0.113775 +Converged at iteration 25, L1 5.56542e-05, Linf 0.00284701, total time[s] 0.135769 +Converged at iteration 34, L1 5.27393e-05, Linf 0.00565887, total time[s] 0.152245 +Converged at iteration 30, L1 6.82154e-05, Linf 0.00442676, total time[s] 0.135908 +Converged at iteration 30, L1 4.15373e-05, Linf 0.00543871, total time[s] 0.166863 +Converged at iteration 31, L1 6.25797e-05, Linf 0.0017655, total time[s] 0.149112 +Converged at iteration 33, L1 8.473e-05, Linf 0.0063612, total time[s] 0.20376 +Converged at iteration 26, L1 8.98887e-05, Linf 0.00383181, total time[s] 0.130604 +Converged at iteration 29, L1 9.76264e-05, Linf 0.0075208, total time[s] 0.16001 +Converged at iteration 34, L1 9.82771e-05, Linf 0.0222865, total time[s] 0.140617 +Converged at iteration 27, L1 5.23506e-05, Linf 0.00619743, total time[s] 0.149098 +Converged at iteration 26, L1 4.22456e-05, Linf 0.00294123, total time[s] 0.130554 +Converged at iteration 39, L1 6.77241e-05, Linf 0.015388, total time[s] 0.264155 +Converged at iteration 36, L1 6.04132e-05, Linf 0.0140286, total time[s] 0.393802 +Converged at iteration 27, L1 5.74998e-05, Linf 0.00362839, total time[s] 0.159331 +Converged at iteration 27, L1 5.80272e-05, Linf 0.004084, total time[s] 0.138132 +Converged at iteration 24, L1 7.34266e-05, Linf 0.00391736, total time[s] 0.147117 +Converged at iteration 22, L1 7.35233e-05, Linf 0.00494545, total time[s] 0.110073 +Converged at iteration 21, L1 4.60831e-05, Linf 0.00473284, total time[s] 0.135061 +Converged at iteration 24, L1 5.2985e-05, Linf 0.0101897, total time[s] 0.125177 +Converged at iteration 25, L1 5.20897e-05, Linf 0.00729566, total time[s] 0.153222 +Converged at iteration 25, L1 8.12604e-05, Linf 0.00862273, total time[s] 0.147446 +Converged at iteration 18, L1 8.2937e-05, Linf 0.00226766, total time[s] 0.091093 +Converged at iteration 22, L1 8.78193e-05, Linf 0.00837657, total time[s] 0.154418 +Converged at iteration 22, L1 6.50133e-05, Linf 0.00460415, total time[s] 0.148228 +Converged at iteration 32, L1 4.30856e-05, Linf 0.0046839, total time[s] 0.169957 +Converged at iteration 27, L1 6.64897e-05, Linf 0.00737521, total time[s] 0.143475 +Converged at iteration 25, L1 9.82716e-05, Linf 0.0111681, total time[s] 0.115106 +Converged at iteration 24, L1 7.81982e-05, Linf 0.00536496, total time[s] 0.207737 +Converged at iteration 27, L1 8.08222e-05, Linf 0.00586848, total time[s] 0.147295 +Converged at iteration 28, L1 5.29115e-05, Linf 0.00313479, total time[s] 0.157153 +Converged at iteration 34, L1 5.85991e-05, Linf 0.00753912, total time[s] 0.219717 +Converged at iteration 25, L1 7.47062e-05, Linf 0.00360855, total time[s] 0.170284 +Converged at iteration 29, L1 7.74756e-05, Linf 0.00338921, total time[s] 0.140963 +Converged at iteration 29, L1 9.35951e-05, Linf 0.010468, total time[s] 0.152005 +Converged at iteration 31, L1 7.829e-05, Linf 0.00244495, total time[s] 0.151854 +Converged at iteration 33, L1 8.2189e-05, Linf 0.00609308, total time[s] 0.247534 +Converged at iteration 30, L1 4.53553e-05, Linf 0.00347923, total time[s] 0.160958 +Converged at iteration 26, L1 5.44812e-05, Linf 0.00274957, total time[s] 0.126315 +Converged at iteration 34, L1 7.7123e-05, Linf 0.0182186, total time[s] 0.163214 +Converged at iteration 27, L1 4.89442e-05, Linf 0.00587867, total time[s] 0.16366 +Converged at iteration 26, L1 3.88435e-05, Linf 0.0024582, total time[s] 0.113758 +Converged at iteration 36, L1 7.80246e-05, Linf 0.0156875, total time[s] 0.184754 +Converged at iteration 39, L1 8.40185e-05, Linf 0.0173019, total time[s] 0.191259 +Converged at iteration 27, L1 7.59747e-05, Linf 0.00501441, total time[s] 0.145329 +Converged at iteration 27, L1 6.28467e-05, Linf 0.00377642, total time[s] 0.162725 +Converged at iteration 22, L1 6.59153e-05, Linf 0.00482253, total time[s] 0.117166 +Converged at iteration 24, L1 6.02139e-05, Linf 0.00351372, total time[s] 0.165773 +Converged at iteration 24, L1 5.77766e-05, Linf 0.0112373, total time[s] 0.190678 +Converged at iteration 21, L1 4.9848e-05, Linf 0.0046329, total time[s] 0.122908 +Converged at iteration 25, L1 8.56361e-05, Linf 0.00916574, total time[s] 0.149094 +Converged at iteration 25, L1 5.3908e-05, Linf 0.00795356, total time[s] 0.22086 +Converged at iteration 22, L1 9.04486e-05, Linf 0.00891365, total time[s] 0.101403 +Converged at iteration 18, L1 7.99396e-05, Linf 0.00209241, total time[s] 0.145696 +Converged at iteration 32, L1 6.44291e-05, Linf 0.0074866, total time[s] 0.151995 +Converged at iteration 22, L1 6.33353e-05, Linf 0.00543108, total time[s] 0.135291 +Converged at iteration 24, L1 7.96847e-05, Linf 0.00514938, total time[s] 0.118471 +Converged at iteration 27, L1 6.34621e-05, Linf 0.00785139, total time[s] 0.2057 +Converged at iteration 28, L1 5.33847e-05, Linf 0.0037293, total time[s] 0.168509 +Converged at iteration 26, L1 4.9002e-05, Linf 0.00641582, total time[s] 0.174652 +Converged at iteration 25, L1 6.80273e-05, Linf 0.0034611, total time[s] 0.168645 +Converged at iteration 27, L1 6.96403e-05, Linf 0.00547215, total time[s] 0.21319 +Converged at iteration 29, L1 9.43231e-05, Linf 0.00455536, total time[s] 0.1855 +Converged at iteration 31, L1 7.14712e-05, Linf 0.00221593, total time[s] 0.163066 +Converged at iteration 34, L1 5.92891e-05, Linf 0.00669002, total time[s] 0.2103 +Converged at iteration 30, L1 4.28769e-05, Linf 0.00360756, total time[s] 0.14027 +Converged at iteration 29, L1 9.7932e-05, Linf 0.0103537, total time[s] 0.195166 +Converged at iteration 34, L1 8.62934e-05, Linf 0.0198868, total time[s] 0.175785 +Converged at iteration 33, L1 8.38539e-05, Linf 0.00626505, total time[s] 0.185175 +Converged at iteration 26, L1 4.51449e-05, Linf 0.00225458, total time[s] 0.1301 +Converged at iteration 26, L1 7.63268e-05, Linf 0.00349642, total time[s] 0.144268 +Converged at iteration 27, L1 5.32419e-05, Linf 0.00660909, total time[s] 0.144417 +Converged at iteration 39, L1 7.92654e-05, Linf 0.0161891, total time[s] 0.182195 +Converged at iteration 36, L1 7.67385e-05, Linf 0.0159528, total time[s] 0.215272 +Converged at iteration 27, L1 7.65989e-05, Linf 0.00428044, total time[s] 0.207094 +Converged at iteration 28, L1 4.22934e-05, Linf 0.00446755, total time[s] 0.185496 +Converged at iteration 23, L1 9.2055e-05, Linf 0.00440225, total time[s] 0.124082 +Converged at iteration 22, L1 6.32922e-05, Linf 0.00470005, total time[s] 0.129871 +Converged at iteration 21, L1 5.56028e-05, Linf 0.00517394, total time[s] 0.119754 +Converged at iteration 24, L1 6.65257e-05, Linf 0.0131201, total time[s] 0.127149 +Converged at iteration 25, L1 5.49961e-05, Linf 0.00848677, total time[s] 0.12106 +Converged at iteration 25, L1 8.85818e-05, Linf 0.00966204, total time[s] 0.129077 +Converged at iteration 18, L1 8.61967e-05, Linf 0.00225765, total time[s] 0.107509 +Converged at iteration 22, L1 9.33791e-05, Linf 0.00954361, total time[s] 0.150714 +Converged at iteration 22, L1 6.1763e-05, Linf 0.00542668, total time[s] 0.147105 +Converged at iteration 32, L1 7.32534e-05, Linf 0.00745826, total time[s] 0.151985 +Converged at iteration 27, L1 6.32137e-05, Linf 0.00959244, total time[s] 0.151368 +Converged at iteration 24, L1 7.77498e-05, Linf 0.00508465, total time[s] 0.129176 +Converged at iteration 26, L1 5.26051e-05, Linf 0.00676754, total time[s] 0.207656 +Converged at iteration 28, L1 5.39739e-05, Linf 0.00334564, total time[s] 0.133871 +Converged at iteration 27, L1 6.14855e-05, Linf 0.00509824, total time[s] 0.168219 +Converged at iteration 25, L1 5.96629e-05, Linf 0.00319721, total time[s] 0.202493 +Converged at iteration 34, L1 5.8214e-05, Linf 0.00592772, total time[s] 0.186843 +Converged at iteration 30, L1 6.3464e-05, Linf 0.00423142, total time[s] 0.223887 +Converged at iteration 30, L1 3.78653e-05, Linf 0.00360417, total time[s] 0.147332 +Converged at iteration 31, L1 6.92716e-05, Linf 0.00209113, total time[s] 0.155186 +Converged at iteration 33, L1 8.58544e-05, Linf 0.00810039, total time[s] 0.23519 +Converged at iteration 30, L1 3.90301e-05, Linf 0.00353103, total time[s] 0.187223 +Converged at iteration 27, L1 7.87866e-05, Linf 0.0044632, total time[s] 0.188569 +Converged at iteration 34, L1 8.97437e-05, Linf 0.0207987, total time[s] 0.206054 +Converged at iteration 27, L1 5.32965e-05, Linf 0.00701203, total time[s] 0.189028 +Converged at iteration 26, L1 4.83374e-05, Linf 0.00234303, total time[s] 0.182076 +Converged at iteration 40, L1 6.80987e-05, Linf 0.00367448, total time[s] 0.121588 +Converged at iteration 35, L1 7.63623e-05, Linf 0.00339995, total time[s] 0.097265 +Converged at iteration 30, L1 9.65888e-05, Linf 0.00432839, total time[s] 0.084147 +Converged at iteration 31, L1 6.19818e-05, Linf 0.00502563, total time[s] 0.090612 +Converged at iteration 27, L1 6.25989e-05, Linf 0.00499707, total time[s] 0.107242 +Converged at iteration 22, L1 8.58653e-05, Linf 0.00448845, total time[s] 0.075419 +Converged at iteration 20, L1 9.60171e-05, Linf 0.0039784, total time[s] 0.060785 +Converged at iteration 24, L1 8.84436e-05, Linf 0.00482826, total time[s] 0.070504 +Converged at iteration 28, L1 7.38687e-05, Linf 0.00444863, total time[s] 0.109026 +Converged at iteration 26, L1 8.13413e-05, Linf 0.00547005, total time[s] 0.097296 +Converged at iteration 22, L1 7.39251e-05, Linf 0.00508712, total time[s] 0.073928 +Converged at iteration 19, L1 6.62813e-05, Linf 0.0039314, total time[s] 0.05095 +Converged at iteration 30, L1 8.01833e-05, Linf 0.00330254, total time[s] 0.078573 +Converged at iteration 20, L1 8.44326e-05, Linf 0.00455558, total time[s] 0.067974 +Converged at iteration 24, L1 7.10761e-05, Linf 0.00468283, total time[s] 0.105814 +Converged at iteration 31, L1 8.93422e-05, Linf 0.00570434, total time[s] 0.115651 +Converged at iteration 27, L1 9.91417e-05, Linf 0.00569817, total time[s] 0.103001 +Converged at iteration 24, L1 8.796e-05, Linf 0.00465006, total time[s] 0.107148 +Converged at iteration 23, L1 9.2505e-05, Linf 0.00420574, total time[s] 0.060211 +Converged at iteration 26, L1 7.21879e-05, Linf 0.0044609, total time[s] 0.121702 +Converged at iteration 29, L1 7.81431e-05, Linf 0.00479558, total time[s] 0.127943 +Converged at iteration 34, L1 7.22002e-05, Linf 0.00412691, total time[s] 0.138827 +Converged at iteration 30, L1 9.39499e-05, Linf 0.00442587, total time[s] 0.101527 +Converged at iteration 28, L1 9.49869e-05, Linf 0.00310981, total time[s] 0.084328 +Converged at iteration 32, L1 9.39346e-05, Linf 0.00374081, total time[s] 0.097114 +Converged at iteration 37, L1 7.34635e-05, Linf 0.00327705, total time[s] 0.143913 +Converged at iteration 33, L1 8.44815e-05, Linf 0.00469113, total time[s] 0.088686 +Converged at iteration 28, L1 9.65542e-05, Linf 0.00430189, total time[s] 0.07362 +Converged at iteration 24, L1 8.82982e-05, Linf 0.0032848, total time[s] 0.078783 +Converged at iteration 26, L1 8.99003e-05, Linf 0.00384009, total time[s] 0.090266 +Converged at iteration 38, L1 7.00697e-05, Linf 0.0118371, total time[s] 0.115234 +Converged at iteration 35, L1 6.96088e-05, Linf 0.0109062, total time[s] 0.102454 +Converged at iteration 26, L1 6.08125e-05, Linf 0.00500386, total time[s] 0.070437 +Converged at iteration 30, L1 6.60819e-05, Linf 0.00633573, total time[s] 0.113302 +Converged at iteration 23, L1 5.21955e-05, Linf 0.00426227, total time[s] 0.069467 +Converged at iteration 22, L1 5.72867e-05, Linf 0.0032391, total time[s] 0.185888 +Converged at iteration 19, L1 7.57606e-05, Linf 0.00812781, total time[s] 0.102965 +Converged at iteration 21, L1 9.74315e-05, Linf 0.00763171, total time[s] 0.107 +Converged at iteration 23, L1 5.11392e-05, Linf 0.00367666, total time[s] 0.080198 +Converged at iteration 22, L1 7.04963e-05, Linf 0.00585137, total time[s] 0.07415 +Converged at iteration 19, L1 7.69628e-05, Linf 0.00423732, total time[s] 0.073666 +Converged at iteration 18, L1 5.95107e-05, Linf 0.00462749, total time[s] 0.060097 +Converged at iteration 31, L1 9.05253e-05, Linf 0.00515662, total time[s] 0.166999 +Converged at iteration 19, L1 9.4044e-05, Linf 0.00675785, total time[s] 0.149172 +Converged at iteration 22, L1 8.1083e-05, Linf 0.00598488, total time[s] 0.088744 +Converged at iteration 25, L1 9.98448e-05, Linf 0.00689859, total time[s] 0.123716 +Converged at iteration 25, L1 5.95926e-05, Linf 0.00242975, total time[s] 0.10884 +Converged at iteration 22, L1 7.0706e-05, Linf 0.00215168, total time[s] 0.103028 +Converged at iteration 23, L1 7.60544e-05, Linf 0.00294183, total time[s] 0.106128 +Converged at iteration 25, L1 6.8774e-05, Linf 0.00298907, total time[s] 0.130087 +Converged at iteration 26, L1 6.52626e-05, Linf 0.0029511, total time[s] 0.229719 +Converged at iteration 30, L1 5.8405e-05, Linf 0.00438528, total time[s] 0.131723 +Converged at iteration 28, L1 6.15701e-05, Linf 0.00163078, total time[s] 0.090826 +Converged at iteration 29, L1 7.55029e-05, Linf 0.00535136, total time[s] 0.118362 +Converged at iteration 29, L1 7.18482e-05, Linf 0.00217447, total time[s] 0.084304 +Converged at iteration 29, L1 4.13989e-05, Linf 0.00233999, total time[s] 0.083473 +Converged at iteration 32, L1 5.20278e-05, Linf 0.00886905, total time[s] 0.082795 +Converged at iteration 26, L1 8.15695e-05, Linf 0.00453761, total time[s] 0.071341 +Converged at iteration 25, L1 6.83147e-05, Linf 0.00358075, total time[s] 0.089884 +Converged at iteration 23, L1 7.49867e-05, Linf 0.0059413, total time[s] 0.08415 +Converged at iteration 38, L1 4.13714e-05, Linf 0.0196735, total time[s] 0.163041 +Converged at iteration 36, L1 6.89502e-05, Linf 0.0199175, total time[s] 0.147344 +Converged at iteration 25, L1 9.95569e-05, Linf 0.0108885, total time[s] 0.181498 +Converged at iteration 28, L1 4.60177e-05, Linf 0.00794641, total time[s] 0.104501 +Converged at iteration 24, L1 5.06883e-05, Linf 0.0066121, total time[s] 0.12121 +Converged at iteration 21, L1 5.75998e-05, Linf 0.00795432, total time[s] 0.053921 +Converged at iteration 20, L1 5.803e-05, Linf 0.00670077, total time[s] 0.088219 +Converged at iteration 22, L1 4.84967e-05, Linf 0.00310809, total time[s] 0.118517 +Converged at iteration 24, L1 7.22622e-05, Linf 0.00236747, total time[s] 0.113588 +Converged at iteration 24, L1 8.61168e-05, Linf 0.00255284, total time[s] 0.068402 +Converged at iteration 21, L1 9.25309e-05, Linf 0.00246942, total time[s] 0.086525 +Converged at iteration 19, L1 4.85565e-05, Linf 0.00479329, total time[s] 0.061417 +Converged at iteration 32, L1 4.83522e-05, Linf 0.00669399, total time[s] 0.117589 +Converged at iteration 20, L1 8.3122e-05, Linf 0.00450354, total time[s] 0.07638 +Converged at iteration 23, L1 6.11259e-05, Linf 0.00339398, total time[s] 0.070077 +Converged at iteration 27, L1 5.53702e-05, Linf 0.00260564, total time[s] 0.100034 +Converged at iteration 27, L1 6.6075e-05, Linf 0.00220177, total time[s] 0.09775 +Converged at iteration 23, L1 8.09046e-05, Linf 0.00339147, total time[s] 0.084851 +Converged at iteration 24, L1 6.45261e-05, Linf 0.00187832, total time[s] 0.074327 +Converged at iteration 24, L1 9.21967e-05, Linf 0.00372798, total time[s] 0.21751 +Converged at iteration 27, L1 8.55877e-05, Linf 0.00500117, total time[s] 0.152229 +Converged at iteration 33, L1 6.73729e-05, Linf 0.00510726, total time[s] 0.141707 +Converged at iteration 31, L1 6.75445e-05, Linf 0.00283284, total time[s] 0.16124 +Converged at iteration 31, L1 3.86497e-05, Linf 0.00780113, total time[s] 0.134273 +Converged at iteration 31, L1 7.52971e-05, Linf 0.00294879, total time[s] 0.157887 +Converged at iteration 33, L1 8.27894e-05, Linf 0.00518914, total time[s] 0.138576 +Converged at iteration 33, L1 2.56296e-05, Linf 0.0155469, total time[s] 0.124364 +Converged at iteration 25, L1 7.83131e-05, Linf 0.00341207, total time[s] 0.080709 +Converged at iteration 25, L1 5.33464e-05, Linf 0.0028285, total time[s] 0.097535 +Converged at iteration 26, L1 6.22253e-05, Linf 0.00346869, total time[s] 0.082076 +Converged at iteration 38, L1 4.68225e-05, Linf 0.018997, total time[s] 0.104752 +Converged at iteration 36, L1 6.27653e-05, Linf 0.0173984, total time[s] 0.153951 +Converged at iteration 25, L1 6.63428e-05, Linf 0.00927572, total time[s] 0.102686 +Converged at iteration 26, L1 7.44854e-05, Linf 0.0064932, total time[s] 0.103783 +Converged at iteration 22, L1 8.31986e-05, Linf 0.00299735, total time[s] 0.065349 +Converged at iteration 21, L1 9.36267e-05, Linf 0.00744318, total time[s] 0.072755 +Converged at iteration 21, L1 2.88758e-05, Linf 0.00555469, total time[s] 0.091366 +Converged at iteration 23, L1 6.14299e-05, Linf 0.00917326, total time[s] 0.110592 +Converged at iteration 25, L1 8.32821e-05, Linf 0.0111926, total time[s] 0.169015 +Converged at iteration 25, L1 7.36715e-05, Linf 0.00596689, total time[s] 0.154247 +Converged at iteration 22, L1 5.59887e-05, Linf 0.00312953, total time[s] 0.186616 +Converged at iteration 18, L1 7.15469e-05, Linf 0.00456997, total time[s] 0.052657 +Converged at iteration 32, L1 6.9327e-05, Linf 0.00912846, total time[s] 0.087067 +Converged at iteration 21, L1 8.11702e-05, Linf 0.00574536, total time[s] 0.096308 +Converged at iteration 23, L1 9.25344e-05, Linf 0.00593902, total time[s] 0.086828 +Converged at iteration 27, L1 9.53225e-05, Linf 0.00385901, total time[s] 0.161924 +Converged at iteration 27, L1 9.48877e-05, Linf 0.00403826, total time[s] 0.089713 +Converged at iteration 24, L1 6.78942e-05, Linf 0.00754139, total time[s] 0.089969 +Converged at iteration 24, L1 7.12105e-05, Linf 0.0034626, total time[s] 0.106634 +Converged at iteration 24, L1 9.48987e-05, Linf 0.00596608, total time[s] 0.067656 +Converged at iteration 28, L1 9.12369e-05, Linf 0.00589469, total time[s] 0.105835 +Converged at iteration 32, L1 8.04009e-05, Linf 0.00739362, total time[s] 0.148139 +Converged at iteration 30, L1 6.95427e-05, Linf 0.00208183, total time[s] 0.094911 +Converged at iteration 30, L1 8.68068e-05, Linf 0.0157275, total time[s] 0.081621 +Converged at iteration 31, L1 7.54963e-05, Linf 0.00835936, total time[s] 0.12178 +Converged at iteration 32, L1 9.29826e-05, Linf 0.006654, total time[s] 0.104618 +Converged at iteration 33, L1 8.72193e-05, Linf 0.0269212, total time[s] 0.144774 +Converged at iteration 25, L1 8.56088e-05, Linf 0.00434214, total time[s] 0.219838 +Converged at iteration 25, L1 7.94294e-05, Linf 0.00423912, total time[s] 0.205719 +Converged at iteration 26, L1 8.34938e-05, Linf 0.00955517, total time[s] 0.091357 +Converged at iteration 39, L1 3.53729e-05, Linf 0.00954757, total time[s] 0.148304 +Converged at iteration 37, L1 3.59748e-05, Linf 0.00911032, total time[s] 0.129573 +Converged at iteration 26, L1 3.94934e-05, Linf 0.00449758, total time[s] 0.114784 +Converged at iteration 28, L1 6.04679e-05, Linf 0.00713057, total time[s] 0.147792 +Converged at iteration 22, L1 6.01658e-05, Linf 0.00279874, total time[s] 0.090046 +Converged at iteration 22, L1 7.1903e-05, Linf 0.0048931, total time[s] 0.124804 +Converged at iteration 21, L1 3.63518e-05, Linf 0.00299062, total time[s] 0.109407 +Converged at iteration 24, L1 4.91687e-05, Linf 0.010515, total time[s] 0.099626 +Converged at iteration 26, L1 4.81621e-05, Linf 0.00569047, total time[s] 0.088641 +Converged at iteration 25, L1 7.5769e-05, Linf 0.00754578, total time[s] 0.07114 +Converged at iteration 22, L1 7.26283e-05, Linf 0.00475431, total time[s] 0.111909 +Converged at iteration 18, L1 6.8427e-05, Linf 0.0027483, total time[s] 0.094637 +Converged at iteration 33, L1 4.23871e-05, Linf 0.00505452, total time[s] 0.146735 +Converged at iteration 21, L1 7.97526e-05, Linf 0.00541925, total time[s] 0.096449 +Converged at iteration 23, L1 9.82655e-05, Linf 0.0055622, total time[s] 0.08022 +Converged at iteration 27, L1 8.22028e-05, Linf 0.00376904, total time[s] 0.115323 +Converged at iteration 28, L1 6.58445e-05, Linf 0.00351631, total time[s] 0.109736 +Converged at iteration 25, L1 7.45746e-05, Linf 0.00782787, total time[s] 0.075639 +Converged at iteration 23, L1 9.30885e-05, Linf 0.00372719, total time[s] 0.124108 +Converged at iteration 25, L1 6.91372e-05, Linf 0.0050502, total time[s] 0.106213 +Converged at iteration 30, L1 6.47622e-05, Linf 0.00521629, total time[s] 0.081707 +Converged at iteration 33, L1 5.98561e-05, Linf 0.00538526, total time[s] 0.102995 +Converged at iteration 30, L1 6.47113e-05, Linf 0.00181396, total time[s] 0.082981 +Converged at iteration 30, L1 7.78671e-05, Linf 0.0139472, total time[s] 0.089096 +Converged at iteration 31, L1 7.08357e-05, Linf 0.00681322, total time[s] 0.127654 +Converged at iteration 33, L1 6.45196e-05, Linf 0.00631382, total time[s] 0.091221 +Converged at iteration 34, L1 5.32661e-05, Linf 0.0207529, total time[s] 0.099339 +Converged at iteration 27, L1 7.91616e-05, Linf 0.00392667, total time[s] 0.094996 +Converged at iteration 25, L1 7.87775e-05, Linf 0.00533819, total time[s] 0.096063 +Converged at iteration 27, L1 4.99082e-05, Linf 0.00769802, total time[s] 0.091813 +Converged at iteration 39, L1 5.21038e-05, Linf 0.0155437, total time[s] 0.122351 +Converged at iteration 36, L1 7.15038e-05, Linf 0.013808, total time[s] 0.151069 +Converged at iteration 25, L1 9.84435e-05, Linf 0.0110821, total time[s] 0.148824 +Converged at iteration 27, L1 9.05727e-05, Linf 0.00703848, total time[s] 0.166429 +Converged at iteration 23, L1 8.94587e-05, Linf 0.00430566, total time[s] 0.145309 +Converged at iteration 22, L1 7.18081e-05, Linf 0.00414344, total time[s] 0.113969 +Converged at iteration 20, L1 5.35415e-05, Linf 0.00718373, total time[s] 0.090288 +Converged at iteration 24, L1 3.63304e-05, Linf 0.00791313, total time[s] 0.103458 +Converged at iteration 25, L1 9.01509e-05, Linf 0.0117583, total time[s] 0.158869 +Converged at iteration 25, L1 6.15598e-05, Linf 0.00553003, total time[s] 0.173833 +Converged at iteration 22, L1 6.12929e-05, Linf 0.00374883, total time[s] 0.118534 +Converged at iteration 17, L1 9.45026e-05, Linf 0.00342995, total time[s] 0.06531 +Converged at iteration 32, L1 6.89498e-05, Linf 0.00606072, total time[s] 0.129842 +Converged at iteration 22, L1 6.01669e-05, Linf 0.00502293, total time[s] 0.081923 +Converged at iteration 24, L1 6.16228e-05, Linf 0.00468703, total time[s] 0.105912 +Converged at iteration 26, L1 9.33172e-05, Linf 0.00705506, total time[s] 0.108101 +Converged at iteration 28, L1 5.43143e-05, Linf 0.00302573, total time[s] 0.11676 +Converged at iteration 25, L1 6.17993e-05, Linf 0.00736146, total time[s] 0.126837 +Converged at iteration 25, L1 5.774e-05, Linf 0.0121264, total time[s] 0.144205 +Converged at iteration 26, L1 7.94475e-05, Linf 0.00544192, total time[s] 0.144233 +Converged at iteration 29, L1 7.03408e-05, Linf 0.00405156, total time[s] 0.142129 +Converged at iteration 33, L1 6.30423e-05, Linf 0.00581094, total time[s] 0.140221 +Converged at iteration 30, L1 8.9272e-05, Linf 0.00244053, total time[s] 0.113105 +Converged at iteration 30, L1 5.73652e-05, Linf 0.0100293, total time[s] 0.179931 +Converged at iteration 31, L1 6.08384e-05, Linf 0.00386229, total time[s] 0.102215 +Converged at iteration 33, L1 6.83153e-05, Linf 0.0051782, total time[s] 0.10184 +Converged at iteration 34, L1 7.81095e-05, Linf 0.0206268, total time[s] 0.16929 +Converged at iteration 25, L1 7.9719e-05, Linf 0.00475017, total time[s] 0.073144 +Converged at iteration 25, L1 8.74142e-05, Linf 0.00492491, total time[s] 0.164273 +Converged at iteration 26, L1 8.93586e-05, Linf 0.0101013, total time[s] 0.14019 +Converged at iteration 39, L1 3.58659e-05, Linf 0.0107495, total time[s] 0.117896 +Converged at iteration 36, L1 6.41744e-05, Linf 0.0133334, total time[s] 0.172341 +Converged at iteration 25, L1 9.68818e-05, Linf 0.00894861, total time[s] 0.083294 +Converged at iteration 29, L1 3.84267e-05, Linf 0.00533494, total time[s] 0.160632 +Converged at iteration 23, L1 6.11054e-05, Linf 0.00329676, total time[s] 0.070738 +Converged at iteration 22, L1 7.24695e-05, Linf 0.00432665, total time[s] 0.101505 +Converged at iteration 20, L1 5.90653e-05, Linf 0.0054826, total time[s] 0.116125 +Converged at iteration 24, L1 5.10801e-05, Linf 0.0111678, total time[s] 0.076641 +Converged at iteration 26, L1 4.60311e-05, Linf 0.00597481, total time[s] 0.084879 +Converged at iteration 25, L1 7.07752e-05, Linf 0.00735729, total time[s] 0.125256 +Converged at iteration 22, L1 6.77286e-05, Linf 0.0048485, total time[s] 0.113232 +Converged at iteration 18, L1 8.50142e-05, Linf 0.00408191, total time[s] 0.081461 +Converged at iteration 32, L1 7.60935e-05, Linf 0.00807242, total time[s] 0.120941 +Converged at iteration 22, L1 5.45335e-05, Linf 0.0043998, total time[s] 0.09154 +Converged at iteration 24, L1 6.49536e-05, Linf 0.00453706, total time[s] 0.084255 +Converged at iteration 27, L1 6.7871e-05, Linf 0.00298068, total time[s] 0.16584 +Converged at iteration 28, L1 5.72922e-05, Linf 0.00329161, total time[s] 0.094929 +Converged at iteration 25, L1 7.60364e-05, Linf 0.00929569, total time[s] 0.071452 +Converged at iteration 24, L1 7.79858e-05, Linf 0.00356419, total time[s] 0.071007 +Converged at iteration 26, L1 5.75582e-05, Linf 0.00470574, total time[s] 0.113717 +Converged at iteration 30, L1 6.92464e-05, Linf 0.00530472, total time[s] 0.088472 +Converged at iteration 33, L1 6.66279e-05, Linf 0.00627638, total time[s] 0.113556 +Converged at iteration 30, L1 7.1339e-05, Linf 0.00218788, total time[s] 0.08455 +Converged at iteration 30, L1 6.59887e-05, Linf 0.0118466, total time[s] 0.130612 +Converged at iteration 31, L1 6.00181e-05, Linf 0.00432465, total time[s] 0.14362 +Converged at iteration 33, L1 7.06577e-05, Linf 0.00544859, total time[s] 0.125538 +Converged at iteration 34, L1 5.4495e-05, Linf 0.0190801, total time[s] 0.10797 +Converged at iteration 26, L1 6.30347e-05, Linf 0.0027561, total time[s] 0.070409 +Converged at iteration 26, L1 5.25617e-05, Linf 0.00317843, total time[s] 0.099045 +Converged at iteration 26, L1 9.91685e-05, Linf 0.0119745, total time[s] 0.085713 +Converged at iteration 39, L1 7.18476e-05, Linf 0.0156492, total time[s] 0.14205 +Converged at iteration 36, L1 7.25057e-05, Linf 0.0137551, total time[s] 0.104293 +Converged at iteration 25, L1 8.22297e-05, Linf 0.0100339, total time[s] 0.065618 +Converged at iteration 28, L1 4.99317e-05, Linf 0.00435441, total time[s] 0.097568 +Converged at iteration 24, L1 6.69907e-05, Linf 0.00709139, total time[s] 0.086999 +Converged at iteration 22, L1 7.87011e-05, Linf 0.004283, total time[s] 0.06926 +Converged at iteration 20, L1 5.13835e-05, Linf 0.00482607, total time[s] 0.059956 +Converged at iteration 24, L1 4.25533e-05, Linf 0.00961414, total time[s] 0.104445 +Converged at iteration 25, L1 9.94773e-05, Linf 0.0124522, total time[s] 0.100396 +Converged at iteration 25, L1 5.97039e-05, Linf 0.0061165, total time[s] 0.11279 +Converged at iteration 22, L1 6.45356e-05, Linf 0.00441411, total time[s] 0.071825 +Converged at iteration 18, L1 6.61015e-05, Linf 0.0038938, total time[s] 0.07796 +Converged at iteration 32, L1 6.41684e-05, Linf 0.00569057, total time[s] 0.138195 +Converged at iteration 22, L1 5.87933e-05, Linf 0.00493979, total time[s] 0.071538 +Converged at iteration 24, L1 6.72199e-05, Linf 0.00466913, total time[s] 0.098154 +Converged at iteration 27, L1 5.32927e-05, Linf 0.00516077, total time[s] 0.110694 +Converged at iteration 28, L1 5.39929e-05, Linf 0.00365733, total time[s] 0.085218 +Converged at iteration 25, L1 7.21468e-05, Linf 0.00865479, total time[s] 0.066402 +Converged at iteration 25, L1 5.65906e-05, Linf 0.00304632, total time[s] 0.093396 +Converged at iteration 26, L1 8.56021e-05, Linf 0.0057411, total time[s] 0.122042 +Converged at iteration 29, L1 9.24976e-05, Linf 0.00512689, total time[s] 0.096067 +Converged at iteration 33, L1 7.31524e-05, Linf 0.00688735, total time[s] 0.115743 +Converged at iteration 30, L1 8.39729e-05, Linf 0.0024385, total time[s] 0.115717 +Converged at iteration 30, L1 5.2981e-05, Linf 0.00941547, total time[s] 0.144778 +Converged at iteration 30, L1 9.31461e-05, Linf 0.00476372, total time[s] 0.097737 +Converged at iteration 33, L1 7.85466e-05, Linf 0.00569093, total time[s] 0.126764 +Converged at iteration 34, L1 7.95099e-05, Linf 0.020231, total time[s] 0.110205 +Converged at iteration 25, L1 8.47356e-05, Linf 0.00372216, total time[s] 0.143948 +Converged at iteration 26, L1 4.82003e-05, Linf 0.00325511, total time[s] 0.160811 +Converged at iteration 26, L1 9.13088e-05, Linf 0.0108938, total time[s] 0.088629 +Converged at iteration 39, L1 5.27604e-05, Linf 0.0138911, total time[s] 0.117634 +Converged at iteration 36, L1 7.25218e-05, Linf 0.0138729, total time[s] 0.104456 +Converged at iteration 25, L1 7.50734e-05, Linf 0.00831195, total time[s] 0.076989 +Converged at iteration 28, L1 8.03619e-05, Linf 0.00624205, total time[s] 0.108454 +Converged at iteration 23, L1 8.51214e-05, Linf 0.00415623, total time[s] 0.0819 +Converged at iteration 22, L1 5.66564e-05, Linf 0.00425783, total time[s] 0.060009 +Converged at iteration 20, L1 6.58339e-05, Linf 0.00694799, total time[s] 0.069546 +Converged at iteration 24, L1 5.77094e-05, Linf 0.0125509, total time[s] 0.09879 +Converged at iteration 26, L1 4.23621e-05, Linf 0.00514706, total time[s] 0.121697 +Converged at iteration 25, L1 6.41982e-05, Linf 0.00724288, total time[s] 0.073593 +Converged at iteration 22, L1 7.06564e-05, Linf 0.00546171, total time[s] 0.089038 +Converged at iteration 18, L1 8.60576e-05, Linf 0.00548625, total time[s] 0.057792 +Converged at iteration 32, L1 6.95435e-05, Linf 0.00663319, total time[s] 0.121629 +Converged at iteration 22, L1 5.6888e-05, Linf 0.00474834, total time[s] 0.119193 +Converged at iteration 24, L1 7.11028e-05, Linf 0.00482742, total time[s] 0.079807 +Converged at iteration 27, L1 5.63854e-05, Linf 0.00421149, total time[s] 0.080958 +Converged at iteration 28, L1 5.62866e-05, Linf 0.00328912, total time[s] 0.116489 +Converged at iteration 25, L1 8.54522e-05, Linf 0.0106061, total time[s] 0.090451 +Converged at iteration 24, L1 9.29232e-05, Linf 0.00424611, total time[s] 0.078078 +Converged at iteration 26, L1 7.8612e-05, Linf 0.00555661, total time[s] 0.079134 +Converged at iteration 30, L1 6.97645e-05, Linf 0.00507436, total time[s] 0.124099 +Converged at iteration 33, L1 7.62534e-05, Linf 0.00740267, total time[s] 0.100929 +Converged at iteration 30, L1 8.05251e-05, Linf 0.00229735, total time[s] 0.09537 +Converged at iteration 30, L1 5.59877e-05, Linf 0.0101959, total time[s] 0.116775 +Converged at iteration 30, L1 8.0995e-05, Linf 0.00432371, total time[s] 0.119038 +Converged at iteration 33, L1 7.76882e-05, Linf 0.00598562, total time[s] 0.122377 +Converged at iteration 34, L1 7.22805e-05, Linf 0.0200886, total time[s] 0.113937 +Converged at iteration 26, L1 5.83529e-05, Linf 0.00441748, total time[s] 0.116607 +Converged at iteration 26, L1 5.79595e-05, Linf 0.00331629, total time[s] 0.083286 +Converged at iteration 26, L1 9.92752e-05, Linf 0.0121141, total time[s] 0.11043 +Converged at iteration 39, L1 6.43829e-05, Linf 0.0158964, total time[s] 0.123692 +Converged at iteration 36, L1 6.7672e-05, Linf 0.0137001, total time[s] 0.095627 +Converged at iteration 25, L1 7.35005e-05, Linf 0.00901436, total time[s] 0.087499 +Converged at iteration 28, L1 4.55993e-05, Linf 0.00403802, total time[s] 0.076093 +Converged at iteration 24, L1 5.83664e-05, Linf 0.0036535, total time[s] 0.08075 +Converged at iteration 22, L1 6.44394e-05, Linf 0.00438921, total time[s] 0.059715 +Converged at iteration 20, L1 5.96374e-05, Linf 0.00617922, total time[s] 0.109205 +Converged at iteration 24, L1 5.28483e-05, Linf 0.0117328, total time[s] 0.084503 +Converged at iteration 25, L1 9.46007e-05, Linf 0.0117345, total time[s] 0.115941 +Converged at iteration 25, L1 5.78771e-05, Linf 0.00632793, total time[s] 0.087663 +Converged at iteration 22, L1 6.84439e-05, Linf 0.00523509, total time[s] 0.098043 +Converged at iteration 18, L1 8.19822e-05, Linf 0.00537882, total time[s] 0.067805 +Converged at iteration 32, L1 5.77363e-05, Linf 0.00683285, total time[s] 0.139723 +Converged at iteration 22, L1 6.43031e-05, Linf 0.00501989, total time[s] 0.068838 +Converged at iteration 24, L1 7.15765e-05, Linf 0.00477774, total time[s] 0.108395 +Converged at iteration 27, L1 5.44363e-05, Linf 0.00754775, total time[s] 0.103568 +Converged at iteration 28, L1 5.45888e-05, Linf 0.00354933, total time[s] 0.104313 +Converged at iteration 25, L1 8.20152e-05, Linf 0.0102304, total time[s] 0.094093 +Converged at iteration 25, L1 6.22242e-05, Linf 0.00322687, total time[s] 0.082316 +Converged at iteration 26, L1 9.22908e-05, Linf 0.00622596, total time[s] 0.126301 +Converged at iteration 29, L1 9.99497e-05, Linf 0.00520292, total time[s] 0.113595 +Converged at iteration 33, L1 8.35923e-05, Linf 0.00788418, total time[s] 0.128908 +Converged at iteration 30, L1 8.88148e-05, Linf 0.00235301, total time[s] 0.10334 +Converged at iteration 30, L1 5.01199e-05, Linf 0.00850402, total time[s] 0.097993 +Converged at iteration 30, L1 6.96996e-05, Linf 0.00399673, total time[s] 0.100893 +Converged at iteration 33, L1 7.95012e-05, Linf 0.00596925, total time[s] 0.102843 +Converged at iteration 34, L1 8.01451e-05, Linf 0.0196895, total time[s] 0.127501 +Converged at iteration 25, L1 9.5714e-05, Linf 0.00624849, total time[s] 0.113788 +Converged at iteration 26, L1 5.28677e-05, Linf 0.00333905, total time[s] 0.10278 +Converged at iteration 26, L1 9.79866e-05, Linf 0.0115984, total time[s] 0.092627 +Converged at iteration 39, L1 7.71771e-05, Linf 0.0160581, total time[s] 0.125298 +Converged at iteration 36, L1 8.10137e-05, Linf 0.014698, total time[s] 0.136371 +Converged at iteration 25, L1 9.81915e-05, Linf 0.0072544, total time[s] 0.107 +Converged at iteration 28, L1 6.39513e-05, Linf 0.00514806, total time[s] 0.116089 +Converged at iteration 23, L1 9.48625e-05, Linf 0.00449527, total time[s] 0.134379 +Converged at iteration 22, L1 6.03929e-05, Linf 0.00432626, total time[s] 0.087995 +Converged at iteration 20, L1 7.65949e-05, Linf 0.00822611, total time[s] 0.082738 +Converged at iteration 24, L1 6.39954e-05, Linf 0.0136968, total time[s] 0.124434 +Converged at iteration 25, L1 9.56883e-05, Linf 0.0123356, total time[s] 0.08822 +Converged at iteration 25, L1 6.00494e-05, Linf 0.00722741, total time[s] 0.106293 +Converged at iteration 22, L1 7.3545e-05, Linf 0.0063049, total time[s] 0.069086 +Converged at iteration 18, L1 8.46129e-05, Linf 0.00635524, total time[s] 0.08399 +Converged at iteration 32, L1 6.75095e-05, Linf 0.00697284, total time[s] 0.098065 +Converged at iteration 22, L1 5.98248e-05, Linf 0.00498892, total time[s] 0.067886 +Converged at iteration 24, L1 7.54946e-05, Linf 0.0061852, total time[s] 0.115138 +Converged at iteration 27, L1 5.50566e-05, Linf 0.00705132, total time[s] 0.10596 +Converged at iteration 28, L1 5.49366e-05, Linf 0.00330527, total time[s] 0.096312 +Converged at iteration 25, L1 9.41076e-05, Linf 0.0120566, total time[s] 0.112215 +Converged at iteration 25, L1 5.73497e-05, Linf 0.00302479, total time[s] 0.077517 +Converged at iteration 26, L1 9.05042e-05, Linf 0.00620135, total time[s] 0.098343 +Converged at iteration 30, L1 6.77923e-05, Linf 0.00478591, total time[s] 0.111289 +Converged at iteration 33, L1 8.79795e-05, Linf 0.00948201, total time[s] 0.126939 +Converged at iteration 30, L1 8.84138e-05, Linf 0.00223251, total time[s] 0.113919 +Converged at iteration 30, L1 4.91824e-05, Linf 0.0083988, total time[s] 0.105987 +Converged at iteration 30, L1 6.03966e-05, Linf 0.00350001, total time[s] 0.097671 +Converged at iteration 33, L1 7.78184e-05, Linf 0.0061585, total time[s] 0.099799 +Converged at iteration 34, L1 8.69078e-05, Linf 0.0203787, total time[s] 0.11378 +Converged at iteration 25, L1 8.89582e-05, Linf 0.00370487, total time[s] 0.066459 +Converged at iteration 26, L1 5.69441e-05, Linf 0.00338396, total time[s] 0.068132 +Converged at iteration 26, L1 9.95461e-05, Linf 0.0124678, total time[s] 0.102501 +Converged at iteration 39, L1 6.55492e-05, Linf 0.0161439, total time[s] 0.192202 +Converged at iteration 36, L1 6.36754e-05, Linf 0.0139168, total time[s] 0.157998 +Converged at iteration 26, L1 8.30268e-05, Linf 0.00292986, total time[s] 0.081727 +Converged at iteration 27, L1 8.99266e-05, Linf 0.00471922, total time[s] 0.094123 +Converged at iteration 24, L1 6.18113e-05, Linf 0.00393506, total time[s] 0.10787 +Converged at iteration 22, L1 6.61948e-05, Linf 0.00451294, total time[s] 0.081383 +Converged at iteration 20, L1 7.25647e-05, Linf 0.00739918, total time[s] 0.073818 +Converged at iteration 24, L1 5.82491e-05, Linf 0.013025, total time[s] 0.084156 +Converged at iteration 25, L1 8.9288e-05, Linf 0.0107393, total time[s] 0.09984 +Converged at iteration 25, L1 5.62814e-05, Linf 0.00666262, total time[s] 0.066859 +Converged at iteration 22, L1 7.15874e-05, Linf 0.00610859, total time[s] 0.065777 +Converged at iteration 18, L1 8.52465e-05, Linf 0.00632525, total time[s] 0.087997 +Converged at iteration 32, L1 5.05542e-05, Linf 0.00575341, total time[s] 0.103541 +Converged at iteration 22, L1 6.57299e-05, Linf 0.00519106, total time[s] 0.115792 +Converged at iteration 24, L1 7.20515e-05, Linf 0.00482022, total time[s] 0.07322 +Converged at iteration 27, L1 5.58938e-05, Linf 0.00845361, total time[s] 0.079415 +Converged at iteration 28, L1 5.27228e-05, Linf 0.00396253, total time[s] 0.097019 +Converged at iteration 25, L1 8.98467e-05, Linf 0.0118329, total time[s] 0.072447 +Converged at iteration 25, L1 6.24543e-05, Linf 0.00338083, total time[s] 0.097552 +Converged at iteration 26, L1 9.84353e-05, Linf 0.00665704, total time[s] 0.098508 +Converged at iteration 29, L1 9.96393e-05, Linf 0.00504852, total time[s] 0.094267 +Converged at iteration 33, L1 9.14987e-05, Linf 0.00882642, total time[s] 0.132629 +Converged at iteration 30, L1 9.46213e-05, Linf 0.00243214, total time[s] 0.101942 +Converged at iteration 30, L1 4.08759e-05, Linf 0.00744612, total time[s] 0.093037 +Converged at iteration 30, L1 5.04269e-05, Linf 0.00377294, total time[s] 0.099234 +Converged at iteration 33, L1 8.14007e-05, Linf 0.00613144, total time[s] 0.135356 +Converged at iteration 34, L1 7.95541e-05, Linf 0.0197976, total time[s] 0.107301 +Converged at iteration 25, L1 9.84325e-05, Linf 0.00399219, total time[s] 0.090842 +Converged at iteration 26, L1 4.97513e-05, Linf 0.00333562, total time[s] 0.079657 +Converged at iteration 27, L1 4.78406e-05, Linf 0.00640501, total time[s] 0.12374 +Converged at iteration 39, L1 7.57506e-05, Linf 0.01673, total time[s] 0.105533 +Converged at iteration 36, L1 8.60044e-05, Linf 0.0152092, total time[s] 0.13911 +Converged at iteration 27, L1 6.54081e-05, Linf 0.00305729, total time[s] 0.104391 +Converged at iteration 28, L1 5.17428e-05, Linf 0.00451085, total time[s] 0.122473 +Converged at iteration 23, L1 9.88363e-05, Linf 0.00469615, total time[s] 0.08372 +Converged at iteration 22, L1 6.33232e-05, Linf 0.00449806, total time[s] 0.065901 +Converged at iteration 20, L1 8.43545e-05, Linf 0.00967893, total time[s] 0.069336 +Converged at iteration 24, L1 6.46246e-05, Linf 0.0142547, total time[s] 0.131733 +Converged at iteration 25, L1 9.2833e-05, Linf 0.0110888, total time[s] 0.108764 +Converged at iteration 25, L1 5.71469e-05, Linf 0.00729889, total time[s] 0.088873 +Converged at iteration 22, L1 7.66311e-05, Linf 0.00695647, total time[s] 0.075223 +Converged at iteration 18, L1 8.73508e-05, Linf 0.00687466, total time[s] 0.063786 +Converged at iteration 32, L1 6.32104e-05, Linf 0.00669401, total time[s] 0.129596 +Converged at iteration 22, L1 6.35396e-05, Linf 0.0052189, total time[s] 0.064771 +Converged at iteration 24, L1 7.4533e-05, Linf 0.00496796, total time[s] 0.076386 +Converged at iteration 27, L1 5.8903e-05, Linf 0.010538, total time[s] 0.106305 +Converged at iteration 28, L1 5.38279e-05, Linf 0.00328807, total time[s] 0.14387 +Converged at iteration 26, L1 4.78864e-05, Linf 0.00743004, total time[s] 0.125314 +Converged at iteration 25, L1 6.09946e-05, Linf 0.00320625, total time[s] 0.077314 +Converged at iteration 26, L1 9.91632e-05, Linf 0.00654858, total time[s] 0.112458 +Converged at iteration 30, L1 6.78093e-05, Linf 0.00454968, total time[s] 0.113294 +Converged at iteration 33, L1 9.47911e-05, Linf 0.0104135, total time[s] 0.090967 +Converged at iteration 30, L1 9.61104e-05, Linf 0.00241553, total time[s] 0.097914 +Converged at iteration 30, L1 4.18222e-05, Linf 0.00746894, total time[s] 0.077481 +Converged at iteration 30, L1 4.66815e-05, Linf 0.00339049, total time[s] 0.102022 +Converged at iteration 33, L1 7.76594e-05, Linf 0.00627132, total time[s] 0.117345 +Converged at iteration 34, L1 8.90986e-05, Linf 0.0201448, total time[s] 0.15855 +Converged at iteration 25, L1 8.72416e-05, Linf 0.00541641, total time[s] 0.068567 +Converged at iteration 26, L1 5.713e-05, Linf 0.00313189, total time[s] 0.087474 +Converged at iteration 27, L1 4.68365e-05, Linf 0.00672637, total time[s] 0.077412 +Converged at iteration 39, L1 6.63867e-05, Linf 0.0163666, total time[s] 0.216761 +Converged at iteration 36, L1 6.30791e-05, Linf 0.0140307, total time[s] 0.114022 +Converged at iteration 27, L1 7.21624e-05, Linf 0.00346021, total time[s] 0.156775 +Converged at iteration 41, L1 8.97574e-05, Linf 0.00286368, total time[s] 0.184145 +Converged at iteration 24, L1 6.34004e-05, Linf 0.00398832, total time[s] 0.076174 +Converged at iteration 22, L1 7.15344e-05, Linf 0.00463373, total time[s] 0.08527 +Converged at iteration 20, L1 8.35966e-05, Linf 0.00825135, total time[s] 0.079001 +Converged at iteration 24, L1 6.23062e-05, Linf 0.0138555, total time[s] 0.100145 +Converged at iteration 25, L1 8.80153e-05, Linf 0.00988498, total time[s] 0.073689 +Converged at iteration 25, L1 5.48391e-05, Linf 0.00695634, total time[s] 0.094832 +Converged at iteration 22, L1 7.4711e-05, Linf 0.00695509, total time[s] 0.063576 +Converged at iteration 18, L1 8.33829e-05, Linf 0.00692194, total time[s] 0.055684 +Converged at iteration 32, L1 4.63924e-05, Linf 0.00455813, total time[s] 0.113755 +Converged at iteration 22, L1 6.64624e-05, Linf 0.0053658, total time[s] 0.06138 +Converged at iteration 24, L1 7.38831e-05, Linf 0.00488378, total time[s] 0.112533 +Converged at iteration 27, L1 6.25991e-05, Linf 0.00916967, total time[s] 0.078183 +Converged at iteration 28, L1 5.18801e-05, Linf 0.00425141, total time[s] 0.098593 +Converged at iteration 25, L1 9.87363e-05, Linf 0.0129363, total time[s] 0.097355 +Converged at iteration 25, L1 6.46065e-05, Linf 0.00344188, total time[s] 0.115957 +Converged at iteration 27, L1 6.45688e-05, Linf 0.0048542, total time[s] 0.086223 +Converged at iteration 29, L1 9.89774e-05, Linf 0.0049263, total time[s] 0.140879 +Converged at iteration 33, L1 9.73506e-05, Linf 0.0104491, total time[s] 0.098506 +Converged at iteration 31, L1 5.82789e-05, Linf 0.0017789, total time[s] 0.145855 +Converged at iteration 30, L1 4.19924e-05, Linf 0.00686634, total time[s] 0.123559 +Converged at iteration 29, L1 9.33955e-05, Linf 0.00761576, total time[s] 0.080736 +Converged at iteration 33, L1 8.11448e-05, Linf 0.00620679, total time[s] 0.118458 +Converged at iteration 34, L1 8.29763e-05, Linf 0.0191578, total time[s] 0.116971 +Converged at iteration 26, L1 5.74857e-05, Linf 0.00286957, total time[s] 0.090959 +Converged at iteration 26, L1 5.05696e-05, Linf 0.0030953, total time[s] 0.081653 +Converged at iteration 27, L1 4.96597e-05, Linf 0.00665773, total time[s] 0.120433 +Converged at iteration 39, L1 6.13097e-05, Linf 0.0166822, total time[s] 0.13284 +Converged at iteration 36, L1 6.82728e-05, Linf 0.014255, total time[s] 0.124496 +Converged at iteration 27, L1 7.7371e-05, Linf 0.0038464, total time[s] 0.080018 +Converged at iteration 27, L1 5.97682e-05, Linf 0.00441985, total time[s] 0.105476 +Converged at iteration 24, L1 7.0645e-05, Linf 0.00418509, total time[s] 0.10699 +Converged at iteration 22, L1 6.8981e-05, Linf 0.00464342, total time[s] 0.144735 +Converged at iteration 20, L1 8.72289e-05, Linf 0.00930962, total time[s] 0.063013 +Converged at iteration 24, L1 6.47002e-05, Linf 0.0147126, total time[s] 0.107568 +Converged at iteration 25, L1 8.85293e-05, Linf 0.0097566, total time[s] 0.119084 +Converged at iteration 25, L1 5.27957e-05, Linf 0.0072862, total time[s] 0.11766 +Converged at iteration 22, L1 7.54809e-05, Linf 0.00747228, total time[s] 0.126021 +Converged at iteration 18, L1 8.7005e-05, Linf 0.00732791, total time[s] 0.081649 +Converged at iteration 32, L1 5.23604e-05, Linf 0.00570992, total time[s] 0.133712 +Converged at iteration 22, L1 6.58397e-05, Linf 0.0055422, total time[s] 0.114989 +Converged at iteration 24, L1 7.78061e-05, Linf 0.0145106, total time[s] 0.076359 +Converged at iteration 27, L1 6.31833e-05, Linf 0.00962347, total time[s] 0.107199 +Converged at iteration 28, L1 5.06199e-05, Linf 0.00348668, total time[s] 0.135864 +Converged at iteration 26, L1 4.7752e-05, Linf 0.00780453, total time[s] 0.114784 +Converged at iteration 25, L1 7.45376e-05, Linf 0.0036765, total time[s] 0.149912 +Converged at iteration 27, L1 6.43097e-05, Linf 0.0051755, total time[s] 0.142466 +Converged at iteration 29, L1 9.73415e-05, Linf 0.00480021, total time[s] 0.094023 +Converged at iteration 33, L1 9.68359e-05, Linf 0.0111845, total time[s] 0.104098 +Converged at iteration 31, L1 5.88151e-05, Linf 0.00201526, total time[s] 0.116267 +Converged at iteration 30, L1 4.11884e-05, Linf 0.00688691, total time[s] 0.141583 +Converged at iteration 29, L1 9.41554e-05, Linf 0.00762589, total time[s] 0.143728 +Converged at iteration 33, L1 7.76905e-05, Linf 0.00618494, total time[s] 0.094612 +Converged at iteration 34, L1 6.93122e-05, Linf 0.0179431, total time[s] 0.113908 +Converged at iteration 25, L1 9.92741e-05, Linf 0.00414128, total time[s] 0.092612 +Converged at iteration 26, L1 5.4218e-05, Linf 0.00298003, total time[s] 0.098968 +Converged at iteration 27, L1 4.6003e-05, Linf 0.00658436, total time[s] 0.129837 +Converged at iteration 39, L1 6.16975e-05, Linf 0.0149737, total time[s] 0.116433 +Converged at iteration 36, L1 6.8812e-05, Linf 0.0140107, total time[s] 0.177377 +Converged at iteration 27, L1 9.17366e-05, Linf 0.0045994, total time[s] 0.095707 +Converged at iteration 27, L1 9.97076e-05, Linf 0.00596237, total time[s] 0.176991 +Converged at iteration 24, L1 6.67063e-05, Linf 0.004002, total time[s] 0.127158 +Converged at iteration 22, L1 7.53249e-05, Linf 0.0045586, total time[s] 0.070625 +Converged at iteration 20, L1 9.66456e-05, Linf 0.0102943, total time[s] 0.081675 +Converged at iteration 24, L1 6.65662e-05, Linf 0.0157789, total time[s] 0.094696 +Converged at iteration 25, L1 8.9847e-05, Linf 0.0096384, total time[s] 0.098285 +Converged at iteration 25, L1 5.26053e-05, Linf 0.00751589, total time[s] 0.120717 +Converged at iteration 22, L1 7.76733e-05, Linf 0.0077816, total time[s] 0.079433 +Converged at iteration 18, L1 9.35856e-05, Linf 0.00789312, total time[s] 0.052167 +Converged at iteration 32, L1 5.74059e-05, Linf 0.0042902, total time[s] 0.14981 +Converged at iteration 22, L1 6.48036e-05, Linf 0.00550422, total time[s] 0.084469 +Converged at iteration 24, L1 7.46588e-05, Linf 0.00502471, total time[s] 0.085333 +Converged at iteration 27, L1 6.60753e-05, Linf 0.00989379, total time[s] 0.07689 +Converged at iteration 28, L1 5.02798e-05, Linf 0.00373581, total time[s] 0.120466 +Converged at iteration 26, L1 5.29213e-05, Linf 0.00822638, total time[s] 0.12439 +Converged at iteration 25, L1 7.13917e-05, Linf 0.00370345, total time[s] 0.072467 +Converged at iteration 27, L1 6.65321e-05, Linf 0.00522455, total time[s] 0.084034 +Converged at iteration 29, L1 9.99215e-05, Linf 0.00515467, total time[s] 0.085058 +Converged at iteration 34, L1 5.11799e-05, Linf 0.00913589, total time[s] 0.126008 +Converged at iteration 31, L1 6.31175e-05, Linf 0.00216221, total time[s] 0.157597 +Converged at iteration 30, L1 3.86872e-05, Linf 0.00652271, total time[s] 0.115275 +Converged at iteration 29, L1 9.87479e-05, Linf 0.00786541, total time[s] 0.182992 +Converged at iteration 33, L1 7.6468e-05, Linf 0.00630253, total time[s] 0.164202 +Converged at iteration 34, L1 7.04106e-05, Linf 0.0181436, total time[s] 0.145618 +Converged at iteration 26, L1 5.19104e-05, Linf 0.00469077, total time[s] 0.137633 +Converged at iteration 26, L1 5.45444e-05, Linf 0.003286, total time[s] 0.10156 +Converged at iteration 27, L1 4.81287e-05, Linf 0.00692071, total time[s] 0.083733 +Converged at iteration 39, L1 5.43209e-05, Linf 0.014478, total time[s] 0.178874 +Converged at iteration 36, L1 5.15598e-05, Linf 0.0122533, total time[s] 0.182527 +Converged at iteration 28, L1 5.27852e-05, Linf 0.00463337, total time[s] 0.159886 +Converged at iteration 27, L1 8.40083e-05, Linf 0.00492479, total time[s] 0.093774 +Converged at iteration 24, L1 7.09954e-05, Linf 0.00427229, total time[s] 0.111389 +Converged at iteration 22, L1 7.05203e-05, Linf 0.00475699, total time[s] 0.07923 +Converged at iteration 20, L1 9.54018e-05, Linf 0.00916778, total time[s] 0.096113 +Converged at iteration 24, L1 6.62585e-05, Linf 0.0169845, total time[s] 0.110134 +Converged at iteration 25, L1 8.9412e-05, Linf 0.00858537, total time[s] 0.093488 +Converged at iteration 25, L1 5.07107e-05, Linf 0.00746532, total time[s] 0.08752 +Converged at iteration 22, L1 7.9628e-05, Linf 0.00816113, total time[s] 0.106888 +Converged at iteration 18, L1 9.03967e-05, Linf 0.00795176, total time[s] 0.050996 +Converged at iteration 32, L1 3.65281e-05, Linf 0.00499653, total time[s] 0.130353 +Converged at iteration 22, L1 6.73631e-05, Linf 0.00557466, total time[s] 0.101924 +Converged at iteration 24, L1 7.33984e-05, Linf 0.004926, total time[s] 0.077629 +Converged at iteration 27, L1 7.72196e-05, Linf 0.0100353, total time[s] 0.102025 +Converged at iteration 28, L1 4.88288e-05, Linf 0.00406882, total time[s] 0.108557 +Converged at iteration 26, L1 5.1275e-05, Linf 0.00855469, total time[s] 0.112462 +Converged at iteration 25, L1 7.49966e-05, Linf 0.00392751, total time[s] 0.075682 +Converged at iteration 27, L1 7.22544e-05, Linf 0.00557271, total time[s] 0.132461 +Converged at iteration 29, L1 9.18165e-05, Linf 0.00433698, total time[s] 0.139645 +Converged at iteration 34, L1 5.2749e-05, Linf 0.00984172, total time[s] 0.132576 +Converged at iteration 31, L1 6.45918e-05, Linf 0.00239978, total time[s] 0.098049 +Converged at iteration 30, L1 3.47605e-05, Linf 0.00613923, total time[s] 0.118928 +Converged at iteration 30, L1 4.01407e-05, Linf 0.00357672, total time[s] 0.130424 +Converged at iteration 33, L1 7.62503e-05, Linf 0.00617401, total time[s] 0.148162 +Converged at iteration 34, L1 6.36123e-05, Linf 0.0171836, total time[s] 0.139208 +Converged at iteration 26, L1 6.14668e-05, Linf 0.0030361, total time[s] 0.145341 +Converged at iteration 26, L1 4.85813e-05, Linf 0.00294901, total time[s] 0.125796 +Converged at iteration 27, L1 4.87596e-05, Linf 0.00701129, total time[s] 0.151206 +Converged at iteration 39, L1 5.91471e-05, Linf 0.0147195, total time[s] 0.119074 +Converged at iteration 36, L1 5.76512e-05, Linf 0.0131831, total time[s] 0.097847 +Converged at iteration 28, L1 5.48676e-05, Linf 0.0047825, total time[s] 0.07593 +Converged at iteration 27, L1 9.6363e-05, Linf 0.00536979, total time[s] 0.071737 +Converged at iteration 24, L1 7.10696e-05, Linf 0.00415518, total time[s] 0.069738 +Converged at iteration 22, L1 6.66168e-05, Linf 0.00470653, total time[s] 0.097654 +Converged at iteration 21, L1 3.99792e-05, Linf 0.00492263, total time[s] 0.115523 +Converged at iteration 24, L1 6.82306e-05, Linf 0.0174539, total time[s] 0.088065 +Converged at iteration 25, L1 8.66669e-05, Linf 0.00873258, total time[s] 0.073206 +Converged at iteration 25, L1 5.15184e-05, Linf 0.00770677, total time[s] 0.076857 +Converged at iteration 22, L1 8.1288e-05, Linf 0.00834751, total time[s] 0.112583 +Converged at iteration 18, L1 9.21331e-05, Linf 0.00802712, total time[s] 0.082501 +Converged at iteration 32, L1 4.21363e-05, Linf 0.00526352, total time[s] 0.111429 +Converged at iteration 22, L1 6.59845e-05, Linf 0.00559055, total time[s] 0.065747 +Converged at iteration 24, L1 7.39762e-05, Linf 0.00495798, total time[s] 0.093495 +Converged at iteration 27, L1 7.97791e-05, Linf 0.0104476, total time[s] 0.103802 +Converged at iteration 28, L1 4.95728e-05, Linf 0.00466449, total time[s] 0.149938 +Converged at iteration 26, L1 5.40212e-05, Linf 0.00871591, total time[s] 0.136811 +Converged at iteration 25, L1 7.41402e-05, Linf 0.00386131, total time[s] 0.086293 +Converged at iteration 27, L1 7.03349e-05, Linf 0.00543796, total time[s] 0.094761 +Converged at iteration 29, L1 9.60932e-05, Linf 0.00476394, total time[s] 0.083135 +Converged at iteration 34, L1 5.23382e-05, Linf 0.00921263, total time[s] 0.144624 +Converged at iteration 31, L1 6.39971e-05, Linf 0.00247194, total time[s] 0.12618 +Converged at iteration 30, L1 3.46955e-05, Linf 0.00629009, total time[s] 0.127277 +Converged at iteration 30, L1 3.9781e-05, Linf 0.00366792, total time[s] 0.088155 +Converged at iteration 33, L1 7.48721e-05, Linf 0.00619033, total time[s] 0.131466 +Converged at iteration 34, L1 6.80731e-05, Linf 0.0182107, total time[s] 0.118181 +Converged at iteration 26, L1 5.53738e-05, Linf 0.00283479, total time[s] 0.081772 +Converged at iteration 26, L1 4.98682e-05, Linf 0.00306817, total time[s] 0.136137 +Converged at iteration 27, L1 4.90369e-05, Linf 0.00720893, total time[s] 0.178796 +Converged at iteration 39, L1 7.14072e-05, Linf 0.0149719, total time[s] 0.192367 +Converged at iteration 36, L1 7.326e-05, Linf 0.0139594, total time[s] 0.165614 +Converged at iteration 28, L1 6.15479e-05, Linf 0.00531515, total time[s] 0.086288 +Converged at iteration 27, L1 9.85153e-05, Linf 0.00565777, total time[s] 0.095904 +Converged at iteration 24, L1 6.78041e-05, Linf 0.00407637, total time[s] 0.081153 +Converged at iteration 22, L1 7.4874e-05, Linf 0.00470681, total time[s] 0.089975 +Converged at iteration 21, L1 4.22371e-05, Linf 0.0052216, total time[s] 0.075897 +Converged at iteration 24, L1 7.14176e-05, Linf 0.0180154, total time[s] 0.09857 +Converged at iteration 25, L1 8.63764e-05, Linf 0.00854849, total time[s] 0.079353 +Converged at iteration 25, L1 5.11798e-05, Linf 0.00794692, total time[s] 0.070861 +Converged at iteration 22, L1 8.41638e-05, Linf 0.00864719, total time[s] 0.070343 +Converged at iteration 18, L1 9.51561e-05, Linf 0.00810877, total time[s] 0.091746 +Converged at iteration 32, L1 5.45574e-05, Linf 0.00536891, total time[s] 0.114259 +Converged at iteration 22, L1 6.52428e-05, Linf 0.00554111, total time[s] 0.071521 +Converged at iteration 24, L1 7.44063e-05, Linf 0.0049821, total time[s] 0.09798 +Converged at iteration 27, L1 8.53736e-05, Linf 0.0111545, total time[s] 0.109758 +Converged at iteration 28, L1 5.05623e-05, Linf 0.0104725, total time[s] 0.076466 +Converged at iteration 26, L1 5.58246e-05, Linf 0.00900408, total time[s] 0.104862 +Converged at iteration 25, L1 7.74475e-05, Linf 0.0186077, total time[s] 0.102657 +Converged at iteration 27, L1 7.40574e-05, Linf 0.00536513, total time[s] 0.097551 +Converged at iteration 30, L1 5.99297e-05, Linf 0.00392762, total time[s] 0.105914 +Converged at iteration 34, L1 5.27185e-05, Linf 0.00845048, total time[s] 0.144943 +Converged at iteration 31, L1 6.657e-05, Linf 0.00263262, total time[s] 0.101786 +Converged at iteration 30, L1 3.43104e-05, Linf 0.00632214, total time[s] 0.164575 +Converged at iteration 30, L1 4.23697e-05, Linf 0.00389416, total time[s] 0.173537 +Converged at iteration 33, L1 7.32893e-05, Linf 0.00740847, total time[s] 0.261717 +Converged at iteration 34, L1 7.08153e-05, Linf 0.0182165, total time[s] 0.177562 +Converged at iteration 26, L1 6.13051e-05, Linf 0.00263342, total time[s] 0.099447 +Converged at iteration 26, L1 5.10901e-05, Linf 0.00307092, total time[s] 0.119648 +Converged at iteration 27, L1 5.00595e-05, Linf 0.00758508, total time[s] 0.096088 +Converged at iteration 39, L1 5.72534e-05, Linf 0.0147069, total time[s] 0.132205 +Converged at iteration 36, L1 5.31082e-05, Linf 0.0129204, total time[s] 0.121073 +Converged at iteration 28, L1 6.77995e-05, Linf 0.00567167, total time[s] 0.157164 +Converged at iteration 27, L1 8.71022e-05, Linf 0.00501157, total time[s] 0.107579 +Converged at iteration 24, L1 7.15912e-05, Linf 0.00422795, total time[s] 0.129914 +Converged at iteration 22, L1 7.11619e-05, Linf 0.00479695, total time[s] 0.110959 +Converged at iteration 21, L1 4.25271e-05, Linf 0.00526394, total time[s] 0.069897 +Converged at iteration 24, L1 7.0952e-05, Linf 0.0169573, total time[s] 0.089019 +Converged at iteration 25, L1 8.60352e-05, Linf 0.00828042, total time[s] 0.094207 +Converged at iteration 25, L1 4.97578e-05, Linf 0.00782692, total time[s] 0.153979 +Converged at iteration 22, L1 8.3748e-05, Linf 0.00880469, total time[s] 0.185537 +Converged at iteration 18, L1 9.22844e-05, Linf 0.0081366, total time[s] 0.126054 +Converged at iteration 32, L1 3.76349e-05, Linf 0.00502357, total time[s] 0.198072 +Converged at iteration 22, L1 6.66314e-05, Linf 0.00560827, total time[s] 0.125131 +Converged at iteration 24, L1 7.32506e-05, Linf 0.00491892, total time[s] 0.143874 +Converged at iteration 27, L1 9.13523e-05, Linf 0.0109815, total time[s] 0.157895 +Converged at iteration 27, L1 9.82981e-05, Linf 0.00811559, total time[s] 0.171332 +Converged at iteration 26, L1 5.53407e-05, Linf 0.00908601, total time[s] 0.172634 +Converged at iteration 25, L1 7.42628e-05, Linf 0.00389111, total time[s] 0.162291 +Converged at iteration 27, L1 7.44076e-05, Linf 0.00555059, total time[s] 0.127692 +Converged at iteration 29, L1 9.17871e-05, Linf 0.00449085, total time[s] 0.092007 +Converged at iteration 34, L1 5.67171e-05, Linf 0.00924651, total time[s] 0.134393 +Converged at iteration 31, L1 6.8526e-05, Linf 0.00275474, total time[s] 0.13692 +Converged at iteration 29, L1 9.86716e-05, Linf 0.0160302, total time[s] 0.111712 +Converged at iteration 30, L1 4.67256e-05, Linf 0.00380639, total time[s] 0.115098 +Converged at iteration 33, L1 7.41671e-05, Linf 0.00611876, total time[s] 0.134203 +Converged at iteration 34, L1 6.81854e-05, Linf 0.0179419, total time[s] 0.141065 +Converged at iteration 26, L1 6.0269e-05, Linf 0.00579321, total time[s] 0.111494 +Converged at iteration 26, L1 5.07937e-05, Linf 0.0030914, total time[s] 0.091487 +Converged at iteration 27, L1 5.10807e-05, Linf 0.00761419, total time[s] 0.094267 +Converged at iteration 35, L1 7.32632e-05, Linf 0.00328763, total time[s] 0.19142 +Converged at iteration 39, L1 9.80774e-05, Linf 0.00419203, total time[s] 0.195639 +Converged at iteration 31, L1 6.02417e-05, Linf 0.00496108, total time[s] 0.181852 +Converged at iteration 30, L1 9.37224e-05, Linf 0.00423518, total time[s] 0.188172 +Converged at iteration 22, L1 8.40505e-05, Linf 0.00446709, total time[s] 0.175739 +Converged at iteration 27, L1 6.1254e-05, Linf 0.00495794, total time[s] 0.178134 +Converged at iteration 20, L1 9.34922e-05, Linf 0.0039534, total time[s] 0.092908 +Converged at iteration 24, L1 8.64237e-05, Linf 0.00476734, total time[s] 0.159932 +Converged at iteration 28, L1 7.15008e-05, Linf 0.00438504, total time[s] 0.170095 +Converged at iteration 26, L1 7.71676e-05, Linf 0.00536056, total time[s] 0.120292 +Converged at iteration 19, L1 6.18591e-05, Linf 0.00384773, total time[s] 0.121562 +Converged at iteration 22, L1 7.10648e-05, Linf 0.00506896, total time[s] 0.122785 +Converged at iteration 20, L1 7.92957e-05, Linf 0.00447797, total time[s] 0.098064 +Converged at iteration 30, L1 7.47338e-05, Linf 0.0031698, total time[s] 0.144965 +Converged at iteration 31, L1 8.31366e-05, Linf 0.00538838, total time[s] 0.17406 +Converged at iteration 24, L1 6.53789e-05, Linf 0.00455187, total time[s] 0.143778 +Converged at iteration 24, L1 8.2628e-05, Linf 0.00436301, total time[s] 0.134418 +Converged at iteration 27, L1 9.26856e-05, Linf 0.00545834, total time[s] 0.148854 +Converged at iteration 26, L1 6.79241e-05, Linf 0.0042593, total time[s] 0.16 +Converged at iteration 23, L1 8.71856e-05, Linf 0.00393227, total time[s] 0.121521 +Converged at iteration 33, L1 9.79803e-05, Linf 0.00481789, total time[s] 0.195496 +Converged at iteration 29, L1 7.33936e-05, Linf 0.00458546, total time[s] 0.147382 +Converged at iteration 28, L1 8.82752e-05, Linf 0.00299779, total time[s] 0.155028 +Converged at iteration 30, L1 8.99922e-05, Linf 0.00425831, total time[s] 0.207187 +Converged at iteration 37, L1 7.14866e-05, Linf 0.00319747, total time[s] 0.183187 +Converged at iteration 32, L1 8.97961e-05, Linf 0.00361214, total time[s] 0.151143 +Converged at iteration 28, L1 9.31861e-05, Linf 0.00419491, total time[s] 0.149793 +Converged at iteration 33, L1 8.26796e-05, Linf 0.0046157, total time[s] 0.149438 +Converged at iteration 26, L1 8.59339e-05, Linf 0.00372938, total time[s] 0.122184 +Converged at iteration 24, L1 8.25034e-05, Linf 0.00315268, total time[s] 0.155729 +Converged at iteration 35, L1 9.56299e-05, Linf 0.00636877, total time[s] 0.163032 +Converged at iteration 39, L1 5.85809e-05, Linf 0.0067558, total time[s] 0.192966 +Converged at iteration 30, L1 9.22524e-05, Linf 0.00593171, total time[s] 0.170884 +Converged at iteration 24, L1 7.54888e-05, Linf 0.00443921, total time[s] 0.111552 +Converged at iteration 21, L1 7.74134e-05, Linf 0.00409757, total time[s] 0.111687 +Converged at iteration 24, L1 8.1595e-05, Linf 0.00560002, total time[s] 0.117201 +Converged at iteration 19, L1 5.03476e-05, Linf 0.00464904, total time[s] 0.106983 +Converged at iteration 21, L1 3.53929e-05, Linf 0.00569443, total time[s] 0.171737 +Converged at iteration 23, L1 9.88108e-05, Linf 0.0062692, total time[s] 0.139894 +Converged at iteration 24, L1 6.09705e-05, Linf 0.00475574, total time[s] 0.144288 +Converged at iteration 20, L1 5.68793e-05, Linf 0.00530745, total time[s] 0.092232 +Converged at iteration 16, L1 8.92788e-05, Linf 0.00347308, total time[s] 0.080358 +Converged at iteration 19, L1 9.35948e-05, Linf 0.00700141, total time[s] 0.105146 +Converged at iteration 31, L1 7.28464e-05, Linf 0.00277597, total time[s] 0.148433 +Converged at iteration 23, L1 7.17847e-05, Linf 0.00687562, total time[s] 0.116541 +Converged at iteration 26, L1 5.45673e-05, Linf 0.00497236, total time[s] 0.14333 +Converged at iteration 23, L1 4.98982e-05, Linf 0.00334627, total time[s] 0.194053 +Converged at iteration 20, L1 5.51947e-05, Linf 0.00356662, total time[s] 0.150268 +Converged at iteration 25, L1 8.51979e-05, Linf 0.00451546, total time[s] 0.13354 +Converged at iteration 22, L1 9.57543e-05, Linf 0.00487476, total time[s] 0.152165 +Converged at iteration 29, L1 6.54508e-05, Linf 0.00617529, total time[s] 0.167183 +Converged at iteration 28, L1 6.58565e-05, Linf 0.00333023, total time[s] 0.159178 +Converged at iteration 27, L1 6.91984e-05, Linf 0.00379722, total time[s] 0.131497 +Converged at iteration 29, L1 6.31757e-05, Linf 0.0037093, total time[s] 0.164909 +Converged at iteration 29, L1 7.76869e-05, Linf 0.00282334, total time[s] 0.168143 +Converged at iteration 27, L1 9.62141e-05, Linf 0.00290939, total time[s] 0.168318 +Converged at iteration 32, L1 7.55118e-05, Linf 0.00661927, total time[s] 0.15816 +Converged at iteration 26, L1 7.20263e-05, Linf 0.00295111, total time[s] 0.133688 +Converged at iteration 25, L1 7.49716e-05, Linf 0.00244029, total time[s] 0.128805 +Converged at iteration 23, L1 6.52791e-05, Linf 0.00279665, total time[s] 0.098269 +Converged at iteration 38, L1 6.12505e-05, Linf 0.011002, total time[s] 0.178831 +Converged at iteration 35, L1 5.93939e-05, Linf 0.00946085, total time[s] 0.179546 +Converged at iteration 30, L1 5.73495e-05, Linf 0.00586596, total time[s] 0.163717 +Converged at iteration 25, L1 4.75666e-05, Linf 0.00675263, total time[s] 0.174059 +Converged at iteration 22, L1 5.95477e-05, Linf 0.00477834, total time[s] 0.103508 +Converged at iteration 23, L1 5.06258e-05, Linf 0.00349052, total time[s] 0.145798 +Converged at iteration 21, L1 5.38191e-05, Linf 0.00532297, total time[s] 0.098626 +Converged at iteration 19, L1 7.26156e-05, Linf 0.00728026, total time[s] 0.094006 +Converged at iteration 22, L1 6.03667e-05, Linf 0.00541518, total time[s] 0.103503 +Converged at iteration 23, L1 5.28351e-05, Linf 0.00372311, total time[s] 0.144507 +Converged at iteration 17, L1 9.26191e-05, Linf 0.00197883, total time[s] 0.084499 +Converged at iteration 19, L1 9.33086e-05, Linf 0.00662331, total time[s] 0.090932 +Converged at iteration 20, L1 5.45103e-05, Linf 0.00432323, total time[s] 0.121342 +Converged at iteration 25, L1 8.76661e-05, Linf 0.00548242, total time[s] 0.140269 +Converged at iteration 31, L1 5.34956e-05, Linf 0.00505112, total time[s] 0.151883 +Converged at iteration 22, L1 9.07936e-05, Linf 0.00658955, total time[s] 0.109618 +Converged at iteration 22, L1 6.66444e-05, Linf 0.0019082, total time[s] 0.151626 +Converged at iteration 24, L1 9.13501e-05, Linf 0.0030977, total time[s] 0.116745 +Converged at iteration 25, L1 7.31312e-05, Linf 0.00308859, total time[s] 0.119204 +Converged at iteration 30, L1 4.99131e-05, Linf 0.00355054, total time[s] 0.25763 +Converged at iteration 23, L1 6.7863e-05, Linf 0.00278686, total time[s] 0.192115 +Converged at iteration 29, L1 8.99214e-05, Linf 0.00539248, total time[s] 0.153222 +Converged at iteration 26, L1 7.58546e-05, Linf 0.00328966, total time[s] 0.149905 +Converged at iteration 29, L1 6.83464e-05, Linf 0.00256826, total time[s] 0.163544 +Converged at iteration 28, L1 8.53843e-05, Linf 0.00258023, total time[s] 0.151791 +Converged at iteration 26, L1 6.8656e-05, Linf 0.00398786, total time[s] 0.131033 +Converged at iteration 29, L1 8.58523e-05, Linf 0.00210003, total time[s] 0.161662 +Converged at iteration 23, L1 8.16057e-05, Linf 0.00365213, total time[s] 0.144463 +Converged at iteration 32, L1 5.42237e-05, Linf 0.00866026, total time[s] 0.176479 +Converged at iteration 25, L1 8.8837e-05, Linf 0.00383863, total time[s] 0.11222 +Converged at iteration 35, L1 3.95729e-05, Linf 0.0120517, total time[s] 0.173363 +Converged at iteration 37, L1 8.08597e-05, Linf 0.0175058, total time[s] 0.203979 +Converged at iteration 25, L1 6.78588e-05, Linf 0.00944575, total time[s] 0.119745 +Converged at iteration 28, L1 9.92812e-05, Linf 0.00827531, total time[s] 0.17228 +Converged at iteration 22, L1 8.54221e-05, Linf 0.00406096, total time[s] 0.103889 +Converged at iteration 22, L1 4.73595e-05, Linf 0.00472631, total time[s] 0.117098 +Converged at iteration 20, L1 3.5567e-05, Linf 0.00576936, total time[s] 0.093127 +Converged at iteration 21, L1 8.77358e-05, Linf 0.00630078, total time[s] 0.101833 +Converged at iteration 23, L1 6.04798e-05, Linf 0.00326221, total time[s] 0.106609 +Converged at iteration 22, L1 6.63578e-05, Linf 0.00183848, total time[s] 0.129867 +Converged at iteration 20, L1 9.14215e-05, Linf 0.00312112, total time[s] 0.092724 +Converged at iteration 18, L1 9.2268e-05, Linf 0.00308715, total time[s] 0.120329 +Converged at iteration 31, L1 5.73705e-05, Linf 0.00694234, total time[s] 0.139883 +Converged at iteration 19, L1 9.31198e-05, Linf 0.00534205, total time[s] 0.106384 +Converged at iteration 22, L1 7.80451e-05, Linf 0.00518417, total time[s] 0.105735 +Converged at iteration 26, L1 5.04185e-05, Linf 0.00457167, total time[s] 0.130965 +Converged at iteration 25, L1 9.52579e-05, Linf 0.00331006, total time[s] 0.115589 +Converged at iteration 23, L1 6.32207e-05, Linf 0.00200875, total time[s] 0.108475 +Converged at iteration 23, L1 7.83055e-05, Linf 0.00271869, total time[s] 0.105178 +Converged at iteration 24, L1 6.80205e-05, Linf 0.00289292, total time[s] 0.111391 +Converged at iteration 24, L1 9.73419e-05, Linf 0.00394965, total time[s] 0.131715 +Converged at iteration 29, L1 8.56842e-05, Linf 0.00322109, total time[s] 0.14654 +Converged at iteration 31, L1 7.48219e-05, Linf 0.00447001, total time[s] 0.141297 +Converged at iteration 30, L1 5.94824e-05, Linf 0.00192502, total time[s] 0.139876 +Converged at iteration 30, L1 5.2726e-05, Linf 0.00552633, total time[s] 0.140353 +Converged at iteration 32, L1 4.79024e-05, Linf 0.0117912, total time[s] 0.142735 +Converged at iteration 31, L1 6.97364e-05, Linf 0.00349688, total time[s] 0.182845 +Converged at iteration 25, L1 8.51533e-05, Linf 0.00453751, total time[s] 0.115745 +Converged at iteration 24, L1 6.17493e-05, Linf 0.00446395, total time[s] 0.188852 +Converged at iteration 24, L1 6.5466e-05, Linf 0.00296875, total time[s] 0.098831 +Converged at iteration 35, L1 4.3174e-05, Linf 0.0144629, total time[s] 0.170838 +Converged at iteration 37, L1 5.22619e-05, Linf 0.0192627, total time[s] 0.180708 +Converged at iteration 25, L1 7.01893e-05, Linf 0.0101207, total time[s] 0.117835 +Converged at iteration 28, L1 6.29679e-05, Linf 0.00754554, total time[s] 0.206443 +Converged at iteration 22, L1 9.82709e-05, Linf 0.00441436, total time[s] 0.104801 +Converged at iteration 21, L1 8.32606e-05, Linf 0.00895721, total time[s] 0.108521 +Converged at iteration 20, L1 5.93586e-05, Linf 0.00912361, total time[s] 0.130467 +Converged at iteration 22, L1 3.48522e-05, Linf 0.00320961, total time[s] 0.113062 +Converged at iteration 23, L1 7.54855e-05, Linf 0.00294913, total time[s] 0.131642 +Converged at iteration 23, L1 7.47046e-05, Linf 0.00365999, total time[s] 0.197066 +Converged at iteration 19, L1 6.43241e-05, Linf 0.00329253, total time[s] 0.095629 +Converged at iteration 21, L1 7.01445e-05, Linf 0.00236251, total time[s] 0.154953 +Converged at iteration 20, L1 5.81411e-05, Linf 0.00372971, total time[s] 0.1063 +Converged at iteration 26, L1 4.92843e-05, Linf 0.00381928, total time[s] 0.173417 +Converged at iteration 31, L1 5.83327e-05, Linf 0.00857564, total time[s] 0.291446 +Converged at iteration 22, L1 7.63046e-05, Linf 0.00501169, total time[s] 0.110404 +Converged at iteration 23, L1 8.42829e-05, Linf 0.00262704, total time[s] 0.159653 +Converged at iteration 24, L1 8.18635e-05, Linf 0.00387576, total time[s] 0.122251 +Converged at iteration 26, L1 7.85438e-05, Linf 0.002714, total time[s] 0.144703 +Converged at iteration 23, L1 9.15225e-05, Linf 0.00274453, total time[s] 0.125241 +Converged at iteration 32, L1 5.0867e-05, Linf 0.00408135, total time[s] 0.171104 +Converged at iteration 23, L1 7.25029e-05, Linf 0.00114801, total time[s] 0.116472 +Converged at iteration 30, L1 6.54204e-05, Linf 0.00799514, total time[s] 0.164146 +Converged at iteration 30, L1 6.25067e-05, Linf 0.00251724, total time[s] 0.199632 +Converged at iteration 32, L1 3.75377e-05, Linf 0.00250364, total time[s] 0.173246 +Converged at iteration 30, L1 7.68596e-05, Linf 0.00327935, total time[s] 0.199727 +Converged at iteration 25, L1 8.6462e-05, Linf 0.00290642, total time[s] 0.183082 +Converged at iteration 24, L1 9.50757e-05, Linf 0.00545624, total time[s] 0.169737 +Converged at iteration 32, L1 4.7634e-05, Linf 0.0154585, total time[s] 0.185352 +Converged at iteration 25, L1 8.07719e-05, Linf 0.00463342, total time[s] 0.152257 +Converged at iteration 35, L1 5.76022e-05, Linf 0.018222, total time[s] 0.212488 +Converged at iteration 37, L1 4.12691e-05, Linf 0.0198888, total time[s] 0.262218 +Converged at iteration 27, L1 8.94648e-05, Linf 0.00892078, total time[s] 0.146161 +Converged at iteration 25, L1 6.75562e-05, Linf 0.00984571, total time[s] 0.165252 +Converged at iteration 21, L1 6.93249e-05, Linf 0.00812086, total time[s] 0.137721 +Converged at iteration 23, L1 6.96149e-05, Linf 0.00402439, total time[s] 0.141786 +Converged at iteration 22, L1 4.40117e-05, Linf 0.00438499, total time[s] 0.120933 +Converged at iteration 20, L1 9.24701e-05, Linf 0.0131671, total time[s] 0.144955 +Converged at iteration 24, L1 6.69533e-05, Linf 0.00409492, total time[s] 0.164964 +Converged at iteration 24, L1 4.76852e-05, Linf 0.00245548, total time[s] 0.16375 +Converged at iteration 19, L1 8.21132e-05, Linf 0.00439962, total time[s] 0.125034 +Converged at iteration 21, L1 9.85934e-05, Linf 0.00305193, total time[s] 0.144604 +Converged at iteration 20, L1 6.47816e-05, Linf 0.00393172, total time[s] 0.171451 +Converged at iteration 31, L1 7.03262e-05, Linf 0.00841183, total time[s] 0.190543 +Converged at iteration 26, L1 6.68721e-05, Linf 0.00426344, total time[s] 0.148347 +Converged at iteration 22, L1 8.15778e-05, Linf 0.00468968, total time[s] 0.151375 +Converged at iteration 24, L1 5.02865e-05, Linf 0.0016713, total time[s] 0.129024 +Converged at iteration 27, L1 5.80952e-05, Linf 0.00182778, total time[s] 0.134855 +Converged at iteration 24, L1 6.72238e-05, Linf 0.00353849, total time[s] 0.130927 +Converged at iteration 23, L1 9.34763e-05, Linf 0.00437802, total time[s] 0.236176 +Converged at iteration 32, L1 6.71045e-05, Linf 0.00495125, total time[s] 0.241309 +Converged at iteration 25, L1 9.77463e-05, Linf 0.00341495, total time[s] 0.150663 +Converged at iteration 30, L1 8.21461e-05, Linf 0.0099012, total time[s] 0.140006 +Converged at iteration 30, L1 7.63731e-05, Linf 0.0027775, total time[s] 0.155986 +Converged at iteration 32, L1 5.80535e-05, Linf 0.003492, total time[s] 0.183536 +Converged at iteration 31, L1 5.4655e-05, Linf 0.00359678, total time[s] 0.167587 +Converged at iteration 27, L1 5.46001e-05, Linf 0.00552487, total time[s] 0.125531 +Converged at iteration 32, L1 5.22213e-05, Linf 0.0197042, total time[s] 0.164635 +Converged at iteration 25, L1 7.11831e-05, Linf 0.00533863, total time[s] 0.17646 +Converged at iteration 25, L1 7.2143e-05, Linf 0.00338478, total time[s] 0.133395 +Converged at iteration 35, L1 6.69705e-05, Linf 0.0235334, total time[s] 0.191635 +Converged at iteration 37, L1 3.95917e-05, Linf 0.0208762, total time[s] 0.211251 +Converged at iteration 27, L1 6.75017e-05, Linf 0.00778746, total time[s] 0.16378 +Converged at iteration 25, L1 6.50938e-05, Linf 0.0094388, total time[s] 0.215527 +Converged at iteration 21, L1 6.15806e-05, Linf 0.00699705, total time[s] 0.12434 +Converged at iteration 22, L1 6.94783e-05, Linf 0.00763264, total time[s] 0.105127 +Converged at iteration 23, L1 6.69125e-05, Linf 0.00381559, total time[s] 0.127059 +Converged at iteration 24, L1 9.84807e-05, Linf 0.00670125, total time[s] 0.13311 +Converged at iteration 21, L1 3.38972e-05, Linf 0.00647348, total time[s] 0.099259 +Converged at iteration 19, L1 9.43641e-05, Linf 0.00518925, total time[s] 0.12974 +Converged at iteration 24, L1 7.25782e-05, Linf 0.00485416, total time[s] 0.147017 +Converged at iteration 20, L1 7.94797e-05, Linf 0.00458636, total time[s] 0.133607 +Converged at iteration 22, L1 6.62383e-05, Linf 0.0028432, total time[s] 0.14424 +Converged at iteration 26, L1 9.80091e-05, Linf 0.00408361, total time[s] 0.139118 +Converged at iteration 31, L1 9.13293e-05, Linf 0.0101269, total time[s] 0.20205 +Converged at iteration 24, L1 6.46136e-05, Linf 0.00203344, total time[s] 0.13421 +Converged at iteration 22, L1 9.80064e-05, Linf 0.00550775, total time[s] 0.158541 +Converged at iteration 23, L1 9.7442e-05, Linf 0.00520358, total time[s] 0.122953 +Converged at iteration 27, L1 7.69337e-05, Linf 0.00246688, total time[s] 0.214695 +Converged at iteration 32, L1 8.93096e-05, Linf 0.00937315, total time[s] 0.1799 +Converged at iteration 23, L1 9.07638e-05, Linf 0.00314887, total time[s] 0.118063 +Converged at iteration 30, L1 9.73773e-05, Linf 0.0139997, total time[s] 0.21606 +Converged at iteration 27, L1 6.57618e-05, Linf 0.00432275, total time[s] 0.132953 +Converged at iteration 30, L1 8.52505e-05, Linf 0.00279566, total time[s] 0.156096 +Converged at iteration 32, L1 8.30188e-05, Linf 0.00492965, total time[s] 0.141795 +Converged at iteration 31, L1 7.33958e-05, Linf 0.00528352, total time[s] 0.156077 +Converged at iteration 27, L1 6.77599e-05, Linf 0.00733834, total time[s] 0.167628 +Converged at iteration 26, L1 5.15587e-05, Linf 0.00484237, total time[s] 0.145783 +Converged at iteration 32, L1 6.3218e-05, Linf 0.0246386, total time[s] 0.179534 +Converged at iteration 25, L1 6.75249e-05, Linf 0.00353224, total time[s] 0.132562 +Converged at iteration 37, L1 5.02259e-05, Linf 0.0241002, total time[s] 0.171289 +Converged at iteration 35, L1 7.72861e-05, Linf 0.0268312, total time[s] 0.191977 +Converged at iteration 25, L1 6.57002e-05, Linf 0.00984284, total time[s] 0.117302 +Converged at iteration 27, L1 4.8002e-05, Linf 0.00631026, total time[s] 0.182433 +Converged at iteration 22, L1 6.41205e-05, Linf 0.00249868, total time[s] 0.110936 +Converged at iteration 21, L1 6.24788e-05, Linf 0.00576635, total time[s] 0.104509 +Converged at iteration 21, L1 4.35663e-05, Linf 0.00784772, total time[s] 0.098725 +Converged at iteration 25, L1 5.16359e-05, Linf 0.00509538, total time[s] 0.1199 +Converged at iteration 23, L1 4.60928e-05, Linf 0.00670891, total time[s] 0.172061 +Converged at iteration 22, L1 8.06122e-05, Linf 0.00384621, total time[s] 0.134187 +Converged at iteration 25, L1 6.19879e-05, Linf 0.0058258, total time[s] 0.202284 +Converged at iteration 19, L1 9.53248e-05, Linf 0.00532987, total time[s] 0.106145 +Converged at iteration 32, L1 3.2896e-05, Linf 0.00537098, total time[s] 0.223784 +Converged at iteration 20, L1 9.55541e-05, Linf 0.00558198, total time[s] 0.102261 +Converged at iteration 23, L1 6.82266e-05, Linf 0.004598, total time[s] 0.113404 +Converged at iteration 27, L1 8.22285e-05, Linf 0.00252794, total time[s] 0.138494 +Converged at iteration 24, L1 8.13202e-05, Linf 0.00304495, total time[s] 0.112607 +Converged at iteration 27, L1 9.40441e-05, Linf 0.00307904, total time[s] 0.234971 +Converged at iteration 23, L1 9.57985e-05, Linf 0.00603097, total time[s] 0.107345 +Converged at iteration 24, L1 5.74509e-05, Linf 0.00240847, total time[s] 0.139381 +Converged at iteration 27, L1 9.75755e-05, Linf 0.00574228, total time[s] 0.13736 +Converged at iteration 33, L1 5.20863e-05, Linf 0.00529502, total time[s] 0.181055 +Converged at iteration 30, L1 8.80842e-05, Linf 0.00252322, total time[s] 0.148612 +Converged at iteration 31, L1 4.23678e-05, Linf 0.00728982, total time[s] 0.162884 +Converged at iteration 31, L1 8.8164e-05, Linf 0.00673725, total time[s] 0.168831 +Converged at iteration 33, L1 4.24239e-05, Linf 0.00368859, total time[s] 0.228509 +Converged at iteration 32, L1 9.06995e-05, Linf 0.0299527, total time[s] 0.173867 +Converged at iteration 27, L1 5.7641e-05, Linf 0.0068364, total time[s] 0.163756 +Converged at iteration 25, L1 7.48005e-05, Linf 0.00561264, total time[s] 0.128413 +Converged at iteration 26, L1 6.98268e-05, Linf 0.00680034, total time[s] 0.131196 +Converged at iteration 36, L1 2.39165e-05, Linf 0.0106404, total time[s] 0.2547 +Converged at iteration 37, L1 9.99984e-05, Linf 0.0303431, total time[s] 0.284526 +Converged at iteration 26, L1 7.924e-05, Linf 0.00727624, total time[s] 0.180359 +Converged at iteration 25, L1 7.58943e-05, Linf 0.0105684, total time[s] 0.184994 +Converged at iteration 21, L1 6.23404e-05, Linf 0.00594463, total time[s] 0.103923 +Converged at iteration 21, L1 9.3003e-05, Linf 0.00346563, total time[s] 0.148475 +Converged at iteration 23, L1 7.53838e-05, Linf 0.0108059, total time[s] 0.201626 +Converged at iteration 21, L1 4.97075e-05, Linf 0.00795149, total time[s] 0.101627 +Converged at iteration 25, L1 6.90849e-05, Linf 0.00741874, total time[s] 0.134895 +Converged at iteration 25, L1 7.37969e-05, Linf 0.00831039, total time[s] 0.153541 +Converged at iteration 19, L1 9.2761e-05, Linf 0.00491052, total time[s] 0.093148 +Converged at iteration 22, L1 9.0227e-05, Linf 0.00479166, total time[s] 0.13335 +Converged at iteration 21, L1 6.46018e-05, Linf 0.00464479, total time[s] 0.104755 +Converged at iteration 27, L1 9.63209e-05, Linf 0.00301861, total time[s] 0.15499 +Converged at iteration 32, L1 3.58623e-05, Linf 0.00525933, total time[s] 0.185716 +Converged at iteration 25, L1 5.08327e-05, Linf 0.00305491, total time[s] 0.139248 +Converged at iteration 23, L1 8.47429e-05, Linf 0.00550562, total time[s] 0.150596 +Converged at iteration 28, L1 5.84218e-05, Linf 0.00217642, total time[s] 0.181049 +Converged at iteration 24, L1 6.86143e-05, Linf 0.00536374, total time[s] 0.146046 +Converged at iteration 33, L1 6.56481e-05, Linf 0.00616297, total time[s] 0.151858 +Converged at iteration 24, L1 6.74108e-05, Linf 0.00270237, total time[s] 0.17023 +Converged at iteration 30, L1 9.81553e-05, Linf 0.0165734, total time[s] 0.207035 +Converged at iteration 28, L1 7.93361e-05, Linf 0.0055197, total time[s] 0.220928 +Converged at iteration 30, L1 8.852e-05, Linf 0.00223219, total time[s] 0.16956 +Converged at iteration 33, L1 5.30415e-05, Linf 0.00460963, total time[s] 0.175204 +Converged at iteration 31, L1 9.11779e-05, Linf 0.00712863, total time[s] 0.19836 +Converged at iteration 27, L1 4.44481e-05, Linf 0.0051892, total time[s] 0.168541 +Converged at iteration 33, L1 3.99048e-05, Linf 0.0222754, total time[s] 0.169001 +Converged at iteration 26, L1 8.79725e-05, Linf 0.00860843, total time[s] 0.160892 +Converged at iteration 25, L1 8.20137e-05, Linf 0.00732397, total time[s] 0.113277 +Converged at iteration 38, L1 6.95096e-05, Linf 0.0230451, total time[s] 0.175209 +Converged at iteration 36, L1 4.14988e-05, Linf 0.0147561, total time[s] 0.167371 +Converged at iteration 27, L1 4.12527e-05, Linf 0.00536485, total time[s] 0.13086 +Converged at iteration 25, L1 9.31463e-05, Linf 0.0108171, total time[s] 0.140497 +Converged at iteration 22, L1 9.55113e-05, Linf 0.00408457, total time[s] 0.108327 +Converged at iteration 21, L1 6.86785e-05, Linf 0.00623098, total time[s] 0.137545 +Converged at iteration 21, L1 5.09453e-05, Linf 0.00626707, total time[s] 0.153137 +Converged at iteration 24, L1 4.04089e-05, Linf 0.00742347, total time[s] 0.125446 +Converged at iteration 25, L1 8.48529e-05, Linf 0.0102163, total time[s] 0.131226 +Converged at iteration 25, L1 6.8896e-05, Linf 0.00774876, total time[s] 0.122772 +Converged at iteration 22, L1 9.38286e-05, Linf 0.00555657, total time[s] 0.118528 +Converged at iteration 19, L1 8.97873e-05, Linf 0.00398879, total time[s] 0.098947 +Converged at iteration 21, L1 7.54984e-05, Linf 0.0052275, total time[s] 0.130584 +Converged at iteration 32, L1 3.61551e-05, Linf 0.00449932, total time[s] 0.163822 +Converged at iteration 27, L1 8.50645e-05, Linf 0.00292286, total time[s] 0.165636 +Converged at iteration 23, L1 9.98971e-05, Linf 0.00602118, total time[s] 0.160382 +Converged at iteration 25, L1 6.40266e-05, Linf 0.00510763, total time[s] 0.229313 +Converged at iteration 28, L1 6.38652e-05, Linf 0.00251341, total time[s] 0.249543 +Converged at iteration 25, L1 6.11966e-05, Linf 0.00508183, total time[s] 0.189657 +Converged at iteration 24, L1 7.6583e-05, Linf 0.0030812, total time[s] 0.153531 +Converged at iteration 29, L1 6.55111e-05, Linf 0.00505338, total time[s] 0.141471 +Converged at iteration 33, L1 6.8141e-05, Linf 0.00572936, total time[s] 0.219983 +Converged at iteration 30, L1 8.52411e-05, Linf 0.00184375, total time[s] 0.172979 +Converged at iteration 30, L1 8.22e-05, Linf 0.014535, total time[s] 0.22788 +Converged at iteration 31, L1 7.64041e-05, Linf 0.00533123, total time[s] 0.146587 +Converged at iteration 33, L1 5.96393e-05, Linf 0.00492675, total time[s] 0.166464 +Converged at iteration 26, L1 6.67433e-05, Linf 0.00435786, total time[s] 0.12179 +Converged at iteration 34, L1 2.32545e-05, Linf 0.0158842, total time[s] 0.1592 +Converged at iteration 26, L1 9.86653e-05, Linf 0.00990828, total time[s] 0.125225 +Converged at iteration 25, L1 8.87154e-05, Linf 0.00839651, total time[s] 0.157235 +Converged at iteration 39, L1 4.04946e-05, Linf 0.0158424, total time[s] 0.186888 +Converged at iteration 36, L1 6.00428e-05, Linf 0.0169755, total time[s] 0.194874 +Converged at iteration 25, L1 7.5643e-05, Linf 0.00960661, total time[s] 0.15433 +Converged at iteration 27, L1 9.36681e-05, Linf 0.00646011, total time[s] 0.143918 +Converged at iteration 23, L1 6.28331e-05, Linf 0.00347774, total time[s] 0.107391 +Converged at iteration 21, L1 8.5232e-05, Linf 0.00665764, total time[s] 0.136359 +Converged at iteration 21, L1 5.36098e-05, Linf 0.00457669, total time[s] 0.113006 +Converged at iteration 24, L1 4.61222e-05, Linf 0.0090947, total time[s] 0.144508 +Converged at iteration 25, L1 8.60765e-05, Linf 0.0111156, total time[s] 0.114309 +Converged at iteration 25, L1 6.79966e-05, Linf 0.00803951, total time[s] 0.161305 +Converged at iteration 22, L1 9.94555e-05, Linf 0.00654892, total time[s] 0.11293 +Converged at iteration 19, L1 9.41805e-05, Linf 0.00332076, total time[s] 0.093488 +Converged at iteration 32, L1 3.77347e-05, Linf 0.00509365, total time[s] 0.144511 +Converged at iteration 22, L1 6.0125e-05, Linf 0.00381498, total time[s] 0.141699 +Converged at iteration 24, L1 6.12487e-05, Linf 0.0042523, total time[s] 0.125513 +Converged at iteration 27, L1 6.97687e-05, Linf 0.00238288, total time[s] 0.133628 +Converged at iteration 28, L1 6.63151e-05, Linf 0.00272716, total time[s] 0.260448 +Converged at iteration 25, L1 7.63906e-05, Linf 0.00711271, total time[s] 0.113693 +Converged at iteration 25, L1 8.26767e-05, Linf 0.00616908, total time[s] 0.12404 +Converged at iteration 24, L1 8.06926e-05, Linf 0.00333301, total time[s] 0.190497 +Converged at iteration 33, L1 6.91064e-05, Linf 0.00599049, total time[s] 0.160016 +Converged at iteration 30, L1 5.85196e-05, Linf 0.00477303, total time[s] 0.151787 +Converged at iteration 30, L1 6.40478e-05, Linf 0.0118618, total time[s] 0.166833 +Converged at iteration 30, L1 9.04662e-05, Linf 0.00209011, total time[s] 0.161888 +Converged at iteration 33, L1 6.27883e-05, Linf 0.00476812, total time[s] 0.186321 +Converged at iteration 31, L1 5.83618e-05, Linf 0.00355516, total time[s] 0.165777 +Converged at iteration 26, L1 5.46959e-05, Linf 0.00320966, total time[s] 0.283925 +Converged at iteration 34, L1 5.12534e-05, Linf 0.0209744, total time[s] 0.155861 +Converged at iteration 27, L1 5.51607e-05, Linf 0.00615459, total time[s] 0.148001 +Converged at iteration 25, L1 9.48183e-05, Linf 0.00912213, total time[s] 0.159179 +Converged at iteration 39, L1 5.48284e-05, Linf 0.013327, total time[s] 0.176232 +Converged at iteration 36, L1 4.50739e-05, Linf 0.0129457, total time[s] 0.182311 +Converged at iteration 25, L1 5.66426e-05, Linf 0.00970762, total time[s] 0.128406 +Converged at iteration 27, L1 5.83139e-05, Linf 0.00440891, total time[s] 0.140265 +Converged at iteration 24, L1 6.59998e-05, Linf 0.00369388, total time[s] 0.138467 +Converged at iteration 22, L1 6.33777e-05, Linf 0.00446717, total time[s] 0.125005 +Converged at iteration 21, L1 4.20097e-05, Linf 0.00433716, total time[s] 0.175899 +Converged at iteration 24, L1 3.9084e-05, Linf 0.00944649, total time[s] 0.25709 +Converged at iteration 25, L1 7.38915e-05, Linf 0.00939113, total time[s] 0.151929 +Converged at iteration 25, L1 5.56356e-05, Linf 0.00651042, total time[s] 0.174033 +Converged at iteration 22, L1 8.37607e-05, Linf 0.00638657, total time[s] 0.139927 +Converged at iteration 19, L1 6.43667e-05, Linf 0.00225958, total time[s] 0.132336 +Converged at iteration 31, L1 6.88562e-05, Linf 0.00768661, total time[s] 0.152154 +Converged at iteration 22, L1 5.75034e-05, Linf 0.00477772, total time[s] 0.112227 +Converged at iteration 24, L1 7.09194e-05, Linf 0.00554965, total time[s] 0.132366 +Converged at iteration 26, L1 7.83768e-05, Linf 0.00712677, total time[s] 0.121701 +Converged at iteration 28, L1 5.57851e-05, Linf 0.00265251, total time[s] 0.125399 +Converged at iteration 25, L1 7.06718e-05, Linf 0.00772665, total time[s] 0.110968 +Converged at iteration 25, L1 6.56055e-05, Linf 0.00311386, total time[s] 0.130368 +Converged at iteration 27, L1 6.33688e-05, Linf 0.00509204, total time[s] 0.129539 +Converged at iteration 29, L1 7.19928e-05, Linf 0.00334052, total time[s] 0.138852 +Converged at iteration 31, L1 5.78301e-05, Linf 0.00160036, total time[s] 0.142641 +Converged at iteration 33, L1 7.38766e-05, Linf 0.00741874, total time[s] 0.213054 +Converged at iteration 29, L1 9.3043e-05, Linf 0.0084195, total time[s] 0.141694 +Converged at iteration 30, L1 4.67554e-05, Linf 0.00766396, total time[s] 0.150504 +Converged at iteration 34, L1 7.32951e-05, Linf 0.0191561, total time[s] 0.186121 +Converged at iteration 33, L1 6.63701e-05, Linf 0.0053795, total time[s] 0.18888 +Converged at iteration 25, L1 9.99401e-05, Linf 0.0088125, total time[s] 0.126455 +Converged at iteration 26, L1 5.28639e-05, Linf 0.00270099, total time[s] 0.12072 +Converged at iteration 26, L1 9.78284e-05, Linf 0.0106376, total time[s] 0.122842 +Converged at iteration 36, L1 6.7055e-05, Linf 0.016459, total time[s] 0.184947 +Converged at iteration 39, L1 7.98006e-05, Linf 0.017354, total time[s] 0.178339 +Converged at iteration 27, L1 9.08953e-05, Linf 0.00550985, total time[s] 0.125312 +Converged at iteration 25, L1 5.66571e-05, Linf 0.0084803, total time[s] 0.15098 +Converged at iteration 22, L1 5.69779e-05, Linf 0.00422018, total time[s] 0.122591 +Converged at iteration 23, L1 9.1018e-05, Linf 0.00429166, total time[s] 0.120739 +Converged at iteration 24, L1 4.71469e-05, Linf 0.0108197, total time[s] 0.140378 +Converged at iteration 21, L1 5.14218e-05, Linf 0.00572862, total time[s] 0.150049 +Converged at iteration 25, L1 5.86959e-05, Linf 0.0074616, total time[s] 0.135623 +Converged at iteration 19, L1 7.12646e-05, Linf 0.00270959, total time[s] 0.095219 +Converged at iteration 25, L1 7.96272e-05, Linf 0.0103209, total time[s] 0.126269 +Converged at iteration 22, L1 5.72543e-05, Linf 0.00475777, total time[s] 0.19668 +Converged at iteration 22, L1 9.19151e-05, Linf 0.00725529, total time[s] 0.111374 +Converged at iteration 26, L1 8.4126e-05, Linf 0.00786395, total time[s] 0.165637 +Converged at iteration 32, L1 3.92299e-05, Linf 0.00565376, total time[s] 0.147335 +Converged at iteration 25, L1 8.32043e-05, Linf 0.00872418, total time[s] 0.156321 +Converged at iteration 24, L1 7.61939e-05, Linf 0.00503318, total time[s] 0.143081 +Converged at iteration 26, L1 8.69712e-05, Linf 0.00618774, total time[s] 0.114992 +Converged at iteration 28, L1 5.98356e-05, Linf 0.00334598, total time[s] 0.188503 +Converged at iteration 33, L1 7.90516e-05, Linf 0.00798012, total time[s] 0.183042 +Converged at iteration 25, L1 5.58886e-05, Linf 0.00278236, total time[s] 0.175114 +Converged at iteration 30, L1 4.92714e-05, Linf 0.00831303, total time[s] 0.144973 +Converged at iteration 30, L1 6.35959e-05, Linf 0.00414268, total time[s] 0.16298 +Converged at iteration 33, L1 6.65973e-05, Linf 0.00544955, total time[s] 0.155137 +Converged at iteration 30, L1 9.79725e-05, Linf 0.0022769, total time[s] 0.142939 +Converged at iteration 25, L1 9.61997e-05, Linf 0.00401533, total time[s] 0.150735 +Converged at iteration 30, L1 5.25248e-05, Linf 0.00344548, total time[s] 0.180025 +Converged at iteration 27, L1 5.54058e-05, Linf 0.00643548, total time[s] 0.172654 +Converged at iteration 34, L1 8.45973e-05, Linf 0.0214744, total time[s] 0.141011 +Converged at iteration 25, L1 9.82978e-05, Linf 0.0093914, total time[s] 0.103787 +Converged at iteration 39, L1 9.55536e-05, Linf 0.019211, total time[s] 0.266454 +Converged at iteration 36, L1 9.3146e-05, Linf 0.01892, total time[s] 0.273029 +Converged at iteration 25, L1 6.37217e-05, Linf 0.00661921, total time[s] 0.123487 +Converged at iteration 28, L1 5.76581e-05, Linf 0.00521022, total time[s] 0.156715 +Converged at iteration 22, L1 5.2355e-05, Linf 0.00398212, total time[s] 0.108019 +Converged at iteration 23, L1 7.4504e-05, Linf 0.00389981, total time[s] 0.12811 +Converged at iteration 24, L1 6.25846e-05, Linf 0.0128265, total time[s] 0.13231 +Converged at iteration 21, L1 6.62098e-05, Linf 0.0062667, total time[s] 0.12341 +Converged at iteration 25, L1 6.11399e-05, Linf 0.00824968, total time[s] 0.135572 +Converged at iteration 25, L1 8.57915e-05, Linf 0.0111208, total time[s] 0.130575 +Converged at iteration 19, L1 8.62815e-05, Linf 0.0032428, total time[s] 0.087035 +Converged at iteration 23, L1 4.69894e-05, Linf 0.00423635, total time[s] 0.106833 +Converged at iteration 22, L1 5.51039e-05, Linf 0.00487356, total time[s] 0.120454 +Converged at iteration 32, L1 5.34499e-05, Linf 0.00704754, total time[s] 0.165051 +Converged at iteration 26, L1 9.37059e-05, Linf 0.0110811, total time[s] 0.129938 +Converged at iteration 24, L1 7.30007e-05, Linf 0.00483135, total time[s] 0.140679 +Converged at iteration 25, L1 9.86276e-05, Linf 0.0102252, total time[s] 0.111726 +Converged at iteration 26, L1 7.31241e-05, Linf 0.00560823, total time[s] 0.138669 +Converged at iteration 28, L1 6.1631e-05, Linf 0.00286056, total time[s] 0.255095 +Converged at iteration 33, L1 8.41762e-05, Linf 0.00840949, total time[s] 0.185287 +Converged at iteration 24, L1 8.76555e-05, Linf 0.00384034, total time[s] 0.137714 +Converged at iteration 30, L1 4.62939e-05, Linf 0.00668129, total time[s] 0.133436 +Converged at iteration 30, L1 7.77881e-05, Linf 0.00516198, total time[s] 0.165422 +Converged at iteration 33, L1 6.83789e-05, Linf 0.00559295, total time[s] 0.178921 +Converged at iteration 30, L1 9.02218e-05, Linf 0.00214202, total time[s] 0.23825 +Converged at iteration 26, L1 9.08242e-05, Linf 0.00383449, total time[s] 0.163258 +Converged at iteration 29, L1 9.30831e-05, Linf 0.00627805, total time[s] 0.140254 +Converged at iteration 27, L1 5.92185e-05, Linf 0.00705035, total time[s] 0.12724 +Converged at iteration 34, L1 9.70217e-05, Linf 0.02294, total time[s] 0.194929 +Converged at iteration 26, L1 4.14674e-05, Linf 0.00379457, total time[s] 0.121555 +Converged at iteration 36, L1 6.9107e-05, Linf 0.0161381, total time[s] 0.16102 +Converged at iteration 39, L1 8.16459e-05, Linf 0.0178509, total time[s] 0.260582 +Converged at iteration 27, L1 7.68521e-05, Linf 0.00495132, total time[s] 0.115994 +Converged at iteration 25, L1 6.28075e-05, Linf 0.00715938, total time[s] 0.133988 +Converged at iteration 22, L1 6.12222e-05, Linf 0.00454618, total time[s] 0.156643 +Converged at iteration 23, L1 9.88929e-05, Linf 0.00446695, total time[s] 0.109912 +Converged at iteration 24, L1 5.1212e-05, Linf 0.0131818, total time[s] 0.111672 +Converged at iteration 21, L1 5.24458e-05, Linf 0.00580381, total time[s] 0.153154 +Converged at iteration 25, L1 5.51839e-05, Linf 0.00751965, total time[s] 0.154862 +Converged at iteration 25, L1 7.81431e-05, Linf 0.00993087, total time[s] 0.14749 +Converged at iteration 19, L1 6.76553e-05, Linf 0.00273661, total time[s] 0.093651 +Converged at iteration 22, L1 9.01644e-05, Linf 0.00794956, total time[s] 0.103277 +Converged at iteration 22, L1 6.01958e-05, Linf 0.00491948, total time[s] 0.110796 +Converged at iteration 32, L1 4.34791e-05, Linf 0.00604109, total time[s] 0.213349 +Converged at iteration 26, L1 8.72293e-05, Linf 0.0089594, total time[s] 0.134981 +Converged at iteration 24, L1 7.82675e-05, Linf 0.00515126, total time[s] 0.156867 +Converged at iteration 25, L1 8.9055e-05, Linf 0.00980281, total time[s] 0.127571 +Converged at iteration 27, L1 5.82763e-05, Linf 0.00487802, total time[s] 0.147072 +Converged at iteration 28, L1 5.56983e-05, Linf 0.00341964, total time[s] 0.177242 +Converged at iteration 33, L1 8.75245e-05, Linf 0.00950769, total time[s] 0.146693 +Converged at iteration 25, L1 6.19475e-05, Linf 0.00308676, total time[s] 0.137001 +Converged at iteration 30, L1 3.98271e-05, Linf 0.00667089, total time[s] 0.169613 +Converged at iteration 29, L1 9.99631e-05, Linf 0.00487066, total time[s] 0.151927 +Converged at iteration 31, L1 5.91008e-05, Linf 0.00174875, total time[s] 0.138166 +Converged at iteration 33, L1 6.68541e-05, Linf 0.00555709, total time[s] 0.193012 +Converged at iteration 25, L1 9.98344e-05, Linf 0.00371834, total time[s] 0.149883 +Converged at iteration 29, L1 8.49593e-05, Linf 0.00707369, total time[s] 0.149972 +Converged at iteration 27, L1 5.51909e-05, Linf 0.00653584, total time[s] 0.179369 +Converged at iteration 34, L1 8.5111e-05, Linf 0.0206014, total time[s] 0.153054 +Converged at iteration 26, L1 4.10658e-05, Linf 0.00366037, total time[s] 0.10598 +Converged at iteration 36, L1 9.34482e-05, Linf 0.0181715, total time[s] 0.186717 +Converged at iteration 39, L1 9.15187e-05, Linf 0.01831, total time[s] 0.178168 +Converged at iteration 28, L1 5.20563e-05, Linf 0.00483322, total time[s] 0.125537 +Converged at iteration 25, L1 7.64117e-05, Linf 0.00601775, total time[s] 0.121777 +Converged at iteration 22, L1 5.60939e-05, Linf 0.00429818, total time[s] 0.13285 +Converged at iteration 23, L1 8.20106e-05, Linf 0.00412742, total time[s] 0.11943 +Converged at iteration 24, L1 6.33323e-05, Linf 0.0136397, total time[s] 0.118661 +Converged at iteration 21, L1 6.47477e-05, Linf 0.00619942, total time[s] 0.128674 +Converged at iteration 25, L1 5.9365e-05, Linf 0.00833503, total time[s] 0.132732 +Converged at iteration 19, L1 7.75672e-05, Linf 0.003075, total time[s] 0.119165 +Converged at iteration 25, L1 8.40577e-05, Linf 0.0106197, total time[s] 0.194283 +Converged at iteration 22, L1 5.6551e-05, Linf 0.00502733, total time[s] 0.105209 +Converged at iteration 22, L1 9.78904e-05, Linf 0.00915217, total time[s] 0.120443 +Converged at iteration 26, L1 9.40473e-05, Linf 0.0109024, total time[s] 0.172774 +Converged at iteration 32, L1 5.73711e-05, Linf 0.00641225, total time[s] 0.155116 +Converged at iteration 24, L1 7.5962e-05, Linf 0.004973, total time[s] 0.136376 +Converged at iteration 26, L1 4.77684e-05, Linf 0.00600032, total time[s] 0.143208 +Converged at iteration 26, L1 8.72907e-05, Linf 0.00624737, total time[s] 0.124391 +Converged at iteration 28, L1 5.93619e-05, Linf 0.00291367, total time[s] 0.198949 +Converged at iteration 33, L1 8.7301e-05, Linf 0.008357, total time[s] 0.204348 +Converged at iteration 24, L1 9.5041e-05, Linf 0.00414257, total time[s] 0.167701 +Converged at iteration 30, L1 3.94195e-05, Linf 0.00458961, total time[s] 0.155671 +Converged at iteration 30, L1 7.13928e-05, Linf 0.00476707, total time[s] 0.175248 +Converged at iteration 33, L1 7.03088e-05, Linf 0.00660761, total time[s] 0.19427 +Converged at iteration 30, L1 9.74146e-05, Linf 0.00243515, total time[s] 0.20137 +Converged at iteration 26, L1 9.3776e-05, Linf 0.00399802, total time[s] 0.173378 +Converged at iteration 29, L1 7.52795e-05, Linf 0.00637225, total time[s] 0.250646 +Converged at iteration 27, L1 5.86471e-05, Linf 0.00712894, total time[s] 0.162991 +Converged at iteration 34, L1 9.77941e-05, Linf 0.0224322, total time[s] 0.169938 +Converged at iteration 26, L1 4.3124e-05, Linf 0.00315123, total time[s] 0.12906 +Converged at iteration 36, L1 6.91228e-05, Linf 0.0155923, total time[s] 0.184374 +Converged at iteration 39, L1 7.93631e-05, Linf 0.0167787, total time[s] 0.186734 +Converged at iteration 25, L1 8.07557e-05, Linf 0.0063606, total time[s] 0.125921 +Converged at iteration 27, L1 6.93963e-05, Linf 0.00474248, total time[s] 0.135366 +Converged at iteration 24, L1 6.21392e-05, Linf 0.00361882, total time[s] 0.144648 +Converged at iteration 22, L1 6.35676e-05, Linf 0.00476232, total time[s] 0.142956 +Converged at iteration 21, L1 5.28255e-05, Linf 0.00584852, total time[s] 0.140323 +Converged at iteration 24, L1 5.27421e-05, Linf 0.0135309, total time[s] 0.133104 +Converged at iteration 25, L1 5.36074e-05, Linf 0.00740936, total time[s] 0.171019 +Converged at iteration 25, L1 7.724e-05, Linf 0.00940461, total time[s] 0.240845 +Converged at iteration 19, L1 6.14291e-05, Linf 0.00255579, total time[s] 0.207264 +Converged at iteration 22, L1 8.93794e-05, Linf 0.00849265, total time[s] 0.152838 +Converged at iteration 22, L1 6.14161e-05, Linf 0.00502294, total time[s] 0.194056 +Converged at iteration 32, L1 4.51197e-05, Linf 0.00597484, total time[s] 0.27039 +Converged at iteration 26, L1 9.71912e-05, Linf 0.0101316, total time[s] 0.273747 +Converged at iteration 24, L1 7.93403e-05, Linf 0.00530263, total time[s] 0.128362 +Converged at iteration 25, L1 9.25565e-05, Linf 0.0106326, total time[s] 0.207759 +Converged at iteration 28, L1 5.29106e-05, Linf 0.00349081, total time[s] 0.2423 +Converged at iteration 27, L1 6.64239e-05, Linf 0.00530052, total time[s] 0.190357 +Converged at iteration 25, L1 6.75409e-05, Linf 0.00332445, total time[s] 0.112166 +Converged at iteration 29, L1 9.02764e-05, Linf 0.00430396, total time[s] 0.162799 +Converged at iteration 33, L1 9.29619e-05, Linf 0.0097943, total time[s] 0.204443 +Converged at iteration 31, L1 6.38293e-05, Linf 0.00198311, total time[s] 0.180973 +Converged at iteration 30, L1 3.76579e-05, Linf 0.00470726, total time[s] 0.154598 +Converged at iteration 29, L1 9.70674e-05, Linf 0.00730341, total time[s] 0.167395 +Converged at iteration 33, L1 6.86806e-05, Linf 0.00572157, total time[s] 0.203877 +Converged at iteration 34, L1 8.41366e-05, Linf 0.0197262, total time[s] 0.22132 +Converged at iteration 26, L1 4.66495e-05, Linf 0.00209448, total time[s] 0.261345 +Converged at iteration 26, L1 4.14944e-05, Linf 0.00375043, total time[s] 0.142292 +Converged at iteration 27, L1 5.40834e-05, Linf 0.00651351, total time[s] 0.21891 +Converged at iteration 36, L1 8.57117e-05, Linf 0.0169344, total time[s] 0.17271 +Converged at iteration 39, L1 8.79632e-05, Linf 0.0175442, total time[s] 0.202262 +Converged at iteration 28, L1 4.14897e-05, Linf 0.00420931, total time[s] 0.245733 +Converged at iteration 25, L1 9.69171e-05, Linf 0.00555971, total time[s] 0.161415 +Converged at iteration 22, L1 6.10846e-05, Linf 0.00456942, total time[s] 0.155367 +Converged at iteration 23, L1 9.21505e-05, Linf 0.00437906, total time[s] 0.190528 +Converged at iteration 24, L1 6.30198e-05, Linf 0.0156527, total time[s] 0.170438 +Converged at iteration 21, L1 6.17597e-05, Linf 0.00603358, total time[s] 0.16785 +Converged at iteration 25, L1 5.74718e-05, Linf 0.00817711, total time[s] 0.144078 +Converged at iteration 25, L1 8.20826e-05, Linf 0.0101274, total time[s] 0.11451 +Converged at iteration 19, L1 6.78228e-05, Linf 0.00281887, total time[s] 0.093466 +Converged at iteration 22, L1 9.53051e-05, Linf 0.00951413, total time[s] 0.152533 +Converged at iteration 22, L1 5.90396e-05, Linf 0.00515616, total time[s] 0.119308 +Converged at iteration 32, L1 5.90094e-05, Linf 0.00711175, total time[s] 0.186054 +Converged at iteration 27, L1 4.99229e-05, Linf 0.00709011, total time[s] 0.135847 +Converged at iteration 26, L1 4.80041e-05, Linf 0.00626812, total time[s] 0.12117 +Converged at iteration 24, L1 7.79695e-05, Linf 0.0050567, total time[s] 0.18882 +Converged at iteration 27, L1 5.82011e-05, Linf 0.00480491, total time[s] 0.124634 +Converged at iteration 28, L1 5.63988e-05, Linf 0.00324941, total time[s] 0.157657 +Converged at iteration 33, L1 9.24789e-05, Linf 0.00890889, total time[s] 0.223152 +Converged at iteration 25, L1 5.74553e-05, Linf 0.00302427, total time[s] 0.124559 +Converged at iteration 30, L1 3.52685e-05, Linf 0.00388909, total time[s] 0.214928 +Converged at iteration 30, L1 6.52076e-05, Linf 0.00434006, total time[s] 0.232129 +Converged at iteration 33, L1 7.03553e-05, Linf 0.00583894, total time[s] 0.15147 +Converged at iteration 31, L1 5.88883e-05, Linf 0.00182868, total time[s] 0.201281 +Converged at iteration 26, L1 8.62359e-05, Linf 0.00395329, total time[s] 0.210399 +Converged at iteration 29, L1 7.82108e-05, Linf 0.00668874, total time[s] 0.187634 +Converged at iteration 27, L1 5.68106e-05, Linf 0.00712797, total time[s] 0.193805 +Converged at iteration 34, L1 9.36712e-05, Linf 0.0213677, total time[s] 0.179013 +Converged at iteration 26, L1 4.60856e-05, Linf 0.00286474, total time[s] 0.12082 +Converged at iteration 36, L1 6.72864e-05, Linf 0.0147249, total time[s] 0.228713 +Converged at iteration 39, L1 7.58341e-05, Linf 0.0159945, total time[s] 0.292779 +Converged at iteration 27, L1 5.94647e-05, Linf 0.00427082, total time[s] 0.178277 +Converged at iteration 26, L1 8.0798e-05, Linf 0.00334303, total time[s] 0.158403 +Converged at iteration 22, L1 7.22865e-05, Linf 0.00497249, total time[s] 0.126605 +Converged at iteration 24, L1 7.11676e-05, Linf 0.00387759, total time[s] 0.118162 +Converged at iteration 24, L1 5.5352e-05, Linf 0.0112299, total time[s] 0.112994 +Converged at iteration 21, L1 5.46819e-05, Linf 0.00601543, total time[s] 0.134363 +Converged at iteration 25, L1 5.06907e-05, Linf 0.00750049, total time[s] 0.11209 +Converged at iteration 19, L1 5.64274e-05, Linf 0.00231643, total time[s] 0.116196 +Converged at iteration 25, L1 7.74125e-05, Linf 0.0087137, total time[s] 0.124757 +Converged at iteration 22, L1 9.0544e-05, Linf 0.00928396, total time[s] 0.104194 +Converged at iteration 22, L1 6.22875e-05, Linf 0.00514211, total time[s] 0.113437 +Converged at iteration 32, L1 4.44866e-05, Linf 0.00481898, total time[s] 0.157023 +Converged at iteration 27, L1 6.11626e-05, Linf 0.00671321, total time[s] 0.142529 +Converged at iteration 25, L1 9.9581e-05, Linf 0.0117574, total time[s] 0.115358 +Converged at iteration 24, L1 8.03268e-05, Linf 0.00540703, total time[s] 0.155957 +Converged at iteration 27, L1 7.91325e-05, Linf 0.00577331, total time[s] 0.169244 +Converged at iteration 28, L1 5.1135e-05, Linf 0.00344653, total time[s] 0.244949 +Converged at iteration 34, L1 5.31385e-05, Linf 0.00761341, total time[s] 0.187404 +Converged at iteration 25, L1 7.41179e-05, Linf 0.00359526, total time[s] 0.262412 +Converged at iteration 29, L1 9.20627e-05, Linf 0.00990346, total time[s] 0.140894 +Converged at iteration 29, L1 7.9945e-05, Linf 0.00360734, total time[s] 0.147053 +Converged at iteration 33, L1 7.03007e-05, Linf 0.00583446, total time[s] 0.193838 +Converged at iteration 31, L1 7.17147e-05, Linf 0.00234449, total time[s] 0.152024 +Converged at iteration 26, L1 5.44116e-05, Linf 0.00255813, total time[s] 0.222525 +Converged at iteration 30, L1 4.90116e-05, Linf 0.00326783, total time[s] 0.130155 +Converged at iteration 27, L1 5.19243e-05, Linf 0.00656265, total time[s] 0.169485 +Converged at iteration 34, L1 8.04207e-05, Linf 0.0186181, total time[s] 0.179881 +Converged at iteration 26, L1 4.06076e-05, Linf 0.00279782, total time[s] 0.122399 +Converged at iteration 39, L1 8.71439e-05, Linf 0.0175911, total time[s] 0.185553 +Converged at iteration 36, L1 8.00057e-05, Linf 0.0158105, total time[s] 0.207272 +Converged at iteration 27, L1 8.17525e-05, Linf 0.00520309, total time[s] 0.135959 +Converged at iteration 26, L1 9.37319e-05, Linf 0.00361357, total time[s] 0.156257 +Converged at iteration 22, L1 6.74725e-05, Linf 0.00484416, total time[s] 0.129882 +Converged at iteration 24, L1 5.97367e-05, Linf 0.00352475, total time[s] 0.111514 +Converged at iteration 21, L1 6.08228e-05, Linf 0.00603234, total time[s] 0.103588 +Converged at iteration 24, L1 6.27751e-05, Linf 0.0131263, total time[s] 0.171992 +Converged at iteration 25, L1 8.11618e-05, Linf 0.00934911, total time[s] 0.186528 +Converged at iteration 25, L1 5.32705e-05, Linf 0.00803537, total time[s] 0.156182 +Converged at iteration 22, L1 9.26786e-05, Linf 0.00977778, total time[s] 0.112535 +Converged at iteration 19, L1 5.80258e-05, Linf 0.00248972, total time[s] 0.109557 +Converged at iteration 22, L1 6.13266e-05, Linf 0.00528852, total time[s] 0.109795 +Converged at iteration 32, L1 5.88327e-05, Linf 0.00728728, total time[s] 0.171172 +Converged at iteration 27, L1 6.01257e-05, Linf 0.00791954, total time[s] 0.128276 +Converged at iteration 24, L1 8.20783e-05, Linf 0.00520237, total time[s] 0.128273 +Converged at iteration 26, L1 5.05327e-05, Linf 0.00698015, total time[s] 0.127145 +Converged at iteration 28, L1 5.2084e-05, Linf 0.00371252, total time[s] 0.154707 +Converged at iteration 27, L1 6.68061e-05, Linf 0.00534713, total time[s] 0.143417 +Converged at iteration 25, L1 6.54448e-05, Linf 0.00341072, total time[s] 0.13349 +Converged at iteration 34, L1 5.1281e-05, Linf 0.00576211, total time[s] 0.16343 +Converged at iteration 29, L1 9.59869e-05, Linf 0.00478271, total time[s] 0.271564 +Converged at iteration 29, L1 9.46356e-05, Linf 0.00934069, total time[s] 0.211025 +Converged at iteration 31, L1 6.66719e-05, Linf 0.00212742, total time[s] 0.210536 +Converged at iteration 33, L1 7.07131e-05, Linf 0.00588914, total time[s] 0.187595 +Converged at iteration 30, L1 4.44219e-05, Linf 0.0030196, total time[s] 0.258298 +Converged at iteration 26, L1 8.3157e-05, Linf 0.00383766, total time[s] 0.171016 +Converged at iteration 34, L1 8.81395e-05, Linf 0.0201117, total time[s] 0.177815 +Converged at iteration 27, L1 5.7164e-05, Linf 0.00735912, total time[s] 0.199954 +Converged at iteration 26, L1 4.56736e-05, Linf 0.00246806, total time[s] 0.126163 +Converged at iteration 39, L1 9.80774e-05, Linf 0.00419203, total time[s] 0.179539 +Converged at iteration 35, L1 7.32632e-05, Linf 0.00328763, total time[s] 0.18305 +Converged at iteration 30, L1 9.37224e-05, Linf 0.00423518, total time[s] 0.141892 +Converged at iteration 31, L1 6.02426e-05, Linf 0.00496108, total time[s] 0.154065 +Converged at iteration 22, L1 8.40505e-05, Linf 0.00446709, total time[s] 0.119775 +Converged at iteration 27, L1 6.12478e-05, Linf 0.00495797, total time[s] 0.12375 +Converged at iteration 24, L1 8.66253e-05, Linf 0.00479353, total time[s] 0.137471 +Converged at iteration 20, L1 9.34908e-05, Linf 0.00395394, total time[s] 0.157076 +Converged at iteration 26, L1 7.71676e-05, Linf 0.00536055, total time[s] 0.15371 +Converged at iteration 28, L1 7.15016e-05, Linf 0.00439544, total time[s] 0.147662 +Converged at iteration 19, L1 6.18515e-05, Linf 0.00384773, total time[s] 0.087284 +Converged at iteration 22, L1 7.10648e-05, Linf 0.00506896, total time[s] 0.106242 +Converged at iteration 20, L1 7.92957e-05, Linf 0.00447797, total time[s] 0.097924 +Converged at iteration 30, L1 7.47338e-05, Linf 0.0031698, total time[s] 0.165126 +Converged at iteration 31, L1 8.31402e-05, Linf 0.0053885, total time[s] 0.17195 +Converged at iteration 24, L1 6.53789e-05, Linf 0.00455187, total time[s] 0.141808 +Converged at iteration 24, L1 8.2642e-05, Linf 0.00444846, total time[s] 0.126936 +Converged at iteration 27, L1 9.26856e-05, Linf 0.00545834, total time[s] 0.159004 +Converged at iteration 26, L1 6.79242e-05, Linf 0.0042593, total time[s] 0.150022 +Converged at iteration 23, L1 8.71856e-05, Linf 0.00393227, total time[s] 0.106432 +Converged at iteration 29, L1 7.33936e-05, Linf 0.00458546, total time[s] 0.133424 +Converged at iteration 33, L1 9.7983e-05, Linf 0.00481788, total time[s] 0.257247 +Converged at iteration 30, L1 8.99922e-05, Linf 0.00425831, total time[s] 0.142987 +Converged at iteration 28, L1 8.82755e-05, Linf 0.00299779, total time[s] 0.15235 +Converged at iteration 32, L1 8.97961e-05, Linf 0.00361214, total time[s] 0.178443 +Converged at iteration 37, L1 7.14866e-05, Linf 0.00319747, total time[s] 0.245768 +Converged at iteration 33, L1 8.28528e-05, Linf 0.0046157, total time[s] 0.160976 +Converged at iteration 28, L1 9.3186e-05, Linf 0.00419491, total time[s] 0.130174 +Converged at iteration 24, L1 8.25016e-05, Linf 0.00315268, total time[s] 0.188048 +Converged at iteration 26, L1 8.59343e-05, Linf 0.00372938, total time[s] 0.185253 +Converged at iteration 35, L1 9.56299e-05, Linf 0.00636877, total time[s] 0.161182 +Converged at iteration 39, L1 5.85809e-05, Linf 0.0067558, total time[s] 0.265574 +Converged at iteration 30, L1 9.22524e-05, Linf 0.00593171, total time[s] 0.138422 +Converged at iteration 24, L1 7.54823e-05, Linf 0.00443921, total time[s] 0.131255 +Converged at iteration 21, L1 7.74134e-05, Linf 0.00409757, total time[s] 0.113605 +Converged at iteration 24, L1 8.15947e-05, Linf 0.00560002, total time[s] 0.141962 +Converged at iteration 21, L1 3.53926e-05, Linf 0.00569443, total time[s] 0.154406 +Converged at iteration 19, L1 5.03475e-05, Linf 0.00464903, total time[s] 0.0929 +Converged at iteration 24, L1 6.09708e-05, Linf 0.00475574, total time[s] 0.134329 +Converged at iteration 23, L1 9.88106e-05, Linf 0.00626925, total time[s] 0.16416 +Converged at iteration 16, L1 8.92829e-05, Linf 0.00347308, total time[s] 0.09103 +Converged at iteration 20, L1 5.68793e-05, Linf 0.00530747, total time[s] 0.098274 +Converged at iteration 19, L1 9.35947e-05, Linf 0.00700141, total time[s] 0.090711 +Converged at iteration 31, L1 7.28482e-05, Linf 0.00274743, total time[s] 0.142229 +Converged at iteration 26, L1 5.45673e-05, Linf 0.00497236, total time[s] 0.121734 +Converged at iteration 23, L1 7.17846e-05, Linf 0.00687562, total time[s] 0.108491 +Converged at iteration 20, L1 5.5194e-05, Linf 0.00356682, total time[s] 0.096384 +Converged at iteration 23, L1 4.98982e-05, Linf 0.00334627, total time[s] 0.111687 +Converged at iteration 25, L1 8.51966e-05, Linf 0.00451682, total time[s] 0.124252 +Converged at iteration 22, L1 9.57445e-05, Linf 0.00486088, total time[s] 0.105032 +Converged at iteration 29, L1 6.54508e-05, Linf 0.00617529, total time[s] 0.134006 +Converged at iteration 28, L1 6.58443e-05, Linf 0.00333225, total time[s] 0.130231 +Converged at iteration 40, L1 6.82107e-05, Linf 0.00381355, total time[s] 0.116503 +Converged at iteration 35, L1 7.61001e-05, Linf 0.00339743, total time[s] 0.092203 +Converged at iteration 30, L1 9.64677e-05, Linf 0.00430101, total time[s] 0.084492 +Converged at iteration 31, L1 6.27409e-05, Linf 0.00502563, total time[s] 0.10267 +Converged at iteration 27, L1 6.25942e-05, Linf 0.00499524, total time[s] 0.086759 +Converged at iteration 22, L1 8.59502e-05, Linf 0.00449036, total time[s] 0.096841 +Converged at iteration 20, L1 9.60333e-05, Linf 0.00395746, total time[s] 0.117052 +Converged at iteration 24, L1 8.84114e-05, Linf 0.00480226, total time[s] 0.101323 +Converged at iteration 28, L1 7.40844e-05, Linf 0.0044487, total time[s] 0.08706 +Converged at iteration 26, L1 8.17396e-05, Linf 0.00546773, total time[s] 0.095523 +Converged at iteration 22, L1 7.4104e-05, Linf 0.00508718, total time[s] 0.067701 +Converged at iteration 19, L1 6.65465e-05, Linf 0.00393099, total time[s] 0.065766 +Converged at iteration 30, L1 8.00439e-05, Linf 0.00333226, total time[s] 0.09488 +Converged at iteration 20, L1 8.44297e-05, Linf 0.00455028, total time[s] 0.069916 +Converged at iteration 24, L1 7.17685e-05, Linf 0.00464509, total time[s] 0.143059 +Converged at iteration 31, L1 9.14839e-05, Linf 0.00569631, total time[s] 0.101586 +Converged at iteration 27, L1 9.91594e-05, Linf 0.00568011, total time[s] 0.135847 +Converged at iteration 24, L1 8.97886e-05, Linf 0.00826276, total time[s] 0.153411 +Converged at iteration 23, L1 9.24913e-05, Linf 0.00410197, total time[s] 0.182466 +Converged at iteration 26, L1 7.21976e-05, Linf 0.00446074, total time[s] 0.077884 +Converged at iteration 29, L1 7.82313e-05, Linf 0.00479592, total time[s] 0.119826 +Converged at iteration 34, L1 7.08506e-05, Linf 0.00422648, total time[s] 0.097327 +Converged at iteration 30, L1 9.39966e-05, Linf 0.00442544, total time[s] 0.109079 +Converged at iteration 28, L1 9.49833e-05, Linf 0.0031098, total time[s] 0.118593 +Converged at iteration 32, L1 9.39318e-05, Linf 0.0037409, total time[s] 0.094598 +Converged at iteration 37, L1 7.45797e-05, Linf 0.0032779, total time[s] 0.155568 +Converged at iteration 33, L1 8.45589e-05, Linf 0.00469817, total time[s] 0.096274 +Converged at iteration 28, L1 9.66984e-05, Linf 0.00430182, total time[s] 0.115447 +Converged at iteration 24, L1 8.83204e-05, Linf 0.00325069, total time[s] 0.132319 +Converged at iteration 26, L1 9.0876e-05, Linf 0.00381996, total time[s] 0.135545 +Converged at iteration 39, L1 6.25873e-05, Linf 0.00638076, total time[s] 0.122929 +Converged at iteration 35, L1 9.51186e-05, Linf 0.00591004, total time[s] 0.148023 +Converged at iteration 24, L1 8.89713e-05, Linf 0.00492856, total time[s] 0.090845 +Converged at iteration 30, L1 9.8873e-05, Linf 0.00611069, total time[s] 0.114941 +Converged at iteration 25, L1 6.6714e-05, Linf 0.00541796, total time[s] 0.079233 +Converged at iteration 20, L1 9.55936e-05, Linf 0.00401942, total time[s] 0.137368 +Converged at iteration 19, L1 5.7701e-05, Linf 0.00426747, total time[s] 0.144472 +Converged at iteration 20, L1 9.42471e-05, Linf 0.00666708, total time[s] 0.08083 +Converged at iteration 24, L1 6.48962e-05, Linf 0.0047242, total time[s] 0.124411 +Converged at iteration 24, L1 7.238e-05, Linf 0.0049349, total time[s] 0.120901 +Converged at iteration 20, L1 5.47608e-05, Linf 0.00503872, total time[s] 0.108644 +Converged at iteration 16, L1 9.55974e-05, Linf 0.0048573, total time[s] 0.057908 +Converged at iteration 31, L1 8.35301e-05, Linf 0.0028305, total time[s] 0.127536 +Converged at iteration 19, L1 9.92962e-05, Linf 0.00711751, total time[s] 0.083416 +Converged at iteration 23, L1 7.86911e-05, Linf 0.00696182, total time[s] 0.079974 +Converged at iteration 26, L1 7.18942e-05, Linf 0.00607997, total time[s] 0.074806 +Converged at iteration 23, L1 5.22097e-05, Linf 0.00567689, total time[s] 0.122233 +Converged at iteration 20, L1 7.07713e-05, Linf 0.00535818, total time[s] 0.100416 +Converged at iteration 23, L1 6.23618e-05, Linf 0.00333184, total time[s] 0.07667 +Converged at iteration 25, L1 9.11788e-05, Linf 0.00540832, total time[s] 0.108864 +Converged at iteration 28, L1 7.70053e-05, Linf 0.00559284, total time[s] 0.130131 +Converged at iteration 29, L1 7.07589e-05, Linf 0.00666515, total time[s] 0.14634 +Converged at iteration 27, L1 7.10067e-05, Linf 0.00416484, total time[s] 0.136122 +Converged at iteration 29, L1 6.57215e-05, Linf 0.00377649, total time[s] 0.160079 +Converged at iteration 29, L1 8.65927e-05, Linf 0.00296568, total time[s] 0.086471 +Converged at iteration 28, L1 7.56826e-05, Linf 0.00262732, total time[s] 0.074266 +Converged at iteration 32, L1 7.98447e-05, Linf 0.00659976, total time[s] 0.146063 +Converged at iteration 26, L1 8.62056e-05, Linf 0.002958, total time[s] 0.110849 +Converged at iteration 25, L1 6.93622e-05, Linf 0.00213013, total time[s] 0.082571 +Converged at iteration 23, L1 7.88473e-05, Linf 0.0033052, total time[s] 0.061452 +Converged at iteration 38, L1 7.22551e-05, Linf 0.0102374, total time[s] 0.128183 +Converged at iteration 35, L1 6.57531e-05, Linf 0.00863871, total time[s] 0.140757 +Converged at iteration 25, L1 4.29448e-05, Linf 0.00527426, total time[s] 0.074551 +Converged at iteration 30, L1 6.88972e-05, Linf 0.00592415, total time[s] 0.121786 +Converged at iteration 23, L1 9.27413e-05, Linf 0.00594857, total time[s] 0.081505 +Converged at iteration 22, L1 5.71629e-05, Linf 0.00469851, total time[s] 0.062228 +Converged at iteration 19, L1 7.64136e-05, Linf 0.00711778, total time[s] 0.074276 +Converged at iteration 21, L1 4.1105e-05, Linf 0.00422629, total time[s] 0.076159 +Converged at iteration 23, L1 5.55434e-05, Linf 0.0036114, total time[s] 0.099862 +Converged at iteration 22, L1 9.55697e-05, Linf 0.00635844, total time[s] 0.082357 +Converged at iteration 19, L1 8.25656e-05, Linf 0.00577791, total time[s] 0.070023 +Converged at iteration 17, L1 7.36916e-05, Linf 0.00202736, total time[s] 0.062443 +Converged at iteration 31, L1 5.96682e-05, Linf 0.00464181, total time[s] 0.157279 +Converged at iteration 19, L1 9.46782e-05, Linf 0.00625437, total time[s] 0.108352 +Converged at iteration 22, L1 9.77017e-05, Linf 0.00749958, total time[s] 0.115401 +Converged at iteration 25, L1 9.91654e-05, Linf 0.00560724, total time[s] 0.085673 +Converged at iteration 24, L1 6.85082e-05, Linf 0.00495746, total time[s] 0.115654 +Converged at iteration 21, L1 7.64932e-05, Linf 0.00229893, total time[s] 0.084689 +Converged at iteration 23, L1 6.6313e-05, Linf 0.00284448, total time[s] 0.14326 +Converged at iteration 25, L1 7.72388e-05, Linf 0.00319843, total time[s] 0.075971 +Converged at iteration 26, L1 9.65753e-05, Linf 0.00379438, total time[s] 0.101753 +Converged at iteration 29, L1 8.16221e-05, Linf 0.00661, total time[s] 0.095179 +Converged at iteration 28, L1 6.63901e-05, Linf 0.00257721, total time[s] 0.105203 +Converged at iteration 29, L1 8.61188e-05, Linf 0.00495708, total time[s] 0.109359 +Converged at iteration 29, L1 8.53577e-05, Linf 0.00229393, total time[s] 0.095369 +Converged at iteration 29, L1 4.73213e-05, Linf 0.00155363, total time[s] 0.094072 +Converged at iteration 32, L1 5.62005e-05, Linf 0.00809776, total time[s] 0.102772 +Converged at iteration 26, L1 7.9618e-05, Linf 0.00412615, total time[s] 0.124853 +Converged at iteration 25, L1 8.41893e-05, Linf 0.00337803, total time[s] 0.120491 +Converged at iteration 23, L1 8.73186e-05, Linf 0.00367285, total time[s] 0.132657 +Converged at iteration 37, L1 8.89167e-05, Linf 0.0159971, total time[s] 0.110712 +Converged at iteration 35, L1 3.94899e-05, Linf 0.0103058, total time[s] 0.159707 +Converged at iteration 25, L1 6.82581e-05, Linf 0.00926579, total time[s] 0.081697 +Converged at iteration 29, L1 6.28255e-05, Linf 0.00697278, total time[s] 0.083785 +Converged at iteration 23, L1 8.62257e-05, Linf 0.00607101, total time[s] 0.059559 +Converged at iteration 21, L1 9.74536e-05, Linf 0.00821036, total time[s] 0.054346 +Converged at iteration 20, L1 4.10804e-05, Linf 0.00736835, total time[s] 0.052222 +Converged at iteration 21, L1 7.60321e-05, Linf 0.00529006, total time[s] 0.058747 +Converged at iteration 23, L1 5.80888e-05, Linf 0.00367739, total time[s] 0.060045 +Converged at iteration 22, L1 5.79908e-05, Linf 0.00302653, total time[s] 0.058731 +Converged at iteration 20, L1 6.77318e-05, Linf 0.00243159, total time[s] 0.052445 +Converged at iteration 18, L1 8.08839e-05, Linf 0.00238006, total time[s] 0.04765 +Converged at iteration 40, L1 6.77628e-05, Linf 0.0036721, total time[s] 0.121431 +Converged at iteration 35, L1 7.61031e-05, Linf 0.00347335, total time[s] 0.109244 +Converged at iteration 30, L1 9.66244e-05, Linf 0.00432956, total time[s] 0.103473 +Converged at iteration 31, L1 6.19923e-05, Linf 0.00502562, total time[s] 0.095115 +Converged at iteration 27, L1 6.27211e-05, Linf 0.00499532, total time[s] 0.083922 +Converged at iteration 22, L1 8.59886e-05, Linf 0.00449024, total time[s] 0.065179 +Converged at iteration 20, L1 9.60153e-05, Linf 0.00397839, total time[s] 0.060626 +Converged at iteration 24, L1 8.84254e-05, Linf 0.00482845, total time[s] 0.064374 +Converged at iteration 28, L1 7.39289e-05, Linf 0.0044591, total time[s] 0.09719 +Converged at iteration 26, L1 8.11736e-05, Linf 0.00546752, total time[s] 0.076266 +Converged at iteration 22, L1 7.40861e-05, Linf 0.00508589, total time[s] 0.061595 +Converged at iteration 19, L1 6.63347e-05, Linf 0.00393096, total time[s] 0.076121 +Converged at iteration 30, L1 7.98665e-05, Linf 0.00329637, total time[s] 0.106467 +Converged at iteration 20, L1 8.44343e-05, Linf 0.00455035, total time[s] 0.063827 +Converged at iteration 24, L1 7.23197e-05, Linf 0.00621211, total time[s] 0.090764 +Converged at iteration 31, L1 9.00946e-05, Linf 0.00573773, total time[s] 0.103151 +Converged at iteration 27, L1 9.91626e-05, Linf 0.0056982, total time[s] 0.076112 +Converged at iteration 24, L1 8.79045e-05, Linf 0.00465012, total time[s] 0.088656 +Converged at iteration 23, L1 9.21983e-05, Linf 0.00410194, total time[s] 0.067129 +Converged at iteration 26, L1 7.22155e-05, Linf 0.00446076, total time[s] 0.10447 +Converged at iteration 29, L1 7.81524e-05, Linf 0.00479559, total time[s] 0.083763 +Converged at iteration 34, L1 7.09255e-05, Linf 0.00422699, total time[s] 0.094854 +Converged at iteration 30, L1 9.3942e-05, Linf 0.00442617, total time[s] 0.08063 +Converged at iteration 28, L1 9.49864e-05, Linf 0.00312523, total time[s] 0.157844 +Converged at iteration 32, L1 9.39946e-05, Linf 0.00376588, total time[s] 0.080424 +Converged at iteration 37, L1 7.36491e-05, Linf 0.00327476, total time[s] 0.089456 +Converged at iteration 33, L1 8.45059e-05, Linf 0.00469132, total time[s] 0.080749 +Converged at iteration 28, L1 9.6529e-05, Linf 0.00430378, total time[s] 0.069488 +Converged at iteration 24, L1 8.82926e-05, Linf 0.00325072, total time[s] 0.05993 +Converged at iteration 26, L1 8.99644e-05, Linf 0.00386287, total time[s] 0.064673 +Converged at iteration 38, L1 9.21847e-05, Linf 0.0175603, total time[s] 0.182155 +Converged at iteration 41, L1 7.42432e-05, Linf 0.0183869, total time[s] 0.19186 +Converged at iteration 33, L1 7.20087e-05, Linf 0.0072676, total time[s] 0.146478 +Converged at iteration 30, L1 5.49574e-05, Linf 0.00759999, total time[s] 0.155264 +Converged at iteration 25, L1 6.29882e-05, Linf 0.00475444, total time[s] 0.118038 +Converged at iteration 23, L1 7.44314e-05, Linf 0.00681256, total time[s] 0.1167 +Converged at iteration 28, L1 9.26739e-05, Linf 0.0162405, total time[s] 0.136577 +Converged at iteration 25, L1 5.41463e-05, Linf 0.00674058, total time[s] 0.139503 +Converged at iteration 29, L1 7.33528e-05, Linf 0.00911797, total time[s] 0.154325 +Converged at iteration 29, L1 7.1909e-05, Linf 0.0041999, total time[s] 0.155754 +Converged at iteration 21, L1 7.24063e-05, Linf 0.00386858, total time[s] 0.113436 +Converged at iteration 26, L1 9.15716e-05, Linf 0.0102676, total time[s] 0.129757 +Converged at iteration 23, L1 6.26362e-05, Linf 0.00569336, total time[s] 0.137664 +Converged at iteration 35, L1 8.3711e-05, Linf 0.00775608, total time[s] 0.157209 +Converged at iteration 27, L1 6.48914e-05, Linf 0.00744385, total time[s] 0.139358 +Converged at iteration 32, L1 6.42487e-05, Linf 0.00580398, total time[s] 0.179843 +Converged at iteration 30, L1 7.41081e-05, Linf 0.0088476, total time[s] 0.142029 +Converged at iteration 29, L1 8.01748e-05, Linf 0.00450106, total time[s] 0.135241 +Converged at iteration 27, L1 8.6927e-05, Linf 0.00461716, total time[s] 0.131769 +Converged at iteration 28, L1 8.06e-05, Linf 0.00540233, total time[s] 0.202465 +Converged at iteration 34, L1 6.56961e-05, Linf 0.00580949, total time[s] 0.16893 +Converged at iteration 37, L1 9.1641e-05, Linf 0.00737832, total time[s] 0.182386 +Converged at iteration 35, L1 9.40656e-05, Linf 0.00568961, total time[s] 0.183051 +Converged at iteration 34, L1 4.57575e-05, Linf 0.00751586, total time[s] 0.194582 +Converged at iteration 34, L1 5.3822e-05, Linf 0.00595232, total time[s] 0.227957 +Converged at iteration 36, L1 7.20186e-05, Linf 0.00713034, total time[s] 0.164561 +Converged at iteration 37, L1 6.09595e-05, Linf 0.0156775, total time[s] 0.168579 +Converged at iteration 33, L1 4.86311e-05, Linf 0.00836183, total time[s] 0.2044 +Converged at iteration 29, L1 9.69467e-05, Linf 0.0123414, total time[s] 0.142556 +Converged at iteration 31, L1 8.20304e-05, Linf 0.0103058, total time[s] 0.210701 +Converged at iteration 40, L1 6.70243e-05, Linf 0.00371661, total time[s] 0.123091 +Converged at iteration 35, L1 7.60919e-05, Linf 0.00339915, total time[s] 0.100989 +Converged at iteration 30, L1 9.62383e-05, Linf 0.00432711, total time[s] 0.24605 +Converged at iteration 31, L1 6.22051e-05, Linf 0.00500251, total time[s] 0.08677 +Converged at iteration 27, L1 6.2593e-05, Linf 0.00499545, total time[s] 0.098894 +Converged at iteration 22, L1 8.58698e-05, Linf 0.00448843, total time[s] 0.074741 +Converged at iteration 20, L1 9.60415e-05, Linf 0.00397842, total time[s] 0.085706 +Converged at iteration 24, L1 8.84246e-05, Linf 0.00482767, total time[s] 0.096193 +Converged at iteration 28, L1 7.39268e-05, Linf 0.00445902, total time[s] 0.082847 +Converged at iteration 26, L1 8.11955e-05, Linf 0.0055489, total time[s] 0.148578 +Converged at iteration 22, L1 7.38689e-05, Linf 0.0050854, total time[s] 0.108483 +Converged at iteration 19, L1 6.63267e-05, Linf 0.003931, total time[s] 0.067534 +Converged at iteration 30, L1 7.98725e-05, Linf 0.00329634, total time[s] 0.099935 +Converged at iteration 20, L1 8.44245e-05, Linf 0.00455019, total time[s] 0.094565 +Converged at iteration 24, L1 7.10871e-05, Linf 0.00462902, total time[s] 0.099908 +Converged at iteration 31, L1 8.92316e-05, Linf 0.00569366, total time[s] 0.111747 +Converged at iteration 27, L1 9.915e-05, Linf 0.00569833, total time[s] 0.109582 +Converged at iteration 24, L1 8.79049e-05, Linf 0.00465011, total time[s] 0.071626 +Converged at iteration 24, L1 8.3772e-05, Linf 0.00315667, total time[s] 0.100112 +Converged at iteration 26, L1 7.22238e-05, Linf 0.00446033, total time[s] 0.076165 +Converged at iteration 29, L1 7.80867e-05, Linf 0.00479529, total time[s] 0.097854 +Converged at iteration 34, L1 7.07835e-05, Linf 0.00422664, total time[s] 0.113088 +Converged at iteration 30, L1 9.39176e-05, Linf 0.00441922, total time[s] 0.13109 +Converged at iteration 28, L1 9.49904e-05, Linf 0.00310996, total time[s] 0.109787 +Converged at iteration 32, L1 9.42126e-05, Linf 0.00374039, total time[s] 0.117227 +Converged at iteration 37, L1 7.33738e-05, Linf 0.00327838, total time[s] 0.119931 +Converged at iteration 33, L1 8.45408e-05, Linf 0.0046909, total time[s] 0.090711 +Converged at iteration 28, L1 9.66287e-05, Linf 0.00430165, total time[s] 0.083429 +Converged at iteration 24, L1 8.83362e-05, Linf 0.00325069, total time[s] 0.070405 +Converged at iteration 26, L1 9.01731e-05, Linf 0.00383975, total time[s] 0.099006 +Converged at iteration 39, L1 6.01629e-05, Linf 0.00638193, total time[s] 0.121227 +Converged at iteration 35, L1 9.49939e-05, Linf 0.00590904, total time[s] 0.136469 +Converged at iteration 24, L1 8.89868e-05, Linf 0.00492327, total time[s] 0.070829 +Converged at iteration 30, L1 9.79788e-05, Linf 0.00610593, total time[s] 0.161645 +Converged at iteration 25, L1 6.63164e-05, Linf 0.00547693, total time[s] 0.079089 +Converged at iteration 20, L1 9.54219e-05, Linf 0.00402054, total time[s] 0.056474 +Converged at iteration 19, L1 5.76357e-05, Linf 0.00426761, total time[s] 0.086795 +Converged at iteration 20, L1 9.43057e-05, Linf 0.00668558, total time[s] 0.062697 +Converged at iteration 24, L1 6.49761e-05, Linf 0.00472251, total time[s] 0.088608 +Converged at iteration 24, L1 7.10242e-05, Linf 0.00490268, total time[s] 0.114351 +Converged at iteration 20, L1 5.42786e-05, Linf 0.005037, total time[s] 0.074136 +Converged at iteration 16, L1 9.56541e-05, Linf 0.0048456, total time[s] 0.051539 +Converged at iteration 31, L1 8.35179e-05, Linf 0.00283212, total time[s] 0.15501 +Converged at iteration 19, L1 9.89666e-05, Linf 0.00711642, total time[s] 0.065158 +Converged at iteration 23, L1 7.83834e-05, Linf 0.00696171, total time[s] 0.096943 +Converged at iteration 26, L1 7.16651e-05, Linf 0.00606774, total time[s] 0.074137 +Converged at iteration 23, L1 5.22353e-05, Linf 0.00569477, total time[s] 0.092485 +Converged at iteration 20, L1 7.02105e-05, Linf 0.00536213, total time[s] 0.060131 +Converged at iteration 23, L1 6.24487e-05, Linf 0.00333331, total time[s] 0.070424 +Converged at iteration 25, L1 9.12779e-05, Linf 0.00540421, total time[s] 0.133377 +Converged at iteration 28, L1 7.73837e-05, Linf 0.00631991, total time[s] 0.116086 +Converged at iteration 29, L1 7.02393e-05, Linf 0.00666831, total time[s] 0.112357 +Converged at iteration 27, L1 7.01677e-05, Linf 0.00417341, total time[s] 0.119018 +Converged at iteration 29, L1 6.52154e-05, Linf 0.0037998, total time[s] 0.103184 +Converged at iteration 29, L1 8.60251e-05, Linf 0.00296597, total time[s] 0.116807 +Converged at iteration 28, L1 7.59563e-05, Linf 0.00262767, total time[s] 0.150765 +Converged at iteration 32, L1 7.94545e-05, Linf 0.00659628, total time[s] 0.165412 +Converged at iteration 26, L1 8.53106e-05, Linf 0.00299819, total time[s] 0.109915 +Converged at iteration 24, L1 9.96461e-05, Linf 0.00277465, total time[s] 0.098579 +Converged at iteration 23, L1 7.86641e-05, Linf 0.00328454, total time[s] 0.080111 +Converged at iteration 38, L1 7.19766e-05, Linf 0.0102225, total time[s] 0.136004 +Converged at iteration 35, L1 6.56769e-05, Linf 0.00864167, total time[s] 0.120805 +Converged at iteration 25, L1 4.29279e-05, Linf 0.00524603, total time[s] 0.09407 +Converged at iteration 30, L1 6.7938e-05, Linf 0.00591833, total time[s] 0.100813 +Converged at iteration 23, L1 9.23862e-05, Linf 0.00594343, total time[s] 0.130585 +Converged at iteration 22, L1 5.71916e-05, Linf 0.00469937, total time[s] 0.092196 +Converged at iteration 19, L1 7.64168e-05, Linf 0.00697784, total time[s] 0.051055 +Converged at iteration 21, L1 4.11334e-05, Linf 0.00425062, total time[s] 0.068989 +Converged at iteration 23, L1 5.55424e-05, Linf 0.00361135, total time[s] 0.091693 +Converged at iteration 22, L1 9.5567e-05, Linf 0.00631469, total time[s] 0.072517 +Converged at iteration 19, L1 8.25133e-05, Linf 0.00577639, total time[s] 0.091617 +Converged at iteration 17, L1 7.38784e-05, Linf 0.00203105, total time[s] 0.085832 +Converged at iteration 31, L1 6.08074e-05, Linf 0.00462833, total time[s] 0.179551 +Converged at iteration 19, L1 9.57609e-05, Linf 0.00602107, total time[s] 0.126775 +Converged at iteration 22, L1 9.76645e-05, Linf 0.00749426, total time[s] 0.148643 +Converged at iteration 25, L1 9.95009e-05, Linf 0.00559843, total time[s] 0.13294 +Converged at iteration 24, L1 6.77876e-05, Linf 0.00240364, total time[s] 0.151531 +Converged at iteration 21, L1 7.65547e-05, Linf 0.00229867, total time[s] 0.060591 +Converged at iteration 23, L1 6.63375e-05, Linf 0.00284515, total time[s] 0.103167 +Converged at iteration 25, L1 7.77631e-05, Linf 0.00319842, total time[s] 0.10407 +Converged at iteration 26, L1 9.73037e-05, Linf 0.00381791, total time[s] 0.100183 +Converged at iteration 29, L1 8.17075e-05, Linf 0.00660873, total time[s] 0.098682 +Converged at iteration 28, L1 6.63351e-05, Linf 0.00257707, total time[s] 0.119658 +Converged at iteration 29, L1 8.73661e-05, Linf 0.00495766, total time[s] 0.094358 +Converged at iteration 29, L1 8.57915e-05, Linf 0.00229408, total time[s] 0.13043 +Converged at iteration 29, L1 4.73492e-05, Linf 0.00154189, total time[s] 0.079913 +Converged at iteration 32, L1 5.62318e-05, Linf 0.00809345, total time[s] 0.097146 +Converged at iteration 26, L1 7.86281e-05, Linf 0.00412266, total time[s] 0.099468 +Converged at iteration 25, L1 8.35472e-05, Linf 0.00338121, total time[s] 0.088909 +Converged at iteration 23, L1 8.73069e-05, Linf 0.00367082, total time[s] 0.071433 +Converged at iteration 37, L1 8.90338e-05, Linf 0.0159936, total time[s] 0.102016 +Converged at iteration 35, L1 3.90197e-05, Linf 0.0103073, total time[s] 0.132816 +Converged at iteration 25, L1 6.82507e-05, Linf 0.00926712, total time[s] 0.080734 +Converged at iteration 29, L1 6.27583e-05, Linf 0.0069678, total time[s] 0.113263 +Converged at iteration 23, L1 8.61471e-05, Linf 0.00606451, total time[s] 0.078625 +Converged at iteration 21, L1 9.75101e-05, Linf 0.00821117, total time[s] 0.085361 +Converged at iteration 20, L1 4.11373e-05, Linf 0.00738425, total time[s] 0.062594 +Converged at iteration 21, L1 7.60274e-05, Linf 0.00529012, total time[s] 0.109212 +Converged at iteration 23, L1 5.80893e-05, Linf 0.00367769, total time[s] 0.076354 +Converged at iteration 22, L1 5.79616e-05, Linf 0.00302412, total time[s] 0.08462 +Converged at iteration 20, L1 6.77193e-05, Linf 0.00243141, total time[s] 0.071422 +Converged at iteration 18, L1 8.09336e-05, Linf 0.00238428, total time[s] 0.097297 +Converged at iteration 31, L1 6.46147e-05, Linf 0.00709598, total time[s] 0.098179 +Converged at iteration 19, L1 8.49197e-05, Linf 0.00532709, total time[s] 0.065611 +Converged at iteration 22, L1 7.88189e-05, Linf 0.00500064, total time[s] 0.06096 +Converged at iteration 26, L1 5.56311e-05, Linf 0.00474238, total time[s] 0.075057 +Converged at iteration 25, L1 7.94468e-05, Linf 0.00296312, total time[s] 0.088264 +Converged at iteration 22, L1 9.10571e-05, Linf 0.00324985, total time[s] 0.069102 +Converged at iteration 23, L1 6.87067e-05, Linf 0.00264968, total time[s] 0.065078 +Converged at iteration 24, L1 9.62444e-05, Linf 0.00371853, total time[s] 0.063318 +Converged at iteration 24, L1 9.46468e-05, Linf 0.00332171, total time[s] 0.069814 +Converged at iteration 31, L1 6.0253e-05, Linf 0.00363158, total time[s] 0.099585 +Converged at iteration 29, L1 7.26275e-05, Linf 0.00295576, total time[s] 0.107303 +Converged at iteration 30, L1 5.47038e-05, Linf 0.00539224, total time[s] 0.108642 +Converged at iteration 30, L1 5.8277e-05, Linf 0.00183702, total time[s] 0.139822 +Converged at iteration 31, L1 5.37462e-05, Linf 0.00277726, total time[s] 0.132285 +Converged at iteration 32, L1 4.63238e-05, Linf 0.0106781, total time[s] 0.106732 +Converged at iteration 24, L1 8.40787e-05, Linf 0.00554667, total time[s] 0.084714 +Converged at iteration 25, L1 8.20831e-05, Linf 0.00393725, total time[s] 0.109332 +Converged at iteration 24, L1 6.59242e-05, Linf 0.00275399, total time[s] 0.090738 +Converged at iteration 37, L1 5.35815e-05, Linf 0.0172108, total time[s] 0.100061 +Converged at iteration 35, L1 3.6639e-05, Linf 0.0130696, total time[s] 0.094747 +Converged at iteration 25, L1 7.16368e-05, Linf 0.010923, total time[s] 0.085234 +Converged at iteration 28, L1 6.95452e-05, Linf 0.0080854, total time[s] 0.101497 +Converged at iteration 24, L1 6.00107e-05, Linf 0.00585294, total time[s] 0.086845 +Converged at iteration 21, L1 8.5481e-05, Linf 0.00870492, total time[s] 0.069108 +Converged at iteration 20, L1 7.54321e-05, Linf 0.0116747, total time[s] 0.092753 +Converged at iteration 21, L1 9.2911e-05, Linf 0.00664952, total time[s] 0.065592 +Converged at iteration 23, L1 7.33039e-05, Linf 0.00350028, total time[s] 0.074719 +Converged at iteration 23, L1 8.19467e-05, Linf 0.00180531, total time[s] 0.084473 +Converged at iteration 21, L1 5.78466e-05, Linf 0.00208431, total time[s] 0.099522 +Converged at iteration 19, L1 5.96336e-05, Linf 0.00298093, total time[s] 0.068887 +Converged at iteration 31, L1 6.15514e-05, Linf 0.00898773, total time[s] 0.142784 +Converged at iteration 19, L1 8.17519e-05, Linf 0.00497614, total time[s] 0.150925 +Converged at iteration 22, L1 7.24055e-05, Linf 0.00475106, total time[s] 0.120578 +Converged at iteration 26, L1 5.42529e-05, Linf 0.0034243, total time[s] 0.098601 +Converged at iteration 26, L1 7.07362e-05, Linf 0.00263029, total time[s] 0.097127 +Converged at iteration 23, L1 7.10519e-05, Linf 0.00268916, total time[s] 0.08656 +Converged at iteration 23, L1 7.89369e-05, Linf 0.00254789, total time[s] 0.107497 +Converged at iteration 24, L1 7.48762e-05, Linf 0.00356214, total time[s] 0.163525 +Converged at iteration 22, L1 8.66032e-05, Linf 0.00143938, total time[s] 0.097569 +Converged at iteration 31, L1 8.8121e-05, Linf 0.0070506, total time[s] 0.161439 +Converged at iteration 29, L1 9.50629e-05, Linf 0.00356125, total time[s] 0.082657 +Converged at iteration 30, L1 6.71631e-05, Linf 0.00819013, total time[s] 0.136215 +Converged at iteration 30, L1 7.56657e-05, Linf 0.00277892, total time[s] 0.093226 +Converged at iteration 31, L1 9.71284e-05, Linf 0.00493604, total time[s] 0.103097 +Converged at iteration 32, L1 4.29544e-05, Linf 0.0141312, total time[s] 0.105509 +Converged at iteration 25, L1 8.78453e-05, Linf 0.00281298, total time[s] 0.10998 +Converged at iteration 25, L1 8.17761e-05, Linf 0.00423205, total time[s] 0.098132 +Converged at iteration 24, L1 9.5731e-05, Linf 0.00565744, total time[s] 0.101985 +Converged at iteration 37, L1 3.68427e-05, Linf 0.0168186, total time[s] 0.123778 +Converged at iteration 35, L1 4.8373e-05, Linf 0.0137354, total time[s] 0.147426 +Converged at iteration 25, L1 7.33124e-05, Linf 0.0102397, total time[s] 0.087494 +Converged at iteration 27, L1 9.32758e-05, Linf 0.00931387, total time[s] 0.113867 +Converged at iteration 24, L1 7.89681e-05, Linf 0.0070769, total time[s] 0.081837 +Converged at iteration 21, L1 5.63907e-05, Linf 0.00762224, total time[s] 0.075904 +Converged at iteration 21, L1 3.07377e-05, Linf 0.00713174, total time[s] 0.069121 +Converged at iteration 22, L1 3.708e-05, Linf 0.00369718, total time[s] 0.06412 +Converged at iteration 24, L1 4.75875e-05, Linf 0.0023377, total time[s] 0.069344 +Converged at iteration 24, L1 8.30014e-05, Linf 0.0125936, total time[s] 0.113817 +Converged at iteration 21, L1 8.6508e-05, Linf 0.00240112, total time[s] 0.072436 +Converged at iteration 19, L1 8.18947e-05, Linf 0.00424446, total time[s] 0.073439 +Converged at iteration 31, L1 6.72283e-05, Linf 0.0103079, total time[s] 0.141129 +Converged at iteration 19, L1 9.31581e-05, Linf 0.00497126, total time[s] 0.097859 +Converged at iteration 22, L1 7.12587e-05, Linf 0.00463176, total time[s] 0.089901 +Converged at iteration 26, L1 7.68699e-05, Linf 0.00350991, total time[s] 0.099593 +Converged at iteration 27, L1 5.47356e-05, Linf 0.00176977, total time[s] 0.105864 +Converged at iteration 23, L1 9.76513e-05, Linf 0.00325803, total time[s] 0.068321 +Converged at iteration 23, L1 8.50352e-05, Linf 0.00255873, total time[s] 0.06667 +Converged at iteration 24, L1 5.76123e-05, Linf 0.00290454, total time[s] 0.066375 +Converged at iteration 25, L1 8.734e-05, Linf 0.0036193, total time[s] 0.076829 +Converged at iteration 32, L1 5.45636e-05, Linf 0.00425646, total time[s] 0.128536 +Converged at iteration 30, L1 6.5827e-05, Linf 0.00265373, total time[s] 0.108531 +Converged at iteration 30, L1 8.96948e-05, Linf 0.0106082, total time[s] 0.135064 +Converged at iteration 30, L1 9.9131e-05, Linf 0.0047997, total time[s] 0.109571 +Converged at iteration 32, L1 5.41946e-05, Linf 0.00324097, total time[s] 0.12352 +Converged at iteration 32, L1 4.49738e-05, Linf 0.0177175, total time[s] 0.119895 +Converged at iteration 27, L1 6.56239e-05, Linf 0.00574862, total time[s] 0.114036 +Converged at iteration 25, L1 7.38237e-05, Linf 0.00372581, total time[s] 0.066183 +Converged at iteration 25, L1 7.26833e-05, Linf 0.00565651, total time[s] 0.0845 +Converged at iteration 37, L1 3.28124e-05, Linf 0.0170399, total time[s] 0.13844 +Converged at iteration 35, L1 5.87466e-05, Linf 0.0221045, total time[s] 0.220587 +Converged at iteration 25, L1 7.3327e-05, Linf 0.00934298, total time[s] 0.12096 +Converged at iteration 27, L1 6.86445e-05, Linf 0.00795893, total time[s] 0.095328 +Converged at iteration 24, L1 7.84104e-05, Linf 0.0181732, total time[s] 0.089275 +Converged at iteration 21, L1 5.95256e-05, Linf 0.00642674, total time[s] 0.105742 +Converged at iteration 21, L1 4.53092e-05, Linf 0.00972398, total time[s] 0.085897 +Converged at iteration 22, L1 5.99984e-05, Linf 0.00690466, total time[s] 0.079741 +Converged at iteration 24, L1 8.06719e-05, Linf 0.00525052, total time[s] 0.107761 +Converged at iteration 25, L1 7.08325e-05, Linf 0.00375284, total time[s] 0.112933 +Converged at iteration 22, L1 6.31206e-05, Linf 0.00230097, total time[s] 0.093867 +Converged at iteration 19, L1 9.5683e-05, Linf 0.00513993, total time[s] 0.058403 +Converged at iteration 31, L1 7.88218e-05, Linf 0.0081296, total time[s] 0.132967 +Converged at iteration 20, L1 5.89986e-05, Linf 0.00372751, total time[s] 0.073877 +Converged at iteration 22, L1 8.22347e-05, Linf 0.00502013, total time[s] 0.073755 +Converged at iteration 27, L1 7.52264e-05, Linf 0.00272413, total time[s] 0.099987 +Converged at iteration 27, L1 7.50903e-05, Linf 0.00250281, total time[s] 0.094398 +Converged at iteration 24, L1 6.32184e-05, Linf 0.00211599, total time[s] 0.132784 +Converged at iteration 23, L1 8.02054e-05, Linf 0.00282572, total time[s] 0.06829 +Converged at iteration 23, L1 7.75654e-05, Linf 0.0042196, total time[s] 0.098246 +Converged at iteration 26, L1 9.86487e-05, Linf 0.00534562, total time[s] 0.166805 +Converged at iteration 32, L1 7.68998e-05, Linf 0.00838278, total time[s] 0.111431 +Converged at iteration 30, L1 7.82727e-05, Linf 0.00271269, total time[s] 0.102465 +Converged at iteration 31, L1 5.00765e-05, Linf 0.00684972, total time[s] 0.151747 +Converged at iteration 31, L1 8.31396e-05, Linf 0.00524077, total time[s] 0.131492 +Converged at iteration 32, L1 7.7364e-05, Linf 0.00466349, total time[s] 0.121477 +Converged at iteration 32, L1 5.02904e-05, Linf 0.0209519, total time[s] 0.139197 +Converged at iteration 27, L1 8.1699e-05, Linf 0.00790129, total time[s] 0.111928 +Converged at iteration 25, L1 6.50807e-05, Linf 0.00365894, total time[s] 0.067454 +Converged at iteration 26, L1 5.25181e-05, Linf 0.00527462, total time[s] 0.118833 +Converged at iteration 37, L1 3.80638e-05, Linf 0.0198902, total time[s] 0.115343 +Converged at iteration 35, L1 6.85353e-05, Linf 0.0252956, total time[s] 0.136549 +Converged at iteration 25, L1 7.82696e-05, Linf 0.00943607, total time[s] 0.073833 +Converged at iteration 27, L1 5.04314e-05, Linf 0.00618493, total time[s] 0.088283 +Converged at iteration 23, L1 8.29017e-05, Linf 0.00496961, total time[s] 0.091767 +Converged at iteration 21, L1 5.46443e-05, Linf 0.00584957, total time[s] 0.054318 +Converged at iteration 21, L1 5.80295e-05, Linf 0.0112377, total time[s] 0.054662 +Converged at iteration 23, L1 4.53395e-05, Linf 0.00667477, total time[s] 0.059008 +Converged at iteration 25, L1 6.35234e-05, Linf 0.00654426, total time[s] 0.063517 +Converged at iteration 25, L1 8.97471e-05, Linf 0.00579118, total time[s] 0.063697 +Converged at iteration 22, L1 7.66126e-05, Linf 0.00326764, total time[s] 0.054631 +Converged at iteration 19, L1 9.90476e-05, Linf 0.00523553, total time[s] 0.04769 +Converged at iteration 31, L1 9.41933e-05, Linf 0.0100334, total time[s] 0.074959 +Converged at iteration 20, L1 7.30855e-05, Linf 0.00498255, total time[s] 0.049896 +Converged at iteration 23, L1 5.70764e-05, Linf 0.00413616, total time[s] 0.056944 +Converged at iteration 38, L1 9.21847e-05, Linf 0.0175603, total time[s] 0.201796 +Converged at iteration 41, L1 7.42432e-05, Linf 0.0183869, total time[s] 0.199678 +Converged at iteration 30, L1 5.49574e-05, Linf 0.00759999, total time[s] 0.174606 +Converged at iteration 33, L1 7.20087e-05, Linf 0.0072676, total time[s] 0.18558 +Converged at iteration 23, L1 7.44314e-05, Linf 0.00681256, total time[s] 0.116084 +Converged at iteration 25, L1 6.299e-05, Linf 0.00475444, total time[s] 0.140782 +Converged at iteration 28, L1 9.26739e-05, Linf 0.0162405, total time[s] 0.183533 +Converged at iteration 25, L1 5.41453e-05, Linf 0.00674062, total time[s] 0.160055 +Converged at iteration 29, L1 7.33526e-05, Linf 0.00911765, total time[s] 0.183088 +Converged at iteration 29, L1 7.1909e-05, Linf 0.0041999, total time[s] 0.167799 +Converged at iteration 21, L1 7.24063e-05, Linf 0.00386858, total time[s] 0.109865 +Converged at iteration 26, L1 9.15717e-05, Linf 0.0102676, total time[s] 0.122389 +Converged at iteration 23, L1 6.26364e-05, Linf 0.00569336, total time[s] 0.119361 +Converged at iteration 35, L1 8.37137e-05, Linf 0.00775608, total time[s] 0.165717 +Converged at iteration 32, L1 6.42487e-05, Linf 0.005804, total time[s] 0.146073 +Converged at iteration 27, L1 6.48761e-05, Linf 0.00741463, total time[s] 0.128438 +Converged at iteration 30, L1 7.41106e-05, Linf 0.00884236, total time[s] 0.139088 +Converged at iteration 29, L1 8.01747e-05, Linf 0.00450107, total time[s] 0.14543 +Converged at iteration 28, L1 8.06009e-05, Linf 0.0054018, total time[s] 0.163706 +Converged at iteration 27, L1 8.69268e-05, Linf 0.00461716, total time[s] 0.127493 +Converged at iteration 37, L1 9.1641e-05, Linf 0.00737833, total time[s] 0.169843 +Converged at iteration 34, L1 6.56961e-05, Linf 0.00580949, total time[s] 0.156785 +Converged at iteration 34, L1 4.57606e-05, Linf 0.00751589, total time[s] 0.157483 +Converged at iteration 35, L1 9.40645e-05, Linf 0.00568962, total time[s] 0.16047 +Converged at iteration 36, L1 7.20186e-05, Linf 0.00713034, total time[s] 0.166576 +Converged at iteration 34, L1 5.3822e-05, Linf 0.00595232, total time[s] 0.150728 +Converged at iteration 33, L1 4.86312e-05, Linf 0.00836183, total time[s] 0.154491 +Converged at iteration 37, L1 6.09595e-05, Linf 0.0156775, total time[s] 0.164304 +Converged at iteration 31, L1 8.20304e-05, Linf 0.0103058, total time[s] 0.144287 +Converged at iteration 29, L1 9.69467e-05, Linf 0.0123414, total time[s] 0.107183 +Converged at iteration 38, L1 9.21847e-05, Linf 0.0175603, total time[s] 0.170005 +Converged at iteration 41, L1 7.42432e-05, Linf 0.0183869, total time[s] 0.190288 +Converged at iteration 30, L1 5.49574e-05, Linf 0.00759999, total time[s] 0.137166 +Converged at iteration 33, L1 7.20087e-05, Linf 0.0072676, total time[s] 0.245813 +Converged at iteration 23, L1 7.44313e-05, Linf 0.00681256, total time[s] 0.110185 +Converged at iteration 25, L1 6.29886e-05, Linf 0.00475444, total time[s] 0.145499 +Converged at iteration 28, L1 9.26757e-05, Linf 0.0162408, total time[s] 0.215901 +Converged at iteration 25, L1 5.41463e-05, Linf 0.00674058, total time[s] 0.143627 +Converged at iteration 29, L1 7.33526e-05, Linf 0.00911761, total time[s] 0.143892 +Converged at iteration 21, L1 7.2407e-05, Linf 0.00386845, total time[s] 0.098361 +Converged at iteration 29, L1 7.1909e-05, Linf 0.0041999, total time[s] 0.143318 +Converged at iteration 26, L1 9.15716e-05, Linf 0.0102676, total time[s] 0.137604 +Converged at iteration 23, L1 6.27156e-05, Linf 0.00599132, total time[s] 0.113652 +Converged at iteration 35, L1 8.3717e-05, Linf 0.00775608, total time[s] 0.178681 +Converged at iteration 32, L1 6.42488e-05, Linf 0.00580398, total time[s] 0.201728 +Converged at iteration 27, L1 6.48865e-05, Linf 0.00743169, total time[s] 0.133572 +Converged at iteration 30, L1 7.41106e-05, Linf 0.00884236, total time[s] 0.180067 +Converged at iteration 29, L1 8.01747e-05, Linf 0.00450107, total time[s] 0.153162 +Converged at iteration 28, L1 8.06032e-05, Linf 0.00540179, total time[s] 0.157025 +Converged at iteration 27, L1 8.6927e-05, Linf 0.00461716, total time[s] 0.153978 +Converged at iteration 37, L1 9.16478e-05, Linf 0.00741963, total time[s] 0.187882 +Converged at iteration 34, L1 6.56961e-05, Linf 0.00580949, total time[s] 0.158475 +Converged at iteration 34, L1 4.57573e-05, Linf 0.00751585, total time[s] 0.157876 +Converged at iteration 35, L1 9.40656e-05, Linf 0.00568962, total time[s] 0.177646 +Converged at iteration 36, L1 7.20186e-05, Linf 0.00713034, total time[s] 0.196344 +Converged at iteration 34, L1 5.3822e-05, Linf 0.00595232, total time[s] 0.232811 +Converged at iteration 33, L1 4.86312e-05, Linf 0.00836183, total time[s] 0.178658 +Converged at iteration 37, L1 6.09595e-05, Linf 0.0156775, total time[s] 0.212461 +Converged at iteration 31, L1 8.20304e-05, Linf 0.0103058, total time[s] 0.171025 +Converged at iteration 29, L1 9.69467e-05, Linf 0.0123414, total time[s] 0.13192 +Converged at iteration 40, L1 6.7935e-05, Linf 0.00367452, total time[s] 0.134952 +Converged at iteration 35, L1 7.64878e-05, Linf 0.00339579, total time[s] 0.094371 +Converged at iteration 30, L1 9.67458e-05, Linf 0.00432823, total time[s] 0.082446 +Converged at iteration 31, L1 6.20154e-05, Linf 0.00502563, total time[s] 0.085167 +Converged at iteration 27, L1 6.36241e-05, Linf 0.00499529, total time[s] 0.077497 +Converged at iteration 22, L1 8.58454e-05, Linf 0.00444492, total time[s] 0.095841 +Converged at iteration 20, L1 9.59996e-05, Linf 0.0039782, total time[s] 0.08833 +Converged at iteration 24, L1 8.84983e-05, Linf 0.00482795, total time[s] 0.08107 +Converged at iteration 28, L1 7.39236e-05, Linf 0.0044591, total time[s] 0.071588 +Converged at iteration 26, L1 8.11739e-05, Linf 0.00546755, total time[s] 0.067669 +Converged at iteration 22, L1 7.3956e-05, Linf 0.00508661, total time[s] 0.058437 +Converged at iteration 19, L1 6.63287e-05, Linf 0.00393092, total time[s] 0.051497 +Converged at iteration 30, L1 8.01624e-05, Linf 0.00330345, total time[s] 0.092013 +Converged at iteration 20, L1 8.43474e-05, Linf 0.00455073, total time[s] 0.098574 +Converged at iteration 24, L1 7.10875e-05, Linf 0.00463331, total time[s] 0.07178 +Converged at iteration 31, L1 8.95397e-05, Linf 0.00569133, total time[s] 0.081142 +Converged at iteration 27, L1 9.91665e-05, Linf 0.00569826, total time[s] 0.069306 +Converged at iteration 24, L1 8.79223e-05, Linf 0.00465082, total time[s] 0.068887 +Converged at iteration 23, L1 9.21865e-05, Linf 0.0041019, total time[s] 0.059478 +Converged at iteration 26, L1 7.22343e-05, Linf 0.0044612, total time[s] 0.066374 +Converged at iteration 29, L1 7.8161e-05, Linf 0.00479606, total time[s] 0.074118 +Converged at iteration 34, L1 7.09676e-05, Linf 0.00422719, total time[s] 0.111638 +Converged at iteration 30, L1 9.39654e-05, Linf 0.00442562, total time[s] 0.12044 +Converged at iteration 28, L1 9.51746e-05, Linf 0.00311002, total time[s] 0.091355 +Converged at iteration 32, L1 9.39331e-05, Linf 0.00374081, total time[s] 0.096487 +Converged at iteration 37, L1 7.33857e-05, Linf 0.00327813, total time[s] 0.097066 +Converged at iteration 33, L1 8.44797e-05, Linf 0.00469103, total time[s] 0.084982 +Converged at iteration 28, L1 9.65489e-05, Linf 0.00430184, total time[s] 0.079333 +Converged at iteration 24, L1 8.8336e-05, Linf 0.00325079, total time[s] 0.095997 +Converged at iteration 26, L1 8.98032e-05, Linf 0.00381986, total time[s] 0.10318 +Converged at iteration 41, L1 8.17906e-05, Linf 0.0184755, total time[s] 0.113593 +Converged at iteration 39, L1 3.97285e-05, Linf 0.0104374, total time[s] 0.119492 +Converged at iteration 33, L1 7.68236e-05, Linf 0.00779997, total time[s] 0.127388 +Converged at iteration 30, L1 6.34722e-05, Linf 0.00813607, total time[s] 0.104509 +Converged at iteration 25, L1 6.04095e-05, Linf 0.00476718, total time[s] 0.130229 +Converged at iteration 23, L1 7.41144e-05, Linf 0.00686045, total time[s] 0.122009 +Converged at iteration 25, L1 5.55404e-05, Linf 0.00693651, total time[s] 0.10734 +Converged at iteration 28, L1 9.63446e-05, Linf 0.0165904, total time[s] 0.101648 +Converged at iteration 29, L1 8.45537e-05, Linf 0.00474117, total time[s] 0.124654 +Converged at iteration 29, L1 7.09941e-05, Linf 0.00881791, total time[s] 0.101169 +Converged at iteration 26, L1 9.72065e-05, Linf 0.0102485, total time[s] 0.09588 +Converged at iteration 21, L1 7.19449e-05, Linf 0.00386695, total time[s] 0.060364 +Converged at iteration 35, L1 9.36727e-05, Linf 0.0086044, total time[s] 0.119323 +Converged at iteration 23, L1 6.21737e-05, Linf 0.00566546, total time[s] 0.092079 +Converged at iteration 27, L1 6.30542e-05, Linf 0.00621734, total time[s] 0.123124 +Converged at iteration 32, L1 6.81354e-05, Linf 0.0061266, total time[s] 0.107487 +Converged at iteration 29, L1 7.94022e-05, Linf 0.00429911, total time[s] 0.0912 +Converged at iteration 30, L1 7.56018e-05, Linf 0.009374, total time[s] 0.085439 +Converged at iteration 27, L1 9.22808e-05, Linf 0.00517026, total time[s] 0.095509 +Converged at iteration 28, L1 8.01418e-05, Linf 0.00540946, total time[s] 0.07889 +Converged at iteration 34, L1 7.28396e-05, Linf 0.00623089, total time[s] 0.094702 +Converged at iteration 37, L1 8.74981e-05, Linf 0.00737896, total time[s] 0.149381 +Converged at iteration 35, L1 9.24733e-05, Linf 0.0215687, total time[s] 0.132163 +Converged at iteration 34, L1 5.20771e-05, Linf 0.00780141, total time[s] 0.096415 +Converged at iteration 34, L1 5.67923e-05, Linf 0.00562505, total time[s] 0.125756 +Converged at iteration 36, L1 7.91786e-05, Linf 0.0072769, total time[s] 0.10129 +Converged at iteration 37, L1 6.38368e-05, Linf 0.015987, total time[s] 0.145575 +Converged at iteration 33, L1 5.76711e-05, Linf 0.00852976, total time[s] 0.105334 +Converged at iteration 30, L1 4.6981e-05, Linf 0.0078333, total time[s] 0.110777 +Converged at iteration 31, L1 8.67568e-05, Linf 0.0106345, total time[s] 0.11256 +Converged at iteration 40, L1 6.71394e-05, Linf 0.00367472, total time[s] 0.118699 +Converged at iteration 35, L1 7.60946e-05, Linf 0.00339712, total time[s] 0.096582 +Converged at iteration 30, L1 9.64091e-05, Linf 0.00432939, total time[s] 0.104715 +Converged at iteration 31, L1 6.23714e-05, Linf 0.00502563, total time[s] 0.088589 +Converged at iteration 27, L1 6.28194e-05, Linf 0.00499695, total time[s] 0.079394 +Converged at iteration 22, L1 8.58691e-05, Linf 0.00448835, total time[s] 0.06079 +Converged at iteration 20, L1 9.61444e-05, Linf 0.00397892, total time[s] 0.083564 +Converged at iteration 24, L1 8.84441e-05, Linf 0.00482826, total time[s] 0.064643 +Converged at iteration 28, L1 7.38326e-05, Linf 0.00445905, total time[s] 0.080874 +Converged at iteration 26, L1 8.1181e-05, Linf 0.00548226, total time[s] 0.072124 +Converged at iteration 22, L1 7.39266e-05, Linf 0.00508686, total time[s] 0.07842 +Converged at iteration 19, L1 6.63293e-05, Linf 0.00393099, total time[s] 0.070618 +Converged at iteration 30, L1 7.98872e-05, Linf 0.00329686, total time[s] 0.099109 +Converged at iteration 20, L1 8.44283e-05, Linf 0.00455628, total time[s] 0.056467 +Converged at iteration 24, L1 7.10862e-05, Linf 0.00463288, total time[s] 0.091563 +Converged at iteration 31, L1 8.9382e-05, Linf 0.00569224, total time[s] 0.113812 +Converged at iteration 27, L1 9.91901e-05, Linf 0.0056983, total time[s] 0.075612 +Converged at iteration 24, L1 8.79143e-05, Linf 0.00465021, total time[s] 0.11751 +Converged at iteration 23, L1 9.21853e-05, Linf 0.00410192, total time[s] 0.078771 +Converged at iteration 26, L1 7.21599e-05, Linf 0.00445957, total time[s] 0.107417 +Converged at iteration 29, L1 7.81635e-05, Linf 0.00479606, total time[s] 0.101435 +Converged at iteration 34, L1 7.09358e-05, Linf 0.00422668, total time[s] 0.122989 +Converged at iteration 30, L1 9.68425e-05, Linf 0.00442672, total time[s] 0.107163 +Converged at iteration 28, L1 9.49847e-05, Linf 0.00311274, total time[s] 0.076207 +Converged at iteration 32, L1 9.47772e-05, Linf 0.0037653, total time[s] 0.104547 +Converged at iteration 37, L1 7.34239e-05, Linf 0.00328238, total time[s] 0.133131 +Converged at iteration 33, L1 8.45185e-05, Linf 0.00469111, total time[s] 0.090253 +Converged at iteration 28, L1 9.66137e-05, Linf 0.00430191, total time[s] 0.087304 +Converged at iteration 24, L1 8.82879e-05, Linf 0.00325077, total time[s] 0.088864 +Converged at iteration 26, L1 8.99449e-05, Linf 0.00383972, total time[s] 0.087629 +Converged at iteration 39, L1 6.05074e-05, Linf 0.00638132, total time[s] 0.107146 +Converged at iteration 35, L1 9.48512e-05, Linf 0.00590628, total time[s] 0.10466 +Converged at iteration 24, L1 8.92818e-05, Linf 0.00490699, total time[s] 0.065221 +Converged at iteration 30, L1 9.77805e-05, Linf 0.00610883, total time[s] 0.08117 +Converged at iteration 25, L1 6.63479e-05, Linf 0.00548651, total time[s] 0.11505 +Converged at iteration 20, L1 9.57678e-05, Linf 0.0040137, total time[s] 0.081875 +Converged at iteration 19, L1 5.80843e-05, Linf 0.00427057, total time[s] 0.086442 +Converged at iteration 20, L1 9.45266e-05, Linf 0.0067124, total time[s] 0.089147 +Converged at iteration 24, L1 6.52393e-05, Linf 0.00471399, total time[s] 0.118761 +Converged at iteration 24, L1 7.09971e-05, Linf 0.00490433, total time[s] 0.077259 +Converged at iteration 20, L1 5.45116e-05, Linf 0.00504449, total time[s] 0.054962 +Converged at iteration 16, L1 9.55257e-05, Linf 0.00487801, total time[s] 0.04534 +Converged at iteration 31, L1 8.32424e-05, Linf 0.00282817, total time[s] 0.131277 +Converged at iteration 19, L1 9.90191e-05, Linf 0.00712735, total time[s] 0.088104 +Converged at iteration 23, L1 7.84575e-05, Linf 0.00696207, total time[s] 0.092445 +Converged at iteration 26, L1 7.17194e-05, Linf 0.00607061, total time[s] 0.090944 +Converged at iteration 23, L1 5.21706e-05, Linf 0.00567921, total time[s] 0.122702 +Converged at iteration 20, L1 7.02072e-05, Linf 0.00535039, total time[s] 0.070889 +Converged at iteration 23, L1 6.33317e-05, Linf 0.00386286, total time[s] 0.11934 +Converged at iteration 25, L1 9.09224e-05, Linf 0.00540705, total time[s] 0.076233 +Converged at iteration 28, L1 7.59925e-05, Linf 0.00382357, total time[s] 0.113522 +Converged at iteration 29, L1 7.02336e-05, Linf 0.00666779, total time[s] 0.136995 +Converged at iteration 27, L1 6.99986e-05, Linf 0.00416127, total time[s] 0.117235 +Converged at iteration 29, L1 6.52852e-05, Linf 0.00376515, total time[s] 0.130051 +Converged at iteration 29, L1 8.64599e-05, Linf 0.00296306, total time[s] 0.108181 +Converged at iteration 28, L1 7.56468e-05, Linf 0.00262264, total time[s] 0.078648 +Converged at iteration 32, L1 7.93903e-05, Linf 0.00659956, total time[s] 0.14786 +Converged at iteration 26, L1 8.532e-05, Linf 0.00297002, total time[s] 0.096644 +Converged at iteration 24, L1 9.94095e-05, Linf 0.00276892, total time[s] 0.100317 +Converged at iteration 23, L1 7.84743e-05, Linf 0.00329549, total time[s] 0.067858 +Converged at iteration 38, L1 7.1906e-05, Linf 0.0102236, total time[s] 0.110352 +Converged at iteration 35, L1 6.56845e-05, Linf 0.00855411, total time[s] 0.104123 +Converged at iteration 25, L1 4.29669e-05, Linf 0.00532723, total time[s] 0.095224 +Converged at iteration 30, L1 6.78186e-05, Linf 0.00591782, total time[s] 0.087923 +Converged at iteration 23, L1 9.26157e-05, Linf 0.00596327, total time[s] 0.06973 +Converged at iteration 22, L1 5.79387e-05, Linf 0.0046894, total time[s] 0.080152 +Converged at iteration 19, L1 7.62869e-05, Linf 0.00693007, total time[s] 0.08402 +Converged at iteration 21, L1 4.11836e-05, Linf 0.00425326, total time[s] 0.073179 +Converged at iteration 23, L1 5.58921e-05, Linf 0.00362109, total time[s] 0.107023 +Converged at iteration 22, L1 9.54438e-05, Linf 0.00635793, total time[s] 0.096579 +Converged at iteration 19, L1 8.29267e-05, Linf 0.00579375, total time[s] 0.068118 +Converged at iteration 17, L1 7.34807e-05, Linf 0.00202393, total time[s] 0.094136 +Converged at iteration 31, L1 5.94903e-05, Linf 0.00461872, total time[s] 0.127776 +Converged at iteration 19, L1 9.46588e-05, Linf 0.00619467, total time[s] 0.058337 +Converged at iteration 22, L1 9.86506e-05, Linf 0.00751002, total time[s] 0.095782 +Converged at iteration 25, L1 9.93701e-05, Linf 0.00560976, total time[s] 0.118377 +Converged at iteration 24, L1 6.77434e-05, Linf 0.00240384, total time[s] 0.077616 +Converged at iteration 21, L1 7.62049e-05, Linf 0.00228887, total time[s] 0.073807 +Converged at iteration 23, L1 6.66272e-05, Linf 0.00284552, total time[s] 0.062254 +Converged at iteration 25, L1 7.77096e-05, Linf 0.00320328, total time[s] 0.069647 +Converged at iteration 26, L1 9.7966e-05, Linf 0.00508877, total time[s] 0.089124 +Converged at iteration 29, L1 8.36407e-05, Linf 0.00801189, total time[s] 0.08303 +Converged at iteration 28, L1 6.65205e-05, Linf 0.00257763, total time[s] 0.089001 +Converged at iteration 29, L1 8.57754e-05, Linf 0.00493374, total time[s] 0.084695 +Converged at iteration 29, L1 8.46988e-05, Linf 0.00229095, total time[s] 0.089234 +Converged at iteration 28, L1 9.99196e-05, Linf 0.00259998, total time[s] 0.091367 +Converged at iteration 32, L1 5.64326e-05, Linf 0.0080118, total time[s] 0.12467 +Converged at iteration 26, L1 7.86023e-05, Linf 0.00412831, total time[s] 0.069309 +Converged at iteration 25, L1 8.32997e-05, Linf 0.0033763, total time[s] 0.074673 +Converged at iteration 23, L1 8.75664e-05, Linf 0.00366924, total time[s] 0.064543 +Converged at iteration 37, L1 8.9569e-05, Linf 0.0159879, total time[s] 0.13095 +Converged at iteration 35, L1 3.90997e-05, Linf 0.0102983, total time[s] 0.10236 +Converged at iteration 25, L1 6.83759e-05, Linf 0.00937899, total time[s] 0.078658 +Converged at iteration 29, L1 6.27101e-05, Linf 0.00696422, total time[s] 0.078721 +Converged at iteration 23, L1 8.64694e-05, Linf 0.0061001, total time[s] 0.0764 +Converged at iteration 21, L1 9.73966e-05, Linf 0.00819948, total time[s] 0.065382 +Converged at iteration 20, L1 4.10742e-05, Linf 0.00736242, total time[s] 0.06653 +Converged at iteration 21, L1 7.64526e-05, Linf 0.00530621, total time[s] 0.092448 +Converged at iteration 23, L1 5.82817e-05, Linf 0.00369251, total time[s] 0.079108 +Converged at iteration 22, L1 5.77732e-05, Linf 0.00302418, total time[s] 0.066685 +Converged at iteration 20, L1 6.77659e-05, Linf 0.00243607, total time[s] 0.073824 +Converged at iteration 18, L1 8.05391e-05, Linf 0.00235888, total time[s] 0.04902 +Converged at iteration 31, L1 6.41079e-05, Linf 0.00705235, total time[s] 0.116171 +Converged at iteration 19, L1 8.51492e-05, Linf 0.00540969, total time[s] 0.087765 +Converged at iteration 22, L1 7.91203e-05, Linf 0.00500677, total time[s] 0.098993 +Converged at iteration 26, L1 5.57998e-05, Linf 0.00475867, total time[s] 0.094599 +Converged at iteration 25, L1 7.94127e-05, Linf 0.00296066, total time[s] 0.069757 +Converged at iteration 22, L1 9.11087e-05, Linf 0.00323632, total time[s] 0.066613 +Converged at iteration 23, L1 6.89095e-05, Linf 0.0026503, total time[s] 0.059645 +Converged at iteration 24, L1 9.62052e-05, Linf 0.00371766, total time[s] 0.070149 +Converged at iteration 24, L1 9.50911e-05, Linf 0.00332151, total time[s] 0.106483 +Converged at iteration 31, L1 6.02033e-05, Linf 0.00363649, total time[s] 0.092319 +Converged at iteration 29, L1 7.25804e-05, Linf 0.00295194, total time[s] 0.080767 +Converged at iteration 30, L1 5.44304e-05, Linf 0.00533316, total time[s] 0.081323 +Converged at iteration 30, L1 5.85473e-05, Linf 0.00183589, total time[s] 0.093776 +Converged at iteration 31, L1 5.39082e-05, Linf 0.00278041, total time[s] 0.13461 +Converged at iteration 32, L1 4.64847e-05, Linf 0.0106737, total time[s] 0.130952 +Converged at iteration 24, L1 8.91965e-05, Linf 0.00559048, total time[s] 0.069735 +Converged at iteration 25, L1 8.28265e-05, Linf 0.0040277, total time[s] 0.105647 +Converged at iteration 24, L1 6.72414e-05, Linf 0.0027624, total time[s] 0.102801 +Converged at iteration 37, L1 5.36788e-05, Linf 0.0172113, total time[s] 0.100035 +Converged at iteration 35, L1 3.66252e-05, Linf 0.0133581, total time[s] 0.124053 +Converged at iteration 25, L1 7.18722e-05, Linf 0.0108129, total time[s] 0.106138 +Converged at iteration 28, L1 6.90572e-05, Linf 0.00793334, total time[s] 0.089855 +Converged at iteration 24, L1 6.01287e-05, Linf 0.00588518, total time[s] 0.085246 +Converged at iteration 21, L1 7.77052e-05, Linf 0.00869432, total time[s] 0.055382 +Converged at iteration 20, L1 7.56882e-05, Linf 0.011667, total time[s] 0.082891 +Converged at iteration 21, L1 9.34193e-05, Linf 0.00668687, total time[s] 0.091816 +Converged at iteration 23, L1 7.37914e-05, Linf 0.00350074, total time[s] 0.062051 +Converged at iteration 23, L1 8.20321e-05, Linf 0.00179794, total time[s] 0.07675 +Converged at iteration 21, L1 5.78729e-05, Linf 0.00209043, total time[s] 0.066908 +Converged at iteration 19, L1 5.98049e-05, Linf 0.00296415, total time[s] 0.069754 +Converged at iteration 31, L1 6.09816e-05, Linf 0.00891079, total time[s] 0.099492 +Converged at iteration 19, L1 8.12465e-05, Linf 0.00497651, total time[s] 0.089807 +Converged at iteration 22, L1 7.21048e-05, Linf 0.00475806, total time[s] 0.081629 +Converged at iteration 26, L1 5.42046e-05, Linf 0.00345318, total time[s] 0.066122 +Converged at iteration 26, L1 7.05727e-05, Linf 0.002628, total time[s] 0.078453 +Converged at iteration 23, L1 7.00011e-05, Linf 0.0026796, total time[s] 0.075922 +Converged at iteration 23, L1 7.8335e-05, Linf 0.00254784, total time[s] 0.110529 +Converged at iteration 24, L1 7.43404e-05, Linf 0.00352778, total time[s] 0.115197 +Converged at iteration 22, L1 8.64213e-05, Linf 0.00143762, total time[s] 0.058786 +Converged at iteration 31, L1 8.76647e-05, Linf 0.00669597, total time[s] 0.124831 +Converged at iteration 29, L1 9.52616e-05, Linf 0.00355824, total time[s] 0.134147 +Converged at iteration 30, L1 6.67544e-05, Linf 0.0081352, total time[s] 0.110625 +Converged at iteration 30, L1 7.55309e-05, Linf 0.00275854, total time[s] 0.10081 +Converged at iteration 31, L1 9.74568e-05, Linf 0.00494389, total time[s] 0.100269 +Converged at iteration 32, L1 4.30255e-05, Linf 0.0138476, total time[s] 0.089878 +Converged at iteration 25, L1 8.42666e-05, Linf 0.00274206, total time[s] 0.072848 +Converged at iteration 25, L1 8.23451e-05, Linf 0.00422843, total time[s] 0.116346 +Converged at iteration 24, L1 9.5194e-05, Linf 0.00563699, total time[s] 0.090426 +Converged at iteration 37, L1 3.69045e-05, Linf 0.0168775, total time[s] 0.102553 +Converged at iteration 35, L1 4.85428e-05, Linf 0.0137656, total time[s] 0.103085 +Converged at iteration 25, L1 7.34932e-05, Linf 0.0103282, total time[s] 0.110148 +Converged at iteration 27, L1 9.34996e-05, Linf 0.00931852, total time[s] 0.091865 +Converged at iteration 24, L1 7.91491e-05, Linf 0.00712129, total time[s] 0.081259 +Converged at iteration 21, L1 5.66841e-05, Linf 0.00762333, total time[s] 0.080099 +Converged at iteration 21, L1 3.11014e-05, Linf 0.00722501, total time[s] 0.076905 +Converged at iteration 22, L1 3.72425e-05, Linf 0.00369899, total time[s] 0.071782 +Converged at iteration 24, L1 4.84177e-05, Linf 0.00233845, total time[s] 0.138116 +Converged at iteration 24, L1 8.02563e-05, Linf 0.00337463, total time[s] 0.090579 +Converged at iteration 21, L1 8.65173e-05, Linf 0.00241441, total time[s] 0.063156 +Converged at iteration 19, L1 8.20011e-05, Linf 0.00422654, total time[s] 0.073051 +Converged at iteration 31, L1 6.53168e-05, Linf 0.0100905, total time[s] 0.093528 +Converged at iteration 19, L1 9.25553e-05, Linf 0.00496663, total time[s] 0.059109 +Converged at iteration 22, L1 7.15394e-05, Linf 0.00467393, total time[s] 0.116697 +Converged at iteration 26, L1 7.68819e-05, Linf 0.00352165, total time[s] 0.0992 +Converged at iteration 27, L1 5.32453e-05, Linf 0.00177061, total time[s] 0.08256 +Converged at iteration 23, L1 9.75172e-05, Linf 0.00324626, total time[s] 0.064274 +Converged at iteration 23, L1 8.39421e-05, Linf 0.00254607, total time[s] 0.096071 +Converged at iteration 24, L1 5.83734e-05, Linf 0.00292186, total time[s] 0.092573 +Converged at iteration 25, L1 8.68001e-05, Linf 0.00362579, total time[s] 0.101931 +Converged at iteration 32, L1 5.50491e-05, Linf 0.00426654, total time[s] 0.137087 +Converged at iteration 30, L1 6.65014e-05, Linf 0.00264861, total time[s] 0.117415 +Converged at iteration 30, L1 8.63431e-05, Linf 0.0106431, total time[s] 0.08729 +Converged at iteration 30, L1 9.89292e-05, Linf 0.00478493, total time[s] 0.104673 +Converged at iteration 32, L1 5.27845e-05, Linf 0.00325327, total time[s] 0.101271 +Converged at iteration 32, L1 4.46181e-05, Linf 0.0169169, total time[s] 0.119092 +Converged at iteration 27, L1 6.27388e-05, Linf 0.00572276, total time[s] 0.117807 +Converged at iteration 25, L1 7.51098e-05, Linf 0.00376196, total time[s] 0.124549 +Converged at iteration 25, L1 7.41382e-05, Linf 0.00567155, total time[s] 0.075144 +Converged at iteration 37, L1 3.3053e-05, Linf 0.0171921, total time[s] 0.232019 +Converged at iteration 35, L1 5.89156e-05, Linf 0.0217147, total time[s] 0.144142 +Converged at iteration 25, L1 7.34394e-05, Linf 0.00935001, total time[s] 0.141804 +Converged at iteration 27, L1 7.35631e-05, Linf 0.00772011, total time[s] 0.140862 +Converged at iteration 24, L1 7.63831e-05, Linf 0.00681395, total time[s] 0.174309 +Converged at iteration 21, L1 5.27301e-05, Linf 0.0060023, total time[s] 0.097904 +Converged at iteration 21, L1 4.52957e-05, Linf 0.00996352, total time[s] 0.069068 +Converged at iteration 22, L1 6.0941e-05, Linf 0.00678045, total time[s] 0.131559 +Converged at iteration 24, L1 8.13124e-05, Linf 0.00543491, total time[s] 0.106253 +Converged at iteration 25, L1 7.02532e-05, Linf 0.00375166, total time[s] 0.107334 +Converged at iteration 22, L1 6.2657e-05, Linf 0.0023029, total time[s] 0.072686 +Converged at iteration 19, L1 9.54186e-05, Linf 0.00512169, total time[s] 0.100688 +Converged at iteration 31, L1 7.90724e-05, Linf 0.00819443, total time[s] 0.128229 +Converged at iteration 20, L1 5.99783e-05, Linf 0.00372542, total time[s] 0.065645 +Converged at iteration 22, L1 8.21834e-05, Linf 0.00501872, total time[s] 0.117318 +Converged at iteration 27, L1 7.43519e-05, Linf 0.00271099, total time[s] 0.105609 +Converged at iteration 27, L1 7.48939e-05, Linf 0.00249936, total time[s] 0.094215 +Converged at iteration 24, L1 6.28277e-05, Linf 0.00210714, total time[s] 0.076548 +Converged at iteration 23, L1 8.03905e-05, Linf 0.00282278, total time[s] 0.066062 +Converged at iteration 23, L1 7.69694e-05, Linf 0.00420893, total time[s] 0.095468 +Converged at iteration 26, L1 9.77271e-05, Linf 0.00551756, total time[s] 0.141081 +Converged at iteration 32, L1 7.72169e-05, Linf 0.00851457, total time[s] 0.157662 +Converged at iteration 30, L1 7.78762e-05, Linf 0.00270717, total time[s] 0.157206 +Converged at iteration 31, L1 4.77345e-05, Linf 0.00924976, total time[s] 0.097216 +Converged at iteration 31, L1 7.38363e-05, Linf 0.0052266, total time[s] 0.098866 +Converged at iteration 32, L1 7.79444e-05, Linf 0.00466933, total time[s] 0.140817 +Converged at iteration 32, L1 5.02974e-05, Linf 0.0220051, total time[s] 0.118059 +Converged at iteration 27, L1 8.2056e-05, Linf 0.00787456, total time[s] 0.101632 +Converged at iteration 25, L1 7.38805e-05, Linf 0.00360516, total time[s] 0.12182 +Converged at iteration 26, L1 5.42166e-05, Linf 0.0052496, total time[s] 0.095082 +Converged at iteration 37, L1 3.8156e-05, Linf 0.0201449, total time[s] 0.245808 +Converged at iteration 35, L1 6.98312e-05, Linf 0.0253778, total time[s] 0.156349 +Converged at iteration 25, L1 7.88038e-05, Linf 0.00958675, total time[s] 0.072608 +Converged at iteration 27, L1 5.18386e-05, Linf 0.00623627, total time[s] 0.10239 +Converged at iteration 23, L1 8.48597e-05, Linf 0.00508465, total time[s] 0.101971 +Converged at iteration 21, L1 7.29721e-05, Linf 0.00583506, total time[s] 0.073973 +Converged at iteration 21, L1 5.8166e-05, Linf 0.0111937, total time[s] 0.089134 +Converged at iteration 23, L1 4.58403e-05, Linf 0.00661017, total time[s] 0.066662 +Converged at iteration 25, L1 6.46626e-05, Linf 0.00664867, total time[s] 0.146287 +Converged at iteration 25, L1 9.27821e-05, Linf 0.00579686, total time[s] 0.116115 +Converged at iteration 22, L1 7.72215e-05, Linf 0.0032686, total time[s] 0.067088 +Converged at iteration 19, L1 9.86682e-05, Linf 0.00525095, total time[s] 0.126304 +Converged at iteration 49, L1 9.99464e-05, Linf 0.00228015, total time[s] 0.216658 +Converged at iteration 20, L1 7.5375e-05, Linf 0.00504637, total time[s] 0.071425 +Converged at iteration 23, L1 5.72401e-05, Linf 0.00413247, total time[s] 0.138727 +Converged at iteration 28, L1 6.43632e-05, Linf 0.00217836, total time[s] 0.199853 +Converged at iteration 27, L1 9.70446e-05, Linf 0.00320943, total time[s] 0.200278 +Converged at iteration 24, L1 8.1269e-05, Linf 0.00338412, total time[s] 0.186726 +Converged at iteration 23, L1 9.34647e-05, Linf 0.0033256, total time[s] 0.134624 +Converged at iteration 23, L1 7.1597e-05, Linf 0.00511944, total time[s] 0.083234 +Converged at iteration 27, L1 8.39263e-05, Linf 0.0057321, total time[s] 0.111492 +Converged at iteration 33, L1 4.81069e-05, Linf 0.00498586, total time[s] 0.156317 +Converged at iteration 30, L1 8.16795e-05, Linf 0.0024321, total time[s] 0.138154 +Converged at iteration 31, L1 5.51539e-05, Linf 0.00862667, total time[s] 0.188797 +Converged at iteration 31, L1 9.10263e-05, Linf 0.00677941, total time[s] 0.185362 +Converged at iteration 33, L1 4.44282e-05, Linf 0.00362317, total time[s] 0.190834 +Converged at iteration 32, L1 6.70315e-05, Linf 0.0261785, total time[s] 0.121761 +Converged at iteration 27, L1 7.28059e-05, Linf 0.00750135, total time[s] 0.114514 +Converged at iteration 25, L1 6.95794e-05, Linf 0.00611641, total time[s] 0.091164 +Converged at iteration 26, L1 7.16459e-05, Linf 0.00739838, total time[s] 0.093823 +Converged at iteration 37, L1 8.75192e-05, Linf 0.0292901, total time[s] 0.100524 +Converged at iteration 36, L1 2.94635e-05, Linf 0.012481, total time[s] 0.097696 +Converged at iteration 25, L1 9.23638e-05, Linf 0.0102532, total time[s] 0.068381 +Converged at iteration 26, L1 8.71548e-05, Linf 0.0073477, total time[s] 0.071738 +Converged at iteration 22, L1 7.44072e-05, Linf 0.00298801, total time[s] 0.063283 +Converged at iteration 21, L1 6.12018e-05, Linf 0.00607247, total time[s] 0.079595 +Converged at iteration 21, L1 5.95264e-05, Linf 0.0101796, total time[s] 0.069004 +Converged at iteration 23, L1 7.25652e-05, Linf 0.0104656, total time[s] 0.070958 +Converged at iteration 25, L1 8.86847e-05, Linf 0.0107526, total time[s] 0.103443 +Converged at iteration 26, L1 5.85947e-05, Linf 0.00392284, total time[s] 0.099002 +Converged at iteration 22, L1 8.80876e-05, Linf 0.00420894, total time[s] 0.069415 +Converged at iteration 19, L1 9.59163e-05, Linf 0.00502656, total time[s] 0.079512 +Converged at iteration 31, L1 9.97333e-05, Linf 0.00961633, total time[s] 0.078109 +Converged at iteration 20, L1 9.95238e-05, Linf 0.00589148, total time[s] 0.06542 +Converged at iteration 23, L1 7.40357e-05, Linf 0.00502244, total time[s] 0.093877 +Converged at iteration 28, L1 8.02207e-05, Linf 0.00304609, total time[s] 0.096878 +Converged at iteration 28, L1 6.01394e-05, Linf 0.00232921, total time[s] 0.082875 +Converged at iteration 25, L1 5.43349e-05, Linf 0.00336205, total time[s] 0.081074 +Converged at iteration 24, L1 6.46357e-05, Linf 0.00250252, total time[s] 0.104364 +Converged at iteration 24, L1 6.814e-05, Linf 0.00509681, total time[s] 0.068084 +Converged at iteration 28, L1 6.73324e-05, Linf 0.00488491, total time[s] 0.102995 +Converged at iteration 33, L1 5.71576e-05, Linf 0.00561086, total time[s] 0.135238 +Converged at iteration 30, L1 7.90295e-05, Linf 0.0021887, total time[s] 0.106335 +Converged at iteration 31, L1 4.55629e-05, Linf 0.00808743, total time[s] 0.081116 +Converged at iteration 31, L1 9.99936e-05, Linf 0.00775758, total time[s] 0.09121 +Converged at iteration 33, L1 5.21597e-05, Linf 0.00442507, total time[s] 0.117293 +Converged at iteration 33, L1 3.18215e-05, Linf 0.0195796, total time[s] 0.110377 +Converged at iteration 27, L1 5.8371e-05, Linf 0.00573019, total time[s] 0.07572 +Converged at iteration 25, L1 8.53359e-05, Linf 0.00865315, total time[s] 0.130186 +Converged at iteration 26, L1 9.38445e-05, Linf 0.0095129, total time[s] 0.095884 +Converged at iteration 38, L1 4.53679e-05, Linf 0.0209106, total time[s] 0.149601 +Converged at iteration 36, L1 5.53461e-05, Linf 0.0188065, total time[s] 0.117185 +Converged at iteration 26, L1 4.24186e-05, Linf 0.00430008, total time[s] 0.084878 +Converged at iteration 26, L1 8.6809e-05, Linf 0.00506659, total time[s] 0.10073 +Converged at iteration 22, L1 8.77752e-05, Linf 0.00366815, total time[s] 0.073543 +Converged at iteration 21, L1 6.06194e-05, Linf 0.00621118, total time[s] 0.061713 +Converged at iteration 21, L1 6.45992e-05, Linf 0.00978463, total time[s] 0.071121 +Converged at iteration 24, L1 4.05044e-05, Linf 0.00766546, total time[s] 0.09469 +Converged at iteration 26, L1 4.8471e-05, Linf 0.00560463, total time[s] 0.168302 +Converged at iteration 25, L1 8.20018e-05, Linf 0.00687103, total time[s] 0.114312 +Converged at iteration 22, L1 8.51183e-05, Linf 0.00441248, total time[s] 0.070113 +Converged at iteration 19, L1 8.79174e-05, Linf 0.00347894, total time[s] 0.060816 +Converged at iteration 31, L1 9.56131e-05, Linf 0.00943974, total time[s] 0.114637 +Converged at iteration 21, L1 6.81014e-05, Linf 0.00495476, total time[s] 0.063008 +Converged at iteration 23, L1 9.23641e-05, Linf 0.0128226, total time[s] 0.076151 +Converged at iteration 27, L1 7.85479e-05, Linf 0.00258238, total time[s] 0.120479 +Converged at iteration 28, L1 6.05168e-05, Linf 0.00238044, total time[s] 0.080699 +Converged at iteration 25, L1 6.51408e-05, Linf 0.00559788, total time[s] 0.074062 +Converged at iteration 24, L1 7.5031e-05, Linf 0.00303213, total time[s] 0.096851 +Converged at iteration 24, L1 8.45107e-05, Linf 0.00616232, total time[s] 0.10557 +Converged at iteration 29, L1 6.51226e-05, Linf 0.00551986, total time[s] 0.108861 +Converged at iteration 33, L1 6.59431e-05, Linf 0.00835035, total time[s] 0.166129 +Converged at iteration 30, L1 7.88143e-05, Linf 0.00181499, total time[s] 0.099482 +Converged at iteration 30, L1 8.87164e-05, Linf 0.0141921, total time[s] 0.099517 +Converged at iteration 31, L1 7.77373e-05, Linf 0.00537516, total time[s] 0.102964 +Converged at iteration 33, L1 6.01703e-05, Linf 0.00504559, total time[s] 0.132166 +Converged at iteration 33, L1 7.82801e-05, Linf 0.0267416, total time[s] 0.103217 +Converged at iteration 26, L1 6.94079e-05, Linf 0.0041834, total time[s] 0.148551 +Converged at iteration 25, L1 8.36194e-05, Linf 0.00769836, total time[s] 0.130785 +Converged at iteration 26, L1 8.8591e-05, Linf 0.00950772, total time[s] 0.146394 +Converged at iteration 40, L1 6.84967e-05, Linf 0.00367517, total time[s] 0.112853 +Converged at iteration 35, L1 7.60918e-05, Linf 0.00339717, total time[s] 0.095786 +Converged at iteration 30, L1 9.65185e-05, Linf 0.00430085, total time[s] 0.096848 +Converged at iteration 31, L1 6.19921e-05, Linf 0.00502563, total time[s] 0.10025 +Converged at iteration 27, L1 6.26172e-05, Linf 0.00499702, total time[s] 0.075036 +Converged at iteration 22, L1 8.58667e-05, Linf 0.00448844, total time[s] 0.059962 +Converged at iteration 20, L1 9.60641e-05, Linf 0.00395687, total time[s] 0.058957 +Converged at iteration 24, L1 8.84828e-05, Linf 0.00485406, total time[s] 0.103948 +Converged at iteration 28, L1 7.38386e-05, Linf 0.00444863, total time[s] 0.081193 +Converged at iteration 26, L1 8.11737e-05, Linf 0.00546791, total time[s] 0.09876 +Converged at iteration 22, L1 7.44642e-05, Linf 0.00508719, total time[s] 0.079543 +Converged at iteration 19, L1 6.63191e-05, Linf 0.00393106, total time[s] 0.054033 +Converged at iteration 30, L1 7.99453e-05, Linf 0.00329636, total time[s] 0.117578 +Converged at iteration 20, L1 8.44973e-05, Linf 0.00455033, total time[s] 0.066203 +Converged at iteration 24, L1 7.123e-05, Linf 0.00463293, total time[s] 0.072405 +Converged at iteration 31, L1 8.92834e-05, Linf 0.00569105, total time[s] 0.099688 +Converged at iteration 27, L1 9.91454e-05, Linf 0.00569815, total time[s] 0.074267 +Converged at iteration 24, L1 8.83535e-05, Linf 0.00465017, total time[s] 0.108787 +Converged at iteration 23, L1 9.21875e-05, Linf 0.00410192, total time[s] 0.112541 +Converged at iteration 26, L1 7.22174e-05, Linf 0.00446796, total time[s] 0.074506 +Converged at iteration 29, L1 7.86399e-05, Linf 0.00479089, total time[s] 0.088119 +Converged at iteration 34, L1 7.09445e-05, Linf 0.00422696, total time[s] 0.093794 +Converged at iteration 30, L1 9.4116e-05, Linf 0.00442606, total time[s] 0.078571 +Converged at iteration 28, L1 9.49883e-05, Linf 0.00310979, total time[s] 0.085915 +Converged at iteration 32, L1 9.40583e-05, Linf 0.00373961, total time[s] 0.092661 +Converged at iteration 37, L1 7.38231e-05, Linf 0.00330022, total time[s] 0.105811 +Converged at iteration 33, L1 8.44924e-05, Linf 0.00469118, total time[s] 0.089285 +Converged at iteration 28, L1 9.66554e-05, Linf 0.00430163, total time[s] 0.079108 +Converged at iteration 24, L1 8.82867e-05, Linf 0.00325072, total time[s] 0.082136 +Converged at iteration 26, L1 8.98086e-05, Linf 0.00383975, total time[s] 0.0869 +Converged at iteration 39, L1 6.01562e-05, Linf 0.00635201, total time[s] 0.105723 +Converged at iteration 35, L1 9.52787e-05, Linf 0.00580468, total time[s] 0.095037 +Converged at iteration 24, L1 8.85793e-05, Linf 0.00495396, total time[s] 0.070556 +Converged at iteration 30, L1 9.73634e-05, Linf 0.00610535, total time[s] 0.113002 +Converged at iteration 25, L1 6.67117e-05, Linf 0.00545633, total time[s] 0.089392 +Converged at iteration 20, L1 9.55688e-05, Linf 0.0040193, total time[s] 0.069054 +Converged at iteration 19, L1 5.59869e-05, Linf 0.00422929, total time[s] 0.060937 +Converged at iteration 20, L1 9.21577e-05, Linf 0.00664842, total time[s] 0.056796 +Converged at iteration 24, L1 6.97545e-05, Linf 0.00470942, total time[s] 0.105844 +Converged at iteration 24, L1 7.10728e-05, Linf 0.00489838, total time[s] 0.070551 +Converged at iteration 20, L1 5.41171e-05, Linf 0.00505222, total time[s] 0.059291 +Converged at iteration 16, L1 9.47542e-05, Linf 0.00487966, total time[s] 0.065624 +Converged at iteration 31, L1 8.22983e-05, Linf 0.00281052, total time[s] 0.083818 +Converged at iteration 19, L1 9.89812e-05, Linf 0.00712677, total time[s] 0.053477 +Converged at iteration 23, L1 7.8548e-05, Linf 0.00696046, total time[s] 0.07723 +Converged at iteration 26, L1 7.08994e-05, Linf 0.00537784, total time[s] 0.076809 +Converged at iteration 23, L1 5.14507e-05, Linf 0.00480162, total time[s] 0.070589 +Converged at iteration 20, L1 7.00657e-05, Linf 0.00498432, total time[s] 0.057625 +Converged at iteration 22, L1 9.98217e-05, Linf 0.00559292, total time[s] 0.062788 +Converged at iteration 25, L1 9.09176e-05, Linf 0.00541855, total time[s] 0.07397 +Converged at iteration 28, L1 7.95918e-05, Linf 0.00403046, total time[s] 0.078894 +Converged at iteration 29, L1 6.06631e-05, Linf 0.00547984, total time[s] 0.083466 +Converged at iteration 27, L1 6.37562e-05, Linf 0.00351357, total time[s] 0.087743 +Converged at iteration 28, L1 9.96031e-05, Linf 0.00446809, total time[s] 0.076442 +Converged at iteration 29, L1 8.54605e-05, Linf 0.00296308, total time[s] 0.074652 +Converged at iteration 28, L1 8.01145e-05, Linf 0.0027902, total time[s] 0.074227 +Converged at iteration 32, L1 7.91426e-05, Linf 0.00656414, total time[s] 0.084291 +Converged at iteration 26, L1 8.4809e-05, Linf 0.00293927, total time[s] 0.070557 +Converged at iteration 25, L1 6.99744e-05, Linf 0.0021963, total time[s] 0.069333 +Converged at iteration 23, L1 7.76058e-05, Linf 0.00326073, total time[s] 0.064762 +Converged at iteration 38, L1 7.31807e-05, Linf 0.0101654, total time[s] 0.140922 +Converged at iteration 35, L1 6.61495e-05, Linf 0.00873934, total time[s] 0.096607 +Converged at iteration 25, L1 4.21049e-05, Linf 0.00526126, total time[s] 0.067277 +Converged at iteration 30, L1 6.75964e-05, Linf 0.00576709, total time[s] 0.081131 +Converged at iteration 23, L1 9.21431e-05, Linf 0.00594433, total time[s] 0.06399 +Converged at iteration 22, L1 5.83664e-05, Linf 0.00489931, total time[s] 0.062639 +Converged at iteration 19, L1 7.22639e-05, Linf 0.00690557, total time[s] 0.053035 +Converged at iteration 21, L1 4.06382e-05, Linf 0.00429591, total time[s] 0.085451 +Converged at iteration 23, L1 6.2295e-05, Linf 0.00360952, total time[s] 0.075401 +Converged at iteration 22, L1 9.70435e-05, Linf 0.00630355, total time[s] 0.087541 +Converged at iteration 19, L1 8.30622e-05, Linf 0.00568657, total time[s] 0.053347 +Converged at iteration 17, L1 7.36641e-05, Linf 0.00363624, total time[s] 0.047073 +Converged at iteration 31, L1 5.91647e-05, Linf 0.00467767, total time[s] 0.092669 +Converged at iteration 19, L1 9.53345e-05, Linf 0.00619365, total time[s] 0.059975 +Converged at iteration 22, L1 9.8574e-05, Linf 0.00753411, total time[s] 0.064134 +Converged at iteration 25, L1 9.9947e-05, Linf 0.00575357, total time[s] 0.07578 +Converged at iteration 24, L1 6.84314e-05, Linf 0.00244981, total time[s] 0.066022 +Converged at iteration 21, L1 7.52236e-05, Linf 0.00228038, total time[s] 0.07548 +Converged at iteration 23, L1 6.82636e-05, Linf 0.00285954, total time[s] 0.06183 +Converged at iteration 25, L1 7.7596e-05, Linf 0.00319584, total time[s] 0.099923 +Converged at iteration 27, L1 7.16647e-05, Linf 0.00330891, total time[s] 0.080706 +Converged at iteration 29, L1 6.58938e-05, Linf 0.00576895, total time[s] 0.090988 +Converged at iteration 28, L1 5.89595e-05, Linf 0.00213677, total time[s] 0.08213 +Converged at iteration 29, L1 8.66303e-05, Linf 0.00488781, total time[s] 0.09193 +Converged at iteration 29, L1 8.52621e-05, Linf 0.00237354, total time[s] 0.075415 +Converged at iteration 28, L1 7.99744e-05, Linf 0.0019585, total time[s] 0.076349 +Converged at iteration 32, L1 5.61442e-05, Linf 0.0080066, total time[s] 0.097019 +Converged at iteration 26, L1 7.82713e-05, Linf 0.00418758, total time[s] 0.080972 +Converged at iteration 25, L1 9.09411e-05, Linf 0.00352971, total time[s] 0.105476 +Converged at iteration 23, L1 8.78825e-05, Linf 0.00344458, total time[s] 0.070985 +Converged at iteration 37, L1 8.93967e-05, Linf 0.016263, total time[s] 0.107918 +Converged at iteration 35, L1 3.96517e-05, Linf 0.0103673, total time[s] 0.090002 +Converged at iteration 25, L1 6.6296e-05, Linf 0.00912848, total time[s] 0.072499 +Converged at iteration 29, L1 6.36191e-05, Linf 0.00667625, total time[s] 0.103431 +Converged at iteration 23, L1 8.65211e-05, Linf 0.00609216, total time[s] 0.060429 +Converged at iteration 22, L1 5.21031e-05, Linf 0.00547493, total time[s] 0.058605 +Converged at iteration 20, L1 3.61274e-05, Linf 0.00703876, total time[s] 0.05304 +Converged at iteration 21, L1 7.66246e-05, Linf 0.00581481, total time[s] 0.060282 +Converged at iteration 23, L1 6.36574e-05, Linf 0.0032633, total time[s] 0.060322 +Converged at iteration 22, L1 5.90569e-05, Linf 0.00306671, total time[s] 0.05833 +Converged at iteration 20, L1 6.79559e-05, Linf 0.00256171, total time[s] 0.056208 +Converged at iteration 18, L1 8.0826e-05, Linf 0.00302059, total time[s] 0.071304 +Converged at iteration 31, L1 6.17249e-05, Linf 0.00734697, total time[s] 0.094851 +Converged at iteration 19, L1 8.68713e-05, Linf 0.00538036, total time[s] 0.054494 +Converged at iteration 22, L1 8.05056e-05, Linf 0.00503789, total time[s] 0.064357 +Converged at iteration 26, L1 5.66406e-05, Linf 0.00468461, total time[s] 0.080381 +Converged at iteration 25, L1 8.00766e-05, Linf 0.00308483, total time[s] 0.098091 +Converged at iteration 22, L1 8.89326e-05, Linf 0.00320775, total time[s] 0.070374 +Converged at iteration 23, L1 7.85283e-05, Linf 0.00268594, total time[s] 0.09151 +Converged at iteration 24, L1 9.8402e-05, Linf 0.00371787, total time[s] 0.07126 +Converged at iteration 25, L1 8.92269e-05, Linf 0.00325775, total time[s] 0.073462 +Converged at iteration 30, L1 9.96071e-05, Linf 0.00533685, total time[s] 0.099229 +Converged at iteration 29, L1 6.30951e-05, Linf 0.00267693, total time[s] 0.087999 +Converged at iteration 30, L1 5.91128e-05, Linf 0.00549493, total time[s] 0.086634 +Converged at iteration 30, L1 6.02117e-05, Linf 0.00175875, total time[s] 0.080661 +Converged at iteration 31, L1 3.8265e-05, Linf 0.00234093, total time[s] 0.115571 +Converged at iteration 32, L1 4.77043e-05, Linf 0.0106199, total time[s] 0.096297 +Converged at iteration 24, L1 8.81265e-05, Linf 0.00564989, total time[s] 0.069704 +Converged at iteration 25, L1 9.91057e-05, Linf 0.00478096, total time[s] 0.100223 +Converged at iteration 24, L1 6.78081e-05, Linf 0.00259502, total time[s] 0.066517 +Converged at iteration 37, L1 5.39266e-05, Linf 0.0173739, total time[s] 0.10835 +Converged at iteration 35, L1 3.65188e-05, Linf 0.0126984, total time[s] 0.095321 +Converged at iteration 25, L1 6.96613e-05, Linf 0.0105818, total time[s] 0.092109 +Converged at iteration 28, L1 7.58023e-05, Linf 0.00782473, total time[s] 0.093045 +Converged at iteration 24, L1 6.48325e-05, Linf 0.00588684, total time[s] 0.062683 +Converged at iteration 21, L1 8.16417e-05, Linf 0.00908607, total time[s] 0.055633 +Converged at iteration 20, L1 6.3949e-05, Linf 0.0110502, total time[s] 0.053375 +Converged at iteration 21, L1 9.7393e-05, Linf 0.00746471, total time[s] 0.054961 +Converged at iteration 23, L1 7.87635e-05, Linf 0.0036582, total time[s] 0.060778 +Converged at iteration 23, L1 8.43945e-05, Linf 0.00192861, total time[s] 0.060408 +Converged at iteration 21, L1 6.01214e-05, Linf 0.00641217, total time[s] 0.070291 +Converged at iteration 19, L1 5.94737e-05, Linf 0.00294307, total time[s] 0.073343 +Converged at iteration 31, L1 6.52276e-05, Linf 0.00964227, total time[s] 0.103764 +Converged at iteration 19, L1 8.38228e-05, Linf 0.00501655, total time[s] 0.072347 +Converged at iteration 22, L1 7.48899e-05, Linf 0.0047765, total time[s] 0.063447 +Converged at iteration 26, L1 5.89075e-05, Linf 0.011424, total time[s] 0.121735 +Converged at iteration 26, L1 7.22597e-05, Linf 0.00270825, total time[s] 0.10398 +Converged at iteration 23, L1 7.05492e-05, Linf 0.00263972, total time[s] 0.09845 +Converged at iteration 23, L1 8.86013e-05, Linf 0.00259563, total time[s] 0.086446 +Converged at iteration 24, L1 7.46113e-05, Linf 0.00351545, total time[s] 0.088121 +Converged at iteration 23, L1 7.03023e-05, Linf 0.00201839, total time[s] 0.095917 +Converged at iteration 31, L1 6.83745e-05, Linf 0.00544168, total time[s] 0.125267 +Converged at iteration 29, L1 8.28962e-05, Linf 0.00311355, total time[s] 0.096386 +Converged at iteration 30, L1 7.13215e-05, Linf 0.00660294, total time[s] 0.105735 +Converged at iteration 30, L1 7.61134e-05, Linf 0.00246836, total time[s] 0.102549 +Converged at iteration 31, L1 6.62752e-05, Linf 0.0032531, total time[s] 0.113582 +Converged at iteration 32, L1 4.36514e-05, Linf 0.0141129, total time[s] 0.085902 +Converged at iteration 25, L1 8.51586e-05, Linf 0.00284876, total time[s] 0.067484 +Converged at iteration 25, L1 9.39026e-05, Linf 0.00552064, total time[s] 0.083274 +Converged at iteration 24, L1 9.86191e-05, Linf 0.00478836, total time[s] 0.068649 +Converged at iteration 37, L1 3.6801e-05, Linf 0.0168663, total time[s] 0.092646 +Converged at iteration 35, L1 4.77115e-05, Linf 0.013379, total time[s] 0.151316 +Converged at iteration 25, L1 6.68575e-05, Linf 0.01016, total time[s] 0.077939 +Converged at iteration 27, L1 9.44868e-05, Linf 0.00904856, total time[s] 0.107542 +Converged at iteration 24, L1 8.06168e-05, Linf 0.0071882, total time[s] 0.079307 +Converged at iteration 21, L1 5.86539e-05, Linf 0.00819474, total time[s] 0.085565 +Converged at iteration 21, L1 2.36798e-05, Linf 0.0061889, total time[s] 0.071632 +Converged at iteration 22, L1 3.95075e-05, Linf 0.00291026, total time[s] 0.083476 +Converged at iteration 24, L1 5.46255e-05, Linf 0.00266177, total time[s] 0.098919 +Converged at iteration 24, L1 8.35476e-05, Linf 0.0027547, total time[s] 0.109866 +Converged at iteration 21, L1 8.87821e-05, Linf 0.0026779, total time[s] 0.117691 +Converged at iteration 19, L1 7.76725e-05, Linf 0.00419698, total time[s] 0.083614 +Converged at iteration 31, L1 6.7498e-05, Linf 0.0119348, total time[s] 0.113895 +Converged at iteration 19, L1 9.71696e-05, Linf 0.00500893, total time[s] 0.060624 +Converged at iteration 22, L1 7.51736e-05, Linf 0.0047488, total time[s] 0.104213 +Converged at iteration 26, L1 7.66949e-05, Linf 0.00372284, total time[s] 0.094799 +Converged at iteration 27, L1 5.69197e-05, Linf 0.00192266, total time[s] 0.120153 +Converged at iteration 23, L1 9.94601e-05, Linf 0.00318065, total time[s] 0.075224 +Converged at iteration 23, L1 9.09828e-05, Linf 0.00259644, total time[s] 0.063198 +Converged at iteration 24, L1 5.54534e-05, Linf 0.00287404, total time[s] 0.076832 +Converged at iteration 24, L1 6.65068e-05, Linf 0.00200697, total time[s] 0.075857 +Converged at iteration 31, L1 9.09114e-05, Linf 0.00641092, total time[s] 0.087048 +Converged at iteration 30, L1 5.82403e-05, Linf 0.00226547, total time[s] 0.080947 +Converged at iteration 30, L1 9.93355e-05, Linf 0.00853478, total time[s] 0.179473 +Converged at iteration 31, L1 5.46233e-05, Linf 0.00261558, total time[s] 0.099376 +Converged at iteration 32, L1 3.77641e-05, Linf 0.0024514, total time[s] 0.090919 +Converged at iteration 32, L1 4.55504e-05, Linf 0.0175344, total time[s] 0.104533 +Converged at iteration 27, L1 6.19396e-05, Linf 0.00582894, total time[s] 0.071466 +Converged at iteration 25, L1 6.94113e-05, Linf 0.00412993, total time[s] 0.089851 +Converged at iteration 25, L1 7.58076e-05, Linf 0.0046015, total time[s] 0.068316 +Converged at iteration 37, L1 3.23447e-05, Linf 0.0169652, total time[s] 0.107359 +Converged at iteration 35, L1 5.62883e-05, Linf 0.0215595, total time[s] 0.092772 +Converged at iteration 25, L1 5.93668e-05, Linf 0.00905912, total time[s] 0.066816 +Converged at iteration 27, L1 6.7432e-05, Linf 0.00793647, total time[s] 0.093009 +Converged at iteration 24, L1 7.90942e-05, Linf 0.00698305, total time[s] 0.079631 +Converged at iteration 21, L1 4.92273e-05, Linf 0.00696132, total time[s] 0.060249 +Converged at iteration 21, L1 3.44012e-05, Linf 0.00873411, total time[s] 0.064338 +Converged at iteration 22, L1 6.57896e-05, Linf 0.00639682, total time[s] 0.060265 +Converged at iteration 24, L1 9.49185e-05, Linf 0.00599872, total time[s] 0.066086 +Converged at iteration 25, L1 7.35967e-05, Linf 0.00320721, total time[s] 0.077723 +Converged at iteration 22, L1 6.5286e-05, Linf 0.00268957, total time[s] 0.060741 +Converged at iteration 19, L1 9.08686e-05, Linf 0.00507853, total time[s] 0.05973 +Converged at iteration 31, L1 7.90758e-05, Linf 0.00777897, total time[s] 0.101266 +Converged at iteration 20, L1 6.0628e-05, Linf 0.00373079, total time[s] 0.062613 +Converged at iteration 22, L1 8.5573e-05, Linf 0.00504882, total time[s] 0.090661 +Converged at iteration 27, L1 7.66579e-05, Linf 0.00269164, total time[s] 0.082966 +Converged at iteration 27, L1 7.84308e-05, Linf 0.00253372, total time[s] 0.086776 +Converged at iteration 24, L1 6.348e-05, Linf 0.00203508, total time[s] 0.068135 +Converged at iteration 23, L1 8.64272e-05, Linf 0.00283543, total time[s] 0.106221 +Converged at iteration 23, L1 7.55236e-05, Linf 0.00411992, total time[s] 0.064283 +Converged at iteration 26, L1 6.20566e-05, Linf 0.00363382, total time[s] 0.084585 +Converged at iteration 32, L1 6.34387e-05, Linf 0.0069693, total time[s] 0.093066 +Converged at iteration 30, L1 6.82016e-05, Linf 0.00222664, total time[s] 0.087523 +Converged at iteration 31, L1 4.79948e-05, Linf 0.0044913, total time[s] 0.08249 +Converged at iteration 31, L1 9.49664e-05, Linf 0.00489754, total time[s] 0.081437 +Converged at iteration 32, L1 6.87319e-05, Linf 0.00400785, total time[s] 0.083606 +Converged at iteration 32, L1 5.07198e-05, Linf 0.0212923, total time[s] 0.086106 +Converged at iteration 27, L1 9.01539e-05, Linf 0.0080223, total time[s] 0.089483 +Converged at iteration 25, L1 6.29026e-05, Linf 0.00284523, total time[s] 0.070082 +Converged at iteration 26, L1 5.85031e-05, Linf 0.00389882, total time[s] 0.072389 +Converged at iteration 37, L1 3.61913e-05, Linf 0.0198037, total time[s] 0.102762 +Converged at iteration 35, L1 6.67178e-05, Linf 0.0251212, total time[s] 0.094774 +Converged at iteration 25, L1 6.2659e-05, Linf 0.00882374, total time[s] 0.104643 +Converged at iteration 27, L1 5.24721e-05, Linf 0.00621499, total time[s] 0.074132 +Converged at iteration 23, L1 8.92511e-05, Linf 0.00521279, total time[s] 0.068714 +Converged at iteration 21, L1 5.81815e-05, Linf 0.00655374, total time[s] 0.076601 +Converged at iteration 21, L1 4.36357e-05, Linf 0.00980821, total time[s] 0.071911 +Converged at iteration 23, L1 4.62146e-05, Linf 0.00579959, total time[s] 0.087133 +Converged at iteration 25, L1 7.3818e-05, Linf 0.00625722, total time[s] 0.073728 +Converged at iteration 25, L1 9.37264e-05, Linf 0.00462796, total time[s] 0.078044 +Converged at iteration 22, L1 8.10757e-05, Linf 0.00373335, total time[s] 0.082336 +Converged at iteration 19, L1 9.45379e-05, Linf 0.0051848, total time[s] 0.057296 +Converged at iteration 31, L1 9.5727e-05, Linf 0.00969834, total time[s] 0.080684 +Converged at iteration 20, L1 7.57177e-05, Linf 0.00500001, total time[s] 0.053433 +Converged at iteration 23, L1 5.9219e-05, Linf 0.00418272, total time[s] 0.061946 +Converged at iteration 28, L1 6.67897e-05, Linf 0.00222036, total time[s] 0.091501 +Converged at iteration 28, L1 5.37296e-05, Linf 0.00216231, total time[s] 0.093335 +Converged at iteration 24, L1 8.13775e-05, Linf 0.00321664, total time[s] 0.08919 +Converged at iteration 23, L1 8.8723e-05, Linf 0.00331465, total time[s] 0.068795 +Converged at iteration 23, L1 6.91782e-05, Linf 0.0050646, total time[s] 0.077108 +Converged at iteration 26, L1 9.24057e-05, Linf 0.00494178, total time[s] 0.08129 +Converged at iteration 32, L1 8.69462e-05, Linf 0.00780146, total time[s] 0.104236 +Converged at iteration 30, L1 6.91188e-05, Linf 0.00187299, total time[s] 0.082346 +Converged at iteration 31, L1 5.27508e-05, Linf 0.00686382, total time[s] 0.09513 +Converged at iteration 31, L1 9.53479e-05, Linf 0.00542698, total time[s] 0.091999 +Converged at iteration 32, L1 9.20773e-05, Linf 0.00472068, total time[s] 0.086875 +Converged at iteration 32, L1 6.8877e-05, Linf 0.0264066, total time[s] 0.093476 +Converged at iteration 27, L1 7.33585e-05, Linf 0.00766725, total time[s] 0.073028 +Converged at iteration 25, L1 6.77943e-05, Linf 0.00422791, total time[s] 0.082205 +Converged at iteration 26, L1 7.68056e-05, Linf 0.00586698, total time[s] 0.086806 +Converged at iteration 37, L1 7.98896e-05, Linf 0.0280942, total time[s] 0.100025 +Converged at iteration 35, L1 9.34134e-05, Linf 0.028282, total time[s] 0.102481 +Converged at iteration 25, L1 7.79414e-05, Linf 0.00961136, total time[s] 0.079263 +Converged at iteration 26, L1 8.04185e-05, Linf 0.00671734, total time[s] 0.076622 +Converged at iteration 22, L1 5.79979e-05, Linf 0.0022071, total time[s] 0.072833 +Converged at iteration 21, L1 6.57176e-05, Linf 0.00649037, total time[s] 0.059634 +Converged at iteration 21, L1 5.25055e-05, Linf 0.00998875, total time[s] 0.067315 +Converged at iteration 23, L1 7.99602e-05, Linf 0.0109627, total time[s] 0.073858 +Converged at iteration 26, L1 4.77115e-05, Linf 0.00526976, total time[s] 0.070814 +Converged at iteration 26, L1 5.88617e-05, Linf 0.00436434, total time[s] 0.06888 +Converged at iteration 22, L1 9.54319e-05, Linf 0.00446323, total time[s] 0.05978 +Converged at iteration 19, L1 9.24452e-05, Linf 0.00470116, total time[s] 0.052816 +Converged at iteration 32, L1 3.77348e-05, Linf 0.00464674, total time[s] 0.101683 +Converged at iteration 20, L1 9.18462e-05, Linf 0.00581754, total time[s] 0.061991 +Converged at iteration 23, L1 7.58234e-05, Linf 0.00494423, total time[s] 0.068259 +Converged at iteration 28, L1 7.58691e-05, Linf 0.00308047, total time[s] 0.075659 +Converged at iteration 28, L1 6.7878e-05, Linf 0.0026236, total time[s] 0.078008 +Converged at iteration 25, L1 5.75211e-05, Linf 0.00296457, total time[s] 0.069914 +Converged at iteration 24, L1 6.10293e-05, Linf 0.00248091, total time[s] 0.068195 +Converged at iteration 23, L1 9.74969e-05, Linf 0.00638876, total time[s] 0.089168 +Converged at iteration 27, L1 8.02539e-05, Linf 0.0048809, total time[s] 0.075582 +Converged at iteration 33, L1 4.89432e-05, Linf 0.0043374, total time[s] 0.090183 +Converged at iteration 30, L1 6.91141e-05, Linf 0.00186651, total time[s] 0.102303 +Converged at iteration 31, L1 4.93612e-05, Linf 0.00643496, total time[s] 0.086906 +Converged at iteration 32, L1 5.50531e-05, Linf 0.0042798, total time[s] 0.087327 +Converged at iteration 33, L1 5.12308e-05, Linf 0.00314969, total time[s] 0.090303 +Converged at iteration 33, L1 2.87465e-05, Linf 0.0184935, total time[s] 0.107256 +Converged at iteration 27, L1 5.86381e-05, Linf 0.006061, total time[s] 0.080619 +Converged at iteration 25, L1 8.17107e-05, Linf 0.00612724, total time[s] 0.075397 +Converged at iteration 26, L1 9.77579e-05, Linf 0.00785452, total time[s] 0.070197 +Converged at iteration 38, L1 4.93164e-05, Linf 0.0212121, total time[s] 0.11199 +Converged at iteration 36, L1 3.55591e-05, Linf 0.014963, total time[s] 0.104124 +Converged at iteration 25, L1 9.16229e-05, Linf 0.0102772, total time[s] 0.075319 +Converged at iteration 26, L1 9.67573e-05, Linf 0.00702655, total time[s] 0.071999 +Converged at iteration 22, L1 6.19125e-05, Linf 0.00266536, total time[s] 0.06183 +Converged at iteration 21, L1 6.36159e-05, Linf 0.00702353, total time[s] 0.067116 +Converged at iteration 21, L1 5.54342e-05, Linf 0.00768004, total time[s] 0.056953 +Converged at iteration 24, L1 3.60788e-05, Linf 0.00590979, total time[s] 0.07003 +Converged at iteration 26, L1 5.4342e-05, Linf 0.00609287, total time[s] 0.099732 +Converged at iteration 26, L1 5.42322e-05, Linf 0.00476579, total time[s] 0.085441 +Converged at iteration 22, L1 9.94696e-05, Linf 0.00513597, total time[s] 0.070896 +Converged at iteration 19, L1 9.41507e-05, Linf 0.00395366, total time[s] 0.067267 +Converged at iteration 32, L1 3.78933e-05, Linf 0.00434045, total time[s] 0.11059 +Converged at iteration 21, L1 6.0177e-05, Linf 0.00471536, total time[s] 0.059807 +Converged at iteration 23, L1 8.75999e-05, Linf 0.00537343, total time[s] 0.103422 +Converged at iteration 28, L1 6.76711e-05, Linf 0.00268888, total time[s] 0.089278 +Converged at iteration 28, L1 7.25354e-05, Linf 0.00740527, total time[s] 0.071188 +Converged at iteration 25, L1 7.30768e-05, Linf 0.00378977, total time[s] 0.085776 +Converged at iteration 24, L1 7.4209e-05, Linf 0.00740009, total time[s] 0.063934 +Converged at iteration 24, L1 8.91034e-05, Linf 0.00617037, total time[s] 0.074275 +Converged at iteration 28, L1 6.51639e-05, Linf 0.00449807, total time[s] 0.087823 +Converged at iteration 33, L1 5.36355e-05, Linf 0.0041134, total time[s] 0.119156 +Converged at iteration 30, L1 7.024e-05, Linf 0.00185195, total time[s] 0.080019 +Converged at iteration 31, L1 4.77615e-05, Linf 0.00536367, total time[s] 0.091375 +Converged at iteration 31, L1 9.19837e-05, Linf 0.00497924, total time[s] 0.092553 +Converged at iteration 33, L1 5.91038e-05, Linf 0.00364162, total time[s] 0.09182 +Converged at iteration 33, L1 7.81909e-05, Linf 0.0271761, total time[s] 0.086973 +Converged at iteration 26, L1 8.6684e-05, Linf 0.00567869, total time[s] 0.069298 +Converged at iteration 25, L1 9.59218e-05, Linf 0.00656905, total time[s] 0.072123 +Converged at iteration 27, L1 5.59382e-05, Linf 0.00514454, total time[s] 0.086373 +Converged at iteration 40, L1 6.74734e-05, Linf 0.00363966, total time[s] 0.125459 +Converged at iteration 35, L1 7.62479e-05, Linf 0.00339568, total time[s] 0.130277 +Converged at iteration 30, L1 9.6319e-05, Linf 0.00433009, total time[s] 0.108441 +Converged at iteration 31, L1 6.22107e-05, Linf 0.00502562, total time[s] 0.091383 +Converged at iteration 27, L1 6.26251e-05, Linf 0.00499539, total time[s] 0.087029 +Converged at iteration 22, L1 8.58678e-05, Linf 0.00448837, total time[s] 0.057684 +Converged at iteration 20, L1 9.59781e-05, Linf 0.00392247, total time[s] 0.061618 +Converged at iteration 24, L1 8.84488e-05, Linf 0.00482835, total time[s] 0.085668 +Converged at iteration 28, L1 7.39116e-05, Linf 0.0044486, total time[s] 0.086613 +Converged at iteration 26, L1 8.14038e-05, Linf 0.00546629, total time[s] 0.085424 +Converged at iteration 22, L1 7.44818e-05, Linf 0.00508676, total time[s] 0.060493 +Converged at iteration 19, L1 6.63252e-05, Linf 0.00389314, total time[s] 0.071235 +Converged at iteration 30, L1 7.98665e-05, Linf 0.00329631, total time[s] 0.093122 +Converged at iteration 20, L1 8.44305e-05, Linf 0.00455028, total time[s] 0.056013 +Converged at iteration 24, L1 7.13671e-05, Linf 0.00463258, total time[s] 0.079927 +Converged at iteration 31, L1 8.95714e-05, Linf 0.00564123, total time[s] 0.103716 +Converged at iteration 27, L1 9.91286e-05, Linf 0.00569759, total time[s] 0.135324 +Converged at iteration 24, L1 8.79026e-05, Linf 0.00465021, total time[s] 0.096278 +Converged at iteration 23, L1 9.2187e-05, Linf 0.00410193, total time[s] 0.068494 +Converged at iteration 26, L1 7.22073e-05, Linf 0.0044607, total time[s] 0.096458 +Converged at iteration 29, L1 7.81554e-05, Linf 0.00479605, total time[s] 0.105742 +Converged at iteration 34, L1 7.09351e-05, Linf 0.0042265, total time[s] 0.106713 +Converged at iteration 30, L1 9.39611e-05, Linf 0.00442579, total time[s] 0.080766 +Converged at iteration 28, L1 9.49899e-05, Linf 0.00311063, total time[s] 0.076049 +Converged at iteration 32, L1 9.39302e-05, Linf 0.00374079, total time[s] 0.083683 +Converged at iteration 37, L1 7.33841e-05, Linf 0.00327812, total time[s] 0.105916 +Converged at iteration 33, L1 8.44872e-05, Linf 0.00469108, total time[s] 0.089641 +Converged at iteration 28, L1 9.65519e-05, Linf 0.00430197, total time[s] 0.101638 +Converged at iteration 24, L1 8.82887e-05, Linf 0.0032507, total time[s] 0.066504 +Converged at iteration 26, L1 8.98076e-05, Linf 0.00383974, total time[s] 0.074456 +Converged at iteration 39, L1 7.00689e-05, Linf 0.00709997, total time[s] 0.131759 +Converged at iteration 36, L1 7.12613e-05, Linf 0.00594676, total time[s] 0.105304 +Converged at iteration 24, L1 5.98495e-05, Linf 0.00281886, total time[s] 0.072113 +Converged at iteration 31, L1 5.69745e-05, Linf 0.00509051, total time[s] 0.085731 +Converged at iteration 25, L1 7.04127e-05, Linf 0.00532496, total time[s] 0.070291 +Converged at iteration 21, L1 6.60705e-05, Linf 0.00391074, total time[s] 0.059309 +Converged at iteration 19, L1 5.73882e-05, Linf 0.00452007, total time[s] 0.074582 +Converged at iteration 20, L1 7.59289e-05, Linf 0.00631522, total time[s] 0.05769 +Converged at iteration 24, L1 5.21085e-05, Linf 0.00410828, total time[s] 0.066469 +Converged at iteration 24, L1 6.26988e-05, Linf 0.0047833, total time[s] 0.065948 +Converged at iteration 20, L1 5.30391e-05, Linf 0.00521673, total time[s] 0.057532 +Converged at iteration 16, L1 9.02937e-05, Linf 0.00340806, total time[s] 0.04504 +Converged at iteration 32, L1 6.7813e-05, Linf 0.00271472, total time[s] 0.083741 +Converged at iteration 19, L1 9.07323e-05, Linf 0.00657443, total time[s] 0.061556 +Converged at iteration 23, L1 7.13269e-05, Linf 0.00629964, total time[s] 0.079211 +Converged at iteration 26, L1 6.39669e-05, Linf 0.00535742, total time[s] 0.093122 +Converged at iteration 23, L1 5.49189e-05, Linf 0.00496352, total time[s] 0.082153 +Converged at iteration 20, L1 6.77904e-05, Linf 0.00475977, total time[s] 0.067025 +Converged at iteration 22, L1 9.64916e-05, Linf 0.0041127, total time[s] 0.058451 +Converged at iteration 25, L1 8.07519e-05, Linf 0.00365374, total time[s] 0.083354 +Converged at iteration 28, L1 7.05572e-05, Linf 0.00363947, total time[s] 0.075859 +Converged at iteration 29, L1 6.62614e-05, Linf 0.00594826, total time[s] 0.074775 +Converged at iteration 27, L1 6.47445e-05, Linf 0.00385032, total time[s] 0.075542 +Converged at iteration 29, L1 7.44841e-05, Linf 0.00402981, total time[s] 0.099516 +Converged at iteration 29, L1 8.23361e-05, Linf 0.0026991, total time[s] 0.082608 +Converged at iteration 28, L1 6.4084e-05, Linf 0.00217838, total time[s] 0.07524 +Converged at iteration 33, L1 5.69934e-05, Linf 0.00610192, total time[s] 0.102117 +Converged at iteration 26, L1 9.01565e-05, Linf 0.00337711, total time[s] 0.07004 +Converged at iteration 25, L1 7.06631e-05, Linf 0.00201339, total time[s] 0.069244 +Converged at iteration 23, L1 5.82478e-05, Linf 0.00259017, total time[s] 0.071039 +Converged at iteration 38, L1 8.58601e-05, Linf 0.0120271, total time[s] 0.103788 +Converged at iteration 36, L1 4.92792e-05, Linf 0.00859216, total time[s] 0.101129 +Converged at iteration 24, L1 8.61217e-05, Linf 0.00734381, total time[s] 0.070105 +Converged at iteration 30, L1 7.69388e-05, Linf 0.00662811, total time[s] 0.092009 +Converged at iteration 24, L1 5.55739e-05, Linf 0.00471484, total time[s] 0.06386 +Converged at iteration 22, L1 5.8625e-05, Linf 0.00490994, total time[s] 0.072426 +Converged at iteration 19, L1 6.07594e-05, Linf 0.00697605, total time[s] 0.06172 +Converged at iteration 21, L1 4.05932e-05, Linf 0.00373027, total time[s] 0.062933 +Converged at iteration 23, L1 5.98102e-05, Linf 0.00310511, total time[s] 0.087628 +Converged at iteration 22, L1 8.10075e-05, Linf 0.00578665, total time[s] 0.063354 +Converged at iteration 19, L1 8.45959e-05, Linf 0.0050384, total time[s] 0.050205 +Converged at iteration 17, L1 6.41633e-05, Linf 0.00376762, total time[s] 0.072053 +Converged at iteration 32, L1 5.57051e-05, Linf 0.00435926, total time[s] 0.09584 +Converged at iteration 19, L1 9.17375e-05, Linf 0.00523875, total time[s] 0.050829 +Converged at iteration 22, L1 9.16159e-05, Linf 0.00547075, total time[s] 0.060973 +Converged at iteration 26, L1 6.43549e-05, Linf 0.00423631, total time[s] 0.139185 +Converged at iteration 24, L1 5.60556e-05, Linf 0.00235231, total time[s] 0.107838 +Converged at iteration 21, L1 5.22511e-05, Linf 0.00220947, total time[s] 0.083568 +Converged at iteration 23, L1 7.53648e-05, Linf 0.00278896, total time[s] 0.076342 +Converged at iteration 25, L1 6.99203e-05, Linf 0.00282339, total time[s] 0.095738 +Converged at iteration 26, L1 9.24583e-05, Linf 0.00359688, total time[s] 0.110166 +Converged at iteration 30, L1 5.19155e-05, Linf 0.00445917, total time[s] 0.102864 +Converged at iteration 28, L1 7.65007e-05, Linf 0.00278707, total time[s] 0.093143 +Converged at iteration 30, L1 5.70151e-05, Linf 0.00433377, total time[s] 0.10509 +Converged at iteration 29, L1 9.0294e-05, Linf 0.00240959, total time[s] 0.078751 +Converged at iteration 29, L1 6.46193e-05, Linf 0.00202009, total time[s] 0.078528 +Converged at iteration 32, L1 8.46631e-05, Linf 0.0098699, total time[s] 0.095658 +Converged at iteration 25, L1 7.13287e-05, Linf 0.00398398, total time[s] 0.08528 +Converged at iteration 25, L1 9.95133e-05, Linf 0.00385133, total time[s] 0.067335 +Converged at iteration 23, L1 7.41311e-05, Linf 0.00279894, total time[s] 0.067067 +Converged at iteration 38, L1 4.45725e-05, Linf 0.0140045, total time[s] 0.106774 +Converged at iteration 35, L1 9.35395e-05, Linf 0.0162696, total time[s] 0.098071 +Converged at iteration 24, L1 9.5845e-05, Linf 0.0116789, total time[s] 0.09241 +Converged at iteration 29, L1 8.13615e-05, Linf 0.0076168, total time[s] 0.078268 +Converged at iteration 23, L1 8.67382e-05, Linf 0.00579191, total time[s] 0.063038 +Converged at iteration 22, L1 4.91557e-05, Linf 0.00561134, total time[s] 0.064873 +Converged at iteration 19, L1 9.61475e-05, Linf 0.0119642, total time[s] 0.053225 +Converged at iteration 21, L1 7.01161e-05, Linf 0.00580179, total time[s] 0.062875 +Converged at iteration 23, L1 6.58572e-05, Linf 0.00304361, total time[s] 0.081212 +Converged at iteration 21, L1 9.17295e-05, Linf 0.00335577, total time[s] 0.076228 +Converged at iteration 20, L1 6.41532e-05, Linf 0.00282097, total time[s] 0.05768 +Converged at iteration 18, L1 5.68024e-05, Linf 0.00174188, total time[s] 0.059858 +Converged at iteration 32, L1 4.84733e-05, Linf 0.00624984, total time[s] 0.087762 +Converged at iteration 19, L1 8.74106e-05, Linf 0.00525965, total time[s] 0.05722 +Converged at iteration 22, L1 8.01042e-05, Linf 0.00475967, total time[s] 0.070934 +Converged at iteration 26, L1 8.07467e-05, Linf 0.00649086, total time[s] 0.071315 +Converged at iteration 25, L1 6.11378e-05, Linf 0.00305135, total time[s] 0.074101 +Converged at iteration 21, L1 8.92786e-05, Linf 0.00485558, total time[s] 0.060649 +Converged at iteration 23, L1 9.12793e-05, Linf 0.00276082, total time[s] 0.092065 +Converged at iteration 24, L1 9.46579e-05, Linf 0.00354391, total time[s] 0.085762 +Converged at iteration 25, L1 6.4318e-05, Linf 0.002503, total time[s] 0.083612 +Converged at iteration 31, L1 6.72842e-05, Linf 0.00417606, total time[s] 0.09759 +Converged at iteration 29, L1 7.45132e-05, Linf 0.00331136, total time[s] 0.091216 +Converged at iteration 30, L1 7.17675e-05, Linf 0.00754131, total time[s] 0.101203 +Converged at iteration 30, L1 6.10464e-05, Linf 0.00172573, total time[s] 0.08997 +Converged at iteration 31, L1 7.44512e-05, Linf 0.00354863, total time[s] 0.109252 +Converged at iteration 32, L1 7.93883e-05, Linf 0.013842, total time[s] 0.108244 +Converged at iteration 24, L1 8.08142e-05, Linf 0.00186788, total time[s] 0.078435 +Converged at iteration 26, L1 5.75207e-05, Linf 0.00386786, total time[s] 0.096765 +Converged at iteration 24, L1 6.71194e-05, Linf 0.00238495, total time[s] 0.07488 +Converged at iteration 37, L1 9.22704e-05, Linf 0.0241773, total time[s] 0.123625 +Converged at iteration 35, L1 9.55775e-05, Linf 0.0224025, total time[s] 0.110352 +Converged at iteration 25, L1 2.83044e-05, Linf 0.00801925, total time[s] 0.066639 +Converged at iteration 28, L1 9.21051e-05, Linf 0.00907246, total time[s] 0.08722 +Converged at iteration 24, L1 5.30153e-05, Linf 0.00541722, total time[s] 0.079286 +Converged at iteration 21, L1 8.54663e-05, Linf 0.010225, total time[s] 0.094902 +Converged at iteration 20, L1 3.96089e-05, Linf 0.0082587, total time[s] 0.078212 +Converged at iteration 21, L1 9.34065e-05, Linf 0.00807703, total time[s] 0.087304 +Converged at iteration 23, L1 8.91836e-05, Linf 0.00394386, total time[s] 0.102853 +Converged at iteration 23, L1 8.68023e-05, Linf 0.00244896, total time[s] 0.087162 +Converged at iteration 21, L1 5.83621e-05, Linf 0.00232188, total time[s] 0.076667 +Converged at iteration 18, L1 8.58454e-05, Linf 0.003761, total time[s] 0.074556 +Converged at iteration 32, L1 4.44502e-05, Linf 0.00746381, total time[s] 0.106339 +Converged at iteration 19, L1 9.43993e-05, Linf 0.00535799, total time[s] 0.089248 +Converged at iteration 22, L1 7.90583e-05, Linf 0.00457378, total time[s] 0.082412 +Converged at iteration 26, L1 5.81998e-05, Linf 0.00460517, total time[s] 0.111941 +Converged at iteration 26, L1 5.39788e-05, Linf 0.00254955, total time[s] 0.07741 +Converged at iteration 22, L1 6.9102e-05, Linf 0.00412184, total time[s] 0.067182 +Converged at iteration 23, L1 9.77603e-05, Linf 0.00269562, total time[s] 0.066475 +Converged at iteration 24, L1 7.38877e-05, Linf 0.00340778, total time[s] 0.08982 +Converged at iteration 22, L1 8.71341e-05, Linf 0.00127642, total time[s] 0.078052 +Converged at iteration 31, L1 9.7486e-05, Linf 0.00766555, total time[s] 0.100397 +Converged at iteration 29, L1 9.53741e-05, Linf 0.00384137, total time[s] 0.077987 +Converged at iteration 30, L1 9.51045e-05, Linf 0.0114325, total time[s] 0.101743 +Converged at iteration 30, L1 7.84469e-05, Linf 0.00272262, total time[s] 0.089295 +Converged at iteration 32, L1 3.96792e-05, Linf 0.00214926, total time[s] 0.12711 +Converged at iteration 32, L1 8.11189e-05, Linf 0.019209, total time[s] 0.088706 +Converged at iteration 27, L1 6.50919e-05, Linf 0.00496798, total time[s] 0.083879 +Converged at iteration 25, L1 8.89678e-05, Linf 0.00610447, total time[s] 0.069986 +Converged at iteration 25, L1 5.84559e-05, Linf 0.00284375, total time[s] 0.097048 +Converged at iteration 37, L1 6.5023e-05, Linf 0.0240592, total time[s] 0.106845 +Converged at iteration 36, L1 2.6872e-05, Linf 0.0137416, total time[s] 0.096051 +Converged at iteration 25, L1 3.51896e-05, Linf 0.00746497, total time[s] 0.080987 +Converged at iteration 28, L1 5.74802e-05, Linf 0.00799915, total time[s] 0.100299 +Converged at iteration 24, L1 6.03228e-05, Linf 0.00600496, total time[s] 0.064502 +Converged at iteration 21, L1 7.16191e-05, Linf 0.00905611, total time[s] 0.055783 +Converged at iteration 20, L1 6.69068e-05, Linf 0.0134222, total time[s] 0.055335 +Converged at iteration 22, L1 4.65427e-05, Linf 0.0037553, total time[s] 0.059785 +Converged at iteration 24, L1 6.84475e-05, Linf 0.00374503, total time[s] 0.06494 +Converged at iteration 24, L1 8.56614e-05, Linf 0.00370234, total time[s] 0.064033 +Converged at iteration 21, L1 9.08527e-05, Linf 0.00326252, total time[s] 0.060738 +Converged at iteration 19, L1 4.6512e-05, Linf 0.00309888, total time[s] 0.052514 +Converged at iteration 32, L1 4.35708e-05, Linf 0.00438975, total time[s] 0.099534 +Converged at iteration 20, L1 6.02036e-05, Linf 0.00398716, total time[s] 0.063523 +Converged at iteration 22, L1 8.68401e-05, Linf 0.0046915, total time[s] 0.059816 +Converged at iteration 26, L1 5.55972e-05, Linf 0.0049249, total time[s] 0.109511 +Converged at iteration 26, L1 8.75693e-05, Linf 0.00383538, total time[s] 0.085874 +Converged at iteration 23, L1 6.17178e-05, Linf 0.00255129, total time[s] 0.07383 +Converged at iteration 23, L1 9.33077e-05, Linf 0.0027743, total time[s] 0.08374 +Converged at iteration 24, L1 5.73551e-05, Linf 0.00306516, total time[s] 0.069689 +Converged at iteration 25, L1 8.15749e-05, Linf 0.00345334, total time[s] 0.106938 +Converged at iteration 32, L1 6.20884e-05, Linf 0.00548462, total time[s] 0.144825 +Converged at iteration 30, L1 6.27654e-05, Linf 0.00268705, total time[s] 0.106939 +Converged at iteration 31, L1 4.9165e-05, Linf 0.0051319, total time[s] 0.092326 +Converged at iteration 31, L1 5.72643e-05, Linf 0.00311528, total time[s] 0.107176 +Converged at iteration 32, L1 7.24225e-05, Linf 0.00425343, total time[s] 0.092264 +Converged at iteration 32, L1 9.15022e-05, Linf 0.0246457, total time[s] 0.097624 +Converged at iteration 28, L1 4.54095e-05, Linf 0.00704731, total time[s] 0.121331 +Converged at iteration 25, L1 6.40728e-05, Linf 0.00276312, total time[s] 0.107443 +Converged at iteration 25, L1 9.33932e-05, Linf 0.0057442, total time[s] 0.103666 +Converged at iteration 37, L1 5.09952e-05, Linf 0.0220554, total time[s] 0.136265 +Converged at iteration 35, L1 9.19219e-05, Linf 0.0259421, total time[s] 0.124454 +Converged at iteration 25, L1 4.5329e-05, Linf 0.00676622, total time[s] 0.118382 +Converged at iteration 27, L1 8.18315e-05, Linf 0.00807772, total time[s] 0.104307 +Converged at iteration 23, L1 7.04807e-05, Linf 0.00476429, total time[s] 0.08079 +Converged at iteration 21, L1 7.11099e-05, Linf 0.00871594, total time[s] 0.060728 +Converged at iteration 21, L1 2.62195e-05, Linf 0.00563139, total time[s] 0.095864 +Converged at iteration 23, L1 4.0263e-05, Linf 0.00557116, total time[s] 0.107742 +Converged at iteration 25, L1 6.53933e-05, Linf 0.00539789, total time[s] 0.111342 +Converged at iteration 25, L1 7.00211e-05, Linf 0.00397282, total time[s] 0.069575 +Converged at iteration 22, L1 6.78656e-05, Linf 0.00318976, total time[s] 0.117088 +Converged at iteration 19, L1 5.00966e-05, Linf 0.00372737, total time[s] 0.075291 +Converged at iteration 32, L1 4.50692e-05, Linf 0.00434385, total time[s] 0.125398 +Converged at iteration 20, L1 7.481e-05, Linf 0.00484972, total time[s] 0.072633 +Converged at iteration 23, L1 5.78573e-05, Linf 0.00407195, total time[s] 0.092138 +Converged at iteration 26, L1 8.40773e-05, Linf 0.00544451, total time[s] 0.118783 +Converged at iteration 27, L1 6.9197e-05, Linf 0.00324944, total time[s] 0.098229 +Converged at iteration 23, L1 9.49295e-05, Linf 0.0045497, total time[s] 0.099346 +Converged at iteration 23, L1 7.63319e-05, Linf 0.00315615, total time[s] 0.074698 +Converged at iteration 23, L1 9.49686e-05, Linf 0.00507574, total time[s] 0.080962 +Converged at iteration 26, L1 8.22361e-05, Linf 0.00460683, total time[s] 0.095585 +Converged at iteration 32, L1 9.61323e-05, Linf 0.00922645, total time[s] 0.128203 +Converged at iteration 30, L1 6.22438e-05, Linf 0.00230703, total time[s] 0.12116 +Converged at iteration 31, L1 5.90775e-05, Linf 0.00814569, total time[s] 0.114593 +Converged at iteration 31, L1 7.152e-05, Linf 0.00477287, total time[s] 0.150011 +Converged at iteration 33, L1 3.86304e-05, Linf 0.00224592, total time[s] 0.104973 +Converged at iteration 33, L1 2.60678e-05, Linf 0.0146919, total time[s] 0.122406 +Converged at iteration 28, L1 4.50721e-05, Linf 0.00750335, total time[s] 0.120079 +Converged at iteration 25, L1 6.58225e-05, Linf 0.00351829, total time[s] 0.116161 +Converged at iteration 26, L1 7.0872e-05, Linf 0.00550568, total time[s] 0.102724 +Converged at iteration 37, L1 5.59929e-05, Linf 0.0226799, total time[s] 0.136085 +Converged at iteration 35, L1 9.02721e-05, Linf 0.0258229, total time[s] 0.119929 +Converged at iteration 25, L1 5.51097e-05, Linf 0.00700842, total time[s] 0.068802 +Converged at iteration 27, L1 4.95835e-05, Linf 0.00602557, total time[s] 0.080602 +Converged at iteration 22, L1 5.15609e-05, Linf 0.00217843, total time[s] 0.068795 +Converged at iteration 21, L1 7.14605e-05, Linf 0.00802937, total time[s] 0.065772 +Converged at iteration 21, L1 3.67058e-05, Linf 0.00640545, total time[s] 0.074108 +Converged at iteration 23, L1 8.17361e-05, Linf 0.010248, total time[s] 0.076288 +Converged at iteration 26, L1 4.91038e-05, Linf 0.00533311, total time[s] 0.074136 +Converged at iteration 25, L1 9.47435e-05, Linf 0.00618676, total time[s] 0.07955 +Converged at iteration 22, L1 9.09634e-05, Linf 0.00465042, total time[s] 0.080021 +Converged at iteration 19, L1 5.1794e-05, Linf 0.00387696, total time[s] 0.087701 +Converged at iteration 32, L1 4.29088e-05, Linf 0.00358033, total time[s] 0.143643 +Converged at iteration 20, L1 8.56495e-05, Linf 0.00544045, total time[s] 0.058967 +Converged at iteration 23, L1 6.88364e-05, Linf 0.00480462, total time[s] 0.07107 +Converged at iteration 27, L1 6.46131e-05, Linf 0.00283737, total time[s] 0.096613 +Converged at iteration 28, L1 5.07868e-05, Linf 0.00260886, total time[s] 0.076781 +Converged at iteration 24, L1 8.40702e-05, Linf 0.00489912, total time[s] 0.08687 +Converged at iteration 23, L1 8.1343e-05, Linf 0.00346724, total time[s] 0.094161 +Converged at iteration 24, L1 6.03298e-05, Linf 0.00433711, total time[s] 0.081958 +Converged at iteration 27, L1 6.65732e-05, Linf 0.0046871, total time[s] 0.104669 +Converged at iteration 33, L1 5.6812e-05, Linf 0.00561235, total time[s] 0.09007 +Converged at iteration 29, L1 9.5044e-05, Linf 0.00301365, total time[s] 0.090132 +Converged at iteration 31, L1 7.13615e-05, Linf 0.0112142, total time[s] 0.087178 +Converged at iteration 31, L1 8.20418e-05, Linf 0.00563723, total time[s] 0.084864 +Converged at iteration 33, L1 6.13546e-05, Linf 0.00353786, total time[s] 0.102314 +Converged at iteration 33, L1 3.69868e-05, Linf 0.0191222, total time[s] 0.090905 +Converged at iteration 27, L1 9.1046e-05, Linf 0.00812379, total time[s] 0.076453 +Converged at iteration 25, L1 7.50724e-05, Linf 0.00531621, total time[s] 0.070637 +Converged at iteration 26, L1 9.67291e-05, Linf 0.0089639, total time[s] 0.07469 +Converged at iteration 38, L1 2.08229e-05, Linf 0.0126998, total time[s] 0.105812 +Converged at iteration 36, L1 2.79518e-05, Linf 0.0108384, total time[s] 0.101977 +Converged at iteration 25, L1 7.15529e-05, Linf 0.0080437, total time[s] 0.08083 +Converged at iteration 27, L1 4.9802e-05, Linf 0.00602228, total time[s] 0.081909 +Converged at iteration 22, L1 8.43102e-05, Linf 0.00328472, total time[s] 0.067805 +Converged at iteration 21, L1 7.37454e-05, Linf 0.00796841, total time[s] 0.092848 +Converged at iteration 21, L1 4.42627e-05, Linf 0.00546094, total time[s] 0.066397 +Converged at iteration 24, L1 4.01325e-05, Linf 0.00729417, total time[s] 0.08922 +Converged at iteration 26, L1 6.31102e-05, Linf 0.00698976, total time[s] 0.075079 +Converged at iteration 26, L1 5.71867e-05, Linf 0.00524167, total time[s] 0.076236 +Converged at iteration 23, L1 5.07835e-05, Linf 0.00441112, total time[s] 0.061401 +Converged at iteration 19, L1 6.27494e-05, Linf 0.00385261, total time[s] 0.055332 +Converged at iteration 32, L1 4.10549e-05, Linf 0.00270413, total time[s] 0.090685 +Converged at iteration 20, L1 8.47712e-05, Linf 0.00574372, total time[s] 0.071839 +Converged at iteration 23, L1 7.29273e-05, Linf 0.00496422, total time[s] 0.077718 +Converged at iteration 27, L1 6.99806e-05, Linf 0.00422941, total time[s] 0.086298 +Converged at iteration 28, L1 6.52652e-05, Linf 0.00356231, total time[s] 0.105797 +Converged at iteration 25, L1 6.27197e-05, Linf 0.00402878, total time[s] 0.077362 +Converged at iteration 23, L1 9.40896e-05, Linf 0.00365213, total time[s] 0.060889 +Converged at iteration 24, L1 7.59138e-05, Linf 0.0054684, total time[s] 0.087327 +Converged at iteration 27, L1 8.07972e-05, Linf 0.00503376, total time[s] 0.074631 +Converged at iteration 33, L1 6.03385e-05, Linf 0.00524386, total time[s] 0.084829 +Converged at iteration 29, L1 9.87783e-05, Linf 0.00332365, total time[s] 0.080923 +Converged at iteration 31, L1 6.75776e-05, Linf 0.00925808, total time[s] 0.083507 +Converged at iteration 31, L1 7.37885e-05, Linf 0.00487231, total time[s] 0.08452 +Converged at iteration 33, L1 6.94407e-05, Linf 0.00396164, total time[s] 0.103496 +Converged at iteration 33, L1 5.69747e-05, Linf 0.0232124, total time[s] 0.09598 +Converged at iteration 27, L1 6.17698e-05, Linf 0.00505404, total time[s] 0.09059 +Converged at iteration 25, L1 8.7631e-05, Linf 0.00687729, total time[s] 0.098175 +Converged at iteration 27, L1 5.35888e-05, Linf 0.00581161, total time[s] 0.08719 +Converged at iteration 38, L1 4.42777e-05, Linf 0.020901, total time[s] 0.125039 +Converged at iteration 36, L1 3.20688e-05, Linf 0.0127365, total time[s] 0.102678 +Converged at iteration 25, L1 7.07994e-05, Linf 0.00650356, total time[s] 0.076333 +Converged at iteration 27, L1 6.41132e-05, Linf 0.00667178, total time[s] 0.080162 +Converged at iteration 23, L1 5.51904e-05, Linf 0.00293109, total time[s] 0.082985 +Converged at iteration 21, L1 6.96934e-05, Linf 0.00705179, total time[s] 0.081169 +Converged at iteration 21, L1 6.16997e-05, Linf 0.00557151, total time[s] 0.066206 +Converged at iteration 24, L1 5.90069e-05, Linf 0.0109945, total time[s] 0.086559 +Converged at iteration 26, L1 7.30809e-05, Linf 0.00825991, total time[s] 0.079058 +Converged at iteration 26, L1 6.49465e-05, Linf 0.00552908, total time[s] 0.075861 +Converged at iteration 23, L1 6.05685e-05, Linf 0.00465045, total time[s] 0.079402 +Converged at iteration 19, L1 8.53831e-05, Linf 0.00385087, total time[s] 0.075839 +Converged at iteration 32, L1 4.17375e-05, Linf 0.00269133, total time[s] 0.088341 +Converged at iteration 20, L1 8.7233e-05, Linf 0.00566082, total time[s] 0.086988 +Converged at iteration 23, L1 7.84151e-05, Linf 0.00473772, total time[s] 0.068531 +Converged at iteration 27, L1 8.1426e-05, Linf 0.0151929, total time[s] 0.083689 +Converged at iteration 28, L1 7.58797e-05, Linf 0.00421779, total time[s] 0.080743 +Converged at iteration 25, L1 8.5174e-05, Linf 0.00543446, total time[s] 0.116593 +Converged at iteration 23, L1 9.94738e-05, Linf 0.00359617, total time[s] 0.077902 +Converged at iteration 24, L1 8.22763e-05, Linf 0.00591294, total time[s] 0.081054 +Converged at iteration 27, L1 9.61866e-05, Linf 0.00624935, total time[s] 0.092084 +Converged at iteration 33, L1 7.31086e-05, Linf 0.00951591, total time[s] 0.119534 +Converged at iteration 29, L1 9.09241e-05, Linf 0.00294527, total time[s] 0.104785 +Converged at iteration 31, L1 5.62091e-05, Linf 0.00790403, total time[s] 0.102806 +Converged at iteration 31, L1 6.28711e-05, Linf 0.00445478, total time[s] 0.100704 +Converged at iteration 33, L1 8.35664e-05, Linf 0.0056907, total time[s] 0.097863 +Converged at iteration 33, L1 6.79712e-05, Linf 0.026105, total time[s] 0.090305 +Converged at iteration 26, L1 8.68175e-05, Linf 0.00547809, total time[s] 0.090262 +Converged at iteration 25, L1 9.39175e-05, Linf 0.00829054, total time[s] 0.140628 +Converged at iteration 27, L1 6.2037e-05, Linf 0.00628342, total time[s] 0.109408 +Converged at iteration 40, L1 6.79871e-05, Linf 0.00367618, total time[s] 0.126214 +Converged at iteration 35, L1 7.63519e-05, Linf 0.00339899, total time[s] 0.101144 +Converged at iteration 30, L1 9.71649e-05, Linf 0.0042294, total time[s] 0.104328 +Converged at iteration 31, L1 6.21049e-05, Linf 0.00502563, total time[s] 0.08751 +Converged at iteration 27, L1 6.26105e-05, Linf 0.00499536, total time[s] 0.08975 +Converged at iteration 22, L1 8.59167e-05, Linf 0.00448836, total time[s] 0.066513 +Converged at iteration 20, L1 9.61429e-05, Linf 0.00397748, total time[s] 0.070979 +Converged at iteration 24, L1 8.84153e-05, Linf 0.00482699, total time[s] 0.079974 +Converged at iteration 28, L1 7.3844e-05, Linf 0.00445903, total time[s] 0.084865 +Converged at iteration 26, L1 8.11973e-05, Linf 0.00554107, total time[s] 0.076903 +Converged at iteration 22, L1 7.40025e-05, Linf 0.00508775, total time[s] 0.059133 +Converged at iteration 19, L1 6.63072e-05, Linf 0.00385086, total time[s] 0.064064 +Converged at iteration 30, L1 7.99278e-05, Linf 0.00329632, total time[s] 0.095829 +Converged at iteration 20, L1 8.53047e-05, Linf 0.00498249, total time[s] 0.074696 +Converged at iteration 24, L1 7.12285e-05, Linf 0.00463852, total time[s] 0.095634 +Converged at iteration 31, L1 8.93537e-05, Linf 0.00569154, total time[s] 0.09503 +Converged at iteration 27, L1 9.91538e-05, Linf 0.00569905, total time[s] 0.078746 +Converged at iteration 24, L1 8.7901e-05, Linf 0.00465016, total time[s] 0.080369 +Converged at iteration 23, L1 9.21786e-05, Linf 0.0041019, total time[s] 0.077543 +Converged at iteration 26, L1 7.22241e-05, Linf 0.00446099, total time[s] 0.082183 +Converged at iteration 29, L1 7.90569e-05, Linf 0.006352, total time[s] 0.114058 +Converged at iteration 34, L1 7.40014e-05, Linf 0.00422778, total time[s] 0.189139 +Converged at iteration 30, L1 9.39304e-05, Linf 0.00442541, total time[s] 0.102574 +Converged at iteration 28, L1 9.49833e-05, Linf 0.00309348, total time[s] 0.082342 +Converged at iteration 32, L1 9.47854e-05, Linf 0.0037446, total time[s] 0.112929 +Converged at iteration 37, L1 7.48208e-05, Linf 0.0032915, total time[s] 0.183311 +Converged at iteration 33, L1 8.46747e-05, Linf 0.00474287, total time[s] 0.108401 +Converged at iteration 28, L1 9.65657e-05, Linf 0.0043018, total time[s] 0.093428 +Converged at iteration 24, L1 8.83324e-05, Linf 0.00325071, total time[s] 0.079883 +Converged at iteration 26, L1 8.98147e-05, Linf 0.00383961, total time[s] 0.078241 +Converged at iteration 39, L1 2.86128e-05, Linf 0.0166768, total time[s] 0.104362 +Converged at iteration 37, L1 5.95299e-05, Linf 0.0250118, total time[s] 0.102124 +Converged at iteration 26, L1 5.52525e-05, Linf 0.0131866, total time[s] 0.0759 +Converged at iteration 28, L1 9.84241e-05, Linf 0.0144894, total time[s] 0.083892 +Converged at iteration 22, L1 4.784e-05, Linf 0.00339441, total time[s] 0.074132 +Converged at iteration 21, L1 7.62816e-05, Linf 0.00566142, total time[s] 0.070249 +Converged at iteration 21, L1 4.20319e-05, Linf 0.0060761, total time[s] 0.061963 +Converged at iteration 22, L1 6.96701e-05, Linf 0.00770762, total time[s] 0.062844 +Converged at iteration 23, L1 7.40928e-05, Linf 0.00320382, total time[s] 0.064289 +Converged at iteration 24, L1 6.18737e-05, Linf 0.00467768, total time[s] 0.075867 +Converged at iteration 22, L1 5.45921e-05, Linf 0.00392156, total time[s] 0.069118 +Converged at iteration 20, L1 8.97497e-05, Linf 0.00638866, total time[s] 0.062879 +Converged at iteration 34, L1 3.32934e-05, Linf 0.00663663, total time[s] 0.133614 +Converged at iteration 21, L1 6.69656e-05, Linf 0.0041882, total time[s] 0.060548 +Converged at iteration 23, L1 6.41195e-05, Linf 0.0033512, total time[s] 0.059325 +Converged at iteration 26, L1 5.49709e-05, Linf 0.00288854, total time[s] 0.075305 +Converged at iteration 27, L1 7.82495e-05, Linf 0.0052097, total time[s] 0.072824 +Converged at iteration 24, L1 6.2679e-05, Linf 0.00321773, total time[s] 0.084452 +Converged at iteration 24, L1 9.06039e-05, Linf 0.00471041, total time[s] 0.072718 +Converged at iteration 25, L1 6.76381e-05, Linf 0.00543162, total time[s] 0.078296 +Converged at iteration 28, L1 6.29963e-05, Linf 0.00434535, total time[s] 0.077784 +Converged at iteration 30, L1 8.41865e-05, Linf 0.00897732, total time[s] 0.107907 +Converged at iteration 29, L1 6.30307e-05, Linf 0.00449045, total time[s] 0.083069 +Converged at iteration 31, L1 4.51177e-05, Linf 0.010371, total time[s] 0.080279 +Converged at iteration 31, L1 5.84281e-05, Linf 0.00545889, total time[s] 0.102907 +Converged at iteration 31, L1 5.63005e-05, Linf 0.00748801, total time[s] 0.089637 +Converged at iteration 33, L1 8.42406e-05, Linf 0.0268697, total time[s] 0.095108 +Converged at iteration 24, L1 9.16793e-05, Linf 0.00650356, total time[s] 0.072076 +Converged at iteration 25, L1 7.73736e-05, Linf 0.00381914, total time[s] 0.069472 +Converged at iteration 26, L1 6.77278e-05, Linf 0.00595322, total time[s] 0.093929 +Converged at iteration 39, L1 2.65431e-05, Linf 0.0163458, total time[s] 0.126456 +Converged at iteration 37, L1 4.09972e-05, Linf 0.0170436, total time[s] 0.106565 +Converged at iteration 26, L1 4.19101e-05, Linf 0.0108902, total time[s] 0.081797 +Converged at iteration 29, L1 4.71051e-05, Linf 0.00844508, total time[s] 0.101596 +Converged at iteration 22, L1 5.23103e-05, Linf 0.00480934, total time[s] 0.092547 +Converged at iteration 21, L1 7.00532e-05, Linf 0.00423236, total time[s] 0.062768 +Converged at iteration 20, L1 7.92951e-05, Linf 0.0112104, total time[s] 0.065032 +Converged at iteration 22, L1 5.79344e-05, Linf 0.00584069, total time[s] 0.072608 +Converged at iteration 23, L1 6.95511e-05, Linf 0.00301505, total time[s] 0.093243 +Converged at iteration 23, L1 7.73398e-05, Linf 0.00406145, total time[s] 0.070014 +Converged at iteration 21, L1 9.11077e-05, Linf 0.00486244, total time[s] 0.068658 +Converged at iteration 20, L1 6.89339e-05, Linf 0.0040932, total time[s] 0.055078 +Converged at iteration 33, L1 7.72207e-05, Linf 0.0112989, total time[s] 0.118992 +Converged at iteration 20, L1 9.5991e-05, Linf 0.0050376, total time[s] 0.080139 +Converged at iteration 22, L1 9.03184e-05, Linf 0.00462336, total time[s] 0.073064 +Converged at iteration 26, L1 5.07783e-05, Linf 0.0084139, total time[s] 0.38798 +Converged at iteration 27, L1 7.00348e-05, Linf 0.004148, total time[s] 0.082728 +Converged at iteration 24, L1 5.84245e-05, Linf 0.00287694, total time[s] 0.097608 +Converged at iteration 24, L1 8.8929e-05, Linf 0.00261635, total time[s] 0.073016 +Converged at iteration 25, L1 6.44125e-05, Linf 0.00312611, total time[s] 0.073187 +Converged at iteration 26, L1 8.33679e-05, Linf 0.00410536, total time[s] 0.087034 +Converged at iteration 31, L1 5.26434e-05, Linf 0.0062737, total time[s] 0.085986 +Converged at iteration 29, L1 8.46743e-05, Linf 0.0072447, total time[s] 0.106204 +Converged at iteration 30, L1 9.94991e-05, Linf 0.0146548, total time[s] 0.08863 +Converged at iteration 30, L1 8.43482e-05, Linf 0.00476093, total time[s] 0.083377 +Converged at iteration 31, L1 6.96449e-05, Linf 0.00937411, total time[s] 0.088208 +Converged at iteration 33, L1 5.33634e-05, Linf 0.0212641, total time[s] 0.105317 +Converged at iteration 23, L1 5.95617e-05, Linf 0.00252876, total time[s] 0.063384 +Converged at iteration 25, L1 7.11551e-05, Linf 0.00335403, total time[s] 0.068993 +Converged at iteration 26, L1 6.0766e-05, Linf 0.00556545, total time[s] 0.068485 +Converged at iteration 38, L1 9.5451e-05, Linf 0.0271666, total time[s] 0.109647 +Converged at iteration 36, L1 9.43784e-05, Linf 0.0239934, total time[s] 0.095167 +Converged at iteration 26, L1 3.9274e-05, Linf 0.00874604, total time[s] 0.071637 +Converged at iteration 29, L1 6.38178e-05, Linf 0.00845844, total time[s] 0.091665 +Converged at iteration 22, L1 5.68302e-05, Linf 0.00374327, total time[s] 0.075811 +Converged at iteration 21, L1 7.71226e-05, Linf 0.00469019, total time[s] 0.071629 +Converged at iteration 20, L1 7.82629e-05, Linf 0.0095898, total time[s] 0.054203 +Converged at iteration 22, L1 5.98548e-05, Linf 0.00549067, total time[s] 0.066773 +Converged at iteration 23, L1 6.9422e-05, Linf 0.00284961, total time[s] 0.075713 +Converged at iteration 22, L1 9.22859e-05, Linf 0.00280621, total time[s] 0.064584 +Converged at iteration 21, L1 7.2167e-05, Linf 0.00374752, total time[s] 0.08619 +Converged at iteration 20, L1 5.57881e-05, Linf 0.00336201, total time[s] 0.064456 +Converged at iteration 33, L1 5.64071e-05, Linf 0.00807779, total time[s] 0.127308 +Converged at iteration 20, L1 7.41976e-05, Linf 0.00454267, total time[s] 0.081891 +Converged at iteration 22, L1 7.3832e-05, Linf 0.00440573, total time[s] 0.06713 +Converged at iteration 26, L1 6.71586e-05, Linf 0.014985, total time[s] 0.067897 +Converged at iteration 27, L1 6.09076e-05, Linf 0.00328537, total time[s] 0.073816 +Converged at iteration 24, L1 5.6367e-05, Linf 0.00279729, total time[s] 0.089628 +Converged at iteration 24, L1 7.69394e-05, Linf 0.00230411, total time[s] 0.074013 +Converged at iteration 24, L1 9.62518e-05, Linf 0.00406057, total time[s] 0.092424 +Converged at iteration 23, L1 8.09891e-05, Linf 0.00171632, total time[s] 0.068919 +Converged at iteration 31, L1 7.13776e-05, Linf 0.0105371, total time[s] 0.082781 +Converged at iteration 30, L1 6.22574e-05, Linf 0.00665659, total time[s] 0.081592 +Converged at iteration 30, L1 8.89519e-05, Linf 0.0117719, total time[s] 0.097628 +Converged at iteration 30, L1 7.34534e-05, Linf 0.00350593, total time[s] 0.082224 +Converged at iteration 31, L1 9.98801e-05, Linf 0.0131595, total time[s] 0.093887 +Converged at iteration 33, L1 3.34851e-05, Linf 0.0160693, total time[s] 0.098624 +Converged at iteration 23, L1 8.01158e-05, Linf 0.00396244, total time[s] 0.063318 +Converged at iteration 25, L1 6.17607e-05, Linf 0.00297735, total time[s] 0.069716 +Converged at iteration 25, L1 9.70054e-05, Linf 0.00718483, total time[s] 0.069744 +Converged at iteration 38, L1 7.67984e-05, Linf 0.0227488, total time[s] 0.11342 +Converged at iteration 36, L1 5.71396e-05, Linf 0.018481, total time[s] 0.108703 +Converged at iteration 26, L1 4.01946e-05, Linf 0.00675795, total time[s] 0.112188 +Converged at iteration 29, L1 8.32802e-05, Linf 0.00846829, total time[s] 0.086879 +Converged at iteration 22, L1 6.66294e-05, Linf 0.0039275, total time[s] 0.068998 +Converged at iteration 21, L1 8.34326e-05, Linf 0.00507855, total time[s] 0.057603 +Converged at iteration 20, L1 8.23469e-05, Linf 0.00827892, total time[s] 0.073411 +Converged at iteration 22, L1 6.86092e-05, Linf 0.00556268, total time[s] 0.059524 +Converged at iteration 23, L1 6.62951e-05, Linf 0.00287757, total time[s] 0.068272 +Converged at iteration 22, L1 5.92364e-05, Linf 0.00262219, total time[s] 0.064466 +Converged at iteration 20, L1 9.95136e-05, Linf 0.00574558, total time[s] 0.064601 +Converged at iteration 19, L1 9.0353e-05, Linf 0.00481857, total time[s] 0.057976 +Converged at iteration 33, L1 3.98091e-05, Linf 0.00621409, total time[s] 0.112957 +Converged at iteration 19, L1 9.96985e-05, Linf 0.00567417, total time[s] 0.056694 +Converged at iteration 22, L1 6.30006e-05, Linf 0.00442267, total time[s] 0.076364 +Converged at iteration 26, L1 9.55108e-05, Linf 0.0167519, total time[s] 0.15893 +Converged at iteration 26, L1 8.77201e-05, Linf 0.00350745, total time[s] 0.087792 +Converged at iteration 23, L1 9.30331e-05, Linf 0.00271061, total time[s] 0.070135 +Converged at iteration 24, L1 5.95542e-05, Linf 0.00204259, total time[s] 0.073013 +Converged at iteration 24, L1 8.11978e-05, Linf 0.00385404, total time[s] 0.066973 +Converged at iteration 22, L1 8.92162e-05, Linf 0.00301888, total time[s] 0.076782 +Converged at iteration 32, L1 5.29465e-05, Linf 0.00925386, total time[s] 0.108615 +Converged at iteration 30, L1 7.0867e-05, Linf 0.00628115, total time[s] 0.113837 +Converged at iteration 30, L1 7.50941e-05, Linf 0.00943466, total time[s] 0.088398 +Converged at iteration 30, L1 7.61218e-05, Linf 0.00426606, total time[s] 0.078002 +Converged at iteration 32, L1 7.26464e-05, Linf 0.0100028, total time[s] 0.086091 +Converged at iteration 32, L1 8.88088e-05, Linf 0.0175874, total time[s] 0.093031 +Converged at iteration 24, L1 8.99994e-05, Linf 0.0150333, total time[s] 0.066844 +Converged at iteration 25, L1 5.94665e-05, Linf 0.00267925, total time[s] 0.070554 +Converged at iteration 25, L1 9.09208e-05, Linf 0.00726945, total time[s] 0.084067 +Converged at iteration 38, L1 7.3568e-05, Linf 0.0179152, total time[s] 0.115246 +Converged at iteration 36, L1 4.43195e-05, Linf 0.0129201, total time[s] 0.096893 +Converged at iteration 26, L1 4.26923e-05, Linf 0.00498286, total time[s] 0.085772 +Converged at iteration 29, L1 9.91946e-05, Linf 0.00848632, total time[s] 0.07811 +Converged at iteration 22, L1 8.28292e-05, Linf 0.00497427, total time[s] 0.092911 +Converged at iteration 21, L1 8.81968e-05, Linf 0.00534197, total time[s] 0.071016 +Converged at iteration 20, L1 8.31196e-05, Linf 0.00767254, total time[s] 0.053275 +Converged at iteration 22, L1 7.02106e-05, Linf 0.00551122, total time[s] 0.061616 +Converged at iteration 23, L1 6.09942e-05, Linf 0.00257916, total time[s] 0.063591 +Converged at iteration 21, L1 8.21346e-05, Linf 0.00549654, total time[s] 0.067741 +Converged at iteration 20, L1 7.11839e-05, Linf 0.00683884, total time[s] 0.057077 +Converged at iteration 19, L1 7.62163e-05, Linf 0.00425222, total time[s] 0.057068 +Converged at iteration 32, L1 8.13118e-05, Linf 0.00680531, total time[s] 0.091577 +Converged at iteration 19, L1 8.22803e-05, Linf 0.00539437, total time[s] 0.056619 +Converged at iteration 22, L1 6.14908e-05, Linf 0.00443084, total time[s] 0.071668 +Converged at iteration 27, L1 5.21285e-05, Linf 0.0101054, total time[s] 0.092906 +Converged at iteration 26, L1 6.50924e-05, Linf 0.00252451, total time[s] 0.087534 +Converged at iteration 23, L1 6.42893e-05, Linf 0.00211794, total time[s] 0.086445 +Converged at iteration 23, L1 7.69043e-05, Linf 0.00279712, total time[s] 0.069142 +Converged at iteration 24, L1 7.65467e-05, Linf 0.00398512, total time[s] 0.075548 +Converged at iteration 24, L1 8.37581e-05, Linf 0.00318703, total time[s] 0.073407 +Converged at iteration 32, L1 7.24975e-05, Linf 0.0103839, total time[s] 0.090907 +Converged at iteration 29, L1 9.52977e-05, Linf 0.00514994, total time[s] 0.089403 +Converged at iteration 30, L1 6.01509e-05, Linf 0.00724808, total time[s] 0.091151 +Converged at iteration 30, L1 6.36415e-05, Linf 0.00442109, total time[s] 0.089014 +Converged at iteration 32, L1 8.25521e-05, Linf 0.0101746, total time[s] 0.084128 +Converged at iteration 32, L1 8.18473e-05, Linf 0.014102, total time[s] 0.087272 +Converged at iteration 25, L1 6.12301e-05, Linf 0.00327245, total time[s] 0.075888 +Converged at iteration 25, L1 5.64878e-05, Linf 0.00256007, total time[s] 0.07189 +Converged at iteration 25, L1 7.34047e-05, Linf 0.00712025, total time[s] 0.068259 +Converged at iteration 38, L1 8.43955e-05, Linf 0.0153275, total time[s] 0.112406 +Converged at iteration 36, L1 4.49139e-05, Linf 0.010725, total time[s] 0.107486 +Converged at iteration 25, L1 9.09295e-05, Linf 0.00839152, total time[s] 0.070268 +Converged at iteration 30, L1 6.55449e-05, Linf 0.00664492, total time[s] 0.09239 +Converged at iteration 23, L1 5.13932e-05, Linf 0.00411955, total time[s] 0.062056 +Converged at iteration 21, L1 9.13137e-05, Linf 0.00538135, total time[s] 0.057953 +Converged at iteration 20, L1 7.15046e-05, Linf 0.00728618, total time[s] 0.058343 +Converged at iteration 22, L1 6.59729e-05, Linf 0.00524491, total time[s] 0.084795 +Converged at iteration 23, L1 5.2076e-05, Linf 0.00311951, total time[s] 0.073906 +Converged at iteration 21, L1 8.51161e-05, Linf 0.00595617, total time[s] 0.065486 +Converged at iteration 20, L1 4.67371e-05, Linf 0.00315287, total time[s] 0.061025 +Converged at iteration 19, L1 6.34966e-05, Linf 0.0035685, total time[s] 0.057238 +Converged at iteration 32, L1 6.85068e-05, Linf 0.00517631, total time[s] 0.087347 +Converged at iteration 19, L1 7.14225e-05, Linf 0.00511162, total time[s] 0.054758 +Converged at iteration 22, L1 6.82201e-05, Linf 0.0045564, total time[s] 0.064116 +Converged at iteration 26, L1 9.36731e-05, Linf 0.00981782, total time[s] 0.090287 +Converged at iteration 25, L1 9.04069e-05, Linf 0.0055874, total time[s] 0.073851 +Converged at iteration 22, L1 7.6695e-05, Linf 0.0027512, total time[s] 0.060537 +Converged at iteration 23, L1 6.10544e-05, Linf 0.0026838, total time[s] 0.120294 +Converged at iteration 24, L1 8.43821e-05, Linf 0.00358221, total time[s] 0.0648 +Converged at iteration 25, L1 8.19114e-05, Linf 0.00327863, total time[s] 0.074797 +Converged at iteration 32, L1 7.00606e-05, Linf 0.00599741, total time[s] 0.103715 +Converged at iteration 28, L1 9.77376e-05, Linf 0.00357087, total time[s] 0.092483 +Converged at iteration 29, L1 9.908e-05, Linf 0.0077809, total time[s] 0.098756 +Converged at iteration 29, L1 8.83053e-05, Linf 0.00267424, total time[s] 0.083863 +Converged at iteration 31, L1 9.02657e-05, Linf 0.00610233, total time[s] 0.082536 +Converged at iteration 32, L1 8.28004e-05, Linf 0.0120508, total time[s] 0.092969 +Converged at iteration 25, L1 7.5101e-05, Linf 0.00389422, total time[s] 0.072159 +Converged at iteration 24, L1 9.93411e-05, Linf 0.00506646, total time[s] 0.087212 +Converged at iteration 24, L1 8.57582e-05, Linf 0.00753142, total time[s] 0.105 +Converged at iteration 38, L1 9.70441e-05, Linf 0.0135136, total time[s] 0.147004 +Converged at iteration 36, L1 5.21437e-05, Linf 0.00970941, total time[s] 0.125232 +Converged at iteration 25, L1 8.40052e-05, Linf 0.00621406, total time[s] 0.132693 +Converged at iteration 30, L1 7.68433e-05, Linf 0.00670791, total time[s] 0.12868 +Converged at iteration 23, L1 6.96125e-05, Linf 0.00502656, total time[s] 0.069961 +Converged at iteration 21, L1 9.28629e-05, Linf 0.00535077, total time[s] 0.088051 +Converged at iteration 19, L1 8.61909e-05, Linf 0.00856871, total time[s] 0.060719 +Converged at iteration 22, L1 4.73274e-05, Linf 0.00469024, total time[s] 0.083528 +Converged at iteration 22, L1 9.63585e-05, Linf 0.00489549, total time[s] 0.085474 +Converged at iteration 22, L1 5.2825e-05, Linf 0.00541543, total time[s] 0.061131 +Converged at iteration 19, L1 8.02386e-05, Linf 0.00409587, total time[s] 0.055473 +Converged at iteration 18, L1 6.04428e-05, Linf 0.00402895, total time[s] 0.051301 +Converged at iteration 32, L1 6.81344e-05, Linf 0.00417124, total time[s] 0.082581 +Converged at iteration 19, L1 7.5637e-05, Linf 0.0049884, total time[s] 0.055172 +Converged at iteration 22, L1 7.63207e-05, Linf 0.00465062, total time[s] 0.092363 +Converged at iteration 26, L1 6.53092e-05, Linf 0.0049595, total time[s] 0.101111 +Converged at iteration 25, L1 5.76629e-05, Linf 0.00256448, total time[s] 0.066576 +Converged at iteration 21, L1 8.02705e-05, Linf 0.00312876, total time[s] 0.058654 +Converged at iteration 22, L1 8.83146e-05, Linf 0.00360796, total time[s] 0.062584 +Converged at iteration 24, L1 9.18582e-05, Linf 0.00355001, total time[s] 0.075932 +Converged at iteration 26, L1 7.14632e-05, Linf 0.00307464, total time[s] 0.094242 +Converged at iteration 30, L1 8.99965e-05, Linf 0.00578546, total time[s] 0.091719 +Converged at iteration 27, L1 9.48079e-05, Linf 0.0033261, total time[s] 0.081187 +Converged at iteration 29, L1 8.15521e-05, Linf 0.00621589, total time[s] 0.084485 +Converged at iteration 29, L1 6.48666e-05, Linf 0.00184747, total time[s] 0.08165 +Converged at iteration 29, L1 7.33178e-05, Linf 0.00337563, total time[s] 0.078649 +Converged at iteration 32, L1 8.47572e-05, Linf 0.0105538, total time[s] 0.088893 +Converged at iteration 25, L1 7.99272e-05, Linf 0.00421953, total time[s] 0.092697 +Converged at iteration 24, L1 9.9869e-05, Linf 0.00485499, total time[s] 0.095964 +Converged at iteration 23, L1 8.58702e-05, Linf 0.00744719, total time[s] 0.072253 +Converged at iteration 39, L1 4.63126e-05, Linf 0.00945929, total time[s] 0.098127 +Converged at iteration 36, L1 5.91256e-05, Linf 0.00879777, total time[s] 0.129902 +Converged at iteration 25, L1 4.52178e-05, Linf 0.00435206, total time[s] 0.087891 +Converged at iteration 30, L1 8.53525e-05, Linf 0.00664341, total time[s] 0.103257 +Converged at iteration 23, L1 9.52143e-05, Linf 0.00579644, total time[s] 0.091939 +Converged at iteration 21, L1 9.1304e-05, Linf 0.00516679, total time[s] 0.060682 +Converged at iteration 19, L1 5.23876e-05, Linf 0.00633463, total time[s] 0.070516 +Converged at iteration 21, L1 4.48488e-05, Linf 0.00426563, total time[s] 0.062977 +Converged at iteration 22, L1 9.74455e-05, Linf 0.00533623, total time[s] 0.064403 +Converged at iteration 22, L1 7.54677e-05, Linf 0.0063078, total time[s] 0.075323 +Converged at iteration 19, L1 7.83408e-05, Linf 0.0051278, total time[s] 0.066791 +Converged at iteration 17, L1 5.49185e-05, Linf 0.00197322, total time[s] 0.050038 +Converged at iteration 32, L1 6.83419e-05, Linf 0.00363675, total time[s] 0.109732 +Converged at iteration 19, L1 8.02478e-05, Linf 0.00608142, total time[s] 0.085163 +Converged at iteration 22, L1 8.46951e-05, Linf 0.00537455, total time[s] 0.071723 +Converged at iteration 26, L1 4.2713e-05, Linf 0.00300422, total time[s] 0.077107 +Converged at iteration 24, L1 6.00587e-05, Linf 0.00230638, total time[s] 0.071953 +Converged at iteration 21, L1 5.39046e-05, Linf 0.00203235, total time[s] 0.057716 +Converged at iteration 22, L1 8.61957e-05, Linf 0.00356608, total time[s] 0.059988 +Converged at iteration 24, L1 9.93539e-05, Linf 0.00374441, total time[s] 0.067393 +Converged at iteration 26, L1 9.08344e-05, Linf 0.00369912, total time[s] 0.074309 +Converged at iteration 29, L1 7.72928e-05, Linf 0.00764333, total time[s] 0.11207 +Converged at iteration 27, L1 6.27249e-05, Linf 0.0029438, total time[s] 0.079502 +Converged at iteration 29, L1 7.78342e-05, Linf 0.00519392, total time[s] 0.092095 +Converged at iteration 29, L1 6.21829e-05, Linf 0.00231848, total time[s] 0.080213 +Converged at iteration 28, L1 4.89881e-05, Linf 0.00268957, total time[s] 0.074679 +Converged at iteration 32, L1 8.74563e-05, Linf 0.00942227, total time[s] 0.104598 +Converged at iteration 25, L1 7.91812e-05, Linf 0.00407964, total time[s] 0.077543 +Converged at iteration 25, L1 6.18592e-05, Linf 0.00253158, total time[s] 0.069112 +Converged at iteration 22, L1 9.02856e-05, Linf 0.00424607, total time[s] 0.094324 +Converged at iteration 39, L1 5.29526e-05, Linf 0.00863597, total time[s] 0.117013 +Converged at iteration 36, L1 6.41398e-05, Linf 0.0079386, total time[s] 0.164445 +Converged at iteration 24, L1 6.52495e-05, Linf 0.00505838, total time[s] 0.119329 +Converged at iteration 30, L1 9.24919e-05, Linf 0.00646243, total time[s] 0.101868 +Converged at iteration 24, L1 6.91701e-05, Linf 0.00522526, total time[s] 0.063366 +Converged at iteration 21, L1 8.76081e-05, Linf 0.00487116, total time[s] 0.071541 +Converged at iteration 19, L1 4.89937e-05, Linf 0.00556842, total time[s] 0.078048 +Converged at iteration 20, L1 9.62356e-05, Linf 0.00745597, total time[s] 0.066211 +Converged at iteration 23, L1 5.36969e-05, Linf 0.00318165, total time[s] 0.079166 +Converged at iteration 23, L1 6.10719e-05, Linf 0.00537627, total time[s] 0.073065 +Converged at iteration 19, L1 8.51701e-05, Linf 0.00580568, total time[s] 0.057813 +Converged at iteration 16, L1 8.42733e-05, Linf 0.00273145, total time[s] 0.064118 +Converged at iteration 32, L1 7.00141e-05, Linf 0.00325686, total time[s] 0.09346 +Converged at iteration 19, L1 8.46342e-05, Linf 0.00513135, total time[s] 0.050694 +Converged at iteration 22, L1 9.43472e-05, Linf 0.00681813, total time[s] 0.079489 +Converged at iteration 25, L1 8.99348e-05, Linf 0.00844493, total time[s] 0.068954 +Converged at iteration 23, L1 7.66205e-05, Linf 0.00672064, total time[s] 0.063942 +Converged at iteration 20, L1 7.57603e-05, Linf 0.00205352, total time[s] 0.053149 +Converged at iteration 22, L1 8.88182e-05, Linf 0.00358804, total time[s] 0.060702 +Converged at iteration 25, L1 6.84696e-05, Linf 0.00308125, total time[s] 0.079752 +Converged at iteration 27, L1 7.36679e-05, Linf 0.00333375, total time[s] 0.08577 +Converged at iteration 29, L1 6.03697e-05, Linf 0.00643654, total time[s] 0.109125 +Converged at iteration 27, L1 5.59423e-05, Linf 0.00446145, total time[s] 0.072364 +Converged at iteration 29, L1 7.67752e-05, Linf 0.00461364, total time[s] 0.073725 +Converged at iteration 29, L1 6.77404e-05, Linf 0.00238991, total time[s] 0.075985 +Converged at iteration 27, L1 7.9599e-05, Linf 0.0015728, total time[s] 0.067491 +Converged at iteration 32, L1 9.08593e-05, Linf 0.00857425, total time[s] 0.078045 +Converged at iteration 25, L1 8.81319e-05, Linf 0.00371276, total time[s] 0.068868 +Converged at iteration 25, L1 6.63964e-05, Linf 0.00242662, total time[s] 0.080407 +Converged at iteration 22, L1 8.25034e-05, Linf 0.00346684, total time[s] 0.09246 +Converged at iteration 39, L1 6.21573e-05, Linf 0.00773314, total time[s] 0.098501 +Converged at iteration 36, L1 7.01111e-05, Linf 0.00713169, total time[s] 0.103701 +Converged at iteration 24, L1 5.30202e-05, Linf 0.00288522, total time[s] 0.065856 +Converged at iteration 30, L1 9.81234e-05, Linf 0.0063997, total time[s] 0.086871 +Converged at iteration 24, L1 9.10831e-05, Linf 0.00574168, total time[s] 0.066797 +Converged at iteration 21, L1 8.30671e-05, Linf 0.00453999, total time[s] 0.07694 +Converged at iteration 19, L1 5.01302e-05, Linf 0.00555587, total time[s] 0.060092 +Converged at iteration 20, L1 7.92742e-05, Linf 0.00697702, total time[s] 0.070372 +Converged at iteration 23, L1 6.8967e-05, Linf 0.00467715, total time[s] 0.088817 +Converged at iteration 23, L1 8.75652e-05, Linf 0.00571552, total time[s] 0.092405 +Converged at iteration 19, L1 9.50763e-05, Linf 0.00627579, total time[s] 0.064895 +Converged at iteration 16, L1 8.04394e-05, Linf 0.00289493, total time[s] 0.069926 +Converged at iteration 32, L1 6.91489e-05, Linf 0.00295128, total time[s] 0.214598 +Converged at iteration 19, L1 8.66425e-05, Linf 0.00586232, total time[s] 0.060075 +Converged at iteration 23, L1 6.4478e-05, Linf 0.00461045, total time[s] 0.061433 +Converged at iteration 26, L1 4.53897e-05, Linf 0.00398946, total time[s] 0.095429 +Converged at iteration 23, L1 6.13158e-05, Linf 0.00465816, total time[s] 0.072724 +Converged at iteration 20, L1 6.09304e-05, Linf 0.00349386, total time[s] 0.070155 +Converged at iteration 22, L1 9.13622e-05, Linf 0.00364806, total time[s] 0.093414 +Converged at iteration 25, L1 7.43284e-05, Linf 0.0032692, total time[s] 0.078647 +Converged at iteration 27, L1 8.78242e-05, Linf 0.00368984, total time[s] 0.082488 +Converged at iteration 29, L1 5.74331e-05, Linf 0.00608945, total time[s] 0.077791 +Converged at iteration 27, L1 5.61056e-05, Linf 0.00401146, total time[s] 0.082472 +Converged at iteration 29, L1 7.49998e-05, Linf 0.00431923, total time[s] 0.098618 +Converged at iteration 29, L1 7.26572e-05, Linf 0.00249109, total time[s] 0.079908 +Converged at iteration 27, L1 8.3499e-05, Linf 0.00210709, total time[s] 0.087427 +Converged at iteration 32, L1 9.40382e-05, Linf 0.00791349, total time[s] 0.085346 +Converged at iteration 26, L1 6.46733e-05, Linf 0.00238302, total time[s] 0.069546 +Converged at iteration 25, L1 6.83797e-05, Linf 0.00226061, total time[s] 0.065269 +Converged at iteration 22, L1 8.42233e-05, Linf 0.0033988, total time[s] 0.137179 +Converged at iteration 39, L1 2.22539e-05, Linf 0.0171784, total time[s] 0.141988 +Converged at iteration 37, L1 7.30708e-05, Linf 0.0337815, total time[s] 0.105012 +Converged at iteration 27, L1 6.93215e-05, Linf 0.00565363, total time[s] 0.082906 +Converged at iteration 28, L1 3.64453e-05, Linf 0.0131747, total time[s] 0.074205 +Converged at iteration 24, L1 7.25481e-05, Linf 0.0122068, total time[s] 0.088868 +Converged at iteration 21, L1 5.17418e-05, Linf 0.00356011, total time[s] 0.083573 +Converged at iteration 21, L1 7.76508e-05, Linf 0.00862066, total time[s] 0.089226 +Converged at iteration 23, L1 7.61815e-05, Linf 0.0112646, total time[s] 0.070366 +Converged at iteration 24, L1 6.98104e-05, Linf 0.00492191, total time[s] 0.079409 +Converged at iteration 26, L1 5.80819e-05, Linf 0.00413138, total time[s] 0.085829 +Converged at iteration 24, L1 5.13732e-05, Linf 0.00454543, total time[s] 0.077118 +Converged at iteration 21, L1 4.73525e-05, Linf 0.00217079, total time[s] 0.060095 +Converged at iteration 34, L1 3.87077e-05, Linf 0.00862933, total time[s] 0.108076 +Converged at iteration 20, L1 7.942e-05, Linf 0.00449134, total time[s] 0.062922 +Converged at iteration 22, L1 9.58451e-05, Linf 0.00492751, total time[s] 0.070876 +Converged at iteration 29, L1 6.15499e-05, Linf 0.00408929, total time[s] 0.095448 +Converged at iteration 29, L1 7.28041e-05, Linf 0.00473934, total time[s] 0.097373 +Converged at iteration 25, L1 7.89032e-05, Linf 0.00317444, total time[s] 0.082245 +Converged at iteration 24, L1 5.71954e-05, Linf 0.00220283, total time[s] 0.064531 +Converged at iteration 23, L1 6.12061e-05, Linf 0.00184999, total time[s] 0.073779 +Converged at iteration 29, L1 6.71612e-05, Linf 0.00623301, total time[s] 0.086942 +Converged at iteration 33, L1 8.3589e-05, Linf 0.00672574, total time[s] 0.086683 +Converged at iteration 30, L1 9.13993e-05, Linf 0.00297203, total time[s] 0.087306 +Converged at iteration 31, L1 7.04306e-05, Linf 0.00816535, total time[s] 0.092455 +Converged at iteration 33, L1 4.94704e-05, Linf 0.00407602, total time[s] 0.118611 +Converged at iteration 34, L1 5.86318e-05, Linf 0.00338281, total time[s] 0.098808 +Converged at iteration 34, L1 3.20396e-05, Linf 0.0183044, total time[s] 0.114379 +Converged at iteration 29, L1 6.53222e-05, Linf 0.0132745, total time[s] 0.08089 +Converged at iteration 25, L1 8.79304e-05, Linf 0.00460005, total time[s] 0.093012 +Converged at iteration 28, L1 6.8491e-05, Linf 0.00866122, total time[s] 0.083591 +Converged at iteration 38, L1 9.12683e-05, Linf 0.0374064, total time[s] 0.121781 +Converged at iteration 37, L1 4.66811e-05, Linf 0.0200126, total time[s] 0.167292 +Converged at iteration 26, L1 8.39058e-05, Linf 0.00839113, total time[s] 0.071713 +Converged at iteration 28, L1 5.62866e-05, Linf 0.0116447, total time[s] 0.110713 +Converged at iteration 24, L1 5.95353e-05, Linf 0.00845717, total time[s] 0.086562 +Converged at iteration 21, L1 5.40878e-05, Linf 0.00614232, total time[s] 0.082672 +Converged at iteration 21, L1 4.70115e-05, Linf 0.00534522, total time[s] 0.076213 +Converged at iteration 23, L1 4.35614e-05, Linf 0.00563266, total time[s] 0.093513 +Converged at iteration 24, L1 5.60828e-05, Linf 0.00239022, total time[s] 0.078706 +Converged at iteration 25, L1 8.47718e-05, Linf 0.00470314, total time[s] 0.08078 +Converged at iteration 23, L1 6.75873e-05, Linf 0.00439805, total time[s] 0.064703 +Converged at iteration 20, L1 8.42421e-05, Linf 0.00417398, total time[s] 0.06661 +Converged at iteration 33, L1 6.29129e-05, Linf 0.0112689, total time[s] 0.104708 +Converged at iteration 20, L1 7.36699e-05, Linf 0.00407756, total time[s] 0.06458 +Converged at iteration 22, L1 7.96576e-05, Linf 0.00427852, total time[s] 0.072121 +Converged at iteration 28, L1 7.15324e-05, Linf 0.00271844, total time[s] 0.073412 +Converged at iteration 28, L1 8.76694e-05, Linf 0.00355127, total time[s] 0.081546 +Converged at iteration 25, L1 5.64417e-05, Linf 0.001827, total time[s] 0.117526 +Converged at iteration 24, L1 6.48498e-05, Linf 0.00202497, total time[s] 0.079322 +Converged at iteration 23, L1 8.49394e-05, Linf 0.00301337, total time[s] 0.070339 +Converged at iteration 28, L1 7.24623e-05, Linf 0.00699371, total time[s] 0.078475 +Converged at iteration 33, L1 6.5639e-05, Linf 0.00742003, total time[s] 0.096416 +Converged at iteration 30, L1 9.17685e-05, Linf 0.00359312, total time[s] 0.114302 +Converged at iteration 31, L1 6.03503e-05, Linf 0.00648443, total time[s] 0.088295 +Converged at iteration 32, L1 7.13608e-05, Linf 0.00455851, total time[s] 0.094786 +Converged at iteration 33, L1 9.14108e-05, Linf 0.00531917, total time[s] 0.091563 +Converged at iteration 33, L1 7.31811e-05, Linf 0.0328099, total time[s] 0.107468 +Converged at iteration 28, L1 4.76281e-05, Linf 0.0104288, total time[s] 0.082926 +Converged at iteration 25, L1 6.02238e-05, Linf 0.00337719, total time[s] 0.081248 +Converged at iteration 27, L1 7.88905e-05, Linf 0.00823383, total time[s] 0.076525 +Converged at iteration 38, L1 6.09556e-05, Linf 0.0277699, total time[s] 0.106182 +Converged at iteration 37, L1 2.59547e-05, Linf 0.0124652, total time[s] 0.127939 +Converged at iteration 26, L1 5.38449e-05, Linf 0.00735595, total time[s] 0.088972 +Converged at iteration 28, L1 4.77557e-05, Linf 0.0106233, total time[s] 0.078539 +Converged at iteration 24, L1 5.11723e-05, Linf 0.00635205, total time[s] 0.065441 +Converged at iteration 21, L1 6.01263e-05, Linf 0.00878547, total time[s] 0.07094 +Converged at iteration 20, L1 9.09293e-05, Linf 0.0121981, total time[s] 0.054956 +Converged at iteration 22, L1 6.77647e-05, Linf 0.00571247, total time[s] 0.060358 +Converged at iteration 24, L1 4.81575e-05, Linf 0.0019996, total time[s] 0.117246 +Converged at iteration 25, L1 6.80841e-05, Linf 0.00328033, total time[s] 0.081339 +Converged at iteration 22, L1 9.13258e-05, Linf 0.00313048, total time[s] 0.081024 +Converged at iteration 20, L1 6.10116e-05, Linf 0.00341857, total time[s] 0.064589 +Converged at iteration 32, L1 9.80338e-05, Linf 0.0136925, total time[s] 0.097482 +Converged at iteration 20, L1 5.87139e-05, Linf 0.00352652, total time[s] 0.083568 +Converged at iteration 22, L1 6.34612e-05, Linf 0.00389881, total time[s] 0.063086 +Converged at iteration 27, L1 7.0988e-05, Linf 0.002484, total time[s] 0.081767 +Converged at iteration 28, L1 5.63882e-05, Linf 0.00252312, total time[s] 0.077711 +Converged at iteration 24, L1 7.28028e-05, Linf 0.0026785, total time[s] 0.067602 +Converged at iteration 24, L1 6.08721e-05, Linf 0.00167488, total time[s] 0.069157 +Converged at iteration 23, L1 9.75985e-05, Linf 0.003347, total time[s] 0.061694 +Converged at iteration 27, L1 6.69903e-05, Linf 0.00613623, total time[s] 0.074723 +Converged at iteration 32, L1 9.18306e-05, Linf 0.00939844, total time[s] 0.119798 +Converged at iteration 30, L1 8.64383e-05, Linf 0.00337378, total time[s] 0.081491 +Converged at iteration 31, L1 5.56262e-05, Linf 0.00958091, total time[s] 0.086809 +Converged at iteration 31, L1 9.38759e-05, Linf 0.00461018, total time[s] 0.112554 +Converged at iteration 33, L1 5.97475e-05, Linf 0.0036029, total time[s] 0.106339 +Converged at iteration 33, L1 3.55095e-05, Linf 0.0225057, total time[s] 0.103933 +Converged at iteration 27, L1 7.97662e-05, Linf 0.00950188, total time[s] 0.094479 +Converged at iteration 25, L1 6.17584e-05, Linf 0.00298305, total time[s] 0.088181 +Converged at iteration 26, L1 9.38609e-05, Linf 0.00782341, total time[s] 0.116152 +Converged at iteration 38, L1 3.87733e-05, Linf 0.0216477, total time[s] 0.157423 +Converged at iteration 36, L1 6.12922e-05, Linf 0.0230178, total time[s] 0.14055 +Converged at iteration 25, L1 9.55965e-05, Linf 0.0159468, total time[s] 0.073104 +Converged at iteration 28, L1 6.29269e-05, Linf 0.0102959, total time[s] 0.088655 +Converged at iteration 23, L1 8.72795e-05, Linf 0.00675438, total time[s] 0.0737 +Converged at iteration 21, L1 8.25976e-05, Linf 0.0102103, total time[s] 0.065022 +Converged at iteration 20, L1 6.01179e-05, Linf 0.0095131, total time[s] 0.054177 +Converged at iteration 22, L1 4.31514e-05, Linf 0.00296601, total time[s] 0.058864 +Converged at iteration 23, L1 8.95384e-05, Linf 0.00327787, total time[s] 0.060647 +Converged at iteration 24, L1 8.6198e-05, Linf 0.00335692, total time[s] 0.064457 +Converged at iteration 22, L1 6.41926e-05, Linf 0.00235936, total time[s] 0.059491 +Converged at iteration 20, L1 4.45772e-05, Linf 0.00263707, total time[s] 0.055426 +Converged at iteration 32, L1 6.38761e-05, Linf 0.00752527, total time[s] 0.087708 +Converged at iteration 19, L1 9.03282e-05, Linf 0.00456129, total time[s] 0.056099 +Converged at iteration 22, L1 6.06753e-05, Linf 0.00378712, total time[s] 0.058559 +Converged at iteration 40, L1 6.85309e-05, Linf 0.00367472, total time[s] 0.105917 +Converged at iteration 35, L1 7.62191e-05, Linf 0.00339721, total time[s] 0.100995 +Converged at iteration 30, L1 9.62667e-05, Linf 0.00430182, total time[s] 0.089644 +Converged at iteration 31, L1 6.3428e-05, Linf 0.00704284, total time[s] 0.095795 +Converged at iteration 27, L1 6.26041e-05, Linf 0.00499531, total time[s] 0.09147 +Converged at iteration 22, L1 8.58577e-05, Linf 0.00448845, total time[s] 0.088731 +Converged at iteration 20, L1 9.61615e-05, Linf 0.00397882, total time[s] 0.088961 +Converged at iteration 24, L1 8.84067e-05, Linf 0.00482834, total time[s] 0.081458 +Converged at iteration 28, L1 7.40271e-05, Linf 0.00445902, total time[s] 0.094975 +Converged at iteration 26, L1 8.13208e-05, Linf 0.00546789, total time[s] 0.126999 +Converged at iteration 22, L1 7.39244e-05, Linf 0.00508659, total time[s] 0.065416 +Converged at iteration 19, L1 6.66572e-05, Linf 0.00385018, total time[s] 0.097558 +Converged at iteration 30, L1 7.98742e-05, Linf 0.00329636, total time[s] 0.090504 +Converged at iteration 20, L1 8.44285e-05, Linf 0.00455022, total time[s] 0.061663 +Converged at iteration 24, L1 7.10779e-05, Linf 0.00463282, total time[s] 0.06995 +Converged at iteration 31, L1 8.93592e-05, Linf 0.0056915, total time[s] 0.111858 +Converged at iteration 27, L1 9.91165e-05, Linf 0.00569871, total time[s] 0.089419 +Converged at iteration 24, L1 8.79688e-05, Linf 0.00465021, total time[s] 0.084156 +Converged at iteration 23, L1 9.21844e-05, Linf 0.00410989, total time[s] 0.062622 +Converged at iteration 26, L1 7.22112e-05, Linf 0.00446088, total time[s] 0.075313 +Converged at iteration 29, L1 7.81474e-05, Linf 0.004796, total time[s] 0.094292 +Converged at iteration 34, L1 7.09138e-05, Linf 0.0042267, total time[s] 0.106344 +Converged at iteration 30, L1 9.39234e-05, Linf 0.00442609, total time[s] 0.076679 +Converged at iteration 28, L1 9.49907e-05, Linf 0.00310978, total time[s] 0.08045 +Converged at iteration 32, L1 9.39328e-05, Linf 0.00374081, total time[s] 0.092242 +Converged at iteration 37, L1 7.33834e-05, Linf 0.00325897, total time[s] 0.110411 +Converged at iteration 33, L1 8.448e-05, Linf 0.0046912, total time[s] 0.10712 +Converged at iteration 28, L1 9.65511e-05, Linf 0.00430177, total time[s] 0.082049 +Converged at iteration 24, L1 8.82921e-05, Linf 0.00325069, total time[s] 0.068747 +Converged at iteration 26, L1 8.98106e-05, Linf 0.00383982, total time[s] 0.069726 +Converged at iteration 39, L1 7.00069e-05, Linf 0.00710297, total time[s] 0.11168 +Converged at iteration 36, L1 7.13472e-05, Linf 0.00594623, total time[s] 0.107054 +Converged at iteration 24, L1 5.98084e-05, Linf 0.00281384, total time[s] 0.082104 +Converged at iteration 31, L1 5.65461e-05, Linf 0.00509051, total time[s] 0.084124 +Converged at iteration 25, L1 7.04266e-05, Linf 0.00532508, total time[s] 0.072368 +Converged at iteration 21, L1 6.60386e-05, Linf 0.00391079, total time[s] 0.085889 +Converged at iteration 19, L1 5.73794e-05, Linf 0.00452007, total time[s] 0.054849 +Converged at iteration 20, L1 7.6147e-05, Linf 0.0063152, total time[s] 0.064545 +Converged at iteration 24, L1 5.20528e-05, Linf 0.00410823, total time[s] 0.075487 +Converged at iteration 24, L1 6.26749e-05, Linf 0.00475262, total time[s] 0.079992 +Converged at iteration 20, L1 5.30382e-05, Linf 0.00521673, total time[s] 0.06487 +Converged at iteration 16, L1 9.02759e-05, Linf 0.00340809, total time[s] 0.046387 +Converged at iteration 32, L1 6.80323e-05, Linf 0.00271482, total time[s] 0.087834 +Converged at iteration 19, L1 9.04731e-05, Linf 0.00657441, total time[s] 0.051306 +Converged at iteration 23, L1 7.1836e-05, Linf 0.00650296, total time[s] 0.075241 +Converged at iteration 26, L1 6.39615e-05, Linf 0.0053593, total time[s] 0.109758 +Converged at iteration 23, L1 5.40127e-05, Linf 0.00495627, total time[s] 0.06606 +Converged at iteration 20, L1 6.70576e-05, Linf 0.00476008, total time[s] 0.059384 +Converged at iteration 22, L1 9.58666e-05, Linf 0.00411254, total time[s] 0.062112 +Converged at iteration 25, L1 8.04249e-05, Linf 0.0036523, total time[s] 0.075067 +Converged at iteration 28, L1 7.00513e-05, Linf 0.00350077, total time[s] 0.085841 +Converged at iteration 29, L1 6.43794e-05, Linf 0.00595087, total time[s] 0.086819 +Converged at iteration 27, L1 6.44224e-05, Linf 0.00387917, total time[s] 0.078363 +Converged at iteration 29, L1 7.44808e-05, Linf 0.00402977, total time[s] 0.088674 +Converged at iteration 29, L1 8.23257e-05, Linf 0.0026991, total time[s] 0.084273 +Converged at iteration 28, L1 6.40828e-05, Linf 0.00217838, total time[s] 0.07474 +Converged at iteration 33, L1 5.67324e-05, Linf 0.00610017, total time[s] 0.098245 +Converged at iteration 26, L1 9.01025e-05, Linf 0.00337739, total time[s] 0.066719 +Converged at iteration 25, L1 7.06514e-05, Linf 0.00201446, total time[s] 0.063628 +Converged at iteration 23, L1 5.82411e-05, Linf 0.00259018, total time[s] 0.06216 +Converged at iteration 39, L1 7.64839e-05, Linf 0.00659695, total time[s] 0.097321 +Converged at iteration 36, L1 7.3095e-05, Linf 0.00526706, total time[s] 0.093953 +Converged at iteration 24, L1 7.51197e-05, Linf 0.00411598, total time[s] 0.067415 +Converged at iteration 31, L1 5.7966e-05, Linf 0.00509165, total time[s] 0.089706 +Converged at iteration 25, L1 8.669e-05, Linf 0.00571596, total time[s] 0.087885 +Converged at iteration 20, L1 9.15634e-05, Linf 0.00380207, total time[s] 0.052805 +Converged at iteration 19, L1 6.59563e-05, Linf 0.0044136, total time[s] 0.052898 +Converged at iteration 20, L1 9.17177e-05, Linf 0.00658115, total time[s] 0.104587 +Converged at iteration 24, L1 7.94261e-05, Linf 0.00495817, total time[s] 0.075972 +Converged at iteration 24, L1 7.58267e-05, Linf 0.00492114, total time[s] 0.084564 +Converged at iteration 20, L1 6.05445e-05, Linf 0.00519213, total time[s] 0.054306 +Converged at iteration 17, L1 5.19465e-05, Linf 0.00242839, total time[s] 0.08575 +Converged at iteration 32, L1 6.88604e-05, Linf 0.0025374, total time[s] 0.111034 +Converged at iteration 19, L1 9.39695e-05, Linf 0.00706809, total time[s] 0.066609 +Converged at iteration 23, L1 7.86251e-05, Linf 0.00711305, total time[s] 0.099788 +Converged at iteration 26, L1 8.14188e-05, Linf 0.00603278, total time[s] 0.104695 +Converged at iteration 23, L1 5.79509e-05, Linf 0.00603998, total time[s] 0.067007 +Converged at iteration 20, L1 8.30729e-05, Linf 0.00552733, total time[s] 0.056972 +Converged at iteration 22, L1 9.95074e-05, Linf 0.00498697, total time[s] 0.068779 +Converged at iteration 25, L1 8.47484e-05, Linf 0.00439968, total time[s] 0.090515 +Converged at iteration 28, L1 7.82087e-05, Linf 0.00366787, total time[s] 0.08534 +Converged at iteration 29, L1 7.48417e-05, Linf 0.00612096, total time[s] 0.096618 +Converged at iteration 27, L1 7.34865e-05, Linf 0.0040198, total time[s] 0.099743 +Converged at iteration 29, L1 7.65083e-05, Linf 0.00380595, total time[s] 0.091276 +Converged at iteration 29, L1 9.17947e-05, Linf 0.00277217, total time[s] 0.077337 +Converged at iteration 28, L1 8.32244e-05, Linf 0.00273874, total time[s] 0.071484 +Converged at iteration 33, L1 6.17907e-05, Linf 0.00584892, total time[s] 0.082806 +Converged at iteration 27, L1 6.87647e-05, Linf 0.00334615, total time[s] 0.070526 +Converged at iteration 24, L1 9.65835e-05, Linf 0.00239084, total time[s] 0.082846 +Converged at iteration 23, L1 7.56431e-05, Linf 0.00328303, total time[s] 0.08884 +Converged at iteration 39, L1 8.28584e-05, Linf 0.00624744, total time[s] 0.17341 +Converged at iteration 35, L1 8.39617e-05, Linf 0.0051159, total time[s] 0.18672 +Converged at iteration 25, L1 5.00352e-05, Linf 0.00412328, total time[s] 0.076239 +Converged at iteration 31, L1 5.89966e-05, Linf 0.00510734, total time[s] 0.093567 +Converged at iteration 26, L1 5.9281e-05, Linf 0.00512096, total time[s] 0.09023 +Converged at iteration 20, L1 9.81079e-05, Linf 0.00342713, total time[s] 0.066675 +Converged at iteration 19, L1 7.95343e-05, Linf 0.00550211, total time[s] 0.087885 +Converged at iteration 21, L1 5.09224e-05, Linf 0.00593335, total time[s] 0.07489 +Converged at iteration 25, L1 6.64064e-05, Linf 0.0055188, total time[s] 0.087418 +Converged at iteration 24, L1 9.06093e-05, Linf 0.00505163, total time[s] 0.064319 +Converged at iteration 20, L1 6.73159e-05, Linf 0.00542703, total time[s] 0.061283 +Converged at iteration 17, L1 5.95768e-05, Linf 0.00279912, total time[s] 0.05381 +Converged at iteration 32, L1 6.82571e-05, Linf 0.00238432, total time[s] 0.100478 +Converged at iteration 19, L1 9.59517e-05, Linf 0.00705533, total time[s] 0.065983 +Converged at iteration 23, L1 8.59412e-05, Linf 0.00691489, total time[s] 0.078018 +Converged at iteration 27, L1 5.78809e-05, Linf 0.00468078, total time[s] 0.07816 +Converged at iteration 23, L1 6.68429e-05, Linf 0.00654908, total time[s] 0.06353 +Converged at iteration 21, L1 5.85765e-05, Linf 0.00464347, total time[s] 0.062668 +Converged at iteration 23, L1 6.71926e-05, Linf 0.00319001, total time[s] 0.063819 +Converged at iteration 25, L1 8.9437e-05, Linf 0.00555772, total time[s] 0.082563 +Converged at iteration 28, L1 8.70471e-05, Linf 0.00640556, total time[s] 0.088825 +Converged at iteration 29, L1 8.59703e-05, Linf 0.00634771, total time[s] 0.090725 +Converged at iteration 27, L1 8.54316e-05, Linf 0.00414255, total time[s] 0.089452 +Converged at iteration 29, L1 7.89796e-05, Linf 0.0036089, total time[s] 0.09475 +Converged at iteration 30, L1 6.93989e-05, Linf 0.00225297, total time[s] 0.081734 +Converged at iteration 29, L1 7.59723e-05, Linf 0.00260283, total time[s] 0.086029 +Converged at iteration 33, L1 6.65026e-05, Linf 0.00564207, total time[s] 0.110021 +Converged at iteration 27, L1 8.46848e-05, Linf 0.00382908, total time[s] 0.087039 +Converged at iteration 24, L1 8.91247e-05, Linf 0.00203167, total time[s] 0.081147 +Converged at iteration 24, L1 6.0209e-05, Linf 0.00295511, total time[s] 0.078847 +Converged at iteration 39, L1 8.86475e-05, Linf 0.00580937, total time[s] 0.144598 +Converged at iteration 36, L1 7.3783e-05, Linf 0.00423593, total time[s] 0.102659 +Converged at iteration 25, L1 9.40534e-05, Linf 0.0075172, total time[s] 0.069335 +Converged at iteration 31, L1 6.07755e-05, Linf 0.00509418, total time[s] 0.081587 +Converged at iteration 26, L1 6.90905e-05, Linf 0.0063548, total time[s] 0.072869 +Converged at iteration 21, L1 6.1659e-05, Linf 0.00323807, total time[s] 0.066427 +Converged at iteration 19, L1 9.84869e-05, Linf 0.00640293, total time[s] 0.051962 +Converged at iteration 21, L1 8.7177e-05, Linf 0.00868987, total time[s] 0.054302 +Converged at iteration 26, L1 5.87769e-05, Linf 0.00555886, total time[s] 0.079215 +Converged at iteration 25, L1 5.91542e-05, Linf 0.0040197, total time[s] 0.064727 +Converged at iteration 20, L1 7.58981e-05, Linf 0.0054571, total time[s] 0.053438 +Converged at iteration 17, L1 7.13087e-05, Linf 0.00339197, total time[s] 0.059813 +Converged at iteration 31, L1 9.92673e-05, Linf 0.00280683, total time[s] 0.080222 +Converged at iteration 20, L1 6.12557e-05, Linf 0.00529692, total time[s] 0.052141 +Converged at iteration 23, L1 9.48604e-05, Linf 0.0065254, total time[s] 0.074651 +Converged at iteration 27, L1 7.86016e-05, Linf 0.00511702, total time[s] 0.106229 +Converged at iteration 23, L1 7.95657e-05, Linf 0.00694885, total time[s] 0.071325 +Converged at iteration 21, L1 7.51916e-05, Linf 0.0047906, total time[s] 0.061116 +Converged at iteration 23, L1 7.13058e-05, Linf 0.0036116, total time[s] 0.084953 +Converged at iteration 25, L1 9.45631e-05, Linf 0.00625071, total time[s] 0.087934 +Converged at iteration 28, L1 9.23407e-05, Linf 0.00532018, total time[s] 0.074325 +Converged at iteration 29, L1 9.82709e-05, Linf 0.00645729, total time[s] 0.080728 +Converged at iteration 28, L1 6.27745e-05, Linf 0.00325688, total time[s] 0.099009 +Converged at iteration 29, L1 8.42722e-05, Linf 0.00347189, total time[s] 0.090454 +Converged at iteration 30, L1 8.23505e-05, Linf 0.00285317, total time[s] 0.077546 +Converged at iteration 30, L1 7.68351e-05, Linf 0.00253106, total time[s] 0.096459 +Converged at iteration 33, L1 7.04209e-05, Linf 0.00546753, total time[s] 0.108584 +Converged at iteration 27, L1 9.78546e-05, Linf 0.00411023, total time[s] 0.079301 +Converged at iteration 24, L1 8.83896e-05, Linf 0.00182782, total time[s] 0.065475 +Converged at iteration 24, L1 8.17903e-05, Linf 0.00424006, total time[s] 0.094231 +Converged at iteration 39, L1 9.3879e-05, Linf 0.00551637, total time[s] 0.11988 +Converged at iteration 36, L1 7.25411e-05, Linf 0.00387754, total time[s] 0.094091 +Converged at iteration 26, L1 9.6053e-05, Linf 0.00734294, total time[s] 0.086875 +Converged at iteration 31, L1 6.06459e-05, Linf 0.00509013, total time[s] 0.100875 +Converged at iteration 26, L1 7.61351e-05, Linf 0.00542949, total time[s] 0.093074 +Converged at iteration 21, L1 7.0664e-05, Linf 0.00376249, total time[s] 0.067443 +Converged at iteration 20, L1 6.69113e-05, Linf 0.00497178, total time[s] 0.053339 +Converged at iteration 22, L1 7.04159e-05, Linf 0.00742589, total time[s] 0.062129 +Converged at iteration 26, L1 9.35913e-05, Linf 0.00647123, total time[s] 0.069328 +Converged at iteration 25, L1 7.27706e-05, Linf 0.00411515, total time[s] 0.100956 +Converged at iteration 20, L1 8.72493e-05, Linf 0.00558098, total time[s] 0.064162 +Converged at iteration 17, L1 8.37622e-05, Linf 0.0039564, total time[s] 0.051506 +Converged at iteration 31, L1 9.20819e-05, Linf 0.00277449, total time[s] 0.079654 +Converged at iteration 20, L1 6.57668e-05, Linf 0.0054025, total time[s] 0.061816 +Converged at iteration 24, L1 6.16531e-05, Linf 0.00552764, total time[s] 0.073394 +Converged at iteration 28, L1 6.79859e-05, Linf 0.00370171, total time[s] 0.090838 +Converged at iteration 23, L1 9.36869e-05, Linf 0.00710928, total time[s] 0.079467 +Converged at iteration 21, L1 9.13548e-05, Linf 0.00484482, total time[s] 0.074873 +Converged at iteration 23, L1 7.79586e-05, Linf 0.00410246, total time[s] 0.067292 +Converged at iteration 25, L1 9.91314e-05, Linf 0.00627107, total time[s] 0.072066 +Converged at iteration 28, L1 9.77492e-05, Linf 0.00582945, total time[s] 0.074735 +Converged at iteration 30, L1 6.71989e-05, Linf 0.00490447, total time[s] 0.115738 +Converged at iteration 28, L1 8.06964e-05, Linf 0.00347916, total time[s] 0.104796 +Converged at iteration 29, L1 8.82258e-05, Linf 0.0033139, total time[s] 0.076883 +Converged at iteration 30, L1 9.89196e-05, Linf 0.00359558, total time[s] 0.091361 +Converged at iteration 31, L1 8.50684e-05, Linf 0.00428835, total time[s] 0.084322 +Converged at iteration 33, L1 7.38767e-05, Linf 0.00512802, total time[s] 0.087878 +Converged at iteration 28, L1 6.93578e-05, Linf 0.00368138, total time[s] 0.073226 +Converged at iteration 24, L1 8.80276e-05, Linf 0.00184143, total time[s] 0.069461 +Converged at iteration 25, L1 6.73728e-05, Linf 0.00414443, total time[s] 0.064923 +Converged at iteration 39, L1 9.61803e-05, Linf 0.00527692, total time[s] 0.107677 +Converged at iteration 36, L1 7.05883e-05, Linf 0.0036055, total time[s] 0.102213 +Converged at iteration 28, L1 5.88861e-05, Linf 0.00543092, total time[s] 0.074015 +Converged at iteration 31, L1 6.11053e-05, Linf 0.0050791, total time[s] 0.082725 +Converged at iteration 26, L1 8.17487e-05, Linf 0.00554264, total time[s] 0.076216 +Converged at iteration 21, L1 7.9884e-05, Linf 0.00412687, total time[s] 0.06254 +Converged at iteration 20, L1 8.66814e-05, Linf 0.00530052, total time[s] 0.088416 +Converged at iteration 23, L1 6.40792e-05, Linf 0.00640201, total time[s] 0.078687 +Converged at iteration 27, L1 7.67134e-05, Linf 0.00547301, total time[s] 0.079524 +Converged at iteration 25, L1 9.03725e-05, Linf 0.0041931, total time[s] 0.093353 +Converged at iteration 21, L1 5.00174e-05, Linf 0.00420758, total time[s] 0.069653 +Converged at iteration 17, L1 9.74383e-05, Linf 0.00424854, total time[s] 0.056934 +Converged at iteration 31, L1 8.60738e-05, Linf 0.00274178, total time[s] 0.08216 +Converged at iteration 20, L1 7.28797e-05, Linf 0.00525792, total time[s] 0.059113 +Converged at iteration 24, L1 6.54536e-05, Linf 0.0054133, total time[s] 0.084558 +Converged at iteration 28, L1 9.49175e-05, Linf 0.00397579, total time[s] 0.096754 +Converged at iteration 24, L1 6.72429e-05, Linf 0.00558606, total time[s] 0.064745 +Converged at iteration 22, L1 6.68962e-05, Linf 0.00421648, total time[s] 0.087189 +Converged at iteration 23, L1 8.59323e-05, Linf 0.00445833, total time[s] 0.07158 +Converged at iteration 26, L1 6.53472e-05, Linf 0.00482243, total time[s] 0.085115 +Converged at iteration 29, L1 6.65048e-05, Linf 0.00421742, total time[s] 0.075569 +Converged at iteration 30, L1 8.41207e-05, Linf 0.00477704, total time[s] 0.078594 +Converged at iteration 29, L1 7.08366e-05, Linf 0.00307504, total time[s] 0.078978 +Converged at iteration 29, L1 8.53448e-05, Linf 0.00315095, total time[s] 0.078629 +Converged at iteration 31, L1 8.30356e-05, Linf 0.00348455, total time[s] 0.0869 +Converged at iteration 33, L1 6.75175e-05, Linf 0.00407859, total time[s] 0.093004 +Converged at iteration 33, L1 7.65569e-05, Linf 0.00519967, total time[s] 0.093385 +Converged at iteration 28, L1 7.51766e-05, Linf 0.00380699, total time[s] 0.104682 +Converged at iteration 24, L1 8.37894e-05, Linf 0.00211886, total time[s] 0.067353 +Converged at iteration 25, L1 8.98077e-05, Linf 0.004812, total time[s] 0.066256 +Converged at iteration 39, L1 9.86701e-05, Linf 0.00508398, total time[s] 0.141805 +Converged at iteration 36, L1 6.8268e-05, Linf 0.00340332, total time[s] 0.101128 +Converged at iteration 29, L1 6.91489e-05, Linf 0.00494317, total time[s] 0.090311 +Converged at iteration 31, L1 6.1607e-05, Linf 0.00507072, total time[s] 0.11782 +Converged at iteration 26, L1 8.72814e-05, Linf 0.00562261, total time[s] 0.083658 +Converged at iteration 21, L1 8.74098e-05, Linf 0.00438737, total time[s] 0.085908 +Converged at iteration 21, L1 6.10364e-05, Linf 0.00408315, total time[s] 0.056993 +Converged at iteration 24, L1 5.89933e-05, Linf 0.00531273, total time[s] 0.072578 +Converged at iteration 27, L1 9.70024e-05, Linf 0.00551555, total time[s] 0.072003 +Converged at iteration 26, L1 6.50024e-05, Linf 0.00355562, total time[s] 0.068879 +Converged at iteration 21, L1 6.14291e-05, Linf 0.00427713, total time[s] 0.067514 +Converged at iteration 18, L1 5.80661e-05, Linf 0.00275446, total time[s] 0.0586 +Converged at iteration 31, L1 8.07079e-05, Linf 0.00271029, total time[s] 0.08748 +Converged at iteration 20, L1 7.93673e-05, Linf 0.00509573, total time[s] 0.060643 +Converged at iteration 24, L1 6.72778e-05, Linf 0.00519445, total time[s] 0.074443 +Converged at iteration 29, L1 8.93904e-05, Linf 0.0034083, total time[s] 0.094514 +Converged at iteration 24, L1 8.90984e-05, Linf 0.00556752, total time[s] 0.06822 +Converged at iteration 22, L1 8.47566e-05, Linf 0.004261, total time[s] 0.067296 +Converged at iteration 23, L1 9.34056e-05, Linf 0.00459372, total time[s] 0.108925 +Converged at iteration 26, L1 6.69999e-05, Linf 0.00498647, total time[s] 0.084088 +Converged at iteration 29, L1 6.89691e-05, Linf 0.00466029, total time[s] 0.086398 +Converged at iteration 31, L1 7.33119e-05, Linf 0.00379285, total time[s] 0.097614 +Converged at iteration 29, L1 9.98908e-05, Linf 0.00348589, total time[s] 0.096478 +Converged at iteration 29, L1 8.10686e-05, Linf 0.00302793, total time[s] 0.086268 +Converged at iteration 31, L1 9.79976e-05, Linf 0.00394167, total time[s] 0.093162 +Converged at iteration 34, L1 8.52297e-05, Linf 0.00442714, total time[s] 0.093866 +Converged at iteration 33, L1 7.86611e-05, Linf 0.00504374, total time[s] 0.101598 +Converged at iteration 28, L1 8.01988e-05, Linf 0.00390388, total time[s] 0.095651 +Converged at iteration 24, L1 7.9169e-05, Linf 0.00234517, total time[s] 0.065473 +Converged at iteration 26, L1 7.31402e-05, Linf 0.00407999, total time[s] 0.117472 +Converged at iteration 39, L1 9.98803e-05, Linf 0.00492138, total time[s] 0.17158 +Converged at iteration 35, L1 9.71145e-05, Linf 0.00384588, total time[s] 0.126249 +Converged at iteration 30, L1 7.13207e-05, Linf 0.00420522, total time[s] 0.125153 +Converged at iteration 31, L1 6.13285e-05, Linf 0.0050657, total time[s] 0.093178 +Converged at iteration 26, L1 9.03496e-05, Linf 0.00567998, total time[s] 0.080538 +Converged at iteration 21, L1 9.45018e-05, Linf 0.00457796, total time[s] 0.077877 +Converged at iteration 21, L1 6.86341e-05, Linf 0.00397007, total time[s] 0.075895 +Converged at iteration 24, L1 8.01615e-05, Linf 0.00522335, total time[s] 0.090948 +Converged at iteration 28, L1 6.74247e-05, Linf 0.00440909, total time[s] 0.076039 +Converged at iteration 26, L1 8.00692e-05, Linf 0.00416865, total time[s] 0.068258 +Converged at iteration 21, L1 8.04258e-05, Linf 0.00432884, total time[s] 0.060177 +Converged at iteration 18, L1 7.05673e-05, Linf 0.00287711, total time[s] 0.050939 +Converged at iteration 31, L1 7.58512e-05, Linf 0.00268641, total time[s] 0.089667 +Converged at iteration 20, L1 8.15855e-05, Linf 0.00496865, total time[s] 0.096059 +Converged at iteration 24, L1 6.84878e-05, Linf 0.00502946, total time[s] 0.077294 +Converged at iteration 30, L1 8.77962e-05, Linf 0.00333026, total time[s] 0.082735 +Converged at iteration 25, L1 8.23007e-05, Linf 0.00457537, total time[s] 0.092415 +Converged at iteration 23, L1 7.73066e-05, Linf 0.00384566, total time[s] 0.070306 +Converged at iteration 23, L1 9.34573e-05, Linf 0.00457355, total time[s] 0.06214 +Converged at iteration 26, L1 6.86202e-05, Linf 0.00503537, total time[s] 0.070477 +Converged at iteration 29, L1 7.08878e-05, Linf 0.0047443, total time[s] 0.090662 +Converged at iteration 32, L1 7.68689e-05, Linf 0.00340193, total time[s] 0.118948 +Converged at iteration 30, L1 9.78582e-05, Linf 0.00344818, total time[s] 0.103469 +Converged at iteration 29, L1 7.8025e-05, Linf 0.00293057, total time[s] 0.093029 +Converged at iteration 32, L1 7.52033e-05, Linf 0.00336346, total time[s] 0.086137 +Converged at iteration 35, L1 9.15512e-05, Linf 0.00403282, total time[s] 0.093585 +Converged at iteration 33, L1 8.03332e-05, Linf 0.00501639, total time[s] 0.089727 +Converged at iteration 28, L1 8.37231e-05, Linf 0.00397535, total time[s] 0.088943 +Converged at iteration 24, L1 7.80253e-05, Linf 0.00252756, total time[s] 0.062717 +Converged at iteration 26, L1 8.38205e-05, Linf 0.00407334, total time[s] 0.080547 +Converged at iteration 40, L1 6.48862e-05, Linf 0.00410754, total time[s] 0.105694 +Converged at iteration 35, L1 9.34265e-05, Linf 0.00377203, total time[s] 0.100041 +Converged at iteration 30, L1 8.82786e-05, Linf 0.00418868, total time[s] 0.101226 +Converged at iteration 31, L1 6.14539e-05, Linf 0.0050602, total time[s] 0.105082 +Converged at iteration 26, L1 9.35049e-05, Linf 0.00572065, total time[s] 0.077157 +Converged at iteration 22, L1 6.23712e-05, Linf 0.00400747, total time[s] 0.071468 +Converged at iteration 21, L1 6.85076e-05, Linf 0.00377803, total time[s] 0.077617 +Converged at iteration 24, L1 8.86623e-05, Linf 0.00510403, total time[s] 0.07624 +Converged at iteration 28, L1 6.95605e-05, Linf 0.00441599, total time[s] 0.075169 +Converged at iteration 26, L1 8.19891e-05, Linf 0.00473387, total time[s] 0.07062 +Converged at iteration 22, L1 5.70841e-05, Linf 0.00335886, total time[s] 0.065793 +Converged at iteration 18, L1 8.39994e-05, Linf 0.00338185, total time[s] 0.047931 +Converged at iteration 31, L1 7.16348e-05, Linf 0.00267017, total time[s] 0.101858 +Converged at iteration 20, L1 8.23962e-05, Linf 0.00479842, total time[s] 0.066628 +Converged at iteration 24, L1 6.96703e-05, Linf 0.00491097, total time[s] 0.062545 +Converged at iteration 31, L1 8.59063e-05, Linf 0.00344922, total time[s] 0.084729 +Converged at iteration 26, L1 8.58068e-05, Linf 0.00408717, total time[s] 0.084489 +Converged at iteration 24, L1 7.15331e-05, Linf 0.00361142, total time[s] 0.093882 +Converged at iteration 23, L1 9.23206e-05, Linf 0.00438607, total time[s] 0.060272 +Converged at iteration 26, L1 6.9773e-05, Linf 0.00474211, total time[s] 0.100787 +Converged at iteration 29, L1 7.25506e-05, Linf 0.00493138, total time[s] 0.088425 +Converged at iteration 33, L1 8.84314e-05, Linf 0.003339, total time[s] 0.084884 +Converged at iteration 31, L1 7.71476e-05, Linf 0.00330122, total time[s] 0.095868 +Converged at iteration 29, L1 7.52753e-05, Linf 0.00285076, total time[s] 0.106708 +Converged at iteration 32, L1 7.69122e-05, Linf 0.00341842, total time[s] 0.094221 +Converged at iteration 36, L1 7.48079e-05, Linf 0.00338833, total time[s] 0.094809 +Converged at iteration 33, L1 8.15888e-05, Linf 0.00495197, total time[s] 0.089405 +Converged at iteration 28, L1 8.6554e-05, Linf 0.00403212, total time[s] 0.082971 +Converged at iteration 24, L1 7.84627e-05, Linf 0.00267391, total time[s] 0.066258 +Converged at iteration 26, L1 8.26932e-05, Linf 0.00399991, total time[s] 0.070172 +Converged at iteration 40, L1 6.57027e-05, Linf 0.00402195, total time[s] 0.103128 +Converged at iteration 35, L1 9.01375e-05, Linf 0.00368713, total time[s] 0.08973 +Converged at iteration 30, L1 8.93291e-05, Linf 0.00419269, total time[s] 0.081 +Converged at iteration 31, L1 6.15759e-05, Linf 0.00505402, total time[s] 0.080925 +Converged at iteration 26, L1 9.58915e-05, Linf 0.00574936, total time[s] 0.072062 +Converged at iteration 22, L1 6.70087e-05, Linf 0.0040725, total time[s] 0.068284 +Converged at iteration 21, L1 6.59534e-05, Linf 0.00362247, total time[s] 0.057788 +Converged at iteration 24, L1 8.90183e-05, Linf 0.00501871, total time[s] 0.087544 +Converged at iteration 28, L1 7.13177e-05, Linf 0.0044234, total time[s] 0.085781 +Converged at iteration 26, L1 8.074e-05, Linf 0.0050987, total time[s] 0.069512 +Converged at iteration 22, L1 6.72137e-05, Linf 0.00762723, total time[s] 0.078035 +Converged at iteration 18, L1 9.42365e-05, Linf 0.00381303, total time[s] 0.053592 +Converged at iteration 31, L1 6.7907e-05, Linf 0.00265912, total time[s] 0.099557 +Converged at iteration 20, L1 8.31228e-05, Linf 0.00479579, total time[s] 0.053586 +Converged at iteration 24, L1 7.07065e-05, Linf 0.00482942, total time[s] 0.06302 +Converged at iteration 31, L1 9.45144e-05, Linf 0.00413536, total time[s] 0.098103 +Converged at iteration 27, L1 8.20748e-05, Linf 0.00395654, total time[s] 0.08794 +Converged at iteration 24, L1 8.14762e-05, Linf 0.00397452, total time[s] 0.072325 +Converged at iteration 23, L1 9.36342e-05, Linf 0.0058288, total time[s] 0.067133 +Converged at iteration 26, L1 7.06298e-05, Linf 0.00474864, total time[s] 0.068131 +Converged at iteration 29, L1 7.38259e-05, Linf 0.00491247, total time[s] 0.076868 +Converged at iteration 34, L1 7.96744e-05, Linf 0.00346231, total time[s] 0.107291 +Converged at iteration 31, L1 7.50534e-05, Linf 0.00346867, total time[s] 0.093021 +Converged at iteration 29, L1 7.28489e-05, Linf 0.00278733, total time[s] 0.082674 +Converged at iteration 32, L1 7.9151e-05, Linf 0.00348095, total time[s] 0.091507 +Converged at iteration 36, L1 7.93597e-05, Linf 0.00347039, total time[s] 0.12307 +Converged at iteration 33, L1 8.24713e-05, Linf 0.00495613, total time[s] 0.098617 +Converged at iteration 28, L1 8.88453e-05, Linf 0.00407985, total time[s] 0.083413 +Converged at iteration 24, L1 7.91524e-05, Linf 0.00279065, total time[s] 0.13427 +Converged at iteration 26, L1 8.24872e-05, Linf 0.00395632, total time[s] 0.074291 +Converged at iteration 39, L1 6.57223e-05, Linf 0.00735465, total time[s] 0.129562 +Converged at iteration 36, L1 6.95884e-05, Linf 0.00635362, total time[s] 0.09689 +Converged at iteration 24, L1 6.16922e-05, Linf 0.00259381, total time[s] 0.064435 +Converged at iteration 30, L1 9.94031e-05, Linf 0.00628144, total time[s] 0.086013 +Converged at iteration 25, L1 6.2951e-05, Linf 0.00510741, total time[s] 0.09273 +Converged at iteration 21, L1 7.68301e-05, Linf 0.00428498, total time[s] 0.065696 +Converged at iteration 19, L1 5.78835e-05, Linf 0.00504082, total time[s] 0.052479 +Converged at iteration 20, L1 8.13826e-05, Linf 0.00708948, total time[s] 0.073286 +Converged at iteration 23, L1 9.17128e-05, Linf 0.00475014, total time[s] 0.067927 +Converged at iteration 24, L1 5.80522e-05, Linf 0.00462575, total time[s] 0.076804 +Converged at iteration 20, L1 4.9607e-05, Linf 0.00522162, total time[s] 0.05169 +Converged at iteration 16, L1 9.4598e-05, Linf 0.00354456, total time[s] 0.046613 +Converged at iteration 32, L1 6.79393e-05, Linf 0.00284125, total time[s] 0.096706 +Converged at iteration 19, L1 9.16114e-05, Linf 0.00638748, total time[s] 0.049419 +Converged at iteration 23, L1 7.11354e-05, Linf 0.00572832, total time[s] 0.080266 +Converged at iteration 26, L1 5.72073e-05, Linf 0.00437984, total time[s] 0.098243 +Converged at iteration 23, L1 5.31923e-05, Linf 0.00367878, total time[s] 0.078101 +Converged at iteration 20, L1 5.98508e-05, Linf 0.00413397, total time[s] 0.059815 +Converged at iteration 23, L1 6.45934e-05, Linf 0.00280977, total time[s] 0.088882 +Converged at iteration 25, L1 8.08559e-05, Linf 0.00343693, total time[s] 0.109621 +Converged at iteration 28, L1 6.68894e-05, Linf 0.00314054, total time[s] 0.076408 +Converged at iteration 29, L1 6.12339e-05, Linf 0.00563394, total time[s] 0.08927 +Converged at iteration 27, L1 6.54311e-05, Linf 0.00339911, total time[s] 0.090731 +Converged at iteration 29, L1 7.85356e-05, Linf 0.00412443, total time[s] 0.092844 +Converged at iteration 29, L1 8.32509e-05, Linf 0.00268125, total time[s] 0.096979 +Converged at iteration 28, L1 6.24412e-05, Linf 0.00185428, total time[s] 0.075753 +Converged at iteration 32, L1 9.75943e-05, Linf 0.00740926, total time[s] 0.096074 +Converged at iteration 26, L1 8.17397e-05, Linf 0.00311525, total time[s] 0.09564 +Converged at iteration 25, L1 7.94271e-05, Linf 0.00228846, total time[s] 0.070132 +Converged at iteration 23, L1 5.83121e-05, Linf 0.00254623, total time[s] 0.069938 +Converged at iteration 39, L1 7.16767e-05, Linf 0.00687492, total time[s] 0.118881 +Converged at iteration 36, L1 7.1925e-05, Linf 0.00567005, total time[s] 0.112755 +Converged at iteration 24, L1 7.18719e-05, Linf 0.00308688, total time[s] 0.067571 +Converged at iteration 31, L1 5.69072e-05, Linf 0.00504003, total time[s] 0.102131 +Converged at iteration 25, L1 7.73341e-05, Linf 0.00550514, total time[s] 0.089776 +Converged at iteration 21, L1 6.38169e-05, Linf 0.00375479, total time[s] 0.071124 +Converged at iteration 19, L1 6.61202e-05, Linf 0.00444944, total time[s] 0.0553 +Converged at iteration 20, L1 8.91736e-05, Linf 0.00646016, total time[s] 0.058911 +Converged at iteration 24, L1 6.31216e-05, Linf 0.00361088, total time[s] 0.070073 +Converged at iteration 24, L1 7.04781e-05, Linf 0.00481267, total time[s] 0.072384 +Converged at iteration 20, L1 5.54462e-05, Linf 0.00524224, total time[s] 0.063416 +Converged at iteration 17, L1 5.18434e-05, Linf 0.00222529, total time[s] 0.050879 +Converged at iteration 32, L1 6.77135e-05, Linf 0.00262126, total time[s] 0.092875 +Converged at iteration 19, L1 9.43166e-05, Linf 0.00682308, total time[s] 0.05524 +Converged at iteration 23, L1 7.56997e-05, Linf 0.00680903, total time[s] 0.073498 +Converged at iteration 26, L1 7.334e-05, Linf 0.00547325, total time[s] 0.088589 +Converged at iteration 23, L1 5.39151e-05, Linf 0.00536243, total time[s] 0.065995 +Converged at iteration 20, L1 7.15636e-05, Linf 0.00509636, total time[s] 0.058807 +Converged at iteration 23, L1 6.67942e-05, Linf 0.00287992, total time[s] 0.063978 +Converged at iteration 25, L1 8.44227e-05, Linf 0.00392665, total time[s] 0.075262 +Converged at iteration 28, L1 7.45989e-05, Linf 0.00386555, total time[s] 0.083019 +Converged at iteration 29, L1 7.10178e-05, Linf 0.00608423, total time[s] 0.090437 +Converged at iteration 27, L1 7.36409e-05, Linf 0.00374939, total time[s] 0.131018 +Converged at iteration 29, L1 7.93896e-05, Linf 0.00391417, total time[s] 0.129495 +Converged at iteration 29, L1 9.04395e-05, Linf 0.00274409, total time[s] 0.090191 +Converged at iteration 28, L1 7.81384e-05, Linf 0.00238766, total time[s] 0.094063 +Converged at iteration 33, L1 5.88275e-05, Linf 0.00599735, total time[s] 0.100635 +Converged at iteration 27, L1 6.08405e-05, Linf 0.0030791, total time[s] 0.081349 +Converged at iteration 25, L1 7.77148e-05, Linf 0.00209187, total time[s] 0.086543 +Converged at iteration 23, L1 7.14921e-05, Linf 0.00309666, total time[s] 0.061416 +Converged at iteration 39, L1 7.89145e-05, Linf 0.00646046, total time[s] 0.121124 +Converged at iteration 36, L1 7.31386e-05, Linf 0.0051123, total time[s] 0.110759 +Converged at iteration 24, L1 8.98779e-05, Linf 0.00425124, total time[s] 0.070677 +Converged at iteration 31, L1 5.80177e-05, Linf 0.00508334, total time[s] 0.094228 +Converged at iteration 25, L1 9.10137e-05, Linf 0.00574353, total time[s] 0.073051 +Converged at iteration 20, L1 9.75701e-05, Linf 0.00367084, total time[s] 0.154989 +Converged at iteration 19, L1 7.4963e-05, Linf 0.00501808, total time[s] 0.077469 +Converged at iteration 21, L1 4.12095e-05, Linf 0.00442431, total time[s] 0.079628 +Converged at iteration 24, L1 9.1504e-05, Linf 0.00597126, total time[s] 0.085989 +Converged at iteration 24, L1 8.25756e-05, Linf 0.0049478, total time[s] 0.092668 +Converged at iteration 20, L1 6.1755e-05, Linf 0.00527501, total time[s] 0.074826 +Converged at iteration 17, L1 5.74588e-05, Linf 0.00257391, total time[s] 0.048734 +Converged at iteration 32, L1 6.85269e-05, Linf 0.00246338, total time[s] 0.107493 +Converged at iteration 19, L1 9.62319e-05, Linf 0.00715294, total time[s] 0.055229 +Converged at iteration 23, L1 8.15791e-05, Linf 0.00714587, total time[s] 0.075978 +Converged at iteration 26, L1 9.06088e-05, Linf 0.00591376, total time[s] 0.064555 +Converged at iteration 23, L1 5.89831e-05, Linf 0.00610748, total time[s] 0.05835 +Converged at iteration 20, L1 8.65835e-05, Linf 0.00563883, total time[s] 0.050999 +Converged at iteration 23, L1 6.84701e-05, Linf 0.00302906, total time[s] 0.05799 +Converged at iteration 25, L1 8.79711e-05, Linf 0.00464863, total time[s] 0.066935 +Converged at iteration 28, L1 8.14227e-05, Linf 0.00388678, total time[s] 0.075354 +Converged at iteration 29, L1 8.1154e-05, Linf 0.0061392, total time[s] 0.076416 +Converged at iteration 40, L1 6.71429e-05, Linf 0.00367456, total time[s] 0.116135 +Converged at iteration 35, L1 7.6093e-05, Linf 0.00339723, total time[s] 0.110086 +Converged at iteration 30, L1 9.63576e-05, Linf 0.00435415, total time[s] 0.084456 +Converged at iteration 31, L1 6.19673e-05, Linf 0.00502563, total time[s] 0.083303 +Converged at iteration 27, L1 6.25983e-05, Linf 0.00499539, total time[s] 0.073589 +Converged at iteration 22, L1 8.58645e-05, Linf 0.00448833, total time[s] 0.060814 +Converged at iteration 20, L1 9.60193e-05, Linf 0.00397841, total time[s] 0.078217 +Converged at iteration 24, L1 8.84241e-05, Linf 0.00482827, total time[s] 0.084087 +Converged at iteration 28, L1 7.389e-05, Linf 0.00445904, total time[s] 0.090452 +Converged at iteration 26, L1 8.11739e-05, Linf 0.00546555, total time[s] 0.089271 +Converged at iteration 22, L1 7.39233e-05, Linf 0.00508659, total time[s] 0.092219 +Converged at iteration 19, L1 6.63243e-05, Linf 0.00393106, total time[s] 0.085325 +Converged at iteration 30, L1 7.98729e-05, Linf 0.00329634, total time[s] 0.15466 +Converged at iteration 20, L1 8.44921e-05, Linf 0.00454995, total time[s] 0.09217 +Converged at iteration 24, L1 7.10829e-05, Linf 0.00463288, total time[s] 0.099241 +Converged at iteration 31, L1 8.93623e-05, Linf 0.00558545, total time[s] 0.109274 +Converged at iteration 27, L1 9.91818e-05, Linf 0.00564796, total time[s] 0.101622 +Converged at iteration 24, L1 8.792e-05, Linf 0.00465025, total time[s] 0.076534 +Converged at iteration 23, L1 9.22736e-05, Linf 0.00420573, total time[s] 0.074895 +Converged at iteration 26, L1 7.22272e-05, Linf 0.00446107, total time[s] 0.105909 +Converged at iteration 29, L1 7.82205e-05, Linf 0.00479587, total time[s] 0.095185 +Converged at iteration 34, L1 7.0941e-05, Linf 0.00422667, total time[s] 0.10074 +Converged at iteration 30, L1 9.39458e-05, Linf 0.00442621, total time[s] 0.089524 +Converged at iteration 28, L1 9.49932e-05, Linf 0.00310977, total time[s] 0.096275 +Converged at iteration 32, L1 9.39491e-05, Linf 0.0037408, total time[s] 0.135218 +Converged at iteration 37, L1 7.33956e-05, Linf 0.00327802, total time[s] 0.112725 +Converged at iteration 33, L1 8.44817e-05, Linf 0.00469106, total time[s] 0.087464 +Converged at iteration 28, L1 9.69531e-05, Linf 0.00430192, total time[s] 0.077292 +Converged at iteration 24, L1 8.82891e-05, Linf 0.00325071, total time[s] 0.063185 +Converged at iteration 26, L1 8.98069e-05, Linf 0.00383965, total time[s] 0.069526 +Converged at iteration 39, L1 8.94011e-05, Linf 0.00577539, total time[s] 0.10359 +Converged at iteration 36, L1 7.35942e-05, Linf 0.00419495, total time[s] 0.092806 +Converged at iteration 26, L1 4.72094e-05, Linf 0.00518437, total time[s] 0.067374 +Converged at iteration 31, L1 6.18636e-05, Linf 0.00509384, total time[s] 0.083125 +Converged at iteration 26, L1 6.89611e-05, Linf 0.0052903, total time[s] 0.075825 +Converged at iteration 21, L1 6.22425e-05, Linf 0.00330357, total time[s] 0.061782 +Converged at iteration 20, L1 5.25731e-05, Linf 0.00427268, total time[s] 0.084668 +Converged at iteration 21, L1 9.23378e-05, Linf 0.00865091, total time[s] 0.068148 +Converged at iteration 26, L1 6.23111e-05, Linf 0.00570809, total time[s] 0.089087 +Converged at iteration 25, L1 6.14197e-05, Linf 0.00403108, total time[s] 0.066227 +Converged at iteration 20, L1 7.90299e-05, Linf 0.00656382, total time[s] 0.055638 +Converged at iteration 17, L1 7.2724e-05, Linf 0.00346037, total time[s] 0.052173 +Converged at iteration 31, L1 9.84878e-05, Linf 0.00280287, total time[s] 0.090548 +Converged at iteration 20, L1 6.16498e-05, Linf 0.00533252, total time[s] 0.058627 +Converged at iteration 23, L1 9.58202e-05, Linf 0.00649359, total time[s] 0.065794 +Converged at iteration 27, L1 8.11387e-05, Linf 0.00513633, total time[s] 0.092153 +Converged at iteration 23, L1 8.21849e-05, Linf 0.00838955, total time[s] 0.07255 +Converged at iteration 21, L1 7.76946e-05, Linf 0.00479891, total time[s] 0.076931 +Converged at iteration 23, L1 7.22892e-05, Linf 0.00366404, total time[s] 0.066762 +Converged at iteration 26, L1 6.71256e-05, Linf 0.00339763, total time[s] 0.088582 +Converged at iteration 28, L1 9.29935e-05, Linf 0.00537232, total time[s] 0.080023 +Converged at iteration 29, L1 9.96985e-05, Linf 0.00643899, total time[s] 0.089261 +Converged at iteration 28, L1 6.43433e-05, Linf 0.00331086, total time[s] 0.10873 +Converged at iteration 29, L1 8.47445e-05, Linf 0.00346172, total time[s] 0.081734 +Converged at iteration 30, L1 8.39522e-05, Linf 0.00292011, total time[s] 0.149722 +Converged at iteration 30, L1 8.0887e-05, Linf 0.00268004, total time[s] 0.087744 +Converged at iteration 33, L1 7.07895e-05, Linf 0.00539218, total time[s] 0.098024 +Converged at iteration 27, L1 9.859e-05, Linf 0.00413877, total time[s] 0.082305 +Converged at iteration 24, L1 8.83245e-05, Linf 0.00181034, total time[s] 0.08214 +Converged at iteration 24, L1 8.44289e-05, Linf 0.00441133, total time[s] 0.069034 +Converged at iteration 39, L1 9.33915e-05, Linf 0.0054887, total time[s] 0.106705 +Converged at iteration 36, L1 7.23703e-05, Linf 0.00384484, total time[s] 0.126063 +Converged at iteration 27, L1 5.19171e-05, Linf 0.00565748, total time[s] 0.104778 +Converged at iteration 31, L1 6.20618e-05, Linf 0.0080565, total time[s] 0.10595 +Converged at iteration 26, L1 7.66923e-05, Linf 0.00538587, total time[s] 0.067256 +Converged at iteration 21, L1 7.22168e-05, Linf 0.00374029, total time[s] 0.064571 +Converged at iteration 20, L1 6.90619e-05, Linf 0.00499097, total time[s] 0.07486 +Converged at iteration 22, L1 7.53872e-05, Linf 0.00751934, total time[s] 0.069769 +Converged at iteration 26, L1 9.72422e-05, Linf 0.00651815, total time[s] 0.085276 +Converged at iteration 25, L1 7.44413e-05, Linf 0.00412524, total time[s] 0.082282 +Converged at iteration 20, L1 8.84205e-05, Linf 0.00555823, total time[s] 0.055305 +Converged at iteration 17, L1 8.52498e-05, Linf 0.00400215, total time[s] 0.056388 +Converged at iteration 31, L1 9.14604e-05, Linf 0.00277119, total time[s] 0.093301 +Converged at iteration 20, L1 6.65166e-05, Linf 0.00539273, total time[s] 0.05772 +Converged at iteration 24, L1 6.21083e-05, Linf 0.00552684, total time[s] 0.075785 +Converged at iteration 28, L1 7.08115e-05, Linf 0.003739, total time[s] 0.079779 +Converged at iteration 23, L1 9.56377e-05, Linf 0.00711669, total time[s] 0.090612 +Converged at iteration 21, L1 9.29369e-05, Linf 0.00485117, total time[s] 0.096341 +Converged at iteration 23, L1 7.86347e-05, Linf 0.00414958, total time[s] 0.072549 +Converged at iteration 25, L1 9.9432e-05, Linf 0.0062558, total time[s] 0.068039 +Converged at iteration 28, L1 9.82674e-05, Linf 0.00586765, total time[s] 0.081044 +Converged at iteration 30, L1 6.86252e-05, Linf 0.00488173, total time[s] 0.078776 +Converged at iteration 28, L1 8.30367e-05, Linf 0.0035021, total time[s] 0.071707 +Converged at iteration 29, L1 8.82908e-05, Linf 0.00329485, total time[s] 0.075679 +Converged at iteration 31, L1 6.93368e-05, Linf 0.00290639, total time[s] 0.08527 +Converged at iteration 31, L1 9.11244e-05, Linf 0.00460461, total time[s] 0.098139 +Converged at iteration 33, L1 7.40814e-05, Linf 0.00530591, total time[s] 0.085278 +Converged at iteration 28, L1 6.99522e-05, Linf 0.00368893, total time[s] 0.072618 +Converged at iteration 24, L1 8.78554e-05, Linf 0.00186797, total time[s] 0.063137 +Converged at iteration 25, L1 6.96069e-05, Linf 0.00424555, total time[s] 0.063722 +Converged at iteration 39, L1 9.64673e-05, Linf 0.0052541, total time[s] 0.104471 +Converged at iteration 36, L1 7.04914e-05, Linf 0.00357919, total time[s] 0.109096 +Converged at iteration 28, L1 6.47049e-05, Linf 0.00554167, total time[s] 0.101168 +Converged at iteration 31, L1 6.18828e-05, Linf 0.00510781, total time[s] 0.081213 +Converged at iteration 26, L1 8.23972e-05, Linf 0.00555219, total time[s] 0.066703 +Converged at iteration 21, L1 8.08459e-05, Linf 0.00411399, total time[s] 0.064504 +Converged at iteration 20, L1 8.89329e-05, Linf 0.00531226, total time[s] 0.070235 +Converged at iteration 23, L1 6.79561e-05, Linf 0.00653276, total time[s] 0.07791 +Converged at iteration 27, L1 7.91815e-05, Linf 0.0054803, total time[s] 0.138848 +Converged at iteration 25, L1 9.26319e-05, Linf 0.00420028, total time[s] 0.096587 +Converged at iteration 21, L1 5.09662e-05, Linf 0.00421422, total time[s] 0.081492 +Converged at iteration 17, L1 9.891e-05, Linf 0.00426108, total time[s] 0.063367 +Converged at iteration 31, L1 8.5504e-05, Linf 0.00273817, total time[s] 0.117786 +Converged at iteration 20, L1 7.36181e-05, Linf 0.00523993, total time[s] 0.056622 +Converged at iteration 24, L1 6.55966e-05, Linf 0.00539235, total time[s] 0.069618 +Converged at iteration 28, L1 9.75046e-05, Linf 0.00400377, total time[s] 0.081177 +Converged at iteration 24, L1 6.91154e-05, Linf 0.00558203, total time[s] 0.063917 +Converged at iteration 22, L1 6.75893e-05, Linf 0.00401563, total time[s] 0.063404 +Converged at iteration 23, L1 8.69723e-05, Linf 0.00448288, total time[s] 0.07824 +Converged at iteration 26, L1 6.55638e-05, Linf 0.0048569, total time[s] 0.092698 +Converged at iteration 29, L1 6.71074e-05, Linf 0.00427271, total time[s] 0.186005 +Converged at iteration 30, L1 8.6113e-05, Linf 0.00477607, total time[s] 0.093465 +Converged at iteration 29, L1 7.32486e-05, Linf 0.00311722, total time[s] 0.080847 +Converged at iteration 29, L1 8.46904e-05, Linf 0.00313619, total time[s] 0.079439 +Converged at iteration 31, L1 8.43382e-05, Linf 0.00354956, total time[s] 0.089639 +Converged at iteration 33, L1 7.32312e-05, Linf 0.00428568, total time[s] 0.08818 +Converged at iteration 33, L1 7.67607e-05, Linf 0.00518536, total time[s] 0.085413 +Converged at iteration 28, L1 7.57602e-05, Linf 0.00381922, total time[s] 0.080539 +Converged at iteration 24, L1 8.30459e-05, Linf 0.0021453, total time[s] 0.069525 +Converged at iteration 25, L1 9.26645e-05, Linf 0.00484611, total time[s] 0.098393 +Converged at iteration 40, L1 6.44746e-05, Linf 0.00432722, total time[s] 0.125094 +Converged at iteration 36, L1 6.85782e-05, Linf 0.00338648, total time[s] 0.103156 +Converged at iteration 29, L1 7.3696e-05, Linf 0.00502876, total time[s] 0.09313 +Converged at iteration 31, L1 6.13886e-05, Linf 0.00507009, total time[s] 0.085921 +Converged at iteration 26, L1 8.70977e-05, Linf 0.00557277, total time[s] 0.081571 +Converged at iteration 21, L1 8.84215e-05, Linf 0.00436324, total time[s] 0.068427 +Converged at iteration 21, L1 6.22393e-05, Linf 0.00407404, total time[s] 0.05944 +Converged at iteration 24, L1 6.20202e-05, Linf 0.0053098, total time[s] 0.118971 +Converged at iteration 27, L1 9.87625e-05, Linf 0.00552012, total time[s] 0.07402 +Converged at iteration 26, L1 6.69021e-05, Linf 0.00364783, total time[s] 0.087452 +Converged at iteration 21, L1 6.32579e-05, Linf 0.00428383, total time[s] 0.057039 +Converged at iteration 18, L1 5.9273e-05, Linf 0.00276492, total time[s] 0.066039 +Converged at iteration 31, L1 8.05694e-05, Linf 0.0027075, total time[s] 0.095399 +Converged at iteration 20, L1 7.99943e-05, Linf 0.00508057, total time[s] 0.067643 +Converged at iteration 24, L1 6.74512e-05, Linf 0.00517737, total time[s] 0.064352 +Converged at iteration 29, L1 9.24144e-05, Linf 0.00345857, total time[s] 0.090888 +Converged at iteration 24, L1 9.2391e-05, Linf 0.0056111, total time[s] 0.089022 +Converged at iteration 22, L1 8.77678e-05, Linf 0.00429428, total time[s] 0.074715 +Converged at iteration 23, L1 9.35013e-05, Linf 0.0045969, total time[s] 0.066313 +Converged at iteration 26, L1 6.71871e-05, Linf 0.00498739, total time[s] 0.070619 +Converged at iteration 29, L1 6.91925e-05, Linf 0.0046935, total time[s] 0.093325 +Converged at iteration 31, L1 7.67223e-05, Linf 0.00382226, total time[s] 0.108157 +Converged at iteration 30, L1 7.13836e-05, Linf 0.00302968, total time[s] 0.090469 +Converged at iteration 29, L1 8.07703e-05, Linf 0.0030167, total time[s] 0.099502 +Converged at iteration 31, L1 9.99114e-05, Linf 0.0039803, total time[s] 0.101026 +Converged at iteration 34, L1 9.07203e-05, Linf 0.00451831, total time[s] 0.103895 +Converged at iteration 33, L1 7.88581e-05, Linf 0.00508766, total time[s] 0.106936 +Converged at iteration 28, L1 8.03116e-05, Linf 0.00391084, total time[s] 0.07831 +Converged at iteration 24, L1 7.88655e-05, Linf 0.00236718, total time[s] 0.081458 +Converged at iteration 26, L1 7.47073e-05, Linf 0.00409379, total time[s] 0.067312 +Converged at iteration 39, L1 9.98572e-05, Linf 0.00490653, total time[s] 0.111638 +Converged at iteration 35, L1 9.67207e-05, Linf 0.0038326, total time[s] 0.128807 +Converged at iteration 30, L1 7.38008e-05, Linf 0.00420902, total time[s] 0.07913 +Converged at iteration 31, L1 6.13431e-05, Linf 0.00506517, total time[s] 0.078016 +Converged at iteration 26, L1 9.07063e-05, Linf 0.00568492, total time[s] 0.066554 +Converged at iteration 21, L1 9.52835e-05, Linf 0.00459527, total time[s] 0.059059 +Converged at iteration 21, L1 6.88921e-05, Linf 0.00395068, total time[s] 0.056973 +Converged at iteration 24, L1 8.14971e-05, Linf 0.00521382, total time[s] 0.064489 +Converged at iteration 28, L1 6.78662e-05, Linf 0.00441169, total time[s] 0.07382 +Converged at iteration 26, L1 8.07784e-05, Linf 0.00432154, total time[s] 0.068978 +Converged at iteration 21, L1 8.2851e-05, Linf 0.00433312, total time[s] 0.056979 +Converged at iteration 18, L1 7.22055e-05, Linf 0.00292389, total time[s] 0.049627 +Converged at iteration 40, L1 6.74044e-05, Linf 0.00364081, total time[s] 0.144452 +Converged at iteration 35, L1 7.63022e-05, Linf 0.00339595, total time[s] 0.110838 +Converged at iteration 30, L1 9.64267e-05, Linf 0.00430061, total time[s] 0.098227 +Converged at iteration 31, L1 6.19969e-05, Linf 0.00502564, total time[s] 0.104925 +Converged at iteration 27, L1 6.2617e-05, Linf 0.00504582, total time[s] 0.07621 +Converged at iteration 22, L1 8.60745e-05, Linf 0.00448665, total time[s] 0.101778 +Converged at iteration 20, L1 9.6011e-05, Linf 0.00397837, total time[s] 0.081083 +Converged at iteration 24, L1 8.84414e-05, Linf 0.00485468, total time[s] 0.184954 +Converged at iteration 28, L1 7.40682e-05, Linf 0.0044591, total time[s] 0.104291 +Converged at iteration 26, L1 8.17927e-05, Linf 0.00546882, total time[s] 0.113294 +Converged at iteration 22, L1 7.39725e-05, Linf 0.00508622, total time[s] 0.089849 +Converged at iteration 19, L1 6.64689e-05, Linf 0.00393099, total time[s] 0.066652 +Converged at iteration 30, L1 7.98732e-05, Linf 0.00329635, total time[s] 0.095126 +Converged at iteration 20, L1 8.43915e-05, Linf 0.00455037, total time[s] 0.057728 +Converged at iteration 24, L1 7.10361e-05, Linf 0.00463254, total time[s] 0.101999 +Converged at iteration 31, L1 8.93467e-05, Linf 0.00569127, total time[s] 0.099186 +Converged at iteration 27, L1 9.91273e-05, Linf 0.00569865, total time[s] 0.101165 +Converged at iteration 24, L1 8.78999e-05, Linf 0.00465019, total time[s] 0.069261 +Converged at iteration 23, L1 9.21846e-05, Linf 0.00410189, total time[s] 0.111873 +Converged at iteration 26, L1 7.2238e-05, Linf 0.00446779, total time[s] 0.092714 +Converged at iteration 29, L1 7.81922e-05, Linf 0.00489918, total time[s] 0.096539 +Converged at iteration 34, L1 7.08695e-05, Linf 0.00423336, total time[s] 0.112141 +Converged at iteration 30, L1 9.39098e-05, Linf 0.00441896, total time[s] 0.139935 +Converged at iteration 28, L1 9.4986e-05, Linf 0.00309342, total time[s] 0.095728 +Converged at iteration 32, L1 9.4698e-05, Linf 0.00376632, total time[s] 0.091317 +Converged at iteration 37, L1 7.45541e-05, Linf 0.00328156, total time[s] 0.162562 +Converged at iteration 33, L1 8.45245e-05, Linf 0.00464534, total time[s] 0.154359 +Converged at iteration 28, L1 9.65691e-05, Linf 0.00430169, total time[s] 0.105523 +Converged at iteration 24, L1 8.82889e-05, Linf 0.00325072, total time[s] 0.067388 +Converged at iteration 26, L1 8.98108e-05, Linf 0.00383971, total time[s] 0.076993 +Converged at iteration 39, L1 9.02234e-05, Linf 0.00577518, total time[s] 0.114019 +Converged at iteration 36, L1 7.35926e-05, Linf 0.00419491, total time[s] 0.099275 +Converged at iteration 26, L1 4.71795e-05, Linf 0.00518393, total time[s] 0.130021 +Converged at iteration 31, L1 6.09307e-05, Linf 0.00506854, total time[s] 0.151828 +Converged at iteration 26, L1 6.89115e-05, Linf 0.00529027, total time[s] 0.385223 +Converged at iteration 21, L1 6.2381e-05, Linf 0.00330438, total time[s] 0.170156 +Converged at iteration 20, L1 5.23322e-05, Linf 0.00427323, total time[s] 0.064311 +Converged at iteration 21, L1 9.21274e-05, Linf 0.00865083, total time[s] 0.075359 +Converged at iteration 26, L1 6.2231e-05, Linf 0.00570811, total time[s] 0.07919 +Converged at iteration 25, L1 6.035e-05, Linf 0.00403108, total time[s] 0.08037 +Converged at iteration 20, L1 7.69262e-05, Linf 0.00545682, total time[s] 0.064676 +Converged at iteration 17, L1 7.27424e-05, Linf 0.00346039, total time[s] 0.094597 +Converged at iteration 31, L1 9.88223e-05, Linf 0.00280312, total time[s] 0.141608 +Converged at iteration 20, L1 6.15739e-05, Linf 0.00533148, total time[s] 0.071654 +Converged at iteration 23, L1 9.58142e-05, Linf 0.00649358, total time[s] 0.069759 +Converged at iteration 27, L1 8.11245e-05, Linf 0.00513246, total time[s] 0.125223 +Converged at iteration 23, L1 8.10111e-05, Linf 0.00694982, total time[s] 0.090344 +Converged at iteration 21, L1 7.70741e-05, Linf 0.00479901, total time[s] 0.073818 +Converged at iteration 23, L1 7.2114e-05, Linf 0.00366407, total time[s] 0.089068 +Converged at iteration 25, L1 9.51647e-05, Linf 0.00627612, total time[s] 0.093917 +Converged at iteration 28, L1 9.29641e-05, Linf 0.00538355, total time[s] 0.08141 +Converged at iteration 29, L1 9.97332e-05, Linf 0.00643962, total time[s] 0.086409 +Converged at iteration 28, L1 6.43564e-05, Linf 0.00327767, total time[s] 0.122053 +Converged at iteration 29, L1 8.48002e-05, Linf 0.00346173, total time[s] 0.111797 +Converged at iteration 30, L1 8.41003e-05, Linf 0.00292011, total time[s] 0.091144 +Converged at iteration 30, L1 8.08859e-05, Linf 0.00267876, total time[s] 0.09087 +Converged at iteration 33, L1 7.08178e-05, Linf 0.00545094, total time[s] 0.108585 +Converged at iteration 27, L1 9.85872e-05, Linf 0.00414087, total time[s] 0.086168 +Converged at iteration 24, L1 8.84379e-05, Linf 0.00181, total time[s] 0.065706 +Converged at iteration 24, L1 8.49377e-05, Linf 0.0043995, total time[s] 0.090035 +Converged at iteration 40, L1 6.6029e-05, Linf 0.00543169, total time[s] 0.112835 +Converged at iteration 36, L1 6.86993e-05, Linf 0.00336942, total time[s] 0.147012 +Converged at iteration 29, L1 7.85825e-05, Linf 0.00500813, total time[s] 0.13505 +Converged at iteration 31, L1 6.22686e-05, Linf 0.00506942, total time[s] 0.113439 +Converged at iteration 26, L1 8.78356e-05, Linf 0.00563675, total time[s] 0.079379 +Converged at iteration 21, L1 8.8878e-05, Linf 0.00443264, total time[s] 0.058932 +Converged at iteration 21, L1 6.3433e-05, Linf 0.00407007, total time[s] 0.073448 +Converged at iteration 24, L1 6.47634e-05, Linf 0.00531483, total time[s] 0.095112 +Converged at iteration 28, L1 6.09032e-05, Linf 0.00440534, total time[s] 0.115211 +Converged at iteration 26, L1 7.00634e-05, Linf 0.00369971, total time[s] 0.083768 +Converged at iteration 21, L1 6.54479e-05, Linf 0.00427976, total time[s] 0.107914 +Converged at iteration 18, L1 6.04239e-05, Linf 0.00272323, total time[s] 0.050209 +Converged at iteration 31, L1 7.96798e-05, Linf 0.00269898, total time[s] 0.11588 +Converged at iteration 20, L1 8.02351e-05, Linf 0.00506592, total time[s] 0.060322 +Converged at iteration 24, L1 6.8163e-05, Linf 0.00515744, total time[s] 0.077546 +Converged at iteration 29, L1 9.58184e-05, Linf 0.00348629, total time[s] 0.099278 +Converged at iteration 24, L1 9.56702e-05, Linf 0.00562298, total time[s] 0.090871 +Converged at iteration 22, L1 9.0206e-05, Linf 0.00432845, total time[s] 0.096142 +Converged at iteration 23, L1 9.35635e-05, Linf 0.00459843, total time[s] 0.063954 +Converged at iteration 26, L1 6.73619e-05, Linf 0.00498702, total time[s] 0.0974 +Converged at iteration 29, L1 6.94516e-05, Linf 0.00472236, total time[s] 0.108079 +Converged at iteration 31, L1 8.03827e-05, Linf 0.00385394, total time[s] 0.087752 +Converged at iteration 30, L1 7.45168e-05, Linf 0.0030809, total time[s] 0.084711 +Converged at iteration 29, L1 8.06601e-05, Linf 0.00299154, total time[s] 0.128351 +Converged at iteration 32, L1 7.07082e-05, Linf 0.00329424, total time[s] 0.14035 +Converged at iteration 34, L1 9.63522e-05, Linf 0.00459743, total time[s] 0.127393 +Converged at iteration 33, L1 7.91302e-05, Linf 0.00507747, total time[s] 0.090093 +Converged at iteration 28, L1 8.11092e-05, Linf 0.00391823, total time[s] 0.099957 +Converged at iteration 24, L1 7.86939e-05, Linf 0.0023873, total time[s] 0.083811 +Converged at iteration 26, L1 7.63937e-05, Linf 0.00409935, total time[s] 0.094587 +Converged at iteration 40, L1 6.58963e-05, Linf 0.00399844, total time[s] 0.118605 +Converged at iteration 35, L1 8.97989e-05, Linf 0.0036635, total time[s] 0.110433 +Converged at iteration 30, L1 9.05297e-05, Linf 0.00417096, total time[s] 0.119781 +Converged at iteration 31, L1 6.16403e-05, Linf 0.00505214, total time[s] 0.167456 +Converged at iteration 26, L1 9.65824e-05, Linf 0.00575715, total time[s] 0.117365 +Converged at iteration 22, L1 6.82772e-05, Linf 0.00414863, total time[s] 0.096083 +Converged at iteration 21, L1 6.53775e-05, Linf 0.00358359, total time[s] 0.106764 +Converged at iteration 24, L1 8.90101e-05, Linf 0.00499909, total time[s] 0.10886 +Converged at iteration 28, L1 7.21545e-05, Linf 0.00442602, total time[s] 0.153902 +Converged at iteration 26, L1 8.04619e-05, Linf 0.00515935, total time[s] 0.073004 +Converged at iteration 22, L1 6.84884e-05, Linf 0.00403869, total time[s] 0.138051 +Converged at iteration 18, L1 9.71689e-05, Linf 0.0039309, total time[s] 0.071123 +Converged at iteration 30, L1 9.94449e-05, Linf 0.00331101, total time[s] 0.119246 +Converged at iteration 20, L1 8.33744e-05, Linf 0.00477644, total time[s] 0.058107 +Converged at iteration 24, L1 7.07469e-05, Linf 0.00480592, total time[s] 0.065468 +Converged at iteration 31, L1 9.5195e-05, Linf 0.00433706, total time[s] 0.088767 +Converged at iteration 27, L1 8.64406e-05, Linf 0.00414561, total time[s] 0.077477 +Converged at iteration 24, L1 8.29026e-05, Linf 0.0040657, total time[s] 0.073329 +Converged at iteration 23, L1 9.21501e-05, Linf 0.00438864, total time[s] 0.074285 +Converged at iteration 26, L1 7.08254e-05, Linf 0.00472167, total time[s] 0.084719 +Converged at iteration 29, L1 7.42841e-05, Linf 0.00490549, total time[s] 0.094854 +Converged at iteration 34, L1 8.12706e-05, Linf 0.00364271, total time[s] 0.102986 +Converged at iteration 31, L1 7.40334e-05, Linf 0.00349883, total time[s] 0.08912 +Converged at iteration 29, L1 7.21493e-05, Linf 0.00277009, total time[s] 0.077668 +Converged at iteration 32, L1 8.01953e-05, Linf 0.00349795, total time[s] 0.114326 +Converged at iteration 36, L1 8.12536e-05, Linf 0.00349809, total time[s] 0.095146 +Converged at iteration 33, L1 8.26924e-05, Linf 0.00488621, total time[s] 0.089276 +Converged at iteration 28, L1 8.9563e-05, Linf 0.00409345, total time[s] 0.076425 +Converged at iteration 24, L1 7.94065e-05, Linf 0.00282256, total time[s] 0.080954 +Converged at iteration 26, L1 8.27184e-05, Linf 0.00394561, total time[s] 0.082763 +Converged at iteration 40, L1 6.692e-05, Linf 0.00383715, total time[s] 0.117977 +Converged at iteration 35, L1 8.27981e-05, Linf 0.00352444, total time[s] 0.130144 +Converged at iteration 30, L1 9.60032e-05, Linf 0.00421835, total time[s] 0.089647 +Converged at iteration 31, L1 6.29413e-05, Linf 0.00723279, total time[s] 0.096142 +Converged at iteration 27, L1 5.99454e-05, Linf 0.00493875, total time[s] 0.092616 +Converged at iteration 22, L1 7.67651e-05, Linf 0.00430361, total time[s] 0.075029 +Converged at iteration 21, L1 6.28528e-05, Linf 0.00335237, total time[s] 0.070704 +Converged at iteration 24, L1 9.0534e-05, Linf 0.00489152, total time[s] 0.0745 +Converged at iteration 28, L1 7.43463e-05, Linf 0.00444309, total time[s] 0.113803 +Converged at iteration 26, L1 8.04546e-05, Linf 0.0055076, total time[s] 0.089922 +Converged at iteration 22, L1 7.2287e-05, Linf 0.00481345, total time[s] 0.089798 +Converged at iteration 19, L1 5.88709e-05, Linf 0.00360067, total time[s] 0.093006 +Converged at iteration 30, L1 8.89436e-05, Linf 0.00330342, total time[s] 0.080413 +Converged at iteration 20, L1 8.58828e-05, Linf 0.00465697, total time[s] 0.058487 +Converged at iteration 24, L1 7.13395e-05, Linf 0.00468125, total time[s] 0.116203 +Converged at iteration 31, L1 9.33151e-05, Linf 0.00529273, total time[s] 0.118434 +Converged at iteration 27, L1 9.8776e-05, Linf 0.00536229, total time[s] 0.08549 +Converged at iteration 24, L1 8.6744e-05, Linf 0.00450241, total time[s] 0.074115 +Converged at iteration 23, L1 9.25706e-05, Linf 0.0042255, total time[s] 0.061158 +Converged at iteration 26, L1 7.18329e-05, Linf 0.0046731, total time[s] 0.078643 +Converged at iteration 29, L1 7.63073e-05, Linf 0.00477989, total time[s] 0.093844 +Converged at iteration 34, L1 7.88151e-05, Linf 0.00433079, total time[s] 0.100032 +Converged at iteration 31, L1 6.93364e-05, Linf 0.00361263, total time[s] 0.091545 +Converged at iteration 28, L1 9.87206e-05, Linf 0.00321549, total time[s] 0.109828 +Converged at iteration 32, L1 8.55569e-05, Linf 0.00361737, total time[s] 0.083056 +Converged at iteration 36, L1 9.51259e-05, Linf 0.00370709, total time[s] 0.107636 +Converged at iteration 33, L1 8.40449e-05, Linf 0.00478892, total time[s] 0.125704 +Converged at iteration 28, L1 9.32419e-05, Linf 0.00419101, total time[s] 0.092745 +Converged at iteration 24, L1 8.20234e-05, Linf 0.00303752, total time[s] 0.063699 +Converged at iteration 26, L1 8.73533e-05, Linf 0.00388234, total time[s] 0.088054 +Converged at iteration 40, L1 6.75182e-05, Linf 0.00375587, total time[s] 0.107096 +Converged at iteration 35, L1 7.92887e-05, Linf 0.00342947, total time[s] 0.129329 +Converged at iteration 30, L1 9.70614e-05, Linf 0.00426601, total time[s] 0.086447 +Converged at iteration 31, L1 6.27866e-05, Linf 0.00503207, total time[s] 0.094321 +Converged at iteration 27, L1 6.13016e-05, Linf 0.00496825, total time[s] 0.086865 +Converged at iteration 22, L1 8.12406e-05, Linf 0.00439407, total time[s] 0.08128 +Converged at iteration 20, L1 9.87422e-05, Linf 0.00411004, total time[s] 0.05516 +Converged at iteration 24, L1 9.04234e-05, Linf 0.00485541, total time[s] 0.085808 +Converged at iteration 28, L1 7.5075e-05, Linf 0.00445185, total time[s] 0.086444 +Converged at iteration 26, L1 8.07954e-05, Linf 0.00565062, total time[s] 0.093249 +Converged at iteration 22, L1 7.45524e-05, Linf 0.00498361, total time[s] 0.134657 +Converged at iteration 19, L1 6.288e-05, Linf 0.00377695, total time[s] 0.062816 +Converged at iteration 30, L1 8.40446e-05, Linf 0.00327262, total time[s] 0.121208 +Converged at iteration 20, L1 8.49465e-05, Linf 0.00460265, total time[s] 0.085773 +Converged at iteration 24, L1 7.18711e-05, Linf 0.00464667, total time[s] 0.146882 +Converged at iteration 31, L1 9.1316e-05, Linf 0.00554836, total time[s] 0.083484 +Converged at iteration 27, L1 9.93868e-05, Linf 0.00561494, total time[s] 0.073818 +Converged at iteration 24, L1 8.75978e-05, Linf 0.00459581, total time[s] 0.070827 +Converged at iteration 23, L1 9.30547e-05, Linf 0.00415978, total time[s] 0.071171 +Converged at iteration 26, L1 7.21082e-05, Linf 0.00444588, total time[s] 0.074301 +Converged at iteration 29, L1 7.74412e-05, Linf 0.00482545, total time[s] 0.08987 +Converged at iteration 34, L1 7.54285e-05, Linf 0.00428679, total time[s] 0.092645 +Converged at iteration 30, L1 9.73481e-05, Linf 0.00440779, total time[s] 0.091689 +Converged at iteration 28, L1 9.64373e-05, Linf 0.00316225, total time[s] 0.097986 +Converged at iteration 32, L1 8.94986e-05, Linf 0.0037025, total time[s] 0.097066 +Converged at iteration 37, L1 7.08287e-05, Linf 0.0031323, total time[s] 0.10913 +Converged at iteration 33, L1 8.42391e-05, Linf 0.0047402, total time[s] 0.100851 +Converged at iteration 28, L1 9.51033e-05, Linf 0.00424268, total time[s] 0.083544 +Converged at iteration 24, L1 8.44255e-05, Linf 0.00317737, total time[s] 0.073738 +Converged at iteration 26, L1 8.84957e-05, Linf 0.00386902, total time[s] 0.069234 +Converged at iteration 40, L1 6.83251e-05, Linf 0.00383457, total time[s] 0.114576 +Converged at iteration 35, L1 8.26318e-05, Linf 0.0035243, total time[s] 0.110125 +Converged at iteration 30, L1 9.61864e-05, Linf 0.00421711, total time[s] 0.08565 +Converged at iteration 31, L1 6.18223e-05, Linf 0.0050151, total time[s] 0.089687 +Converged at iteration 27, L1 6.08002e-05, Linf 0.00502859, total time[s] 0.099644 +Converged at iteration 22, L1 7.67318e-05, Linf 0.00429896, total time[s] 0.063132 +Converged at iteration 21, L1 6.28628e-05, Linf 0.00335434, total time[s] 0.058252 +Converged at iteration 24, L1 9.03227e-05, Linf 0.00489148, total time[s] 0.067524 +Converged at iteration 28, L1 7.4547e-05, Linf 0.00444225, total time[s] 0.077993 +Converged at iteration 26, L1 8.05285e-05, Linf 0.00550644, total time[s] 0.077013 +Converged at iteration 22, L1 7.22038e-05, Linf 0.00481221, total time[s] 0.067302 +Converged at iteration 19, L1 5.89062e-05, Linf 0.00359863, total time[s] 0.11142 +Converged at iteration 30, L1 8.89556e-05, Linf 0.00330295, total time[s] 0.106308 +Converged at iteration 20, L1 8.56237e-05, Linf 0.00465648, total time[s] 0.07627 +Converged at iteration 24, L1 7.16162e-05, Linf 0.00468147, total time[s] 0.112478 +Converged at iteration 31, L1 9.38081e-05, Linf 0.00529294, total time[s] 0.110273 +Converged at iteration 27, L1 9.99989e-05, Linf 0.00533117, total time[s] 0.079717 +Converged at iteration 24, L1 8.69058e-05, Linf 0.0045022, total time[s] 0.072284 +Converged at iteration 23, L1 9.26478e-05, Linf 0.00422582, total time[s] 0.066347 +Converged at iteration 26, L1 7.18685e-05, Linf 0.00457249, total time[s] 0.083105 +Converged at iteration 29, L1 7.6438e-05, Linf 0.00485752, total time[s] 0.093479 +Converged at iteration 34, L1 7.89738e-05, Linf 0.00426379, total time[s] 0.102455 +Converged at iteration 31, L1 6.94174e-05, Linf 0.00361734, total time[s] 0.119195 +Converged at iteration 28, L1 9.86969e-05, Linf 0.00321524, total time[s] 0.087035 +Converged at iteration 32, L1 8.54904e-05, Linf 0.00361583, total time[s] 0.097762 +Converged at iteration 36, L1 9.50123e-05, Linf 0.00368374, total time[s] 0.100399 +Converged at iteration 33, L1 8.38496e-05, Linf 0.00478924, total time[s] 0.089126 +Converged at iteration 28, L1 9.32355e-05, Linf 0.00419104, total time[s] 0.096659 +Converged at iteration 24, L1 8.19975e-05, Linf 0.003037, total time[s] 0.07213 +Converged at iteration 26, L1 8.67712e-05, Linf 0.00389709, total time[s] 0.08548 +Converged at iteration 40, L1 6.68568e-05, Linf 0.00388058, total time[s] 0.14469 +Converged at iteration 35, L1 8.60175e-05, Linf 0.00364519, total time[s] 0.102881 +Converged at iteration 30, L1 9.23799e-05, Linf 0.00419846, total time[s] 0.084132 +Converged at iteration 31, L1 6.25529e-05, Linf 0.00504497, total time[s] 0.115606 +Converged at iteration 26, L1 9.89332e-05, Linf 0.00578042, total time[s] 0.134771 +Converged at iteration 22, L1 7.24312e-05, Linf 0.00420203, total time[s] 0.072046 +Converged at iteration 21, L1 6.39256e-05, Linf 0.00346724, total time[s] 0.057416 +Converged at iteration 24, L1 8.95136e-05, Linf 0.00493989, total time[s] 0.109599 +Converged at iteration 28, L1 7.33674e-05, Linf 0.0044251, total time[s] 0.083526 +Converged at iteration 26, L1 8.03798e-05, Linf 0.00540056, total time[s] 0.081539 +Converged at iteration 22, L1 7.13204e-05, Linf 0.00450425, total time[s] 0.062791 +Converged at iteration 19, L1 5.5755e-05, Linf 0.00336843, total time[s] 0.066681 +Converged at iteration 30, L1 9.41475e-05, Linf 0.00330587, total time[s] 0.078562 +Converged at iteration 20, L1 8.45381e-05, Linf 0.00471561, total time[s] 0.054867 +Converged at iteration 24, L1 7.14469e-05, Linf 0.00473959, total time[s] 0.068368 +Converged at iteration 31, L1 9.39445e-05, Linf 0.00493134, total time[s] 0.116163 +Converged at iteration 27, L1 9.59785e-05, Linf 0.00481282, total time[s] 0.07438 +Converged at iteration 24, L1 8.61009e-05, Linf 0.00432593, total time[s] 0.078463 +Converged at iteration 24, L1 8.46364e-05, Linf 0.00227652, total time[s] 0.104055 +Converged at iteration 26, L1 7.14707e-05, Linf 0.0046392, total time[s] 0.103999 +Converged at iteration 29, L1 7.54312e-05, Linf 0.00488176, total time[s] 0.103726 +Converged at iteration 34, L1 8.14191e-05, Linf 0.00415478, total time[s] 0.108091 +Converged at iteration 31, L1 7.16752e-05, Linf 0.00356566, total time[s] 0.089319 +Converged at iteration 29, L1 6.98954e-05, Linf 0.00271539, total time[s] 0.141841 +Converged at iteration 32, L1 8.36079e-05, Linf 0.00355646, total time[s] 0.100189 +Converged at iteration 36, L1 8.93935e-05, Linf 0.0035855, total time[s] 0.11876 +Converged at iteration 33, L1 8.34918e-05, Linf 0.00483897, total time[s] 0.112144 +Converged at iteration 28, L1 9.17732e-05, Linf 0.00414201, total time[s] 0.082331 +Converged at iteration 24, L1 8.05112e-05, Linf 0.00292868, total time[s] 0.07821 +Converged at iteration 26, L1 8.47705e-05, Linf 0.00393713, total time[s] 0.069836 +Converged at iteration 40, L1 6.73114e-05, Linf 0.00399773, total time[s] 0.100656 +Converged at iteration 35, L1 8.94472e-05, Linf 0.00366624, total time[s] 0.108067 +Converged at iteration 30, L1 9.06436e-05, Linf 0.00417089, total time[s] 0.095993 +Converged at iteration 31, L1 6.17015e-05, Linf 0.00505082, total time[s] 0.092526 +Converged at iteration 26, L1 9.6546e-05, Linf 0.00575648, total time[s] 0.0707 +Converged at iteration 22, L1 6.84414e-05, Linf 0.00410087, total time[s] 0.066441 +Converged at iteration 21, L1 6.56066e-05, Linf 0.00359228, total time[s] 0.069882 +Converged at iteration 24, L1 8.90516e-05, Linf 0.00499859, total time[s] 0.083305 +Converged at iteration 28, L1 7.16728e-05, Linf 0.00440835, total time[s] 0.088347 +Converged at iteration 26, L1 8.08865e-05, Linf 0.00522054, total time[s] 0.074822 +Converged at iteration 22, L1 6.77749e-05, Linf 0.00403062, total time[s] 0.095668 +Converged at iteration 18, L1 9.67422e-05, Linf 0.00391732, total time[s] 0.071606 +Converged at iteration 30, L1 9.95161e-05, Linf 0.00330961, total time[s] 0.099626 +Converged at iteration 20, L1 8.35214e-05, Linf 0.00477826, total time[s] 0.054303 +Converged at iteration 24, L1 7.14371e-05, Linf 0.00481113, total time[s] 0.074909 +Converged at iteration 31, L1 9.57924e-05, Linf 0.00434749, total time[s] 0.114863 +Converged at iteration 27, L1 8.70302e-05, Linf 0.00414582, total time[s] 0.076115 +Converged at iteration 24, L1 8.33955e-05, Linf 0.0040645, total time[s] 0.077647 +Converged at iteration 23, L1 9.26062e-05, Linf 0.00439069, total time[s] 0.064287 +Converged at iteration 26, L1 7.09774e-05, Linf 0.0047229, total time[s] 0.079931 +Converged at iteration 29, L1 7.43759e-05, Linf 0.00490629, total time[s] 0.091846 +Converged at iteration 34, L1 8.22058e-05, Linf 0.00365117, total time[s] 0.100259 +Converged at iteration 31, L1 7.48996e-05, Linf 0.00350342, total time[s] 0.110943 +Converged at iteration 29, L1 7.21637e-05, Linf 0.00276873, total time[s] 0.077731 +Converged at iteration 32, L1 7.97555e-05, Linf 0.00347642, total time[s] 0.108771 +Converged at iteration 36, L1 8.14517e-05, Linf 0.00348861, total time[s] 0.103732 +Converged at iteration 33, L1 8.26244e-05, Linf 0.00488613, total time[s] 0.109582 +Converged at iteration 28, L1 8.93976e-05, Linf 0.00409321, total time[s] 0.091578 +Converged at iteration 24, L1 7.93652e-05, Linf 0.00281931, total time[s] 0.064615 +Converged at iteration 26, L1 8.24386e-05, Linf 0.00394243, total time[s] 0.095915 +Converged at iteration 40, L1 6.61788e-05, Linf 0.00407554, total time[s] 0.125093 +Converged at iteration 35, L1 9.22931e-05, Linf 0.00374196, total time[s] 0.10299 +Converged at iteration 30, L1 8.81633e-05, Linf 0.00417606, total time[s] 0.088904 +Converged at iteration 31, L1 6.17166e-05, Linf 0.00505621, total time[s] 0.091643 +Converged at iteration 26, L1 9.42732e-05, Linf 0.00573039, total time[s] 0.088134 +Converged at iteration 22, L1 6.38512e-05, Linf 0.00400071, total time[s] 0.066926 +Converged at iteration 21, L1 6.75016e-05, Linf 0.0037354, total time[s] 0.056279 +Converged at iteration 24, L1 8.86207e-05, Linf 0.00507746, total time[s] 0.080108 +Converged at iteration 28, L1 6.99048e-05, Linf 0.00440635, total time[s] 0.077686 +Converged at iteration 26, L1 8.23972e-05, Linf 0.0048918, total time[s] 0.084971 +Converged at iteration 22, L1 6.11757e-05, Linf 0.00352658, total time[s] 0.073575 +Converged at iteration 18, L1 8.80167e-05, Linf 0.00351118, total time[s] 0.060449 +Converged at iteration 31, L1 7.03663e-05, Linf 0.00266444, total time[s] 0.082813 +Converged at iteration 20, L1 8.30842e-05, Linf 0.00484565, total time[s] 0.05753 +Converged at iteration 24, L1 7.01063e-05, Linf 0.00488093, total time[s] 0.065063 +Converged at iteration 31, L1 9.15789e-05, Linf 0.00368807, total time[s] 0.110861 +Converged at iteration 26, L1 9.91287e-05, Linf 0.00427237, total time[s] 0.082083 +Converged at iteration 24, L1 7.70357e-05, Linf 0.00374178, total time[s] 0.068172 +Converged at iteration 23, L1 9.29891e-05, Linf 0.00447282, total time[s] 0.071495 +Converged at iteration 26, L1 7.03526e-05, Linf 0.00481516, total time[s] 0.081905 +Converged at iteration 29, L1 7.30997e-05, Linf 0.00492908, total time[s] 0.081174 +Converged at iteration 33, L1 9.96528e-05, Linf 0.00355311, total time[s] 0.095492 +Converged at iteration 31, L1 7.82408e-05, Linf 0.00337965, total time[s] 0.100624 +Converged at iteration 29, L1 7.44448e-05, Linf 0.00281193, total time[s] 0.086267 +Converged at iteration 32, L1 7.73644e-05, Linf 0.00342538, total time[s] 0.09537 +Converged at iteration 36, L1 7.56862e-05, Linf 0.00340169, total time[s] 0.10406 +Converged at iteration 33, L1 8.17892e-05, Linf 0.00493448, total time[s] 0.104279 +Converged at iteration 28, L1 8.71887e-05, Linf 0.00404996, total time[s] 0.075922 +Converged at iteration 24, L1 7.87399e-05, Linf 0.00273692, total time[s] 0.066921 +Converged at iteration 26, L1 8.23083e-05, Linf 0.00398468, total time[s] 0.078198 +Converged at iteration 40, L1 6.49389e-05, Linf 0.00415693, total time[s] 0.118956 +Converged at iteration 35, L1 9.51864e-05, Linf 0.00382342, total time[s] 0.094368 +Converged at iteration 35, L1 8.19217e-05, Linf 0.00208719, total time[s] 0.103903 +Converged at iteration 31, L1 6.13058e-05, Linf 0.00508891, total time[s] 0.102772 +Converged at iteration 26, L1 9.18437e-05, Linf 0.00570342, total time[s] 0.076512 +Converged at iteration 21, L1 9.7989e-05, Linf 0.00465745, total time[s] 0.070237 +Converged at iteration 21, L1 6.8997e-05, Linf 0.00388223, total time[s] 0.06316 +Converged at iteration 24, L1 8.41798e-05, Linf 0.00516445, total time[s] 0.083354 +Converged at iteration 28, L1 6.83003e-05, Linf 0.00440455, total time[s] 0.101642 +Converged at iteration 26, L1 8.26222e-05, Linf 0.00451452, total time[s] 0.078079 +Converged at iteration 21, L1 9.2817e-05, Linf 0.00434763, total time[s] 0.07734 +Converged at iteration 18, L1 7.8265e-05, Linf 0.00313444, total time[s] 0.058977 +Converged at iteration 31, L1 7.37087e-05, Linf 0.00267481, total time[s] 0.110389 +Converged at iteration 20, L1 8.25022e-05, Linf 0.00491822, total time[s] 0.069453 +Converged at iteration 24, L1 6.93716e-05, Linf 0.00496483, total time[s] 0.071554 +Converged at iteration 31, L1 7.39489e-05, Linf 0.00319526, total time[s] 0.132677 +Converged at iteration 26, L1 7.1089e-05, Linf 0.00384311, total time[s] 0.139967 +Converged at iteration 23, L1 9.50765e-05, Linf 0.00405756, total time[s] 0.080048 +Converged at iteration 23, L1 9.52442e-05, Linf 0.0052048, total time[s] 0.093188 +Converged at iteration 26, L1 6.94712e-05, Linf 0.00489816, total time[s] 0.091031 +Converged at iteration 29, L1 7.2016e-05, Linf 0.00492479, total time[s] 0.089609 +Converged at iteration 33, L1 7.00493e-05, Linf 0.00310873, total time[s] 0.223147 +Converged at iteration 31, L1 7.71272e-05, Linf 0.00311954, total time[s] 0.182651 +Converged at iteration 29, L1 7.6621e-05, Linf 0.00288502, total time[s] 0.125485 +Converged at iteration 32, L1 7.56802e-05, Linf 0.00337545, total time[s] 0.153077 +Converged at iteration 36, L1 7.11565e-05, Linf 0.00333986, total time[s] 0.176813 +Converged at iteration 33, L1 8.08576e-05, Linf 0.00498245, total time[s] 0.114117 +Converged at iteration 28, L1 8.50425e-05, Linf 0.00400425, total time[s] 0.100672 +Converged at iteration 24, L1 7.84052e-05, Linf 0.00259614, total time[s] 0.077967 +Converged at iteration 26, L1 8.29362e-05, Linf 0.00403009, total time[s] 0.069034 +Converged at iteration 40, L1 6.46535e-05, Linf 0.00411762, total time[s] 0.166008 +Converged at iteration 35, L1 9.45811e-05, Linf 0.00374777, total time[s] 0.12118 +Converged at iteration 30, L1 8.62979e-05, Linf 0.0041833, total time[s] 0.097646 +Converged at iteration 31, L1 6.13976e-05, Linf 0.0050584, total time[s] 0.089087 +Converged at iteration 26, L1 9.2955e-05, Linf 0.00571634, total time[s] 0.089454 +Converged at iteration 22, L1 6.16131e-05, Linf 0.00394786, total time[s] 0.064213 +Converged at iteration 21, L1 6.87623e-05, Linf 0.00381365, total time[s] 0.088695 +Converged at iteration 24, L1 8.74131e-05, Linf 0.0051206, total time[s] 0.067307 +Converged at iteration 28, L1 6.91414e-05, Linf 0.00440753, total time[s] 0.086847 +Converged at iteration 26, L1 8.26467e-05, Linf 0.0047041, total time[s] 0.073299 +Converged at iteration 22, L1 5.60522e-05, Linf 0.00328545, total time[s] 0.063183 +Converged at iteration 18, L1 8.32009e-05, Linf 0.00331745, total time[s] 0.061641 +Converged at iteration 31, L1 7.20345e-05, Linf 0.00266945, total time[s] 0.105006 +Converged at iteration 20, L1 8.26722e-05, Linf 0.00488153, total time[s] 0.061482 +Converged at iteration 24, L1 6.97552e-05, Linf 0.00488139, total time[s] 0.081165 +Converged at iteration 31, L1 8.45178e-05, Linf 0.00339978, total time[s] 0.08444 +Converged at iteration 26, L1 8.39666e-05, Linf 0.00404003, total time[s] 0.076839 +Converged at iteration 24, L1 7.09845e-05, Linf 0.00357597, total time[s] 0.064941 +Converged at iteration 23, L1 9.36321e-05, Linf 0.00451053, total time[s] 0.059604 +Converged at iteration 26, L1 6.99756e-05, Linf 0.0048585, total time[s] 0.069696 +Converged at iteration 29, L1 7.26355e-05, Linf 0.00493365, total time[s] 0.085699 +Converged at iteration 33, L1 8.51992e-05, Linf 0.00331574, total time[s] 0.104622 +Converged at iteration 31, L1 7.80032e-05, Linf 0.00328622, total time[s] 0.09574 +Converged at iteration 29, L1 7.5549e-05, Linf 0.0028558, total time[s] 0.096618 +Converged at iteration 32, L1 7.64622e-05, Linf 0.00339845, total time[s] 0.090692 +Converged at iteration 36, L1 7.40412e-05, Linf 0.0033702, total time[s] 0.091482 +Converged at iteration 33, L1 8.132e-05, Linf 0.00495861, total time[s] 0.084859 +Converged at iteration 28, L1 8.61309e-05, Linf 0.00398591, total time[s] 0.093476 +Converged at iteration 24, L1 7.85274e-05, Linf 0.00268021, total time[s] 0.064583 +Converged at iteration 26, L1 8.24457e-05, Linf 0.00400681, total time[s] 0.069359 +Converged at iteration 40, L1 6.50881e-05, Linf 0.00415896, total time[s] 0.108878 +Converged at iteration 35, L1 9.51959e-05, Linf 0.00382354, total time[s] 0.112798 +Converged at iteration 30, L1 7.97751e-05, Linf 0.00418545, total time[s] 0.099611 +Converged at iteration 31, L1 6.22516e-05, Linf 0.00506016, total time[s] 0.079612 +Converged at iteration 26, L1 9.18073e-05, Linf 0.00570318, total time[s] 0.092745 +Converged at iteration 21, L1 9.80556e-05, Linf 0.00465746, total time[s] 0.076662 +Converged at iteration 21, L1 6.89819e-05, Linf 0.00389119, total time[s] 0.057204 +Converged at iteration 24, L1 8.415e-05, Linf 0.00516456, total time[s] 0.079206 +Converged at iteration 28, L1 6.82982e-05, Linf 0.0044044, total time[s] 0.082358 +Converged at iteration 26, L1 8.29328e-05, Linf 0.0044904, total time[s] 0.106885 +Converged at iteration 21, L1 9.46361e-05, Linf 0.00750012, total time[s] 0.070458 +Converged at iteration 18, L1 7.82777e-05, Linf 0.00313441, total time[s] 0.050285 +Converged at iteration 31, L1 7.365e-05, Linf 0.00267476, total time[s] 0.086436 +Converged at iteration 20, L1 8.23918e-05, Linf 0.00491833, total time[s] 0.062248 +Converged at iteration 24, L1 6.93575e-05, Linf 0.00468689, total time[s] 0.068389 +Converged at iteration 31, L1 7.4094e-05, Linf 0.0031949, total time[s] 0.100982 +Converged at iteration 26, L1 7.09709e-05, Linf 0.00383689, total time[s] 0.095562 +Converged at iteration 23, L1 9.51957e-05, Linf 0.0040638, total time[s] 0.064975 +Converged at iteration 23, L1 9.46936e-05, Linf 0.00454481, total time[s] 0.075773 +Converged at iteration 26, L1 6.97479e-05, Linf 0.00489961, total time[s] 0.070443 +Converged at iteration 29, L1 7.21889e-05, Linf 0.00492378, total time[s] 0.075582 +Converged at iteration 33, L1 6.9914e-05, Linf 0.00312146, total time[s] 0.117918 +Converged at iteration 31, L1 7.64405e-05, Linf 0.00318234, total time[s] 0.11128 +Converged at iteration 29, L1 7.66008e-05, Linf 0.00288492, total time[s] 0.111274 +Converged at iteration 32, L1 7.58307e-05, Linf 0.00337513, total time[s] 0.093695 +Converged at iteration 36, L1 7.11253e-05, Linf 0.00333971, total time[s] 0.098343 +Converged at iteration 33, L1 8.08351e-05, Linf 0.00498249, total time[s] 0.085891 +Converged at iteration 28, L1 8.50361e-05, Linf 0.00400425, total time[s] 0.080831 +Converged at iteration 24, L1 7.84166e-05, Linf 0.00259805, total time[s] 0.075393 +Converged at iteration 26, L1 8.27409e-05, Linf 0.00402909, total time[s] 0.091857 +Converged at iteration 39, L1 9.98261e-05, Linf 0.00490256, total time[s] 0.123092 +Converged at iteration 35, L1 9.65036e-05, Linf 0.00386579, total time[s] 0.100284 +Converged at iteration 30, L1 7.14773e-05, Linf 0.00416604, total time[s] 0.095457 +Converged at iteration 31, L1 6.12379e-05, Linf 0.00506149, total time[s] 0.08978 +Converged at iteration 26, L1 9.0613e-05, Linf 0.00568589, total time[s] 0.082421 +Converged at iteration 21, L1 9.56587e-05, Linf 0.00460343, total time[s] 0.057467 +Converged at iteration 21, L1 6.81012e-05, Linf 0.00394678, total time[s] 0.059839 +Converged at iteration 24, L1 7.94881e-05, Linf 0.00513054, total time[s] 0.062199 +Converged at iteration 28, L1 6.75176e-05, Linf 0.0043937, total time[s] 0.098306 +Converged at iteration 26, L1 8.2057e-05, Linf 0.00428358, total time[s] 0.078939 +Converged at iteration 21, L1 8.52762e-05, Linf 0.00433439, total time[s] 0.059102 +Converged at iteration 18, L1 7.33881e-05, Linf 0.00296128, total time[s] 0.053059 +Converged at iteration 31, L1 7.53474e-05, Linf 0.00268045, total time[s] 0.084553 +Converged at iteration 20, L1 8.21693e-05, Linf 0.00495594, total time[s] 0.070573 +Converged at iteration 24, L1 6.89849e-05, Linf 0.005009, total time[s] 0.085559 +Converged at iteration 30, L1 9.41318e-05, Linf 0.00347743, total time[s] 0.092235 +Converged at iteration 25, L1 9.27391e-05, Linf 0.0046261, total time[s] 0.083301 +Converged at iteration 23, L1 8.53883e-05, Linf 0.00392282, total time[s] 0.090391 +Converged at iteration 23, L1 9.50795e-05, Linf 0.00457381, total time[s] 0.07474 +Converged at iteration 26, L1 6.92307e-05, Linf 0.00502049, total time[s] 0.079826 +Converged at iteration 29, L1 7.14427e-05, Linf 0.00490579, total time[s] 0.083317 +Converged at iteration 32, L1 8.68053e-05, Linf 0.003502, total time[s] 0.094441 +Converged at iteration 31, L1 7.27035e-05, Linf 0.00303803, total time[s] 0.108783 +Converged at iteration 29, L1 7.80019e-05, Linf 0.00291857, total time[s] 0.073705 +Converged at iteration 32, L1 7.58144e-05, Linf 0.00335442, total time[s] 0.087985 +Converged at iteration 35, L1 9.27219e-05, Linf 0.00402065, total time[s] 0.125239 +Converged at iteration 33, L1 8.03842e-05, Linf 0.0048867, total time[s] 0.086585 +Converged at iteration 28, L1 8.46463e-05, Linf 0.00398469, total time[s] 0.084986 +Converged at iteration 24, L1 7.85284e-05, Linf 0.0025395, total time[s] 0.074373 +Converged at iteration 26, L1 8.31549e-05, Linf 0.00406241, total time[s] 0.091344 +Converged at iteration 39, L1 9.93325e-05, Linf 0.00495925, total time[s] 0.108017 +Converged at iteration 35, L1 9.81874e-05, Linf 0.00391745, total time[s] 0.110158 +Converged at iteration 29, L1 9.70133e-05, Linf 0.00504534, total time[s] 0.086304 +Converged at iteration 31, L1 6.12581e-05, Linf 0.0050915, total time[s] 0.091123 +Converged at iteration 26, L1 8.94842e-05, Linf 0.00583618, total time[s] 0.080011 +Converged at iteration 21, L1 9.41284e-05, Linf 0.00455553, total time[s] 0.06643 +Converged at iteration 21, L1 6.62395e-05, Linf 0.00400002, total time[s] 0.061859 +Converged at iteration 24, L1 7.39161e-05, Linf 0.00524424, total time[s] 0.075829 +Converged at iteration 28, L1 6.55896e-05, Linf 0.00440025, total time[s] 0.094333 +Converged at iteration 26, L1 7.90281e-05, Linf 0.00408191, total time[s] 0.077795 +Converged at iteration 21, L1 7.83393e-05, Linf 0.00434519, total time[s] 0.059478 +Converged at iteration 18, L1 6.88464e-05, Linf 0.00284987, total time[s] 0.055929 +Converged at iteration 31, L1 7.71334e-05, Linf 0.00268404, total time[s] 0.093135 +Converged at iteration 20, L1 8.19443e-05, Linf 0.00499326, total time[s] 0.05373 +Converged at iteration 24, L1 6.89186e-05, Linf 0.00505648, total time[s] 0.068465 +Converged at iteration 30, L1 8.46155e-05, Linf 0.00329742, total time[s] 0.097679 +Converged at iteration 25, L1 8.1264e-05, Linf 0.00449031, total time[s] 0.086177 +Converged at iteration 23, L1 7.69926e-05, Linf 0.00380211, total time[s] 0.072123 +Converged at iteration 23, L1 9.57416e-05, Linf 0.00459558, total time[s] 0.0605 +Converged at iteration 26, L1 6.87562e-05, Linf 0.00496279, total time[s] 0.07889 +Converged at iteration 29, L1 7.19862e-05, Linf 0.00488383, total time[s] 0.088383 +Converged at iteration 32, L1 7.42484e-05, Linf 0.00336282, total time[s] 0.097949 +Converged at iteration 30, L1 9.4522e-05, Linf 0.00340476, total time[s] 0.101265 +Converged at iteration 29, L1 7.85233e-05, Linf 0.00294254, total time[s] 0.085565 +Converged at iteration 32, L1 7.42633e-05, Linf 0.00333423, total time[s] 0.106274 +Converged at iteration 35, L1 8.21718e-05, Linf 0.00391444, total time[s] 0.128002 +Converged at iteration 33, L1 7.98614e-05, Linf 0.00503117, total time[s] 0.09659 +Converged at iteration 28, L1 8.29965e-05, Linf 0.00396159, total time[s] 0.090542 +Converged at iteration 24, L1 7.86889e-05, Linf 0.00248295, total time[s] 0.077725 +Converged at iteration 26, L1 8.08955e-05, Linf 0.00406479, total time[s] 0.107501 +Converged at iteration 39, L1 9.89749e-05, Linf 0.00499839, total time[s] 0.123056 +Converged at iteration 35, L1 9.90552e-05, Linf 0.00395392, total time[s] 0.105816 +Converged at iteration 29, L1 8.50747e-05, Linf 0.00499814, total time[s] 0.090438 +Converged at iteration 31, L1 6.21708e-05, Linf 0.00509255, total time[s] 0.088171 +Converged at iteration 26, L1 8.94089e-05, Linf 0.00565475, total time[s] 0.079576 +Converged at iteration 21, L1 9.1472e-05, Linf 0.00454805, total time[s] 0.062005 +Converged at iteration 21, L1 6.4192e-05, Linf 0.00403617, total time[s] 0.072117 +Converged at iteration 24, L1 6.7864e-05, Linf 0.00527465, total time[s] 0.065617 +Converged at iteration 28, L1 6.26293e-05, Linf 0.00439765, total time[s] 0.086787 +Converged at iteration 26, L1 7.53656e-05, Linf 0.00390338, total time[s] 0.069427 +Converged at iteration 21, L1 7.35659e-05, Linf 0.00737185, total time[s] 0.065961 +Converged at iteration 18, L1 6.48573e-05, Linf 0.00281422, total time[s] 0.050945 +Converged at iteration 31, L1 7.81797e-05, Linf 0.00269279, total time[s] 0.079339 +Converged at iteration 20, L1 8.10763e-05, Linf 0.00503132, total time[s] 0.054003 +Converged at iteration 24, L1 6.83253e-05, Linf 0.00509939, total time[s] 0.075751 +Converged at iteration 30, L1 7.69405e-05, Linf 0.00311588, total time[s] 0.076793 +Converged at iteration 25, L1 7.24974e-05, Linf 0.00436685, total time[s] 0.088585 +Converged at iteration 23, L1 6.92746e-05, Linf 0.00369045, total time[s] 0.060999 +Converged at iteration 23, L1 9.6145e-05, Linf 0.00461165, total time[s] 0.090033 +Converged at iteration 26, L1 6.84567e-05, Linf 0.00498709, total time[s] 0.075754 +Converged at iteration 29, L1 7.071e-05, Linf 0.00480289, total time[s] 0.08737 +Converged at iteration 32, L1 6.73114e-05, Linf 0.00322494, total time[s] 0.083482 +Converged at iteration 30, L1 8.81578e-05, Linf 0.00324648, total time[s] 0.090952 +Converged at iteration 29, L1 7.94834e-05, Linf 0.00295661, total time[s] 0.078121 +Converged at iteration 32, L1 7.17478e-05, Linf 0.00330529, total time[s] 0.096824 +Converged at iteration 35, L1 7.00159e-05, Linf 0.00376151, total time[s] 0.092369 +Converged at iteration 33, L1 7.9305e-05, Linf 0.00505535, total time[s] 0.123686 +Converged at iteration 28, L1 8.16786e-05, Linf 0.00393968, total time[s] 0.077472 +Converged at iteration 24, L1 7.92784e-05, Linf 0.00242638, total time[s] 0.082379 +Converged at iteration 26, L1 7.78025e-05, Linf 0.00407115, total time[s] 0.076347 +Converged at iteration 39, L1 9.84993e-05, Linf 0.00504679, total time[s] 0.116434 +Converged at iteration 36, L1 6.76779e-05, Linf 0.00337199, total time[s] 0.124442 +Converged at iteration 29, L1 7.32176e-05, Linf 0.00492238, total time[s] 0.088115 +Converged at iteration 31, L1 6.11216e-05, Linf 0.00503974, total time[s] 0.089764 +Converged at iteration 26, L1 8.8024e-05, Linf 0.00564262, total time[s] 0.139643 +Converged at iteration 21, L1 8.9121e-05, Linf 0.00443545, total time[s] 0.139185 +Converged at iteration 21, L1 6.15739e-05, Linf 0.00405981, total time[s] 0.063552 +Converged at iteration 24, L1 6.11962e-05, Linf 0.00527378, total time[s] 0.114735 +Converged at iteration 27, L1 9.85612e-05, Linf 0.00549639, total time[s] 0.167334 +Converged at iteration 26, L1 6.90883e-05, Linf 0.00372584, total time[s] 0.075314 +Converged at iteration 21, L1 6.74193e-05, Linf 0.00428965, total time[s] 0.081465 +Converged at iteration 18, L1 6.07878e-05, Linf 0.00278932, total time[s] 0.052415 +Converged at iteration 31, L1 7.99081e-05, Linf 0.00269938, total time[s] 0.081236 +Converged at iteration 20, L1 8.04309e-05, Linf 0.00506957, total time[s] 0.057526 +Converged at iteration 24, L1 6.79493e-05, Linf 0.00534434, total time[s] 0.071222 +Converged at iteration 29, L1 9.9944e-05, Linf 0.00355822, total time[s] 0.100747 +Converged at iteration 25, L1 6.45917e-05, Linf 0.00426263, total time[s] 0.092995 +Converged at iteration 22, L1 9.90241e-05, Linf 0.00435059, total time[s] 0.058608 +Converged at iteration 23, L1 9.59783e-05, Linf 0.00461839, total time[s] 0.077633 +Converged at iteration 26, L1 6.80154e-05, Linf 0.00500582, total time[s] 0.072299 +Converged at iteration 29, L1 6.97703e-05, Linf 0.00473174, total time[s] 0.078172 +Converged at iteration 31, L1 8.66643e-05, Linf 0.00386741, total time[s] 0.084315 +Converged at iteration 30, L1 7.87537e-05, Linf 0.0031127, total time[s] 0.113582 +Converged at iteration 29, L1 8.05503e-05, Linf 0.00299854, total time[s] 0.093205 +Converged at iteration 31, L1 9.92845e-05, Linf 0.00394683, total time[s] 0.103647 +Converged at iteration 34, L1 9.01352e-05, Linf 0.00446544, total time[s] 0.113141 +Converged at iteration 33, L1 7.87717e-05, Linf 0.0050795, total time[s] 0.09533 +Converged at iteration 28, L1 8.05361e-05, Linf 0.00391791, total time[s] 0.076342 +Converged at iteration 24, L1 8.00989e-05, Linf 0.00236977, total time[s] 0.080684 +Converged at iteration 26, L1 7.33013e-05, Linf 0.00404205, total time[s] 0.078946 +Converged at iteration 39, L1 9.79321e-05, Linf 0.0051537, total time[s] 0.104248 +Converged at iteration 36, L1 6.83282e-05, Linf 0.00341924, total time[s] 0.100573 +Converged at iteration 29, L1 6.17796e-05, Linf 0.00481831, total time[s] 0.082931 +Converged at iteration 31, L1 6.09158e-05, Linf 0.00506496, total time[s] 0.081064 +Converged at iteration 26, L1 8.58684e-05, Linf 0.00561725, total time[s] 0.080254 +Converged at iteration 21, L1 8.72658e-05, Linf 0.00437818, total time[s] 0.063581 +Converged at iteration 21, L1 5.86991e-05, Linf 0.00405808, total time[s] 0.079879 +Converged at iteration 23, L1 9.45224e-05, Linf 0.00643392, total time[s] 0.063386 +Converged at iteration 27, L1 9.36804e-05, Linf 0.00549438, total time[s] 0.078721 +Converged at iteration 26, L1 6.44873e-05, Linf 0.00358721, total time[s] 0.083885 +Converged at iteration 21, L1 6.3063e-05, Linf 0.0042725, total time[s] 0.07175 +Converged at iteration 18, L1 5.70865e-05, Linf 0.00276438, total time[s] 0.080144 +Converged at iteration 31, L1 8.09603e-05, Linf 0.00270615, total time[s] 0.090723 +Converged at iteration 20, L1 7.91042e-05, Linf 0.0051086, total time[s] 0.081086 +Converged at iteration 24, L1 6.75601e-05, Linf 0.00520823, total time[s] 0.078237 +Converged at iteration 29, L1 9.28546e-05, Linf 0.0034241, total time[s] 0.083404 +Converged at iteration 24, L1 9.40222e-05, Linf 0.00546757, total time[s] 0.084146 +Converged at iteration 22, L1 9.16192e-05, Linf 0.00426708, total time[s] 0.0629 +Converged at iteration 23, L1 9.6605e-05, Linf 0.00461457, total time[s] 0.065637 +Converged at iteration 26, L1 6.80334e-05, Linf 0.00499813, total time[s] 0.076426 +Converged at iteration 29, L1 6.9278e-05, Linf 0.0046568, total time[s] 0.124932 +Converged at iteration 31, L1 7.7699e-05, Linf 0.00378203, total time[s] 0.099457 +Converged at iteration 30, L1 7.16408e-05, Linf 0.00299396, total time[s] 0.095393 +Converged at iteration 29, L1 8.16095e-05, Linf 0.0030266, total time[s] 0.089846 +Converged at iteration 31, L1 9.53957e-05, Linf 0.00386252, total time[s] 0.102642 +Converged at iteration 34, L1 7.65141e-05, Linf 0.00421843, total time[s] 0.103558 +Converged at iteration 33, L1 7.82327e-05, Linf 0.00510389, total time[s] 0.094419 +Converged at iteration 28, L1 7.93969e-05, Linf 0.00389611, total time[s] 0.084448 +Converged at iteration 24, L1 8.12748e-05, Linf 0.0023132, total time[s] 0.068572 +Converged at iteration 26, L1 6.87745e-05, Linf 0.00398763, total time[s] 0.076599 +Converged at iteration 39, L1 9.74319e-05, Linf 0.00508788, total time[s] 0.117817 +Converged at iteration 36, L1 6.89364e-05, Linf 0.00346746, total time[s] 0.123727 +Converged at iteration 28, L1 9.00771e-05, Linf 0.00582253, total time[s] 0.090203 +Converged at iteration 31, L1 6.13322e-05, Linf 0.00507087, total time[s] 0.096186 +Converged at iteration 26, L1 8.48926e-05, Linf 0.00566196, total time[s] 0.090767 +Converged at iteration 21, L1 8.55448e-05, Linf 0.00431832, total time[s] 0.066407 +Converged at iteration 20, L1 9.71755e-05, Linf 0.00535105, total time[s] 0.061955 +Converged at iteration 23, L1 8.53398e-05, Linf 0.00644671, total time[s] 0.093488 +Converged at iteration 27, L1 8.86284e-05, Linf 0.00548561, total time[s] 0.08443 +Converged at iteration 26, L1 6.07168e-05, Linf 0.00344014, total time[s] 0.085012 +Converged at iteration 21, L1 5.96098e-05, Linf 0.00425466, total time[s] 0.080371 +Converged at iteration 18, L1 5.42439e-05, Linf 0.00273937, total time[s] 0.068121 +Converged at iteration 31, L1 8.2554e-05, Linf 0.0027207, total time[s] 0.114995 +Converged at iteration 20, L1 7.76793e-05, Linf 0.00514799, total time[s] 0.056705 +Converged at iteration 24, L1 6.72771e-05, Linf 0.0052623, total time[s] 0.067235 +Converged at iteration 29, L1 8.58637e-05, Linf 0.00329232, total time[s] 0.081631 +Converged at iteration 24, L1 8.71674e-05, Linf 0.00542551, total time[s] 0.078005 +Converged at iteration 22, L1 8.51692e-05, Linf 0.00418744, total time[s] 0.066071 +Converged at iteration 23, L1 9.49145e-05, Linf 0.00460236, total time[s] 0.067688 +Converged at iteration 26, L1 6.72975e-05, Linf 0.00498697, total time[s] 0.068916 +Converged at iteration 29, L1 6.98566e-05, Linf 0.00604597, total time[s] 0.088646 +Converged at iteration 31, L1 7.35007e-05, Linf 0.00370519, total time[s] 0.110786 +Converged at iteration 29, L1 9.67438e-05, Linf 0.00341346, total time[s] 0.099618 +Converged at iteration 29, L1 8.26916e-05, Linf 0.00305526, total time[s] 0.087928 +Converged at iteration 31, L1 9.31365e-05, Linf 0.00375751, total time[s] 0.090852 +Converged at iteration 34, L1 6.50863e-05, Linf 0.00390285, total time[s] 0.101309 +Converged at iteration 33, L1 7.77581e-05, Linf 0.00512838, total time[s] 0.109659 +Converged at iteration 28, L1 7.88026e-05, Linf 0.00387278, total time[s] 0.076064 +Converged at iteration 24, L1 8.26668e-05, Linf 0.00225666, total time[s] 0.079801 +Converged at iteration 26, L1 6.4494e-05, Linf 0.00390895, total time[s] 0.087842 +Converged at iteration 39, L1 9.75177e-05, Linf 0.00518944, total time[s] 0.157291 +Converged at iteration 36, L1 6.96762e-05, Linf 0.00351737, total time[s] 0.101052 +Converged at iteration 28, L1 7.75447e-05, Linf 0.00569681, total time[s] 0.09685 +Converged at iteration 31, L1 6.19702e-05, Linf 0.00506708, total time[s] 0.125708 +Converged at iteration 26, L1 8.34843e-05, Linf 0.00557913, total time[s] 0.079319 +Converged at iteration 21, L1 8.37261e-05, Linf 0.00425688, total time[s] 0.055727 +Converged at iteration 20, L1 9.31929e-05, Linf 0.00534821, total time[s] 0.071986 +Converged at iteration 23, L1 7.62247e-05, Linf 0.00640967, total time[s] 0.081255 +Converged at iteration 27, L1 8.3548e-05, Linf 0.00547181, total time[s] 0.101675 +Converged at iteration 26, L1 5.77556e-05, Linf 0.00329779, total time[s] 0.128826 +Converged at iteration 21, L1 5.68956e-05, Linf 0.0042625, total time[s] 0.075769 +Converged at iteration 18, L1 5.14964e-05, Linf 0.00271434, total time[s] 0.061195 +Converged at iteration 31, L1 8.35981e-05, Linf 0.00271977, total time[s] 0.126581 +Converged at iteration 20, L1 7.66253e-05, Linf 0.00518853, total time[s] 0.06303 +Converged at iteration 24, L1 6.75706e-05, Linf 0.00531268, total time[s] 0.079128 +Converged at iteration 29, L1 7.97233e-05, Linf 0.0031726, total time[s] 0.080452 +Converged at iteration 24, L1 8.16523e-05, Linf 0.0053911, total time[s] 0.076777 +Converged at iteration 22, L1 7.97394e-05, Linf 0.00411289, total time[s] 0.076192 +Converged at iteration 23, L1 9.33523e-05, Linf 0.00457841, total time[s] 0.067624 +Converged at iteration 26, L1 6.69704e-05, Linf 0.00495521, total time[s] 0.081798 +Converged at iteration 29, L1 6.8291e-05, Linf 0.00444801, total time[s] 0.088758 +Converged at iteration 31, L1 6.53912e-05, Linf 0.00363478, total time[s] 0.084158 +Converged at iteration 29, L1 8.95763e-05, Linf 0.00335141, total time[s] 0.08501 +Converged at iteration 29, L1 8.39688e-05, Linf 0.00308357, total time[s] 0.081835 +Converged at iteration 31, L1 8.89622e-05, Linf 0.00363976, total time[s] 0.1186 +Converged at iteration 33, L1 8.60706e-05, Linf 0.00464628, total time[s] 0.093858 +Converged at iteration 33, L1 7.74255e-05, Linf 0.00515186, total time[s] 0.092467 +Converged at iteration 28, L1 7.77931e-05, Linf 0.00385022, total time[s] 0.077282 +Converged at iteration 24, L1 8.4022e-05, Linf 0.00220012, total time[s] 0.083356 +Converged at iteration 25, L1 9.46745e-05, Linf 0.00483635, total time[s] 0.090074 +Converged at iteration 39, L1 9.69496e-05, Linf 0.00523584, total time[s] 0.167815 +Converged at iteration 36, L1 7.00456e-05, Linf 0.00356731, total time[s] 0.124699 +Converged at iteration 28, L1 6.61073e-05, Linf 0.00553256, total time[s] 0.085561 +Converged at iteration 31, L1 6.08942e-05, Linf 0.00506841, total time[s] 0.100354 +Converged at iteration 26, L1 8.23489e-05, Linf 0.00555919, total time[s] 0.07713 +Converged at iteration 21, L1 8.20697e-05, Linf 0.00419376, total time[s] 0.07326 +Converged at iteration 20, L1 8.92502e-05, Linf 0.00537705, total time[s] 0.115619 +Converged at iteration 23, L1 6.81123e-05, Linf 0.00642405, total time[s] 0.074216 +Converged at iteration 27, L1 7.85478e-05, Linf 0.00544932, total time[s] 0.16708 +Converged at iteration 25, L1 9.5568e-05, Linf 0.00419456, total time[s] 0.08847 +Converged at iteration 21, L1 5.42022e-05, Linf 0.00422124, total time[s] 0.073995 +Converged at iteration 17, L1 9.93845e-05, Linf 0.0042369, total time[s] 0.058206 +Converged at iteration 31, L1 8.47674e-05, Linf 0.00272807, total time[s] 0.088747 +Converged at iteration 20, L1 7.43627e-05, Linf 0.00522828, total time[s] 0.076254 +Converged at iteration 24, L1 6.65485e-05, Linf 0.00529001, total time[s] 0.07591 +Converged at iteration 29, L1 7.46211e-05, Linf 0.0030527, total time[s] 0.086459 +Converged at iteration 24, L1 7.67551e-05, Linf 0.00536443, total time[s] 0.079819 +Converged at iteration 22, L1 7.51506e-05, Linf 0.00404215, total time[s] 0.085045 +Converged at iteration 23, L1 9.10689e-05, Linf 0.00454445, total time[s] 0.068977 +Converged at iteration 26, L1 6.67693e-05, Linf 0.00490853, total time[s] 0.075725 +Converged at iteration 29, L1 6.7837e-05, Linf 0.00433455, total time[s] 0.154639 +Converged at iteration 30, L1 9.71264e-05, Linf 0.00468991, total time[s] 0.084782 +Converged at iteration 29, L1 8.37515e-05, Linf 0.00323255, total time[s] 0.151474 +Converged at iteration 29, L1 8.46629e-05, Linf 0.00311102, total time[s] 0.094732 +Converged at iteration 31, L1 8.51783e-05, Linf 0.00349928, total time[s] 0.109713 +Converged at iteration 33, L1 7.32421e-05, Linf 0.00427115, total time[s] 0.141879 +Converged at iteration 33, L1 7.65754e-05, Linf 0.00517686, total time[s] 0.125434 +Converged at iteration 28, L1 7.60249e-05, Linf 0.00382802, total time[s] 0.161576 +Converged at iteration 24, L1 8.56827e-05, Linf 0.00214352, total time[s] 0.127496 +Converged at iteration 25, L1 8.91014e-05, Linf 0.004753, total time[s] 0.132015 +Converged at iteration 39, L1 9.56002e-05, Linf 0.00528293, total time[s] 0.105857 +Converged at iteration 36, L1 7.05009e-05, Linf 0.00362804, total time[s] 0.110476 +Converged at iteration 28, L1 5.57159e-05, Linf 0.00533866, total time[s] 0.078792 +Converged at iteration 31, L1 6.05747e-05, Linf 0.00506984, total time[s] 0.142967 +Converged at iteration 26, L1 8.1068e-05, Linf 0.00553876, total time[s] 0.118181 +Converged at iteration 21, L1 8.05716e-05, Linf 0.00412901, total time[s] 0.063069 +Converged at iteration 20, L1 8.55292e-05, Linf 0.00536627, total time[s] 0.101773 +Converged at iteration 23, L1 6.04455e-05, Linf 0.00635653, total time[s] 0.097309 +Converged at iteration 27, L1 7.35223e-05, Linf 0.0054172, total time[s] 0.084236 +Converged at iteration 25, L1 9.19153e-05, Linf 0.0041788, total time[s] 0.070373 +Converged at iteration 21, L1 5.18773e-05, Linf 0.00420787, total time[s] 0.058598 +Converged at iteration 17, L1 9.61583e-05, Linf 0.00420345, total time[s] 0.06175 +Converged at iteration 31, L1 8.59511e-05, Linf 0.00273262, total time[s] 0.104038 +Converged at iteration 20, L1 7.34193e-05, Linf 0.00526656, total time[s] 0.069491 +Converged at iteration 24, L1 6.57617e-05, Linf 0.00542839, total time[s] 0.071871 +Converged at iteration 29, L1 6.97971e-05, Linf 0.00294501, total time[s] 0.100052 +Converged at iteration 24, L1 7.25e-05, Linf 0.00534051, total time[s] 0.072276 +Converged at iteration 22, L1 7.22655e-05, Linf 0.00397418, total time[s] 0.121812 +Converged at iteration 23, L1 8.91658e-05, Linf 0.0045014, total time[s] 0.130972 +Converged at iteration 26, L1 6.63213e-05, Linf 0.00484591, total time[s] 0.079894 +Converged at iteration 29, L1 6.70065e-05, Linf 0.00422124, total time[s] 0.102992 +Converged at iteration 30, L1 9.22044e-05, Linf 0.00463087, total time[s] 0.098821 +Converged at iteration 29, L1 7.81434e-05, Linf 0.00315172, total time[s] 0.091563 +Converged at iteration 29, L1 8.58259e-05, Linf 0.00314018, total time[s] 0.087668 +Converged at iteration 31, L1 8.19585e-05, Linf 0.00335999, total time[s] 0.08126 +Converged at iteration 32, L1 9.98116e-05, Linf 0.00510979, total time[s] 0.115854 +Converged at iteration 33, L1 7.61256e-05, Linf 0.0052013, total time[s] 0.099842 +Converged at iteration 28, L1 7.51885e-05, Linf 0.00380512, total time[s] 0.124865 +Converged at iteration 24, L1 8.74704e-05, Linf 0.00208679, total time[s] 0.090034 +Converged at iteration 25, L1 8.41264e-05, Linf 0.00464679, total time[s] 0.086135 +Converged at iteration 39, L1 9.60652e-05, Linf 0.0053301, total time[s] 0.143243 +Converged at iteration 36, L1 7.09005e-05, Linf 0.00367117, total time[s] 0.141721 +Converged at iteration 27, L1 8.81738e-05, Linf 0.00647482, total time[s] 0.091852 +Converged at iteration 31, L1 6.04649e-05, Linf 0.00507127, total time[s] 0.085572 +Converged at iteration 26, L1 7.98376e-05, Linf 0.00546051, total time[s] 0.098281 +Converged at iteration 21, L1 7.91615e-05, Linf 0.00406243, total time[s] 0.057474 +Converged at iteration 20, L1 8.21306e-05, Linf 0.00534089, total time[s] 0.08281 +Converged at iteration 23, L1 5.39174e-05, Linf 0.00628394, total time[s] 0.075274 +Converged at iteration 27, L1 6.86353e-05, Linf 0.00538875, total time[s] 0.075466 +Converged at iteration 25, L1 8.82629e-05, Linf 0.00416293, total time[s] 0.073962 +Converged at iteration 21, L1 4.9507e-05, Linf 0.00419764, total time[s] 0.066974 +Converged at iteration 17, L1 9.32932e-05, Linf 0.00415717, total time[s] 0.049678 +Converged at iteration 31, L1 8.76186e-05, Linf 0.00276892, total time[s] 0.128299 +Converged at iteration 20, L1 7.18304e-05, Linf 0.00528993, total time[s] 0.06195 +Converged at iteration 24, L1 6.61376e-05, Linf 0.00528639, total time[s] 0.066182 +Converged at iteration 28, L1 9.80689e-05, Linf 0.00374858, total time[s] 0.084796 +Converged at iteration 24, L1 6.88557e-05, Linf 0.00531899, total time[s] 0.064904 +Converged at iteration 22, L1 6.82706e-05, Linf 0.00391028, total time[s] 0.06235 +Converged at iteration 23, L1 8.7672e-05, Linf 0.00444966, total time[s] 0.0723 +Converged at iteration 26, L1 6.59518e-05, Linf 0.00476655, total time[s] 0.088451 +Converged at iteration 29, L1 6.68233e-05, Linf 0.00411577, total time[s] 0.125166 +Converged at iteration 30, L1 8.77771e-05, Linf 0.00462004, total time[s] 0.09984 +Converged at iteration 29, L1 7.33707e-05, Linf 0.00307686, total time[s] 0.087367 +Converged at iteration 29, L1 8.66677e-05, Linf 0.00315668, total time[s] 0.105718 +Converged at iteration 31, L1 7.89089e-05, Linf 0.00322083, total time[s] 0.099936 +Converged at iteration 32, L1 8.68946e-05, Linf 0.00466208, total time[s] 0.108131 +Converged at iteration 33, L1 7.54947e-05, Linf 0.00522545, total time[s] 0.091416 +Converged at iteration 28, L1 7.36152e-05, Linf 0.00374258, total time[s] 0.088242 +Converged at iteration 24, L1 8.93917e-05, Linf 0.0020377, total time[s] 0.077811 +Converged at iteration 25, L1 7.95223e-05, Linf 0.00455362, total time[s] 0.072626 +Converged at iteration 39, L1 9.42774e-05, Linf 0.00537626, total time[s] 0.12418 +Converged at iteration 36, L1 7.18508e-05, Linf 0.00372457, total time[s] 0.13024 +Converged at iteration 27, L1 7.57613e-05, Linf 0.00624076, total time[s] 0.07476 +Converged at iteration 31, L1 6.0554e-05, Linf 0.00507259, total time[s] 0.091933 +Converged at iteration 26, L1 7.86492e-05, Linf 0.00549652, total time[s] 0.078686 +Converged at iteration 21, L1 7.76078e-05, Linf 0.00399475, total time[s] 0.076048 +Converged at iteration 20, L1 7.82362e-05, Linf 0.0053028, total time[s] 0.06378 +Converged at iteration 22, L1 9.59038e-05, Linf 0.00777165, total time[s] 0.096268 +Converged at iteration 27, L1 6.35928e-05, Linf 0.00530451, total time[s] 0.080365 +Converged at iteration 25, L1 8.60061e-05, Linf 0.00414693, total time[s] 0.081632 +Converged at iteration 20, L1 9.77199e-05, Linf 0.00557921, total time[s] 0.05755 +Converged at iteration 17, L1 9.08536e-05, Linf 0.00410456, total time[s] 0.052113 +Converged at iteration 31, L1 8.84233e-05, Linf 0.002723, total time[s] 0.120169 +Converged at iteration 20, L1 6.99648e-05, Linf 0.00533872, total time[s] 0.054309 +Converged at iteration 24, L1 6.49825e-05, Linf 0.00550175, total time[s] 0.167935 +Converged at iteration 28, L1 9.26468e-05, Linf 0.00369368, total time[s] 0.098104 +Converged at iteration 24, L1 6.54528e-05, Linf 0.00530136, total time[s] 0.067993 +Converged at iteration 22, L1 6.54105e-05, Linf 0.00384816, total time[s] 0.069409 +Converged at iteration 23, L1 8.63247e-05, Linf 0.0043907, total time[s] 0.068277 +Converged at iteration 26, L1 6.55981e-05, Linf 0.00467845, total time[s] 0.095255 +Converged at iteration 29, L1 6.61721e-05, Linf 0.00401949, total time[s] 0.088021 +Converged at iteration 30, L1 8.39655e-05, Linf 0.00461203, total time[s] 0.112365 +Converged at iteration 29, L1 6.93259e-05, Linf 0.00300516, total time[s] 0.111062 +Converged at iteration 29, L1 8.82373e-05, Linf 0.00321319, total time[s] 0.111574 +Converged at iteration 31, L1 7.64277e-05, Linf 0.00309853, total time[s] 0.111479 +Converged at iteration 32, L1 7.6978e-05, Linf 0.00420647, total time[s] 0.107226 +Converged at iteration 33, L1 7.52159e-05, Linf 0.00526023, total time[s] 0.090553 +Converged at iteration 28, L1 7.24613e-05, Linf 0.00380043, total time[s] 0.088345 +Converged at iteration 24, L1 9.12518e-05, Linf 0.0019724, total time[s] 0.073273 +Converged at iteration 25, L1 7.53381e-05, Linf 0.00444407, total time[s] 0.114153 +Converged at iteration 39, L1 9.36375e-05, Linf 0.00542285, total time[s] 0.103609 +Converged at iteration 36, L1 7.20388e-05, Linf 0.00377914, total time[s] 0.10421 +Converged at iteration 27, L1 6.52225e-05, Linf 0.00598581, total time[s] 0.087222 +Converged at iteration 31, L1 6.09634e-05, Linf 0.0050737, total time[s] 0.096692 +Converged at iteration 26, L1 7.76467e-05, Linf 0.00547478, total time[s] 0.089542 +Converged at iteration 21, L1 7.58828e-05, Linf 0.00392501, total time[s] 0.067048 +Converged at iteration 20, L1 7.46988e-05, Linf 0.00521703, total time[s] 0.061098 +Converged at iteration 22, L1 8.7557e-05, Linf 0.00764225, total time[s] 0.062419 +Converged at iteration 27, L1 5.89432e-05, Linf 0.00522016, total time[s] 0.089226 +Converged at iteration 25, L1 8.25953e-05, Linf 0.00413087, total time[s] 0.097098 +Converged at iteration 20, L1 9.49745e-05, Linf 0.00560614, total time[s] 0.130142 +Converged at iteration 17, L1 8.83037e-05, Linf 0.00402853, total time[s] 0.070428 +Converged at iteration 31, L1 8.93473e-05, Linf 0.00274905, total time[s] 0.133698 +Converged at iteration 20, L1 6.88478e-05, Linf 0.0053706, total time[s] 0.074899 +Converged at iteration 24, L1 6.44674e-05, Linf 0.00545792, total time[s] 0.108886 +Converged at iteration 28, L1 8.76978e-05, Linf 0.00361918, total time[s] 0.084187 +Converged at iteration 24, L1 6.23084e-05, Linf 0.00528279, total time[s] 0.088797 +Converged at iteration 22, L1 6.31303e-05, Linf 0.00378868, total time[s] 0.072157 +Converged at iteration 23, L1 8.5464e-05, Linf 0.00432605, total time[s] 0.091573 +Converged at iteration 26, L1 6.52351e-05, Linf 0.00457978, total time[s] 0.089953 +Converged at iteration 29, L1 6.56112e-05, Linf 0.00393616, total time[s] 0.083534 +Converged at iteration 30, L1 8.09608e-05, Linf 0.00457233, total time[s] 0.083834 +Converged at iteration 29, L1 6.59294e-05, Linf 0.0029393, total time[s] 0.106122 +Converged at iteration 29, L1 8.8786e-05, Linf 0.0032311, total time[s] 0.08845 +Converged at iteration 31, L1 7.32737e-05, Linf 0.00298251, total time[s] 0.100031 +Converged at iteration 32, L1 6.73012e-05, Linf 0.00374869, total time[s] 0.152491 +Converged at iteration 33, L1 7.55985e-05, Linf 0.0052737, total time[s] 0.104823 +Converged at iteration 28, L1 7.13325e-05, Linf 0.00372937, total time[s] 0.097047 +Converged at iteration 24, L1 9.29261e-05, Linf 0.00191465, total time[s] 0.072766 +Converged at iteration 25, L1 7.12938e-05, Linf 0.00431468, total time[s] 0.066197 +Converged at iteration 39, L1 9.30544e-05, Linf 0.0054679, total time[s] 0.118093 +Converged at iteration 36, L1 7.19902e-05, Linf 0.00387895, total time[s] 0.14476 +Converged at iteration 27, L1 5.62745e-05, Linf 0.00574301, total time[s] 0.157165 +Converged at iteration 31, L1 6.01135e-05, Linf 0.00507455, total time[s] 0.213231 +Converged at iteration 26, L1 7.62064e-05, Linf 0.00545193, total time[s] 0.093247 +Converged at iteration 21, L1 7.44955e-05, Linf 0.00385372, total time[s] 0.091723 +Converged at iteration 20, L1 7.16584e-05, Linf 0.00521785, total time[s] 0.068529 +Converged at iteration 22, L1 7.93391e-05, Linf 0.00755949, total time[s] 0.091479 +Converged at iteration 26, L1 9.66686e-05, Linf 0.00647117, total time[s] 0.099103 +Converged at iteration 25, L1 7.88269e-05, Linf 0.00411476, total time[s] 0.12439 +Converged at iteration 20, L1 9.229e-05, Linf 0.00557037, total time[s] 0.074044 +Converged at iteration 17, L1 8.59616e-05, Linf 0.00394934, total time[s] 0.052703 +Converged at iteration 31, L1 9.06167e-05, Linf 0.00275361, total time[s] 0.114672 +Converged at iteration 20, L1 6.76911e-05, Linf 0.00539793, total time[s] 0.115911 +Converged at iteration 24, L1 6.32036e-05, Linf 0.00554169, total time[s] 0.11745 +Converged at iteration 28, L1 8.34001e-05, Linf 0.00354489, total time[s] 0.098455 +Converged at iteration 24, L1 5.94242e-05, Linf 0.00526135, total time[s] 0.073325 +Converged at iteration 21, L1 9.94038e-05, Linf 0.00470673, total time[s] 0.072836 +Converged at iteration 23, L1 8.3751e-05, Linf 0.00425679, total time[s] 0.066247 +Converged at iteration 26, L1 6.49104e-05, Linf 0.00447267, total time[s] 0.135699 +Converged at iteration 28, L1 9.99786e-05, Linf 0.00589907, total time[s] 0.124955 +Converged at iteration 30, L1 7.84979e-05, Linf 0.00460852, total time[s] 0.107677 +Converged at iteration 28, L1 9.76935e-05, Linf 0.00357581, total time[s] 0.096613 +Converged at iteration 29, L1 8.9477e-05, Linf 0.00326288, total time[s] 0.113435 +Converged at iteration 31, L1 7.0895e-05, Linf 0.00286806, total time[s] 0.089716 +Converged at iteration 31, L1 9.59611e-05, Linf 0.00462244, total time[s] 0.176579 +Converged at iteration 33, L1 7.44952e-05, Linf 0.00529773, total time[s] 0.148405 +Converged at iteration 28, L1 7.00589e-05, Linf 0.00370451, total time[s] 0.124324 +Converged at iteration 24, L1 9.36897e-05, Linf 0.00185644, total time[s] 0.071506 +Converged at iteration 25, L1 6.75211e-05, Linf 0.00417216, total time[s] 0.09138 +Converged at iteration 40, L1 6.80645e-05, Linf 0.00367696, total time[s] 0.11813 +Converged at iteration 35, L1 7.63574e-05, Linf 0.00339723, total time[s] 0.107045 +Converged at iteration 30, L1 9.67628e-05, Linf 0.00435567, total time[s] 0.105042 +Converged at iteration 31, L1 6.22321e-05, Linf 0.0050025, total time[s] 0.100497 +Converged at iteration 27, L1 6.26183e-05, Linf 0.00499557, total time[s] 0.074756 +Converged at iteration 22, L1 8.58754e-05, Linf 0.00448863, total time[s] 0.061292 +Converged at iteration 20, L1 9.60225e-05, Linf 0.00397846, total time[s] 0.053149 +Converged at iteration 24, L1 8.83998e-05, Linf 0.00480209, total time[s] 0.062723 +Converged at iteration 28, L1 7.40237e-05, Linf 0.00444859, total time[s] 0.092617 +Converged at iteration 26, L1 8.1351e-05, Linf 0.00546683, total time[s] 0.095175 +Converged at iteration 22, L1 7.40085e-05, Linf 0.00508705, total time[s] 0.06397 +Converged at iteration 19, L1 6.63296e-05, Linf 0.00393093, total time[s] 0.054311 +Converged at iteration 30, L1 7.97954e-05, Linf 0.00329635, total time[s] 0.095393 +Converged at iteration 20, L1 8.4765e-05, Linf 0.00454706, total time[s] 0.077125 +Converged at iteration 24, L1 7.10837e-05, Linf 0.00463275, total time[s] 0.084028 +Converged at iteration 31, L1 8.93551e-05, Linf 0.00569497, total time[s] 0.097956 +Converged at iteration 27, L1 9.91608e-05, Linf 0.00569798, total time[s] 0.11853 +Converged at iteration 24, L1 8.79025e-05, Linf 0.00465047, total time[s] 0.074744 +Converged at iteration 23, L1 9.22566e-05, Linf 0.00410189, total time[s] 0.079663 +Converged at iteration 26, L1 7.22312e-05, Linf 0.00446076, total time[s] 0.086652 +Converged at iteration 29, L1 7.81437e-05, Linf 0.00479524, total time[s] 0.123815 +Converged at iteration 34, L1 7.09534e-05, Linf 0.00422675, total time[s] 0.150126 +Converged at iteration 30, L1 9.3949e-05, Linf 0.00442584, total time[s] 0.107631 +Converged at iteration 28, L1 9.49895e-05, Linf 0.00311064, total time[s] 0.107644 +Converged at iteration 32, L1 9.39571e-05, Linf 0.00374072, total time[s] 0.116238 +Converged at iteration 37, L1 7.33871e-05, Linf 0.00327869, total time[s] 0.146543 +Converged at iteration 33, L1 8.45263e-05, Linf 0.00469105, total time[s] 0.15253 +Converged at iteration 28, L1 9.65497e-05, Linf 0.00430199, total time[s] 0.0729 +Converged at iteration 24, L1 8.82903e-05, Linf 0.00325073, total time[s] 0.083017 +Converged at iteration 26, L1 8.98149e-05, Linf 0.00383999, total time[s] 0.103607 +Converged at iteration 40, L1 6.70912e-05, Linf 0.00383054, total time[s] 0.113887 +Converged at iteration 35, L1 8.23637e-05, Linf 0.00351907, total time[s] 0.12542 +Converged at iteration 30, L1 9.62115e-05, Linf 0.00422176, total time[s] 0.089029 +Converged at iteration 31, L1 6.18364e-05, Linf 0.00501467, total time[s] 0.100103 +Converged at iteration 27, L1 6.00641e-05, Linf 0.00494139, total time[s] 0.08257 +Converged at iteration 22, L1 7.71088e-05, Linf 0.00430645, total time[s] 0.072719 +Converged at iteration 21, L1 6.27967e-05, Linf 0.0033629, total time[s] 0.056108 +Converged at iteration 24, L1 9.04796e-05, Linf 0.00488886, total time[s] 0.071794 +Converged at iteration 28, L1 7.43179e-05, Linf 0.00444376, total time[s] 0.090568 +Converged at iteration 26, L1 8.16686e-05, Linf 0.00550849, total time[s] 0.104679 +Converged at iteration 22, L1 7.26954e-05, Linf 0.00482878, total time[s] 0.065709 +Converged at iteration 19, L1 5.91174e-05, Linf 0.00361616, total time[s] 0.061531 +Converged at iteration 30, L1 8.85315e-05, Linf 0.00330314, total time[s] 0.088023 +Converged at iteration 20, L1 8.51824e-05, Linf 0.00465237, total time[s] 0.056156 +Converged at iteration 24, L1 7.19914e-05, Linf 0.00468216, total time[s] 0.089491 +Converged at iteration 31, L1 9.33346e-05, Linf 0.00531398, total time[s] 0.089561 +Converged at iteration 27, L1 9.88938e-05, Linf 0.00537766, total time[s] 0.219083 +Converged at iteration 24, L1 8.68449e-05, Linf 0.00451261, total time[s] 0.071777 +Converged at iteration 23, L1 9.25849e-05, Linf 0.00421968, total time[s] 0.063642 +Converged at iteration 26, L1 7.18915e-05, Linf 0.00456738, total time[s] 0.083692 +Converged at iteration 29, L1 7.63166e-05, Linf 0.00485466, total time[s] 0.134506 +Converged at iteration 34, L1 7.857e-05, Linf 0.00426167, total time[s] 0.169528 +Converged at iteration 31, L1 6.91663e-05, Linf 0.00361748, total time[s] 0.097326 +Converged at iteration 28, L1 9.86167e-05, Linf 0.00321119, total time[s] 0.083982 +Converged at iteration 32, L1 8.58024e-05, Linf 0.00362295, total time[s] 0.135321 +Converged at iteration 36, L1 9.57578e-05, Linf 0.00369313, total time[s] 0.120796 +Converged at iteration 33, L1 8.39661e-05, Linf 0.00478543, total time[s] 0.097991 +Converged at iteration 28, L1 9.33353e-05, Linf 0.00419564, total time[s] 0.085124 +Converged at iteration 24, L1 8.21743e-05, Linf 0.00304608, total time[s] 0.075039 +Converged at iteration 26, L1 8.69622e-05, Linf 0.00389474, total time[s] 0.069133 +Converged at iteration 40, L1 6.83898e-05, Linf 0.00375256, total time[s] 0.119977 +Converged at iteration 35, L1 7.91603e-05, Linf 0.00345687, total time[s] 0.107085 +Converged at iteration 30, L1 9.77009e-05, Linf 0.00426847, total time[s] 0.171381 +Converged at iteration 31, L1 6.20206e-05, Linf 0.00503181, total time[s] 0.130021 +Converged at iteration 27, L1 6.15932e-05, Linf 0.00496935, total time[s] 0.130422 +Converged at iteration 22, L1 8.14295e-05, Linf 0.00439807, total time[s] 0.111154 +Converged at iteration 20, L1 9.86139e-05, Linf 0.00415913, total time[s] 0.069288 +Converged at iteration 24, L1 9.07162e-05, Linf 0.00485526, total time[s] 0.118639 +Converged at iteration 28, L1 7.41426e-05, Linf 0.0044521, total time[s] 0.095905 +Converged at iteration 26, L1 8.06072e-05, Linf 0.00550187, total time[s] 0.132328 +Converged at iteration 22, L1 7.26463e-05, Linf 0.00495074, total time[s] 0.080642 +Converged at iteration 19, L1 6.30626e-05, Linf 0.00378338, total time[s] 0.081869 +Converged at iteration 30, L1 8.38715e-05, Linf 0.00330001, total time[s] 0.120007 +Converged at iteration 20, L1 8.47852e-05, Linf 0.00460054, total time[s] 0.060246 +Converged at iteration 24, L1 7.18115e-05, Linf 0.00464818, total time[s] 0.149479 +Converged at iteration 31, L1 9.12118e-05, Linf 0.00556177, total time[s] 0.100896 +Converged at iteration 27, L1 9.94057e-05, Linf 0.00562166, total time[s] 0.111375 +Converged at iteration 24, L1 8.76212e-05, Linf 0.00459823, total time[s] 0.097563 +Converged at iteration 23, L1 9.25101e-05, Linf 0.00415735, total time[s] 0.073562 +Converged at iteration 26, L1 7.20924e-05, Linf 0.00451198, total time[s] 0.073414 +Converged at iteration 29, L1 7.74071e-05, Linf 0.00482513, total time[s] 0.075985 +Converged at iteration 34, L1 7.53198e-05, Linf 0.00428332, total time[s] 0.137773 +Converged at iteration 30, L1 9.72594e-05, Linf 0.00446032, total time[s] 0.113766 +Converged at iteration 28, L1 9.63641e-05, Linf 0.00316014, total time[s] 0.097144 +Converged at iteration 32, L1 8.95264e-05, Linf 0.00368201, total time[s] 0.122194 +Converged at iteration 37, L1 7.16346e-05, Linf 0.00315484, total time[s] 0.128984 +Converged at iteration 33, L1 8.42741e-05, Linf 0.00479011, total time[s] 0.125561 +Converged at iteration 28, L1 9.50782e-05, Linf 0.00424725, total time[s] 0.086225 +Converged at iteration 24, L1 8.45472e-05, Linf 0.00314838, total time[s] 0.08127 +Converged at iteration 26, L1 8.85956e-05, Linf 0.00386847, total time[s] 0.104759 +Converged at iteration 40, L1 6.73954e-05, Linf 0.00535013, total time[s] 0.150123 +Converged at iteration 35, L1 8.60205e-05, Linf 0.00362237, total time[s] 0.458712 +Converged at iteration 30, L1 9.26889e-05, Linf 0.00418561, total time[s] 0.123941 +Converged at iteration 31, L1 6.26456e-05, Linf 0.00504427, total time[s] 0.107241 +Converged at iteration 26, L1 9.90916e-05, Linf 0.00572902, total time[s] 0.14451 +Converged at iteration 22, L1 7.29641e-05, Linf 0.00421379, total time[s] 0.070938 +Converged at iteration 21, L1 6.38155e-05, Linf 0.00342575, total time[s] 0.083377 +Converged at iteration 24, L1 8.96716e-05, Linf 0.00495203, total time[s] 0.095434 +Converged at iteration 28, L1 7.38185e-05, Linf 0.00442701, total time[s] 0.105272 +Converged at iteration 26, L1 8.02925e-05, Linf 0.00539943, total time[s] 0.098574 +Converged at iteration 22, L1 7.12504e-05, Linf 0.00455776, total time[s] 0.080678 +Converged at iteration 19, L1 5.62134e-05, Linf 0.00340163, total time[s] 0.054795 +Converged at iteration 30, L1 9.4052e-05, Linf 0.00330569, total time[s] 0.12525 +Converged at iteration 20, L1 8.46414e-05, Linf 0.00470819, total time[s] 0.065082 +Converged at iteration 24, L1 7.12389e-05, Linf 0.00476415, total time[s] 0.11795 +Converged at iteration 31, L1 9.36986e-05, Linf 0.00498534, total time[s] 0.145093 +Converged at iteration 27, L1 9.64789e-05, Linf 0.00490685, total time[s] 0.128969 +Converged at iteration 24, L1 8.60472e-05, Linf 0.00435257, total time[s] 0.072823 +Converged at iteration 23, L1 9.27364e-05, Linf 0.00429536, total time[s] 0.085051 +Converged at iteration 26, L1 7.17754e-05, Linf 0.00463025, total time[s] 0.086646 +Converged at iteration 29, L1 7.55466e-05, Linf 0.00487908, total time[s] 0.112739 +Converged at iteration 34, L1 8.10967e-05, Linf 0.00418099, total time[s] 0.0928 +Converged at iteration 31, L1 7.1295e-05, Linf 0.0035707, total time[s] 0.141108 +Converged at iteration 29, L1 6.99016e-05, Linf 0.00271597, total time[s] 0.092521 +Converged at iteration 32, L1 8.358e-05, Linf 0.00356412, total time[s] 0.15047 +Converged at iteration 36, L1 8.9363e-05, Linf 0.00360517, total time[s] 0.116784 +Converged at iteration 33, L1 8.34262e-05, Linf 0.00483692, total time[s] 0.106384 +Converged at iteration 28, L1 9.17476e-05, Linf 0.00419565, total time[s] 0.139575 +Converged at iteration 24, L1 8.06081e-05, Linf 0.00294224, total time[s] 0.138396 +Converged at iteration 26, L1 8.46892e-05, Linf 0.00391634, total time[s] 0.173263 +Converged at iteration 38, L1 9.36777e-05, Linf 0.00153914, total time[s] 0.280299 +Converged at iteration 35, L1 8.3521e-05, Linf 0.00348377, total time[s] 0.105681 +Converged at iteration 30, L1 9.65748e-05, Linf 0.00424382, total time[s] 0.078562 +Converged at iteration 31, L1 6.18699e-05, Linf 0.00501452, total time[s] 0.090437 +Converged at iteration 27, L1 6.01594e-05, Linf 0.00494107, total time[s] 0.113075 +Converged at iteration 22, L1 7.71567e-05, Linf 0.00430569, total time[s] 0.098908 +Converged at iteration 21, L1 6.27943e-05, Linf 0.00334582, total time[s] 0.077511 +Converged at iteration 24, L1 9.04021e-05, Linf 0.0048884, total time[s] 0.122407 +Converged at iteration 28, L1 7.44435e-05, Linf 0.00444298, total time[s] 0.108958 +Converged at iteration 26, L1 8.05167e-05, Linf 0.00538475, total time[s] 0.082448 +Converged at iteration 22, L1 7.22806e-05, Linf 0.00482965, total time[s] 0.06028 +Converged at iteration 19, L1 5.91414e-05, Linf 0.00361467, total time[s] 0.067059 +Converged at iteration 30, L1 8.88997e-05, Linf 0.00330289, total time[s] 0.087088 +Converged at iteration 20, L1 8.51862e-05, Linf 0.00465281, total time[s] 0.053658 +Converged at iteration 24, L1 7.15192e-05, Linf 0.00467796, total time[s] 0.119611 +Converged at iteration 31, L1 9.34202e-05, Linf 0.0053134, total time[s] 0.103716 +Converged at iteration 27, L1 9.96248e-05, Linf 0.00537913, total time[s] 0.08542 +Converged at iteration 24, L1 8.73791e-05, Linf 0.00451227, total time[s] 0.084093 +Converged at iteration 23, L1 9.26389e-05, Linf 0.00422085, total time[s] 0.071851 +Converged at iteration 26, L1 7.18684e-05, Linf 0.00456739, total time[s] 0.075982 +Converged at iteration 29, L1 7.65666e-05, Linf 0.00485431, total time[s] 0.13237 +Converged at iteration 34, L1 7.85892e-05, Linf 0.00433689, total time[s] 0.138513 +Converged at iteration 31, L1 6.92556e-05, Linf 0.00361828, total time[s] 0.107999 +Converged at iteration 28, L1 9.84961e-05, Linf 0.00321094, total time[s] 0.077777 +Converged at iteration 32, L1 8.57493e-05, Linf 0.00362186, total time[s] 0.100235 +Converged at iteration 36, L1 9.5491e-05, Linf 0.00367427, total time[s] 0.11625 +Converged at iteration 33, L1 8.39302e-05, Linf 0.00478538, total time[s] 0.085734 +Converged at iteration 28, L1 9.33789e-05, Linf 0.00419557, total time[s] 0.099609 +Converged at iteration 24, L1 8.21454e-05, Linf 0.00304558, total time[s] 0.069125 +Converged at iteration 26, L1 8.72472e-05, Linf 0.00391445, total time[s] 0.076341 +Converged at iteration 40, L1 6.70543e-05, Linf 0.00379157, total time[s] 0.121527 +Converged at iteration 35, L1 8.074e-05, Linf 0.0034876, total time[s] 0.106752 +Converged at iteration 30, L1 9.70148e-05, Linf 0.00424058, total time[s] 0.095919 +Converged at iteration 31, L1 6.18961e-05, Linf 0.0050349, total time[s] 0.086247 +Converged at iteration 27, L1 6.0773e-05, Linf 0.00495577, total time[s] 0.074059 +Converged at iteration 22, L1 7.9233e-05, Linf 0.00439981, total time[s] 0.076962 +Converged at iteration 20, L1 9.95885e-05, Linf 0.00417032, total time[s] 0.068696 +Converged at iteration 24, L1 9.0608e-05, Linf 0.00487017, total time[s] 0.096426 +Converged at iteration 28, L1 7.45265e-05, Linf 0.00445597, total time[s] 0.133627 +Converged at iteration 26, L1 8.27662e-05, Linf 0.00976606, total time[s] 0.110926 +Converged at iteration 22, L1 7.25796e-05, Linf 0.00491876, total time[s] 0.065807 +Converged at iteration 19, L1 6.15012e-05, Linf 0.00370252, total time[s] 0.051465 +Converged at iteration 30, L1 8.614e-05, Linf 0.00330158, total time[s] 0.082186 +Converged at iteration 20, L1 8.52328e-05, Linf 0.00462288, total time[s] 0.073169 +Converged at iteration 24, L1 7.15289e-05, Linf 0.00466365, total time[s] 0.066908 +Converged at iteration 31, L1 9.23626e-05, Linf 0.00536744, total time[s] 0.08098 +Converged at iteration 27, L1 9.93658e-05, Linf 0.0055292, total time[s] 0.086526 +Converged at iteration 24, L1 8.73046e-05, Linf 0.0045623, total time[s] 0.069995 +Converged at iteration 23, L1 9.34465e-05, Linf 0.00518401, total time[s] 0.085224 +Converged at iteration 26, L1 7.20263e-05, Linf 0.00463503, total time[s] 0.07301 +Converged at iteration 29, L1 7.69866e-05, Linf 0.00484019, total time[s] 0.077653 +Converged at iteration 34, L1 7.71294e-05, Linf 0.00431828, total time[s] 0.089625 +Converged at iteration 30, L1 9.87865e-05, Linf 0.00440175, total time[s] 0.091527 +Converged at iteration 28, L1 9.73556e-05, Linf 0.00318542, total time[s] 0.101253 +Converged at iteration 32, L1 8.7401e-05, Linf 0.00363281, total time[s] 0.090303 +Converged at iteration 36, L1 9.81126e-05, Linf 0.0037402, total time[s] 0.102712 +Converged at iteration 33, L1 8.4076e-05, Linf 0.00476182, total time[s] 0.097896 +Converged at iteration 28, L1 9.42441e-05, Linf 0.00422029, total time[s] 0.086469 +Converged at iteration 24, L1 8.32171e-05, Linf 0.00309705, total time[s] 0.081318 +Converged at iteration 26, L1 8.78281e-05, Linf 0.00388152, total time[s] 0.093987 +Converged at iteration 40, L1 6.72794e-05, Linf 0.00386951, total time[s] 0.133157 +Converged at iteration 35, L1 8.48227e-05, Linf 0.00355099, total time[s] 0.115498 +Converged at iteration 30, L1 9.51257e-05, Linf 0.00420093, total time[s] 0.149402 +Converged at iteration 31, L1 6.1875e-05, Linf 0.00504113, total time[s] 0.081647 +Converged at iteration 27, L1 5.94604e-05, Linf 0.00492628, total time[s] 0.10044 +Converged at iteration 22, L1 7.49913e-05, Linf 0.00426051, total time[s] 0.057834 +Converged at iteration 21, L1 6.3214e-05, Linf 0.00339814, total time[s] 0.075932 +Converged at iteration 24, L1 8.99275e-05, Linf 0.00490944, total time[s] 0.099327 +Converged at iteration 28, L1 7.40175e-05, Linf 0.00443841, total time[s] 0.08874 +Converged at iteration 26, L1 8.10111e-05, Linf 0.00546115, total time[s] 0.089238 +Converged at iteration 22, L1 7.17642e-05, Linf 0.00471318, total time[s] 0.061214 +Converged at iteration 19, L1 5.78268e-05, Linf 0.00345828, total time[s] 0.069367 +Converged at iteration 30, L1 9.1116e-05, Linf 0.00330411, total time[s] 0.083895 +Converged at iteration 20, L1 8.50184e-05, Linf 0.00468019, total time[s] 0.075072 +Converged at iteration 24, L1 7.15424e-05, Linf 0.00471147, total time[s] 0.07472 +Converged at iteration 31, L1 9.41191e-05, Linf 0.00518073, total time[s] 0.133369 +Converged at iteration 27, L1 9.81357e-05, Linf 0.00516117, total time[s] 0.107534 +Converged at iteration 24, L1 8.66878e-05, Linf 0.00444334, total time[s] 0.067975 +Converged at iteration 23, L1 9.27128e-05, Linf 0.00425622, total time[s] 0.074937 +Converged at iteration 26, L1 7.1893e-05, Linf 0.00459742, total time[s] 0.0689 +Converged at iteration 29, L1 7.59872e-05, Linf 0.00486811, total time[s] 0.085922 +Converged at iteration 34, L1 8.00903e-05, Linf 0.00429594, total time[s] 0.123283 +Converged at iteration 31, L1 7.03433e-05, Linf 0.00359464, total time[s] 0.084205 +Converged at iteration 28, L1 9.97474e-05, Linf 0.00323656, total time[s] 0.079182 +Converged at iteration 32, L1 8.47189e-05, Linf 0.00359195, total time[s] 0.087775 +Converged at iteration 36, L1 9.26936e-05, Linf 0.00364969, total time[s] 0.119616 +Converged at iteration 33, L1 8.36457e-05, Linf 0.00480874, total time[s] 0.096615 +Converged at iteration 28, L1 9.2566e-05, Linf 0.00417054, total time[s] 0.08013 +Converged at iteration 24, L1 8.13048e-05, Linf 0.00299373, total time[s] 0.06608 +Converged at iteration 26, L1 8.58553e-05, Linf 0.00388719, total time[s] 0.139236 +Converged at iteration 40, L1 6.7087e-05, Linf 0.00402623, total time[s] 0.209992 +Converged at iteration 35, L1 9.09125e-05, Linf 0.00368999, total time[s] 0.186902 +Converged at iteration 30, L1 8.97777e-05, Linf 0.00415819, total time[s] 0.137571 +Converged at iteration 31, L1 6.15305e-05, Linf 0.00505306, total time[s] 0.110608 +Converged at iteration 26, L1 9.57557e-05, Linf 0.00575294, total time[s] 0.111931 +Converged at iteration 22, L1 6.67884e-05, Linf 0.00407055, total time[s] 0.080546 +Converged at iteration 21, L1 6.61053e-05, Linf 0.00363679, total time[s] 0.055534 +Converged at iteration 24, L1 8.89221e-05, Linf 0.00502425, total time[s] 0.064852 +Converged at iteration 28, L1 7.11012e-05, Linf 0.00441835, total time[s] 0.082618 +Converged at iteration 26, L1 8.12323e-05, Linf 0.00509879, total time[s] 0.071093 +Converged at iteration 22, L1 6.6284e-05, Linf 0.00386942, total time[s] 0.064392 +Converged at iteration 18, L1 9.41133e-05, Linf 0.00378975, total time[s] 0.051579 +Converged at iteration 31, L1 6.80546e-05, Linf 0.00265846, total time[s] 0.092917 +Converged at iteration 20, L1 8.32688e-05, Linf 0.0047988, total time[s] 0.0552 +Converged at iteration 24, L1 7.06223e-05, Linf 0.00482643, total time[s] 0.082536 +Converged at iteration 31, L1 9.51843e-05, Linf 0.00413058, total time[s] 0.101793 +Converged at iteration 27, L1 8.24284e-05, Linf 0.00394389, total time[s] 0.085409 +Converged at iteration 24, L1 8.19106e-05, Linf 0.00396603, total time[s] 0.065592 +Converged at iteration 23, L1 9.25576e-05, Linf 0.00441745, total time[s] 0.061531 +Converged at iteration 26, L1 7.07732e-05, Linf 0.00475236, total time[s] 0.094861 +Converged at iteration 29, L1 7.38904e-05, Linf 0.00491368, total time[s] 0.080628 +Converged at iteration 34, L1 8.01967e-05, Linf 0.00345615, total time[s] 0.094075 +Converged at iteration 31, L1 7.61364e-05, Linf 0.00347212, total time[s] 0.085333 +Converged at iteration 29, L1 7.29123e-05, Linf 0.00277281, total time[s] 0.08537 +Converged at iteration 32, L1 7.97733e-05, Linf 0.00351329, total time[s] 0.096218 +Converged at iteration 36, L1 7.88347e-05, Linf 0.0034424, total time[s] 0.103834 +Converged at iteration 33, L1 8.25455e-05, Linf 0.00490196, total time[s] 0.092432 +Converged at iteration 28, L1 8.91404e-05, Linf 0.00412641, total time[s] 0.0955 +Converged at iteration 24, L1 7.91571e-05, Linf 0.00281655, total time[s] 0.102714 +Converged at iteration 26, L1 8.26275e-05, Linf 0.00395687, total time[s] 0.070785 +Converged at iteration 40, L1 6.7857e-05, Linf 0.0038473, total time[s] 0.106153 +Converged at iteration 35, L1 8.78898e-05, Linf 0.00366049, total time[s] 0.108964 +Converged at iteration 30, L1 9.18653e-05, Linf 0.00417464, total time[s] 0.082374 +Converged at iteration 31, L1 6.17721e-05, Linf 0.00504713, total time[s] 0.10902 +Converged at iteration 26, L1 9.79538e-05, Linf 0.00577249, total time[s] 0.069968 +Converged at iteration 22, L1 7.09867e-05, Linf 0.00416686, total time[s] 0.072246 +Converged at iteration 21, L1 6.44559e-05, Linf 0.00351198, total time[s] 0.066086 +Converged at iteration 24, L1 8.97277e-05, Linf 0.0049613, total time[s] 0.065034 +Converged at iteration 28, L1 7.28475e-05, Linf 0.00442862, total time[s] 0.07844 +Converged at iteration 26, L1 8.04927e-05, Linf 0.00532239, total time[s] 0.074609 +Converged at iteration 22, L1 7.00499e-05, Linf 0.00434472, total time[s] 0.06244 +Converged at iteration 19, L1 5.43403e-05, Linf 0.00326754, total time[s] 0.053478 +Converged at iteration 30, L1 9.60261e-05, Linf 0.00330695, total time[s] 0.079692 +Converged at iteration 20, L1 8.41379e-05, Linf 0.00473763, total time[s] 0.055297 +Converged at iteration 24, L1 7.11882e-05, Linf 0.00476282, total time[s] 0.068165 +Converged at iteration 31, L1 9.52444e-05, Linf 0.00473809, total time[s] 0.0843 +Converged at iteration 27, L1 9.33689e-05, Linf 0.00457632, total time[s] 0.074812 +Converged at iteration 24, L1 8.5277e-05, Linf 0.0042402, total time[s] 0.069421 +Converged at iteration 23, L1 9.27244e-05, Linf 0.00433571, total time[s] 0.065944 +Converged at iteration 26, L1 7.12866e-05, Linf 0.00465751, total time[s] 0.091934 +Converged at iteration 29, L1 7.51252e-05, Linf 0.00488884, total time[s] 0.100559 +Converged at iteration 34, L1 8.23264e-05, Linf 0.00399565, total time[s] 0.103395 +Converged at iteration 31, L1 7.2608e-05, Linf 0.00354662, total time[s] 0.095064 +Converged at iteration 29, L1 7.06462e-05, Linf 0.00274862, total time[s] 0.0757 +Converged at iteration 32, L1 8.16211e-05, Linf 0.00353138, total time[s] 0.08659 +Converged at iteration 36, L1 8.56235e-05, Linf 0.00357312, total time[s] 0.111256 +Converged at iteration 33, L1 8.30869e-05, Linf 0.00491225, total time[s] 0.108075 +Converged at iteration 28, L1 9.06903e-05, Linf 0.00416903, total time[s] 0.091313 +Converged at iteration 24, L1 7.99912e-05, Linf 0.00288972, total time[s] 0.081938 +Converged at iteration 26, L1 8.38266e-05, Linf 0.00392523, total time[s] 0.073416 +Converged at iteration 40, L1 6.48565e-05, Linf 0.00410038, total time[s] 0.129438 +Converged at iteration 35, L1 9.32112e-05, Linf 0.0037632, total time[s] 0.115441 +Converged at iteration 30, L1 8.77446e-05, Linf 0.00418014, total time[s] 0.094213 +Converged at iteration 31, L1 6.13971e-05, Linf 0.00505788, total time[s] 0.083655 +Converged at iteration 26, L1 9.34899e-05, Linf 0.00572351, total time[s] 0.074986 +Converged at iteration 22, L1 6.26385e-05, Linf 0.0039712, total time[s] 0.068857 +Converged at iteration 21, L1 6.81541e-05, Linf 0.0037779, total time[s] 0.06491 +Converged at iteration 24, L1 8.82771e-05, Linf 0.00510076, total time[s] 0.0732 +Converged at iteration 28, L1 6.96326e-05, Linf 0.00440956, total time[s] 0.087147 +Converged at iteration 26, L1 8.25813e-05, Linf 0.00478682, total time[s] 0.086096 +Converged at iteration 22, L1 5.83331e-05, Linf 0.0033905, total time[s] 0.071828 +Converged at iteration 18, L1 8.5311e-05, Linf 0.00340258, total time[s] 0.056913 +Converged at iteration 31, L1 7.14693e-05, Linf 0.0026672, total time[s] 0.114503 +Converged at iteration 20, L1 8.27663e-05, Linf 0.00486523, total time[s] 0.058506 +Converged at iteration 24, L1 7.01836e-05, Linf 0.0049044, total time[s] 0.076633 +Converged at iteration 31, L1 8.79527e-05, Linf 0.00351355, total time[s] 0.092749 +Converged at iteration 26, L1 9.02103e-05, Linf 0.00413806, total time[s] 0.079134 +Converged at iteration 24, L1 7.38501e-05, Linf 0.00364724, total time[s] 0.071597 +Converged at iteration 23, L1 9.32105e-05, Linf 0.00449388, total time[s] 0.06074 +Converged at iteration 26, L1 7.01051e-05, Linf 0.00483995, total time[s] 0.073519 +Converged at iteration 29, L1 7.29042e-05, Linf 0.00493263, total time[s] 0.112785 +Converged at iteration 33, L1 9.19532e-05, Linf 0.00341157, total time[s] 0.094049 +Converged at iteration 31, L1 7.81971e-05, Linf 0.00332897, total time[s] 0.089551 +Converged at iteration 29, L1 7.50645e-05, Linf 0.00282832, total time[s] 0.080631 +Converged at iteration 32, L1 7.68583e-05, Linf 0.00341038, total time[s] 0.084164 +Converged at iteration 36, L1 7.4784e-05, Linf 0.00338432, total time[s] 0.103761 +Converged at iteration 33, L1 8.15384e-05, Linf 0.00494828, total time[s] 0.101197 +Converged at iteration 28, L1 8.70105e-05, Linf 0.00403544, total time[s] 0.078247 +Converged at iteration 24, L1 7.86057e-05, Linf 0.00267735, total time[s] 0.071069 +Converged at iteration 26, L1 8.24108e-05, Linf 0.00399674, total time[s] 0.078191 +Converged at iteration 40, L1 6.64482e-05, Linf 0.00402406, total time[s] 0.100616 +Converged at iteration 35, L1 9.04501e-05, Linf 0.00368911, total time[s] 0.101314 +Converged at iteration 30, L1 8.9433e-05, Linf 0.00417425, total time[s] 0.08659 +Converged at iteration 31, L1 6.28703e-05, Linf 0.00502906, total time[s] 0.086502 +Converged at iteration 26, L1 9.61831e-05, Linf 0.00574918, total time[s] 0.091357 +Converged at iteration 22, L1 6.6904e-05, Linf 0.00407055, total time[s] 0.058608 +Converged at iteration 21, L1 6.63732e-05, Linf 0.00363824, total time[s] 0.066276 +Converged at iteration 24, L1 8.90462e-05, Linf 0.00502484, total time[s] 0.064558 +Converged at iteration 28, L1 7.12967e-05, Linf 0.00441772, total time[s] 0.0946 +Converged at iteration 26, L1 8.27414e-05, Linf 0.0050996, total time[s] 0.079071 +Converged at iteration 22, L1 6.63599e-05, Linf 0.00386804, total time[s] 0.065959 +Converged at iteration 18, L1 9.43406e-05, Linf 0.00378833, total time[s] 0.048037 +Converged at iteration 31, L1 6.84192e-05, Linf 0.0026579, total time[s] 0.085978 +Converged at iteration 20, L1 8.33236e-05, Linf 0.00479883, total time[s] 0.053736 +Converged at iteration 24, L1 7.07565e-05, Linf 0.00483014, total time[s] 0.067617 +Converged at iteration 31, L1 9.51588e-05, Linf 0.00413425, total time[s] 0.090331 +Converged at iteration 27, L1 8.23419e-05, Linf 0.00394304, total time[s] 0.070103 +Converged at iteration 24, L1 8.20293e-05, Linf 0.00396598, total time[s] 0.082521 +Converged at iteration 23, L1 9.25503e-05, Linf 0.00441811, total time[s] 0.099106 +Converged at iteration 26, L1 7.0814e-05, Linf 0.00475209, total time[s] 0.114181 +Converged at iteration 29, L1 7.41646e-05, Linf 0.0049135, total time[s] 0.080644 +Converged at iteration 34, L1 8.03296e-05, Linf 0.00345716, total time[s] 0.148412 +Converged at iteration 31, L1 7.63102e-05, Linf 0.00347309, total time[s] 0.108228 +Converged at iteration 29, L1 7.29474e-05, Linf 0.00278713, total time[s] 0.087338 +Converged at iteration 32, L1 7.94514e-05, Linf 0.00348746, total time[s] 0.129504 +Converged at iteration 36, L1 7.88199e-05, Linf 0.00345685, total time[s] 0.171634 +Converged at iteration 33, L1 8.23917e-05, Linf 0.0049579, total time[s] 0.125078 +Converged at iteration 28, L1 8.89738e-05, Linf 0.0039835, total time[s] 0.141197 +Converged at iteration 24, L1 7.91126e-05, Linf 0.00276091, total time[s] 0.11899 +Converged at iteration 26, L1 8.26933e-05, Linf 0.00395628, total time[s] 0.071385 +Converged at iteration 39, L1 9.98439e-05, Linf 0.00487731, total time[s] 0.104186 +Converged at iteration 35, L1 9.5847e-05, Linf 0.00384339, total time[s] 0.095565 +Converged at iteration 30, L1 7.61035e-05, Linf 0.00417987, total time[s] 0.077293 +Converged at iteration 31, L1 6.19548e-05, Linf 0.00506129, total time[s] 0.082474 +Converged at iteration 26, L1 9.1257e-05, Linf 0.00569451, total time[s] 0.08082 +Converged at iteration 21, L1 9.67785e-05, Linf 0.00463162, total time[s] 0.059368 +Converged at iteration 21, L1 6.86179e-05, Linf 0.00392328, total time[s] 0.057698 +Converged at iteration 24, L1 8.21951e-05, Linf 0.00518468, total time[s] 0.122693 +Converged at iteration 28, L1 6.82888e-05, Linf 0.00440084, total time[s] 0.078802 +Converged at iteration 26, L1 8.23774e-05, Linf 0.00439316, total time[s] 0.0791 +Converged at iteration 21, L1 8.89711e-05, Linf 0.00434159, total time[s] 0.057542 +Converged at iteration 18, L1 7.58306e-05, Linf 0.00305019, total time[s] 0.05018 +Converged at iteration 31, L1 7.4399e-05, Linf 0.00267749, total time[s] 0.082977 +Converged at iteration 20, L1 8.22503e-05, Linf 0.00493571, total time[s] 0.070954 +Converged at iteration 24, L1 6.91912e-05, Linf 0.00498613, total time[s] 0.068781 +Converged at iteration 30, L1 9.91102e-05, Linf 0.00356807, total time[s] 0.099969 +Converged at iteration 25, L1 9.93754e-05, Linf 0.00470099, total time[s] 0.075038 +Converged at iteration 23, L1 9.00135e-05, Linf 0.00398973, total time[s] 0.068195 +Converged at iteration 23, L1 9.4633e-05, Linf 0.00455875, total time[s] 0.062182 +Converged at iteration 26, L1 6.93476e-05, Linf 0.0049172, total time[s] 0.107143 +Converged at iteration 29, L1 7.17163e-05, Linf 0.00491443, total time[s] 0.08428 +Converged at iteration 32, L1 9.39781e-05, Linf 0.00357658, total time[s] 0.102337 +Converged at iteration 31, L1 7.49533e-05, Linf 0.00310661, total time[s] 0.085432 +Converged at iteration 29, L1 7.70806e-05, Linf 0.00289907, total time[s] 0.091679 +Converged at iteration 32, L1 7.57203e-05, Linf 0.00336635, total time[s] 0.086626 +Converged at iteration 35, L1 9.785e-05, Linf 0.00405649, total time[s] 0.113151 +Converged at iteration 33, L1 8.066e-05, Linf 0.00499457, total time[s] 0.086844 +Converged at iteration 28, L1 8.45067e-05, Linf 0.00399379, total time[s] 0.075321 +Converged at iteration 24, L1 7.83745e-05, Linf 0.00256945, total time[s] 0.073567 +Converged at iteration 26, L1 8.28466e-05, Linf 0.0040309, total time[s] 0.085486 +Converged at iteration 40, L1 6.61338e-05, Linf 0.004101, total time[s] 0.111476 +Converged at iteration 35, L1 9.33918e-05, Linf 0.00372235, total time[s] 0.113252 +Converged at iteration 30, L1 8.82931e-05, Linf 0.00417861, total time[s] 0.111089 +Converged at iteration 31, L1 6.17805e-05, Linf 0.00505773, total time[s] 0.086629 +Converged at iteration 26, L1 9.37454e-05, Linf 0.00572328, total time[s] 0.10145 +Converged at iteration 22, L1 6.25562e-05, Linf 0.00397108, total time[s] 0.083776 +Converged at iteration 21, L1 6.81294e-05, Linf 0.00377918, total time[s] 0.060022 +Converged at iteration 24, L1 8.81634e-05, Linf 0.00510126, total time[s] 0.084572 +Converged at iteration 28, L1 6.94649e-05, Linf 0.00440888, total time[s] 0.083727 +Converged at iteration 26, L1 8.25839e-05, Linf 0.00478848, total time[s] 0.09326 +Converged at iteration 22, L1 5.83776e-05, Linf 0.00338934, total time[s] 0.058555 +Converged at iteration 18, L1 8.5418e-05, Linf 0.00340171, total time[s] 0.080459 +Converged at iteration 31, L1 7.13109e-05, Linf 0.0026672, total time[s] 0.110622 +Converged at iteration 20, L1 8.27987e-05, Linf 0.00486612, total time[s] 0.074908 +Converged at iteration 24, L1 6.99356e-05, Linf 0.00490439, total time[s] 0.077034 +Converged at iteration 31, L1 8.81463e-05, Linf 0.00352135, total time[s] 0.12298 +Converged at iteration 26, L1 9.04249e-05, Linf 0.00411772, total time[s] 0.083147 +Converged at iteration 24, L1 7.40058e-05, Linf 0.00364795, total time[s] 0.067706 +Converged at iteration 23, L1 9.33061e-05, Linf 0.00449433, total time[s] 0.063649 +Converged at iteration 26, L1 7.01332e-05, Linf 0.00484051, total time[s] 0.076124 +Converged at iteration 29, L1 7.3211e-05, Linf 0.00500952, total time[s] 0.094726 +Converged at iteration 33, L1 9.20662e-05, Linf 0.00341448, total time[s] 0.100395 +Converged at iteration 31, L1 7.83083e-05, Linf 0.00333017, total time[s] 0.112265 +Converged at iteration 29, L1 7.50682e-05, Linf 0.00284309, total time[s] 0.087699 +Converged at iteration 32, L1 7.68321e-05, Linf 0.00340973, total time[s] 0.083461 +Converged at iteration 36, L1 7.47502e-05, Linf 0.00338329, total time[s] 0.097614 +Converged at iteration 33, L1 8.15566e-05, Linf 0.00494839, total time[s] 0.10937 +Converged at iteration 28, L1 8.66362e-05, Linf 0.00403536, total time[s] 0.081457 +Converged at iteration 24, L1 7.86046e-05, Linf 0.00267672, total time[s] 0.069177 +Converged at iteration 26, L1 8.23865e-05, Linf 0.00399563, total time[s] 0.096575 +Converged at iteration 39, L1 9.92127e-05, Linf 0.00496974, total time[s] 0.116056 +Converged at iteration 35, L1 9.8629e-05, Linf 0.00392675, total time[s] 0.117461 +Converged at iteration 29, L1 9.25777e-05, Linf 0.00503147, total time[s] 0.076314 +Converged at iteration 31, L1 6.13869e-05, Linf 0.00506335, total time[s] 0.111819 +Converged at iteration 26, L1 8.9467e-05, Linf 0.00572693, total time[s] 0.09709 +Converged at iteration 21, L1 9.23246e-05, Linf 0.00452899, total time[s] 0.066269 +Converged at iteration 21, L1 6.55198e-05, Linf 0.00401641, total time[s] 0.067763 +Converged at iteration 24, L1 7.18149e-05, Linf 0.00525863, total time[s] 0.08529 +Converged at iteration 28, L1 6.45789e-05, Linf 0.00439983, total time[s] 0.079384 +Converged at iteration 26, L1 7.7716e-05, Linf 0.00400281, total time[s] 0.082616 +Converged at iteration 21, L1 7.58028e-05, Linf 0.00431478, total time[s] 0.09402 +Converged at iteration 18, L1 6.7076e-05, Linf 0.00282795, total time[s] 0.050129 +Converged at iteration 31, L1 7.73174e-05, Linf 0.00268916, total time[s] 0.079714 +Converged at iteration 20, L1 8.17202e-05, Linf 0.00500795, total time[s] 0.064804 +Converged at iteration 24, L1 6.84621e-05, Linf 0.0050747, total time[s] 0.074197 +Converged at iteration 30, L1 8.14563e-05, Linf 0.00321573, total time[s] 0.10212 +Converged at iteration 25, L1 7.70736e-05, Linf 0.0044385, total time[s] 0.101052 +Converged at iteration 23, L1 7.34996e-05, Linf 0.00375503, total time[s] 0.074419 +Converged at iteration 23, L1 9.55942e-05, Linf 0.00468508, total time[s] 0.064483 +Converged at iteration 26, L1 6.86193e-05, Linf 0.00497417, total time[s] 0.072041 +Converged at iteration 29, L1 7.11393e-05, Linf 0.0048352, total time[s] 0.108946 +Converged at iteration 32, L1 6.96053e-05, Linf 0.00328946, total time[s] 0.093671 +Converged at iteration 30, L1 9.1026e-05, Linf 0.00332906, total time[s] 0.085404 +Converged at iteration 29, L1 7.88869e-05, Linf 0.00295435, total time[s] 0.098208 +Converged at iteration 32, L1 7.38634e-05, Linf 0.00331624, total time[s] 0.086084 +Converged at iteration 35, L1 7.75417e-05, Linf 0.00386429, total time[s] 0.102319 +Converged at iteration 33, L1 7.97491e-05, Linf 0.00504114, total time[s] 0.10607 +Converged at iteration 28, L1 8.23553e-05, Linf 0.00395249, total time[s] 0.073853 +Converged at iteration 24, L1 7.87998e-05, Linf 0.00246105, total time[s] 0.098622 +Converged at iteration 26, L1 7.98697e-05, Linf 0.00408265, total time[s] 0.080888 +Converged at iteration 39, L1 9.98354e-05, Linf 0.00482755, total time[s] 0.115377 +Converged at iteration 35, L1 9.58508e-05, Linf 0.00384384, total time[s] 0.10263 +Converged at iteration 30, L1 7.59865e-05, Linf 0.00418092, total time[s] 0.086862 +Converged at iteration 31, L1 6.19011e-05, Linf 0.00506111, total time[s] 0.101202 +Converged at iteration 26, L1 9.14221e-05, Linf 0.00569445, total time[s] 0.080662 +Converged at iteration 21, L1 9.67632e-05, Linf 0.00463173, total time[s] 0.066109 +Converged at iteration 21, L1 6.85306e-05, Linf 0.00392342, total time[s] 0.072108 +Converged at iteration 24, L1 8.2102e-05, Linf 0.00518506, total time[s] 0.081291 +Converged at iteration 28, L1 6.79725e-05, Linf 0.00440324, total time[s] 0.106973 +Converged at iteration 26, L1 8.24348e-05, Linf 0.00438094, total time[s] 0.074292 +Converged at iteration 21, L1 8.89936e-05, Linf 0.00434157, total time[s] 0.069071 +Converged at iteration 18, L1 7.58742e-05, Linf 0.00304013, total time[s] 0.050266 +Converged at iteration 31, L1 7.43945e-05, Linf 0.00267729, total time[s] 0.108098 +Converged at iteration 20, L1 8.23712e-05, Linf 0.00493751, total time[s] 0.065353 +Converged at iteration 24, L1 6.98429e-05, Linf 0.0049861, total time[s] 0.066868 +Converged at iteration 30, L1 9.93862e-05, Linf 0.00357137, total time[s] 0.080365 +Converged at iteration 25, L1 9.9713e-05, Linf 0.00470156, total time[s] 0.078635 +Converged at iteration 23, L1 9.02136e-05, Linf 0.00396996, total time[s] 0.065608 +Converged at iteration 23, L1 9.47125e-05, Linf 0.00465225, total time[s] 0.075152 +Converged at iteration 26, L1 6.94e-05, Linf 0.00491676, total time[s] 0.074978 +Converged at iteration 29, L1 7.26174e-05, Linf 0.00494195, total time[s] 0.104501 +Converged at iteration 32, L1 9.41724e-05, Linf 0.00357867, total time[s] 0.097027 +Converged at iteration 31, L1 7.50269e-05, Linf 0.00310767, total time[s] 0.103034 +Converged at iteration 29, L1 7.70835e-05, Linf 0.00289882, total time[s] 0.092626 +Converged at iteration 32, L1 7.54818e-05, Linf 0.00337877, total time[s] 0.088067 +Converged at iteration 35, L1 9.7683e-05, Linf 0.00405485, total time[s] 0.100593 +Converged at iteration 33, L1 8.06078e-05, Linf 0.00499463, total time[s] 0.106535 +Converged at iteration 28, L1 8.46317e-05, Linf 0.00404173, total time[s] 0.075165 +Converged at iteration 24, L1 7.83988e-05, Linf 0.00256877, total time[s] 0.066563 +Converged at iteration 26, L1 8.28135e-05, Linf 0.00404089, total time[s] 0.069066 +Converged at iteration 39, L1 9.83644e-05, Linf 0.00506134, total time[s] 0.103369 +Converged at iteration 36, L1 6.78959e-05, Linf 0.00338639, total time[s] 0.093848 +Converged at iteration 29, L1 6.97438e-05, Linf 0.00489692, total time[s] 0.077042 +Converged at iteration 31, L1 6.09953e-05, Linf 0.00506478, total time[s] 0.092064 +Converged at iteration 26, L1 8.66951e-05, Linf 0.00563037, total time[s] 0.080822 +Converged at iteration 21, L1 8.84864e-05, Linf 0.00441773, total time[s] 0.063027 +Converged at iteration 21, L1 6.08022e-05, Linf 0.00406652, total time[s] 0.06254 +Converged at iteration 24, L1 5.92049e-05, Linf 0.00529135, total time[s] 0.094259 +Converged at iteration 27, L1 9.70667e-05, Linf 0.00549917, total time[s] 0.07385 +Converged at iteration 26, L1 6.74875e-05, Linf 0.00368779, total time[s] 0.08401 +Converged at iteration 21, L1 6.58281e-05, Linf 0.00428453, total time[s] 0.064446 +Converged at iteration 18, L1 5.95818e-05, Linf 0.00278035, total time[s] 0.064295 +Converged at iteration 31, L1 8.01292e-05, Linf 0.00272824, total time[s] 0.143679 +Converged at iteration 20, L1 8.06024e-05, Linf 0.00507784, total time[s] 0.063136 +Converged at iteration 24, L1 6.79237e-05, Linf 0.00516809, total time[s] 0.112766 +Converged at iteration 29, L1 9.70752e-05, Linf 0.00351173, total time[s] 0.15431 +Converged at iteration 24, L1 9.8997e-05, Linf 0.00550622, total time[s] 0.068948 +Converged at iteration 22, L1 9.60177e-05, Linf 0.00431342, total time[s] 0.077388 +Converged at iteration 24, L1 6.98002e-05, Linf 0.00273967, total time[s] 0.102974 +Converged at iteration 26, L1 6.79387e-05, Linf 0.00486716, total time[s] 0.085957 +Converged at iteration 29, L1 6.96544e-05, Linf 0.00470864, total time[s] 0.108521 +Converged at iteration 31, L1 8.33317e-05, Linf 0.00383676, total time[s] 0.106846 +Converged at iteration 30, L1 7.62184e-05, Linf 0.00308325, total time[s] 0.175901 +Converged at iteration 29, L1 8.12123e-05, Linf 0.00300841, total time[s] 0.108157 +Converged at iteration 31, L1 9.80337e-05, Linf 0.00391561, total time[s] 0.126876 +Converged at iteration 34, L1 8.59338e-05, Linf 0.00439671, total time[s] 0.154097 +Converged at iteration 33, L1 7.86678e-05, Linf 0.00503659, total time[s] 0.167074 +Converged at iteration 28, L1 8.06704e-05, Linf 0.00391085, total time[s] 0.095825 +Converged at iteration 24, L1 8.06087e-05, Linf 0.00235245, total time[s] 0.140559 +Converged at iteration 26, L1 7.24531e-05, Linf 0.00402953, total time[s] 0.091502 +Converged at iteration 40, L1 6.6958e-05, Linf 0.00421415, total time[s] 0.173 +Converged at iteration 35, L1 9.87051e-05, Linf 0.00392698, total time[s] 0.154709 +Converged at iteration 29, L1 9.22402e-05, Linf 0.00502759, total time[s] 0.11428 +Converged at iteration 31, L1 6.20183e-05, Linf 0.00503892, total time[s] 0.128414 +Converged at iteration 26, L1 8.92947e-05, Linf 0.00566349, total time[s] 0.151488 +Converged at iteration 21, L1 9.23307e-05, Linf 0.00452686, total time[s] 0.086484 +Converged at iteration 21, L1 6.54502e-05, Linf 0.0040163, total time[s] 0.114524 +Converged at iteration 24, L1 7.16475e-05, Linf 0.0052575, total time[s] 0.073791 +Converged at iteration 28, L1 6.43825e-05, Linf 0.00439742, total time[s] 0.093984 +Converged at iteration 26, L1 7.7334e-05, Linf 0.00408896, total time[s] 0.087605 +Converged at iteration 21, L1 7.59441e-05, Linf 0.00431476, total time[s] 0.058025 +Converged at iteration 18, L1 6.71263e-05, Linf 0.0028284, total time[s] 0.051039 +Converged at iteration 31, L1 7.73845e-05, Linf 0.00268882, total time[s] 0.099178 +Converged at iteration 20, L1 8.17426e-05, Linf 0.00501468, total time[s] 0.067469 +Converged at iteration 24, L1 6.84733e-05, Linf 0.0050747, total time[s] 0.091259 +Converged at iteration 30, L1 8.15447e-05, Linf 0.00322555, total time[s] 0.102394 +Converged at iteration 25, L1 7.73317e-05, Linf 0.00443976, total time[s] 0.082904 +Converged at iteration 23, L1 7.371e-05, Linf 0.00376488, total time[s] 0.091278 +Converged at iteration 23, L1 9.55435e-05, Linf 0.00460319, total time[s] 0.074729 +Converged at iteration 26, L1 6.86386e-05, Linf 0.00497429, total time[s] 0.093789 +Converged at iteration 29, L1 7.07292e-05, Linf 0.00483523, total time[s] 0.086322 +Converged at iteration 32, L1 6.98163e-05, Linf 0.00330758, total time[s] 0.109232 +Converged at iteration 30, L1 9.11413e-05, Linf 0.00333027, total time[s] 0.087542 +Converged at iteration 29, L1 7.88905e-05, Linf 0.00295393, total time[s] 0.097383 +Converged at iteration 32, L1 7.33889e-05, Linf 0.00331331, total time[s] 0.110304 +Converged at iteration 35, L1 7.70518e-05, Linf 0.00386203, total time[s] 0.096562 +Converged at iteration 33, L1 7.96309e-05, Linf 0.00498893, total time[s] 0.086908 +Converged at iteration 28, L1 8.27956e-05, Linf 0.0039525, total time[s] 0.10351 +Converged at iteration 24, L1 7.89551e-05, Linf 0.00246038, total time[s] 0.081521 +Converged at iteration 26, L1 7.98791e-05, Linf 0.00407561, total time[s] 0.085079 +Converged at iteration 39, L1 9.73233e-05, Linf 0.00515273, total time[s] 0.124564 +Converged at iteration 36, L1 6.90857e-05, Linf 0.00357906, total time[s] 0.113094 +Converged at iteration 28, L1 8.71847e-05, Linf 0.00580297, total time[s] 0.0956 +Converged at iteration 31, L1 6.10731e-05, Linf 0.0050421, total time[s] 0.089073 +Converged at iteration 26, L1 8.44685e-05, Linf 0.00559451, total time[s] 0.06894 +Converged at iteration 21, L1 8.51493e-05, Linf 0.0043052, total time[s] 0.062578 +Converged at iteration 20, L1 9.64352e-05, Linf 0.00533474, total time[s] 0.054575 +Converged at iteration 23, L1 8.33399e-05, Linf 0.00644655, total time[s] 0.067815 +Converged at iteration 27, L1 8.75072e-05, Linf 0.00548377, total time[s] 0.097758 +Converged at iteration 26, L1 5.98695e-05, Linf 0.00340387, total time[s] 0.087968 +Converged at iteration 21, L1 5.87419e-05, Linf 0.00427594, total time[s] 0.070557 +Converged at iteration 18, L1 5.33572e-05, Linf 0.00273244, total time[s] 0.05301 +Converged at iteration 31, L1 8.24434e-05, Linf 0.00271971, total time[s] 0.089596 +Converged at iteration 20, L1 7.7339e-05, Linf 0.00515731, total time[s] 0.057025 +Converged at iteration 24, L1 6.70844e-05, Linf 0.0052749, total time[s] 0.065314 +Converged at iteration 29, L1 8.40587e-05, Linf 0.00325986, total time[s] 0.086415 +Converged at iteration 24, L1 8.5214e-05, Linf 0.0054252, total time[s] 0.098892 +Converged at iteration 22, L1 8.47062e-05, Linf 0.00416898, total time[s] 0.080605 +Converged at iteration 23, L1 9.45307e-05, Linf 0.00459621, total time[s] 0.068745 +Converged at iteration 26, L1 6.73413e-05, Linf 0.00484185, total time[s] 0.096592 +Converged at iteration 29, L1 6.88948e-05, Linf 0.00453013, total time[s] 0.086079 +Converged at iteration 31, L1 6.92047e-05, Linf 0.00368598, total time[s] 0.111964 +Converged at iteration 29, L1 9.45823e-05, Linf 0.00336311, total time[s] 0.075963 +Converged at iteration 29, L1 8.32765e-05, Linf 0.0030608, total time[s] 0.093918 +Converged at iteration 31, L1 9.13909e-05, Linf 0.00373929, total time[s] 0.128884 +Converged at iteration 33, L1 9.79683e-05, Linf 0.00491424, total time[s] 0.121854 +Converged at iteration 33, L1 7.7787e-05, Linf 0.00514692, total time[s] 0.120913 +Converged at iteration 28, L1 7.84628e-05, Linf 0.00382912, total time[s] 0.101273 +Converged at iteration 24, L1 8.30721e-05, Linf 0.0022458, total time[s] 0.071797 +Converged at iteration 25, L1 9.97792e-05, Linf 0.00487916, total time[s] 0.076667 +Converged at iteration 40, L1 6.41555e-05, Linf 0.00432013, total time[s] 0.127816 +Converged at iteration 36, L1 6.79591e-05, Linf 0.00339204, total time[s] 0.104166 +Converged at iteration 29, L1 6.96577e-05, Linf 0.00490021, total time[s] 0.087948 +Converged at iteration 31, L1 6.11347e-05, Linf 0.00506471, total time[s] 0.095938 +Converged at iteration 26, L1 8.66831e-05, Linf 0.00563004, total time[s] 0.074424 +Converged at iteration 21, L1 8.84916e-05, Linf 0.00441678, total time[s] 0.085985 +Converged at iteration 21, L1 6.07406e-05, Linf 0.00406539, total time[s] 0.067154 +Converged at iteration 24, L1 5.98431e-05, Linf 0.0052744, total time[s] 0.066838 +Converged at iteration 27, L1 9.70204e-05, Linf 0.00550276, total time[s] 0.084521 +Converged at iteration 26, L1 6.76209e-05, Linf 0.00367522, total time[s] 0.106331 +Converged at iteration 21, L1 6.59172e-05, Linf 0.00426436, total time[s] 0.069548 +Converged at iteration 18, L1 5.96001e-05, Linf 0.00278069, total time[s] 0.063136 +Converged at iteration 31, L1 8.00254e-05, Linf 0.00270142, total time[s] 0.091811 +Converged at iteration 20, L1 7.99644e-05, Linf 0.0050815, total time[s] 0.054929 +Converged at iteration 24, L1 6.80528e-05, Linf 0.00517209, total time[s] 0.084772 +Converged at iteration 29, L1 9.72017e-05, Linf 0.00351532, total time[s] 0.103004 +Converged at iteration 24, L1 9.92329e-05, Linf 0.00550552, total time[s] 0.078291 +Converged at iteration 22, L1 9.62942e-05, Linf 0.00432271, total time[s] 0.077438 +Converged at iteration 23, L1 9.59484e-05, Linf 0.004618, total time[s] 0.064918 +Converged at iteration 26, L1 6.78516e-05, Linf 0.00500055, total time[s] 0.069257 +Converged at iteration 29, L1 6.96499e-05, Linf 0.00470821, total time[s] 0.082605 +Converged at iteration 31, L1 8.35523e-05, Linf 0.00387418, total time[s] 0.099866 +Converged at iteration 30, L1 7.63578e-05, Linf 0.00308525, total time[s] 0.08748 +Converged at iteration 29, L1 8.08879e-05, Linf 0.00300728, total time[s] 0.08992 +Converged at iteration 31, L1 9.79353e-05, Linf 0.00392398, total time[s] 0.088619 +Converged at iteration 34, L1 8.5742e-05, Linf 0.00439267, total time[s] 0.086047 +Converged at iteration 33, L1 7.86133e-05, Linf 0.00508832, total time[s] 0.084007 +Converged at iteration 28, L1 8.01743e-05, Linf 0.00391055, total time[s] 0.080942 +Converged at iteration 24, L1 8.04062e-05, Linf 0.00235193, total time[s] 0.063443 +Converged at iteration 26, L1 7.19253e-05, Linf 0.00402928, total time[s] 0.091055 +Converged at iteration 39, L1 9.6172e-05, Linf 0.00530567, total time[s] 0.107218 +Converged at iteration 36, L1 7.03797e-05, Linf 0.00357442, total time[s] 0.101942 +Converged at iteration 28, L1 6.46302e-05, Linf 0.00550733, total time[s] 0.077292 +Converged at iteration 31, L1 6.08016e-05, Linf 0.00506921, total time[s] 0.085047 +Converged at iteration 26, L1 8.22304e-05, Linf 0.00555693, total time[s] 0.103428 +Converged at iteration 21, L1 8.19788e-05, Linf 0.00418355, total time[s] 0.056824 +Converged at iteration 20, L1 8.87492e-05, Linf 0.00537856, total time[s] 0.071416 +Converged at iteration 23, L1 6.69589e-05, Linf 0.00641975, total time[s] 0.061942 +Converged at iteration 27, L1 7.7806e-05, Linf 0.00544636, total time[s] 0.092925 +Converged at iteration 25, L1 9.49267e-05, Linf 0.00419283, total time[s] 0.070226 +Converged at iteration 21, L1 5.37588e-05, Linf 0.00421917, total time[s] 0.071238 +Converged at iteration 17, L1 9.89144e-05, Linf 0.00423375, total time[s] 0.046407 +Converged at iteration 31, L1 8.51181e-05, Linf 0.00272745, total time[s] 0.108027 +Converged at iteration 20, L1 7.4105e-05, Linf 0.00512776, total time[s] 0.057877 +Converged at iteration 24, L1 6.62574e-05, Linf 0.00537637, total time[s] 0.069458 +Converged at iteration 29, L1 7.36633e-05, Linf 0.00303115, total time[s] 0.084979 +Converged at iteration 24, L1 7.57365e-05, Linf 0.00536325, total time[s] 0.070236 +Converged at iteration 22, L1 7.42344e-05, Linf 0.00402881, total time[s] 0.06949 +Converged at iteration 23, L1 9.09654e-05, Linf 0.0045366, total time[s] 0.070426 +Converged at iteration 26, L1 6.65882e-05, Linf 0.00489863, total time[s] 0.07644 +Converged at iteration 29, L1 6.75844e-05, Linf 0.00443976, total time[s] 0.129486 +Converged at iteration 30, L1 9.5941e-05, Linf 0.00464461, total time[s] 0.093558 +Converged at iteration 29, L1 8.22133e-05, Linf 0.0032149, total time[s] 0.081794 +Converged at iteration 29, L1 8.56679e-05, Linf 0.003131, total time[s] 0.112009 +Converged at iteration 31, L1 8.53327e-05, Linf 0.00347789, total time[s] 0.104231 +Converged at iteration 33, L1 7.23233e-05, Linf 0.00422644, total time[s] 0.106822 +Converged at iteration 33, L1 7.69642e-05, Linf 0.00525066, total time[s] 0.091706 +Converged at iteration 28, L1 7.63831e-05, Linf 0.0038242, total time[s] 0.080407 +Converged at iteration 24, L1 8.61221e-05, Linf 0.00213551, total time[s] 0.071196 +Converged at iteration 25, L1 8.88006e-05, Linf 0.00473874, total time[s] 0.081759 +Converged at iteration 39, L1 9.94847e-05, Linf 0.00515148, total time[s] 0.114714 +Converged at iteration 36, L1 7.04473e-05, Linf 0.00347768, total time[s] 0.100144 +Converged at iteration 28, L1 8.7071e-05, Linf 0.00586007, total time[s] 0.102182 +Converged at iteration 31, L1 6.16547e-05, Linf 0.00506656, total time[s] 0.095806 +Converged at iteration 26, L1 8.46162e-05, Linf 0.0056021, total time[s] 0.074648 +Converged at iteration 21, L1 8.54985e-05, Linf 0.0043022, total time[s] 0.108158 +Converged at iteration 20, L1 9.66946e-05, Linf 0.00534859, total time[s] 0.092418 +Converged at iteration 23, L1 8.33093e-05, Linf 0.00644098, total time[s] 0.079048 +Converged at iteration 27, L1 8.75584e-05, Linf 0.00548948, total time[s] 0.086197 +Converged at iteration 26, L1 6.01562e-05, Linf 0.00339269, total time[s] 0.121904 +Converged at iteration 21, L1 5.87976e-05, Linf 0.00427591, total time[s] 0.329885 +Converged at iteration 18, L1 5.33664e-05, Linf 0.00273264, total time[s] 0.077557 +Converged at iteration 31, L1 8.28903e-05, Linf 0.00272029, total time[s] 0.122454 +Converged at iteration 20, L1 7.83102e-05, Linf 0.00515784, total time[s] 0.062337 +Converged at iteration 24, L1 6.67172e-05, Linf 0.00495879, total time[s] 0.072029 +Converged at iteration 29, L1 8.45624e-05, Linf 0.00326049, total time[s] 0.132797 +Converged at iteration 24, L1 8.52854e-05, Linf 0.0054111, total time[s] 0.073257 +Converged at iteration 22, L1 8.49005e-05, Linf 0.00476312, total time[s] 0.061986 +Converged at iteration 23, L1 9.48398e-05, Linf 0.00468544, total time[s] 0.063018 +Converged at iteration 26, L1 6.80529e-05, Linf 0.00497984, total time[s] 0.073327 +Converged at iteration 29, L1 6.86721e-05, Linf 0.00453024, total time[s] 0.094343 +Converged at iteration 31, L1 7.20807e-05, Linf 0.00368591, total time[s] 0.095685 +Converged at iteration 29, L1 9.47138e-05, Linf 0.00338816, total time[s] 0.098662 +Converged at iteration 29, L1 8.29403e-05, Linf 0.00306067, total time[s] 0.092786 +Converged at iteration 31, L1 9.11118e-05, Linf 0.00372363, total time[s] 0.089269 +Converged at iteration 33, L1 9.67601e-05, Linf 0.00491213, total time[s] 0.08876 +Converged at iteration 33, L1 7.75479e-05, Linf 0.00513433, total time[s] 0.100415 +Converged at iteration 28, L1 7.80012e-05, Linf 0.00386813, total time[s] 0.100286 +Converged at iteration 24, L1 8.28634e-05, Linf 0.00224341, total time[s] 0.066182 +Converged at iteration 25, L1 9.91842e-05, Linf 0.00488217, total time[s] 0.080232 +Converged at iteration 39, L1 9.5354e-05, Linf 0.00533048, total time[s] 0.123514 +Converged at iteration 36, L1 7.09395e-05, Linf 0.00367436, total time[s] 0.155194 +Converged at iteration 27, L1 8.73049e-05, Linf 0.0064213, total time[s] 0.08833 +Converged at iteration 31, L1 6.09442e-05, Linf 0.00507198, total time[s] 0.088378 +Converged at iteration 26, L1 7.98382e-05, Linf 0.00551706, total time[s] 0.088032 +Converged at iteration 21, L1 7.90091e-05, Linf 0.00405696, total time[s] 0.070168 +Converged at iteration 20, L1 8.18765e-05, Linf 0.00534041, total time[s] 0.056552 +Converged at iteration 23, L1 5.3223e-05, Linf 0.00622585, total time[s] 0.069204 +Converged at iteration 27, L1 6.8258e-05, Linf 0.00536862, total time[s] 0.08444 +Converged at iteration 25, L1 8.79486e-05, Linf 0.0041625, total time[s] 0.076926 +Converged at iteration 21, L1 4.95914e-05, Linf 0.00420295, total time[s] 0.080202 +Converged at iteration 17, L1 9.31259e-05, Linf 0.0041549, total time[s] 0.048888 +Converged at iteration 31, L1 8.75003e-05, Linf 0.00276953, total time[s] 0.094194 +Converged at iteration 20, L1 7.11697e-05, Linf 0.00530554, total time[s] 0.05624 +Converged at iteration 24, L1 6.51673e-05, Linf 0.00546377, total time[s] 0.090647 +Converged at iteration 28, L1 9.70767e-05, Linf 0.00376873, total time[s] 0.086645 +Converged at iteration 24, L1 6.83489e-05, Linf 0.0053271, total time[s] 0.087491 +Converged at iteration 22, L1 6.79117e-05, Linf 0.00388145, total time[s] 0.080958 +Converged at iteration 23, L1 8.74505e-05, Linf 0.00444367, total time[s] 0.073252 +Converged at iteration 26, L1 6.59104e-05, Linf 0.00476007, total time[s] 0.093256 +Converged at iteration 29, L1 6.73597e-05, Linf 0.00410435, total time[s] 0.090588 +Converged at iteration 30, L1 8.71013e-05, Linf 0.00458582, total time[s] 0.106747 +Converged at iteration 29, L1 7.27341e-05, Linf 0.00306574, total time[s] 0.087377 +Converged at iteration 30, L1 9.54592e-05, Linf 0.000492012, total time[s] 0.09036 +Converged at iteration 31, L1 7.90647e-05, Linf 0.00321501, total time[s] 0.099067 +Converged at iteration 32, L1 8.6606e-05, Linf 0.00464608, total time[s] 0.115252 +Converged at iteration 33, L1 7.5781e-05, Linf 0.00522753, total time[s] 0.125737 +Converged at iteration 28, L1 7.44169e-05, Linf 0.00388736, total time[s] 0.166672 +Converged at iteration 24, L1 8.93883e-05, Linf 0.00202638, total time[s] 0.171059 +Converged at iteration 25, L1 7.99582e-05, Linf 0.00454208, total time[s] 0.300312 +Converged at iteration 39, L1 9.26198e-05, Linf 0.00568202, total time[s] 0.143092 +Converged at iteration 36, L1 7.30728e-05, Linf 0.00406291, total time[s] 0.134137 +Converged at iteration 26, L1 6.52014e-05, Linf 0.00607866, total time[s] 0.096975 +Converged at iteration 31, L1 6.03465e-05, Linf 0.00506365, total time[s] 0.088492 +Converged at iteration 26, L1 7.0515e-05, Linf 0.00534133, total time[s] 0.107205 +Converged at iteration 21, L1 6.74274e-05, Linf 0.00352548, total time[s] 0.115883 +Converged at iteration 20, L1 5.95974e-05, Linf 0.0047938, total time[s] 0.122032 +Converged at iteration 22, L1 5.17108e-05, Linf 0.00778675, total time[s] 0.071042 +Converged at iteration 26, L1 6.92129e-05, Linf 0.00592017, total time[s] 0.119753 +Converged at iteration 25, L1 6.77514e-05, Linf 0.0040396, total time[s] 0.122082 +Converged at iteration 20, L1 8.22742e-05, Linf 0.00548574, total time[s] 0.085309 +Converged at iteration 17, L1 7.76286e-05, Linf 0.00350592, total time[s] 0.083247 +Converged at iteration 31, L1 9.61391e-05, Linf 0.00275959, total time[s] 0.103595 +Converged at iteration 20, L1 6.4146e-05, Linf 0.00543411, total time[s] 0.065745 +Converged at iteration 23, L1 9.94291e-05, Linf 0.00640324, total time[s] 0.081016 +Converged at iteration 28, L1 6.64826e-05, Linf 0.00321521, total time[s] 0.088608 +Converged at iteration 23, L1 8.94376e-05, Linf 0.00689625, total time[s] 0.070345 +Converged at iteration 21, L1 8.62261e-05, Linf 0.00454534, total time[s] 0.074704 +Converged at iteration 23, L1 7.92171e-05, Linf 0.00388924, total time[s] 0.112263 +Converged at iteration 25, L1 9.92174e-05, Linf 0.00633234, total time[s] 0.114197 +Converged at iteration 28, L1 9.63161e-05, Linf 0.00556191, total time[s] 0.095442 +Converged at iteration 30, L1 6.87006e-05, Linf 0.00462279, total time[s] 0.106107 +Converged at iteration 28, L1 8.2623e-05, Linf 0.00336113, total time[s] 0.086063 +Converged at iteration 29, L1 8.72467e-05, Linf 0.00340969, total time[s] 0.083394 +Converged at iteration 30, L1 9.10865e-05, Linf 0.00306281, total time[s] 0.143977 +Converged at iteration 30, L1 9.97315e-05, Linf 0.00349731, total time[s] 0.153725 +Converged at iteration 33, L1 7.12781e-05, Linf 0.00541236, total time[s] 0.166855 +Converged at iteration 28, L1 6.50093e-05, Linf 0.0036132, total time[s] 0.084238 +Converged at iteration 24, L1 9.68038e-05, Linf 0.00193838, total time[s] 0.108976 +Converged at iteration 24, L1 9.10966e-05, Linf 0.0047894, total time[s] 0.074394 +Converged at iteration 39, L1 9.23266e-05, Linf 0.00552265, total time[s] 0.113279 +Converged at iteration 36, L1 7.24623e-05, Linf 0.00388539, total time[s] 0.111071 +Converged at iteration 26, L1 9.95308e-05, Linf 0.00727326, total time[s] 0.081132 +Converged at iteration 31, L1 6.06382e-05, Linf 0.00507605, total time[s] 0.093536 +Converged at iteration 26, L1 7.51388e-05, Linf 0.00543478, total time[s] 0.071295 +Converged at iteration 21, L1 7.23213e-05, Linf 0.0037818, total time[s] 0.076029 +Converged at iteration 20, L1 6.90843e-05, Linf 0.00513517, total time[s] 0.058831 +Converged at iteration 22, L1 7.30217e-05, Linf 0.00741924, total time[s] 0.077053 +Converged at iteration 26, L1 9.0752e-05, Linf 0.00639644, total time[s] 0.079111 +Converged at iteration 25, L1 7.63834e-05, Linf 0.00410605, total time[s] 0.076294 +Converged at iteration 20, L1 9.02693e-05, Linf 0.00555981, total time[s] 0.0562 +Converged at iteration 17, L1 8.4114e-05, Linf 0.00387382, total time[s] 0.053372 +Converged at iteration 31, L1 9.1773e-05, Linf 0.00276295, total time[s] 0.099241 +Converged at iteration 20, L1 6.69217e-05, Linf 0.00541693, total time[s] 0.079022 +Converged at iteration 24, L1 6.24923e-05, Linf 0.00554806, total time[s] 0.08626 +Converged at iteration 28, L1 7.88703e-05, Linf 0.00348066, total time[s] 0.092952 +Converged at iteration 23, L1 9.90997e-05, Linf 0.00687185, total time[s] 0.075231 +Converged at iteration 21, L1 9.63191e-05, Linf 0.00467508, total time[s] 0.124673 +Converged at iteration 23, L1 8.24546e-05, Linf 0.0041849, total time[s] 0.06377 +Converged at iteration 26, L1 6.46364e-05, Linf 0.00436839, total time[s] 0.075222 +Converged at iteration 29, L1 6.48055e-05, Linf 0.00381229, total time[s] 0.093008 +Converged at iteration 30, L1 7.59719e-05, Linf 0.00461044, total time[s] 0.09736 +Converged at iteration 28, L1 9.32537e-05, Linf 0.00352821, total time[s] 0.073481 +Converged at iteration 29, L1 8.9282e-05, Linf 0.00329567, total time[s] 0.133462 +Converged at iteration 31, L1 6.89733e-05, Linf 0.00277633, total time[s] 0.105597 +Converged at iteration 31, L1 8.73108e-05, Linf 0.00412964, total time[s] 0.108858 +Converged at iteration 33, L1 7.34706e-05, Linf 0.0053893, total time[s] 0.125744 +Converged at iteration 28, L1 6.98466e-05, Linf 0.0036768, total time[s] 0.14862 +Converged at iteration 24, L1 9.41905e-05, Linf 0.00178928, total time[s] 0.092138 +Converged at iteration 25, L1 6.50548e-05, Linf 0.00405359, total time[s] 0.123442 +Converged at iteration 39, L1 9.60853e-05, Linf 0.00542773, total time[s] 0.160577 +Converged at iteration 36, L1 7.20838e-05, Linf 0.00378032, total time[s] 0.134891 +Converged at iteration 27, L1 6.54268e-05, Linf 0.00599703, total time[s] 0.116798 +Converged at iteration 31, L1 6.04202e-05, Linf 0.00509332, total time[s] 0.172209 +Converged at iteration 26, L1 7.77971e-05, Linf 0.00554052, total time[s] 0.116981 +Converged at iteration 21, L1 7.6378e-05, Linf 0.00392145, total time[s] 0.102533 +Converged at iteration 20, L1 7.49154e-05, Linf 0.00524267, total time[s] 0.052612 +Converged at iteration 22, L1 8.8009e-05, Linf 0.0078331, total time[s] 0.122641 +Converged at iteration 27, L1 5.89663e-05, Linf 0.00523576, total time[s] 0.131504 +Converged at iteration 25, L1 8.18523e-05, Linf 0.00413182, total time[s] 0.090425 +Converged at iteration 20, L1 9.48249e-05, Linf 0.00557664, total time[s] 0.060824 +Converged at iteration 17, L1 8.83211e-05, Linf 0.00403074, total time[s] 0.05624 +Converged at iteration 31, L1 8.97806e-05, Linf 0.00275174, total time[s] 0.11399 +Converged at iteration 20, L1 6.93935e-05, Linf 0.00536962, total time[s] 0.057426 +Converged at iteration 24, L1 6.50938e-05, Linf 0.00609064, total time[s] 0.108395 +Converged at iteration 28, L1 8.73491e-05, Linf 0.00362105, total time[s] 0.082553 +Converged at iteration 24, L1 6.22014e-05, Linf 0.00529059, total time[s] 0.087644 +Converged at iteration 22, L1 6.43757e-05, Linf 0.00469137, total time[s] 0.108441 +Converged at iteration 23, L1 8.48388e-05, Linf 0.00433104, total time[s] 0.110883 +Converged at iteration 26, L1 6.51944e-05, Linf 0.00457769, total time[s] 0.123226 +Converged at iteration 29, L1 6.59197e-05, Linf 0.00393093, total time[s] 0.152403 +Converged at iteration 30, L1 8.03976e-05, Linf 0.00460604, total time[s] 0.278393 +Converged at iteration 29, L1 6.56607e-05, Linf 0.00293445, total time[s] 0.172096 +Converged at iteration 29, L1 8.89636e-05, Linf 0.00323275, total time[s] 0.109173 +Converged at iteration 31, L1 7.33923e-05, Linf 0.00298915, total time[s] 0.098199 +Converged at iteration 32, L1 6.75135e-05, Linf 0.003761, total time[s] 0.087265 +Converged at iteration 33, L1 7.44281e-05, Linf 0.00527438, total time[s] 0.103642 +Converged at iteration 28, L1 7.13571e-05, Linf 0.00373021, total time[s] 0.117219 +Converged at iteration 24, L1 9.29883e-05, Linf 0.00191001, total time[s] 0.097865 +Converged at iteration 25, L1 7.15377e-05, Linf 0.00432422, total time[s] 0.085395 +Converged at iteration 39, L1 9.54079e-05, Linf 0.00537808, total time[s] 0.119956 +Converged at iteration 36, L1 7.13169e-05, Linf 0.00373269, total time[s] 0.127623 +Converged at iteration 27, L1 7.55874e-05, Linf 0.00623548, total time[s] 0.103617 +Converged at iteration 31, L1 6.06725e-05, Linf 0.00504839, total time[s] 0.14047 +Converged at iteration 26, L1 7.88958e-05, Linf 0.00544088, total time[s] 0.093063 +Converged at iteration 21, L1 7.75133e-05, Linf 0.00399058, total time[s] 0.061394 +Converged at iteration 20, L1 7.82771e-05, Linf 0.00530329, total time[s] 0.065126 +Converged at iteration 22, L1 9.58052e-05, Linf 0.00777379, total time[s] 0.087871 +Converged at iteration 27, L1 6.3472e-05, Linf 0.00530366, total time[s] 0.098154 +Converged at iteration 25, L1 8.52281e-05, Linf 0.00412727, total time[s] 0.088622 +Converged at iteration 20, L1 9.75054e-05, Linf 0.00557908, total time[s] 0.064513 +Converged at iteration 17, L1 9.06769e-05, Linf 0.00409804, total time[s] 0.049117 +Converged at iteration 31, L1 8.83388e-05, Linf 0.00277253, total time[s] 0.085502 +Converged at iteration 20, L1 6.9887e-05, Linf 0.00533914, total time[s] 0.068029 +Converged at iteration 24, L1 6.4686e-05, Linf 0.00550368, total time[s] 0.100803 +Converged at iteration 28, L1 9.21419e-05, Linf 0.00372581, total time[s] 0.085846 +Converged at iteration 24, L1 6.50259e-05, Linf 0.00530677, total time[s] 0.070215 +Converged at iteration 22, L1 6.50931e-05, Linf 0.00384467, total time[s] 0.085746 +Converged at iteration 23, L1 8.61298e-05, Linf 0.00438585, total time[s] 0.062218 +Converged at iteration 26, L1 6.5548e-05, Linf 0.00467338, total time[s] 0.068725 +Converged at iteration 29, L1 6.6154e-05, Linf 0.00416062, total time[s] 0.076041 +Converged at iteration 30, L1 8.34671e-05, Linf 0.00461508, total time[s] 0.078923 +Converged at iteration 29, L1 6.89025e-05, Linf 0.00299756, total time[s] 0.096127 +Converged at iteration 29, L1 8.789e-05, Linf 0.00320228, total time[s] 0.076081 +Converged at iteration 31, L1 7.61287e-05, Linf 0.00309947, total time[s] 0.081565 +Converged at iteration 32, L1 7.60103e-05, Linf 0.00421492, total time[s] 0.085187 +Converged at iteration 40, L1 6.7839e-05, Linf 0.00363846, total time[s] 0.116854 +Converged at iteration 35, L1 7.65766e-05, Linf 0.00339577, total time[s] 0.104521 +Converged at iteration 30, L1 9.66914e-05, Linf 0.00438527, total time[s] 0.082735 +Converged at iteration 31, L1 6.22604e-05, Linf 0.0050025, total time[s] 0.082463 +Converged at iteration 27, L1 6.26798e-05, Linf 0.00499535, total time[s] 0.083626 +Converged at iteration 22, L1 8.63469e-05, Linf 0.004488, total time[s] 0.104912 +Converged at iteration 20, L1 9.61377e-05, Linf 0.00395696, total time[s] 0.06152 +Converged at iteration 24, L1 8.84047e-05, Linf 0.00476336, total time[s] 0.075617 +Converged at iteration 28, L1 7.39039e-05, Linf 0.00445381, total time[s] 0.095402 +Converged at iteration 26, L1 8.11828e-05, Linf 0.00545398, total time[s] 0.079278 +Converged at iteration 22, L1 7.39267e-05, Linf 0.00508662, total time[s] 0.056713 +Converged at iteration 19, L1 6.63467e-05, Linf 0.00393098, total time[s] 0.058906 +Converged at iteration 30, L1 8.00048e-05, Linf 0.00329632, total time[s] 0.087612 +Converged at iteration 20, L1 8.44516e-05, Linf 0.00455032, total time[s] 0.102033 +Converged at iteration 24, L1 7.10869e-05, Linf 0.00463289, total time[s] 0.067919 +Converged at iteration 31, L1 8.95443e-05, Linf 0.00569146, total time[s] 0.102818 +Converged at iteration 27, L1 9.91697e-05, Linf 0.00569854, total time[s] 0.074873 +Converged at iteration 24, L1 8.79666e-05, Linf 0.0046505, total time[s] 0.081413 +Converged at iteration 23, L1 9.34847e-05, Linf 0.00616467, total time[s] 0.123297 +Converged at iteration 26, L1 7.22115e-05, Linf 0.00446142, total time[s] 0.080467 +Converged at iteration 29, L1 7.81342e-05, Linf 0.00479595, total time[s] 0.100834 +Converged at iteration 34, L1 7.09142e-05, Linf 0.00422732, total time[s] 0.168132 +Converged at iteration 30, L1 9.39289e-05, Linf 0.00442598, total time[s] 0.145804 +Converged at iteration 28, L1 9.49833e-05, Linf 0.00310979, total time[s] 0.090699 +Converged at iteration 32, L1 9.39433e-05, Linf 0.00374119, total time[s] 0.12795 +Converged at iteration 37, L1 7.39038e-05, Linf 0.00328085, total time[s] 0.146252 +Converged at iteration 33, L1 8.44941e-05, Linf 0.00469111, total time[s] 0.092654 +Converged at iteration 28, L1 9.66974e-05, Linf 0.00426154, total time[s] 0.098788 +Converged at iteration 24, L1 8.83221e-05, Linf 0.0032507, total time[s] 0.081606 +Converged at iteration 26, L1 8.98068e-05, Linf 0.00383972, total time[s] 0.086556 +Converged at iteration 40, L1 6.69953e-05, Linf 0.00379351, total time[s] 0.125025 +Converged at iteration 35, L1 8.29951e-05, Linf 0.00351908, total time[s] 0.110463 +Converged at iteration 30, L1 9.62038e-05, Linf 0.0042219, total time[s] 0.095077 +Converged at iteration 31, L1 6.1869e-05, Linf 0.0050382, total time[s] 0.094138 +Converged at iteration 27, L1 6.02361e-05, Linf 0.00494117, total time[s] 0.111731 +Converged at iteration 22, L1 7.71102e-05, Linf 0.00430667, total time[s] 0.07697 +Converged at iteration 21, L1 6.28138e-05, Linf 0.00336284, total time[s] 0.160889 +Converged at iteration 24, L1 9.04134e-05, Linf 0.00488808, total time[s] 0.069943 +Converged at iteration 28, L1 7.43848e-05, Linf 0.00444377, total time[s] 0.121002 +Converged at iteration 26, L1 8.06121e-05, Linf 0.00551257, total time[s] 0.111824 +Converged at iteration 22, L1 7.22129e-05, Linf 0.00483189, total time[s] 0.107948 +Converged at iteration 19, L1 5.91184e-05, Linf 0.00361611, total time[s] 0.066424 +Converged at iteration 20, L1 8.49751e-05, Linf 0.00114939, total time[s] 0.063842 +Converged at iteration 20, L1 8.53534e-05, Linf 0.0046527, total time[s] 0.059428 +Converged at iteration 24, L1 7.16168e-05, Linf 0.00468177, total time[s] 0.07741 +Converged at iteration 31, L1 9.50604e-05, Linf 0.01068, total time[s] 0.104522 +Converged at iteration 27, L1 9.89174e-05, Linf 0.00537714, total time[s] 0.077575 +Converged at iteration 24, L1 8.68919e-05, Linf 0.00451261, total time[s] 0.077819 +Converged at iteration 23, L1 9.25871e-05, Linf 0.00430957, total time[s] 0.109641 +Converged at iteration 26, L1 7.20435e-05, Linf 0.00456628, total time[s] 0.102107 +Converged at iteration 29, L1 7.63628e-05, Linf 0.00485516, total time[s] 0.101007 +Converged at iteration 34, L1 7.8586e-05, Linf 0.00434162, total time[s] 0.112864 +Converged at iteration 31, L1 6.91619e-05, Linf 0.00361747, total time[s] 0.093086 +Converged at iteration 28, L1 9.85044e-05, Linf 0.00321118, total time[s] 0.091824 +Converged at iteration 32, L1 8.58507e-05, Linf 0.00362206, total time[s] 0.114718 +Converged at iteration 36, L1 9.6296e-05, Linf 0.00371593, total time[s] 0.107951 +Converged at iteration 33, L1 8.39011e-05, Linf 0.00483854, total time[s] 0.092097 +Converged at iteration 28, L1 9.33857e-05, Linf 0.00420304, total time[s] 0.075393 +Converged at iteration 24, L1 8.21843e-05, Linf 0.00304609, total time[s] 0.081698 +Converged at iteration 26, L1 8.71964e-05, Linf 0.00391667, total time[s] 0.075797 +Converged at iteration 40, L1 6.71208e-05, Linf 0.00375265, total time[s] 0.122877 +Converged at iteration 35, L1 7.91683e-05, Linf 0.00345697, total time[s] 0.108017 +Converged at iteration 30, L1 9.70611e-05, Linf 0.00426873, total time[s] 0.085977 +Converged at iteration 31, L1 6.35129e-05, Linf 0.00714005, total time[s] 0.085527 +Converged at iteration 27, L1 6.1347e-05, Linf 0.0049695, total time[s] 0.080047 +Converged at iteration 22, L1 8.14067e-05, Linf 0.00439786, total time[s] 0.071575 +Converged at iteration 20, L1 9.85721e-05, Linf 0.00410416, total time[s] 0.058387 +Converged at iteration 24, L1 9.03064e-05, Linf 0.00485461, total time[s] 0.063271 +Converged at iteration 28, L1 7.42462e-05, Linf 0.00445206, total time[s] 0.091842 +Converged at iteration 26, L1 8.09496e-05, Linf 0.0055005, total time[s] 0.077929 +Converged at iteration 22, L1 7.27859e-05, Linf 0.00501158, total time[s] 0.068551 +Converged at iteration 19, L1 6.31029e-05, Linf 0.00378284, total time[s] 0.053819 +Converged at iteration 30, L1 8.38613e-05, Linf 0.00329997, total time[s] 0.077109 +Converged at iteration 20, L1 8.47893e-05, Linf 0.00460047, total time[s] 0.054713 +Converged at iteration 24, L1 7.20021e-05, Linf 0.00464984, total time[s] 0.090728 +Converged at iteration 31, L1 9.13888e-05, Linf 0.00556092, total time[s] 0.081848 +Converged at iteration 27, L1 9.94037e-05, Linf 0.0056216, total time[s] 0.068848 +Converged at iteration 24, L1 8.76336e-05, Linf 0.00459854, total time[s] 0.084411 +Converged at iteration 23, L1 9.24812e-05, Linf 0.00415742, total time[s] 0.064611 +Converged at iteration 26, L1 7.2114e-05, Linf 0.00451189, total time[s] 0.071283 +Converged at iteration 29, L1 7.74117e-05, Linf 0.00482512, total time[s] 0.077866 +Converged at iteration 34, L1 7.53213e-05, Linf 0.00428326, total time[s] 0.094807 +Converged at iteration 30, L1 9.7229e-05, Linf 0.00440844, total time[s] 0.085894 +Converged at iteration 28, L1 9.63642e-05, Linf 0.00316012, total time[s] 0.078557 +Converged at iteration 32, L1 8.94257e-05, Linf 0.00370489, total time[s] 0.086025 +Converged at iteration 37, L1 7.09543e-05, Linf 0.00313471, total time[s] 0.101741 +Converged at iteration 33, L1 8.42426e-05, Linf 0.00473825, total time[s] 0.096442 +Converged at iteration 28, L1 9.53232e-05, Linf 0.00424684, total time[s] 0.087253 +Converged at iteration 24, L1 8.45451e-05, Linf 0.00314839, total time[s] 0.081946 +Converged at iteration 26, L1 8.88757e-05, Linf 0.00384757, total time[s] 0.103897 +Converged at iteration 40, L1 6.68167e-05, Linf 0.00387591, total time[s] 0.124557 +Converged at iteration 35, L1 8.43022e-05, Linf 0.0035578, total time[s] 0.107252 +Converged at iteration 30, L1 9.43951e-05, Linf 0.00419751, total time[s] 0.097414 +Converged at iteration 31, L1 6.18274e-05, Linf 0.00504185, total time[s] 0.09013 +Converged at iteration 26, L1 9.98425e-05, Linf 0.00579147, total time[s] 0.070962 +Converged at iteration 22, L1 7.45766e-05, Linf 0.00425087, total time[s] 0.08477 +Converged at iteration 21, L1 6.32973e-05, Linf 0.00340805, total time[s] 0.062028 +Converged at iteration 24, L1 8.9875e-05, Linf 0.00491427, total time[s] 0.067183 +Converged at iteration 28, L1 7.41554e-05, Linf 0.00443796, total time[s] 0.079908 +Converged at iteration 26, L1 8.03135e-05, Linf 0.00545083, total time[s] 0.072206 +Converged at iteration 22, L1 7.16339e-05, Linf 0.0046905, total time[s] 0.076272 +Converged at iteration 19, L1 5.75328e-05, Linf 0.00349385, total time[s] 0.072196 +Converged at iteration 30, L1 9.14449e-05, Linf 0.00333812, total time[s] 0.089572 +Converged at iteration 20, L1 8.49607e-05, Linf 0.00468561, total time[s] 0.063108 +Converged at iteration 24, L1 7.20437e-05, Linf 0.0047099, total time[s] 0.069139 +Converged at iteration 31, L1 9.36031e-05, Linf 0.00515366, total time[s] 0.095579 +Converged at iteration 27, L1 9.78196e-05, Linf 0.00511091, total time[s] 0.079238 +Converged at iteration 24, L1 8.66156e-05, Linf 0.00442687, total time[s] 0.070189 +Converged at iteration 23, L1 9.28502e-05, Linf 0.0042635, total time[s] 0.077984 +Converged at iteration 26, L1 7.16817e-05, Linf 0.00460361, total time[s] 0.10521 +Converged at iteration 29, L1 7.58833e-05, Linf 0.00487006, total time[s] 0.097273 +Converged at iteration 34, L1 8.02381e-05, Linf 0.00430103, total time[s] 0.097904 +Converged at iteration 31, L1 7.04941e-05, Linf 0.00358988, total time[s] 0.088102 +Converged at iteration 29, L1 6.86517e-05, Linf 0.00268415, total time[s] 0.083486 +Converged at iteration 32, L1 8.40121e-05, Linf 0.00358539, total time[s] 0.084704 +Converged at iteration 36, L1 9.19967e-05, Linf 0.00365831, total time[s] 0.117445 +Converged at iteration 33, L1 8.36128e-05, Linf 0.00481885, total time[s] 0.107951 +Converged at iteration 28, L1 9.24768e-05, Linf 0.00416598, total time[s] 0.082762 +Converged at iteration 24, L1 8.11649e-05, Linf 0.00301565, total time[s] 0.072207 +Converged at iteration 26, L1 8.61042e-05, Linf 0.00390841, total time[s] 0.084244 +Converged at iteration 40, L1 6.61411e-05, Linf 0.00412085, total time[s] 0.108293 +Converged at iteration 35, L1 9.21921e-05, Linf 0.00373793, total time[s] 0.130168 +Converged at iteration 30, L1 8.83411e-05, Linf 0.00417746, total time[s] 0.095906 +Converged at iteration 31, L1 6.14467e-05, Linf 0.00505667, total time[s] 0.102084 +Converged at iteration 26, L1 9.44009e-05, Linf 0.00595287, total time[s] 0.087516 +Converged at iteration 22, L1 6.40412e-05, Linf 0.00405232, total time[s] 0.069499 +Converged at iteration 21, L1 6.762e-05, Linf 0.00371403, total time[s] 0.071262 +Converged at iteration 24, L1 8.87308e-05, Linf 0.00507276, total time[s] 0.0649 +Converged at iteration 28, L1 7.00325e-05, Linf 0.00441317, total time[s] 0.076895 +Converged at iteration 26, L1 8.22441e-05, Linf 0.0049187, total time[s] 0.081007 +Converged at iteration 22, L1 6.14904e-05, Linf 0.00355169, total time[s] 0.071506 +Converged at iteration 18, L1 8.83975e-05, Linf 0.00353297, total time[s] 0.057179 +Converged at iteration 31, L1 7.03573e-05, Linf 0.00269065, total time[s] 0.088308 +Converged at iteration 20, L1 8.28988e-05, Linf 0.00484174, total time[s] 0.057627 +Converged at iteration 24, L1 7.01658e-05, Linf 0.00487469, total time[s] 0.069395 +Converged at iteration 31, L1 9.27602e-05, Linf 0.00373472, total time[s] 0.113875 +Converged at iteration 27, L1 6.86538e-05, Linf 0.00358491, total time[s] 0.088444 +Converged at iteration 24, L1 7.73665e-05, Linf 0.00375639, total time[s] 0.080884 +Converged at iteration 23, L1 9.27166e-05, Linf 0.00446792, total time[s] 0.099166 +Converged at iteration 26, L1 7.03334e-05, Linf 0.0048107, total time[s] 0.06869 +Converged at iteration 29, L1 7.32458e-05, Linf 0.00492796, total time[s] 0.078999 +Converged at iteration 34, L1 7.11944e-05, Linf 0.00308605, total time[s] 0.121599 +Converged at iteration 31, L1 7.79666e-05, Linf 0.00338518, total time[s] 0.112464 +Converged at iteration 29, L1 7.475e-05, Linf 0.00284117, total time[s] 0.097757 +Converged at iteration 32, L1 7.78173e-05, Linf 0.00343143, total time[s] 0.097256 +Converged at iteration 36, L1 7.78067e-05, Linf 0.00341215, total time[s] 0.095684 +Converged at iteration 33, L1 8.20439e-05, Linf 0.00493266, total time[s] 0.089966 +Converged at iteration 28, L1 8.76218e-05, Linf 0.00409556, total time[s] 0.082741 +Converged at iteration 24, L1 7.87646e-05, Linf 0.00274384, total time[s] 0.063374 +Converged at iteration 26, L1 8.25297e-05, Linf 0.00399629, total time[s] 0.066398 +Converged at iteration 40, L1 6.76935e-05, Linf 0.00409359, total time[s] 0.111753 +Converged at iteration 35, L1 8.83791e-05, Linf 0.00361712, total time[s] 0.101344 +Converged at iteration 30, L1 9.07271e-05, Linf 0.00417474, total time[s] 0.088235 +Converged at iteration 31, L1 6.17101e-05, Linf 0.00503923, total time[s] 0.110365 +Converged at iteration 26, L1 9.71207e-05, Linf 0.00576403, total time[s] 0.081357 +Converged at iteration 22, L1 6.97324e-05, Linf 0.00412984, total time[s] 0.076704 +Converged at iteration 21, L1 6.49918e-05, Linf 0.00355704, total time[s] 0.059905 +Converged at iteration 24, L1 8.91833e-05, Linf 0.00498343, total time[s] 0.069622 +Converged at iteration 28, L1 7.22148e-05, Linf 0.00442492, total time[s] 0.091893 +Converged at iteration 26, L1 8.12786e-05, Linf 0.00524392, total time[s] 0.08879 +Converged at iteration 23, L1 7.77461e-05, Linf 0.00527216, total time[s] 0.064178 +Converged at iteration 18, L1 9.86655e-05, Linf 0.0040276, total time[s] 0.063054 +Converged at iteration 30, L1 9.80244e-05, Linf 0.00330847, total time[s] 0.096338 +Converged at iteration 20, L1 8.37181e-05, Linf 0.00476021, total time[s] 0.068343 +Converged at iteration 24, L1 7.10852e-05, Linf 0.00478407, total time[s] 0.124702 +Converged at iteration 31, L1 9.62683e-05, Linf 0.00451928, total time[s] 0.121967 +Converged at iteration 27, L1 9.00638e-05, Linf 0.0043296, total time[s] 0.080424 +Converged at iteration 24, L1 8.43065e-05, Linf 0.0041441, total time[s] 0.087895 +Converged at iteration 23, L1 9.25773e-05, Linf 0.00436692, total time[s] 0.078686 +Converged at iteration 26, L1 7.1126e-05, Linf 0.00469839, total time[s] 0.080666 +Converged at iteration 29, L1 7.47591e-05, Linf 0.00489909, total time[s] 0.079571 +Converged at iteration 34, L1 8.25391e-05, Linf 0.00380842, total time[s] 0.107973 +Converged at iteration 31, L1 7.46266e-05, Linf 0.00352326, total time[s] 0.087548 +Converged at iteration 29, L1 7.17354e-05, Linf 0.00273883, total time[s] 0.074794 +Converged at iteration 32, L1 8.14201e-05, Linf 0.00349599, total time[s] 0.095012 +Converged at iteration 36, L1 8.44461e-05, Linf 0.00353428, total time[s] 0.105755 +Converged at iteration 33, L1 8.33132e-05, Linf 0.00487357, total time[s] 0.116008 +Converged at iteration 28, L1 9.04258e-05, Linf 0.00410774, total time[s] 0.08255 +Converged at iteration 24, L1 7.97259e-05, Linf 0.00287996, total time[s] 0.06853 +Converged at iteration 26, L1 8.37553e-05, Linf 0.00394215, total time[s] 0.082893 +Converged at iteration 40, L1 6.67203e-05, Linf 0.00417998, total time[s] 0.13587 +Converged at iteration 35, L1 9.5036e-05, Linf 0.00380571, total time[s] 0.103621 +Converged at iteration 30, L1 8.4874e-05, Linf 0.00423165, total time[s] 0.111116 +Converged at iteration 31, L1 6.14963e-05, Linf 0.00505987, total time[s] 0.089304 +Converged at iteration 26, L1 9.25548e-05, Linf 0.00571117, total time[s] 0.070902 +Converged at iteration 21, L1 9.96829e-05, Linf 0.00468783, total time[s] 0.062259 +Converged at iteration 21, L1 6.99422e-05, Linf 0.00384158, total time[s] 0.060455 +Converged at iteration 24, L1 8.6555e-05, Linf 0.00505549, total time[s] 0.064839 +Converged at iteration 28, L1 6.91024e-05, Linf 0.00440718, total time[s] 0.081806 +Converged at iteration 26, L1 8.31061e-05, Linf 0.00461167, total time[s] 0.084244 +Converged at iteration 21, L1 9.7824e-05, Linf 0.00435515, total time[s] 0.060408 +Converged at iteration 18, L1 8.13315e-05, Linf 0.00324776, total time[s] 0.051856 +Converged at iteration 31, L1 7.26714e-05, Linf 0.00267194, total time[s] 0.086842 +Converged at iteration 20, L1 8.25382e-05, Linf 0.00490162, total time[s] 0.061915 +Converged at iteration 24, L1 6.98505e-05, Linf 0.00493864, total time[s] 0.080398 +Converged at iteration 31, L1 8.03741e-05, Linf 0.00331422, total time[s] 0.08146 +Converged at iteration 26, L1 7.83972e-05, Linf 0.00395686, total time[s] 0.068066 +Converged at iteration 24, L1 6.77209e-05, Linf 0.00351246, total time[s] 0.079068 +Converged at iteration 23, L1 9.3729e-05, Linf 0.00452316, total time[s] 0.063606 +Converged at iteration 26, L1 6.9726e-05, Linf 0.00487398, total time[s] 0.083456 +Converged at iteration 29, L1 7.23831e-05, Linf 0.00493197, total time[s] 0.076733 +Converged at iteration 33, L1 7.9143e-05, Linf 0.00322962, total time[s] 0.101818 +Converged at iteration 31, L1 7.74531e-05, Linf 0.00324263, total time[s] 0.093864 +Converged at iteration 29, L1 7.59762e-05, Linf 0.00288495, total time[s] 0.080847 +Converged at iteration 32, L1 7.62689e-05, Linf 0.00339359, total time[s] 0.123974 +Converged at iteration 36, L1 7.35439e-05, Linf 0.00336112, total time[s] 0.093886 +Converged at iteration 33, L1 8.11505e-05, Linf 0.00496837, total time[s] 0.103911 +Converged at iteration 28, L1 8.57579e-05, Linf 0.00402325, total time[s] 0.113068 +Converged at iteration 24, L1 7.84254e-05, Linf 0.00263113, total time[s] 0.067805 +Converged at iteration 26, L1 8.27023e-05, Linf 0.00401639, total time[s] 0.124016 +Converged at iteration 40, L1 6.52752e-05, Linf 0.00405513, total time[s] 0.149174 +Converged at iteration 35, L1 9.14115e-05, Linf 0.00371927, total time[s] 0.114183 +Converged at iteration 30, L1 8.88695e-05, Linf 0.00417542, total time[s] 0.129094 +Converged at iteration 31, L1 6.15081e-05, Linf 0.00505968, total time[s] 0.119054 +Converged at iteration 26, L1 9.48908e-05, Linf 0.00579792, total time[s] 0.071169 +Converged at iteration 22, L1 6.53185e-05, Linf 0.00407217, total time[s] 0.074922 +Converged at iteration 21, L1 6.71715e-05, Linf 0.00369224, total time[s] 0.056307 +Converged at iteration 24, L1 8.8786e-05, Linf 0.00505368, total time[s] 0.075716 +Converged at iteration 28, L1 7.0466e-05, Linf 0.00441435, total time[s] 0.0844 +Converged at iteration 26, L1 8.19589e-05, Linf 0.00498599, total time[s] 0.075685 +Converged at iteration 22, L1 6.36945e-05, Linf 0.00369785, total time[s] 0.092217 +Converged at iteration 18, L1 9.07158e-05, Linf 0.00362997, total time[s] 0.054491 +Converged at iteration 31, L1 6.9752e-05, Linf 0.00267205, total time[s] 0.088801 +Converged at iteration 20, L1 8.3188e-05, Linf 0.00482507, total time[s] 0.071427 +Converged at iteration 24, L1 7.0486e-05, Linf 0.00485941, total time[s] 0.068068 +Converged at iteration 31, L1 9.36812e-05, Linf 0.0038732, total time[s] 0.120565 +Converged at iteration 27, L1 7.4712e-05, Linf 0.00371965, total time[s] 0.076015 +Converged at iteration 24, L1 7.95187e-05, Linf 0.00383975, total time[s] 0.074675 +Converged at iteration 23, L1 9.27499e-05, Linf 0.00444944, total time[s] 0.081108 +Converged at iteration 26, L1 7.05526e-05, Linf 0.00478899, total time[s] 0.093584 +Converged at iteration 29, L1 7.35294e-05, Linf 0.00481753, total time[s] 0.086494 +Converged at iteration 34, L1 7.66691e-05, Linf 0.00322536, total time[s] 0.098222 +Converged at iteration 31, L1 7.76221e-05, Linf 0.00342369, total time[s] 0.08123 +Converged at iteration 29, L1 7.38855e-05, Linf 0.00281023, total time[s] 0.090648 +Converged at iteration 32, L1 7.80044e-05, Linf 0.00344741, total time[s] 0.08919 +Converged at iteration 36, L1 7.75778e-05, Linf 0.00340886, total time[s] 0.100205 +Converged at iteration 33, L1 8.20508e-05, Linf 0.00492098, total time[s] 0.102911 +Converged at iteration 28, L1 8.78353e-05, Linf 0.0040609, total time[s] 0.079618 +Converged at iteration 24, L1 7.88695e-05, Linf 0.00274069, total time[s] 0.077773 +Converged at iteration 26, L1 8.2272e-05, Linf 0.0039723, total time[s] 0.083051 +Converged at iteration 40, L1 6.63482e-05, Linf 0.00417935, total time[s] 0.122412 +Converged at iteration 35, L1 9.59554e-05, Linf 0.00384692, total time[s] 0.11093 +Converged at iteration 30, L1 7.56701e-05, Linf 0.00417889, total time[s] 0.087504 +Converged at iteration 31, L1 6.13593e-05, Linf 0.00506153, total time[s] 0.099587 +Converged at iteration 26, L1 9.11531e-05, Linf 0.00569339, total time[s] 0.072381 +Converged at iteration 21, L1 9.67675e-05, Linf 0.00462658, total time[s] 0.080683 +Converged at iteration 21, L1 6.8552e-05, Linf 0.00392844, total time[s] 0.079191 +Converged at iteration 24, L1 8.1839e-05, Linf 0.00518827, total time[s] 0.072045 +Converged at iteration 28, L1 6.82823e-05, Linf 0.00440361, total time[s] 0.090089 +Converged at iteration 26, L1 8.24326e-05, Linf 0.00439291, total time[s] 0.076421 +Converged at iteration 21, L1 8.82821e-05, Linf 0.00431994, total time[s] 0.065475 +Converged at iteration 18, L1 7.54182e-05, Linf 0.00303618, total time[s] 0.050846 +Converged at iteration 31, L1 7.47627e-05, Linf 0.00267801, total time[s] 0.125573 +Converged at iteration 20, L1 8.22138e-05, Linf 0.00493877, total time[s] 0.065373 +Converged at iteration 24, L1 6.91989e-05, Linf 0.00498966, total time[s] 0.068161 +Converged at iteration 30, L1 9.83034e-05, Linf 0.00355261, total time[s] 0.083029 +Converged at iteration 25, L1 9.94453e-05, Linf 0.00473009, total time[s] 0.087128 +Converged at iteration 23, L1 8.9176e-05, Linf 0.00397856, total time[s] 0.086511 +Converged at iteration 23, L1 9.46607e-05, Linf 0.00456098, total time[s] 0.069832 +Converged at iteration 26, L1 6.934e-05, Linf 0.0049196, total time[s] 0.070146 +Converged at iteration 29, L1 7.16566e-05, Linf 0.00491193, total time[s] 0.092749 +Converged at iteration 32, L1 9.26842e-05, Linf 0.00356391, total time[s] 0.112001 +Converged at iteration 31, L1 7.46309e-05, Linf 0.00309557, total time[s] 0.093448 +Converged at iteration 29, L1 7.73018e-05, Linf 0.0029044, total time[s] 0.088841 +Converged at iteration 32, L1 7.56783e-05, Linf 0.0033619, total time[s] 0.088185 +Converged at iteration 35, L1 9.70821e-05, Linf 0.00405261, total time[s] 0.102144 +Converged at iteration 33, L1 8.05858e-05, Linf 0.00499747, total time[s] 0.091927 +Converged at iteration 28, L1 8.45988e-05, Linf 0.00399222, total time[s] 0.084441 +Converged at iteration 24, L1 7.83719e-05, Linf 0.00256464, total time[s] 0.072373 +Converged at iteration 26, L1 8.30164e-05, Linf 0.00403228, total time[s] 0.09659 +Converged at iteration 39, L1 9.77988e-05, Linf 0.00512078, total time[s] 0.110672 +Converged at iteration 36, L1 6.91682e-05, Linf 0.00348211, total time[s] 0.113189 +Converged at iteration 28, L1 9.59197e-05, Linf 0.00588921, total time[s] 0.0778 +Converged at iteration 31, L1 6.09075e-05, Linf 0.00506654, total time[s] 0.082033 +Converged at iteration 26, L1 8.52464e-05, Linf 0.00560712, total time[s] 0.087772 +Converged at iteration 21, L1 8.62958e-05, Linf 0.00434152, total time[s] 0.059473 +Converged at iteration 20, L1 9.90924e-05, Linf 0.00535175, total time[s] 0.058384 +Converged at iteration 23, L1 8.9423e-05, Linf 0.00644539, total time[s] 0.069654 +Converged at iteration 27, L1 9.10879e-05, Linf 0.0054826, total time[s] 0.101533 +Converged at iteration 26, L1 6.24473e-05, Linf 0.00350788, total time[s] 0.081444 +Converged at iteration 21, L1 6.08295e-05, Linf 0.00426188, total time[s] 0.072048 +Converged at iteration 18, L1 5.51405e-05, Linf 0.00272165, total time[s] 0.082543 +Converged at iteration 31, L1 8.17668e-05, Linf 0.00271079, total time[s] 0.10365 +Converged at iteration 20, L1 7.82648e-05, Linf 0.00513098, total time[s] 0.074529 +Converged at iteration 24, L1 6.80405e-05, Linf 0.00523538, total time[s] 0.073608 +Converged at iteration 29, L1 8.83044e-05, Linf 0.00333609, total time[s] 0.103888 +Converged at iteration 24, L1 8.90997e-05, Linf 0.00545068, total time[s] 0.078417 +Converged at iteration 22, L1 8.66885e-05, Linf 0.00421438, total time[s] 0.073555 +Converged at iteration 23, L1 9.51138e-05, Linf 0.00460574, total time[s] 0.069017 +Converged at iteration 26, L1 6.7419e-05, Linf 0.00499099, total time[s] 0.099789 +Converged at iteration 29, L1 6.89182e-05, Linf 0.00459502, total time[s] 0.101968 +Converged at iteration 31, L1 7.26135e-05, Linf 0.00373104, total time[s] 0.102086 +Converged at iteration 29, L1 9.90206e-05, Linf 0.00344524, total time[s] 0.077273 +Converged at iteration 29, L1 8.23011e-05, Linf 0.00304373, total time[s] 0.089785 +Converged at iteration 31, L1 9.33599e-05, Linf 0.00381147, total time[s] 0.111587 +Converged at iteration 34, L1 6.97146e-05, Linf 0.0040587, total time[s] 0.094123 +Converged at iteration 33, L1 7.79817e-05, Linf 0.00511857, total time[s] 0.116502 +Converged at iteration 28, L1 7.87604e-05, Linf 0.00388283, total time[s] 0.074165 +Converged at iteration 24, L1 8.1829e-05, Linf 0.00228147, total time[s] 0.15817 +Converged at iteration 26, L1 6.70944e-05, Linf 0.00395348, total time[s] 0.108126 +Converged at iteration 39, L1 9.91454e-05, Linf 0.00499926, total time[s] 0.109493 +Converged at iteration 35, L1 9.91418e-05, Linf 0.00395718, total time[s] 0.114574 +Converged at iteration 29, L1 8.44665e-05, Linf 0.00499822, total time[s] 0.090135 +Converged at iteration 31, L1 6.11554e-05, Linf 0.00506408, total time[s] 0.081554 +Converged at iteration 26, L1 8.81663e-05, Linf 0.00559527, total time[s] 0.086631 +Converged at iteration 21, L1 9.08851e-05, Linf 0.00448805, total time[s] 0.066436 +Converged at iteration 21, L1 6.40821e-05, Linf 0.00403609, total time[s] 0.074905 +Converged at iteration 24, L1 6.7538e-05, Linf 0.00527782, total time[s] 0.074898 +Converged at iteration 28, L1 6.23572e-05, Linf 0.00439816, total time[s] 0.084533 +Converged at iteration 26, L1 7.42333e-05, Linf 0.00388752, total time[s] 0.078658 +Converged at iteration 21, L1 7.19696e-05, Linf 0.00430415, total time[s] 0.069048 +Converged at iteration 18, L1 6.42951e-05, Linf 0.00281093, total time[s] 0.068539 +Converged at iteration 31, L1 7.83288e-05, Linf 0.00269362, total time[s] 0.129169 +Converged at iteration 20, L1 8.11734e-05, Linf 0.00503369, total time[s] 0.0962 +Converged at iteration 24, L1 6.82146e-05, Linf 0.00510923, total time[s] 0.125492 +Converged at iteration 30, L1 7.57866e-05, Linf 0.00307278, total time[s] 0.11349 +Converged at iteration 25, L1 7.10689e-05, Linf 0.00439518, total time[s] 0.069847 +Converged at iteration 23, L1 6.84698e-05, Linf 0.00367968, total time[s] 0.074571 +Converged at iteration 23, L1 9.57602e-05, Linf 0.00461118, total time[s] 0.101264 +Converged at iteration 26, L1 6.85981e-05, Linf 0.00507093, total time[s] 0.078339 +Converged at iteration 29, L1 7.09991e-05, Linf 0.0048035, total time[s] 0.120743 +Converged at iteration 31, L1 9.59972e-05, Linf 0.00395004, total time[s] 0.097168 +Converged at iteration 30, L1 8.78501e-05, Linf 0.00323342, total time[s] 0.082362 +Converged at iteration 29, L1 7.95789e-05, Linf 0.00299009, total time[s] 0.077393 +Converged at iteration 32, L1 7.17363e-05, Linf 0.0033126, total time[s] 0.085321 +Converged at iteration 35, L1 6.95922e-05, Linf 0.00375214, total time[s] 0.092014 +Converged at iteration 33, L1 7.9295e-05, Linf 0.0050586, total time[s] 0.091708 +Converged at iteration 28, L1 8.1643e-05, Linf 0.0039833, total time[s] 0.077376 +Converged at iteration 24, L1 7.92438e-05, Linf 0.0024226, total time[s] 0.062396 +Converged at iteration 26, L1 7.73606e-05, Linf 0.00407264, total time[s] 0.075401 +Converged at iteration 39, L1 9.7417e-05, Linf 0.00525457, total time[s] 0.113928 +Converged at iteration 36, L1 6.95335e-05, Linf 0.00352124, total time[s] 0.098814 +Converged at iteration 28, L1 7.68272e-05, Linf 0.00569234, total time[s] 0.084323 +Converged at iteration 31, L1 6.1632e-05, Linf 0.00507327, total time[s] 0.089766 +Converged at iteration 26, L1 8.38082e-05, Linf 0.00564139, total time[s] 0.07359 +Converged at iteration 21, L1 8.36544e-05, Linf 0.00424933, total time[s] 0.069354 +Converged at iteration 20, L1 9.30209e-05, Linf 0.00535129, total time[s] 0.053565 +Converged at iteration 23, L1 7.57687e-05, Linf 0.00644424, total time[s] 0.061147 +Converged at iteration 27, L1 8.32545e-05, Linf 0.00547963, total time[s] 0.10682 +Converged at iteration 25, L1 9.91491e-05, Linf 0.00420982, total time[s] 0.070396 +Converged at iteration 21, L1 5.6284e-05, Linf 0.00423528, total time[s] 0.058386 +Converged at iteration 18, L1 5.12856e-05, Linf 0.00271008, total time[s] 0.058237 +Converged at iteration 31, L1 8.37615e-05, Linf 0.00272086, total time[s] 0.097657 +Converged at iteration 20, L1 7.61265e-05, Linf 0.00519204, total time[s] 0.059707 +Converged at iteration 24, L1 6.72986e-05, Linf 0.00531806, total time[s] 0.089581 +Converged at iteration 29, L1 7.94889e-05, Linf 0.00313278, total time[s] 0.10646 +Converged at iteration 24, L1 8.15041e-05, Linf 0.00539613, total time[s] 0.070409 +Converged at iteration 22, L1 7.85507e-05, Linf 0.0041014, total time[s] 0.066433 +Converged at iteration 23, L1 9.29528e-05, Linf 0.0045722, total time[s] 0.066523 +Converged at iteration 26, L1 6.68608e-05, Linf 0.00494923, total time[s] 0.097096 +Converged at iteration 29, L1 6.81887e-05, Linf 0.00443484, total time[s] 0.098375 +Converged at iteration 31, L1 6.43635e-05, Linf 0.003624, total time[s] 0.092328 +Converged at iteration 29, L1 8.82737e-05, Linf 0.00330268, total time[s] 0.090016 +Converged at iteration 29, L1 8.37741e-05, Linf 0.00308641, total time[s] 0.098803 +Converged at iteration 31, L1 8.85593e-05, Linf 0.00363128, total time[s] 0.082805 +Converged at iteration 33, L1 8.47949e-05, Linf 0.00463237, total time[s] 0.10667 +Converged at iteration 33, L1 7.71076e-05, Linf 0.00515529, total time[s] 0.088514 +Converged at iteration 28, L1 7.70613e-05, Linf 0.00384903, total time[s] 0.085882 +Converged at iteration 24, L1 8.40536e-05, Linf 0.0021957, total time[s] 0.07224 +Converged at iteration 25, L1 9.44633e-05, Linf 0.00483521, total time[s] 0.080474 +Converged at iteration 39, L1 9.7981e-05, Linf 0.00509795, total time[s] 0.139979 +Converged at iteration 36, L1 6.83906e-05, Linf 0.00342315, total time[s] 0.101937 +Converged at iteration 29, L1 6.11564e-05, Linf 0.00486398, total time[s] 0.117312 +Converged at iteration 31, L1 6.09193e-05, Linf 0.00506577, total time[s] 0.089151 +Converged at iteration 26, L1 8.59018e-05, Linf 0.00561599, total time[s] 0.085235 +Converged at iteration 21, L1 8.70855e-05, Linf 0.0043717, total time[s] 0.060191 +Converged at iteration 21, L1 5.85537e-05, Linf 0.00407003, total time[s] 0.060142 +Converged at iteration 23, L1 9.38298e-05, Linf 0.00643677, total time[s] 0.072849 +Converged at iteration 27, L1 9.34397e-05, Linf 0.00548597, total time[s] 0.07323 +Converged at iteration 26, L1 6.40975e-05, Linf 0.00356873, total time[s] 0.076728 +Converged at iteration 21, L1 6.25399e-05, Linf 0.00427075, total time[s] 0.066015 +Converged at iteration 18, L1 5.67887e-05, Linf 0.00276068, total time[s] 0.050145 +Converged at iteration 31, L1 8.1068e-05, Linf 0.00271286, total time[s] 0.161168 +Converged at iteration 20, L1 7.90417e-05, Linf 0.00511156, total time[s] 0.074242 +Converged at iteration 24, L1 6.79526e-05, Linf 0.00521332, total time[s] 0.122676 +Converged at iteration 29, L1 9.20404e-05, Linf 0.00340925, total time[s] 0.090976 +Converged at iteration 24, L1 9.29161e-05, Linf 0.00546907, total time[s] 0.070233 +Converged at iteration 22, L1 9.03576e-05, Linf 0.004257, total time[s] 0.061539 +Converged at iteration 23, L1 9.56498e-05, Linf 0.00461282, total time[s] 0.074702 +Converged at iteration 26, L1 6.76087e-05, Linf 0.00499786, total time[s] 0.078134 +Converged at iteration 29, L1 6.92182e-05, Linf 0.00464247, total time[s] 0.079467 +Converged at iteration 31, L1 7.65575e-05, Linf 0.00377263, total time[s] 0.101553 +Converged at iteration 30, L1 7.07297e-05, Linf 0.00299802, total time[s] 0.278075 +Converged at iteration 29, L1 8.17126e-05, Linf 0.00302937, total time[s] 0.086979 +Converged at iteration 31, L1 9.51615e-05, Linf 0.00385807, total time[s] 0.084236 +Converged at iteration 34, L1 7.57182e-05, Linf 0.00420291, total time[s] 0.115275 +Converged at iteration 33, L1 7.82268e-05, Linf 0.00510748, total time[s] 0.093456 +Converged at iteration 28, L1 7.93277e-05, Linf 0.0038937, total time[s] 0.079321 +Converged at iteration 24, L1 8.1262e-05, Linf 0.00230878, total time[s] 0.068094 +Converged at iteration 26, L1 6.85831e-05, Linf 0.00398611, total time[s] 0.071662 +Converged at iteration 39, L1 9.60792e-05, Linf 0.00525059, total time[s] 0.105039 +Converged at iteration 36, L1 7.04433e-05, Linf 0.00354859, total time[s] 0.104148 +Converged at iteration 28, L1 6.30848e-05, Linf 0.00547984, total time[s] 0.087627 +Converged at iteration 31, L1 6.08899e-05, Linf 0.00506963, total time[s] 0.101077 +Converged at iteration 26, L1 8.20494e-05, Linf 0.00555355, total time[s] 0.081313 +Converged at iteration 21, L1 8.15909e-05, Linf 0.00417166, total time[s] 0.088506 +Converged at iteration 20, L1 8.82039e-05, Linf 0.00539522, total time[s] 0.08136 +Converged at iteration 23, L1 6.58143e-05, Linf 0.00641291, total time[s] 0.069859 +Converged at iteration 27, L1 7.70611e-05, Linf 0.00544273, total time[s] 0.095296 +Converged at iteration 25, L1 9.43535e-05, Linf 0.00419063, total time[s] 0.110047 +Converged at iteration 21, L1 5.32601e-05, Linf 0.00421662, total time[s] 0.085071 +Converged at iteration 17, L1 9.84528e-05, Linf 0.00422978, total time[s] 0.047619 +Converged at iteration 31, L1 8.52616e-05, Linf 0.00270814, total time[s] 0.130767 +Converged at iteration 20, L1 7.38818e-05, Linf 0.00523975, total time[s] 0.069345 +Converged at iteration 24, L1 6.61302e-05, Linf 0.00538324, total time[s] 0.078188 +Converged at iteration 29, L1 7.28209e-05, Linf 0.00301162, total time[s] 0.138033 +Converged at iteration 24, L1 7.49173e-05, Linf 0.00536278, total time[s] 0.090469 +Converged at iteration 22, L1 7.35506e-05, Linf 0.00399612, total time[s] 0.128661 +Converged at iteration 23, L1 9.0194e-05, Linf 0.00452891, total time[s] 0.066552 +Converged at iteration 26, L1 6.65314e-05, Linf 0.00488897, total time[s] 0.084946 +Converged at iteration 29, L1 6.76077e-05, Linf 0.00429773, total time[s] 0.085758 +Converged at iteration 30, L1 9.71693e-05, Linf 0.00463246, total time[s] 0.150606 +Converged at iteration 29, L1 8.1058e-05, Linf 0.00319996, total time[s] 0.101214 +Converged at iteration 29, L1 8.4966e-05, Linf 0.00313544, total time[s] 0.08004 +Converged at iteration 31, L1 8.4248e-05, Linf 0.0034623, total time[s] 0.095168 +Converged at iteration 33, L1 7.03621e-05, Linf 0.00416497, total time[s] 0.097241 +Converged at iteration 33, L1 7.68895e-05, Linf 0.0051287, total time[s] 0.11156 +Converged at iteration 28, L1 7.56941e-05, Linf 0.0038213, total time[s] 0.101651 +Converged at iteration 24, L1 8.62046e-05, Linf 0.00212738, total time[s] 0.085223 +Converged at iteration 25, L1 8.78136e-05, Linf 0.00473595, total time[s] 0.12442 +Converged at iteration 39, L1 9.71986e-05, Linf 0.00517453, total time[s] 0.123844 +Converged at iteration 36, L1 7.12369e-05, Linf 0.00350677, total time[s] 0.11696 +Converged at iteration 28, L1 8.18317e-05, Linf 0.00576754, total time[s] 0.079653 +Converged at iteration 31, L1 6.08299e-05, Linf 0.00509713, total time[s] 0.083693 +Converged at iteration 26, L1 8.42e-05, Linf 0.00580834, total time[s] 0.28476 +Converged at iteration 21, L1 8.54166e-05, Linf 0.004231, total time[s] 0.070334 +Converged at iteration 20, L1 9.46307e-05, Linf 0.00536877, total time[s] 0.058469 +Converged at iteration 23, L1 7.92655e-05, Linf 0.00641435, total time[s] 0.066168 +Converged at iteration 27, L1 8.6194e-05, Linf 0.00547791, total time[s] 0.14194 +Converged at iteration 26, L1 5.89954e-05, Linf 0.00333865, total time[s] 0.078511 +Converged at iteration 21, L1 5.76858e-05, Linf 0.00424201, total time[s] 0.062617 +Converged at iteration 18, L1 5.23056e-05, Linf 0.00275625, total time[s] 0.0779 +Converged at iteration 31, L1 8.31848e-05, Linf 0.00271802, total time[s] 0.10631 +Converged at iteration 20, L1 7.66834e-05, Linf 0.00518806, total time[s] 0.070734 +Converged at iteration 24, L1 6.76131e-05, Linf 0.00531262, total time[s] 0.079293 +Converged at iteration 29, L1 8.12848e-05, Linf 0.00320378, total time[s] 0.123786 +Converged at iteration 24, L1 8.52197e-05, Linf 0.00540458, total time[s] 0.078231 +Converged at iteration 22, L1 8.07961e-05, Linf 0.00415851, total time[s] 0.071387 +Converged at iteration 23, L1 9.37286e-05, Linf 0.00459192, total time[s] 0.085593 +Converged at iteration 26, L1 6.70192e-05, Linf 0.00496462, total time[s] 0.096338 +Converged at iteration 29, L1 6.84039e-05, Linf 0.00447851, total time[s] 0.093507 +Converged at iteration 31, L1 6.65874e-05, Linf 0.00362667, total time[s] 0.135635 +Converged at iteration 29, L1 9.18598e-05, Linf 0.00365181, total time[s] 0.107211 +Converged at iteration 29, L1 8.36349e-05, Linf 0.00307465, total time[s] 0.122814 +Converged at iteration 31, L1 8.95831e-05, Linf 0.00367951, total time[s] 0.12871 +Converged at iteration 33, L1 9.05382e-05, Linf 0.0047529, total time[s] 0.129785 +Converged at iteration 33, L1 7.74092e-05, Linf 0.00514575, total time[s] 0.106895 +Converged at iteration 28, L1 7.75186e-05, Linf 0.00385743, total time[s] 0.104642 +Converged at iteration 24, L1 8.34461e-05, Linf 0.00221805, total time[s] 0.081265 +Converged at iteration 25, L1 9.66685e-05, Linf 0.00485352, total time[s] 0.088733 +Converged at iteration 39, L1 9.72094e-05, Linf 0.00529585, total time[s] 0.139209 +Converged at iteration 36, L1 7.06191e-05, Linf 0.00363228, total time[s] 0.1141 +Converged at iteration 27, L1 9.85966e-05, Linf 0.00665359, total time[s] 0.100607 +Converged at iteration 31, L1 6.11388e-05, Linf 0.00507107, total time[s] 0.104616 +Converged at iteration 26, L1 8.07642e-05, Linf 0.00553559, total time[s] 0.086913 +Converged at iteration 21, L1 8.03378e-05, Linf 0.0041096, total time[s] 0.117343 +Converged at iteration 20, L1 8.47304e-05, Linf 0.00536266, total time[s] 0.084074 +Converged at iteration 23, L1 5.8752e-05, Linf 0.00629449, total time[s] 0.088554 +Converged at iteration 27, L1 7.2986e-05, Linf 0.00541852, total time[s] 0.114407 +Converged at iteration 25, L1 9.08127e-05, Linf 0.00415531, total time[s] 0.086891 +Converged at iteration 21, L1 5.10924e-05, Linf 0.00420459, total time[s] 0.079245 +Converged at iteration 17, L1 9.53672e-05, Linf 0.00418832, total time[s] 0.066104 +Converged at iteration 31, L1 8.62938e-05, Linf 0.00273476, total time[s] 0.096451 +Converged at iteration 20, L1 7.23243e-05, Linf 0.00527635, total time[s] 0.082264 +Converged at iteration 24, L1 6.59143e-05, Linf 0.00508257, total time[s] 0.085433 +Converged at iteration 29, L1 6.84709e-05, Linf 0.00288654, total time[s] 0.096555 +Converged at iteration 24, L1 7.10506e-05, Linf 0.00534392, total time[s] 0.067564 +Converged at iteration 22, L1 7.02744e-05, Linf 0.00395394, total time[s] 0.069445 +Converged at iteration 23, L1 8.86094e-05, Linf 0.0044848, total time[s] 0.068008 +Converged at iteration 26, L1 6.61838e-05, Linf 0.00482354, total time[s] 0.10838 +Converged at iteration 29, L1 6.69237e-05, Linf 0.00419068, total time[s] 0.104955 +Converged at iteration 30, L1 9.0413e-05, Linf 0.00463142, total time[s] 0.108837 +Converged at iteration 29, L1 7.63981e-05, Linf 0.00312476, total time[s] 0.101789 +Converged at iteration 29, L1 8.59313e-05, Linf 0.00314945, total time[s] 0.159916 +Converged at iteration 31, L1 8.09877e-05, Linf 0.00332375, total time[s] 0.361235 +Converged at iteration 32, L1 9.65686e-05, Linf 0.00500642, total time[s] 0.167356 +Converged at iteration 33, L1 7.58955e-05, Linf 0.0051532, total time[s] 0.148467 +Converged at iteration 28, L1 7.46764e-05, Linf 0.00380033, total time[s] 0.131625 +Converged at iteration 24, L1 8.77727e-05, Linf 0.00205701, total time[s] 0.114694 +Converged at iteration 25, L1 8.36052e-05, Linf 0.00462421, total time[s] 0.110767 +Converged at iteration 39, L1 9.48284e-05, Linf 0.00555155, total time[s] 0.114173 +Converged at iteration 36, L1 7.20485e-05, Linf 0.00385516, total time[s] 0.11998 +Converged at iteration 27, L1 5.32822e-05, Linf 0.00559797, total time[s] 0.094709 +Converged at iteration 31, L1 6.00264e-05, Linf 0.00507593, total time[s] 0.106765 +Converged at iteration 26, L1 7.57588e-05, Linf 0.00538576, total time[s] 0.100447 +Converged at iteration 21, L1 7.33036e-05, Linf 0.00382345, total time[s] 0.074821 +Converged at iteration 20, L1 7.05517e-05, Linf 0.00516577, total time[s] 0.062588 +Converged at iteration 22, L1 7.66046e-05, Linf 0.00744705, total time[s] 0.099142 +Converged at iteration 26, L1 9.4048e-05, Linf 0.00644281, total time[s] 0.081451 +Converged at iteration 25, L1 7.76901e-05, Linf 0.00410962, total time[s] 0.143178 +Converged at iteration 20, L1 9.1299e-05, Linf 0.00556601, total time[s] 0.061464 +Converged at iteration 17, L1 8.515e-05, Linf 0.00392012, total time[s] 0.051973 +Converged at iteration 31, L1 9.08773e-05, Linf 0.002756, total time[s] 0.121175 +Converged at iteration 20, L1 6.7166e-05, Linf 0.0054072, total time[s] 0.058021 +Converged at iteration 24, L1 6.29859e-05, Linf 0.00581609, total time[s] 0.089349 +Converged at iteration 28, L1 8.10948e-05, Linf 0.00352057, total time[s] 0.117947 +Converged at iteration 24, L1 5.78505e-05, Linf 0.00526551, total time[s] 0.112871 +Converged at iteration 21, L1 9.76678e-05, Linf 0.00469458, total time[s] 0.06884 +Converged at iteration 23, L1 8.3022e-05, Linf 0.00422561, total time[s] 0.066151 +Converged at iteration 26, L1 6.47544e-05, Linf 0.00442678, total time[s] 0.06734 +Converged at iteration 29, L1 6.54225e-05, Linf 0.00380989, total time[s] 0.098188 +Converged at iteration 30, L1 7.70184e-05, Linf 0.004616, total time[s] 0.102485 +Converged at iteration 28, L1 9.49155e-05, Linf 0.00355117, total time[s] 0.08342 +Converged at iteration 29, L1 8.91055e-05, Linf 0.00329742, total time[s] 0.095909 +Converged at iteration 31, L1 6.99109e-05, Linf 0.00282791, total time[s] 0.098943 +Converged at iteration 31, L1 9.1914e-05, Linf 0.00445822, total time[s] 0.094253 +Converged at iteration 33, L1 7.37373e-05, Linf 0.00537337, total time[s] 0.107355 +Converged at iteration 28, L1 6.96197e-05, Linf 0.0036915, total time[s] 0.074173 +Converged at iteration 24, L1 9.34951e-05, Linf 0.00183474, total time[s] 0.078312 +Converged at iteration 25, L1 6.67641e-05, Linf 0.00412759, total time[s] 0.090327 +Converged at iteration 39, L1 9.45954e-05, Linf 0.00525435, total time[s] 0.124184 +Converged at iteration 36, L1 7.21781e-05, Linf 0.00370557, total time[s] 0.106729 +Converged at iteration 27, L1 7.24948e-05, Linf 0.00616478, total time[s] 0.075607 +Converged at iteration 31, L1 6.05004e-05, Linf 0.00510401, total time[s] 0.104196 +Converged at iteration 26, L1 7.85902e-05, Linf 0.00543182, total time[s] 0.088044 +Converged at iteration 21, L1 7.69892e-05, Linf 0.00397003, total time[s] 0.094868 +Converged at iteration 20, L1 7.71147e-05, Linf 0.00528872, total time[s] 0.082349 +Converged at iteration 22, L1 9.33428e-05, Linf 0.00775534, total time[s] 0.076593 +Converged at iteration 27, L1 6.20815e-05, Linf 0.00528103, total time[s] 0.083905 +Converged at iteration 25, L1 8.40554e-05, Linf 0.00414245, total time[s] 0.07449 +Converged at iteration 20, L1 9.6659e-05, Linf 0.00555259, total time[s] 0.061344 +Converged at iteration 17, L1 8.9972e-05, Linf 0.00407886, total time[s] 0.075005 +Converged at iteration 31, L1 8.86209e-05, Linf 0.00272652, total time[s] 0.098303 +Converged at iteration 20, L1 6.94813e-05, Linf 0.00534931, total time[s] 0.063623 +Converged at iteration 24, L1 6.42779e-05, Linf 0.00553765, total time[s] 0.069842 +Converged at iteration 28, L1 9.06345e-05, Linf 0.00366757, total time[s] 0.121516 +Converged at iteration 24, L1 6.39267e-05, Linf 0.00530621, total time[s] 0.075491 +Converged at iteration 22, L1 6.43055e-05, Linf 0.00382633, total time[s] 0.071054 +Converged at iteration 23, L1 8.57328e-05, Linf 0.00436601, total time[s] 0.073933 +Converged at iteration 26, L1 6.54217e-05, Linf 0.00464276, total time[s] 0.081358 +Converged at iteration 29, L1 6.59482e-05, Linf 0.00413448, total time[s] 0.102265 +Converged at iteration 30, L1 8.23552e-05, Linf 0.00461567, total time[s] 0.108401 +Converged at iteration 29, L1 6.76614e-05, Linf 0.00297577, total time[s] 0.147446 +Converged at iteration 29, L1 8.88746e-05, Linf 0.00322444, total time[s] 0.131465 +Converged at iteration 31, L1 7.58544e-05, Linf 0.00306238, total time[s] 0.103977 +Converged at iteration 32, L1 7.42555e-05, Linf 0.00407026, total time[s] 0.098928 +Converged at iteration 33, L1 7.51367e-05, Linf 0.00525854, total time[s] 0.101251 +Converged at iteration 28, L1 7.29239e-05, Linf 0.00374912, total time[s] 0.102313 +Converged at iteration 24, L1 9.18887e-05, Linf 0.00197332, total time[s] 0.07903 +Converged at iteration 25, L1 7.45538e-05, Linf 0.00439763, total time[s] 0.075009 +Converged at iteration 39, L1 9.41216e-05, Linf 0.00548583, total time[s] 0.126124 +Converged at iteration 36, L1 7.32633e-05, Linf 0.00392288, total time[s] 0.151068 +Converged at iteration 26, L1 9.16503e-05, Linf 0.00703899, total time[s] 0.08695 +Converged at iteration 31, L1 5.98827e-05, Linf 0.00507619, total time[s] 0.090301 +Converged at iteration 26, L1 7.44543e-05, Linf 0.00541456, total time[s] 0.091409 +Converged at iteration 21, L1 7.11053e-05, Linf 0.0037316, total time[s] 0.071729 +Converged at iteration 20, L1 6.70073e-05, Linf 0.00510395, total time[s] 0.063258 +Converged at iteration 22, L1 6.82813e-05, Linf 0.00725313, total time[s] 0.079925 +Converged at iteration 26, L1 8.62691e-05, Linf 0.00632531, total time[s] 0.09642 +Converged at iteration 25, L1 7.4525e-05, Linf 0.00408938, total time[s] 0.071772 +Converged at iteration 20, L1 8.86551e-05, Linf 0.00554869, total time[s] 0.066491 +Converged at iteration 17, L1 8.26879e-05, Linf 0.00381026, total time[s] 0.05827 +Converged at iteration 31, L1 9.22989e-05, Linf 0.00273932, total time[s] 0.10737 +Converged at iteration 20, L1 6.60707e-05, Linf 0.00542973, total time[s] 0.095552 +Converged at iteration 24, L1 6.23837e-05, Linf 0.0055481, total time[s] 0.074991 +Converged at iteration 28, L1 7.68432e-05, Linf 0.00343194, total time[s] 0.098501 +Converged at iteration 23, L1 9.97292e-05, Linf 0.00755615, total time[s] 0.11022 +Converged at iteration 21, L1 9.44231e-05, Linf 0.00464943, total time[s] 0.069609 +Converged at iteration 23, L1 8.18011e-05, Linf 0.00413266, total time[s] 0.109899 +Converged at iteration 26, L1 6.44499e-05, Linf 0.00418289, total time[s] 0.085338 +Converged at iteration 28, L1 9.86645e-05, Linf 0.00580193, total time[s] 0.091009 +Converged at iteration 30, L1 7.49573e-05, Linf 0.0046114, total time[s] 0.090341 +Converged at iteration 28, L1 9.08581e-05, Linf 0.00349457, total time[s] 0.096966 +Converged at iteration 29, L1 8.85455e-05, Linf 0.0033156, total time[s] 0.096397 +Converged at iteration 30, L1 9.83992e-05, Linf 0.00340478, total time[s] 0.097352 +Converged at iteration 31, L1 8.24075e-05, Linf 0.00373983, total time[s] 0.11218 +Converged at iteration 33, L1 7.29407e-05, Linf 0.00533732, total time[s] 0.106133 +Converged at iteration 28, L1 6.81476e-05, Linf 0.00365643, total time[s] 0.095756 +Converged at iteration 24, L1 9.42766e-05, Linf 0.00177223, total time[s] 0.127124 +Converged at iteration 25, L1 6.26847e-05, Linf 0.00388886, total time[s] 0.074122 +Converged at iteration 39, L1 9.31665e-05, Linf 0.00546919, total time[s] 0.108382 +Converged at iteration 36, L1 7.2079e-05, Linf 0.00383274, total time[s] 0.115035 +Converged at iteration 27, L1 5.64504e-05, Linf 0.00571972, total time[s] 0.079962 +Converged at iteration 31, L1 6.00722e-05, Linf 0.00507546, total time[s] 0.101615 +Converged at iteration 26, L1 7.63927e-05, Linf 0.00545272, total time[s] 0.079148 +Converged at iteration 21, L1 7.41223e-05, Linf 0.00385262, total time[s] 0.062544 +Converged at iteration 20, L1 7.17393e-05, Linf 0.00519406, total time[s] 0.066405 +Converged at iteration 22, L1 7.95473e-05, Linf 0.00756525, total time[s] 0.084464 +Converged at iteration 26, L1 9.65327e-05, Linf 0.00647531, total time[s] 0.091258 +Converged at iteration 25, L1 7.91588e-05, Linf 0.00411593, total time[s] 0.085432 +Converged at iteration 20, L1 9.22082e-05, Linf 0.00556997, total time[s] 0.064763 +Converged at iteration 17, L1 8.6009e-05, Linf 0.00395352, total time[s] 0.056906 +Converged at iteration 31, L1 9.04195e-05, Linf 0.00275406, total time[s] 0.10627 +Converged at iteration 20, L1 6.78289e-05, Linf 0.00539705, total time[s] 0.108918 +Converged at iteration 24, L1 6.34061e-05, Linf 0.00554086, total time[s] 0.074722 +Converged at iteration 28, L1 8.30709e-05, Linf 0.00354713, total time[s] 0.100944 +Converged at iteration 24, L1 5.91071e-05, Linf 0.00527208, total time[s] 0.062792 +Converged at iteration 21, L1 9.9098e-05, Linf 0.00470941, total time[s] 0.058644 +Converged at iteration 23, L1 8.35936e-05, Linf 0.00425433, total time[s] 0.067573 +Converged at iteration 26, L1 6.48784e-05, Linf 0.00447249, total time[s] 0.082503 +Converged at iteration 28, L1 9.98704e-05, Linf 0.0059, total time[s] 0.0879 +Converged at iteration 30, L1 7.94643e-05, Linf 0.0046167, total time[s] 0.086593 +Converged at iteration 28, L1 9.67401e-05, Linf 0.0035719, total time[s] 0.08775 +Converged at iteration 29, L1 8.95907e-05, Linf 0.00327492, total time[s] 0.08601 +Converged at iteration 31, L1 7.08979e-05, Linf 0.00287588, total time[s] 0.084181 +Converged at iteration 31, L1 9.57309e-05, Linf 0.00463906, total time[s] 0.095507 +Converged at iteration 33, L1 7.3875e-05, Linf 0.00529815, total time[s] 0.112234 +Converged at iteration 28, L1 7.0088e-05, Linf 0.00370283, total time[s] 0.090117 +Converged at iteration 24, L1 9.34467e-05, Linf 0.00185807, total time[s] 0.069115 +Converged at iteration 25, L1 6.78247e-05, Linf 0.00416819, total time[s] 0.094654 +Converged at iteration 39, L1 9.17376e-05, Linf 0.0056593, total time[s] 0.147884 +Converged at iteration 36, L1 7.26007e-05, Linf 0.00398216, total time[s] 0.107111 +Converged at iteration 26, L1 8.16499e-05, Linf 0.00676482, total time[s] 0.072595 +Converged at iteration 31, L1 5.97737e-05, Linf 0.00507593, total time[s] 0.08157 +Converged at iteration 26, L1 7.30821e-05, Linf 0.0053909, total time[s] 0.081623 +Converged at iteration 21, L1 6.98695e-05, Linf 0.00365623, total time[s] 0.114649 +Converged at iteration 20, L1 6.44317e-05, Linf 0.0049888, total time[s] 0.1049 +Converged at iteration 22, L1 6.23596e-05, Linf 0.00707221, total time[s] 0.067343 +Converged at iteration 26, L1 8.04669e-05, Linf 0.00620737, total time[s] 0.076328 +Converged at iteration 25, L1 7.22774e-05, Linf 0.00407302, total time[s] 0.072588 +Converged at iteration 20, L1 8.68319e-05, Linf 0.0055291, total time[s] 0.060314 +Converged at iteration 17, L1 8.10131e-05, Linf 0.00371616, total time[s] 0.054548 +Converged at iteration 31, L1 9.33242e-05, Linf 0.00276437, total time[s] 0.119598 +Converged at iteration 20, L1 6.54449e-05, Linf 0.00544072, total time[s] 0.062652 +Converged at iteration 24, L1 6.138e-05, Linf 0.00554313, total time[s] 0.072931 +Converged at iteration 28, L1 7.40587e-05, Linf 0.00336816, total time[s] 0.076019 +Converged at iteration 23, L1 9.48041e-05, Linf 0.00687957, total time[s] 0.070861 +Converged at iteration 21, L1 9.17638e-05, Linf 0.00465694, total time[s] 0.097303 +Converged at iteration 23, L1 8.10246e-05, Linf 0.00405695, total time[s] 0.073717 +Converged at iteration 26, L1 6.41475e-05, Linf 0.00417243, total time[s] 0.075225 +Converged at iteration 28, L1 9.77818e-05, Linf 0.00573617, total time[s] 0.077469 +Converged at iteration 30, L1 7.33768e-05, Linf 0.00461171, total time[s] 0.11987 +Converged at iteration 28, L1 8.82533e-05, Linf 0.00345467, total time[s] 0.087579 +Converged at iteration 29, L1 8.81436e-05, Linf 0.00334495, total time[s] 0.07778 +Converged at iteration 30, L1 9.5693e-05, Linf 0.00328061, total time[s] 0.094237 +Converged at iteration 31, L1 7.43676e-05, Linf 0.00308556, total time[s] 0.085675 +Converged at iteration 33, L1 7.24391e-05, Linf 0.00536132, total time[s] 0.112652 +Converged at iteration 28, L1 6.69404e-05, Linf 0.00362926, total time[s] 0.083621 +Converged at iteration 24, L1 9.49549e-05, Linf 0.00181199, total time[s] 0.069332 +Converged at iteration 24, L1 9.83777e-05, Linf 0.00513156, total time[s] 0.078465 +Converged at iteration 39, L1 8.84174e-05, Linf 0.00578771, total time[s] 0.128275 +Converged at iteration 36, L1 7.31401e-05, Linf 0.00423031, total time[s] 0.105304 +Converged at iteration 26, L1 5.20573e-05, Linf 0.00508058, total time[s] 0.119162 +Converged at iteration 31, L1 5.91975e-05, Linf 0.00507221, total time[s] 0.080439 +Converged at iteration 26, L1 6.7878e-05, Linf 0.00528512, total time[s] 0.075494 +Converged at iteration 21, L1 6.43982e-05, Linf 0.00331144, total time[s] 0.055175 +Converged at iteration 20, L1 5.50482e-05, Linf 0.00451232, total time[s] 0.056254 +Converged at iteration 21, L1 9.8271e-05, Linf 0.00877139, total time[s] 0.063925 +Converged at iteration 26, L1 5.88977e-05, Linf 0.00552945, total time[s] 0.089751 +Converged at iteration 25, L1 6.36674e-05, Linf 0.00400268, total time[s] 0.071829 +Converged at iteration 20, L1 7.94431e-05, Linf 0.00547534, total time[s] 0.064491 +Converged at iteration 17, L1 7.41465e-05, Linf 0.0032915, total time[s] 0.082047 +Converged at iteration 31, L1 9.77317e-05, Linf 0.00277937, total time[s] 0.109313 +Converged at iteration 20, L1 6.3423e-05, Linf 0.00538287, total time[s] 0.065034 +Converged at iteration 23, L1 9.70623e-05, Linf 0.00648372, total time[s] 0.074502 +Converged at iteration 27, L1 9.61571e-05, Linf 0.00458143, total time[s] 0.110506 +Converged at iteration 23, L1 8.55474e-05, Linf 0.00687524, total time[s] 0.068992 +Converged at iteration 21, L1 8.23979e-05, Linf 0.00446421, total time[s] 0.061456 +Converged at iteration 23, L1 7.78058e-05, Linf 0.00374377, total time[s] 0.085869 +Converged at iteration 25, L1 9.7828e-05, Linf 0.00630354, total time[s] 0.088582 +Converged at iteration 28, L1 9.47888e-05, Linf 0.00537364, total time[s] 0.092708 +Converged at iteration 30, L1 6.69001e-05, Linf 0.00462306, total time[s] 0.09789 +Converged at iteration 28, L1 7.92374e-05, Linf 0.00329054, total time[s] 0.08285 +Converged at iteration 29, L1 8.50401e-05, Linf 0.00345618, total time[s] 0.080683 +Converged at iteration 30, L1 8.71442e-05, Linf 0.00282157, total time[s] 0.078222 +Converged at iteration 30, L1 8.73512e-05, Linf 0.00257348, total time[s] 0.083102 +Converged at iteration 33, L1 7.00856e-05, Linf 0.00546072, total time[s] 0.096004 +Converged at iteration 27, L1 9.70556e-05, Linf 0.00413426, total time[s] 0.077644 +Converged at iteration 24, L1 9.73513e-05, Linf 0.00199646, total time[s] 0.075106 +Converged at iteration 24, L1 8.39271e-05, Linf 0.0043582, total time[s] 0.082903 +Converged at iteration 39, L1 9.18292e-05, Linf 0.00568812, total time[s] 0.128145 +Converged at iteration 36, L1 7.29498e-05, Linf 0.00410557, total time[s] 0.128733 +Converged at iteration 26, L1 6.43172e-05, Linf 0.00596899, total time[s] 0.109023 +Converged at iteration 31, L1 5.96659e-05, Linf 0.00510521, total time[s] 0.087588 +Converged at iteration 26, L1 7.05691e-05, Linf 0.00533891, total time[s] 0.073358 +Converged at iteration 21, L1 6.72485e-05, Linf 0.00348717, total time[s] 0.058314 +Converged at iteration 20, L1 5.94206e-05, Linf 0.00481362, total time[s] 0.075382 +Converged at iteration 22, L1 5.19548e-05, Linf 0.00768808, total time[s] 0.069495 +Converged at iteration 26, L1 6.90945e-05, Linf 0.00591532, total time[s] 0.077766 +Converged at iteration 25, L1 6.96455e-05, Linf 0.00958207, total time[s] 0.077901 +Converged at iteration 20, L1 8.24614e-05, Linf 0.00548658, total time[s] 0.053799 +Converged at iteration 17, L1 7.76858e-05, Linf 0.0035046, total time[s] 0.052424 +Converged at iteration 31, L1 9.56067e-05, Linf 0.00277152, total time[s] 0.089784 +Converged at iteration 20, L1 6.42991e-05, Linf 0.00543507, total time[s] 0.064859 +Converged at iteration 23, L1 9.94551e-05, Linf 0.00607271, total time[s] 0.091404 +Converged at iteration 28, L1 6.70762e-05, Linf 0.00322199, total time[s] 0.075048 +Converged at iteration 23, L1 9.02963e-05, Linf 0.00694191, total time[s] 0.070684 +Converged at iteration 21, L1 8.68319e-05, Linf 0.0045383, total time[s] 0.068705 +Converged at iteration 23, L1 7.95494e-05, Linf 0.00389566, total time[s] 0.069655 +Converged at iteration 25, L1 9.93763e-05, Linf 0.00633351, total time[s] 0.107416 +Converged at iteration 28, L1 9.6447e-05, Linf 0.00556226, total time[s] 0.090816 +Converged at iteration 30, L1 6.95193e-05, Linf 0.00458411, total time[s] 0.08129 +Converged at iteration 28, L1 8.33315e-05, Linf 0.00340318, total time[s] 0.076699 +Converged at iteration 29, L1 8.69276e-05, Linf 0.00340238, total time[s] 0.08955 +Converged at iteration 30, L1 9.0553e-05, Linf 0.00304226, total time[s] 0.083094 +Converged at iteration 30, L1 9.90579e-05, Linf 0.00347477, total time[s] 0.078935 +Converged at iteration 33, L1 7.12251e-05, Linf 0.00541143, total time[s] 0.089987 +Converged at iteration 28, L1 6.42761e-05, Linf 0.0035659, total time[s] 0.082766 +Converged at iteration 24, L1 9.62852e-05, Linf 0.00191422, total time[s] 0.069409 +Converged at iteration 24, L1 9.03513e-05, Linf 0.00473239, total time[s] 0.089721 +Converged at iteration 39, L1 8.86361e-05, Linf 0.00584215, total time[s] 0.127066 +Converged at iteration 36, L1 7.31895e-05, Linf 0.00430695, total time[s] 0.101008 +Converged at iteration 25, L1 9.77812e-05, Linf 0.00709459, total time[s] 0.076233 +Converged at iteration 31, L1 5.89975e-05, Linf 0.00507072, total time[s] 0.089309 +Converged at iteration 26, L1 6.63819e-05, Linf 0.00525182, total time[s] 0.074573 +Converged at iteration 21, L1 6.30319e-05, Linf 0.00319932, total time[s] 0.080073 +Converged at iteration 20, L1 5.28074e-05, Linf 0.00440045, total time[s] 0.060011 +Converged at iteration 21, L1 9.13054e-05, Linf 0.00908385, total time[s] 0.065619 +Converged at iteration 26, L1 5.34073e-05, Linf 0.00523025, total time[s] 0.073406 +Converged at iteration 25, L1 6.2003e-05, Linf 0.00398937, total time[s] 0.075646 +Converged at iteration 20, L1 7.7717e-05, Linf 0.00548595, total time[s] 0.062731 +Converged at iteration 17, L1 7.21112e-05, Linf 0.00316672, total time[s] 0.049077 +Converged at iteration 31, L1 9.89616e-05, Linf 0.00278615, total time[s] 0.086679 +Converged at iteration 20, L1 6.30245e-05, Linf 0.00517813, total time[s] 0.063458 +Converged at iteration 23, L1 9.56412e-05, Linf 0.00653632, total time[s] 0.070387 +Converged at iteration 27, L1 9.21336e-05, Linf 0.00451299, total time[s] 0.086877 +Converged at iteration 23, L1 8.36568e-05, Linf 0.00684274, total time[s] 0.069093 +Converged at iteration 21, L1 8.01447e-05, Linf 0.00441964, total time[s] 0.056415 +Converged at iteration 23, L1 7.70205e-05, Linf 0.0036573, total time[s] 0.062184 +Converged at iteration 25, L1 9.69305e-05, Linf 0.00625843, total time[s] 0.088376 +Converged at iteration 28, L1 9.38297e-05, Linf 0.0050671, total time[s] 0.08882 +Converged at iteration 30, L1 6.56448e-05, Linf 0.00461936, total time[s] 0.080599 +Converged at iteration 28, L1 7.76155e-05, Linf 0.00325057, total time[s] 0.076664 +Converged at iteration 29, L1 8.39949e-05, Linf 0.00348331, total time[s] 0.085456 +Converged at iteration 30, L1 8.39267e-05, Linf 0.00268878, total time[s] 0.118764 +Converged at iteration 30, L1 8.07693e-05, Linf 0.00240817, total time[s] 0.164954 +Converged at iteration 33, L1 6.94827e-05, Linf 0.00549085, total time[s] 0.103737 +Converged at iteration 27, L1 9.55199e-05, Linf 0.00408643, total time[s] 0.083359 +Converged at iteration 24, L1 9.85362e-05, Linf 0.00199979, total time[s] 0.065001 +Converged at iteration 24, L1 8.07435e-05, Linf 0.00411981, total time[s] 0.067566 +Converged at iteration 39, L1 8.90342e-05, Linf 0.00576557, total time[s] 0.114082 +Converged at iteration 36, L1 7.30999e-05, Linf 0.00420571, total time[s] 0.116477 +Converged at iteration 26, L1 5.40576e-05, Linf 0.00522625, total time[s] 0.09177 +Converged at iteration 31, L1 5.97492e-05, Linf 0.00507242, total time[s] 0.102435 +Converged at iteration 26, L1 6.96248e-05, Linf 0.00612881, total time[s] 0.099914 +Converged at iteration 21, L1 6.56221e-05, Linf 0.00334811, total time[s] 0.074816 +Converged at iteration 20, L1 5.5958e-05, Linf 0.00459054, total time[s] 0.146515 +Converged at iteration 22, L1 4.41879e-05, Linf 0.00655915, total time[s] 0.088934 +Converged at iteration 26, L1 6.0833e-05, Linf 0.00564097, total time[s] 0.113776 +Converged at iteration 25, L1 6.57161e-05, Linf 0.00402743, total time[s] 0.096882 +Converged at iteration 20, L1 7.99175e-05, Linf 0.00547458, total time[s] 0.072155 +Converged at iteration 17, L1 7.48466e-05, Linf 0.00333274, total time[s] 0.058454 +Converged at iteration 31, L1 9.73803e-05, Linf 0.00277752, total time[s] 0.123032 +Converged at iteration 20, L1 6.35478e-05, Linf 0.0053974, total time[s] 0.078955 +Converged at iteration 23, L1 9.75833e-05, Linf 0.00646714, total time[s] 0.068039 +Converged at iteration 27, L1 9.76374e-05, Linf 0.00458578, total time[s] 0.080869 +Converged at iteration 23, L1 8.6862e-05, Linf 0.00687521, total time[s] 0.078493 +Converged at iteration 21, L1 8.33588e-05, Linf 0.00447858, total time[s] 0.07474 +Converged at iteration 23, L1 7.82633e-05, Linf 0.00377215, total time[s] 0.085268 +Converged at iteration 25, L1 9.81426e-05, Linf 0.00625273, total time[s] 0.089202 +Converged at iteration 28, L1 9.52977e-05, Linf 0.00541012, total time[s] 0.089521 +Converged at iteration 30, L1 6.75001e-05, Linf 0.00461963, total time[s] 0.171841 +Converged at iteration 28, L1 8.00064e-05, Linf 0.00330611, total time[s] 0.115135 +Converged at iteration 29, L1 8.5643e-05, Linf 0.0034473, total time[s] 0.151923 +Converged at iteration 30, L1 8.7388e-05, Linf 0.00286424, total time[s] 0.100083 +Converged at iteration 30, L1 8.91031e-05, Linf 0.00272051, total time[s] 0.091643 +Converged at iteration 33, L1 7.02882e-05, Linf 0.00539232, total time[s] 0.085986 +Converged at iteration 27, L1 9.76373e-05, Linf 0.00420064, total time[s] 0.070739 +Converged at iteration 24, L1 9.72681e-05, Linf 0.00197947, total time[s] 0.077377 +Converged at iteration 24, L1 8.50305e-05, Linf 0.00444355, total time[s] 0.090115 +Converged at iteration 39, L1 8.62026e-05, Linf 0.00588829, total time[s] 0.124491 +Converged at iteration 36, L1 7.35189e-05, Linf 0.00436697, total time[s] 0.106059 +Converged at iteration 25, L1 9.1044e-05, Linf 0.00668698, total time[s] 0.068213 +Converged at iteration 31, L1 5.93575e-05, Linf 0.00506964, total time[s] 0.117688 +Converged at iteration 26, L1 6.53298e-05, Linf 0.00522464, total time[s] 0.079441 +Converged at iteration 21, L1 6.19423e-05, Linf 0.00310739, total time[s] 0.059867 +Converged at iteration 20, L1 5.0918e-05, Linf 0.00430772, total time[s] 0.067045 +Converged at iteration 21, L1 8.60705e-05, Linf 0.00953025, total time[s] 0.078439 +Converged at iteration 25, L1 9.48667e-05, Linf 0.00686619, total time[s] 0.075895 +Converged at iteration 25, L1 5.96768e-05, Linf 0.00396362, total time[s] 0.090721 +Converged at iteration 20, L1 7.64372e-05, Linf 0.00549702, total time[s] 0.074145 +Converged at iteration 17, L1 7.05537e-05, Linf 0.00321369, total time[s] 0.053824 +Converged at iteration 31, L1 9.993e-05, Linf 0.00278929, total time[s] 0.085267 +Converged at iteration 20, L1 6.45674e-05, Linf 0.00527479, total time[s] 0.06417 +Converged at iteration 23, L1 9.46525e-05, Linf 0.00658091, total time[s] 0.101069 +Converged at iteration 27, L1 8.95813e-05, Linf 0.00446634, total time[s] 0.084994 +Converged at iteration 23, L1 8.19584e-05, Linf 0.00685173, total time[s] 0.063576 +Converged at iteration 21, L1 7.84251e-05, Linf 0.00438593, total time[s] 0.062962 +Converged at iteration 23, L1 7.66117e-05, Linf 0.00376212, total time[s] 0.070356 +Converged at iteration 25, L1 9.62596e-05, Linf 0.00620616, total time[s] 0.074413 +Converged at iteration 28, L1 9.30191e-05, Linf 0.0051805, total time[s] 0.088737 +Converged at iteration 30, L1 6.47399e-05, Linf 0.00461364, total time[s] 0.095008 +Converged at iteration 28, L1 7.63964e-05, Linf 0.00321852, total time[s] 0.083716 +Converged at iteration 29, L1 8.31882e-05, Linf 0.00350779, total time[s] 0.101662 +Converged at iteration 30, L1 8.24267e-05, Linf 0.00262295, total time[s] 0.084449 +Converged at iteration 30, L1 7.64371e-05, Linf 0.00233032, total time[s] 0.08426 +Converged at iteration 33, L1 6.90633e-05, Linf 0.00551431, total time[s] 0.100883 +Converged at iteration 27, L1 9.35588e-05, Linf 0.00404699, total time[s] 0.073826 +Converged at iteration 24, L1 9.88706e-05, Linf 0.00206652, total time[s] 0.0667 +Converged at iteration 24, L1 7.76022e-05, Linf 0.00395219, total time[s] 0.079168 +Converged at iteration 39, L1 8.26288e-05, Linf 0.00608314, total time[s] 0.119563 +Converged at iteration 36, L1 7.31214e-05, Linf 0.00463274, total time[s] 0.100817 +Converged at iteration 25, L1 6.94847e-05, Linf 0.00485718, total time[s] 0.076776 +Converged at iteration 31, L1 5.81802e-05, Linf 0.00506992, total time[s] 0.091004 +Converged at iteration 26, L1 6.02387e-05, Linf 0.00510644, total time[s] 0.09465 +Converged at iteration 21, L1 5.85636e-05, Linf 0.00277794, total time[s] 0.059668 +Converged at iteration 19, L1 9.26845e-05, Linf 0.00619753, total time[s] 0.078908 +Converged at iteration 21, L1 6.70891e-05, Linf 0.00694087, total time[s] 0.056422 +Converged at iteration 25, L1 7.30663e-05, Linf 0.00591105, total time[s] 0.080577 +Converged at iteration 25, L1 5.34694e-05, Linf 0.0038913, total time[s] 0.083446 +Converged at iteration 20, L1 7.13867e-05, Linf 0.00546085, total time[s] 0.062223 +Converged at iteration 17, L1 6.54377e-05, Linf 0.00288762, total time[s] 0.050424 +Converged at iteration 32, L1 6.57354e-05, Linf 0.00233949, total time[s] 0.095483 +Converged at iteration 20, L1 6.19594e-05, Linf 0.00492256, total time[s] 0.088788 +Converged at iteration 23, L1 9.02547e-05, Linf 0.00679497, total time[s] 0.087581 +Converged at iteration 27, L1 7.8777e-05, Linf 0.00424908, total time[s] 0.09243 +Converged at iteration 23, L1 7.57667e-05, Linf 0.0066627, total time[s] 0.063947 +Converged at iteration 21, L1 7.08312e-05, Linf 0.00425225, total time[s] 0.060296 +Converged at iteration 23, L1 7.54933e-05, Linf 0.00336012, total time[s] 0.095683 +Converged at iteration 25, L1 9.44971e-05, Linf 0.00582803, total time[s] 0.07585 +Converged at iteration 28, L1 8.93556e-05, Linf 0.0047259, total time[s] 0.081935 +Converged at iteration 30, L1 6.12325e-05, Linf 0.00460909, total time[s] 0.131409 +Converged at iteration 28, L1 7.22498e-05, Linf 0.00308969, total time[s] 0.117943 +Converged at iteration 29, L1 8.10373e-05, Linf 0.00358913, total time[s] 0.108449 +Converged at iteration 30, L1 7.72171e-05, Linf 0.00234984, total time[s] 0.108564 +Converged at iteration 29, L1 9.61879e-05, Linf 0.00269614, total time[s] 0.105876 +Converged at iteration 33, L1 6.65906e-05, Linf 0.00561561, total time[s] 0.087923 +Converged at iteration 27, L1 8.59921e-05, Linf 0.00387295, total time[s] 0.103557 +Converged at iteration 25, L1 7.06175e-05, Linf 0.00172132, total time[s] 0.14596 +Converged at iteration 24, L1 6.85575e-05, Linf 0.00329161, total time[s] 0.108629 +Converged at iteration 39, L1 8.43194e-05, Linf 0.00598651, total time[s] 0.118251 +Converged at iteration 36, L1 7.35882e-05, Linf 0.00449692, total time[s] 0.168895 +Converged at iteration 25, L1 7.87132e-05, Linf 0.00569838, total time[s] 0.103357 +Converged at iteration 31, L1 5.89784e-05, Linf 0.00506871, total time[s] 0.103589 +Converged at iteration 26, L1 6.27256e-05, Linf 0.00516634, total time[s] 0.068804 +Converged at iteration 21, L1 6.10955e-05, Linf 0.00289857, total time[s] 0.07425 +Converged at iteration 19, L1 9.64951e-05, Linf 0.00642454, total time[s] 0.049856 +Converged at iteration 21, L1 7.59025e-05, Linf 0.00789721, total time[s] 0.068309 +Converged at iteration 25, L1 8.34354e-05, Linf 0.00649003, total time[s] 0.110523 +Converged at iteration 25, L1 5.66011e-05, Linf 0.00392722, total time[s] 0.0671 +Converged at iteration 20, L1 7.34638e-05, Linf 0.00550278, total time[s] 0.065315 +Converged at iteration 17, L1 6.7587e-05, Linf 0.00299181, total time[s] 0.073144 +Converged at iteration 32, L1 6.48425e-05, Linf 0.00231081, total time[s] 0.194275 +Converged at iteration 20, L1 6.24498e-05, Linf 0.00511827, total time[s] 0.066244 +Converged at iteration 23, L1 9.25981e-05, Linf 0.00668284, total time[s] 0.082239 +Converged at iteration 27, L1 8.43441e-05, Linf 0.00436262, total time[s] 0.098536 +Converged at iteration 23, L1 7.85292e-05, Linf 0.00683037, total time[s] 0.07603 +Converged at iteration 21, L1 7.42964e-05, Linf 0.00431469, total time[s] 0.062635 +Converged at iteration 23, L1 7.59769e-05, Linf 0.00346829, total time[s] 0.072748 +Converged at iteration 25, L1 9.52171e-05, Linf 0.00604357, total time[s] 0.074052 +Converged at iteration 28, L1 9.098e-05, Linf 0.00499626, total time[s] 0.077822 +Converged at iteration 30, L1 6.29907e-05, Linf 0.00461231, total time[s] 0.088603 +Converged at iteration 28, L1 7.40966e-05, Linf 0.00318428, total time[s] 0.081115 +Converged at iteration 29, L1 8.14635e-05, Linf 0.00355348, total time[s] 0.09195 +Converged at iteration 30, L1 7.98383e-05, Linf 0.00248209, total time[s] 0.10931 +Converged at iteration 30, L1 6.80568e-05, Linf 0.00216623, total time[s] 0.086136 +Converged at iteration 33, L1 6.77496e-05, Linf 0.00556441, total time[s] 0.102914 +Converged at iteration 27, L1 8.94245e-05, Linf 0.00396138, total time[s] 0.090301 +Converged at iteration 25, L1 6.86482e-05, Linf 0.00163881, total time[s] 0.07673 +Converged at iteration 24, L1 7.27367e-05, Linf 0.00357034, total time[s] 0.072576 +Converged at iteration 39, L1 8.16502e-05, Linf 0.00614171, total time[s] 0.108777 +Converged at iteration 36, L1 7.30899e-05, Linf 0.00471372, total time[s] 0.100034 +Converged at iteration 25, L1 6.49421e-05, Linf 0.00445695, total time[s] 0.07046 +Converged at iteration 31, L1 5.91858e-05, Linf 0.00507063, total time[s] 0.096978 +Converged at iteration 26, L1 5.87713e-05, Linf 0.00506967, total time[s] 0.07451 +Converged at iteration 21, L1 5.77247e-05, Linf 0.00286862, total time[s] 0.058857 +Converged at iteration 19, L1 9.03613e-05, Linf 0.00608137, total time[s] 0.05577 +Converged at iteration 21, L1 6.28963e-05, Linf 0.00620331, total time[s] 0.0568 +Converged at iteration 25, L1 6.75353e-05, Linf 0.00548802, total time[s] 0.084369 +Converged at iteration 24, L1 9.89571e-05, Linf 0.00502212, total time[s] 0.078089 +Converged at iteration 20, L1 7.03181e-05, Linf 0.00541859, total time[s] 0.06922 +Converged at iteration 17, L1 6.44791e-05, Linf 0.00287218, total time[s] 0.052235 +Converged at iteration 32, L1 6.61537e-05, Linf 0.00235801, total time[s] 0.092156 +Converged at iteration 20, L1 6.29187e-05, Linf 0.0047981, total time[s] 0.062829 +Converged at iteration 23, L1 8.91122e-05, Linf 0.00686625, total time[s] 0.093427 +Converged at iteration 27, L1 7.58955e-05, Linf 0.00417163, total time[s] 0.084286 +Converged at iteration 23, L1 7.47839e-05, Linf 0.0065694, total time[s] 0.078578 +Converged at iteration 21, L1 6.90609e-05, Linf 0.00421305, total time[s] 0.06031 +Converged at iteration 23, L1 7.59607e-05, Linf 0.00377983, total time[s] 0.0743 +Converged at iteration 25, L1 9.36058e-05, Linf 0.00568163, total time[s] 0.064453 +Converged at iteration 28, L1 8.83485e-05, Linf 0.00462293, total time[s] 0.092879 +Converged at iteration 30, L1 6.05635e-05, Linf 0.00459331, total time[s] 0.091795 +Converged at iteration 28, L1 7.16535e-05, Linf 0.00306553, total time[s] 0.098963 +Converged at iteration 29, L1 8.10977e-05, Linf 0.00361972, total time[s] 0.114657 +Converged at iteration 30, L1 7.57996e-05, Linf 0.00228542, total time[s] 0.130489 +Converged at iteration 29, L1 9.2162e-05, Linf 0.00260377, total time[s] 0.120304 +Converged at iteration 33, L1 6.59016e-05, Linf 0.00564416, total time[s] 0.113055 +Converged at iteration 27, L1 8.40025e-05, Linf 0.00381943, total time[s] 0.095791 +Converged at iteration 25, L1 7.19923e-05, Linf 0.0017608, total time[s] 0.073226 +Converged at iteration 24, L1 6.58047e-05, Linf 0.00321732, total time[s] 0.097469 +Converged at iteration 39, L1 8.29238e-05, Linf 0.0059979, total time[s] 0.134641 +Converged at iteration 36, L1 7.31391e-05, Linf 0.00455951, total time[s] 0.106728 +Converged at iteration 25, L1 7.12035e-05, Linf 0.00500485, total time[s] 0.086781 +Converged at iteration 31, L1 5.90382e-05, Linf 0.00506936, total time[s] 0.106581 +Converged at iteration 26, L1 6.20295e-05, Linf 0.0066183, total time[s] 0.093818 +Converged at iteration 21, L1 5.87985e-05, Linf 0.00274726, total time[s] 0.067301 +Converged at iteration 19, L1 9.32803e-05, Linf 0.00624538, total time[s] 0.052165 +Converged at iteration 21, L1 6.87664e-05, Linf 0.00715322, total time[s] 0.059346 +Converged at iteration 25, L1 7.5061e-05, Linf 0.0060323, total time[s] 0.072925 +Converged at iteration 25, L1 5.39821e-05, Linf 0.00387934, total time[s] 0.070071 +Converged at iteration 20, L1 7.17516e-05, Linf 0.00547418, total time[s] 0.062629 +Converged at iteration 17, L1 6.5817e-05, Linf 0.00293257, total time[s] 0.048844 +Converged at iteration 32, L1 6.55262e-05, Linf 0.00233354, total time[s] 0.087815 +Converged at iteration 20, L1 6.20914e-05, Linf 0.00496288, total time[s] 0.062388 +Converged at iteration 23, L1 9.06762e-05, Linf 0.00677148, total time[s] 0.070397 +Converged at iteration 27, L1 8.00204e-05, Linf 0.00426952, total time[s] 0.072412 +Converged at iteration 23, L1 7.63393e-05, Linf 0.00669619, total time[s] 0.080317 +Converged at iteration 21, L1 7.15889e-05, Linf 0.00426406, total time[s] 0.065628 +Converged at iteration 23, L1 7.56417e-05, Linf 0.00339057, total time[s] 0.062013 +Converged at iteration 25, L1 9.44065e-05, Linf 0.00587116, total time[s] 0.071306 +Converged at iteration 28, L1 9.09e-05, Linf 0.00465824, total time[s] 0.089412 +Converged at iteration 30, L1 6.16421e-05, Linf 0.00460893, total time[s] 0.082778 +Converged at iteration 28, L1 7.26948e-05, Linf 0.00308141, total time[s] 0.104634 +Converged at iteration 29, L1 8.08917e-05, Linf 0.00358195, total time[s] 0.140555 +Converged at iteration 30, L1 7.76058e-05, Linf 0.00237353, total time[s] 0.082426 +Converged at iteration 29, L1 9.80279e-05, Linf 0.00273136, total time[s] 0.099502 +Converged at iteration 33, L1 6.69566e-05, Linf 0.00560452, total time[s] 0.098602 +Converged at iteration 27, L1 8.66276e-05, Linf 0.0038902, total time[s] 0.080375 +Converged at iteration 25, L1 7.06423e-05, Linf 0.00241553, total time[s] 0.092266 +Converged at iteration 24, L1 6.90701e-05, Linf 0.00340787, total time[s] 0.084107 +Converged at iteration 39, L1 8.23073e-05, Linf 0.006191, total time[s] 0.110744 +Converged at iteration 36, L1 7.47922e-05, Linf 0.00479074, total time[s] 0.162306 +Converged at iteration 25, L1 6.18765e-05, Linf 0.0040997, total time[s] 0.091217 +Converged at iteration 31, L1 5.80321e-05, Linf 0.0051028, total time[s] 0.087975 +Converged at iteration 25, L1 9.95957e-05, Linf 0.00593263, total time[s] 0.10331 +Converged at iteration 21, L1 5.8359e-05, Linf 0.00294822, total time[s] 0.074634 +Converged at iteration 19, L1 8.84235e-05, Linf 0.00597626, total time[s] 0.072735 +Converged at iteration 21, L1 5.97927e-05, Linf 0.0056814, total time[s] 0.066707 +Converged at iteration 25, L1 6.3491e-05, Linf 0.00512161, total time[s] 0.197254 +Converged at iteration 24, L1 9.71882e-05, Linf 0.00500772, total time[s] 0.081481 +Converged at iteration 20, L1 6.9387e-05, Linf 0.00538113, total time[s] 0.066079 +Converged at iteration 17, L1 6.40137e-05, Linf 0.00287477, total time[s] 0.048674 +Converged at iteration 32, L1 6.66737e-05, Linf 0.00237329, total time[s] 0.116579 +Converged at iteration 20, L1 6.16841e-05, Linf 0.0046995, total time[s] 0.056111 +Converged at iteration 23, L1 8.82766e-05, Linf 0.0069234, total time[s] 0.060597 +Converged at iteration 27, L1 7.42166e-05, Linf 0.004114, total time[s] 0.075882 +Converged at iteration 23, L1 7.4044e-05, Linf 0.00649594, total time[s] 0.076563 +Converged at iteration 21, L1 6.77112e-05, Linf 0.00417929, total time[s] 0.07886 +Converged at iteration 23, L1 7.50011e-05, Linf 0.00326162, total time[s] 0.061869 +Converged at iteration 25, L1 9.32512e-05, Linf 0.00555029, total time[s] 0.077159 +Converged at iteration 28, L1 8.78435e-05, Linf 0.00467869, total time[s] 0.081906 +Converged at iteration 30, L1 6.00761e-05, Linf 0.00458164, total time[s] 0.130104 +Converged at iteration 28, L1 7.10413e-05, Linf 0.00304825, total time[s] 0.165787 +Converged at iteration 29, L1 8.11648e-05, Linf 0.00364194, total time[s] 0.140736 +Converged at iteration 30, L1 7.56639e-05, Linf 0.00225472, total time[s] 0.118248 +Converged at iteration 29, L1 8.85971e-05, Linf 0.00254054, total time[s] 0.162997 +Converged at iteration 33, L1 6.53633e-05, Linf 0.00566738, total time[s] 0.160243 +Converged at iteration 27, L1 8.24761e-05, Linf 0.00377539, total time[s] 0.091495 +Converged at iteration 25, L1 7.32742e-05, Linf 0.00179919, total time[s] 0.141346 +Converged at iteration 24, L1 6.41098e-05, Linf 0.00312886, total time[s] 0.105938 +Converged at iteration 39, L1 8.28932e-05, Linf 0.0060579, total time[s] 0.182247 +Converged at iteration 36, L1 7.32198e-05, Linf 0.00464751, total time[s] 0.136686 +Converged at iteration 25, L1 6.62256e-05, Linf 0.00455595, total time[s] 0.136107 +Converged at iteration 31, L1 5.79981e-05, Linf 0.00510211, total time[s] 0.134723 +Converged at iteration 26, L1 5.91203e-05, Linf 0.00507941, total time[s] 0.105307 +Converged at iteration 21, L1 5.79722e-05, Linf 0.00284613, total time[s] 0.062047 +Converged at iteration 19, L1 9.09782e-05, Linf 0.0061083, total time[s] 0.059347 +Converged at iteration 21, L1 6.39714e-05, Linf 0.00639324, total time[s] 0.110864 +Converged at iteration 25, L1 6.89556e-05, Linf 0.00560328, total time[s] 0.068855 +Converged at iteration 24, L1 9.94093e-05, Linf 0.00502667, total time[s] 0.087617 +Converged at iteration 20, L1 7.06404e-05, Linf 0.00543106, total time[s] 0.078527 +Converged at iteration 17, L1 6.46977e-05, Linf 0.0028843, total time[s] 0.060529 +Converged at iteration 32, L1 6.59264e-05, Linf 0.00235305, total time[s] 0.114696 +Converged at iteration 20, L1 6.1854e-05, Linf 0.00483068, total time[s] 0.067069 +Converged at iteration 23, L1 8.94092e-05, Linf 0.00684663, total time[s] 0.071116 +Converged at iteration 27, L1 7.68023e-05, Linf 0.00419096, total time[s] 0.070117 +Converged at iteration 23, L1 7.51142e-05, Linf 0.00659533, total time[s] 0.067254 +Converged at iteration 21, L1 6.97274e-05, Linf 0.00422265, total time[s] 0.05722 +Converged at iteration 23, L1 7.52469e-05, Linf 0.0033175, total time[s] 0.061293 +Converged at iteration 25, L1 9.38165e-05, Linf 0.00571491, total time[s] 0.092678 +Converged at iteration 28, L1 8.85561e-05, Linf 0.00452626, total time[s] 0.113872 +Converged at iteration 30, L1 6.08414e-05, Linf 0.00459705, total time[s] 0.153982 +Converged at iteration 28, L1 7.19769e-05, Linf 0.00306709, total time[s] 0.138386 +Converged at iteration 29, L1 8.13253e-05, Linf 0.00361209, total time[s] 0.094481 +Converged at iteration 30, L1 7.61419e-05, Linf 0.00230172, total time[s] 0.089911 +Converged at iteration 29, L1 9.37184e-05, Linf 0.00262624, total time[s] 0.096836 +Converged at iteration 33, L1 6.65575e-05, Linf 0.00571424, total time[s] 0.117403 +Converged at iteration 27, L1 8.45172e-05, Linf 0.00383395, total time[s] 0.092398 +Converged at iteration 25, L1 7.20518e-05, Linf 0.00175015, total time[s] 0.097664 +Converged at iteration 24, L1 6.66765e-05, Linf 0.00323639, total time[s] 0.10881 +Converged at iteration 39, L1 8.02278e-05, Linf 0.00622872, total time[s] 0.163238 +Converged at iteration 36, L1 7.29528e-05, Linf 0.00482875, total time[s] 0.248533 +Converged at iteration 25, L1 6.01519e-05, Linf 0.00379502, total time[s] 0.118828 +Converged at iteration 31, L1 5.82107e-05, Linf 0.00507057, total time[s] 0.155205 +Converged at iteration 25, L1 9.84422e-05, Linf 0.00597565, total time[s] 0.100711 +Converged at iteration 21, L1 5.78707e-05, Linf 0.00301015, total time[s] 0.088814 +Converged at iteration 19, L1 8.70124e-05, Linf 0.00588418, total time[s] 0.068897 +Converged at iteration 21, L1 5.75809e-05, Linf 0.00527013, total time[s] 0.097712 +Converged at iteration 25, L1 6.07688e-05, Linf 0.00483181, total time[s] 0.094003 +Converged at iteration 24, L1 9.66656e-05, Linf 0.00497156, total time[s] 0.082428 +Converged at iteration 20, L1 6.96593e-05, Linf 0.00535621, total time[s] 0.062704 +Converged at iteration 17, L1 6.3788e-05, Linf 0.0028061, total time[s] 0.059437 +Converged at iteration 32, L1 6.66169e-05, Linf 0.00238702, total time[s] 0.109868 +Converged at iteration 20, L1 6.1623e-05, Linf 0.00462996, total time[s] 0.064122 +Converged at iteration 23, L1 8.76898e-05, Linf 0.00723204, total time[s] 0.070359 +Converged at iteration 27, L1 7.30687e-05, Linf 0.00406954, total time[s] 0.093825 +Converged at iteration 23, L1 7.35944e-05, Linf 0.00643513, total time[s] 0.077318 +Converged at iteration 21, L1 6.66723e-05, Linf 0.00415058, total time[s] 0.056266 +Converged at iteration 23, L1 7.48917e-05, Linf 0.00323117, total time[s] 0.078938 +Converged at iteration 25, L1 9.28834e-05, Linf 0.00544162, total time[s] 0.084111 +Converged at iteration 28, L1 8.69791e-05, Linf 0.00438899, total time[s] 0.102244 +Converged at iteration 30, L1 5.98232e-05, Linf 0.00457418, total time[s] 0.109439 +Converged at iteration 28, L1 7.08601e-05, Linf 0.00303618, total time[s] 0.129423 +Converged at iteration 29, L1 8.1051e-05, Linf 0.00366244, total time[s] 0.110543 +Converged at iteration 30, L1 7.38577e-05, Linf 0.00217464, total time[s] 0.133774 +Converged at iteration 29, L1 8.5414e-05, Linf 0.00249295, total time[s] 0.14798 +Converged at iteration 33, L1 6.53466e-05, Linf 0.005687, total time[s] 0.198422 +Converged at iteration 27, L1 8.15687e-05, Linf 0.0037811, total time[s] 0.274776 +Converged at iteration 25, L1 7.40583e-05, Linf 0.00182872, total time[s] 0.160545 +Converged at iteration 24, L1 6.34842e-05, Linf 0.00302138, total time[s] 0.216021 +Converged at iteration 39, L1 7.79686e-05, Linf 0.00630536, total time[s] 0.191063 +Converged at iteration 36, L1 7.29078e-05, Linf 0.00505501, total time[s] 0.18625 +Converged at iteration 25, L1 5.25672e-05, Linf 0.00232862, total time[s] 0.131525 +Converged at iteration 31, L1 5.76213e-05, Linf 0.00505781, total time[s] 0.149517 +Converged at iteration 25, L1 9.28672e-05, Linf 0.00587347, total time[s] 0.108229 +Converged at iteration 21, L1 5.79757e-05, Linf 0.0032427, total time[s] 0.13379 +Converged at iteration 19, L1 8.2262e-05, Linf 0.0055194, total time[s] 0.153117 +Converged at iteration 21, L1 5.05529e-05, Linf 0.00433151, total time[s] 0.166071 +Converged at iteration 24, L1 9.95707e-05, Linf 0.00647436, total time[s] 0.225987 +Converged at iteration 24, L1 9.12245e-05, Linf 0.00493085, total time[s] 0.071842 +Converged at iteration 20, L1 6.66288e-05, Linf 0.00528052, total time[s] 0.057064 +Converged at iteration 17, L1 6.30122e-05, Linf 0.00267888, total time[s] 0.082042 +Converged at iteration 32, L1 6.609e-05, Linf 0.00243934, total time[s] 0.136656 +Converged at iteration 19, L1 9.98218e-05, Linf 0.00715559, total time[s] 0.06799 +Converged at iteration 23, L1 8.46975e-05, Linf 0.00712359, total time[s] 0.091021 +Converged at iteration 27, L1 6.79444e-05, Linf 0.00390055, total time[s] 0.122178 +Converged at iteration 23, L1 7.17809e-05, Linf 0.00617111, total time[s] 0.093401 +Converged at iteration 21, L1 6.28899e-05, Linf 0.00403867, total time[s] 0.064757 +Converged at iteration 23, L1 7.46066e-05, Linf 0.00312364, total time[s] 0.072433 +Converged at iteration 25, L1 9.14751e-05, Linf 0.00498871, total time[s] 0.077369 +Converged at iteration 28, L1 8.44636e-05, Linf 0.0041614, total time[s] 0.097949 +Converged at iteration 30, L1 5.88529e-05, Linf 0.00455987, total time[s] 0.096854 +Converged at iteration 28, L1 6.95196e-05, Linf 0.00296523, total time[s] 0.099721 +Converged at iteration 29, L1 8.20983e-05, Linf 0.00374382, total time[s] 0.17238 +Converged at iteration 30, L1 7.05481e-05, Linf 0.00218171, total time[s] 0.082597 +Converged at iteration 29, L1 7.54709e-05, Linf 0.00228991, total time[s] 0.096034 +Converged at iteration 33, L1 6.30708e-05, Linf 0.0057682, total time[s] 0.105832 +Converged at iteration 27, L1 7.59422e-05, Linf 0.00359136, total time[s] 0.070106 +Converged at iteration 25, L1 7.74903e-05, Linf 0.00195677, total time[s] 0.068134 +Converged at iteration 23, L1 9.99984e-05, Linf 0.00412078, total time[s] 0.088546 +Converged at iteration 39, L1 7.88867e-05, Linf 0.00630689, total time[s] 0.130072 +Converged at iteration 36, L1 7.33044e-05, Linf 0.00492576, total time[s] 0.112332 +Converged at iteration 25, L1 5.59204e-05, Linf 0.00283598, total time[s] 0.101744 +Converged at iteration 31, L1 5.76171e-05, Linf 0.00506661, total time[s] 0.109924 +Converged at iteration 25, L1 9.54421e-05, Linf 0.00592474, total time[s] 0.072161 +Converged at iteration 21, L1 5.66509e-05, Linf 0.00313176, total time[s] 0.074039 +Converged at iteration 19, L1 8.43698e-05, Linf 0.00561757, total time[s] 0.098929 +Converged at iteration 21, L1 5.37202e-05, Linf 0.00466121, total time[s] 0.092308 +Converged at iteration 25, L1 5.49828e-05, Linf 0.00417148, total time[s] 0.111321 +Converged at iteration 24, L1 9.42622e-05, Linf 0.0049771, total time[s] 0.124257 +Converged at iteration 20, L1 6.75313e-05, Linf 0.00532054, total time[s] 0.088242 +Converged at iteration 17, L1 6.32616e-05, Linf 0.00271547, total time[s] 0.12795 +Converged at iteration 32, L1 6.65362e-05, Linf 0.00241276, total time[s] 0.133025 +Converged at iteration 20, L1 6.24723e-05, Linf 0.00447353, total time[s] 0.090689 +Converged at iteration 23, L1 8.66575e-05, Linf 0.00705529, total time[s] 0.120983 +Converged at iteration 27, L1 7.03894e-05, Linf 0.0039754, total time[s] 0.1108 +Converged at iteration 23, L1 7.2726e-05, Linf 0.00629763, total time[s] 0.094684 +Converged at iteration 21, L1 6.45691e-05, Linf 0.00409214, total time[s] 0.087782 +Converged at iteration 23, L1 7.48143e-05, Linf 0.00317324, total time[s] 0.09356 +Converged at iteration 25, L1 9.21988e-05, Linf 0.00521619, total time[s] 0.101847 +Converged at iteration 28, L1 8.57446e-05, Linf 0.00436631, total time[s] 0.104129 +Converged at iteration 30, L1 5.94768e-05, Linf 0.00456006, total time[s] 0.123215 +Converged at iteration 28, L1 6.9981e-05, Linf 0.00299934, total time[s] 0.093893 +Converged at iteration 29, L1 8.14341e-05, Linf 0.00369481, total time[s] 0.137932 +Converged at iteration 30, L1 7.25264e-05, Linf 0.00217168, total time[s] 0.117445 +Converged at iteration 29, L1 8.06348e-05, Linf 0.00239349, total time[s] 0.086432 +Converged at iteration 33, L1 6.41388e-05, Linf 0.0057309, total time[s] 0.123964 +Converged at iteration 27, L1 7.85512e-05, Linf 0.0036656, total time[s] 0.099182 +Converged at iteration 25, L1 7.65185e-05, Linf 0.00189358, total time[s] 0.106744 +Converged at iteration 24, L1 6.04606e-05, Linf 0.00290338, total time[s] 0.138229 +Converged at iteration 39, L1 7.66283e-05, Linf 0.00642795, total time[s] 0.337598 +Converged at iteration 36, L1 7.20725e-05, Linf 0.00513609, total time[s] 0.148225 +Converged at iteration 25, L1 5.09543e-05, Linf 0.00203883, total time[s] 0.100611 +Converged at iteration 31, L1 5.68105e-05, Linf 0.00505066, total time[s] 0.116611 +Converged at iteration 25, L1 9.12038e-05, Linf 0.00584237, total time[s] 0.078277 +Converged at iteration 21, L1 5.65969e-05, Linf 0.00330654, total time[s] 0.069647 +Converged at iteration 19, L1 8.09803e-05, Linf 0.00531987, total time[s] 0.054373 +Converged at iteration 21, L1 4.9068e-05, Linf 0.0046818, total time[s] 0.095333 +Converged at iteration 24, L1 9.52393e-05, Linf 0.00610265, total time[s] 0.09737 +Converged at iteration 24, L1 8.88164e-05, Linf 0.00493079, total time[s] 0.126348 +Converged at iteration 20, L1 6.52441e-05, Linf 0.00530151, total time[s] 0.056637 +Converged at iteration 17, L1 6.22659e-05, Linf 0.00264013, total time[s] 0.135739 +Converged at iteration 32, L1 6.59161e-05, Linf 0.00245494, total time[s] 0.258947 +Converged at iteration 19, L1 9.97763e-05, Linf 0.00716273, total time[s] 0.060263 +Converged at iteration 23, L1 8.49016e-05, Linf 0.00669281, total time[s] 0.093069 +Converged at iteration 27, L1 6.65488e-05, Linf 0.00386184, total time[s] 0.12518 +Converged at iteration 23, L1 7.14127e-05, Linf 0.00610758, total time[s] 0.072689 +Converged at iteration 21, L1 6.27213e-05, Linf 0.00400742, total time[s] 0.079012 +Converged at iteration 23, L1 7.45613e-05, Linf 0.0030981, total time[s] 0.071961 +Converged at iteration 25, L1 9.1022e-05, Linf 0.00474473, total time[s] 0.092986 +Converged at iteration 28, L1 8.37111e-05, Linf 0.00398394, total time[s] 0.085 +Converged at iteration 30, L1 5.84935e-05, Linf 0.0045613, total time[s] 0.081788 +Converged at iteration 28, L1 6.93574e-05, Linf 0.00294216, total time[s] 0.08748 +Converged at iteration 29, L1 8.18288e-05, Linf 0.00377223, total time[s] 0.090144 +Converged at iteration 30, L1 7.01598e-05, Linf 0.00218885, total time[s] 0.114573 +Converged at iteration 29, L1 7.34372e-05, Linf 0.00222031, total time[s] 0.088104 +Converged at iteration 33, L1 6.27336e-05, Linf 0.00598156, total time[s] 0.087632 +Converged at iteration 27, L1 7.41746e-05, Linf 0.00355764, total time[s] 0.077393 +Converged at iteration 25, L1 7.86385e-05, Linf 0.0019957, total time[s] 0.065977 +Converged at iteration 23, L1 9.82443e-05, Linf 0.00402899, total time[s] 0.061195 +Converged at iteration 39, L1 7.77154e-05, Linf 0.00636643, total time[s] 0.106989 +Converged at iteration 36, L1 7.24299e-05, Linf 0.00502576, total time[s] 0.132278 +Converged at iteration 25, L1 5.32497e-05, Linf 0.00239107, total time[s] 0.06502 +Converged at iteration 31, L1 5.69947e-05, Linf 0.00505973, total time[s] 0.081493 +Converged at iteration 25, L1 9.33167e-05, Linf 0.00588379, total time[s] 0.07028 +Converged at iteration 21, L1 5.65297e-05, Linf 0.00322197, total time[s] 0.069247 +Converged at iteration 19, L1 8.26265e-05, Linf 0.00560485, total time[s] 0.076659 +Converged at iteration 21, L1 5.11007e-05, Linf 0.00438124, total time[s] 0.05838 +Converged at iteration 25, L1 5.13083e-05, Linf 0.00377296, total time[s] 0.076597 +Converged at iteration 24, L1 9.07552e-05, Linf 0.0049512, total time[s] 0.06834 +Converged at iteration 20, L1 6.61598e-05, Linf 0.00530882, total time[s] 0.085203 +Converged at iteration 17, L1 6.28036e-05, Linf 0.00269166, total time[s] 0.057566 +Converged at iteration 32, L1 6.62031e-05, Linf 0.00243416, total time[s] 0.088709 +Converged at iteration 19, L1 9.98717e-05, Linf 0.0071516, total time[s] 0.072478 +Converged at iteration 23, L1 8.50622e-05, Linf 0.00711205, total time[s] 0.074826 +Converged at iteration 27, L1 6.85108e-05, Linf 0.00391293, total time[s] 0.075305 +Converged at iteration 23, L1 7.20043e-05, Linf 0.00619112, total time[s] 0.063884 +Converged at iteration 21, L1 6.32031e-05, Linf 0.00404869, total time[s] 0.071415 +Converged at iteration 23, L1 7.46175e-05, Linf 0.00313303, total time[s] 0.070651 +Converged at iteration 25, L1 9.1589e-05, Linf 0.00503146, total time[s] 0.06898 +Converged at iteration 28, L1 8.46832e-05, Linf 0.00421759, total time[s] 0.080107 +Converged at iteration 30, L1 5.91076e-05, Linf 0.00455818, total time[s] 0.085616 +Converged at iteration 28, L1 6.97334e-05, Linf 0.00297345, total time[s] 0.076911 +Converged at iteration 29, L1 8.23183e-05, Linf 0.00373231, total time[s] 0.081353 +Converged at iteration 30, L1 7.15838e-05, Linf 0.00217916, total time[s] 0.084503 +Converged at iteration 29, L1 7.68981e-05, Linf 0.00231314, total time[s] 0.086945 +Converged at iteration 33, L1 6.33336e-05, Linf 0.00576298, total time[s] 0.091502 +Converged at iteration 27, L1 7.78362e-05, Linf 0.00360487, total time[s] 0.079395 +Converged at iteration 25, L1 7.77921e-05, Linf 0.00194587, total time[s] 0.076738 +Converged at iteration 24, L1 5.89333e-05, Linf 0.00283512, total time[s] 0.067485 +Converged at iteration 39, L1 7.58844e-05, Linf 0.00646531, total time[s] 0.12089 +Converged at iteration 36, L1 7.18787e-05, Linf 0.00515956, total time[s] 0.107211 +Converged at iteration 25, L1 4.97077e-05, Linf 0.0019701, total time[s] 0.091262 +Converged at iteration 31, L1 5.70915e-05, Linf 0.00504469, total time[s] 0.106679 +Converged at iteration 25, L1 8.99328e-05, Linf 0.00581682, total time[s] 0.070816 +Converged at iteration 21, L1 5.70913e-05, Linf 0.00335926, total time[s] 0.057459 +Converged at iteration 19, L1 7.9997e-05, Linf 0.00532023, total time[s] 0.060177 +Converged at iteration 21, L1 4.79429e-05, Linf 0.00442424, total time[s] 0.06864 +Converged at iteration 24, L1 9.20155e-05, Linf 0.00577567, total time[s] 0.0745 +Converged at iteration 24, L1 8.88088e-05, Linf 0.00491827, total time[s] 0.063114 +Converged at iteration 20, L1 6.45141e-05, Linf 0.0052961, total time[s] 0.057483 +Converged at iteration 17, L1 6.18789e-05, Linf 0.00260901, total time[s] 0.054344 +Converged at iteration 32, L1 6.56206e-05, Linf 0.00246714, total time[s] 0.13817 +Converged at iteration 19, L1 9.96452e-05, Linf 0.00716172, total time[s] 0.05487 +Converged at iteration 23, L1 8.36249e-05, Linf 0.0071656, total time[s] 0.120751 +Converged at iteration 27, L1 6.55332e-05, Linf 0.00382572, total time[s] 0.151109 +Converged at iteration 23, L1 7.12088e-05, Linf 0.00605894, total time[s] 0.074953 +Converged at iteration 21, L1 6.19071e-05, Linf 0.00398569, total time[s] 0.072287 +Converged at iteration 23, L1 7.47266e-05, Linf 0.00307827, total time[s] 0.064199 +Converged at iteration 25, L1 9.09063e-05, Linf 0.00475233, total time[s] 0.105085 +Converged at iteration 28, L1 8.33722e-05, Linf 0.00385313, total time[s] 0.083639 +Converged at iteration 30, L1 5.82882e-05, Linf 0.00456134, total time[s] 0.084999 +Converged at iteration 28, L1 6.92903e-05, Linf 0.00292385, total time[s] 0.077451 +Converged at iteration 29, L1 8.15804e-05, Linf 0.00379143, total time[s] 0.086515 +Converged at iteration 30, L1 6.92583e-05, Linf 0.00219141, total time[s] 0.098036 +Converged at iteration 29, L1 7.12775e-05, Linf 0.00216676, total time[s] 0.080434 +Converged at iteration 33, L1 6.21856e-05, Linf 0.0058109, total time[s] 0.11897 +Converged at iteration 27, L1 7.27443e-05, Linf 0.00351188, total time[s] 0.075043 +Converged at iteration 25, L1 7.91832e-05, Linf 0.00202777, total time[s] 0.092696 +Converged at iteration 23, L1 9.69169e-05, Linf 0.003957, total time[s] 0.068655 +Converged at iteration 39, L1 7.2988e-05, Linf 0.00662142, total time[s] 0.110376 +Converged at iteration 36, L1 7.10644e-05, Linf 0.00537702, total time[s] 0.111468 +Converged at iteration 24, L1 9.99138e-05, Linf 0.00333473, total time[s] 0.064074 +Converged at iteration 31, L1 5.59509e-05, Linf 0.00502669, total time[s] 0.082518 +Converged at iteration 25, L1 8.46498e-05, Linf 0.00570654, total time[s] 0.079956 +Converged at iteration 21, L1 5.84429e-05, Linf 0.00358796, total time[s] 0.05633 +Converged at iteration 19, L1 7.73152e-05, Linf 0.00499454, total time[s] 0.069929 +Converged at iteration 21, L1 4.42168e-05, Linf 0.00426792, total time[s] 0.086453 +Converged at iteration 24, L1 8.02635e-05, Linf 0.00456587, total time[s] 0.191472 +Converged at iteration 24, L1 8.44782e-05, Linf 0.00487332, total time[s] 0.129311 +Converged at iteration 20, L1 6.19743e-05, Linf 0.00514923, total time[s] 0.126148 +Converged at iteration 17, L1 6.02732e-05, Linf 0.00245209, total time[s] 0.090231 +Converged at iteration 32, L1 6.4275e-05, Linf 0.00249504, total time[s] 0.107048 +Converged at iteration 19, L1 9.93628e-05, Linf 0.00707727, total time[s] 0.061844 +Converged at iteration 23, L1 8.17202e-05, Linf 0.00714645, total time[s] 0.080707 +Converged at iteration 27, L1 6.12138e-05, Linf 0.00368224, total time[s] 0.09032 +Converged at iteration 23, L1 7.04569e-05, Linf 0.00586377, total time[s] 0.096061 +Converged at iteration 21, L1 5.89546e-05, Linf 0.00387121, total time[s] 0.083781 +Converged at iteration 23, L1 7.46213e-05, Linf 0.00301033, total time[s] 0.088555 +Converged at iteration 25, L1 8.96572e-05, Linf 0.00437718, total time[s] 0.073865 +Converged at iteration 28, L1 8.06131e-05, Linf 0.00355306, total time[s] 0.078305 +Converged at iteration 30, L1 5.77076e-05, Linf 0.00455029, total time[s] 0.086671 +Converged at iteration 28, L1 6.88957e-05, Linf 0.00288057, total time[s] 0.077502 +Converged at iteration 29, L1 8.21335e-05, Linf 0.0038771, total time[s] 0.086146 +Converged at iteration 30, L1 6.71466e-05, Linf 0.00219436, total time[s] 0.085531 +Converged at iteration 29, L1 6.52496e-05, Linf 0.00196301, total time[s] 0.085985 +Converged at iteration 33, L1 6.03041e-05, Linf 0.00589534, total time[s] 0.09929 +Converged at iteration 27, L1 6.71667e-05, Linf 0.00340544, total time[s] 0.070979 +Converged at iteration 25, L1 8.27283e-05, Linf 0.00210119, total time[s] 0.08238 +Converged at iteration 23, L1 9.1418e-05, Linf 0.0037029, total time[s] 0.068577 +Converged at iteration 39, L1 7.5229e-05, Linf 0.00654561, total time[s] 0.111388 +Converged at iteration 36, L1 7.15967e-05, Linf 0.00527366, total time[s] 0.109395 +Converged at iteration 25, L1 4.7863e-05, Linf 0.001852, total time[s] 0.063561 +Converged at iteration 31, L1 5.62733e-05, Linf 0.00503405, total time[s] 0.077964 +Converged at iteration 25, L1 8.72594e-05, Linf 0.00555557, total time[s] 0.064154 +Converged at iteration 21, L1 5.74522e-05, Linf 0.00347727, total time[s] 0.056706 +Converged at iteration 19, L1 7.87102e-05, Linf 0.00520229, total time[s] 0.0491 +Converged at iteration 21, L1 4.57775e-05, Linf 0.00459289, total time[s] 0.053645 +Converged at iteration 24, L1 8.59033e-05, Linf 0.00514356, total time[s] 0.06103 +Converged at iteration 24, L1 8.54513e-05, Linf 0.00490057, total time[s] 0.061543 +Converged at iteration 20, L1 6.31368e-05, Linf 0.00523185, total time[s] 0.05772 +Converged at iteration 17, L1 6.1098e-05, Linf 0.00251938, total time[s] 0.045456 +Converged at iteration 32, L1 6.49191e-05, Linf 0.00249181, total time[s] 0.079524 +Converged at iteration 19, L1 9.95254e-05, Linf 0.00713523, total time[s] 0.050999 +Converged at iteration 23, L1 8.27179e-05, Linf 0.00703627, total time[s] 0.05836 +Converged at iteration 27, L1 6.331e-05, Linf 0.00375384, total time[s] 0.067572 +Converged at iteration 23, L1 7.09373e-05, Linf 0.00591953, total time[s] 0.059242 +Converged at iteration 21, L1 6.03627e-05, Linf 0.00393179, total time[s] 0.054095 +Converged at iteration 23, L1 7.45723e-05, Linf 0.00304911, total time[s] 0.059382 +Converged at iteration 25, L1 9.02946e-05, Linf 0.0046647, total time[s] 0.063807 +Converged at iteration 28, L1 8.18389e-05, Linf 0.00383912, total time[s] 0.072041 +Converged at iteration 30, L1 5.78149e-05, Linf 0.00455776, total time[s] 0.074889 +Converged at iteration 28, L1 6.9221e-05, Linf 0.00287491, total time[s] 0.073651 +Converged at iteration 29, L1 8.21557e-05, Linf 0.00382907, total time[s] 0.072592 +Converged at iteration 30, L1 6.82776e-05, Linf 0.00219476, total time[s] 0.084862 +Converged at iteration 29, L1 6.84382e-05, Linf 0.00205907, total time[s] 0.072588 +Converged at iteration 33, L1 6.13246e-05, Linf 0.00585598, total time[s] 0.081993 +Converged at iteration 27, L1 7.03081e-05, Linf 0.0034374, total time[s] 0.071238 +Converged at iteration 25, L1 8.10027e-05, Linf 0.00206091, total time[s] 0.066338 +Converged at iteration 23, L1 9.42801e-05, Linf 0.00375164, total time[s] 0.060716 +Converged at iteration 39, L1 7.32604e-05, Linf 0.00666723, total time[s] 0.120368 +Converged at iteration 36, L1 7.08807e-05, Linf 0.00546106, total time[s] 0.090997 +Converged at iteration 24, L1 9.87495e-05, Linf 0.00316463, total time[s] 0.074567 +Converged at iteration 31, L1 5.64619e-05, Linf 0.00502331, total time[s] 0.079747 +Converged at iteration 25, L1 8.31242e-05, Linf 0.00567271, total time[s] 0.064877 +Converged at iteration 21, L1 5.92282e-05, Linf 0.00365247, total time[s] 0.056414 +Converged at iteration 19, L1 7.64456e-05, Linf 0.00491658, total time[s] 0.057131 +Converged at iteration 21, L1 4.33806e-05, Linf 0.00443299, total time[s] 0.057881 +Converged at iteration 24, L1 7.70383e-05, Linf 0.00431079, total time[s] 0.072606 +Converged at iteration 24, L1 8.15356e-05, Linf 0.00484676, total time[s] 0.083407 +Converged at iteration 20, L1 6.16029e-05, Linf 0.00510304, total time[s] 0.084335 +Converged at iteration 17, L1 5.98073e-05, Linf 0.00243533, total time[s] 0.068155 +Converged at iteration 32, L1 6.41114e-05, Linf 0.00252975, total time[s] 0.191055 +Converged at iteration 19, L1 9.9802e-05, Linf 0.00704026, total time[s] 0.071696 +Converged at iteration 23, L1 8.12434e-05, Linf 0.00712063, total time[s] 0.118568 +Converged at iteration 27, L1 6.06251e-05, Linf 0.00363718, total time[s] 0.074431 +Converged at iteration 23, L1 7.04194e-05, Linf 0.00581177, total time[s] 0.061766 +Converged at iteration 20, L1 9.9458e-05, Linf 0.00506209, total time[s] 0.065405 +Converged at iteration 23, L1 7.4749e-05, Linf 0.00299365, total time[s] 0.063542 +Converged at iteration 25, L1 8.94379e-05, Linf 0.00428182, total time[s] 0.078927 +Converged at iteration 28, L1 7.97725e-05, Linf 0.00349184, total time[s] 0.08685 +Converged at iteration 30, L1 5.75686e-05, Linf 0.00454335, total time[s] 0.095274 +Converged at iteration 28, L1 6.89905e-05, Linf 0.00287609, total time[s] 0.093785 +Converged at iteration 29, L1 8.24344e-05, Linf 0.0039003, total time[s] 0.096976 +Converged at iteration 30, L1 6.66728e-05, Linf 0.0021908, total time[s] 0.089366 +Converged at iteration 29, L1 6.38029e-05, Linf 0.0019189, total time[s] 0.075594 +Converged at iteration 33, L1 5.97192e-05, Linf 0.0059204, total time[s] 0.085633 +Converged at iteration 27, L1 6.61988e-05, Linf 0.00332, total time[s] 0.071608 +Converged at iteration 25, L1 8.32892e-05, Linf 0.00213725, total time[s] 0.071023 +Converged at iteration 23, L1 8.97876e-05, Linf 0.00365658, total time[s] 0.06521 +Converged at iteration 39, L1 7.32519e-05, Linf 0.00660564, total time[s] 0.100112 +Converged at iteration 36, L1 7.12258e-05, Linf 0.00536355, total time[s] 0.097806 +Converged at iteration 25, L1 4.66172e-05, Linf 0.00175863, total time[s] 0.069762 +Converged at iteration 31, L1 5.60083e-05, Linf 0.00502775, total time[s] 0.082332 +Converged at iteration 25, L1 8.51772e-05, Linf 0.00571759, total time[s] 0.06878 +Converged at iteration 21, L1 5.8185e-05, Linf 0.0035669, total time[s] 0.057333 +Converged at iteration 19, L1 7.75229e-05, Linf 0.00502237, total time[s] 0.051591 +Converged at iteration 21, L1 4.44928e-05, Linf 0.00423433, total time[s] 0.059715 +Converged at iteration 24, L1 8.16121e-05, Linf 0.00471962, total time[s] 0.074853 +Converged at iteration 24, L1 8.34165e-05, Linf 0.00486915, total time[s] 0.063584 +Converged at iteration 20, L1 6.21123e-05, Linf 0.00516525, total time[s] 0.053748 +Converged at iteration 17, L1 6.04565e-05, Linf 0.0024884, total time[s] 0.049346 +Converged at iteration 32, L1 6.43475e-05, Linf 0.00251086, total time[s] 0.084088 +Converged at iteration 19, L1 9.94122e-05, Linf 0.00708991, total time[s] 0.053779 +Converged at iteration 23, L1 8.21975e-05, Linf 0.0071568, total time[s] 0.069251 +Converged at iteration 27, L1 6.29566e-05, Linf 0.00937642, total time[s] 0.069295 +Converged at iteration 23, L1 7.06281e-05, Linf 0.00588142, total time[s] 0.060375 +Converged at iteration 21, L1 5.9313e-05, Linf 0.00388376, total time[s] 0.063668 +Converged at iteration 23, L1 7.47593e-05, Linf 0.00300821, total time[s] 0.059688 +Converged at iteration 25, L1 9.09017e-05, Linf 0.00450468, total time[s] 0.06543 +Converged at iteration 28, L1 8.08335e-05, Linf 0.00357474, total time[s] 0.071513 +Converged at iteration 30, L1 5.88976e-05, Linf 0.00618351, total time[s] 0.078797 +Converged at iteration 28, L1 6.90327e-05, Linf 0.00288328, total time[s] 0.080991 +Converged at iteration 29, L1 8.22445e-05, Linf 0.00386874, total time[s] 0.084015 +Converged at iteration 30, L1 6.73397e-05, Linf 0.00219512, total time[s] 0.07451 +Converged at iteration 29, L1 6.57768e-05, Linf 0.00198068, total time[s] 0.075121 +Converged at iteration 33, L1 6.04548e-05, Linf 0.00582206, total time[s] 0.09243 +Converged at iteration 27, L1 6.85601e-05, Linf 0.00338692, total time[s] 0.071339 +Converged at iteration 25, L1 8.24224e-05, Linf 0.00209096, total time[s] 0.066125 +Converged at iteration 23, L1 9.21291e-05, Linf 0.00372187, total time[s] 0.062585 +Converged at iteration 39, L1 7.19876e-05, Linf 0.00662766, total time[s] 0.109811 +Converged at iteration 36, L1 7.09259e-05, Linf 0.00551741, total time[s] 0.099316 +Converged at iteration 24, L1 9.79404e-05, Linf 0.00312391, total time[s] 0.064572 +Converged at iteration 31, L1 5.55952e-05, Linf 0.00502051, total time[s] 0.084417 +Converged at iteration 25, L1 8.18707e-05, Linf 0.00564534, total time[s] 0.065889 +Converged at iteration 21, L1 6.00358e-05, Linf 0.00370273, total time[s] 0.057518 +Converged at iteration 19, L1 7.58454e-05, Linf 0.00490013, total time[s] 0.052404 +Converged at iteration 21, L1 4.27012e-05, Linf 0.00426342, total time[s] 0.057326 +Converged at iteration 24, L1 7.47415e-05, Linf 0.00405673, total time[s] 0.064822 +Converged at iteration 24, L1 8.01386e-05, Linf 0.00483291, total time[s] 0.065494 +Converged at iteration 20, L1 6.13162e-05, Linf 0.00508665, total time[s] 0.053987 +Converged at iteration 17, L1 5.93587e-05, Linf 0.00240352, total time[s] 0.046069 +Converged at iteration 32, L1 6.34389e-05, Linf 0.0025411, total time[s] 0.085125 +Converged at iteration 19, L1 9.91393e-05, Linf 0.00701074, total time[s] 0.05101 +Converged at iteration 23, L1 8.08051e-05, Linf 0.0070958, total time[s] 0.063338 +Converged at iteration 27, L1 6.0338e-05, Linf 0.00359932, total time[s] 0.081294 +Converged at iteration 23, L1 7.06619e-05, Linf 0.00572996, total time[s] 0.070918 +Converged at iteration 20, L1 9.85471e-05, Linf 0.00505733, total time[s] 0.079769 +Converged at iteration 23, L1 7.47992e-05, Linf 0.00298129, total time[s] 0.168247 +Converged at iteration 25, L1 8.94158e-05, Linf 0.00421035, total time[s] 0.125053 +Converged at iteration 28, L1 7.93114e-05, Linf 0.00353946, total time[s] 0.093096 +Converged at iteration 30, L1 5.75668e-05, Linf 0.00453417, total time[s] 0.093087 +Converged at iteration 28, L1 6.95073e-05, Linf 0.00287279, total time[s] 0.08061 +Converged at iteration 29, L1 8.30657e-05, Linf 0.00391754, total time[s] 0.086858 +Converged at iteration 30, L1 6.63468e-05, Linf 0.00218678, total time[s] 0.092765 +Converged at iteration 28, L1 9.86743e-05, Linf 0.00256227, total time[s] 0.111782 +Converged at iteration 33, L1 5.94522e-05, Linf 0.00594125, total time[s] 0.091357 +Converged at iteration 27, L1 6.5031e-05, Linf 0.00328491, total time[s] 0.071138 +Converged at iteration 25, L1 8.45424e-05, Linf 0.00216487, total time[s] 0.071232 +Converged at iteration 23, L1 8.8597e-05, Linf 0.00366577, total time[s] 0.082376 +Converged at iteration 39, L1 6.87422e-05, Linf 0.006859, total time[s] 0.150935 +Converged at iteration 36, L1 6.98233e-05, Linf 0.00572884, total time[s] 0.09412 +Converged at iteration 24, L1 9.4819e-05, Linf 0.00294568, total time[s] 0.067411 +Converged at iteration 30, L1 9.94608e-05, Linf 0.00614903, total time[s] 0.078227 +Converged at iteration 25, L1 7.69949e-05, Linf 0.00552794, total time[s] 0.06401 +Converged at iteration 21, L1 6.40897e-05, Linf 0.00390378, total time[s] 0.054748 +Converged at iteration 19, L1 7.35897e-05, Linf 0.00469935, total time[s] 0.05057 +Converged at iteration 21, L1 4.08068e-05, Linf 0.00396683, total time[s] 0.054927 +Converged at iteration 24, L1 6.65803e-05, Linf 0.00373425, total time[s] 0.061755 +Converged at iteration 24, L1 7.55155e-05, Linf 0.00477249, total time[s] 0.06238 +Converged at iteration 20, L1 5.8717e-05, Linf 0.00537351, total time[s] 0.054522 +Converged at iteration 17, L1 5.76827e-05, Linf 0.00226578, total time[s] 0.046739 +Converged at iteration 32, L1 6.17969e-05, Linf 0.00259604, total time[s] 0.081569 +Converged at iteration 19, L1 9.89293e-05, Linf 0.00701611, total time[s] 0.051092 +Converged at iteration 23, L1 7.93472e-05, Linf 0.0073266, total time[s] 0.060844 +Converged at iteration 27, L1 5.81348e-05, Linf 0.00343247, total time[s] 0.076643 +Converged at iteration 23, L1 7.07684e-05, Linf 0.00555084, total time[s] 0.065874 +Converged at iteration 20, L1 9.57572e-05, Linf 0.00503578, total time[s] 0.056999 +Converged at iteration 23, L1 7.53898e-05, Linf 0.00293785, total time[s] 0.070508 +Converged at iteration 25, L1 8.84922e-05, Linf 0.0039589, total time[s] 0.071417 +Converged at iteration 28, L1 7.72444e-05, Linf 0.00385628, total time[s] 0.10537 +Converged at iteration 30, L1 5.76599e-05, Linf 0.00451646, total time[s] 0.081805 +Converged at iteration 28, L1 6.95472e-05, Linf 0.00285154, total time[s] 0.077637 +Converged at iteration 29, L1 8.37739e-05, Linf 0.00400456, total time[s] 0.079327 +Converged at iteration 30, L1 6.46712e-05, Linf 0.00217599, total time[s] 0.093399 +Converged at iteration 28, L1 9.26644e-05, Linf 0.0024534, total time[s] 0.134183 +Converged at iteration 33, L1 5.75237e-05, Linf 0.00610909, total time[s] 0.129989 +Converged at iteration 27, L1 6.01079e-05, Linf 0.0031547, total time[s] 0.101717 +Converged at iteration 25, L1 8.61809e-05, Linf 0.00227857, total time[s] 0.111886 +Converged at iteration 23, L1 8.4379e-05, Linf 0.00349855, total time[s] 0.079454 +Converged at iteration 39, L1 7.00627e-05, Linf 0.00687403, total time[s] 0.112538 +Converged at iteration 36, L1 6.98007e-05, Linf 0.00561428, total time[s] 0.102308 +Converged at iteration 24, L1 9.62936e-05, Linf 0.0030683, total time[s] 0.084334 +Converged at iteration 30, L1 9.99516e-05, Linf 0.006145, total time[s] 0.101902 +Converged at iteration 25, L1 8.12108e-05, Linf 0.00655904, total time[s] 0.092331 +Converged at iteration 21, L1 6.41267e-05, Linf 0.00380558, total time[s] 0.071559 +Converged at iteration 19, L1 7.47874e-05, Linf 0.00465758, total time[s] 0.07438 +Converged at iteration 21, L1 4.14602e-05, Linf 0.0042247, total time[s] 0.084785 +Converged at iteration 24, L1 7.05535e-05, Linf 0.00390777, total time[s] 0.091957 +Converged at iteration 24, L1 7.77612e-05, Linf 0.00480198, total time[s] 0.077906 +Converged at iteration 20, L1 5.95606e-05, Linf 0.0051463, total time[s] 0.064912 +Converged at iteration 17, L1 5.84781e-05, Linf 0.00233495, total time[s] 0.045323 +Converged at iteration 32, L1 6.29313e-05, Linf 0.00256721, total time[s] 0.132451 +Converged at iteration 19, L1 9.90603e-05, Linf 0.00693571, total time[s] 0.102824 +Converged at iteration 23, L1 7.97594e-05, Linf 0.00701777, total time[s] 0.134896 +Converged at iteration 27, L1 5.9482e-05, Linf 0.00353404, total time[s] 0.125528 +Converged at iteration 23, L1 7.04135e-05, Linf 0.00568133, total time[s] 0.109131 +Converged at iteration 20, L1 9.69151e-05, Linf 0.00504276, total time[s] 0.088113 +Converged at iteration 23, L1 7.49568e-05, Linf 0.00293574, total time[s] 0.064055 +Converged at iteration 25, L1 8.89484e-05, Linf 0.00428999, total time[s] 0.07045 +Converged at iteration 28, L1 7.85855e-05, Linf 0.00369097, total time[s] 0.095631 +Converged at iteration 30, L1 5.75696e-05, Linf 0.00450409, total time[s] 0.108895 +Converged at iteration 28, L1 6.97229e-05, Linf 0.00286715, total time[s] 0.105163 +Converged at iteration 29, L1 8.33215e-05, Linf 0.00395948, total time[s] 0.212759 +Converged at iteration 30, L1 6.583e-05, Linf 0.0021815, total time[s] 0.080496 +Converged at iteration 28, L1 9.56919e-05, Linf 0.00250285, total time[s] 0.072933 +Converged at iteration 33, L1 5.85057e-05, Linf 0.00598359, total time[s] 0.086193 +Converged at iteration 27, L1 6.24068e-05, Linf 0.00321199, total time[s] 0.091327 +Converged at iteration 25, L1 8.51477e-05, Linf 0.00222401, total time[s] 0.197641 +Converged at iteration 23, L1 8.64742e-05, Linf 0.00355841, total time[s] 0.09566 +Converged at iteration 39, L1 6.79628e-05, Linf 0.00690459, total time[s] 0.175551 +Converged at iteration 36, L1 6.90295e-05, Linf 0.00579723, total time[s] 0.103461 +Converged at iteration 24, L1 9.40572e-05, Linf 0.0029198, total time[s] 0.099204 +Converged at iteration 30, L1 9.91407e-05, Linf 0.00615641, total time[s] 0.079713 +Converged at iteration 25, L1 7.54347e-05, Linf 0.00549253, total time[s] 0.083827 +Converged at iteration 21, L1 6.67582e-05, Linf 0.00396198, total time[s] 0.117055 +Converged at iteration 19, L1 7.2779e-05, Linf 0.00476379, total time[s] 0.111746 +Converged at iteration 21, L1 4.01182e-05, Linf 0.00388029, total time[s] 0.090493 +Converged at iteration 24, L1 6.48282e-05, Linf 0.00322877, total time[s] 0.09104 +Converged at iteration 24, L1 7.68965e-05, Linf 0.00472851, total time[s] 0.100857 +Converged at iteration 20, L1 5.82113e-05, Linf 0.00535013, total time[s] 0.107032 +Converged at iteration 17, L1 5.73301e-05, Linf 0.00222411, total time[s] 0.064464 +Converged at iteration 32, L1 6.16358e-05, Linf 0.00271624, total time[s] 0.156991 +Converged at iteration 19, L1 9.88158e-05, Linf 0.00680058, total time[s] 0.093795 +Converged at iteration 23, L1 7.89134e-05, Linf 0.00648596, total time[s] 0.102354 +Converged at iteration 27, L1 5.79346e-05, Linf 0.00340126, total time[s] 0.08711 +Converged at iteration 23, L1 7.10812e-05, Linf 0.00553208, total time[s] 0.063622 +Converged at iteration 20, L1 9.51705e-05, Linf 0.00503325, total time[s] 0.05342 +Converged at iteration 23, L1 7.63872e-05, Linf 0.00350597, total time[s] 0.077722 +Converged at iteration 25, L1 8.83093e-05, Linf 0.00408532, total time[s] 0.10403 +Converged at iteration 28, L1 7.80295e-05, Linf 0.00391868, total time[s] 0.074681 +Converged at iteration 30, L1 5.78318e-05, Linf 0.00445766, total time[s] 0.084997 +Converged at iteration 28, L1 6.98641e-05, Linf 0.00284178, total time[s] 0.081887 +Converged at iteration 29, L1 8.39854e-05, Linf 0.00402468, total time[s] 0.080547 +Converged at iteration 30, L1 6.50303e-05, Linf 0.00217468, total time[s] 0.082075 +Converged at iteration 28, L1 9.14026e-05, Linf 0.00241702, total time[s] 0.079278 +Converged at iteration 33, L1 5.72059e-05, Linf 0.00614729, total time[s] 0.081017 +Converged at iteration 26, L1 9.992e-05, Linf 0.00364074, total time[s] 0.066621 +Converged at iteration 25, L1 8.72507e-05, Linf 0.00231447, total time[s] 0.066684 +Converged at iteration 23, L1 8.35643e-05, Linf 0.00341911, total time[s] 0.064476 +Converged at iteration 39, L1 6.94503e-05, Linf 0.00684384, total time[s] 0.097084 +Converged at iteration 36, L1 6.98039e-05, Linf 0.00570621, total time[s] 0.120885 +Converged at iteration 24, L1 9.54288e-05, Linf 0.00299037, total time[s] 0.084777 +Converged at iteration 30, L1 9.948e-05, Linf 0.00614827, total time[s] 0.088876 +Converged at iteration 25, L1 7.7375e-05, Linf 0.00553982, total time[s] 0.077173 +Converged at iteration 21, L1 6.3662e-05, Linf 0.00388504, total time[s] 0.064882 +Converged at iteration 19, L1 7.3637e-05, Linf 0.00467887, total time[s] 0.059925 +Converged at iteration 21, L1 4.07637e-05, Linf 0.00400599, total time[s] 0.096529 +Converged at iteration 24, L1 6.72791e-05, Linf 0.00388413, total time[s] 0.076971 +Converged at iteration 24, L1 7.58852e-05, Linf 0.00477845, total time[s] 0.097003 +Converged at iteration 20, L1 5.93376e-05, Linf 0.00533015, total time[s] 0.077367 +Converged at iteration 17, L1 5.78163e-05, Linf 0.00227962, total time[s] 0.050131 +Converged at iteration 32, L1 6.19353e-05, Linf 0.00256964, total time[s] 0.093882 +Converged at iteration 19, L1 9.89741e-05, Linf 0.00686912, total time[s] 0.057548 +Converged at iteration 23, L1 7.95746e-05, Linf 0.00693836, total time[s] 0.071986 +Converged at iteration 27, L1 5.83941e-05, Linf 0.00343819, total time[s] 0.083686 +Converged at iteration 23, L1 7.07684e-05, Linf 0.00560366, total time[s] 0.064263 +Converged at iteration 20, L1 9.60412e-05, Linf 0.00503575, total time[s] 0.073632 +Converged at iteration 23, L1 7.53346e-05, Linf 0.0029417, total time[s] 0.065268 +Converged at iteration 25, L1 8.8602e-05, Linf 0.00412873, total time[s] 0.074962 +Converged at iteration 28, L1 7.71035e-05, Linf 0.00377322, total time[s] 0.072262 +Converged at iteration 30, L1 5.7698e-05, Linf 0.00448135, total time[s] 0.08244 +Converged at iteration 28, L1 6.95382e-05, Linf 0.00285576, total time[s] 0.070764 +Converged at iteration 29, L1 8.37592e-05, Linf 0.00399583, total time[s] 0.072958 +Converged at iteration 30, L1 6.45173e-05, Linf 0.0021771, total time[s] 0.075304 +Converged at iteration 28, L1 9.32301e-05, Linf 0.00246354, total time[s] 0.070035 +Converged at iteration 33, L1 5.76712e-05, Linf 0.00601842, total time[s] 0.081999 +Converged at iteration 27, L1 6.05063e-05, Linf 0.00316712, total time[s] 0.068127 +Converged at iteration 25, L1 8.5933e-05, Linf 0.00226953, total time[s] 0.065578 +Converged at iteration 23, L1 8.47427e-05, Linf 0.00348044, total time[s] 0.068125 +Converged at iteration 39, L1 6.75807e-05, Linf 0.00694167, total time[s] 0.105487 +Converged at iteration 36, L1 6.87682e-05, Linf 0.00584973, total time[s] 0.088492 +Converged at iteration 24, L1 9.34179e-05, Linf 0.00289896, total time[s] 0.060902 +Converged at iteration 30, L1 9.85192e-05, Linf 0.00615011, total time[s] 0.076387 +Converged at iteration 25, L1 7.42045e-05, Linf 0.00546401, total time[s] 0.062984 +Converged at iteration 21, L1 6.66265e-05, Linf 0.00400774, total time[s] 0.054086 +Converged at iteration 19, L1 7.2192e-05, Linf 0.00481598, total time[s] 0.0502 +Converged at iteration 21, L1 3.96829e-05, Linf 0.00379987, total time[s] 0.112597 +Converged at iteration 24, L1 6.27565e-05, Linf 0.00315536, total time[s] 0.112588 +Converged at iteration 24, L1 7.35194e-05, Linf 0.0047381, total time[s] 0.089744 +Converged at iteration 20, L1 5.77576e-05, Linf 0.00533121, total time[s] 0.112792 +Converged at iteration 17, L1 5.70316e-05, Linf 0.00219075, total time[s] 0.089437 +Converged at iteration 32, L1 6.07798e-05, Linf 0.00263035, total time[s] 0.084496 +Converged at iteration 19, L1 9.87592e-05, Linf 0.00675506, total time[s] 0.05019 +Converged at iteration 23, L1 7.85002e-05, Linf 0.00685896, total time[s] 0.060517 +Converged at iteration 27, L1 5.75827e-05, Linf 0.00329859, total time[s] 0.08659 +Converged at iteration 23, L1 7.133e-05, Linf 0.005461, total time[s] 0.060087 +Converged at iteration 20, L1 9.47695e-05, Linf 0.00505412, total time[s] 0.051884 +Converged at iteration 23, L1 7.58258e-05, Linf 0.00291961, total time[s] 0.060173 +Converged at iteration 25, L1 8.80638e-05, Linf 0.00380094, total time[s] 0.065212 +Converged at iteration 28, L1 7.55607e-05, Linf 0.00388272, total time[s] 0.073905 +Converged at iteration 30, L1 5.78969e-05, Linf 0.00449232, total time[s] 0.078802 +Converged at iteration 28, L1 7.00715e-05, Linf 0.00285848, total time[s] 0.070419 +Converged at iteration 29, L1 8.42461e-05, Linf 0.00405444, total time[s] 0.073301 +Converged at iteration 30, L1 6.36806e-05, Linf 0.00217266, total time[s] 0.077262 +Converged at iteration 28, L1 8.98565e-05, Linf 0.00238323, total time[s] 0.070911 +Converged at iteration 33, L1 5.65687e-05, Linf 0.00607388, total time[s] 0.082235 +Converged at iteration 26, L1 9.85028e-05, Linf 0.00361151, total time[s] 0.066564 +Converged at iteration 25, L1 8.74708e-05, Linf 0.00233995, total time[s] 0.065182 +Converged at iteration 23, L1 8.25729e-05, Linf 0.00332612, total time[s] 0.059387 +Converged at iteration 39, L1 6.47897e-05, Linf 0.00709571, total time[s] 0.100688 +Converged at iteration 36, L1 6.742e-05, Linf 0.00609027, total time[s] 0.090371 +Converged at iteration 24, L1 9.10549e-05, Linf 0.00264763, total time[s] 0.061564 +Converged at iteration 30, L1 9.71965e-05, Linf 0.00616169, total time[s] 0.07578 +Converged at iteration 25, L1 6.96299e-05, Linf 0.00534191, total time[s] 0.063403 +Converged at iteration 21, L1 7.12762e-05, Linf 0.00421311, total time[s] 0.054434 +Converged at iteration 19, L1 7.03058e-05, Linf 0.00504218, total time[s] 0.053549 +Converged at iteration 21, L1 3.84088e-05, Linf 0.00331922, total time[s] 0.055514 +Converged at iteration 24, L1 5.68576e-05, Linf 0.00302671, total time[s] 0.063336 +Converged at iteration 24, L1 6.91086e-05, Linf 0.00467043, total time[s] 0.065215 +Converged at iteration 20, L1 5.54317e-05, Linf 0.0052484, total time[s] 0.057548 +Converged at iteration 17, L1 5.61596e-05, Linf 0.0020933, total time[s] 0.045581 +Converged at iteration 32, L1 5.93639e-05, Linf 0.00269274, total time[s] 0.081852 +Converged at iteration 19, L1 9.85759e-05, Linf 0.00661797, total time[s] 0.049965 +Converged at iteration 23, L1 7.69637e-05, Linf 0.00699701, total time[s] 0.058164 +Converged at iteration 26, L1 9.72202e-05, Linf 0.00517816, total time[s] 0.067538 +Converged at iteration 23, L1 7.24996e-05, Linf 0.00527106, total time[s] 0.058743 +Converged at iteration 20, L1 9.31605e-05, Linf 0.00489805, total time[s] 0.051657 +Converged at iteration 23, L1 7.61502e-05, Linf 0.00290238, total time[s] 0.059682 +Converged at iteration 25, L1 8.72827e-05, Linf 0.00368449, total time[s] 0.06413 +Converged at iteration 28, L1 7.31396e-05, Linf 0.00346471, total time[s] 0.082816 +Converged at iteration 30, L1 5.84087e-05, Linf 0.00458006, total time[s] 0.077367 +Converged at iteration 28, L1 7.12336e-05, Linf 0.00274447, total time[s] 0.082467 +Converged at iteration 29, L1 8.53336e-05, Linf 0.00414048, total time[s] 0.092676 +Converged at iteration 30, L1 6.26953e-05, Linf 0.00215517, total time[s] 0.089746 +Converged at iteration 28, L1 8.5734e-05, Linf 0.00222006, total time[s] 0.071876 +Converged at iteration 32, L1 9.8263e-05, Linf 0.00728511, total time[s] 0.080251 +Converged at iteration 26, L1 9.45331e-05, Linf 0.00347671, total time[s] 0.066314 +Converged at iteration 25, L1 8.93023e-05, Linf 0.00244867, total time[s] 0.063205 +Converged at iteration 23, L1 8.01116e-05, Linf 0.00322011, total time[s] 0.05901 +Converged at iteration 39, L1 6.73749e-05, Linf 0.00701803, total time[s] 0.10071 +Converged at iteration 36, L1 6.82813e-05, Linf 0.00605023, total time[s] 0.088751 +Converged at iteration 24, L1 9.21159e-05, Linf 0.00275385, total time[s] 0.062203 +Converged at iteration 30, L1 9.78545e-05, Linf 0.00611874, total time[s] 0.074496 +Converged at iteration 25, L1 7.18918e-05, Linf 0.0054031, total time[s] 0.063123 +Converged at iteration 21, L1 6.95009e-05, Linf 0.00411085, total time[s] 0.053805 +Converged at iteration 19, L1 7.14885e-05, Linf 0.00494326, total time[s] 0.049367 +Converged at iteration 21, L1 3.89085e-05, Linf 0.0035726, total time[s] 0.053704 +Converged at iteration 24, L1 5.96187e-05, Linf 0.00356209, total time[s] 0.06123 +Converged at iteration 24, L1 7.1551e-05, Linf 0.00473531, total time[s] 0.060445 +Converged at iteration 20, L1 5.64039e-05, Linf 0.00529021, total time[s] 0.05213 +Converged at iteration 17, L1 5.65576e-05, Linf 0.00212146, total time[s] 0.046363 +Converged at iteration 32, L1 5.99524e-05, Linf 0.00264396, total time[s] 0.116473 +Converged at iteration 19, L1 9.87092e-05, Linf 0.00667165, total time[s] 0.067556 +Converged at iteration 23, L1 7.74429e-05, Linf 0.00661794, total time[s] 0.066091 +Converged at iteration 26, L1 9.89223e-05, Linf 0.00521336, total time[s] 0.067623 +Converged at iteration 23, L1 7.17692e-05, Linf 0.0053738, total time[s] 0.060094 +Converged at iteration 20, L1 9.38061e-05, Linf 0.00496141, total time[s] 0.092635 +Converged at iteration 23, L1 7.60621e-05, Linf 0.00290517, total time[s] 0.064411 +Converged at iteration 25, L1 8.76056e-05, Linf 0.00376253, total time[s] 0.066954 +Converged at iteration 28, L1 7.51969e-05, Linf 0.0036694, total time[s] 0.073466 +Converged at iteration 30, L1 5.81263e-05, Linf 0.0044674, total time[s] 0.076662 +Converged at iteration 28, L1 7.07248e-05, Linf 0.00279483, total time[s] 0.08083 +Converged at iteration 29, L1 8.45796e-05, Linf 0.00409655, total time[s] 0.078192 +Converged at iteration 30, L1 6.26905e-05, Linf 0.00216543, total time[s] 0.082581 +Converged at iteration 28, L1 8.80159e-05, Linf 0.00229453, total time[s] 0.082774 +Converged at iteration 32, L1 9.9109e-05, Linf 0.0072237, total time[s] 0.088967 +Converged at iteration 26, L1 9.65725e-05, Linf 0.00354297, total time[s] 0.071811 +Converged at iteration 25, L1 8.84947e-05, Linf 0.00239535, total time[s] 0.068867 +Converged at iteration 23, L1 8.10363e-05, Linf 0.00330871, total time[s] 0.063741 +Converged at iteration 39, L1 6.43158e-05, Linf 0.00714487, total time[s] 0.098744 +Converged at iteration 36, L1 6.69393e-05, Linf 0.00616043, total time[s] 0.092612 +Converged at iteration 24, L1 9.08755e-05, Linf 0.00266733, total time[s] 0.066398 +Converged at iteration 30, L1 9.68399e-05, Linf 0.00613579, total time[s] 0.084289 +Converged at iteration 25, L1 6.82458e-05, Linf 0.00530539, total time[s] 0.071879 +Converged at iteration 21, L1 7.34904e-05, Linf 0.00427352, total time[s] 0.085118 +Converged at iteration 19, L1 6.98196e-05, Linf 0.00511282, total time[s] 0.054262 +Converged at iteration 21, L1 3.83086e-05, Linf 0.00324221, total time[s] 0.060307 +Converged at iteration 24, L1 5.53654e-05, Linf 0.00288189, total time[s] 0.070362 +Converged at iteration 24, L1 6.80746e-05, Linf 0.00464894, total time[s] 0.064049 +Converged at iteration 20, L1 5.49122e-05, Linf 0.00522264, total time[s] 0.057617 +Converged at iteration 17, L1 5.59273e-05, Linf 0.00207976, total time[s] 0.046846 +Converged at iteration 32, L1 5.90757e-05, Linf 0.00270843, total time[s] 0.082577 +Converged at iteration 19, L1 9.86006e-05, Linf 0.00658844, total time[s] 0.051188 +Converged at iteration 23, L1 7.66576e-05, Linf 0.00634936, total time[s] 0.061154 +Converged at iteration 26, L1 9.61133e-05, Linf 0.00513548, total time[s] 0.113798 +Converged at iteration 23, L1 7.31271e-05, Linf 0.00521823, total time[s] 0.122749 +Converged at iteration 20, L1 9.27219e-05, Linf 0.0048378, total time[s] 0.090848 +Converged at iteration 23, L1 7.62774e-05, Linf 0.00288859, total time[s] 0.076577 +Converged at iteration 25, L1 8.72633e-05, Linf 0.00364202, total time[s] 0.078601 +Converged at iteration 28, L1 7.24669e-05, Linf 0.0033356, total time[s] 0.092369 +Converged at iteration 30, L1 5.86918e-05, Linf 0.00453148, total time[s] 0.096524 +Converged at iteration 28, L1 7.15384e-05, Linf 0.00269318, total time[s] 0.233614 +Converged at iteration 29, L1 8.51059e-05, Linf 0.00416011, total time[s] 0.0889 +Converged at iteration 30, L1 6.1636e-05, Linf 0.00215192, total time[s] 0.110774 +Converged at iteration 28, L1 8.46455e-05, Linf 0.00216611, total time[s] 0.088296 +Converged at iteration 32, L1 9.77811e-05, Linf 0.00732478, total time[s] 0.103513 +Converged at iteration 26, L1 9.23433e-05, Linf 0.00343619, total time[s] 0.105004 +Converged at iteration 25, L1 8.98003e-05, Linf 0.00247964, total time[s] 0.081841 +Converged at iteration 23, L1 7.89921e-05, Linf 0.00319812, total time[s] 0.084448 +Converged at iteration 39, L1 6.60229e-05, Linf 0.00708148, total time[s] 0.108468 +Converged at iteration 36, L1 6.75583e-05, Linf 0.00606892, total time[s] 0.098489 +Converged at iteration 24, L1 9.12304e-05, Linf 0.00266247, total time[s] 0.065507 +Converged at iteration 30, L1 9.74684e-05, Linf 0.00615912, total time[s] 0.088066 +Converged at iteration 25, L1 7.02058e-05, Linf 0.00535427, total time[s] 0.079937 +Converged at iteration 21, L1 7.12433e-05, Linf 0.00419347, total time[s] 0.071589 +Converged at iteration 19, L1 7.05085e-05, Linf 0.00508602, total time[s] 0.057635 +Converged at iteration 21, L1 3.84801e-05, Linf 0.00333934, total time[s] 0.063094 +Converged at iteration 24, L1 5.73803e-05, Linf 0.0031765, total time[s] 0.098207 +Converged at iteration 24, L1 6.94983e-05, Linf 0.00467706, total time[s] 0.093364 +Converged at iteration 20, L1 5.55294e-05, Linf 0.00525683, total time[s] 0.0655 +Converged at iteration 17, L1 5.62897e-05, Linf 0.00209744, total time[s] 0.069613 +Converged at iteration 32, L1 5.96971e-05, Linf 0.00268725, total time[s] 0.08533 +Converged at iteration 19, L1 9.91754e-05, Linf 0.00661782, total time[s] 0.050995 +Converged at iteration 23, L1 7.69204e-05, Linf 0.00648667, total time[s] 0.063069 +Converged at iteration 26, L1 9.76427e-05, Linf 0.00517595, total time[s] 0.068505 +Converged at iteration 23, L1 7.23257e-05, Linf 0.0052853, total time[s] 0.062938 +Converged at iteration 20, L1 9.32851e-05, Linf 0.00489823, total time[s] 0.058168 +Converged at iteration 23, L1 7.61499e-05, Linf 0.00289576, total time[s] 0.073881 +Converged at iteration 25, L1 8.75951e-05, Linf 0.00385921, total time[s] 0.085186 +Converged at iteration 28, L1 7.35396e-05, Linf 0.00349977, total time[s] 0.096714 +Converged at iteration 30, L1 5.84917e-05, Linf 0.00452722, total time[s] 0.091021 +Converged at iteration 28, L1 7.10659e-05, Linf 0.00275664, total time[s] 0.112497 +Converged at iteration 29, L1 8.56746e-05, Linf 0.00413506, total time[s] 0.095941 +Converged at iteration 30, L1 6.28428e-05, Linf 0.00215783, total time[s] 0.095512 +Converged at iteration 28, L1 8.62636e-05, Linf 0.00223734, total time[s] 0.088116 +Converged at iteration 32, L1 9.84934e-05, Linf 0.00736111, total time[s] 0.093593 +Converged at iteration 26, L1 9.40551e-05, Linf 0.00348862, total time[s] 0.072698 +Converged at iteration 25, L1 8.98111e-05, Linf 0.00243821, total time[s] 0.171219 +Converged at iteration 23, L1 8.04714e-05, Linf 0.003241, total time[s] 0.065581 +Converged at iteration 39, L1 6.48906e-05, Linf 0.00717614, total time[s] 0.110671 +Converged at iteration 36, L1 6.69885e-05, Linf 0.00629824, total time[s] 0.096912 +Converged at iteration 24, L1 9.0792e-05, Linf 0.0026891, total time[s] 0.068406 +Converged at iteration 30, L1 9.71905e-05, Linf 0.0061752, total time[s] 0.115887 +Converged at iteration 25, L1 6.72296e-05, Linf 0.00527581, total time[s] 0.093926 +Converged at iteration 21, L1 7.38156e-05, Linf 0.00432156, total time[s] 0.091569 +Converged at iteration 19, L1 6.94352e-05, Linf 0.00517005, total time[s] 0.066444 +Converged at iteration 21, L1 3.81329e-05, Linf 0.00317215, total time[s] 0.0727 +Converged at iteration 24, L1 5.43094e-05, Linf 0.00284992, total time[s] 0.112628 +Converged at iteration 24, L1 6.72297e-05, Linf 0.00463153, total time[s] 0.073229 +Converged at iteration 20, L1 5.42501e-05, Linf 0.0052022, total time[s] 0.0551 +Converged at iteration 17, L1 5.56945e-05, Linf 0.00206819, total time[s] 0.086772 +Converged at iteration 32, L1 5.91358e-05, Linf 0.00271927, total time[s] 0.099042 +Converged at iteration 19, L1 9.84196e-05, Linf 0.00655781, total time[s] 0.058254 +Converged at iteration 23, L1 7.65286e-05, Linf 0.0063186, total time[s] 0.104163 +Converged at iteration 26, L1 9.71103e-05, Linf 0.00510525, total time[s] 0.10586 +Converged at iteration 23, L1 7.36949e-05, Linf 0.00517521, total time[s] 0.086996 +Converged at iteration 20, L1 9.24423e-05, Linf 0.0047426, total time[s] 0.096331 +Converged at iteration 23, L1 7.76072e-05, Linf 0.00288211, total time[s] 0.127867 +Converged at iteration 25, L1 8.7062e-05, Linf 0.00361252, total time[s] 0.08203 +Converged at iteration 28, L1 7.20076e-05, Linf 0.00324611, total time[s] 0.136547 +Converged at iteration 30, L1 5.89313e-05, Linf 0.00450659, total time[s] 0.121264 +Converged at iteration 28, L1 7.16261e-05, Linf 0.0026436, total time[s] 0.117354 +Converged at iteration 29, L1 8.5338e-05, Linf 0.00417072, total time[s] 0.12368 +Converged at iteration 30, L1 6.16039e-05, Linf 0.00215071, total time[s] 0.10554 +Converged at iteration 28, L1 8.41322e-05, Linf 0.00211812, total time[s] 0.125598 +Converged at iteration 32, L1 9.74279e-05, Linf 0.00726955, total time[s] 0.09624 +Converged at iteration 26, L1 9.21895e-05, Linf 0.00340116, total time[s] 0.109598 +Converged at iteration 25, L1 9.06172e-05, Linf 0.00250464, total time[s] 0.099523 +Converged at iteration 23, L1 7.84365e-05, Linf 0.00317974, total time[s] 0.076635 +Converged at iteration 39, L1 6.12131e-05, Linf 0.00744489, total time[s] 0.110929 +Converged at iteration 36, L1 6.61335e-05, Linf 0.00645263, total time[s] 0.101692 +Converged at iteration 24, L1 8.98921e-05, Linf 0.00279155, total time[s] 0.075535 +Converged at iteration 30, L1 9.57102e-05, Linf 0.00620252, total time[s] 0.091852 +Converged at iteration 25, L1 6.313e-05, Linf 0.00515225, total time[s] 0.097323 +Converged at iteration 21, L1 7.88263e-05, Linf 0.0045184, total time[s] 0.080327 +Converged at iteration 19, L1 6.81099e-05, Linf 0.00536894, total time[s] 0.064274 +Converged at iteration 21, L1 3.77566e-05, Linf 0.00311642, total time[s] 0.085632 +Converged at iteration 24, L1 5.06537e-05, Linf 0.00269217, total time[s] 0.1241 +Converged at iteration 24, L1 6.32929e-05, Linf 0.00458395, total time[s] 0.076625 +Converged at iteration 20, L1 5.25549e-05, Linf 0.00512663, total time[s] 0.057934 +Converged at iteration 17, L1 5.49753e-05, Linf 0.00200939, total time[s] 0.053728 +Converged at iteration 32, L1 5.78509e-05, Linf 0.0027269, total time[s] 0.114183 +Converged at iteration 19, L1 9.81274e-05, Linf 0.00648299, total time[s] 0.063669 +Converged at iteration 23, L1 7.46e-05, Linf 0.00590179, total time[s] 0.081066 +Converged at iteration 26, L1 9.57408e-05, Linf 0.00497341, total time[s] 0.088186 +Converged at iteration 23, L1 7.62085e-05, Linf 0.00495703, total time[s] 0.073644 +Converged at iteration 20, L1 9.15189e-05, Linf 0.00447916, total time[s] 0.069513 +Converged at iteration 23, L1 7.70285e-05, Linf 0.00287377, total time[s] 0.062945 +Converged at iteration 25, L1 8.62744e-05, Linf 0.00351201, total time[s] 0.065526 +Converged at iteration 28, L1 6.9267e-05, Linf 0.00315071, total time[s] 0.074451 +Converged at iteration 30, L1 5.97886e-05, Linf 0.00439822, total time[s] 0.078176 +Converged at iteration 28, L1 7.28857e-05, Linf 0.00251035, total time[s] 0.072911 +Converged at iteration 29, L1 8.69182e-05, Linf 0.00424128, total time[s] 0.076378 +Converged at iteration 30, L1 6.02086e-05, Linf 0.00214143, total time[s] 0.080913 +Converged at iteration 28, L1 8.26359e-05, Linf 0.00190565, total time[s] 0.074365 +Converged at iteration 32, L1 9.59255e-05, Linf 0.00758839, total time[s] 0.085017 +Converged at iteration 26, L1 8.60892e-05, Linf 0.00325606, total time[s] 0.095301 +Converged at iteration 25, L1 9.23167e-05, Linf 0.00260384, total time[s] 0.083592 +Converged at iteration 23, L1 7.67076e-05, Linf 0.00303544, total time[s] 0.071212 +Converged at iteration 39, L1 6.1925e-05, Linf 0.00725504, total time[s] 0.116707 +Converged at iteration 36, L1 6.58192e-05, Linf 0.0063349, total time[s] 0.094016 +Converged at iteration 24, L1 9.02288e-05, Linf 0.00273591, total time[s] 0.064861 +Converged at iteration 30, L1 9.65783e-05, Linf 0.00618711, total time[s] 0.079946 +Converged at iteration 25, L1 6.50564e-05, Linf 0.00515012, total time[s] 0.07216 +Converged at iteration 21, L1 7.6771e-05, Linf 0.0044214, total time[s] 0.08607 +Converged at iteration 19, L1 6.8739e-05, Linf 0.00529404, total time[s] 0.076384 +Converged at iteration 21, L1 3.78621e-05, Linf 0.00306951, total time[s] 0.060208 +Converged at iteration 24, L1 5.23525e-05, Linf 0.00309115, total time[s] 0.092042 +Converged at iteration 24, L1 6.4776e-05, Linf 0.00459253, total time[s] 0.090011 +Converged at iteration 20, L1 5.3326e-05, Linf 0.00510307, total time[s] 0.088078 +Converged at iteration 17, L1 5.52956e-05, Linf 0.00204089, total time[s] 0.114081 +Converged at iteration 32, L1 5.83683e-05, Linf 0.00273663, total time[s] 0.134188 +Converged at iteration 19, L1 9.82211e-05, Linf 0.00652023, total time[s] 0.311685 +Converged at iteration 23, L1 7.51283e-05, Linf 0.00608813, total time[s] 0.188314 +Converged at iteration 26, L1 9.5854e-05, Linf 0.00503721, total time[s] 0.136331 +Converged at iteration 23, L1 7.55476e-05, Linf 0.00509874, total time[s] 0.071567 +Converged at iteration 20, L1 9.18327e-05, Linf 0.00462887, total time[s] 0.056506 +Converged at iteration 23, L1 7.67227e-05, Linf 0.0028853, total time[s] 0.078156 +Converged at iteration 25, L1 8.69285e-05, Linf 0.00364821, total time[s] 0.075164 +Converged at iteration 28, L1 7.05506e-05, Linf 0.00319218, total time[s] 0.086938 +Converged at iteration 30, L1 5.94433e-05, Linf 0.00446596, total time[s] 0.083794 +Converged at iteration 28, L1 7.2209e-05, Linf 0.00245727, total time[s] 0.078511 +Converged at iteration 29, L1 8.60582e-05, Linf 0.00419893, total time[s] 0.090588 +Converged at iteration 30, L1 6.0797e-05, Linf 0.00214795, total time[s] 0.088138 +Converged at iteration 28, L1 8.31478e-05, Linf 0.00200843, total time[s] 0.09601 +Converged at iteration 32, L1 9.66716e-05, Linf 0.00751749, total time[s] 0.101588 +Converged at iteration 26, L1 8.83389e-05, Linf 0.00333089, total time[s] 0.078641 +Converged at iteration 25, L1 9.0908e-05, Linf 0.00255547, total time[s] 0.065983 +Converged at iteration 23, L1 7.72734e-05, Linf 0.00312342, total time[s] 0.061324 +Converged at iteration 39, L1 5.96856e-05, Linf 0.00729773, total time[s] 0.126407 +Converged at iteration 36, L1 6.57477e-05, Linf 0.00651953, total time[s] 0.10594 +Converged at iteration 24, L1 8.96509e-05, Linf 0.00282432, total time[s] 0.066036 +Converged at iteration 30, L1 9.52299e-05, Linf 0.00619615, total time[s] 0.089154 +Converged at iteration 25, L1 6.18277e-05, Linf 0.0051128, total time[s] 0.079758 +Converged at iteration 21, L1 7.90742e-05, Linf 0.00457675, total time[s] 0.089509 +Converged at iteration 19, L1 6.77357e-05, Linf 0.00549927, total time[s] 0.056982 +Converged at iteration 21, L1 3.77621e-05, Linf 0.00313001, total time[s] 0.093031 +Converged at iteration 23, L1 9.90453e-05, Linf 0.00408337, total time[s] 0.076358 +Converged at iteration 24, L1 6.19777e-05, Linf 0.00453042, total time[s] 0.078917 +Converged at iteration 20, L1 5.18805e-05, Linf 0.00508406, total time[s] 0.053961 +Converged at iteration 17, L1 5.48362e-05, Linf 0.00198819, total time[s] 0.048449 +Converged at iteration 32, L1 5.75974e-05, Linf 0.0027522, total time[s] 0.092054 +Converged at iteration 19, L1 9.80959e-05, Linf 0.00646618, total time[s] 0.052314 +Converged at iteration 23, L1 7.42988e-05, Linf 0.00579304, total time[s] 0.065037 +Converged at iteration 26, L1 9.38104e-05, Linf 0.00495534, total time[s] 0.092717 +Converged at iteration 23, L1 7.6832e-05, Linf 0.00489071, total time[s] 0.06513 +Converged at iteration 20, L1 9.14267e-05, Linf 0.00436883, total time[s] 0.052855 +Converged at iteration 23, L1 7.68314e-05, Linf 0.00292998, total time[s] 0.067925 +Converged at iteration 25, L1 8.59588e-05, Linf 0.00360117, total time[s] 0.065385 +Converged at iteration 28, L1 6.85827e-05, Linf 0.00313685, total time[s] 0.077063 +Converged at iteration 30, L1 6.00897e-05, Linf 0.00433205, total time[s] 0.078595 +Converged at iteration 28, L1 7.33918e-05, Linf 0.00256721, total time[s] 0.073277 +Converged at iteration 29, L1 8.72965e-05, Linf 0.00422238, total time[s] 0.075885 +Converged at iteration 30, L1 5.98836e-05, Linf 0.00213399, total time[s] 0.08212 +Converged at iteration 28, L1 8.25554e-05, Linf 0.00187237, total time[s] 0.073837 +Converged at iteration 32, L1 9.59247e-05, Linf 0.0076314, total time[s] 0.085142 +Converged at iteration 26, L1 8.63808e-05, Linf 0.00321025, total time[s] 0.068641 +Converged at iteration 25, L1 9.25652e-05, Linf 0.00263233, total time[s] 0.066053 +Converged at iteration 23, L1 7.61078e-05, Linf 0.00300591, total time[s] 0.062722 +Converged at iteration 39, L1 6.17795e-05, Linf 0.00731914, total time[s] 0.099498 +Converged at iteration 36, L1 6.5657e-05, Linf 0.00643433, total time[s] 0.126069 +Converged at iteration 24, L1 9.01552e-05, Linf 0.00277668, total time[s] 0.064799 +Converged at iteration 30, L1 9.61395e-05, Linf 0.00619456, total time[s] 0.077791 +Converged at iteration 25, L1 6.33978e-05, Linf 0.00516286, total time[s] 0.066359 +Converged at iteration 21, L1 7.75466e-05, Linf 0.00449975, total time[s] 0.056715 +Converged at iteration 19, L1 6.81499e-05, Linf 0.0053957, total time[s] 0.051566 +Converged at iteration 21, L1 3.78317e-05, Linf 0.0031098, total time[s] 0.056999 +Converged at iteration 24, L1 5.09172e-05, Linf 0.00270906, total time[s] 0.065032 +Converged at iteration 24, L1 6.38086e-05, Linf 0.00456235, total time[s] 0.064735 +Converged at iteration 20, L1 5.27497e-05, Linf 0.00512105, total time[s] 0.055561 +Converged at iteration 17, L1 5.50874e-05, Linf 0.00201638, total time[s] 0.046666 +Converged at iteration 32, L1 5.80612e-05, Linf 0.00274598, total time[s] 0.082973 +Converged at iteration 19, L1 9.82994e-05, Linf 0.00669765, total time[s] 0.052149 +Converged at iteration 23, L1 7.51857e-05, Linf 0.00630544, total time[s] 0.067145 +Converged at iteration 26, L1 9.48061e-05, Linf 0.00498527, total time[s] 0.071579 +Converged at iteration 23, L1 7.59246e-05, Linf 0.0049789, total time[s] 0.062931 +Converged at iteration 20, L1 9.15926e-05, Linf 0.00447718, total time[s] 0.058198 +Converged at iteration 23, L1 7.66809e-05, Linf 0.00287448, total time[s] 0.069969 +Converged at iteration 25, L1 8.63289e-05, Linf 0.00351958, total time[s] 0.089231 +Converged at iteration 28, L1 6.95197e-05, Linf 0.00315804, total time[s] 0.076497 +Converged at iteration 30, L1 5.97248e-05, Linf 0.00442753, total time[s] 0.128834 +Converged at iteration 28, L1 7.28028e-05, Linf 0.0025012, total time[s] 0.079318 +Converged at iteration 29, L1 8.81906e-05, Linf 0.00417746, total time[s] 0.090943 +Converged at iteration 30, L1 6.15921e-05, Linf 0.00214386, total time[s] 0.097454 +Converged at iteration 28, L1 8.27939e-05, Linf 0.00192635, total time[s] 0.076588 +Converged at iteration 32, L1 9.60632e-05, Linf 0.0075744, total time[s] 0.095899 +Converged at iteration 26, L1 8.65061e-05, Linf 0.00327109, total time[s] 0.112152 +Converged at iteration 25, L1 9.14936e-05, Linf 0.00259222, total time[s] 0.122572 +Converged at iteration 23, L1 7.65239e-05, Linf 0.00303272, total time[s] 0.095477 +Converged at iteration 39, L1 5.90585e-05, Linf 0.00741261, total time[s] 0.13434 +Converged at iteration 36, L1 6.47799e-05, Linf 0.0065731, total time[s] 0.13068 +Converged at iteration 24, L1 8.95555e-05, Linf 0.00285292, total time[s] 0.103492 +Converged at iteration 30, L1 9.48516e-05, Linf 0.0061935, total time[s] 0.12779 +Converged at iteration 25, L1 6.10071e-05, Linf 0.00508271, total time[s] 0.084997 +Converged at iteration 21, L1 8.08704e-05, Linf 0.0046229, total time[s] 0.069637 +Converged at iteration 19, L1 6.75485e-05, Linf 0.00563837, total time[s] 0.063241 +Converged at iteration 21, L1 3.78176e-05, Linf 0.00312676, total time[s] 0.066678 +Converged at iteration 23, L1 9.75814e-05, Linf 0.00416629, total time[s] 0.064493 +Converged at iteration 24, L1 6.08354e-05, Linf 0.00451056, total time[s] 0.077709 +Converged at iteration 20, L1 5.14956e-05, Linf 0.00506163, total time[s] 0.060464 +Converged at iteration 17, L1 5.47108e-05, Linf 0.00196991, total time[s] 0.05792 +Converged at iteration 32, L1 5.74031e-05, Linf 0.00273397, total time[s] 0.105203 +Converged at iteration 19, L1 9.80556e-05, Linf 0.00663593, total time[s] 0.055432 +Converged at iteration 23, L1 7.40805e-05, Linf 0.00570692, total time[s] 0.071486 +Converged at iteration 26, L1 9.37117e-05, Linf 0.00490656, total time[s] 0.088417 +Converged at iteration 23, L1 7.73726e-05, Linf 0.00483606, total time[s] 0.075141 +Converged at iteration 20, L1 9.14919e-05, Linf 0.0043183, total time[s] 0.071443 +Converged at iteration 23, L1 7.72254e-05, Linf 0.00287122, total time[s] 0.071948 +Converged at iteration 25, L1 8.59636e-05, Linf 0.00347668, total time[s] 0.07382 +Converged at iteration 28, L1 6.82137e-05, Linf 0.00311601, total time[s] 0.079507 +Converged at iteration 30, L1 6.04033e-05, Linf 0.00428225, total time[s] 0.079302 +Converged at iteration 28, L1 7.38095e-05, Linf 0.00274674, total time[s] 0.097408 +Converged at iteration 29, L1 8.76822e-05, Linf 0.00430327, total time[s] 0.087801 +Converged at iteration 30, L1 5.96528e-05, Linf 0.0021272, total time[s] 0.141619 +Converged at iteration 28, L1 8.29124e-05, Linf 0.00184931, total time[s] 0.11077 +Converged at iteration 32, L1 9.52764e-05, Linf 0.00777593, total time[s] 0.17441 +Converged at iteration 26, L1 8.3204e-05, Linf 0.00317231, total time[s] 0.100233 +Converged at iteration 25, L1 9.27488e-05, Linf 0.00265502, total time[s] 0.100285 +Converged at iteration 23, L1 7.51299e-05, Linf 0.00297938, total time[s] 0.081156 +Converged at iteration 39, L1 6.09965e-05, Linf 0.00737287, total time[s] 0.128034 +Converged at iteration 36, L1 6.64805e-05, Linf 0.0067471, total time[s] 0.158852 +Converged at iteration 24, L1 8.98623e-05, Linf 0.00281495, total time[s] 0.068916 +Converged at iteration 30, L1 9.52537e-05, Linf 0.0061628, total time[s] 0.088367 +Converged at iteration 25, L1 6.37929e-05, Linf 0.0054298, total time[s] 0.069169 +Converged at iteration 21, L1 7.99627e-05, Linf 0.00456158, total time[s] 0.074253 +Converged at iteration 19, L1 6.78218e-05, Linf 0.0055606, total time[s] 0.061778 +Converged at iteration 21, L1 3.78363e-05, Linf 0.00313052, total time[s] 0.062386 +Converged at iteration 23, L1 9.93718e-05, Linf 0.00409547, total time[s] 0.090966 +Converged at iteration 24, L1 6.21006e-05, Linf 0.00453558, total time[s] 0.071168 +Converged at iteration 20, L1 5.19162e-05, Linf 0.00524165, total time[s] 0.094098 +Converged at iteration 17, L1 5.49194e-05, Linf 0.00199392, total time[s] 0.05595 +Converged at iteration 32, L1 5.76313e-05, Linf 0.00275111, total time[s] 0.100515 +Converged at iteration 19, L1 9.81082e-05, Linf 0.00646272, total time[s] 0.061531 +Converged at iteration 23, L1 7.43889e-05, Linf 0.00582184, total time[s] 0.077255 +Converged at iteration 26, L1 9.39465e-05, Linf 0.00495093, total time[s] 0.073296 +Converged at iteration 23, L1 7.66566e-05, Linf 0.00491165, total time[s] 0.088387 +Converged at iteration 20, L1 9.16049e-05, Linf 0.00441457, total time[s] 0.067912 +Converged at iteration 23, L1 7.70173e-05, Linf 0.00294229, total time[s] 0.059829 +Converged at iteration 25, L1 8.62181e-05, Linf 0.00349694, total time[s] 0.072265 +Converged at iteration 28, L1 6.87777e-05, Linf 0.00313527, total time[s] 0.10867 +Converged at iteration 30, L1 6.00511e-05, Linf 0.00435083, total time[s] 0.079065 +Converged at iteration 28, L1 7.32946e-05, Linf 0.00252731, total time[s] 0.07233 +Converged at iteration 29, L1 8.72317e-05, Linf 0.00426648, total time[s] 0.074841 +Converged at iteration 30, L1 6.00209e-05, Linf 0.0021363, total time[s] 0.078908 +Converged at iteration 28, L1 8.27476e-05, Linf 0.00187974, total time[s] 0.073388 +Converged at iteration 32, L1 9.64136e-05, Linf 0.00753093, total time[s] 0.083156 +Converged at iteration 26, L1 8.63447e-05, Linf 0.0032226, total time[s] 0.07099 +Converged at iteration 25, L1 9.21566e-05, Linf 0.00262515, total time[s] 0.074952 +Converged at iteration 23, L1 7.59477e-05, Linf 0.00301514, total time[s] 0.06343 +Converged at iteration 39, L1 5.87655e-05, Linf 0.00743709, total time[s] 0.105963 +Converged at iteration 36, L1 6.45271e-05, Linf 0.00655204, total time[s] 0.113979 +Converged at iteration 24, L1 8.95205e-05, Linf 0.00287475, total time[s] 0.091385 +Converged at iteration 30, L1 9.4204e-05, Linf 0.00623009, total time[s] 0.097545 +Converged at iteration 25, L1 6.01708e-05, Linf 0.00505882, total time[s] 0.070828 +Converged at iteration 21, L1 8.06822e-05, Linf 0.00465935, total time[s] 0.060793 +Converged at iteration 19, L1 6.73892e-05, Linf 0.00563408, total time[s] 0.054917 +Converged at iteration 21, L1 3.77934e-05, Linf 0.00312006, total time[s] 0.063288 +Converged at iteration 23, L1 9.66616e-05, Linf 0.00435201, total time[s] 0.064943 +Converged at iteration 24, L1 5.9951e-05, Linf 0.00447156, total time[s] 0.091308 +Converged at iteration 20, L1 5.13609e-05, Linf 0.00504359, total time[s] 0.05557 +Converged at iteration 17, L1 5.46778e-05, Linf 0.00195454, total time[s] 0.057106 +Converged at iteration 32, L1 5.71103e-05, Linf 0.00275671, total time[s] 0.095465 +Converged at iteration 19, L1 9.79957e-05, Linf 0.00640242, total time[s] 0.062716 +Converged at iteration 23, L1 7.38133e-05, Linf 0.00563914, total time[s] 0.067495 +Converged at iteration 26, L1 9.35251e-05, Linf 0.0049124, total time[s] 0.076224 +Converged at iteration 23, L1 7.78403e-05, Linf 0.00479603, total time[s] 0.086787 +Converged at iteration 20, L1 9.14904e-05, Linf 0.00426204, total time[s] 0.064844 +Converged at iteration 23, L1 7.78584e-05, Linf 0.00287083, total time[s] 0.11073 +Converged at iteration 25, L1 8.55273e-05, Linf 0.00346646, total time[s] 0.114919 +Converged at iteration 28, L1 6.78417e-05, Linf 0.00310581, total time[s] 0.100352 +Converged at iteration 30, L1 6.06046e-05, Linf 0.00424326, total time[s] 0.144527 +Converged at iteration 28, L1 7.42178e-05, Linf 0.00291054, total time[s] 0.080795 +Converged at iteration 29, L1 8.79306e-05, Linf 0.00432782, total time[s] 0.098585 +Converged at iteration 30, L1 5.9492e-05, Linf 0.00212187, total time[s] 0.090825 +Converged at iteration 28, L1 8.32396e-05, Linf 0.0018319, total time[s] 0.082593 +Converged at iteration 32, L1 9.51316e-05, Linf 0.00769643, total time[s] 0.114098 +Converged at iteration 26, L1 8.28187e-05, Linf 0.0031423, total time[s] 0.124518 +Converged at iteration 25, L1 9.37837e-05, Linf 0.00267317, total time[s] 0.101301 +Converged at iteration 23, L1 7.52114e-05, Linf 0.00297344, total time[s] 0.081227 +Converged at iteration 39, L1 5.61015e-05, Linf 0.00756058, total time[s] 0.158297 +Converged at iteration 36, L1 6.33014e-05, Linf 0.00678736, total time[s] 0.100948 +Converged at iteration 24, L1 8.91692e-05, Linf 0.0029638, total time[s] 0.093819 +Converged at iteration 30, L1 9.33782e-05, Linf 0.00617665, total time[s] 0.094856 +Converged at iteration 25, L1 5.72532e-05, Linf 0.0049573, total time[s] 0.091209 +Converged at iteration 21, L1 8.40323e-05, Linf 0.00481154, total time[s] 0.070566 +Converged at iteration 19, L1 6.69852e-05, Linf 0.00583849, total time[s] 0.062778 +Converged at iteration 21, L1 3.8211e-05, Linf 0.00311469, total time[s] 0.06322 +Converged at iteration 23, L1 9.27544e-05, Linf 0.00394268, total time[s] 0.066498 +Converged at iteration 24, L1 5.62667e-05, Linf 0.0044239, total time[s] 0.066914 +Converged at iteration 20, L1 5.01009e-05, Linf 0.00496508, total time[s] 0.055386 +Converged at iteration 17, L1 5.44917e-05, Linf 0.00188179, total time[s] 0.04893 +Converged at iteration 32, L1 5.65226e-05, Linf 0.00276832, total time[s] 0.085732 +Converged at iteration 19, L1 9.76986e-05, Linf 0.00627305, total time[s] 0.057022 +Converged at iteration 23, L1 7.32869e-05, Linf 0.00537519, total time[s] 0.067033 +Converged at iteration 26, L1 9.34965e-05, Linf 0.00486539, total time[s] 0.083999 +Converged at iteration 23, L1 7.90986e-05, Linf 0.00460256, total time[s] 0.064161 +Converged at iteration 20, L1 9.16898e-05, Linf 0.00409208, total time[s] 0.060715 +Converged at iteration 23, L1 7.75367e-05, Linf 0.00287094, total time[s] 0.062825 +Converged at iteration 25, L1 8.47826e-05, Linf 0.00342071, total time[s] 0.074281 +Converged at iteration 27, L1 9.91709e-05, Linf 0.00394053, total time[s] 0.075304 +Converged at iteration 30, L1 6.16368e-05, Linf 0.00415871, total time[s] 0.08445 +Converged at iteration 28, L1 7.61537e-05, Linf 0.00405854, total time[s] 0.075369 +Converged at iteration 29, L1 8.90474e-05, Linf 0.00441319, total time[s] 0.07983 +Converged at iteration 29, L1 9.99022e-05, Linf 0.00275824, total time[s] 0.076685 +Converged at iteration 28, L1 8.581e-05, Linf 0.00176042, total time[s] 0.077428 +Converged at iteration 32, L1 9.38511e-05, Linf 0.00781579, total time[s] 0.096508 +Converged at iteration 26, L1 7.92515e-05, Linf 0.00300991, total time[s] 0.075123 +Converged at iteration 25, L1 9.33668e-05, Linf 0.00274415, total time[s] 0.072348 +Converged at iteration 23, L1 7.34858e-05, Linf 0.00288022, total time[s] 0.073306 +Converged at iteration 39, L1 5.73063e-05, Linf 0.0075018, total time[s] 0.105491 +Converged at iteration 36, L1 6.39214e-05, Linf 0.00679336, total time[s] 0.104086 +Converged at iteration 24, L1 8.93056e-05, Linf 0.00292186, total time[s] 0.069543 +Converged at iteration 30, L1 9.35645e-05, Linf 0.00617931, total time[s] 0.081489 +Converged at iteration 25, L1 5.8645e-05, Linf 0.00500796, total time[s] 0.067149 +Converged at iteration 21, L1 8.21337e-05, Linf 0.00473637, total time[s] 0.064572 +Converged at iteration 19, L1 6.6997e-05, Linf 0.00572578, total time[s] 0.058496 +Converged at iteration 21, L1 3.79023e-05, Linf 0.00308922, total time[s] 0.076881 +Converged at iteration 23, L1 9.45976e-05, Linf 0.00423921, total time[s] 0.070293 +Converged at iteration 24, L1 5.7916e-05, Linf 0.00445838, total time[s] 0.084921 +Converged at iteration 20, L1 5.06673e-05, Linf 0.00500567, total time[s] 0.063128 +Converged at iteration 17, L1 5.47886e-05, Linf 0.00305516, total time[s] 0.067605 +Converged at iteration 32, L1 5.66473e-05, Linf 0.00276155, total time[s] 0.092636 +Converged at iteration 19, L1 9.78315e-05, Linf 0.00631478, total time[s] 0.05381 +Converged at iteration 23, L1 7.37418e-05, Linf 0.00549977, total time[s] 0.067969 +Converged at iteration 26, L1 9.33351e-05, Linf 0.00488779, total time[s] 0.089252 +Converged at iteration 23, L1 7.91347e-05, Linf 0.0047027, total time[s] 0.103548 +Converged at iteration 20, L1 9.22198e-05, Linf 0.00452727, total time[s] 0.065162 +Converged at iteration 23, L1 7.76246e-05, Linf 0.00287053, total time[s] 0.094455 +Converged at iteration 25, L1 8.50431e-05, Linf 0.00344342, total time[s] 0.085202 +Converged at iteration 28, L1 6.66423e-05, Linf 0.00308716, total time[s] 0.120491 +Converged at iteration 30, L1 6.11438e-05, Linf 0.00416434, total time[s] 0.127321 +Converged at iteration 28, L1 7.50969e-05, Linf 0.00323635, total time[s] 0.078063 +Converged at iteration 29, L1 8.84789e-05, Linf 0.00437504, total time[s] 0.103708 +Converged at iteration 29, L1 9.99385e-05, Linf 0.00275181, total time[s] 0.085637 +Converged at iteration 28, L1 8.42703e-05, Linf 0.00179933, total time[s] 0.085286 +Converged at iteration 32, L1 9.43789e-05, Linf 0.00775514, total time[s] 0.11082 +Converged at iteration 26, L1 8.1015e-05, Linf 0.00307649, total time[s] 0.089397 +Converged at iteration 25, L1 9.30101e-05, Linf 0.00270921, total time[s] 0.067159 +Converged at iteration 23, L1 7.41028e-05, Linf 0.00290707, total time[s] 0.062987 +Converged at iteration 39, L1 5.54978e-05, Linf 0.00759646, total time[s] 0.118683 +Converged at iteration 36, L1 6.30246e-05, Linf 0.00683569, total time[s] 0.112618 +Converged at iteration 24, L1 8.91141e-05, Linf 0.00298776, total time[s] 0.077532 +Converged at iteration 30, L1 9.28296e-05, Linf 0.00622, total time[s] 0.102668 +Converged at iteration 25, L1 5.6482e-05, Linf 0.00488005, total time[s] 0.074077 +Converged at iteration 21, L1 8.55661e-05, Linf 0.00485802, total time[s] 0.104705 +Converged at iteration 19, L1 6.65142e-05, Linf 0.00598852, total time[s] 0.078713 +Converged at iteration 21, L1 3.83678e-05, Linf 0.00312722, total time[s] 0.104927 +Converged at iteration 23, L1 9.1696e-05, Linf 0.00391581, total time[s] 0.10691 +Converged at iteration 24, L1 5.52575e-05, Linf 0.00440167, total time[s] 0.072089 +Converged at iteration 20, L1 4.93641e-05, Linf 0.00494111, total time[s] 0.061881 +Converged at iteration 17, L1 5.43792e-05, Linf 0.00185775, total time[s] 0.05586 +Converged at iteration 32, L1 5.58853e-05, Linf 0.00277306, total time[s] 0.099731 +Converged at iteration 19, L1 9.76457e-05, Linf 0.00623307, total time[s] 0.054994 +Converged at iteration 23, L1 7.25354e-05, Linf 0.00528361, total time[s] 0.063839 +Converged at iteration 26, L1 9.36271e-05, Linf 0.00485691, total time[s] 0.06794 +Converged at iteration 23, L1 7.93312e-05, Linf 0.00454977, total time[s] 0.076129 +Converged at iteration 20, L1 9.18766e-05, Linf 0.00404778, total time[s] 0.062967 +Converged at iteration 23, L1 7.76598e-05, Linf 0.00287161, total time[s] 0.06059 +Converged at iteration 25, L1 8.46883e-05, Linf 0.00340805, total time[s] 0.073921 +Converged at iteration 27, L1 9.80754e-05, Linf 0.00389474, total time[s] 0.118877 +Converged at iteration 30, L1 6.21268e-05, Linf 0.00415396, total time[s] 0.088675 +Converged at iteration 28, L1 7.70464e-05, Linf 0.00437423, total time[s] 0.077375 +Converged at iteration 29, L1 8.93686e-05, Linf 0.00443516, total time[s] 0.076705 +Converged at iteration 29, L1 9.97654e-05, Linf 0.00276268, total time[s] 0.077201 +Converged at iteration 28, L1 8.71366e-05, Linf 0.00173333, total time[s] 0.077988 +Converged at iteration 32, L1 9.35676e-05, Linf 0.00785254, total time[s] 0.084868 +Converged at iteration 26, L1 7.82525e-05, Linf 0.00296808, total time[s] 0.070283 +Converged at iteration 25, L1 9.36206e-05, Linf 0.00277256, total time[s] 0.069123 +Converged at iteration 23, L1 7.32906e-05, Linf 0.00286765, total time[s] 0.067368 +Converged at iteration 39, L1 5.64009e-05, Linf 0.00754979, total time[s] 0.1111 +Converged at iteration 36, L1 6.35093e-05, Linf 0.00677048, total time[s] 0.109316 +Converged at iteration 24, L1 8.92249e-05, Linf 0.00295589, total time[s] 0.065646 +Converged at iteration 30, L1 9.53582e-05, Linf 0.0061426, total time[s] 0.088979 +Converged at iteration 25, L1 5.75299e-05, Linf 0.00496759, total time[s] 0.081986 +Converged at iteration 21, L1 8.39957e-05, Linf 0.00479703, total time[s] 0.062168 +Converged at iteration 19, L1 6.67327e-05, Linf 0.00563126, total time[s] 0.086313 +Converged at iteration 21, L1 3.81917e-05, Linf 0.00310491, total time[s] 0.069232 +Converged at iteration 23, L1 9.31068e-05, Linf 0.00395167, total time[s] 0.081853 +Converged at iteration 24, L1 5.6644e-05, Linf 0.00443094, total time[s] 0.089219 +Converged at iteration 20, L1 5.01134e-05, Linf 0.00504304, total time[s] 0.081147 +Converged at iteration 17, L1 5.45174e-05, Linf 0.00188949, total time[s] 0.066669 +Converged at iteration 32, L1 5.67811e-05, Linf 0.00277472, total time[s] 0.116625 +Converged at iteration 19, L1 9.76351e-05, Linf 0.00628723, total time[s] 0.057005 +Converged at iteration 23, L1 7.35528e-05, Linf 0.00538991, total time[s] 0.068048 +Converged at iteration 26, L1 9.35062e-05, Linf 0.00486933, total time[s] 0.070971 +Converged at iteration 23, L1 7.89946e-05, Linf 0.00462592, total time[s] 0.062278 +Converged at iteration 20, L1 9.17162e-05, Linf 0.00410713, total time[s] 0.068561 +Converged at iteration 23, L1 7.75127e-05, Linf 0.00286422, total time[s] 0.062416 +Converged at iteration 25, L1 8.48346e-05, Linf 0.0034262, total time[s] 0.069706 +Converged at iteration 27, L1 9.9242e-05, Linf 0.00396243, total time[s] 0.071158 +Converged at iteration 30, L1 6.16843e-05, Linf 0.0041606, total time[s] 0.089554 +Converged at iteration 28, L1 7.59584e-05, Linf 0.0039136, total time[s] 0.080516 +Converged at iteration 29, L1 9.03166e-05, Linf 0.00439221, total time[s] 0.079454 +Converged at iteration 30, L1 6.05613e-05, Linf 0.00210116, total time[s] 0.081487 +Converged at iteration 28, L1 8.76847e-05, Linf 0.00176897, total time[s] 0.076568 +Converged at iteration 32, L1 9.44944e-05, Linf 0.00780962, total time[s] 0.087057 +Converged at iteration 26, L1 8.1952e-05, Linf 0.00301958, total time[s] 0.068625 +Converged at iteration 25, L1 9.37363e-05, Linf 0.00273875, total time[s] 0.070214 +Converged at iteration 23, L1 7.41633e-05, Linf 0.00287567, total time[s] 0.073153 +Converged at iteration 39, L1 5.61754e-05, Linf 0.00762535, total time[s] 0.163857 +Converged at iteration 36, L1 6.36335e-05, Linf 0.00687161, total time[s] 0.098102 +Converged at iteration 24, L1 8.92684e-05, Linf 0.00300714, total time[s] 0.06471 +Converged at iteration 30, L1 9.3187e-05, Linf 0.00618572, total time[s] 0.090878 +Converged at iteration 25, L1 5.57385e-05, Linf 0.00490326, total time[s] 0.076662 +Converged at iteration 21, L1 8.7529e-05, Linf 0.00489416, total time[s] 0.092278 +Converged at iteration 19, L1 6.66337e-05, Linf 0.00596316, total time[s] 0.052371 +Converged at iteration 21, L1 3.85134e-05, Linf 0.00313058, total time[s] 0.056978 +Converged at iteration 23, L1 9.09261e-05, Linf 0.0038933, total time[s] 0.061069 +Converged at iteration 24, L1 5.46872e-05, Linf 0.00438348, total time[s] 0.079332 +Converged at iteration 20, L1 4.89645e-05, Linf 0.00492177, total time[s] 0.056369 +Converged at iteration 17, L1 5.43411e-05, Linf 0.0018379, total time[s] 0.047655 +Converged at iteration 32, L1 5.62072e-05, Linf 0.00278934, total time[s] 0.083225 +Converged at iteration 19, L1 9.78963e-05, Linf 0.00620253, total time[s] 0.047999 +Converged at iteration 23, L1 7.22429e-05, Linf 0.00535252, total time[s] 0.057376 +Converged at iteration 40, L1 6.76829e-05, Linf 0.00367287, total time[s] 0.106046 +Converged at iteration 35, L1 7.60481e-05, Linf 0.00339721, total time[s] 0.092276 +Converged at iteration 30, L1 9.62346e-05, Linf 0.00432614, total time[s] 0.081134 +Converged at iteration 31, L1 6.19651e-05, Linf 0.00502563, total time[s] 0.079745 +Converged at iteration 27, L1 6.25941e-05, Linf 0.00499544, total time[s] 0.074579 +Converged at iteration 22, L1 8.59539e-05, Linf 0.00448846, total time[s] 0.060299 +Converged at iteration 20, L1 9.6016e-05, Linf 0.00395689, total time[s] 0.053389 +Converged at iteration 24, L1 8.84181e-05, Linf 0.00482797, total time[s] 0.064043 +Converged at iteration 28, L1 7.38758e-05, Linf 0.00445905, total time[s] 0.076158 +Converged at iteration 26, L1 8.11287e-05, Linf 0.00546561, total time[s] 0.069463 +Converged at iteration 22, L1 7.39266e-05, Linf 0.00508739, total time[s] 0.059404 +Converged at iteration 19, L1 6.63324e-05, Linf 0.00393099, total time[s] 0.051787 +Converged at iteration 30, L1 7.98592e-05, Linf 0.00329634, total time[s] 0.078525 +Converged at iteration 20, L1 8.4429e-05, Linf 0.00455021, total time[s] 0.05642 +Converged at iteration 24, L1 7.11264e-05, Linf 0.00463289, total time[s] 0.07072 +Converged at iteration 31, L1 9.02751e-05, Linf 0.00564113, total time[s] 0.110888 +Converged at iteration 27, L1 9.91501e-05, Linf 0.00569839, total time[s] 0.107299 +Converged at iteration 24, L1 8.80478e-05, Linf 0.00465026, total time[s] 0.070825 +Converged at iteration 23, L1 9.2198e-05, Linf 0.00409548, total time[s] 0.073447 +Converged at iteration 26, L1 7.2167e-05, Linf 0.00446014, total time[s] 0.070867 +Converged at iteration 29, L1 7.86743e-05, Linf 0.00479522, total time[s] 0.084984 +Converged at iteration 34, L1 7.09321e-05, Linf 0.0042284, total time[s] 0.085489 +Converged at iteration 30, L1 9.39379e-05, Linf 0.00442595, total time[s] 0.076075 +Converged at iteration 28, L1 9.49892e-05, Linf 0.00310981, total time[s] 0.070733 +Converged at iteration 32, L1 9.39337e-05, Linf 0.00374071, total time[s] 0.084572 +Converged at iteration 37, L1 7.34014e-05, Linf 0.00327801, total time[s] 0.092218 +Converged at iteration 33, L1 8.44767e-05, Linf 0.00469297, total time[s] 0.085685 +Converged at iteration 28, L1 9.65754e-05, Linf 0.00430174, total time[s] 0.07663 +Converged at iteration 24, L1 8.82916e-05, Linf 0.00325071, total time[s] 0.06098 +Converged at iteration 26, L1 8.98488e-05, Linf 0.00383948, total time[s] 0.065146 +Converged at iteration 40, L1 6.69481e-05, Linf 0.00383047, total time[s] 0.099406 +Converged at iteration 35, L1 8.23656e-05, Linf 0.00351906, total time[s] 0.086499 +Converged at iteration 30, L1 9.61754e-05, Linf 0.00422119, total time[s] 0.074773 +Converged at iteration 31, L1 6.20174e-05, Linf 0.0050382, total time[s] 0.080362 +Converged at iteration 27, L1 6.02171e-05, Linf 0.00494126, total time[s] 0.083414 +Converged at iteration 22, L1 7.71114e-05, Linf 0.00430646, total time[s] 0.056777 +Converged at iteration 21, L1 6.29025e-05, Linf 0.00334444, total time[s] 0.056269 +Converged at iteration 24, L1 9.0485e-05, Linf 0.00488737, total time[s] 0.064218 +Converged at iteration 28, L1 7.42181e-05, Linf 0.00444369, total time[s] 0.070428 +Converged at iteration 26, L1 8.0507e-05, Linf 0.00549569, total time[s] 0.06708 +Converged at iteration 22, L1 7.31759e-05, Linf 0.00480527, total time[s] 0.058265 +Converged at iteration 19, L1 5.92071e-05, Linf 0.00361622, total time[s] 0.050648 +Converged at iteration 30, L1 8.85324e-05, Linf 0.00330313, total time[s] 0.075591 +Converged at iteration 20, L1 8.5194e-05, Linf 0.00465249, total time[s] 0.053864 +Converged at iteration 24, L1 7.16161e-05, Linf 0.00468176, total time[s] 0.063249 +Converged at iteration 31, L1 9.33151e-05, Linf 0.00531009, total time[s] 0.080455 +Converged at iteration 27, L1 9.88838e-05, Linf 0.00536007, total time[s] 0.070783 +Converged at iteration 24, L1 8.68325e-05, Linf 0.00451235, total time[s] 0.06335 +Converged at iteration 23, L1 9.25828e-05, Linf 0.00421974, total time[s] 0.061467 +Converged at iteration 26, L1 7.23655e-05, Linf 0.00450537, total time[s] 0.071749 +Converged at iteration 29, L1 7.63645e-05, Linf 0.00485527, total time[s] 0.081101 +Converged at iteration 34, L1 7.85979e-05, Linf 0.00433272, total time[s] 0.096329 +Converged at iteration 31, L1 6.91565e-05, Linf 0.00361695, total time[s] 0.114224 +Converged at iteration 28, L1 9.85051e-05, Linf 0.00321117, total time[s] 0.0731 +Converged at iteration 32, L1 8.5794e-05, Linf 0.00362206, total time[s] 0.087064 +Converged at iteration 36, L1 9.55454e-05, Linf 0.0036931, total time[s] 0.093253 +Converged at iteration 33, L1 8.38957e-05, Linf 0.00473742, total time[s] 0.083557 +Converged at iteration 28, L1 9.33898e-05, Linf 0.00419549, total time[s] 0.071915 +Converged at iteration 24, L1 8.21781e-05, Linf 0.00304608, total time[s] 0.063936 +Converged at iteration 26, L1 8.69596e-05, Linf 0.00389471, total time[s] 0.069119 +Converged at iteration 40, L1 6.75969e-05, Linf 0.00375266, total time[s] 0.101325 +Converged at iteration 35, L1 7.91605e-05, Linf 0.00345684, total time[s] 0.088449 +Converged at iteration 30, L1 9.70543e-05, Linf 0.00426872, total time[s] 0.076695 +Converged at iteration 31, L1 6.20858e-05, Linf 0.0050318, total time[s] 0.080036 +Converged at iteration 27, L1 6.14459e-05, Linf 0.00496954, total time[s] 0.07362 +Converged at iteration 22, L1 8.13766e-05, Linf 0.00439818, total time[s] 0.059643 +Converged at iteration 20, L1 9.8566e-05, Linf 0.0041041, total time[s] 0.053091 +Converged at iteration 24, L1 9.02829e-05, Linf 0.00485367, total time[s] 0.064691 +Converged at iteration 28, L1 7.41574e-05, Linf 0.00446128, total time[s] 0.072733 +Converged at iteration 26, L1 8.09572e-05, Linf 0.00555934, total time[s] 0.070771 +Converged at iteration 22, L1 7.26584e-05, Linf 0.00498787, total time[s] 0.060919 +Converged at iteration 19, L1 6.30662e-05, Linf 0.00378336, total time[s] 0.058098 +Converged at iteration 30, L1 8.38684e-05, Linf 0.0033, total time[s] 0.079002 +Converged at iteration 20, L1 8.47921e-05, Linf 0.00460051, total time[s] 0.055559 +Converged at iteration 24, L1 7.18104e-05, Linf 0.00465576, total time[s] 0.080381 +Converged at iteration 31, L1 9.10581e-05, Linf 0.0055644, total time[s] 0.082077 +Converged at iteration 27, L1 9.94186e-05, Linf 0.00562074, total time[s] 0.071052 +Converged at iteration 24, L1 8.76361e-05, Linf 0.00459838, total time[s] 0.064143 +Converged at iteration 23, L1 9.25101e-05, Linf 0.00415744, total time[s] 0.064345 +Converged at iteration 26, L1 7.20891e-05, Linf 0.00451122, total time[s] 0.084805 +Converged at iteration 29, L1 7.75955e-05, Linf 0.00482879, total time[s] 0.075117 +Converged at iteration 34, L1 7.52622e-05, Linf 0.00428285, total time[s] 0.084852 +Converged at iteration 30, L1 9.75923e-05, Linf 0.00440148, total time[s] 0.078463 +Converged at iteration 28, L1 9.63626e-05, Linf 0.00316014, total time[s] 0.080816 +Converged at iteration 32, L1 8.93374e-05, Linf 0.00368233, total time[s] 0.081217 +Converged at iteration 37, L1 7.09643e-05, Linf 0.00315293, total time[s] 0.093749 +Converged at iteration 33, L1 8.42439e-05, Linf 0.00473832, total time[s] 0.083775 +Converged at iteration 28, L1 9.50592e-05, Linf 0.00424612, total time[s] 0.071052 +Converged at iteration 24, L1 8.45475e-05, Linf 0.00314838, total time[s] 0.064289 +Converged at iteration 26, L1 8.85901e-05, Linf 0.00386784, total time[s] 0.06689 +Converged at iteration 40, L1 6.68772e-05, Linf 0.00384646, total time[s] 0.117358 +Converged at iteration 35, L1 8.30141e-05, Linf 0.00353186, total time[s] 0.109334 +Converged at iteration 30, L1 9.56692e-05, Linf 0.00421245, total time[s] 0.079183 +Converged at iteration 31, L1 6.18171e-05, Linf 0.0050393, total time[s] 0.10396 +Converged at iteration 27, L1 5.98679e-05, Linf 0.00493538, total time[s] 0.071798 +Converged at iteration 22, L1 7.6253e-05, Linf 0.00428829, total time[s] 0.064596 +Converged at iteration 21, L1 6.29546e-05, Linf 0.00336618, total time[s] 0.061981 +Converged at iteration 24, L1 9.02627e-05, Linf 0.00489646, total time[s] 0.074189 +Converged at iteration 28, L1 7.44636e-05, Linf 0.00444127, total time[s] 0.08593 +Converged at iteration 26, L1 8.08297e-05, Linf 0.0053758, total time[s] 0.073866 +Converged at iteration 22, L1 7.2723e-05, Linf 0.00478744, total time[s] 0.063587 +Converged at iteration 19, L1 5.86115e-05, Linf 0.00357621, total time[s] 0.053995 +Converged at iteration 30, L1 8.95174e-05, Linf 0.00330344, total time[s] 0.079715 +Converged at iteration 20, L1 8.51901e-05, Linf 0.00466351, total time[s] 0.059833 +Converged at iteration 24, L1 7.15797e-05, Linf 0.00469055, total time[s] 0.064452 +Converged at iteration 31, L1 9.37558e-05, Linf 0.00526804, total time[s] 0.080705 +Converged at iteration 27, L1 9.87313e-05, Linf 0.00530146, total time[s] 0.07195 +Converged at iteration 24, L1 8.68384e-05, Linf 0.00445821, total time[s] 0.064108 +Converged at iteration 23, L1 9.29749e-05, Linf 0.00423402, total time[s] 0.116827 +Converged at iteration 26, L1 7.18388e-05, Linf 0.00457871, total time[s] 0.074249 +Converged at iteration 29, L1 7.62135e-05, Linf 0.00486051, total time[s] 0.091276 +Converged at iteration 34, L1 7.93011e-05, Linf 0.00432689, total time[s] 0.092909 +Converged at iteration 31, L1 6.9679e-05, Linf 0.00360808, total time[s] 0.096726 +Converged at iteration 28, L1 9.89825e-05, Linf 0.00320418, total time[s] 0.091038 +Converged at iteration 32, L1 8.58502e-05, Linf 0.0036322, total time[s] 0.084224 +Converged at iteration 36, L1 9.47961e-05, Linf 0.0036727, total time[s] 0.089728 +Converged at iteration 33, L1 8.38014e-05, Linf 0.00474962, total time[s] 0.099107 +Converged at iteration 28, L1 9.4016e-05, Linf 0.00419277, total time[s] 0.07633 +Converged at iteration 24, L1 8.1802e-05, Linf 0.00299958, total time[s] 0.061999 +Converged at iteration 26, L1 8.66827e-05, Linf 0.00389915, total time[s] 0.067603 +Converged at iteration 40, L1 6.72115e-05, Linf 0.00400175, total time[s] 0.104993 +Converged at iteration 35, L1 8.83234e-05, Linf 0.00355156, total time[s] 0.09354 +Converged at iteration 30, L1 9.07809e-05, Linf 0.00417236, total time[s] 0.077866 +Converged at iteration 31, L1 6.16845e-05, Linf 0.00504814, total time[s] 0.079415 +Converged at iteration 26, L1 9.7719e-05, Linf 0.00582773, total time[s] 0.067154 +Converged at iteration 22, L1 7.05539e-05, Linf 0.00427988, total time[s] 0.059201 +Converged at iteration 21, L1 6.46461e-05, Linf 0.00352756, total time[s] 0.05743 +Converged at iteration 24, L1 8.92872e-05, Linf 0.0049823, total time[s] 0.068181 +Converged at iteration 28, L1 7.27208e-05, Linf 0.00442593, total time[s] 0.076856 +Converged at iteration 26, L1 8.1014e-05, Linf 0.00530959, total time[s] 0.080176 +Converged at iteration 22, L1 6.94099e-05, Linf 0.00427766, total time[s] 0.06716 +Converged at iteration 19, L1 5.37268e-05, Linf 0.00321999, total time[s] 0.069242 +Converged at iteration 30, L1 9.67957e-05, Linf 0.00330762, total time[s] 0.085338 +Converged at iteration 20, L1 8.398e-05, Linf 0.00474661, total time[s] 0.060481 +Converged at iteration 24, L1 7.10553e-05, Linf 0.00454263, total time[s] 0.066587 +Converged at iteration 31, L1 9.56003e-05, Linf 0.00465896, total time[s] 0.085768 +Converged at iteration 27, L1 9.21985e-05, Linf 0.00448595, total time[s] 0.069759 +Converged at iteration 24, L1 8.49269e-05, Linf 0.00420606, total time[s] 0.061727 +Converged at iteration 23, L1 9.26071e-05, Linf 0.00443341, total time[s] 0.060255 +Converged at iteration 26, L1 7.12595e-05, Linf 0.00469749, total time[s] 0.06642 +Converged at iteration 29, L1 7.50181e-05, Linf 0.00489294, total time[s] 0.073334 +Converged at iteration 34, L1 8.24523e-05, Linf 0.00391379, total time[s] 0.084899 +Converged at iteration 31, L1 7.29468e-05, Linf 0.00347028, total time[s] 0.078043 +Converged at iteration 29, L1 7.09575e-05, Linf 0.0027564, total time[s] 0.073816 +Converged at iteration 32, L1 8.12221e-05, Linf 0.00352447, total time[s] 0.080395 +Converged at iteration 36, L1 8.45801e-05, Linf 0.00354193, total time[s] 0.088821 +Converged at iteration 33, L1 8.29949e-05, Linf 0.00481293, total time[s] 0.083068 +Converged at iteration 28, L1 9.04274e-05, Linf 0.00411702, total time[s] 0.070661 +Converged at iteration 24, L1 7.98846e-05, Linf 0.00285158, total time[s] 0.061768 +Converged at iteration 26, L1 8.32301e-05, Linf 0.00391067, total time[s] 0.06614 +Converged at iteration 40, L1 6.49161e-05, Linf 0.00409059, total time[s] 0.103764 +Converged at iteration 35, L1 9.28433e-05, Linf 0.0037535, total time[s] 0.104295 +Converged at iteration 30, L1 8.79866e-05, Linf 0.00417861, total time[s] 0.076285 +Converged at iteration 31, L1 6.14122e-05, Linf 0.00505736, total time[s] 0.078571 +Converged at iteration 26, L1 9.3791e-05, Linf 0.00572694, total time[s] 0.067047 +Converged at iteration 22, L1 6.31438e-05, Linf 0.00398437, total time[s] 0.059723 +Converged at iteration 21, L1 6.78668e-05, Linf 0.00375828, total time[s] 0.056935 +Converged at iteration 24, L1 8.85432e-05, Linf 0.00508587, total time[s] 0.067327 +Converged at iteration 28, L1 6.97051e-05, Linf 0.0044106, total time[s] 0.081639 +Converged at iteration 26, L1 8.25532e-05, Linf 0.00483348, total time[s] 0.074261 +Converged at iteration 22, L1 6.06015e-05, Linf 0.00368405, total time[s] 0.068643 +Converged at iteration 18, L1 8.65154e-05, Linf 0.00345202, total time[s] 0.049359 +Converged at iteration 31, L1 7.11566e-05, Linf 0.00269215, total time[s] 0.086736 +Converged at iteration 20, L1 8.28448e-05, Linf 0.00485616, total time[s] 0.055424 +Converged at iteration 24, L1 7.02087e-05, Linf 0.00489418, total time[s] 0.065089 +Converged at iteration 31, L1 8.98984e-05, Linf 0.00359262, total time[s] 0.083899 +Converged at iteration 26, L1 9.416e-05, Linf 0.00419735, total time[s] 0.066822 +Converged at iteration 24, L1 7.53112e-05, Linf 0.00368964, total time[s] 0.062607 +Converged at iteration 23, L1 9.30592e-05, Linf 0.00456951, total time[s] 0.060209 +Converged at iteration 26, L1 7.01786e-05, Linf 0.00481542, total time[s] 0.067023 +Converged at iteration 29, L1 7.295e-05, Linf 0.00501419, total time[s] 0.077701 +Converged at iteration 33, L1 9.55636e-05, Linf 0.00347378, total time[s] 0.083869 +Converged at iteration 31, L1 7.82456e-05, Linf 0.00335227, total time[s] 0.078667 +Converged at iteration 29, L1 7.48679e-05, Linf 0.00283578, total time[s] 0.074649 +Converged at iteration 32, L1 7.74094e-05, Linf 0.00340004, total time[s] 0.082456 +Converged at iteration 36, L1 7.51981e-05, Linf 0.00339264, total time[s] 0.090574 +Converged at iteration 33, L1 8.16579e-05, Linf 0.00494219, total time[s] 0.083717 +Converged at iteration 28, L1 8.6935e-05, Linf 0.00404104, total time[s] 0.071709 +Converged at iteration 24, L1 7.866e-05, Linf 0.0026916, total time[s] 0.062353 +Converged at iteration 26, L1 8.23944e-05, Linf 0.0039919, total time[s] 0.068525 +Converged at iteration 39, L1 9.92705e-05, Linf 0.00496425, total time[s] 0.104231 +Converged at iteration 35, L1 9.85159e-05, Linf 0.00392163, total time[s] 0.102024 +Converged at iteration 29, L1 9.4095e-05, Linf 0.00503953, total time[s] 0.074453 +Converged at iteration 31, L1 6.11673e-05, Linf 0.00506346, total time[s] 0.081697 +Converged at iteration 26, L1 8.91065e-05, Linf 0.00566559, total time[s] 0.066513 +Converged at iteration 21, L1 9.25592e-05, Linf 0.00453284, total time[s] 0.0554 +Converged at iteration 21, L1 6.58839e-05, Linf 0.00401266, total time[s] 0.057703 +Converged at iteration 24, L1 7.26883e-05, Linf 0.00524784, total time[s] 0.066576 +Converged at iteration 28, L1 6.47779e-05, Linf 0.00439889, total time[s] 0.087146 +Converged at iteration 26, L1 7.84955e-05, Linf 0.00402455, total time[s] 0.075943 +Converged at iteration 21, L1 7.65904e-05, Linf 0.00431643, total time[s] 0.059453 +Converged at iteration 18, L1 6.74776e-05, Linf 0.00283015, total time[s] 0.065609 +Converged at iteration 31, L1 7.7143e-05, Linf 0.00268851, total time[s] 0.083501 +Converged at iteration 20, L1 8.18181e-05, Linf 0.00500354, total time[s] 0.05982 +Converged at iteration 24, L1 6.84138e-05, Linf 0.00477775, total time[s] 0.061237 +Converged at iteration 30, L1 8.21496e-05, Linf 0.00323306, total time[s] 0.075128 +Converged at iteration 25, L1 7.78228e-05, Linf 0.00445292, total time[s] 0.063459 +Converged at iteration 23, L1 7.40452e-05, Linf 0.00376535, total time[s] 0.061883 +Converged at iteration 23, L1 9.53113e-05, Linf 0.00468245, total time[s] 0.061897 +Converged at iteration 26, L1 6.86375e-05, Linf 0.00493957, total time[s] 0.068736 +Converged at iteration 29, L1 7.07269e-05, Linf 0.00470598, total time[s] 0.076345 +Converged at iteration 32, L1 7.05018e-05, Linf 0.00334352, total time[s] 0.080853 +Converged at iteration 30, L1 9.18179e-05, Linf 0.00335022, total time[s] 0.079995 +Converged at iteration 29, L1 7.87499e-05, Linf 0.00295131, total time[s] 0.072829 +Converged at iteration 32, L1 7.38543e-05, Linf 0.00333351, total time[s] 0.079347 +Converged at iteration 35, L1 7.87873e-05, Linf 0.0038867, total time[s] 0.086651 +Converged at iteration 33, L1 7.96995e-05, Linf 0.00503825, total time[s] 0.082183 +Converged at iteration 28, L1 8.25187e-05, Linf 0.00396069, total time[s] 0.070909 +Converged at iteration 24, L1 7.86982e-05, Linf 0.00246813, total time[s] 0.061409 +Converged at iteration 26, L1 8.03073e-05, Linf 0.00407815, total time[s] 0.066078 +Converged at iteration 39, L1 9.98946e-05, Linf 0.0048685, total time[s] 0.096514 +Converged at iteration 35, L1 9.55941e-05, Linf 0.0038357, total time[s] 0.110669 +Converged at iteration 30, L1 7.75987e-05, Linf 0.00418336, total time[s] 0.080203 +Converged at iteration 31, L1 6.12853e-05, Linf 0.00506095, total time[s] 0.078383 +Converged at iteration 26, L1 9.14471e-05, Linf 0.00569741, total time[s] 0.067139 +Converged at iteration 21, L1 9.72311e-05, Linf 0.0046413, total time[s] 0.058188 +Converged at iteration 21, L1 6.88819e-05, Linf 0.00391133, total time[s] 0.062243 +Converged at iteration 24, L1 8.30306e-05, Linf 0.00517708, total time[s] 0.064619 +Converged at iteration 28, L1 6.81271e-05, Linf 0.00440421, total time[s] 0.093123 +Converged at iteration 26, L1 8.2776e-05, Linf 0.00453119, total time[s] 0.072255 +Converged at iteration 21, L1 9.0331e-05, Linf 0.00434398, total time[s] 0.05907 +Converged at iteration 18, L1 7.67356e-05, Linf 0.00308358, total time[s] 0.049156 +Converged at iteration 31, L1 7.41213e-05, Linf 0.0027051, total time[s] 0.084185 +Converged at iteration 20, L1 8.22944e-05, Linf 0.00492894, total time[s] 0.056014 +Converged at iteration 24, L1 6.92468e-05, Linf 0.00498127, total time[s] 0.066493 +Converged at iteration 31, L1 7.1016e-05, Linf 0.00313286, total time[s] 0.082173 +Converged at iteration 26, L1 6.75831e-05, Linf 0.00380059, total time[s] 0.067539 +Converged at iteration 23, L1 9.18681e-05, Linf 0.00401733, total time[s] 0.061542 +Converged at iteration 23, L1 9.44952e-05, Linf 0.00455325, total time[s] 0.067882 +Converged at iteration 26, L1 6.94422e-05, Linf 0.00491, total time[s] 0.069428 +Converged at iteration 29, L1 7.18137e-05, Linf 0.00491866, total time[s] 0.074673 +Converged at iteration 32, L1 9.68573e-05, Linf 0.00363653, total time[s] 0.090835 +Converged at iteration 31, L1 7.55599e-05, Linf 0.00314408, total time[s] 0.081807 +Converged at iteration 29, L1 7.70928e-05, Linf 0.00289558, total time[s] 0.075031 +Converged at iteration 32, L1 7.54946e-05, Linf 0.0033701, total time[s] 0.081996 +Converged at iteration 35, L1 9.94975e-05, Linf 0.004065, total time[s] 0.087989 +Converged at iteration 33, L1 8.07979e-05, Linf 0.00499232, total time[s] 0.083722 +Converged at iteration 28, L1 8.48853e-05, Linf 0.00404331, total time[s] 0.073346 +Converged at iteration 24, L1 7.83692e-05, Linf 0.00258185, total time[s] 0.063256 +Converged at iteration 26, L1 8.27651e-05, Linf 0.00403687, total time[s] 0.067389 +Converged at iteration 40, L1 6.3922e-05, Linf 0.00422058, total time[s] 0.100677 +Converged at iteration 35, L1 9.86699e-05, Linf 0.00393965, total time[s] 0.095548 +Converged at iteration 29, L1 8.92968e-05, Linf 0.00501492, total time[s] 0.074955 +Converged at iteration 31, L1 6.11358e-05, Linf 0.00506366, total time[s] 0.079606 +Converged at iteration 26, L1 8.86431e-05, Linf 0.00572054, total time[s] 0.068706 +Converged at iteration 21, L1 9.17106e-05, Linf 0.00451548, total time[s] 0.05692 +Converged at iteration 21, L1 6.49674e-05, Linf 0.00402418, total time[s] 0.058156 +Converged at iteration 24, L1 7.01602e-05, Linf 0.00527386, total time[s] 0.069713 +Converged at iteration 28, L1 6.36312e-05, Linf 0.00439615, total time[s] 0.079214 +Converged at iteration 26, L1 7.60502e-05, Linf 0.00397611, total time[s] 0.075149 +Converged at iteration 21, L1 7.42151e-05, Linf 0.00431512, total time[s] 0.05887 +Converged at iteration 18, L1 6.58908e-05, Linf 0.00279404, total time[s] 0.051075 +Converged at iteration 31, L1 7.77829e-05, Linf 0.00269099, total time[s] 0.096412 +Converged at iteration 20, L1 8.15906e-05, Linf 0.00501879, total time[s] 0.055098 +Converged at iteration 24, L1 6.83592e-05, Linf 0.00508877, total time[s] 0.063791 +Converged at iteration 30, L1 7.90854e-05, Linf 0.00316291, total time[s] 0.076953 +Converged at iteration 25, L1 7.44326e-05, Linf 0.00440424, total time[s] 0.06583 +Converged at iteration 23, L1 7.12794e-05, Linf 0.00372469, total time[s] 0.061125 +Converged at iteration 23, L1 9.5561e-05, Linf 0.00460661, total time[s] 0.063117 +Converged at iteration 26, L1 6.84903e-05, Linf 0.00498019, total time[s] 0.068673 +Converged at iteration 29, L1 7.05469e-05, Linf 0.00481887, total time[s] 0.075433 +Converged at iteration 32, L1 6.65057e-05, Linf 0.00326463, total time[s] 0.082361 +Converged at iteration 30, L1 8.87091e-05, Linf 0.00329043, total time[s] 0.077987 +Converged at iteration 29, L1 7.91669e-05, Linf 0.00297885, total time[s] 0.075511 +Converged at iteration 32, L1 7.27483e-05, Linf 0.00330647, total time[s] 0.082132 +Converged at iteration 35, L1 7.40385e-05, Linf 0.00382597, total time[s] 0.089536 +Converged at iteration 33, L1 7.94997e-05, Linf 0.00504804, total time[s] 0.084879 +Converged at iteration 28, L1 8.20141e-05, Linf 0.00394624, total time[s] 0.074425 +Converged at iteration 24, L1 7.89728e-05, Linf 0.00244497, total time[s] 0.063817 +Converged at iteration 26, L1 7.89374e-05, Linf 0.00407691, total time[s] 0.068167 +Converged at iteration 39, L1 9.94036e-05, Linf 0.00512024, total time[s] 0.105964 +Converged at iteration 36, L1 6.89578e-05, Linf 0.00344521, total time[s] 0.100801 +Converged at iteration 28, L1 9.61754e-05, Linf 0.00586836, total time[s] 0.074664 +Converged at iteration 31, L1 6.08777e-05, Linf 0.00506613, total time[s] 0.088559 +Converged at iteration 26, L1 8.52473e-05, Linf 0.00560774, total time[s] 0.06717 +Converged at iteration 21, L1 8.65309e-05, Linf 0.0043447, total time[s] 0.061446 +Converged at iteration 20, L1 9.91095e-05, Linf 0.00533812, total time[s] 0.057786 +Converged at iteration 23, L1 8.95885e-05, Linf 0.00644484, total time[s] 0.06851 +Converged at iteration 27, L1 9.11257e-05, Linf 0.00549147, total time[s] 0.07578 +Converged at iteration 26, L1 6.2787e-05, Linf 0.00350318, total time[s] 0.074034 +Converged at iteration 21, L1 6.10615e-05, Linf 0.00428813, total time[s] 0.064162 +Converged at iteration 18, L1 5.5279e-05, Linf 0.0027492, total time[s] 0.054692 +Converged at iteration 31, L1 8.16955e-05, Linf 0.0027101, total time[s] 0.099797 +Converged at iteration 20, L1 7.83559e-05, Linf 0.00512962, total time[s] 0.054805 +Converged at iteration 24, L1 6.76289e-05, Linf 0.00523806, total time[s] 0.063049 +Converged at iteration 29, L1 8.9001e-05, Linf 0.00334289, total time[s] 0.074769 +Converged at iteration 24, L1 8.97094e-05, Linf 0.00544958, total time[s] 0.062113 +Converged at iteration 22, L1 8.73125e-05, Linf 0.00421963, total time[s] 0.057686 +Converged at iteration 23, L1 9.52924e-05, Linf 0.00460765, total time[s] 0.060635 +Converged at iteration 26, L1 6.73988e-05, Linf 0.00499251, total time[s] 0.066992 +Converged at iteration 29, L1 6.89646e-05, Linf 0.00459965, total time[s] 0.07499 +Converged at iteration 31, L1 7.31948e-05, Linf 0.00373615, total time[s] 0.079735 +Converged at iteration 29, L1 9.96899e-05, Linf 0.00345273, total time[s] 0.075262 +Converged at iteration 29, L1 8.21949e-05, Linf 0.00304171, total time[s] 0.074932 +Converged at iteration 31, L1 9.34232e-05, Linf 0.00381295, total time[s] 0.079912 +Converged at iteration 34, L1 6.99795e-05, Linf 0.004064, total time[s] 0.087119 +Converged at iteration 33, L1 7.80909e-05, Linf 0.00511655, total time[s] 0.084534 +Converged at iteration 28, L1 7.87924e-05, Linf 0.0038836, total time[s] 0.072708 +Converged at iteration 24, L1 8.18568e-05, Linf 0.00228313, total time[s] 0.065926 +Converged at iteration 26, L1 6.65888e-05, Linf 0.00395581, total time[s] 0.067914 +Converged at iteration 39, L1 9.60232e-05, Linf 0.00527944, total time[s] 0.104752 +Converged at iteration 36, L1 7.07027e-05, Linf 0.00361796, total time[s] 0.101583 +Converged at iteration 28, L1 5.61933e-05, Linf 0.00533077, total time[s] 0.086239 +Converged at iteration 31, L1 6.15348e-05, Linf 0.00507067, total time[s] 0.085032 +Converged at iteration 26, L1 8.11214e-05, Linf 0.00553978, total time[s] 0.072869 +Converged at iteration 21, L1 8.05419e-05, Linf 0.00412913, total time[s] 0.08496 +Converged at iteration 20, L1 8.57438e-05, Linf 0.00538823, total time[s] 0.059454 +Converged at iteration 23, L1 6.08167e-05, Linf 0.00636058, total time[s] 0.067187 +Converged at iteration 27, L1 7.37414e-05, Linf 0.00540716, total time[s] 0.076345 +Converged at iteration 25, L1 9.22527e-05, Linf 0.00418002, total time[s] 0.074927 +Converged at iteration 21, L1 5.17622e-05, Linf 0.00420813, total time[s] 0.059569 +Converged at iteration 17, L1 9.62726e-05, Linf 0.00420647, total time[s] 0.04912 +Converged at iteration 31, L1 8.59627e-05, Linf 0.00273296, total time[s] 0.091357 +Converged at iteration 20, L1 7.27807e-05, Linf 0.00526541, total time[s] 0.056373 +Converged at iteration 24, L1 6.57999e-05, Linf 0.00541679, total time[s] 0.063821 +Converged at iteration 29, L1 6.93614e-05, Linf 0.00293723, total time[s] 0.075397 +Converged at iteration 24, L1 7.20696e-05, Linf 0.00535273, total time[s] 0.064573 +Converged at iteration 22, L1 7.11127e-05, Linf 0.00397145, total time[s] 0.058632 +Converged at iteration 23, L1 8.90338e-05, Linf 0.00450639, total time[s] 0.060815 +Converged at iteration 26, L1 6.62591e-05, Linf 0.00485057, total time[s] 0.068461 +Converged at iteration 29, L1 6.70557e-05, Linf 0.00422298, total time[s] 0.074948 +Converged at iteration 30, L1 9.16649e-05, Linf 0.00463485, total time[s] 0.077121 +Converged at iteration 29, L1 7.77229e-05, Linf 0.00314494, total time[s] 0.07459 +Converged at iteration 29, L1 8.56934e-05, Linf 0.00312689, total time[s] 0.075066 +Converged at iteration 31, L1 8.21952e-05, Linf 0.00336537, total time[s] 0.079645 +Converged at iteration 33, L1 6.3455e-05, Linf 0.00385937, total time[s] 0.083991 +Converged at iteration 33, L1 7.61375e-05, Linf 0.00520101, total time[s] 0.084835 +Converged at iteration 28, L1 7.48546e-05, Linf 0.00380507, total time[s] 0.072896 +Converged at iteration 24, L1 8.71806e-05, Linf 0.00208894, total time[s] 0.063439 +Converged at iteration 25, L1 8.46404e-05, Linf 0.00465753, total time[s] 0.066205 +Converged at iteration 39, L1 9.67113e-05, Linf 0.00520157, total time[s] 0.098332 +Converged at iteration 36, L1 6.98507e-05, Linf 0.00352992, total time[s] 0.097617 +Converged at iteration 28, L1 7.47695e-05, Linf 0.00565704, total time[s] 0.074343 +Converged at iteration 31, L1 6.07413e-05, Linf 0.00506812, total time[s] 0.080117 +Converged at iteration 26, L1 8.33213e-05, Linf 0.00557438, total time[s] 0.067606 +Converged at iteration 21, L1 8.3371e-05, Linf 0.00429091, total time[s] 0.056788 +Converged at iteration 20, L1 9.22562e-05, Linf 0.00537652, total time[s] 0.054759 +Converged at iteration 23, L1 7.41786e-05, Linf 0.00640937, total time[s] 0.065857 +Converged at iteration 27, L1 8.23254e-05, Linf 0.00546441, total time[s] 0.080713 +Converged at iteration 25, L1 9.88212e-05, Linf 0.00420691, total time[s] 0.069749 +Converged at iteration 21, L1 5.58178e-05, Linf 0.00423282, total time[s] 0.059033 +Converged at iteration 18, L1 5.09534e-05, Linf 0.00270608, total time[s] 0.058782 +Converged at iteration 31, L1 8.40214e-05, Linf 0.00272182, total time[s] 0.086819 +Converged at iteration 20, L1 7.56024e-05, Linf 0.00519902, total time[s] 0.056274 +Converged at iteration 24, L1 6.6831e-05, Linf 0.00533073, total time[s] 0.066468 +Converged at iteration 29, L1 7.80263e-05, Linf 0.00313417, total time[s] 0.074851 +Converged at iteration 24, L1 7.98086e-05, Linf 0.0053908, total time[s] 0.062954 +Converged at iteration 22, L1 7.79464e-05, Linf 0.00409054, total time[s] 0.059581 +Converged at iteration 23, L1 9.25793e-05, Linf 0.00457549, total time[s] 0.062168 +Converged at iteration 26, L1 6.68281e-05, Linf 0.00494294, total time[s] 0.06844 +Converged at iteration 29, L1 6.80947e-05, Linf 0.00441711, total time[s] 0.074806 +Converged at iteration 31, L1 6.37067e-05, Linf 0.00361451, total time[s] 0.08078 +Converged at iteration 29, L1 8.73478e-05, Linf 0.0032899, total time[s] 0.075262 +Converged at iteration 29, L1 8.41942e-05, Linf 0.00309119, total time[s] 0.079331 +Converged at iteration 31, L1 8.75543e-05, Linf 0.00360952, total time[s] 0.079324 +Converged at iteration 33, L1 8.29331e-05, Linf 0.00457257, total time[s] 0.084051 +Converged at iteration 33, L1 7.70209e-05, Linf 0.00515933, total time[s] 0.084198 +Converged at iteration 28, L1 7.69799e-05, Linf 0.00384509, total time[s] 0.072713 +Converged at iteration 24, L1 8.44424e-05, Linf 0.00220809, total time[s] 0.06432 +Converged at iteration 25, L1 9.34198e-05, Linf 0.00481954, total time[s] 0.06544 +Converged at iteration 39, L1 9.54219e-05, Linf 0.00529846, total time[s] 0.105831 +Converged at iteration 36, L1 7.06502e-05, Linf 0.00363899, total time[s] 0.101832 +Converged at iteration 27, L1 9.78329e-05, Linf 0.00660479, total time[s] 0.070579 +Converged at iteration 31, L1 6.09262e-05, Linf 0.00507105, total time[s] 0.079355 +Converged at iteration 26, L1 8.07207e-05, Linf 0.00553251, total time[s] 0.067769 +Converged at iteration 21, L1 8.02047e-05, Linf 0.0040622, total time[s] 0.058378 +Converged at iteration 20, L1 8.46312e-05, Linf 0.00535137, total time[s] 0.064202 +Converged at iteration 23, L1 5.89837e-05, Linf 0.00628692, total time[s] 0.065525 +Converged at iteration 27, L1 7.2023e-05, Linf 0.00541616, total time[s] 0.075825 +Converged at iteration 25, L1 9.09646e-05, Linf 0.0041744, total time[s] 0.072706 +Converged at iteration 21, L1 5.10228e-05, Linf 0.00420414, total time[s] 0.061964 +Converged at iteration 17, L1 9.52019e-05, Linf 0.00419182, total time[s] 0.0489 +Converged at iteration 31, L1 8.6303e-05, Linf 0.00271399, total time[s] 0.08976 +Converged at iteration 20, L1 7.22495e-05, Linf 0.00527846, total time[s] 0.054583 +Converged at iteration 24, L1 6.55364e-05, Linf 0.00543261, total time[s] 0.065517 +Converged at iteration 29, L1 6.82365e-05, Linf 0.00290541, total time[s] 0.07672 +Converged at iteration 24, L1 7.08412e-05, Linf 0.00534396, total time[s] 0.0643 +Converged at iteration 22, L1 7.00806e-05, Linf 0.00395247, total time[s] 0.057915 +Converged at iteration 23, L1 8.85276e-05, Linf 0.00448228, total time[s] 0.060585 +Converged at iteration 26, L1 6.62703e-05, Linf 0.00481961, total time[s] 0.100872 +Converged at iteration 29, L1 6.68895e-05, Linf 0.00418518, total time[s] 0.085407 +Converged at iteration 30, L1 9.01514e-05, Linf 0.00463118, total time[s] 0.075814 +Converged at iteration 29, L1 7.61304e-05, Linf 0.00312046, total time[s] 0.07289 +Converged at iteration 29, L1 8.62838e-05, Linf 0.00313721, total time[s] 0.073031 +Converged at iteration 31, L1 8.12441e-05, Linf 0.00331592, total time[s] 0.079441 +Converged at iteration 32, L1 9.61032e-05, Linf 0.00497514, total time[s] 0.07972 +Converged at iteration 33, L1 7.59293e-05, Linf 0.00520876, total time[s] 0.08571 +Converged at iteration 28, L1 7.45806e-05, Linf 0.00379688, total time[s] 0.071475 +Converged at iteration 24, L1 8.78764e-05, Linf 0.00205406, total time[s] 0.063807 +Converged at iteration 25, L1 8.28419e-05, Linf 0.00462629, total time[s] 0.065668 +Converged at iteration 39, L1 9.4011e-05, Linf 0.00541404, total time[s] 0.101765 +Converged at iteration 36, L1 7.21295e-05, Linf 0.00376762, total time[s] 0.102015 +Converged at iteration 27, L1 6.74583e-05, Linf 0.00607937, total time[s] 0.074402 +Converged at iteration 31, L1 6.15233e-05, Linf 0.00808296, total time[s] 0.077341 +Converged at iteration 26, L1 7.78173e-05, Linf 0.00547925, total time[s] 0.066129 +Converged at iteration 21, L1 7.6314e-05, Linf 0.00393731, total time[s] 0.058069 +Converged at iteration 20, L1 7.56256e-05, Linf 0.00526402, total time[s] 0.05579 +Converged at iteration 22, L1 8.93546e-05, Linf 0.00771646, total time[s] 0.06142 +Converged at iteration 27, L1 5.98812e-05, Linf 0.00523792, total time[s] 0.076418 +Converged at iteration 25, L1 8.2417e-05, Linf 0.00413491, total time[s] 0.070263 +Converged at iteration 20, L1 9.55866e-05, Linf 0.00557714, total time[s] 0.055628 +Converged at iteration 17, L1 8.8773e-05, Linf 0.00393287, total time[s] 0.046763 +Converged at iteration 31, L1 8.92852e-05, Linf 0.00274854, total time[s] 0.093673 +Converged at iteration 20, L1 6.89648e-05, Linf 0.00536434, total time[s] 0.061734 +Converged at iteration 24, L1 6.4015e-05, Linf 0.00551945, total time[s] 0.062954 +Converged at iteration 28, L1 8.81149e-05, Linf 0.00363631, total time[s] 0.072924 +Converged at iteration 24, L1 6.25026e-05, Linf 0.00529858, total time[s] 0.063319 +Converged at iteration 22, L1 6.3229e-05, Linf 0.00379873, total time[s] 0.057483 +Converged at iteration 23, L1 8.5098e-05, Linf 0.00433577, total time[s] 0.059298 +Converged at iteration 26, L1 6.5238e-05, Linf 0.0044717, total time[s] 0.066513 +Converged at iteration 29, L1 6.56776e-05, Linf 0.00395021, total time[s] 0.077299 +Converged at iteration 30, L1 8.10062e-05, Linf 0.00461407, total time[s] 0.0758 +Converged at iteration 29, L1 6.61385e-05, Linf 0.00294496, total time[s] 0.073928 +Converged at iteration 29, L1 8.88623e-05, Linf 0.00322584, total time[s] 0.07472 +Converged at iteration 31, L1 7.42442e-05, Linf 0.00300405, total time[s] 0.077852 +Converged at iteration 32, L1 6.9111e-05, Linf 0.00386465, total time[s] 0.087194 +Converged at iteration 33, L1 7.45436e-05, Linf 0.00526905, total time[s] 0.082688 +Converged at iteration 28, L1 7.17054e-05, Linf 0.00373237, total time[s] 0.072502 +Converged at iteration 24, L1 9.23963e-05, Linf 0.00192691, total time[s] 0.062044 +Converged at iteration 25, L1 7.22761e-05, Linf 0.0043546, total time[s] 0.065972 +Converged at iteration 39, L1 9.27698e-05, Linf 0.00555157, total time[s] 0.106125 +Converged at iteration 36, L1 7.26416e-05, Linf 0.00393356, total time[s] 0.107193 +Converged at iteration 26, L1 9.00956e-05, Linf 0.00699219, total time[s] 0.077428 +Converged at iteration 31, L1 5.98873e-05, Linf 0.00507608, total time[s] 0.081856 +Converged at iteration 26, L1 7.41021e-05, Linf 0.00541313, total time[s] 0.069134 +Converged at iteration 21, L1 7.1356e-05, Linf 0.00368237, total time[s] 0.063853 +Converged at iteration 20, L1 6.65899e-05, Linf 0.0050596, total time[s] 0.088747 +Converged at iteration 22, L1 6.7432e-05, Linf 0.0073177, total time[s] 0.05938 +Converged at iteration 26, L1 8.54252e-05, Linf 0.00630952, total time[s] 0.074839 +Converged at iteration 25, L1 7.4185e-05, Linf 0.00408697, total time[s] 0.06993 +Converged at iteration 20, L1 8.84638e-05, Linf 0.00554639, total time[s] 0.056555 +Converged at iteration 17, L1 8.24239e-05, Linf 0.00380351, total time[s] 0.048408 +Converged at iteration 31, L1 9.23884e-05, Linf 0.00276126, total time[s] 0.082266 +Converged at iteration 20, L1 6.60947e-05, Linf 0.00543173, total time[s] 0.054246 +Converged at iteration 24, L1 6.19049e-05, Linf 0.00554809, total time[s] 0.065111 +Converged at iteration 28, L1 7.63688e-05, Linf 0.0034254, total time[s] 0.072869 +Converged at iteration 23, L1 9.68957e-05, Linf 0.00687855, total time[s] 0.062334 +Converged at iteration 21, L1 9.39464e-05, Linf 0.00464378, total time[s] 0.056974 +Converged at iteration 23, L1 8.16741e-05, Linf 0.004122, total time[s] 0.061111 +Converged at iteration 26, L1 6.4412e-05, Linf 0.00427108, total time[s] 0.069116 +Converged at iteration 28, L1 9.85998e-05, Linf 0.00579147, total time[s] 0.072839 +Converged at iteration 30, L1 7.4714e-05, Linf 0.00461099, total time[s] 0.078331 +Converged at iteration 28, L1 9.04439e-05, Linf 0.00345894, total time[s] 0.072518 +Converged at iteration 29, L1 8.84882e-05, Linf 0.00331948, total time[s] 0.07547 +Converged at iteration 30, L1 9.80084e-05, Linf 0.00338785, total time[s] 0.077682 +Converged at iteration 31, L1 8.02479e-05, Linf 0.0036251, total time[s] 0.079909 +Converged at iteration 33, L1 7.28515e-05, Linf 0.00534082, total time[s] 0.084944 +Converged at iteration 28, L1 6.82936e-05, Linf 0.00365279, total time[s] 0.073374 +Converged at iteration 24, L1 9.43774e-05, Linf 0.00177811, total time[s] 0.06349 +Converged at iteration 25, L1 6.21712e-05, Linf 0.00387887, total time[s] 0.065972 +Converged at iteration 39, L1 9.28777e-05, Linf 0.00548366, total time[s] 0.09615 +Converged at iteration 36, L1 7.21678e-05, Linf 0.00384982, total time[s] 0.093917 +Converged at iteration 27, L1 5.39943e-05, Linf 0.00562566, total time[s] 0.070716 +Converged at iteration 31, L1 6.00476e-05, Linf 0.00507558, total time[s] 0.080005 +Converged at iteration 26, L1 7.58876e-05, Linf 0.00544561, total time[s] 0.068522 +Converged at iteration 21, L1 7.35382e-05, Linf 0.00383139, total time[s] 0.056866 +Converged at iteration 20, L1 7.08211e-05, Linf 0.00517338, total time[s] 0.054578 +Converged at iteration 22, L1 7.75387e-05, Linf 0.00752098, total time[s] 0.05926 +Converged at iteration 26, L1 9.4586e-05, Linf 0.00645043, total time[s] 0.075545 +Converged at iteration 25, L1 7.79599e-05, Linf 0.00411097, total time[s] 0.07717 +Converged at iteration 20, L1 9.15629e-05, Linf 0.0055674, total time[s] 0.053902 +Converged at iteration 17, L1 8.53605e-05, Linf 0.00392837, total time[s] 0.047564 +Converged at iteration 31, L1 9.07518e-05, Linf 0.00275531, total time[s] 0.080454 +Converged at iteration 20, L1 6.73587e-05, Linf 0.00540427, total time[s] 0.055807 +Converged at iteration 24, L1 6.29684e-05, Linf 0.00554484, total time[s] 0.06313 +Converged at iteration 28, L1 8.16554e-05, Linf 0.00352541, total time[s] 0.073868 +Converged at iteration 24, L1 5.82487e-05, Linf 0.00526565, total time[s] 0.063202 +Converged at iteration 21, L1 9.81899e-05, Linf 0.00469785, total time[s] 0.056037 +Converged at iteration 23, L1 8.32598e-05, Linf 0.00423264, total time[s] 0.061409 +Converged at iteration 26, L1 6.4896e-05, Linf 0.00443976, total time[s] 0.068049 +Converged at iteration 28, L1 9.96774e-05, Linf 0.00588285, total time[s] 0.072677 +Converged at iteration 30, L1 7.74141e-05, Linf 0.00458005, total time[s] 0.078689 +Converged at iteration 28, L1 9.55195e-05, Linf 0.00355771, total time[s] 0.073797 +Converged at iteration 29, L1 8.92482e-05, Linf 0.00327308, total time[s] 0.076988 +Converged at iteration 31, L1 7.02991e-05, Linf 0.00283821, total time[s] 0.079797 +Converged at iteration 31, L1 9.26948e-05, Linf 0.00449402, total time[s] 0.080363 +Converged at iteration 33, L1 7.36813e-05, Linf 0.00530511, total time[s] 0.085218 +Converged at iteration 28, L1 7.01312e-05, Linf 0.00369423, total time[s] 0.073772 +Converged at iteration 24, L1 9.35384e-05, Linf 0.00184033, total time[s] 0.066407 +Converged at iteration 25, L1 6.67641e-05, Linf 0.00413868, total time[s] 0.06624 +Converged at iteration 39, L1 9.15907e-05, Linf 0.00556564, total time[s] 0.099726 +Converged at iteration 36, L1 7.26718e-05, Linf 0.00395095, total time[s] 0.096267 +Converged at iteration 26, L1 8.69947e-05, Linf 0.00691921, total time[s] 0.069628 +Converged at iteration 31, L1 6.0124e-05, Linf 0.00507595, total time[s] 0.079992 +Converged at iteration 26, L1 7.36912e-05, Linf 0.0054039, total time[s] 0.070687 +Converged at iteration 21, L1 7.06727e-05, Linf 0.00369868, total time[s] 0.056944 +Converged at iteration 20, L1 6.58486e-05, Linf 0.00503619, total time[s] 0.054452 +Converged at iteration 22, L1 6.55797e-05, Linf 0.00710565, total time[s] 0.059048 +Converged at iteration 26, L1 8.35786e-05, Linf 0.0062749, total time[s] 0.068222 +Converged at iteration 25, L1 7.35183e-05, Linf 0.00408194, total time[s] 0.066116 +Converged at iteration 20, L1 8.77853e-05, Linf 0.00554058, total time[s] 0.05515 +Converged at iteration 17, L1 8.19133e-05, Linf 0.00376895, total time[s] 0.047939 +Converged at iteration 31, L1 9.27103e-05, Linf 0.00276225, total time[s] 0.080345 +Converged at iteration 20, L1 6.58131e-05, Linf 0.00543563, total time[s] 0.053472 +Converged at iteration 24, L1 6.17054e-05, Linf 0.00554645, total time[s] 0.065318 +Converged at iteration 28, L1 7.55771e-05, Linf 0.00340624, total time[s] 0.073445 +Converged at iteration 23, L1 9.61964e-05, Linf 0.0068775, total time[s] 0.061193 +Converged at iteration 21, L1 9.32963e-05, Linf 0.00463224, total time[s] 0.05646 +Converged at iteration 23, L1 8.14752e-05, Linf 0.00409934, total time[s] 0.059602 +Converged at iteration 26, L1 6.43169e-05, Linf 0.00423687, total time[s] 0.070732 +Converged at iteration 28, L1 9.83406e-05, Linf 0.00577191, total time[s] 0.073032 +Converged at iteration 30, L1 7.4325e-05, Linf 0.00461002, total time[s] 0.082899 +Converged at iteration 28, L1 8.96635e-05, Linf 0.00347889, total time[s] 0.074577 +Converged at iteration 29, L1 8.84195e-05, Linf 0.00332844, total time[s] 0.075216 +Converged at iteration 30, L1 9.71912e-05, Linf 0.00335168, total time[s] 0.078143 +Converged at iteration 31, L1 7.81341e-05, Linf 0.00342233, total time[s] 0.10292 +Converged at iteration 33, L1 7.27195e-05, Linf 0.00534843, total time[s] 0.112613 +Converged at iteration 28, L1 6.75779e-05, Linf 0.00364428, total time[s] 0.080475 +Converged at iteration 24, L1 9.46115e-05, Linf 0.00179145, total time[s] 0.06252 +Converged at iteration 25, L1 6.12465e-05, Linf 0.00381881, total time[s] 0.064149 +Converged at iteration 39, L1 9.00387e-05, Linf 0.00566408, total time[s] 0.101718 +Converged at iteration 36, L1 7.28839e-05, Linf 0.00407501, total time[s] 0.09104 +Converged at iteration 26, L1 6.81163e-05, Linf 0.00623164, total time[s] 0.066744 +Converged at iteration 31, L1 5.9809e-05, Linf 0.00507471, total time[s] 0.077625 +Converged at iteration 26, L1 7.1142e-05, Linf 0.00535191, total time[s] 0.066216 +Converged at iteration 21, L1 6.75716e-05, Linf 0.00353133, total time[s] 0.054698 +Converged at iteration 20, L1 6.07632e-05, Linf 0.00483624, total time[s] 0.062434 +Converged at iteration 22, L1 5.40971e-05, Linf 0.00748374, total time[s] 0.057041 +Converged at iteration 26, L1 7.18689e-05, Linf 0.00599639, total time[s] 0.069177 +Converged at iteration 25, L1 6.88887e-05, Linf 0.0040466, total time[s] 0.064063 +Converged at iteration 20, L1 8.3367e-05, Linf 0.00549537, total time[s] 0.052337 +Converged at iteration 17, L1 7.84819e-05, Linf 0.00360018, total time[s] 0.05422 +Converged at iteration 31, L1 9.5023e-05, Linf 0.00276962, total time[s] 0.081808 +Converged at iteration 20, L1 6.44995e-05, Linf 0.00544116, total time[s] 0.05239 +Converged at iteration 24, L1 6.06022e-05, Linf 0.0058439, total time[s] 0.063787 +Converged at iteration 28, L1 6.88266e-05, Linf 0.00325642, total time[s] 0.074218 +Converged at iteration 23, L1 9.13419e-05, Linf 0.00688315, total time[s] 0.059632 +Converged at iteration 21, L1 8.86634e-05, Linf 0.00455507, total time[s] 0.054905 +Converged at iteration 23, L1 8.00059e-05, Linf 0.0040945, total time[s] 0.059193 +Converged at iteration 25, L1 9.97164e-05, Linf 0.00634212, total time[s] 0.064376 +Converged at iteration 28, L1 9.68264e-05, Linf 0.00560722, total time[s] 0.070569 +Converged at iteration 30, L1 7.03456e-05, Linf 0.00459103, total time[s] 0.075806 +Converged at iteration 28, L1 8.4377e-05, Linf 0.00339223, total time[s] 0.07067 +Converged at iteration 29, L1 8.72358e-05, Linf 0.00338929, total time[s] 0.072712 +Converged at iteration 30, L1 9.1574e-05, Linf 0.00310257, total time[s] 0.07599 +Converged at iteration 31, L1 6.53944e-05, Linf 0.00235747, total time[s] 0.078254 +Converged at iteration 33, L1 7.14976e-05, Linf 0.00539886, total time[s] 0.085441 +Converged at iteration 28, L1 6.49365e-05, Linf 0.00358159, total time[s] 0.071089 +Converged at iteration 24, L1 9.59739e-05, Linf 0.00188985, total time[s] 0.062221 +Converged at iteration 24, L1 9.19734e-05, Linf 0.00485582, total time[s] 0.061954 +Converged at iteration 39, L1 8.80087e-05, Linf 0.00578176, total time[s] 0.110054 +Converged at iteration 36, L1 7.31415e-05, Linf 0.00422792, total time[s] 0.096556 +Converged at iteration 26, L1 5.22186e-05, Linf 0.00511033, total time[s] 0.067619 +Converged at iteration 31, L1 5.92015e-05, Linf 0.00507194, total time[s] 0.090799 +Converged at iteration 26, L1 6.79284e-05, Linf 0.00528652, total time[s] 0.068003 +Converged at iteration 21, L1 6.44947e-05, Linf 0.00331786, total time[s] 0.055045 +Converged at iteration 20, L1 5.51376e-05, Linf 0.00456624, total time[s] 0.052592 +Converged at iteration 21, L1 9.86464e-05, Linf 0.00876491, total time[s] 0.055451 +Converged at iteration 26, L1 5.90849e-05, Linf 0.00554024, total time[s] 0.066482 +Converged at iteration 25, L1 6.37839e-05, Linf 0.00400333, total time[s] 0.064121 +Converged at iteration 20, L1 7.93786e-05, Linf 0.00547553, total time[s] 0.054528 +Converged at iteration 17, L1 7.42614e-05, Linf 0.00329704, total time[s] 0.045662 +Converged at iteration 31, L1 9.76521e-05, Linf 0.00277884, total time[s] 0.077826 +Converged at iteration 20, L1 6.34667e-05, Linf 0.00538532, total time[s] 0.052772 +Converged at iteration 23, L1 9.71704e-05, Linf 0.00648064, total time[s] 0.061344 +Converged at iteration 27, L1 9.63446e-05, Linf 0.00456839, total time[s] 0.072571 +Converged at iteration 23, L1 8.61625e-05, Linf 0.00687305, total time[s] 0.059801 +Converged at iteration 21, L1 8.26175e-05, Linf 0.00446572, total time[s] 0.058781 +Converged at iteration 23, L1 7.79055e-05, Linf 0.0037473, total time[s] 0.06501 +Converged at iteration 25, L1 9.78913e-05, Linf 0.00630575, total time[s] 0.069733 +Converged at iteration 28, L1 9.47357e-05, Linf 0.0055279, total time[s] 0.072759 +Converged at iteration 30, L1 6.71218e-05, Linf 0.00462172, total time[s] 0.075691 +Converged at iteration 28, L1 7.94899e-05, Linf 0.00329436, total time[s] 0.071076 +Converged at iteration 29, L1 8.52654e-05, Linf 0.00345578, total time[s] 0.073692 +Converged at iteration 30, L1 8.65243e-05, Linf 0.0028314, total time[s] 0.07593 +Converged at iteration 30, L1 8.73462e-05, Linf 0.00258845, total time[s] 0.076177 +Converged at iteration 33, L1 7.02786e-05, Linf 0.00545988, total time[s] 0.083259 +Converged at iteration 27, L1 9.73535e-05, Linf 0.00413673, total time[s] 0.073396 +Converged at iteration 24, L1 9.78155e-05, Linf 0.00199537, total time[s] 0.063745 +Converged at iteration 24, L1 8.41865e-05, Linf 0.00436406, total time[s] 0.062423 +Converged at iteration 39, L1 8.63793e-05, Linf 0.00592495, total time[s] 0.100591 +Converged at iteration 36, L1 7.38361e-05, Linf 0.00441302, total time[s] 0.093448 +Converged at iteration 25, L1 8.62055e-05, Linf 0.00633241, total time[s] 0.06478 +Converged at iteration 31, L1 5.88701e-05, Linf 0.00506905, total time[s] 0.078139 +Converged at iteration 26, L1 6.44493e-05, Linf 0.00520471, total time[s] 0.067119 +Converged at iteration 21, L1 6.17448e-05, Linf 0.0030366, total time[s] 0.055517 +Converged at iteration 19, L1 9.97194e-05, Linf 0.00652352, total time[s] 0.049933 +Converged at iteration 21, L1 8.24585e-05, Linf 0.00919113, total time[s] 0.0556 +Converged at iteration 25, L1 9.06801e-05, Linf 0.00669845, total time[s] 0.064722 +Converged at iteration 25, L1 5.87966e-05, Linf 0.00395123, total time[s] 0.064648 +Converged at iteration 20, L1 7.54194e-05, Linf 0.00550323, total time[s] 0.052736 +Converged at iteration 17, L1 6.93899e-05, Linf 0.00303985, total time[s] 0.049511 +Converged at iteration 32, L1 6.42354e-05, Linf 0.00229354, total time[s] 0.082046 +Converged at iteration 20, L1 6.25557e-05, Linf 0.00523337, total time[s] 0.054184 +Converged at iteration 23, L1 9.37889e-05, Linf 0.00624053, total time[s] 0.060457 +Converged at iteration 27, L1 8.78481e-05, Linf 0.00443144, total time[s] 0.069814 +Converged at iteration 23, L1 8.06735e-05, Linf 0.00684612, total time[s] 0.064067 +Converged at iteration 21, L1 7.76315e-05, Linf 0.00436135, total time[s] 0.057183 +Converged at iteration 23, L1 7.63157e-05, Linf 0.00354928, total time[s] 0.06018 +Converged at iteration 25, L1 9.59152e-05, Linf 0.00615743, total time[s] 0.063812 +Converged at iteration 28, L1 9.23165e-05, Linf 0.0049191, total time[s] 0.072187 +Converged at iteration 30, L1 6.40008e-05, Linf 0.00461286, total time[s] 0.076197 +Converged at iteration 28, L1 7.54447e-05, Linf 0.00319903, total time[s] 0.071464 +Converged at iteration 29, L1 8.28452e-05, Linf 0.00352296, total time[s] 0.073978 +Converged at iteration 30, L1 8.23806e-05, Linf 0.00259876, total time[s] 0.085036 +Converged at iteration 30, L1 7.41084e-05, Linf 0.00227499, total time[s] 0.084227 +Converged at iteration 33, L1 6.8605e-05, Linf 0.0055337, total time[s] 0.083429 +Converged at iteration 27, L1 9.26451e-05, Linf 0.00401896, total time[s] 0.069462 +Converged at iteration 24, L1 9.95849e-05, Linf 0.00208606, total time[s] 0.062014 +Converged at iteration 24, L1 7.5911e-05, Linf 0.00385815, total time[s] 0.062693 +Converged at iteration 39, L1 8.83479e-05, Linf 0.00585565, total time[s] 0.098311 +Converged at iteration 36, L1 7.34576e-05, Linf 0.00432005, total time[s] 0.094619 +Converged at iteration 25, L1 9.63103e-05, Linf 0.00693363, total time[s] 0.06817 +Converged at iteration 31, L1 5.9048e-05, Linf 0.00507026, total time[s] 0.078031 +Converged at iteration 26, L1 6.62238e-05, Linf 0.00524585, total time[s] 0.067062 +Converged at iteration 21, L1 6.33833e-05, Linf 0.00317907, total time[s] 0.056397 +Converged at iteration 20, L1 5.26007e-05, Linf 0.00432871, total time[s] 0.05465 +Converged at iteration 21, L1 9.0154e-05, Linf 0.00919979, total time[s] 0.055089 +Converged at iteration 25, L1 9.94356e-05, Linf 0.00699704, total time[s] 0.064754 +Converged at iteration 25, L1 6.18312e-05, Linf 0.00397708, total time[s] 0.064153 +Converged at iteration 20, L1 7.75833e-05, Linf 0.00548855, total time[s] 0.053769 +Converged at iteration 17, L1 7.17583e-05, Linf 0.00314636, total time[s] 0.045287 +Converged at iteration 31, L1 9.91772e-05, Linf 0.00278532, total time[s] 0.078359 +Converged at iteration 20, L1 6.31022e-05, Linf 0.00531931, total time[s] 0.055122 +Converged at iteration 23, L1 9.54305e-05, Linf 0.00654499, total time[s] 0.060625 +Converged at iteration 27, L1 9.16621e-05, Linf 0.00449989, total time[s] 0.072087 +Converged at iteration 23, L1 8.33814e-05, Linf 0.0068589, total time[s] 0.06005 +Converged at iteration 21, L1 7.98452e-05, Linf 0.00441179, total time[s] 0.055256 +Converged at iteration 23, L1 7.70428e-05, Linf 0.00364399, total time[s] 0.060243 +Converged at iteration 25, L1 9.67864e-05, Linf 0.00624839, total time[s] 0.070272 +Converged at iteration 28, L1 9.34898e-05, Linf 0.00525558, total time[s] 0.085981 +Converged at iteration 30, L1 6.55465e-05, Linf 0.00463217, total time[s] 0.075667 +Converged at iteration 28, L1 7.7402e-05, Linf 0.00325382, total time[s] 0.071517 +Converged at iteration 29, L1 8.41968e-05, Linf 0.00349198, total time[s] 0.075463 +Converged at iteration 30, L1 8.4213e-05, Linf 0.00266943, total time[s] 0.077719 +Converged at iteration 30, L1 7.99513e-05, Linf 0.00239037, total time[s] 0.076729 +Converged at iteration 33, L1 6.94772e-05, Linf 0.00549577, total time[s] 0.082728 +Converged at iteration 27, L1 9.53836e-05, Linf 0.00407543, total time[s] 0.069707 +Converged at iteration 24, L1 9.88967e-05, Linf 0.00204616, total time[s] 0.062657 +Converged at iteration 24, L1 7.99179e-05, Linf 0.00407104, total time[s] 0.06458 +Converged at iteration 39, L1 8.64985e-05, Linf 0.00593637, total time[s] 0.098444 +Converged at iteration 36, L1 7.36941e-05, Linf 0.00443201, total time[s] 0.09301 +Converged at iteration 25, L1 8.44141e-05, Linf 0.0061896, total time[s] 0.064689 +Converged at iteration 31, L1 5.88589e-05, Linf 0.00506878, total time[s] 0.078306 +Converged at iteration 26, L1 6.40085e-05, Linf 0.00519645, total time[s] 0.067304 +Converged at iteration 21, L1 6.15598e-05, Linf 0.00300838, total time[s] 0.055524 +Converged at iteration 19, L1 9.90209e-05, Linf 0.00656924, total time[s] 0.050368 +Converged at iteration 21, L1 8.09823e-05, Linf 0.00894349, total time[s] 0.055759 +Converged at iteration 25, L1 8.90222e-05, Linf 0.00670607, total time[s] 0.066486 +Converged at iteration 25, L1 5.8019e-05, Linf 0.00394586, total time[s] 0.065225 +Converged at iteration 20, L1 7.49644e-05, Linf 0.00550442, total time[s] 0.053866 +Converged at iteration 17, L1 6.89626e-05, Linf 0.00302948, total time[s] 0.046431 +Converged at iteration 32, L1 6.44059e-05, Linf 0.00229713, total time[s] 0.080785 +Converged at iteration 20, L1 6.24982e-05, Linf 0.00520521, total time[s] 0.052924 +Converged at iteration 23, L1 9.39622e-05, Linf 0.00662886, total time[s] 0.061146 +Converged at iteration 27, L1 8.69319e-05, Linf 0.00439046, total time[s] 0.070611 +Converged at iteration 23, L1 8.02504e-05, Linf 0.00684212, total time[s] 0.06005 +Converged at iteration 21, L1 7.65366e-05, Linf 0.00435314, total time[s] 0.055781 +Converged at iteration 23, L1 7.62307e-05, Linf 0.00345564, total time[s] 0.060445 +Converged at iteration 25, L1 9.57944e-05, Linf 0.00595734, total time[s] 0.074592 +Converged at iteration 28, L1 9.20647e-05, Linf 0.00510153, total time[s] 0.070143 +Converged at iteration 30, L1 6.41172e-05, Linf 0.00461254, total time[s] 0.073685 +Converged at iteration 28, L1 7.5331e-05, Linf 0.00318678, total time[s] 0.070204 +Converged at iteration 29, L1 8.27479e-05, Linf 0.00352882, total time[s] 0.072443 +Converged at iteration 30, L1 8.29254e-05, Linf 0.00251924, total time[s] 0.087483 +Converged at iteration 30, L1 7.34207e-05, Linf 0.00225106, total time[s] 0.081993 +Converged at iteration 33, L1 6.86803e-05, Linf 0.00548453, total time[s] 0.089419 +Converged at iteration 27, L1 9.22027e-05, Linf 0.0040152, total time[s] 0.081293 +Converged at iteration 24, L1 9.98605e-05, Linf 0.00209153, total time[s] 0.073475 +Converged at iteration 24, L1 7.54453e-05, Linf 0.00376891, total time[s] 0.079636 +Converged at iteration 39, L1 8.36563e-05, Linf 0.00604106, total time[s] 0.107918 +Converged at iteration 36, L1 7.4266e-05, Linf 0.00452278, total time[s] 0.09116 +Converged at iteration 25, L1 7.39479e-05, Linf 0.00520451, total time[s] 0.064973 +Converged at iteration 31, L1 5.88046e-05, Linf 0.00507503, total time[s] 0.080622 +Converged at iteration 26, L1 6.15123e-05, Linf 0.00520232, total time[s] 0.067178 +Converged at iteration 21, L1 5.98691e-05, Linf 0.00273528, total time[s] 0.061618 +Converged at iteration 19, L1 9.43974e-05, Linf 0.00628966, total time[s] 0.058956 +Converged at iteration 21, L1 7.12768e-05, Linf 0.00739633, total time[s] 0.076963 +Converged at iteration 25, L1 7.81284e-05, Linf 0.00620625, total time[s] 0.112855 +Converged at iteration 25, L1 5.51749e-05, Linf 0.00390851, total time[s] 0.08714 +Converged at iteration 20, L1 7.35037e-05, Linf 0.00548724, total time[s] 0.084176 +Converged at iteration 17, L1 6.64338e-05, Linf 0.00296556, total time[s] 0.06204 +Converged at iteration 32, L1 6.55116e-05, Linf 0.0023307, total time[s] 0.103128 +Converged at iteration 20, L1 6.22698e-05, Linf 0.0050213, total time[s] 0.105917 +Converged at iteration 23, L1 9.18465e-05, Linf 0.00683563, total time[s] 0.087421 +Converged at iteration 27, L1 8.16628e-05, Linf 0.00430311, total time[s] 0.1154 +Converged at iteration 23, L1 7.70888e-05, Linf 0.0067562, total time[s] 0.077286 +Converged at iteration 21, L1 7.26389e-05, Linf 0.00428199, total time[s] 0.095938 +Converged at iteration 23, L1 7.60081e-05, Linf 0.00341104, total time[s] 0.072327 +Converged at iteration 25, L1 9.47229e-05, Linf 0.00593764, total time[s] 0.073704 +Converged at iteration 28, L1 9.00853e-05, Linf 0.00487472, total time[s] 0.079176 +Converged at iteration 30, L1 6.20939e-05, Linf 0.00461186, total time[s] 0.078477 +Converged at iteration 28, L1 7.31997e-05, Linf 0.00310214, total time[s] 0.075188 +Converged at iteration 29, L1 8.15107e-05, Linf 0.00356736, total time[s] 0.142357 +Converged at iteration 30, L1 7.83351e-05, Linf 0.00241251, total time[s] 0.103665 +Converged at iteration 30, L1 6.42088e-05, Linf 0.00208518, total time[s] 0.086892 +Converged at iteration 33, L1 6.71673e-05, Linf 0.00560051, total time[s] 0.117541 +Converged at iteration 27, L1 8.77097e-05, Linf 0.00387486, total time[s] 0.106292 +Converged at iteration 25, L1 6.9974e-05, Linf 0.0016778, total time[s] 0.114611 +Converged at iteration 24, L1 7.03864e-05, Linf 0.00347336, total time[s] 0.127575 +Converged at iteration 39, L1 8.30491e-05, Linf 0.00623215, total time[s] 0.163085 +Converged at iteration 36, L1 7.37771e-05, Linf 0.00473525, total time[s] 0.113553 +Converged at iteration 25, L1 6.41773e-05, Linf 0.00436457, total time[s] 0.082123 +Converged at iteration 31, L1 5.84933e-05, Linf 0.00504502, total time[s] 0.132588 +Converged at iteration 26, L1 5.88686e-05, Linf 0.00506053, total time[s] 0.098724 +Converged at iteration 21, L1 5.75763e-05, Linf 0.00289245, total time[s] 0.089494 +Converged at iteration 19, L1 8.97354e-05, Linf 0.00604979, total time[s] 0.056368 +Converged at iteration 21, L1 6.19392e-05, Linf 0.00602742, total time[s] 0.068776 +Converged at iteration 25, L1 6.63192e-05, Linf 0.00534716, total time[s] 0.078322 +Converged at iteration 24, L1 9.88398e-05, Linf 0.00501769, total time[s] 0.072759 +Converged at iteration 20, L1 7.00787e-05, Linf 0.00540732, total time[s] 0.065011 +Converged at iteration 17, L1 6.43008e-05, Linf 0.00286129, total time[s] 0.057801 +Converged at iteration 32, L1 6.62302e-05, Linf 0.00236244, total time[s] 0.093234 +Converged at iteration 20, L1 6.25937e-05, Linf 0.00477574, total time[s] 0.062792 +Converged at iteration 23, L1 8.88696e-05, Linf 0.00688311, total time[s] 0.062307 +Converged at iteration 27, L1 7.5775e-05, Linf 0.0041539, total time[s] 0.073621 +Converged at iteration 23, L1 7.46052e-05, Linf 0.00654775, total time[s] 0.07096 +Converged at iteration 21, L1 6.87089e-05, Linf 0.00420318, total time[s] 0.066334 +Converged at iteration 23, L1 7.52545e-05, Linf 0.00339977, total time[s] 0.069961 +Converged at iteration 25, L1 9.34996e-05, Linf 0.00564346, total time[s] 0.078396 +Converged at iteration 28, L1 8.81126e-05, Linf 0.00457755, total time[s] 0.086933 +Converged at iteration 30, L1 6.04831e-05, Linf 0.00458872, total time[s] 0.089638 +Converged at iteration 28, L1 7.27058e-05, Linf 0.00306102, total time[s] 0.311679 +Converged at iteration 29, L1 8.18237e-05, Linf 0.00363266, total time[s] 0.167227 +Converged at iteration 30, L1 7.59967e-05, Linf 0.00227037, total time[s] 0.082006 +Converged at iteration 29, L1 9.03167e-05, Linf 0.00258287, total time[s] 0.074036 +Converged at iteration 33, L1 6.57086e-05, Linf 0.00559171, total time[s] 0.087975 +Converged at iteration 27, L1 8.4465e-05, Linf 0.0038778, total time[s] 0.072151 +Converged at iteration 25, L1 7.26672e-05, Linf 0.00177299, total time[s] 0.075167 +Converged at iteration 24, L1 6.52436e-05, Linf 0.00318219, total time[s] 0.071254 +Converged at iteration 39, L1 7.96728e-05, Linf 0.00629751, total time[s] 0.130717 +Converged at iteration 36, L1 7.2784e-05, Linf 0.00492562, total time[s] 0.146089 +Converged at iteration 25, L1 5.62513e-05, Linf 0.0028682, total time[s] 0.097491 +Converged at iteration 31, L1 5.82052e-05, Linf 0.00509916, total time[s] 0.10036 +Converged at iteration 25, L1 9.57409e-05, Linf 0.00595676, total time[s] 0.092466 +Converged at iteration 21, L1 5.70672e-05, Linf 0.00312171, total time[s] 0.059433 +Converged at iteration 19, L1 8.46016e-05, Linf 0.00571952, total time[s] 0.060821 +Converged at iteration 21, L1 5.40144e-05, Linf 0.00467605, total time[s] 0.066457 +Converged at iteration 25, L1 5.54902e-05, Linf 0.00425886, total time[s] 0.072942 +Converged at iteration 24, L1 9.38887e-05, Linf 0.00494886, total time[s] 0.064916 +Converged at iteration 20, L1 6.78751e-05, Linf 0.00538166, total time[s] 0.052633 +Converged at iteration 17, L1 6.37201e-05, Linf 0.00272031, total time[s] 0.045543 +Converged at iteration 32, L1 6.66291e-05, Linf 0.00243614, total time[s] 0.08033 +Converged at iteration 20, L1 6.20695e-05, Linf 0.00448473, total time[s] 0.053805 +Converged at iteration 23, L1 8.62804e-05, Linf 0.00709605, total time[s] 0.064033 +Converged at iteration 27, L1 7.05764e-05, Linf 0.00398375, total time[s] 0.074353 +Converged at iteration 23, L1 7.32207e-05, Linf 0.00630723, total time[s] 0.074597 +Converged at iteration 21, L1 6.46758e-05, Linf 0.004097, total time[s] 0.054443 +Converged at iteration 23, L1 7.47657e-05, Linf 0.00318619, total time[s] 0.062637 +Converged at iteration 25, L1 9.21627e-05, Linf 0.00528716, total time[s] 0.074731 +Converged at iteration 28, L1 8.59708e-05, Linf 0.00442667, total time[s] 0.076779 +Converged at iteration 30, L1 5.9407e-05, Linf 0.00455961, total time[s] 0.078332 +Converged at iteration 28, L1 6.99604e-05, Linf 0.00300099, total time[s] 0.072384 +Converged at iteration 29, L1 8.16379e-05, Linf 0.00369166, total time[s] 0.078095 +Converged at iteration 30, L1 7.22935e-05, Linf 0.00217074, total time[s] 0.091522 +Converged at iteration 29, L1 8.06029e-05, Linf 0.00240076, total time[s] 0.079315 +Converged at iteration 33, L1 6.41711e-05, Linf 0.00572763, total time[s] 0.092176 +Converged at iteration 27, L1 7.92225e-05, Linf 0.00372005, total time[s] 0.073088 +Converged at iteration 25, L1 7.60061e-05, Linf 0.00188699, total time[s] 0.067768 +Converged at iteration 24, L1 6.06437e-05, Linf 0.00295066, total time[s] 0.071673 +Converged at iteration 39, L1 8.09836e-05, Linf 0.00624199, total time[s] 0.110439 +Converged at iteration 36, L1 7.30318e-05, Linf 0.00483134, total time[s] 0.120664 +Converged at iteration 25, L1 5.96078e-05, Linf 0.00379542, total time[s] 0.078286 +Converged at iteration 31, L1 5.75749e-05, Linf 0.00507047, total time[s] 0.081656 +Converged at iteration 25, L1 9.82131e-05, Linf 0.00597463, total time[s] 0.073372 +Converged at iteration 21, L1 5.70644e-05, Linf 0.00301188, total time[s] 0.088437 +Converged at iteration 19, L1 8.69512e-05, Linf 0.00588041, total time[s] 0.064148 +Converged at iteration 21, L1 5.74926e-05, Linf 0.0052852, total time[s] 0.061163 +Converged at iteration 25, L1 6.03936e-05, Linf 0.00481047, total time[s] 0.0846 +Converged at iteration 24, L1 9.57444e-05, Linf 0.00499561, total time[s] 0.077387 +Converged at iteration 20, L1 6.93768e-05, Linf 0.00532846, total time[s] 0.073506 +Converged at iteration 17, L1 6.37767e-05, Linf 0.00277641, total time[s] 0.057105 +Converged at iteration 32, L1 6.66232e-05, Linf 0.00238628, total time[s] 0.124639 +Converged at iteration 20, L1 6.17208e-05, Linf 0.00462683, total time[s] 0.059084 +Converged at iteration 23, L1 8.75629e-05, Linf 0.00697081, total time[s] 0.068795 +Converged at iteration 27, L1 7.30214e-05, Linf 0.00404672, total time[s] 0.082554 +Converged at iteration 23, L1 7.35955e-05, Linf 0.0064319, total time[s] 0.129977 +Converged at iteration 21, L1 6.66232e-05, Linf 0.00414917, total time[s] 0.092751 +Converged at iteration 23, L1 7.49257e-05, Linf 0.00339825, total time[s] 0.08712 +Converged at iteration 25, L1 9.29449e-05, Linf 0.00544237, total time[s] 0.072771 +Converged at iteration 28, L1 8.69605e-05, Linf 0.00429082, total time[s] 0.082145 +Converged at iteration 30, L1 5.98082e-05, Linf 0.00457425, total time[s] 0.080856 +Converged at iteration 28, L1 7.07413e-05, Linf 0.00303214, total time[s] 0.073449 +Converged at iteration 29, L1 8.15848e-05, Linf 0.00365538, total time[s] 0.080262 +Converged at iteration 30, L1 7.45784e-05, Linf 0.00217194, total time[s] 0.215085 +Converged at iteration 29, L1 8.56576e-05, Linf 0.00249049, total time[s] 0.212061 +Converged at iteration 33, L1 6.50029e-05, Linf 0.00569977, total time[s] 0.097905 +Converged at iteration 27, L1 8.2094e-05, Linf 0.00374139, total time[s] 0.071134 +Converged at iteration 25, L1 7.42641e-05, Linf 0.00182976, total time[s] 0.075076 +Converged at iteration 24, L1 6.32215e-05, Linf 0.00303763, total time[s] 0.068889 +Converged at iteration 39, L1 8.11131e-05, Linf 0.00631159, total time[s] 0.12058 +Converged at iteration 36, L1 7.34788e-05, Linf 0.00494839, total time[s] 0.094914 +Converged at iteration 25, L1 5.58631e-05, Linf 0.00279032, total time[s] 0.06261 +Converged at iteration 31, L1 5.73634e-05, Linf 0.00504004, total time[s] 0.076283 +Converged at iteration 25, L1 9.5196e-05, Linf 0.00592791, total time[s] 0.064186 +Converged at iteration 21, L1 5.78222e-05, Linf 0.00314248, total time[s] 0.053845 +Converged at iteration 19, L1 8.42318e-05, Linf 0.00565339, total time[s] 0.05011 +Converged at iteration 21, L1 5.33473e-05, Linf 0.00473797, total time[s] 0.056808 +Converged at iteration 25, L1 5.46204e-05, Linf 0.00417204, total time[s] 0.06641 +Converged at iteration 24, L1 9.29336e-05, Linf 0.00499907, total time[s] 0.060562 +Converged at iteration 20, L1 6.73023e-05, Linf 0.00531975, total time[s] 0.051211 +Converged at iteration 17, L1 6.32385e-05, Linf 0.00274856, total time[s] 0.045527 +Converged at iteration 32, L1 6.72567e-05, Linf 0.00242011, total time[s] 0.079607 +Converged at iteration 20, L1 6.21696e-05, Linf 0.00446009, total time[s] 0.052537 +Converged at iteration 23, L1 8.58388e-05, Linf 0.00706338, total time[s] 0.058366 +Converged at iteration 27, L1 7.01209e-05, Linf 0.00396666, total time[s] 0.066869 +Converged at iteration 23, L1 7.26693e-05, Linf 0.00628259, total time[s] 0.058604 +Converged at iteration 21, L1 6.43477e-05, Linf 0.0040865, total time[s] 0.054269 +Converged at iteration 23, L1 7.46832e-05, Linf 0.00316827, total time[s] 0.058925 +Converged at iteration 25, L1 9.20652e-05, Linf 0.00519515, total time[s] 0.062079 +Converged at iteration 28, L1 8.5624e-05, Linf 0.00436817, total time[s] 0.072203 +Converged at iteration 30, L1 5.94435e-05, Linf 0.00455975, total time[s] 0.075153 +Converged at iteration 28, L1 6.99041e-05, Linf 0.00299612, total time[s] 0.069859 +Converged at iteration 29, L1 8.19919e-05, Linf 0.00369799, total time[s] 0.071854 +Converged at iteration 30, L1 7.29116e-05, Linf 0.00217222, total time[s] 0.07392 +Converged at iteration 29, L1 8.00842e-05, Linf 0.00238338, total time[s] 0.072095 +Converged at iteration 33, L1 6.40709e-05, Linf 0.00581452, total time[s] 0.081177 +Converged at iteration 27, L1 8.00842e-05, Linf 0.00365365, total time[s] 0.079607 +Converged at iteration 25, L1 7.63433e-05, Linf 0.00189927, total time[s] 0.078254 +Converged at iteration 24, L1 6.07751e-05, Linf 0.00293134, total time[s] 0.060429 +Converged at iteration 39, L1 7.82991e-05, Linf 0.00650738, total time[s] 0.097624 +Converged at iteration 36, L1 7.21633e-05, Linf 0.00509847, total time[s] 0.094551 +Converged at iteration 25, L1 5.16983e-05, Linf 0.00215995, total time[s] 0.06217 +Converged at iteration 31, L1 5.69828e-05, Linf 0.00502718, total time[s] 0.07703 +Converged at iteration 25, L1 9.17698e-05, Linf 0.00586334, total time[s] 0.063455 +Converged at iteration 21, L1 5.80813e-05, Linf 0.00328545, total time[s] 0.054183 +Converged at iteration 19, L1 8.142e-05, Linf 0.00540436, total time[s] 0.056058 +Converged at iteration 21, L1 4.95222e-05, Linf 0.00460691, total time[s] 0.058805 +Converged at iteration 24, L1 9.66608e-05, Linf 0.00622772, total time[s] 0.064186 +Converged at iteration 24, L1 8.91716e-05, Linf 0.00496526, total time[s] 0.060396 +Converged at iteration 20, L1 6.54963e-05, Linf 0.00524011, total time[s] 0.053779 +Converged at iteration 17, L1 6.24152e-05, Linf 0.00274072, total time[s] 0.062332 +Converged at iteration 32, L1 6.62212e-05, Linf 0.00245013, total time[s] 0.079317 +Converged at iteration 19, L1 9.97711e-05, Linf 0.00727968, total time[s] 0.052179 +Converged at iteration 23, L1 8.44086e-05, Linf 0.00701404, total time[s] 0.058919 +Converged at iteration 27, L1 6.69914e-05, Linf 0.00387387, total time[s] 0.069145 +Converged at iteration 23, L1 7.37499e-05, Linf 0.00612814, total time[s] 0.058405 +Converged at iteration 21, L1 6.25915e-05, Linf 0.00405614, total time[s] 0.057085 +Converged at iteration 23, L1 7.46468e-05, Linf 0.00321864, total time[s] 0.06092 +Converged at iteration 25, L1 9.11934e-05, Linf 0.00479706, total time[s] 0.063914 +Converged at iteration 28, L1 8.40409e-05, Linf 0.00430199, total time[s] 0.070463 +Converged at iteration 30, L1 5.86447e-05, Linf 0.00456066, total time[s] 0.076644 +Converged at iteration 28, L1 6.93504e-05, Linf 0.00295034, total time[s] 0.070255 +Converged at iteration 29, L1 8.2906e-05, Linf 0.0037606, total time[s] 0.073503 +Converged at iteration 30, L1 7.12028e-05, Linf 0.00218697, total time[s] 0.074641 +Converged at iteration 29, L1 7.50923e-05, Linf 0.00224255, total time[s] 0.073208 +Converged at iteration 33, L1 6.28349e-05, Linf 0.00578625, total time[s] 0.082236 +Converged at iteration 27, L1 7.59763e-05, Linf 0.00355989, total time[s] 0.068546 +Converged at iteration 25, L1 7.90731e-05, Linf 0.0019844, total time[s] 0.063045 +Converged at iteration 23, L1 9.89353e-05, Linf 0.00399127, total time[s] 0.058587 +Converged at iteration 39, L1 7.59068e-05, Linf 0.00653416, total time[s] 0.106289 +Converged at iteration 36, L1 7.25111e-05, Linf 0.00520112, total time[s] 0.126455 +Converged at iteration 25, L1 4.83674e-05, Linf 0.00186954, total time[s] 0.072566 +Converged at iteration 31, L1 5.63655e-05, Linf 0.00503533, total time[s] 0.076497 +Converged at iteration 25, L1 8.7722e-05, Linf 0.00576977, total time[s] 0.063224 +Converged at iteration 21, L1 5.76608e-05, Linf 0.00346032, total time[s] 0.055487 +Converged at iteration 19, L1 7.89519e-05, Linf 0.00512412, total time[s] 0.050313 +Converged at iteration 21, L1 4.60483e-05, Linf 0.0045676, total time[s] 0.054427 +Converged at iteration 24, L1 8.67186e-05, Linf 0.00523799, total time[s] 0.061106 +Converged at iteration 24, L1 8.66691e-05, Linf 0.00489516, total time[s] 0.060718 +Converged at iteration 20, L1 6.36558e-05, Linf 0.00524398, total time[s] 0.053609 +Converged at iteration 17, L1 6.12404e-05, Linf 0.00255148, total time[s] 0.049455 +Converged at iteration 32, L1 6.49525e-05, Linf 0.00248845, total time[s] 0.085253 +Converged at iteration 19, L1 9.95681e-05, Linf 0.00714128, total time[s] 0.05151 +Converged at iteration 23, L1 8.28935e-05, Linf 0.00718279, total time[s] 0.060698 +Converged at iteration 27, L1 6.36628e-05, Linf 0.00376291, total time[s] 0.070424 +Converged at iteration 23, L1 7.22722e-05, Linf 0.00596929, total time[s] 0.061715 +Converged at iteration 21, L1 6.10468e-05, Linf 0.00393913, total time[s] 0.058423 +Converged at iteration 23, L1 7.47462e-05, Linf 0.00304647, total time[s] 0.063155 +Converged at iteration 25, L1 9.04559e-05, Linf 0.00457978, total time[s] 0.065595 +Converged at iteration 28, L1 8.19849e-05, Linf 0.00392045, total time[s] 0.072431 +Converged at iteration 30, L1 5.78925e-05, Linf 0.00455706, total time[s] 0.077497 +Converged at iteration 28, L1 6.92344e-05, Linf 0.00289559, total time[s] 0.074551 +Converged at iteration 29, L1 8.17609e-05, Linf 0.00382216, total time[s] 0.074976 +Converged at iteration 30, L1 6.81623e-05, Linf 0.00219411, total time[s] 0.076949 +Converged at iteration 29, L1 6.84192e-05, Linf 0.00207343, total time[s] 0.080401 +Converged at iteration 33, L1 6.12898e-05, Linf 0.00584828, total time[s] 0.084028 +Converged at iteration 27, L1 7.03266e-05, Linf 0.0034476, total time[s] 0.069814 +Converged at iteration 25, L1 8.07643e-05, Linf 0.00205715, total time[s] 0.067321 +Converged at iteration 23, L1 9.4548e-05, Linf 0.00383114, total time[s] 0.06156 +Converged at iteration 39, L1 7.5744e-05, Linf 0.00647323, total time[s] 0.09916 +Converged at iteration 36, L1 7.18694e-05, Linf 0.00517368, total time[s] 0.099267 +Converged at iteration 25, L1 4.94665e-05, Linf 0.00195499, total time[s] 0.068003 +Converged at iteration 31, L1 5.6544e-05, Linf 0.00504342, total time[s] 0.079291 +Converged at iteration 25, L1 8.96731e-05, Linf 0.00581137, total time[s] 0.065417 +Converged at iteration 21, L1 5.70079e-05, Linf 0.00337083, total time[s] 0.059495 +Converged at iteration 19, L1 7.98279e-05, Linf 0.00530255, total time[s] 0.052424 +Converged at iteration 21, L1 4.77278e-05, Linf 0.00436711, total time[s] 0.056403 +Converged at iteration 24, L1 9.13375e-05, Linf 0.00571671, total time[s] 0.065475 +Converged at iteration 24, L1 8.75218e-05, Linf 0.0049156, total time[s] 0.063831 +Converged at iteration 20, L1 6.45172e-05, Linf 0.00529431, total time[s] 0.0542 +Converged at iteration 17, L1 6.1814e-05, Linf 0.00260238, total time[s] 0.052214 +Converged at iteration 32, L1 6.54478e-05, Linf 0.00246961, total time[s] 0.08363 +Converged at iteration 19, L1 9.9667e-05, Linf 0.00716178, total time[s] 0.050431 +Converged at iteration 23, L1 8.37008e-05, Linf 0.00716792, total time[s] 0.06163 +Converged at iteration 27, L1 6.52753e-05, Linf 0.0038183, total time[s] 0.078144 +Converged at iteration 23, L1 7.12326e-05, Linf 0.00604688, total time[s] 0.061123 +Converged at iteration 21, L1 6.17673e-05, Linf 0.00397774, total time[s] 0.056184 +Converged at iteration 23, L1 7.46703e-05, Linf 0.00307445, total time[s] 0.062041 +Converged at iteration 25, L1 9.08625e-05, Linf 0.00474184, total time[s] 0.065969 +Converged at iteration 28, L1 8.31271e-05, Linf 0.00407019, total time[s] 0.073569 +Converged at iteration 30, L1 5.82368e-05, Linf 0.00456143, total time[s] 0.076975 +Converged at iteration 28, L1 6.92573e-05, Linf 0.00291997, total time[s] 0.075161 +Converged at iteration 29, L1 8.16926e-05, Linf 0.00379442, total time[s] 0.07657 +Converged at iteration 30, L1 6.90647e-05, Linf 0.00219153, total time[s] 0.077957 +Converged at iteration 29, L1 7.09237e-05, Linf 0.0021555, total time[s] 0.07472 +Converged at iteration 33, L1 6.19846e-05, Linf 0.00581615, total time[s] 0.084669 +Converged at iteration 27, L1 7.2381e-05, Linf 0.00350451, total time[s] 0.06973 +Converged at iteration 25, L1 7.95217e-05, Linf 0.00203335, total time[s] 0.064943 +Converged at iteration 23, L1 9.66142e-05, Linf 0.00394111, total time[s] 0.060499 +Converged at iteration 39, L1 7.44187e-05, Linf 0.00654784, total time[s] 0.101002 +Converged at iteration 36, L1 7.16796e-05, Linf 0.00527513, total time[s] 0.096469 +Converged at iteration 25, L1 4.79047e-05, Linf 0.00184793, total time[s] 0.067734 +Converged at iteration 31, L1 5.64628e-05, Linf 0.00503383, total time[s] 0.080568 +Converged at iteration 25, L1 8.7274e-05, Linf 0.00576139, total time[s] 0.065651 +Converged at iteration 21, L1 5.77445e-05, Linf 0.00347834, total time[s] 0.056875 +Converged at iteration 19, L1 7.84853e-05, Linf 0.00514214, total time[s] 0.051523 +Converged at iteration 21, L1 4.57914e-05, Linf 0.00458768, total time[s] 0.056872 +Converged at iteration 24, L1 8.58274e-05, Linf 0.00516514, total time[s] 0.064562 +Converged at iteration 24, L1 8.58556e-05, Linf 0.00489088, total time[s] 0.063493 +Converged at iteration 20, L1 6.32673e-05, Linf 0.0052312, total time[s] 0.053606 +Converged at iteration 17, L1 6.10896e-05, Linf 0.00254118, total time[s] 0.047035 +Converged at iteration 32, L1 6.48283e-05, Linf 0.00249214, total time[s] 0.081966 +Converged at iteration 19, L1 9.97102e-05, Linf 0.00727603, total time[s] 0.051101 +Converged at iteration 23, L1 8.29166e-05, Linf 0.00721308, total time[s] 0.060147 +Converged at iteration 27, L1 6.3288e-05, Linf 0.00375274, total time[s] 0.070005 +Converged at iteration 23, L1 7.09417e-05, Linf 0.00595495, total time[s] 0.061473 +Converged at iteration 21, L1 6.03496e-05, Linf 0.00393073, total time[s] 0.056188 +Converged at iteration 23, L1 7.45581e-05, Linf 0.00300066, total time[s] 0.06096 +Converged at iteration 25, L1 9.02502e-05, Linf 0.00446149, total time[s] 0.065845 +Converged at iteration 28, L1 8.19492e-05, Linf 0.00392585, total time[s] 0.071557 +Converged at iteration 30, L1 5.78427e-05, Linf 0.00455732, total time[s] 0.078156 +Converged at iteration 28, L1 6.9215e-05, Linf 0.00289308, total time[s] 0.07191 +Converged at iteration 29, L1 8.18163e-05, Linf 0.00382946, total time[s] 0.074613 +Converged at iteration 30, L1 6.80141e-05, Linf 0.00219453, total time[s] 0.077231 +Converged at iteration 29, L1 6.79717e-05, Linf 0.00205789, total time[s] 0.076085 +Converged at iteration 33, L1 6.11427e-05, Linf 0.00585395, total time[s] 0.145776 +Converged at iteration 27, L1 6.99205e-05, Linf 0.00343622, total time[s] 0.080227 +Converged at iteration 25, L1 8.10177e-05, Linf 0.00206107, total time[s] 0.06652 +Converged at iteration 23, L1 9.43236e-05, Linf 0.00380928, total time[s] 0.061275 +Converged at iteration 39, L1 7.57591e-05, Linf 0.00663173, total time[s] 0.105131 +Converged at iteration 36, L1 7.09932e-05, Linf 0.00538934, total time[s] 0.095657 +Converged at iteration 24, L1 9.9709e-05, Linf 0.00328575, total time[s] 0.063325 +Converged at iteration 31, L1 5.63113e-05, Linf 0.00502573, total time[s] 0.079483 +Converged at iteration 25, L1 8.46135e-05, Linf 0.00570043, total time[s] 0.065959 +Converged at iteration 21, L1 5.89647e-05, Linf 0.00360002, total time[s] 0.056545 +Converged at iteration 19, L1 7.70907e-05, Linf 0.00498327, total time[s] 0.051599 +Converged at iteration 21, L1 4.40838e-05, Linf 0.00433659, total time[s] 0.056971 +Converged at iteration 24, L1 7.96414e-05, Linf 0.00455742, total time[s] 0.066158 +Converged at iteration 24, L1 8.3205e-05, Linf 0.00486052, total time[s] 0.063035 +Converged at iteration 20, L1 6.18576e-05, Linf 0.0051396, total time[s] 0.054813 +Converged at iteration 17, L1 6.02091e-05, Linf 0.00246789, total time[s] 0.053833 +Converged at iteration 32, L1 6.41234e-05, Linf 0.00251797, total time[s] 0.087676 +Converged at iteration 19, L1 9.93477e-05, Linf 0.00707005, total time[s] 0.051195 +Converged at iteration 23, L1 8.16264e-05, Linf 0.00714559, total time[s] 0.079565 +Converged at iteration 27, L1 6.11282e-05, Linf 0.00367518, total time[s] 0.072324 +Converged at iteration 23, L1 7.0562e-05, Linf 0.00585548, total time[s] 0.061317 +Converged at iteration 21, L1 5.87998e-05, Linf 0.0038646, total time[s] 0.060484 +Converged at iteration 23, L1 7.46921e-05, Linf 0.00300741, total time[s] 0.067323 +Converged at iteration 25, L1 8.96091e-05, Linf 0.00435912, total time[s] 0.064884 +Converged at iteration 28, L1 8.04967e-05, Linf 0.00373345, total time[s] 0.077322 +Converged at iteration 30, L1 5.76711e-05, Linf 0.00455014, total time[s] 0.077817 +Converged at iteration 28, L1 6.89537e-05, Linf 0.00286181, total time[s] 0.072814 +Converged at iteration 29, L1 8.22117e-05, Linf 0.00388184, total time[s] 0.074783 +Converged at iteration 30, L1 6.70501e-05, Linf 0.002194, total time[s] 0.085882 +Converged at iteration 29, L1 6.4985e-05, Linf 0.001954, total time[s] 0.075514 +Converged at iteration 33, L1 6.01607e-05, Linf 0.00589989, total time[s] 0.084356 +Converged at iteration 27, L1 6.72145e-05, Linf 0.0033559, total time[s] 0.070244 +Converged at iteration 25, L1 8.26391e-05, Linf 0.00210835, total time[s] 0.065918 +Converged at iteration 23, L1 9.10866e-05, Linf 0.00369128, total time[s] 0.061095 +Converged at iteration 39, L1 7.09565e-05, Linf 0.006735, total time[s] 0.107208 +Converged at iteration 36, L1 7.01745e-05, Linf 0.00553971, total time[s] 0.098131 +Converged at iteration 24, L1 9.73695e-05, Linf 0.00306887, total time[s] 0.063491 +Converged at iteration 31, L1 5.61826e-05, Linf 0.00501842, total time[s] 0.080766 +Converged at iteration 25, L1 8.09794e-05, Linf 0.00562597, total time[s] 0.06554 +Converged at iteration 21, L1 6.17532e-05, Linf 0.00373736, total time[s] 0.057365 +Converged at iteration 19, L1 7.55942e-05, Linf 0.00472665, total time[s] 0.05195 +Converged at iteration 21, L1 4.22841e-05, Linf 0.00413316, total time[s] 0.056523 +Converged at iteration 24, L1 7.3378e-05, Linf 0.0038414, total time[s] 0.063185 +Converged at iteration 24, L1 7.97551e-05, Linf 0.00482298, total time[s] 0.063065 +Converged at iteration 20, L1 6.09762e-05, Linf 0.00507516, total time[s] 0.053413 +Converged at iteration 17, L1 5.90683e-05, Linf 0.00238058, total time[s] 0.048905 +Converged at iteration 32, L1 6.31316e-05, Linf 0.00254947, total time[s] 0.082276 +Converged at iteration 19, L1 9.93023e-05, Linf 0.00698591, total time[s] 0.052192 +Converged at iteration 23, L1 8.0564e-05, Linf 0.00707377, total time[s] 0.061039 +Converged at iteration 27, L1 6.02212e-05, Linf 0.00356328, total time[s] 0.070738 +Converged at iteration 23, L1 7.03838e-05, Linf 0.00573878, total time[s] 0.061678 +Converged at iteration 20, L1 9.79897e-05, Linf 0.00505227, total time[s] 0.05392 +Converged at iteration 23, L1 7.47144e-05, Linf 0.00297317, total time[s] 0.060976 +Converged at iteration 25, L1 8.9224e-05, Linf 0.00416277, total time[s] 0.068399 +Converged at iteration 28, L1 7.88086e-05, Linf 0.00358929, total time[s] 0.080538 +Converged at iteration 30, L1 5.75362e-05, Linf 0.00452467, total time[s] 0.07802 +Converged at iteration 28, L1 6.9201e-05, Linf 0.00286952, total time[s] 0.073147 +Converged at iteration 29, L1 8.29108e-05, Linf 0.00393031, total time[s] 0.074781 +Converged at iteration 30, L1 6.58828e-05, Linf 0.00218399, total time[s] 0.077231 +Converged at iteration 28, L1 9.76896e-05, Linf 0.00253437, total time[s] 0.072682 +Converged at iteration 33, L1 5.89697e-05, Linf 0.00595505, total time[s] 0.084537 +Converged at iteration 27, L1 6.38069e-05, Linf 0.0032596, total time[s] 0.070276 +Converged at iteration 25, L1 8.42204e-05, Linf 0.00218483, total time[s] 0.065961 +Converged at iteration 23, L1 8.77774e-05, Linf 0.00360433, total time[s] 0.060861 +Converged at iteration 39, L1 6.88776e-05, Linf 0.00684999, total time[s] 0.105073 +Converged at iteration 36, L1 7.02235e-05, Linf 0.0057089, total time[s] 0.10082 +Converged at iteration 24, L1 9.4994e-05, Linf 0.00296705, total time[s] 0.064616 +Converged at iteration 30, L1 9.93249e-05, Linf 0.00614853, total time[s] 0.080576 +Converged at iteration 25, L1 7.71667e-05, Linf 0.00553529, total time[s] 0.066803 +Converged at iteration 21, L1 6.45714e-05, Linf 0.00389183, total time[s] 0.057631 +Converged at iteration 19, L1 7.3549e-05, Linf 0.00468672, total time[s] 0.053115 +Converged at iteration 21, L1 4.07052e-05, Linf 0.00398398, total time[s] 0.056741 +Converged at iteration 24, L1 6.69794e-05, Linf 0.00382845, total time[s] 0.066835 +Converged at iteration 24, L1 7.5625e-05, Linf 0.00477616, total time[s] 0.064358 +Converged at iteration 20, L1 5.8871e-05, Linf 0.00534713, total time[s] 0.055056 +Converged at iteration 17, L1 5.77713e-05, Linf 0.00227425, total time[s] 0.072809 +Converged at iteration 32, L1 6.19747e-05, Linf 0.00259238, total time[s] 0.10349 +Converged at iteration 19, L1 9.91428e-05, Linf 0.0068629, total time[s] 0.051723 +Converged at iteration 23, L1 7.9336e-05, Linf 0.00692533, total time[s] 0.060775 +Converged at iteration 27, L1 5.82621e-05, Linf 0.00343001, total time[s] 0.070727 +Converged at iteration 23, L1 7.07554e-05, Linf 0.00559698, total time[s] 0.061316 +Converged at iteration 20, L1 9.58987e-05, Linf 0.00502671, total time[s] 0.054021 +Converged at iteration 23, L1 7.53521e-05, Linf 0.00294031, total time[s] 0.060985 +Converged at iteration 25, L1 8.85383e-05, Linf 0.00397282, total time[s] 0.068272 +Converged at iteration 28, L1 7.69958e-05, Linf 0.00383816, total time[s] 0.072891 +Converged at iteration 30, L1 5.76592e-05, Linf 0.00447756, total time[s] 0.078066 +Converged at iteration 28, L1 6.95676e-05, Linf 0.00285466, total time[s] 0.07288 +Converged at iteration 29, L1 8.37202e-05, Linf 0.0039986, total time[s] 0.075461 +Converged at iteration 30, L1 6.44028e-05, Linf 0.00217636, total time[s] 0.076993 +Converged at iteration 28, L1 9.30009e-05, Linf 0.00245957, total time[s] 0.073402 +Converged at iteration 33, L1 5.76601e-05, Linf 0.00602132, total time[s] 0.084207 +Converged at iteration 27, L1 6.08885e-05, Linf 0.0031623, total time[s] 0.070852 +Converged at iteration 25, L1 8.6008e-05, Linf 0.00227283, total time[s] 0.068239 +Converged at iteration 23, L1 8.49939e-05, Linf 0.00347399, total time[s] 0.060877 +Converged at iteration 39, L1 7.01163e-05, Linf 0.00678459, total time[s] 0.100042 +Converged at iteration 36, L1 7.02006e-05, Linf 0.00562707, total time[s] 0.096229 +Converged at iteration 24, L1 9.62418e-05, Linf 0.00306887, total time[s] 0.063722 +Converged at iteration 30, L1 9.97413e-05, Linf 0.00614548, total time[s] 0.077374 +Converged at iteration 25, L1 7.90567e-05, Linf 0.00558075, total time[s] 0.06569 +Converged at iteration 21, L1 6.26562e-05, Linf 0.00381603, total time[s] 0.055853 +Converged at iteration 19, L1 7.44612e-05, Linf 0.00470714, total time[s] 0.051661 +Converged at iteration 21, L1 4.13321e-05, Linf 0.00420019, total time[s] 0.05637 +Converged at iteration 24, L1 7.01991e-05, Linf 0.00394284, total time[s] 0.064038 +Converged at iteration 24, L1 7.75652e-05, Linf 0.00479977, total time[s] 0.063896 +Converged at iteration 20, L1 5.94911e-05, Linf 0.00517062, total time[s] 0.054291 +Converged at iteration 17, L1 5.83888e-05, Linf 0.00232759, total time[s] 0.04725 +Converged at iteration 32, L1 6.25194e-05, Linf 0.00257008, total time[s] 0.086741 +Converged at iteration 19, L1 9.91014e-05, Linf 0.00692623, total time[s] 0.059842 +Converged at iteration 23, L1 8.01562e-05, Linf 0.00700766, total time[s] 0.071101 +Converged at iteration 27, L1 5.93216e-05, Linf 0.00349269, total time[s] 0.073041 +Converged at iteration 23, L1 7.05353e-05, Linf 0.00566625, total time[s] 0.061479 +Converged at iteration 20, L1 9.68067e-05, Linf 0.00504189, total time[s] 0.053766 +Converged at iteration 23, L1 7.51123e-05, Linf 0.00295581, total time[s] 0.065442 +Converged at iteration 25, L1 8.90231e-05, Linf 0.0040622, total time[s] 0.06599 +Converged at iteration 28, L1 7.7919e-05, Linf 0.00370989, total time[s] 0.072641 +Converged at iteration 30, L1 5.76033e-05, Linf 0.00450239, total time[s] 0.078122 +Converged at iteration 28, L1 6.93446e-05, Linf 0.00286254, total time[s] 0.072622 +Converged at iteration 29, L1 8.33217e-05, Linf 0.00396377, total time[s] 0.074953 +Converged at iteration 30, L1 6.51595e-05, Linf 0.00218079, total time[s] 0.077453 +Converged at iteration 28, L1 9.51632e-05, Linf 0.00249793, total time[s] 0.072483 +Converged at iteration 33, L1 5.82758e-05, Linf 0.00598799, total time[s] 0.084894 +Converged at iteration 27, L1 6.19813e-05, Linf 0.00320791, total time[s] 0.070726 +Converged at iteration 25, L1 8.53164e-05, Linf 0.00222949, total time[s] 0.065422 +Converged at iteration 23, L1 8.60819e-05, Linf 0.00354936, total time[s] 0.060944 +Converged at iteration 39, L1 7.03905e-05, Linf 0.00685599, total time[s] 0.101839 +Converged at iteration 36, L1 6.92942e-05, Linf 0.00573176, total time[s] 0.107472 +Converged at iteration 24, L1 9.48193e-05, Linf 0.00293749, total time[s] 0.066516 +Converged at iteration 30, L1 9.9207e-05, Linf 0.00614884, total time[s] 0.077558 +Converged at iteration 25, L1 7.67712e-05, Linf 0.00552618, total time[s] 0.065648 +Converged at iteration 21, L1 6.4115e-05, Linf 0.00390722, total time[s] 0.056432 +Converged at iteration 19, L1 7.33572e-05, Linf 0.00470339, total time[s] 0.051704 +Converged at iteration 21, L1 4.06104e-05, Linf 0.0039608, total time[s] 0.059216 +Converged at iteration 24, L1 6.6439e-05, Linf 0.00370307, total time[s] 0.065489 +Converged at iteration 24, L1 7.55747e-05, Linf 0.00477126, total time[s] 0.063973 +Converged at iteration 20, L1 5.8707e-05, Linf 0.00537262, total time[s] 0.055389 +Converged at iteration 17, L1 5.76461e-05, Linf 0.00226356, total time[s] 0.047865 +Converged at iteration 32, L1 6.1842e-05, Linf 0.00259713, total time[s] 0.089143 +Converged at iteration 19, L1 9.911e-05, Linf 0.00684979, total time[s] 0.051904 +Converged at iteration 23, L1 7.9269e-05, Linf 0.00690712, total time[s] 0.06162 +Converged at iteration 27, L1 5.81665e-05, Linf 0.00342049, total time[s] 0.071097 +Converged at iteration 23, L1 7.08883e-05, Linf 0.00558387, total time[s] 0.06326 +Converged at iteration 20, L1 9.57841e-05, Linf 0.00503465, total time[s] 0.054227 +Converged at iteration 23, L1 7.54342e-05, Linf 0.00293746, total time[s] 0.061757 +Converged at iteration 25, L1 8.84902e-05, Linf 0.00395559, total time[s] 0.066009 +Converged at iteration 28, L1 7.68623e-05, Linf 0.00386604, total time[s] 0.073661 +Converged at iteration 30, L1 5.77172e-05, Linf 0.00447523, total time[s] 0.079533 +Converged at iteration 28, L1 6.96171e-05, Linf 0.00285232, total time[s] 0.073932 +Converged at iteration 29, L1 8.3788e-05, Linf 0.00400623, total time[s] 0.076808 +Converged at iteration 30, L1 6.42862e-05, Linf 0.00217595, total time[s] 0.080424 +Converged at iteration 28, L1 9.25888e-05, Linf 0.00245061, total time[s] 0.073593 +Converged at iteration 33, L1 5.74662e-05, Linf 0.00602805, total time[s] 0.085179 +Converged at iteration 27, L1 6.01757e-05, Linf 0.00315291, total time[s] 0.0701 +Converged at iteration 25, L1 8.62996e-05, Linf 0.00228204, total time[s] 0.065607 +Converged at iteration 23, L1 8.43287e-05, Linf 0.00346119, total time[s] 0.061045 +Converged at iteration 39, L1 6.72784e-05, Linf 0.00694587, total time[s] 0.100865 +Converged at iteration 36, L1 6.87221e-05, Linf 0.00585808, total time[s] 0.104589 +Converged at iteration 24, L1 9.36882e-05, Linf 0.0028662, total time[s] 0.0655 +Converged at iteration 30, L1 9.84757e-05, Linf 0.00615004, total time[s] 0.078951 +Converged at iteration 25, L1 7.40503e-05, Linf 0.00546047, total time[s] 0.065561 +Converged at iteration 21, L1 6.67574e-05, Linf 0.00401319, total time[s] 0.057234 +Converged at iteration 19, L1 7.21613e-05, Linf 0.00482256, total time[s] 0.052108 +Converged at iteration 21, L1 3.96247e-05, Linf 0.00378839, total time[s] 0.056512 +Converged at iteration 24, L1 6.25755e-05, Linf 0.00318365, total time[s] 0.064198 +Converged at iteration 24, L1 7.41673e-05, Linf 0.00473612, total time[s] 0.065084 +Converged at iteration 20, L1 5.74504e-05, Linf 0.0052737, total time[s] 0.053896 +Converged at iteration 17, L1 5.70069e-05, Linf 0.00218654, total time[s] 0.049571 +Converged at iteration 32, L1 6.07287e-05, Linf 0.00263223, total time[s] 0.109646 +Converged at iteration 19, L1 9.87661e-05, Linf 0.00674965, total time[s] 0.056235 +Converged at iteration 23, L1 7.84326e-05, Linf 0.00676131, total time[s] 0.061012 +Converged at iteration 27, L1 5.754e-05, Linf 0.00331195, total time[s] 0.070354 +Converged at iteration 23, L1 7.13712e-05, Linf 0.00548233, total time[s] 0.062368 +Converged at iteration 20, L1 9.47058e-05, Linf 0.00503583, total time[s] 0.054247 +Converged at iteration 23, L1 7.58476e-05, Linf 0.0029188, total time[s] 0.060945 +Converged at iteration 25, L1 8.80415e-05, Linf 0.00384571, total time[s] 0.065901 +Converged at iteration 28, L1 7.55672e-05, Linf 0.00387137, total time[s] 0.073269 +Converged at iteration 30, L1 5.79087e-05, Linf 0.00444984, total time[s] 0.079632 +Converged at iteration 28, L1 7.00983e-05, Linf 0.00283046, total time[s] 0.077468 +Converged at iteration 29, L1 8.42611e-05, Linf 0.00405643, total time[s] 0.074991 +Converged at iteration 30, L1 6.34347e-05, Linf 0.00217217, total time[s] 0.077325 +Converged at iteration 28, L1 8.96905e-05, Linf 0.00237823, total time[s] 0.072814 +Converged at iteration 33, L1 5.65595e-05, Linf 0.00607569, total time[s] 0.084853 +Converged at iteration 26, L1 9.91171e-05, Linf 0.00360756, total time[s] 0.067879 +Converged at iteration 25, L1 8.7539e-05, Linf 0.00234352, total time[s] 0.065503 +Converged at iteration 23, L1 8.24751e-05, Linf 0.00337336, total time[s] 0.061315 +Converged at iteration 39, L1 6.67417e-05, Linf 0.00704521, total time[s] 0.113524 +Converged at iteration 36, L1 6.81311e-05, Linf 0.00601718, total time[s] 0.098037 +Converged at iteration 24, L1 9.1791e-05, Linf 0.00270389, total time[s] 0.06359 +Converged at iteration 30, L1 9.79809e-05, Linf 0.00615459, total time[s] 0.077518 +Converged at iteration 25, L1 7.10643e-05, Linf 0.00538125, total time[s] 0.06955 +Converged at iteration 21, L1 7.02498e-05, Linf 0.00414784, total time[s] 0.064622 +Converged at iteration 19, L1 7.09312e-05, Linf 0.00496903, total time[s] 0.053342 +Converged at iteration 21, L1 3.87066e-05, Linf 0.00347343, total time[s] 0.055471 +Converged at iteration 24, L1 5.86157e-05, Linf 0.00349971, total time[s] 0.072504 +Converged at iteration 24, L1 7.15582e-05, Linf 0.00469241, total time[s] 0.066984 +Converged at iteration 20, L1 5.6251e-05, Linf 0.00527563, total time[s] 0.054384 +Converged at iteration 17, L1 5.64025e-05, Linf 0.00210945, total time[s] 0.048295 +Converged at iteration 32, L1 5.97387e-05, Linf 0.00267401, total time[s] 0.08316 +Converged at iteration 19, L1 9.88859e-05, Linf 0.00664597, total time[s] 0.052101 +Converged at iteration 23, L1 7.75007e-05, Linf 0.00655974, total time[s] 0.062937 +Converged at iteration 26, L1 9.8669e-05, Linf 0.00519239, total time[s] 0.068809 +Converged at iteration 23, L1 7.19964e-05, Linf 0.00533622, total time[s] 0.064452 +Converged at iteration 20, L1 9.35318e-05, Linf 0.00493437, total time[s] 0.052989 +Converged at iteration 23, L1 7.59106e-05, Linf 0.00298853, total time[s] 0.062292 +Converged at iteration 25, L1 8.75171e-05, Linf 0.00391015, total time[s] 0.064982 +Converged at iteration 28, L1 7.39894e-05, Linf 0.00363768, total time[s] 0.071065 +Converged at iteration 30, L1 5.82281e-05, Linf 0.00449429, total time[s] 0.076381 +Converged at iteration 28, L1 7.08822e-05, Linf 0.00277856, total time[s] 0.07153 +Converged at iteration 29, L1 8.48484e-05, Linf 0.00407036, total time[s] 0.076579 +Converged at iteration 30, L1 6.24077e-05, Linf 0.00216167, total time[s] 0.081469 +Converged at iteration 28, L1 8.71134e-05, Linf 0.00227134, total time[s] 0.075397 +Converged at iteration 32, L1 9.90681e-05, Linf 0.00733109, total time[s] 0.084199 +Converged at iteration 26, L1 9.52104e-05, Linf 0.00352017, total time[s] 0.068157 +Converged at iteration 25, L1 8.87992e-05, Linf 0.00241457, total time[s] 0.069908 +Converged at iteration 23, L1 8.05268e-05, Linf 0.00328243, total time[s] 0.062276 +Converged at iteration 39, L1 6.36089e-05, Linf 0.00716548, total time[s] 0.101615 +Converged at iteration 36, L1 6.66797e-05, Linf 0.0061979, total time[s] 0.096823 +Converged at iteration 24, L1 9.06365e-05, Linf 0.0026818, total time[s] 0.064321 +Converged at iteration 30, L1 9.66603e-05, Linf 0.00617342, total time[s] 0.077952 +Converged at iteration 25, L1 6.75779e-05, Linf 0.00528567, total time[s] 0.066793 +Converged at iteration 21, L1 7.33639e-05, Linf 0.00430504, total time[s] 0.057511 +Converged at iteration 19, L1 6.95576e-05, Linf 0.00515077, total time[s] 0.052393 +Converged at iteration 21, L1 3.82283e-05, Linf 0.00319747, total time[s] 0.056437 +Converged at iteration 24, L1 5.46285e-05, Linf 0.00286018, total time[s] 0.063891 +Converged at iteration 24, L1 6.78579e-05, Linf 0.00463744, total time[s] 0.064663 +Converged at iteration 20, L1 5.44524e-05, Linf 0.00520965, total time[s] 0.055046 +Converged at iteration 17, L1 5.58171e-05, Linf 0.0020747, total time[s] 0.047048 +Converged at iteration 32, L1 5.89459e-05, Linf 0.00271572, total time[s] 0.083728 +Converged at iteration 19, L1 9.84823e-05, Linf 0.00656396, total time[s] 0.052487 +Converged at iteration 23, L1 7.65682e-05, Linf 0.00629339, total time[s] 0.061799 +Converged at iteration 26, L1 9.57441e-05, Linf 0.00510067, total time[s] 0.068733 +Converged at iteration 23, L1 7.34103e-05, Linf 0.00520351, total time[s] 0.062523 +Converged at iteration 20, L1 9.24979e-05, Linf 0.00479396, total time[s] 0.054542 +Converged at iteration 23, L1 7.62301e-05, Linf 0.00288553, total time[s] 0.062647 +Converged at iteration 25, L1 8.69495e-05, Linf 0.00362111, total time[s] 0.066665 +Converged at iteration 28, L1 7.20694e-05, Linf 0.00326942, total time[s] 0.074264 +Converged at iteration 30, L1 5.88391e-05, Linf 0.00451524, total time[s] 0.083171 +Converged at iteration 28, L1 7.15283e-05, Linf 0.00264475, total time[s] 0.072843 +Converged at iteration 29, L1 8.52294e-05, Linf 0.0041664, total time[s] 0.075586 +Converged at iteration 30, L1 6.14269e-05, Linf 0.00215073, total time[s] 0.077375 +Converged at iteration 28, L1 8.4275e-05, Linf 0.00213382, total time[s] 0.07443 +Converged at iteration 32, L1 9.75257e-05, Linf 0.00734963, total time[s] 0.083025 +Converged at iteration 26, L1 9.10285e-05, Linf 0.00341531, total time[s] 0.068772 +Converged at iteration 25, L1 9.00312e-05, Linf 0.00249578, total time[s] 0.065777 +Converged at iteration 23, L1 7.86088e-05, Linf 0.00315723, total time[s] 0.061239 +Converged at iteration 39, L1 6.45743e-05, Linf 0.00702898, total time[s] 0.098259 +Converged at iteration 36, L1 6.79013e-05, Linf 0.00619216, total time[s] 0.094461 +Converged at iteration 24, L1 9.09987e-05, Linf 0.00265144, total time[s] 0.0625 +Converged at iteration 30, L1 9.71007e-05, Linf 0.00616327, total time[s] 0.082214 +Converged at iteration 25, L1 6.9306e-05, Linf 0.00540995, total time[s] 0.06723 +Converged at iteration 21, L1 7.22215e-05, Linf 0.0042275, total time[s] 0.056835 +Converged at iteration 19, L1 7.02804e-05, Linf 0.00505926, total time[s] 0.051343 +Converged at iteration 21, L1 3.83816e-05, Linf 0.00330122, total time[s] 0.056517 +Converged at iteration 24, L1 5.65365e-05, Linf 0.00291495, total time[s] 0.068288 +Converged at iteration 24, L1 6.93065e-05, Linf 0.00469581, total time[s] 0.062586 +Converged at iteration 20, L1 5.52483e-05, Linf 0.00531086, total time[s] 0.053807 +Converged at iteration 17, L1 5.61106e-05, Linf 0.00209029, total time[s] 0.046844 +Converged at iteration 32, L1 5.9898e-05, Linf 0.00269685, total time[s] 0.082368 +Converged at iteration 19, L1 9.85608e-05, Linf 0.00659911, total time[s] 0.05094 +Converged at iteration 23, L1 7.68604e-05, Linf 0.00642884, total time[s] 0.060276 +Converged at iteration 26, L1 9.70178e-05, Linf 0.00517254, total time[s] 0.067738 +Converged at iteration 23, L1 7.27015e-05, Linf 0.00524291, total time[s] 0.060041 +Converged at iteration 20, L1 9.30962e-05, Linf 0.00487464, total time[s] 0.055925 +Converged at iteration 23, L1 7.61018e-05, Linf 0.00289293, total time[s] 0.060289 +Converged at iteration 25, L1 8.71476e-05, Linf 0.00367556, total time[s] 0.064306 +Converged at iteration 28, L1 7.29796e-05, Linf 0.00342901, total time[s] 0.071714 +Converged at iteration 30, L1 5.85251e-05, Linf 0.00452635, total time[s] 0.076017 +Converged at iteration 28, L1 7.13791e-05, Linf 0.00273878, total time[s] 0.071113 +Converged at iteration 29, L1 8.56313e-05, Linf 0.00410275, total time[s] 0.074036 +Converged at iteration 30, L1 6.24853e-05, Linf 0.00215446, total time[s] 0.075659 +Converged at iteration 28, L1 8.62324e-05, Linf 0.002208, total time[s] 0.071216 +Converged at iteration 32, L1 9.85798e-05, Linf 0.00749225, total time[s] 0.081239 +Converged at iteration 26, L1 9.27624e-05, Linf 0.00346622, total time[s] 0.068218 +Converged at iteration 25, L1 9.0323e-05, Linf 0.00245515, total time[s] 0.06436 +Converged at iteration 23, L1 8.01925e-05, Linf 0.00323491, total time[s] 0.060116 +Converged at iteration 39, L1 6.52522e-05, Linf 0.00717338, total time[s] 0.111918 +Converged at iteration 36, L1 6.68981e-05, Linf 0.00621427, total time[s] 0.093024 +Converged at iteration 24, L1 9.07065e-05, Linf 0.0026888, total time[s] 0.064965 +Converged at iteration 30, L1 9.67838e-05, Linf 0.00614154, total time[s] 0.075901 +Converged at iteration 25, L1 6.72256e-05, Linf 0.00527591, total time[s] 0.066476 +Converged at iteration 21, L1 7.37084e-05, Linf 0.00432078, total time[s] 0.056213 +Converged at iteration 19, L1 6.94511e-05, Linf 0.00516976, total time[s] 0.052796 +Converged at iteration 21, L1 3.81381e-05, Linf 0.00317241, total time[s] 0.056906 +Converged at iteration 24, L1 5.43031e-05, Linf 0.00285016, total time[s] 0.064083 +Converged at iteration 24, L1 6.75712e-05, Linf 0.00463163, total time[s] 0.063543 +Converged at iteration 20, L1 5.43406e-05, Linf 0.00520269, total time[s] 0.058351 +Converged at iteration 17, L1 5.57192e-05, Linf 0.00206871, total time[s] 0.047796 +Converged at iteration 32, L1 5.88472e-05, Linf 0.00271925, total time[s] 0.083992 +Converged at iteration 19, L1 9.84184e-05, Linf 0.00655815, total time[s] 0.051819 +Converged at iteration 23, L1 7.65244e-05, Linf 0.00626601, total time[s] 0.061508 +Converged at iteration 26, L1 9.57313e-05, Linf 0.00510358, total time[s] 0.068887 +Converged at iteration 23, L1 7.36292e-05, Linf 0.00517092, total time[s] 0.064106 +Converged at iteration 20, L1 9.24303e-05, Linf 0.00477297, total time[s] 0.054565 +Converged at iteration 23, L1 7.62761e-05, Linf 0.00288441, total time[s] 0.065745 +Converged at iteration 25, L1 8.69057e-05, Linf 0.00361161, total time[s] 0.067896 +Converged at iteration 28, L1 7.18906e-05, Linf 0.00324537, total time[s] 0.074629 +Converged at iteration 30, L1 5.89536e-05, Linf 0.00450808, total time[s] 0.0804 +Converged at iteration 28, L1 7.16243e-05, Linf 0.00267114, total time[s] 0.074731 +Converged at iteration 29, L1 8.56126e-05, Linf 0.0041703, total time[s] 0.07631 +Converged at iteration 30, L1 6.13586e-05, Linf 0.00215056, total time[s] 0.079406 +Converged at iteration 28, L1 8.4114e-05, Linf 0.00211821, total time[s] 0.073883 +Converged at iteration 32, L1 9.74645e-05, Linf 0.00744637, total time[s] 0.082331 +Converged at iteration 26, L1 9.06156e-05, Linf 0.00340353, total time[s] 0.068006 +Converged at iteration 25, L1 9.06991e-05, Linf 0.00250394, total time[s] 0.066586 +Converged at iteration 23, L1 7.87248e-05, Linf 0.00313234, total time[s] 0.061436 +Converged at iteration 39, L1 6.18075e-05, Linf 0.0072624, total time[s] 0.10346 +Converged at iteration 36, L1 6.59343e-05, Linf 0.00634606, total time[s] 0.095459 +Converged at iteration 24, L1 9.01912e-05, Linf 0.00273994, total time[s] 0.064259 +Converged at iteration 30, L1 9.59185e-05, Linf 0.00618806, total time[s] 0.0783 +Converged at iteration 25, L1 6.48773e-05, Linf 0.00520719, total time[s] 0.067142 +Converged at iteration 21, L1 7.84424e-05, Linf 0.00443057, total time[s] 0.061925 +Converged at iteration 19, L1 6.88437e-05, Linf 0.00530594, total time[s] 0.052128 +Converged at iteration 21, L1 3.78468e-05, Linf 0.00306765, total time[s] 0.057223 +Converged at iteration 24, L1 5.21653e-05, Linf 0.00303296, total time[s] 0.064004 +Converged at iteration 24, L1 6.45021e-05, Linf 0.00458997, total time[s] 0.063685 +Converged at iteration 20, L1 5.32643e-05, Linf 0.00515358, total time[s] 0.054714 +Converged at iteration 17, L1 5.52963e-05, Linf 0.0020389, total time[s] 0.047013 +Converged at iteration 32, L1 5.83691e-05, Linf 0.00273784, total time[s] 0.083088 +Converged at iteration 19, L1 9.82263e-05, Linf 0.00651686, total time[s] 0.052153 +Converged at iteration 23, L1 7.51165e-05, Linf 0.00606669, total time[s] 0.061271 +Converged at iteration 26, L1 9.52896e-05, Linf 0.00503525, total time[s] 0.068101 +Converged at iteration 23, L1 7.51207e-05, Linf 0.00506094, total time[s] 0.061341 +Converged at iteration 20, L1 9.23917e-05, Linf 0.00461463, total time[s] 0.054519 +Converged at iteration 23, L1 7.66463e-05, Linf 0.00287757, total time[s] 0.06162 +Converged at iteration 25, L1 8.65125e-05, Linf 0.00354986, total time[s] 0.066004 +Converged at iteration 28, L1 7.04344e-05, Linf 0.0031875, total time[s] 0.077095 +Converged at iteration 30, L1 5.94302e-05, Linf 0.00446108, total time[s] 0.078472 +Converged at iteration 28, L1 7.23087e-05, Linf 0.00246337, total time[s] 0.073175 +Converged at iteration 29, L1 8.67117e-05, Linf 0.00420221, total time[s] 0.085948 +Converged at iteration 30, L1 6.22204e-05, Linf 0.00214758, total time[s] 0.106301 +Converged at iteration 28, L1 8.33796e-05, Linf 0.0019983, total time[s] 0.108698 +Converged at iteration 32, L1 9.66206e-05, Linf 0.0075234, total time[s] 0.085787 +Converged at iteration 26, L1 8.81494e-05, Linf 0.00332394, total time[s] 0.074484 +Converged at iteration 25, L1 9.09621e-05, Linf 0.00255998, total time[s] 0.070793 +Converged at iteration 23, L1 7.71509e-05, Linf 0.00311748, total time[s] 0.078628 +Converged at iteration 39, L1 5.99545e-05, Linf 0.00736249, total time[s] 0.167505 +Converged at iteration 36, L1 6.50866e-05, Linf 0.00649792, total time[s] 0.096056 +Converged at iteration 24, L1 8.96926e-05, Linf 0.00281411, total time[s] 0.071928 +Converged at iteration 30, L1 9.51327e-05, Linf 0.0062035, total time[s] 0.081267 +Converged at iteration 25, L1 6.21987e-05, Linf 0.00512461, total time[s] 0.067111 +Converged at iteration 21, L1 7.87043e-05, Linf 0.00455853, total time[s] 0.058039 +Converged at iteration 19, L1 6.78046e-05, Linf 0.0054224, total time[s] 0.052618 +Converged at iteration 21, L1 3.78227e-05, Linf 0.00312773, total time[s] 0.057107 +Converged at iteration 23, L1 9.94506e-05, Linf 0.00409699, total time[s] 0.061928 +Converged at iteration 24, L1 6.35675e-05, Linf 0.00736617, total time[s] 0.064143 +Converged at iteration 20, L1 5.20089e-05, Linf 0.0051624, total time[s] 0.054861 +Converged at iteration 17, L1 5.49031e-05, Linf 0.00199514, total time[s] 0.048085 +Converged at iteration 32, L1 5.76497e-05, Linf 0.0027508, total time[s] 0.083415 +Converged at iteration 19, L1 9.83225e-05, Linf 0.00646353, total time[s] 0.052141 +Converged at iteration 23, L1 7.43974e-05, Linf 0.00583054, total time[s] 0.067099 +Converged at iteration 26, L1 9.39611e-05, Linf 0.0049515, total time[s] 0.069018 +Converged at iteration 23, L1 7.66212e-05, Linf 0.00491614, total time[s] 0.062182 +Converged at iteration 20, L1 9.14938e-05, Linf 0.00441827, total time[s] 0.053608 +Converged at iteration 23, L1 7.68121e-05, Linf 0.00287264, total time[s] 0.062735 +Converged at iteration 25, L1 8.58756e-05, Linf 0.00349795, total time[s] 0.066612 +Converged at iteration 28, L1 6.88132e-05, Linf 0.00313656, total time[s] 0.074049 +Converged at iteration 30, L1 6.00146e-05, Linf 0.00435342, total time[s] 0.078253 +Converged at iteration 28, L1 7.32693e-05, Linf 0.00251994, total time[s] 0.073645 +Converged at iteration 29, L1 8.72485e-05, Linf 0.00426386, total time[s] 0.075381 +Converged at iteration 30, L1 5.99765e-05, Linf 0.00213645, total time[s] 0.077998 +Converged at iteration 28, L1 8.25951e-05, Linf 0.00188109, total time[s] 0.073822 +Converged at iteration 32, L1 9.56321e-05, Linf 0.00761831, total time[s] 0.0833 +Converged at iteration 26, L1 8.51466e-05, Linf 0.00322394, total time[s] 0.0689 +Converged at iteration 25, L1 9.1854e-05, Linf 0.00262348, total time[s] 0.067753 +Converged at iteration 23, L1 7.57171e-05, Linf 0.00301867, total time[s] 0.061614 +Converged at iteration 39, L1 6.08796e-05, Linf 0.00731124, total time[s] 0.099139 +Converged at iteration 36, L1 6.54136e-05, Linf 0.00642255, total time[s] 0.09313 +Converged at iteration 24, L1 8.99701e-05, Linf 0.00277493, total time[s] 0.064254 +Converged at iteration 30, L1 9.5512e-05, Linf 0.00619394, total time[s] 0.082292 +Converged at iteration 25, L1 6.34834e-05, Linf 0.00516594, total time[s] 0.071279 +Converged at iteration 21, L1 7.74944e-05, Linf 0.00449499, total time[s] 0.059434 +Converged at iteration 19, L1 6.81849e-05, Linf 0.00538981, total time[s] 0.052902 +Converged at iteration 21, L1 3.78517e-05, Linf 0.00310804, total time[s] 0.070581 +Converged at iteration 24, L1 5.09967e-05, Linf 0.00271299, total time[s] 0.065021 +Converged at iteration 24, L1 6.35511e-05, Linf 0.00456421, total time[s] 0.063473 +Converged at iteration 20, L1 5.25786e-05, Linf 0.00512361, total time[s] 0.054106 +Converged at iteration 17, L1 5.50256e-05, Linf 0.00201771, total time[s] 0.048461 +Converged at iteration 32, L1 5.79553e-05, Linf 0.00274541, total time[s] 0.086747 +Converged at iteration 19, L1 9.81516e-05, Linf 0.0064695, total time[s] 0.051799 +Converged at iteration 23, L1 7.4883e-05, Linf 0.00594347, total time[s] 0.061826 +Converged at iteration 26, L1 9.48328e-05, Linf 0.00498978, total time[s] 0.072061 +Converged at iteration 23, L1 7.58596e-05, Linf 0.00499099, total time[s] 0.061573 +Converged at iteration 20, L1 9.15719e-05, Linf 0.00451628, total time[s] 0.057479 +Converged at iteration 23, L1 7.68194e-05, Linf 0.00287507, total time[s] 0.065699 +Converged at iteration 25, L1 8.63298e-05, Linf 0.00352097, total time[s] 0.066927 +Converged at iteration 28, L1 6.95861e-05, Linf 0.00315982, total time[s] 0.073117 +Converged at iteration 30, L1 5.97477e-05, Linf 0.00443831, total time[s] 0.078492 +Converged at iteration 28, L1 7.27574e-05, Linf 0.00249849, total time[s] 0.073429 +Converged at iteration 29, L1 8.66535e-05, Linf 0.00422952, total time[s] 0.07768 +Converged at iteration 30, L1 6.03389e-05, Linf 0.00214395, total time[s] 0.078381 +Converged at iteration 28, L1 8.2817e-05, Linf 0.00193086, total time[s] 0.073277 +Converged at iteration 32, L1 9.60876e-05, Linf 0.00747901, total time[s] 0.082237 +Converged at iteration 26, L1 8.6633e-05, Linf 0.00327491, total time[s] 0.068999 +Converged at iteration 25, L1 9.14381e-05, Linf 0.00259219, total time[s] 0.067964 +Converged at iteration 23, L1 7.64076e-05, Linf 0.0030767, total time[s] 0.06178 +Converged at iteration 39, L1 5.97563e-05, Linf 0.00737507, total time[s] 0.104572 +Converged at iteration 36, L1 6.50186e-05, Linf 0.00651319, total time[s] 0.094709 +Converged at iteration 24, L1 8.96796e-05, Linf 0.00281846, total time[s] 0.065242 +Converged at iteration 30, L1 9.58813e-05, Linf 0.00619611, total time[s] 0.079301 +Converged at iteration 25, L1 6.19244e-05, Linf 0.00511649, total time[s] 0.066015 +Converged at iteration 21, L1 7.89684e-05, Linf 0.00457138, total time[s] 0.057916 +Converged at iteration 19, L1 6.77309e-05, Linf 0.00549223, total time[s] 0.056506 +Converged at iteration 21, L1 3.77798e-05, Linf 0.00312987, total time[s] 0.057106 +Converged at iteration 23, L1 9.90343e-05, Linf 0.00408795, total time[s] 0.063295 +Converged at iteration 24, L1 6.17729e-05, Linf 0.00450947, total time[s] 0.07323 +Converged at iteration 20, L1 5.20069e-05, Linf 0.00510206, total time[s] 0.058198 +Converged at iteration 17, L1 5.51432e-05, Linf 0.00199035, total time[s] 0.047319 +Converged at iteration 32, L1 5.75811e-05, Linf 0.00275161, total time[s] 0.083846 +Converged at iteration 19, L1 9.81123e-05, Linf 0.00645756, total time[s] 0.052599 +Converged at iteration 23, L1 7.4338e-05, Linf 0.0058035, total time[s] 0.061199 +Converged at iteration 26, L1 9.38555e-05, Linf 0.00494733, total time[s] 0.070122 +Converged at iteration 23, L1 7.67885e-05, Linf 0.00490036, total time[s] 0.08289 +Converged at iteration 20, L1 9.14597e-05, Linf 0.00439899, total time[s] 0.05828 +Converged at iteration 23, L1 7.68447e-05, Linf 0.00287894, total time[s] 0.06266 +Converged at iteration 25, L1 8.59332e-05, Linf 0.00349291, total time[s] 0.068253 +Converged at iteration 28, L1 6.86682e-05, Linf 0.0031322, total time[s] 0.073723 +Converged at iteration 30, L1 6.00909e-05, Linf 0.00433972, total time[s] 0.078452 +Converged at iteration 28, L1 7.33797e-05, Linf 0.00255309, total time[s] 0.073876 +Converged at iteration 29, L1 8.7303e-05, Linf 0.00427171, total time[s] 0.075153 +Converged at iteration 30, L1 5.99209e-05, Linf 0.00213473, total time[s] 0.078271 +Converged at iteration 28, L1 8.26626e-05, Linf 0.00187487, total time[s] 0.073152 +Converged at iteration 32, L1 9.55425e-05, Linf 0.00762762, total time[s] 0.085239 +Converged at iteration 26, L1 8.56676e-05, Linf 0.00321468, total time[s] 0.071699 +Converged at iteration 25, L1 9.1965e-05, Linf 0.00262999, total time[s] 0.06697 +Converged at iteration 23, L1 7.55945e-05, Linf 0.0030099, total time[s] 0.061971 +Converged at iteration 39, L1 5.84595e-05, Linf 0.00744728, total time[s] 0.099405 +Converged at iteration 36, L1 6.44274e-05, Linf 0.00655493, total time[s] 0.096627 +Converged at iteration 24, L1 8.94822e-05, Linf 0.00287707, total time[s] 0.066714 +Converged at iteration 30, L1 9.45127e-05, Linf 0.00618937, total time[s] 0.078583 +Converged at iteration 25, L1 6.01152e-05, Linf 0.00505722, total time[s] 0.074885 +Converged at iteration 21, L1 8.0724e-05, Linf 0.00466169, total time[s] 0.05664 +Converged at iteration 19, L1 6.73452e-05, Linf 0.00562092, total time[s] 0.053565 +Converged at iteration 21, L1 3.77957e-05, Linf 0.00311912, total time[s] 0.05737 +Converged at iteration 23, L1 9.64643e-05, Linf 0.00436464, total time[s] 0.066417 +Converged at iteration 24, L1 5.95416e-05, Linf 0.00449224, total time[s] 0.066705 +Converged at iteration 20, L1 5.11365e-05, Linf 0.00504269, total time[s] 0.056886 +Converged at iteration 17, L1 5.46577e-05, Linf 0.00195361, total time[s] 0.048365 +Converged at iteration 32, L1 5.70708e-05, Linf 0.00275719, total time[s] 0.08189 +Converged at iteration 19, L1 9.79894e-05, Linf 0.00639711, total time[s] 0.051138 +Converged at iteration 23, L1 7.37685e-05, Linf 0.00563478, total time[s] 0.061632 +Converged at iteration 26, L1 9.37401e-05, Linf 0.00491121, total time[s] 0.068037 +Converged at iteration 23, L1 7.78707e-05, Linf 0.0047943, total time[s] 0.060531 +Converged at iteration 20, L1 9.15547e-05, Linf 0.00425848, total time[s] 0.053235 +Converged at iteration 23, L1 7.70804e-05, Linf 0.0028769, total time[s] 0.062885 +Converged at iteration 25, L1 8.54157e-05, Linf 0.00346522, total time[s] 0.065586 +Converged at iteration 28, L1 6.75453e-05, Linf 0.00310519, total time[s] 0.076629 +Converged at iteration 30, L1 6.06304e-05, Linf 0.00424078, total time[s] 0.080168 +Converged at iteration 28, L1 7.42633e-05, Linf 0.00292523, total time[s] 0.072872 +Converged at iteration 29, L1 8.79411e-05, Linf 0.00432908, total time[s] 0.074683 +Converged at iteration 30, L1 5.94796e-05, Linf 0.00212134, total time[s] 0.078887 +Converged at iteration 28, L1 8.32593e-05, Linf 0.00183062, total time[s] 0.072151 +Converged at iteration 32, L1 9.5003e-05, Linf 0.00769539, total time[s] 0.081497 +Converged at iteration 26, L1 8.37442e-05, Linf 0.00314018, total time[s] 0.068597 +Converged at iteration 25, L1 9.25566e-05, Linf 0.00267357, total time[s] 0.068638 +Converged at iteration 23, L1 7.46469e-05, Linf 0.00295413, total time[s] 0.061378 +Converged at iteration 39, L1 5.70422e-05, Linf 0.00753091, total time[s] 0.09742 +Converged at iteration 36, L1 6.37049e-05, Linf 0.00673935, total time[s] 0.093389 +Converged at iteration 24, L1 8.93178e-05, Linf 0.00293951, total time[s] 0.062833 +Converged at iteration 30, L1 9.32782e-05, Linf 0.00617657, total time[s] 0.077712 +Converged at iteration 25, L1 5.81775e-05, Linf 0.00498679, total time[s] 0.066557 +Converged at iteration 21, L1 8.26867e-05, Linf 0.00476815, total time[s] 0.056339 +Converged at iteration 19, L1 6.68435e-05, Linf 0.00577317, total time[s] 0.05265 +Converged at iteration 21, L1 3.79935e-05, Linf 0.00309303, total time[s] 0.056171 +Converged at iteration 23, L1 9.38115e-05, Linf 0.00404965, total time[s] 0.062169 +Converged at iteration 24, L1 5.72145e-05, Linf 0.00444465, total time[s] 0.063779 +Converged at iteration 20, L1 5.03914e-05, Linf 0.00498841, total time[s] 0.054684 +Converged at iteration 17, L1 5.45302e-05, Linf 0.0019042, total time[s] 0.046324 +Converged at iteration 32, L1 5.64653e-05, Linf 0.00276391, total time[s] 0.084332 +Converged at iteration 19, L1 9.77421e-05, Linf 0.00631148, total time[s] 0.051285 +Converged at iteration 23, L1 7.36751e-05, Linf 0.00544077, total time[s] 0.060812 +Converged at iteration 26, L1 9.3371e-05, Linf 0.00487734, total time[s] 0.069076 +Converged at iteration 23, L1 7.87477e-05, Linf 0.00466209, total time[s] 0.06153 +Converged at iteration 20, L1 9.15663e-05, Linf 0.00413356, total time[s] 0.05382 +Converged at iteration 23, L1 7.74405e-05, Linf 0.00287068, total time[s] 0.0625 +Converged at iteration 25, L1 8.48751e-05, Linf 0.00343458, total time[s] 0.068401 +Converged at iteration 27, L1 9.97847e-05, Linf 0.00399673, total time[s] 0.070156 +Converged at iteration 30, L1 6.13563e-05, Linf 0.00416217, total time[s] 0.078833 +Converged at iteration 28, L1 7.55306e-05, Linf 0.00358342, total time[s] 0.072472 +Converged at iteration 29, L1 8.87182e-05, Linf 0.00439147, total time[s] 0.074437 +Converged at iteration 29, L1 9.98703e-05, Linf 0.00275401, total time[s] 0.076502 +Converged at iteration 28, L1 8.49952e-05, Linf 0.00178385, total time[s] 0.072169 +Converged at iteration 32, L1 9.41527e-05, Linf 0.00778043, total time[s] 0.085805 +Converged at iteration 26, L1 8.10042e-05, Linf 0.0030481, total time[s] 0.068008 +Converged at iteration 25, L1 9.31659e-05, Linf 0.00272422, total time[s] 0.065228 +Converged at iteration 23, L1 7.3935e-05, Linf 0.00289638, total time[s] 0.06064 +Converged at iteration 39, L1 5.49611e-05, Linf 0.00762491, total time[s] 0.105495 +Converged at iteration 36, L1 6.26398e-05, Linf 0.00696833, total time[s] 0.097454 +Converged at iteration 24, L1 8.90973e-05, Linf 0.00300686, total time[s] 0.068648 +Converged at iteration 30, L1 9.22099e-05, Linf 0.00618581, total time[s] 0.079967 +Converged at iteration 25, L1 5.60247e-05, Linf 0.00490312, total time[s] 0.065265 +Converged at iteration 21, L1 8.49102e-05, Linf 0.00489371, total time[s] 0.057305 +Converged at iteration 19, L1 6.64156e-05, Linf 0.00596364, total time[s] 0.051021 +Converged at iteration 21, L1 3.84799e-05, Linf 0.00312984, total time[s] 0.057044 +Converged at iteration 23, L1 9.09253e-05, Linf 0.00389251, total time[s] 0.063826 +Converged at iteration 24, L1 5.46778e-05, Linf 0.00438334, total time[s] 0.065269 +Converged at iteration 20, L1 4.89588e-05, Linf 0.00492188, total time[s] 0.053766 +Converged at iteration 17, L1 5.43077e-05, Linf 0.00183779, total time[s] 0.086497 +Converged at iteration 32, L1 5.56963e-05, Linf 0.00279903, total time[s] 0.082839 +Converged at iteration 19, L1 9.75643e-05, Linf 0.00603414, total time[s] 0.050304 +Converged at iteration 23, L1 7.28887e-05, Linf 0.00522602, total time[s] 0.06222 +Converged at iteration 26, L1 9.3567e-05, Linf 0.00485362, total time[s] 0.066437 +Converged at iteration 23, L1 7.96259e-05, Linf 0.00450746, total time[s] 0.059579 +Converged at iteration 20, L1 9.19978e-05, Linf 0.00400665, total time[s] 0.05507 +Converged at iteration 23, L1 7.77614e-05, Linf 0.00287234, total time[s] 0.060934 +Converged at iteration 25, L1 8.45755e-05, Linf 0.00339684, total time[s] 0.064981 +Converged at iteration 27, L1 9.73903e-05, Linf 0.00385682, total time[s] 0.069508 +Converged at iteration 30, L1 6.25735e-05, Linf 0.00416844, total time[s] 0.077051 +Converged at iteration 28, L1 7.72548e-05, Linf 0.00426757, total time[s] 0.072499 +Converged at iteration 29, L1 8.96031e-05, Linf 0.00445287, total time[s] 0.075953 +Converged at iteration 29, L1 9.97149e-05, Linf 0.0027652, total time[s] 0.0743 +Converged at iteration 28, L1 8.82778e-05, Linf 0.00170895, total time[s] 0.071916 +Converged at iteration 32, L1 9.32805e-05, Linf 0.00788244, total time[s] 0.082903 +Converged at iteration 26, L1 7.74507e-05, Linf 0.00293429, total time[s] 0.070673 +Converged at iteration 25, L1 9.41619e-05, Linf 0.00279502, total time[s] 0.067672 +Converged at iteration 23, L1 7.28962e-05, Linf 0.00285583, total time[s] 0.061416 +Converged at iteration 39, L1 5.58826e-05, Linf 0.00757629, total time[s] 0.101523 +Converged at iteration 36, L1 6.35283e-05, Linf 0.00680845, total time[s] 0.094125 +Converged at iteration 24, L1 8.91355e-05, Linf 0.00297416, total time[s] 0.06292 +Converged at iteration 30, L1 9.27398e-05, Linf 0.00617748, total time[s] 0.07846 +Converged at iteration 25, L1 5.69053e-05, Linf 0.00494726, total time[s] 0.065363 +Converged at iteration 21, L1 8.42652e-05, Linf 0.00483112, total time[s] 0.058939 +Converged at iteration 19, L1 6.66023e-05, Linf 0.00586806, total time[s] 0.051327 +Converged at iteration 21, L1 3.82574e-05, Linf 0.0031226, total time[s] 0.05586 +Converged at iteration 23, L1 9.22882e-05, Linf 0.00393161, total time[s] 0.060254 +Converged at iteration 24, L1 5.57889e-05, Linf 0.0044144, total time[s] 0.06437 +Converged at iteration 20, L1 4.97305e-05, Linf 0.00495533, total time[s] 0.053727 +Converged at iteration 17, L1 5.44843e-05, Linf 0.00187184, total time[s] 0.046811 +Converged at iteration 32, L1 5.6058e-05, Linf 0.00277001, total time[s] 0.082252 +Converged at iteration 19, L1 9.76811e-05, Linf 0.00625651, total time[s] 0.051451 +Converged at iteration 23, L1 7.26614e-05, Linf 0.00533018, total time[s] 0.061914 +Converged at iteration 26, L1 9.35906e-05, Linf 0.00486305, total time[s] 0.067745 +Converged at iteration 23, L1 7.92491e-05, Linf 0.00458124, total time[s] 0.060534 +Converged at iteration 20, L1 9.17801e-05, Linf 0.00407419, total time[s] 0.053461 +Converged at iteration 23, L1 7.75982e-05, Linf 0.00287131, total time[s] 0.061299 +Converged at iteration 25, L1 8.47499e-05, Linf 0.00341591, total time[s] 0.065308 +Converged at iteration 27, L1 9.85682e-05, Linf 0.00392281, total time[s] 0.070526 +Converged at iteration 30, L1 6.18392e-05, Linf 0.00415843, total time[s] 0.077129 +Converged at iteration 28, L1 7.64496e-05, Linf 0.00424188, total time[s] 0.071974 +Converged at iteration 29, L1 8.97781e-05, Linf 0.00442224, total time[s] 0.074582 +Converged at iteration 29, L1 9.97813e-05, Linf 0.00276008, total time[s] 0.074812 +Converged at iteration 28, L1 8.64347e-05, Linf 0.00174896, total time[s] 0.072754 +Converged at iteration 32, L1 9.37124e-05, Linf 0.00783164, total time[s] 0.083374 +Converged at iteration 26, L1 7.88393e-05, Linf 0.00299205, total time[s] 0.068742 +Converged at iteration 25, L1 9.37591e-05, Linf 0.0027569, total time[s] 0.065259 +Converged at iteration 23, L1 7.33482e-05, Linf 0.00287263, total time[s] 0.060651 +Converged at iteration 39, L1 5.4789e-05, Linf 0.00763527, total time[s] 0.105579 +Converged at iteration 36, L1 6.24805e-05, Linf 0.00688724, total time[s] 0.092338 +Converged at iteration 24, L1 8.91356e-05, Linf 0.00301291, total time[s] 0.063037 +Converged at iteration 30, L1 9.20981e-05, Linf 0.00618829, total time[s] 0.077257 +Converged at iteration 25, L1 5.54272e-05, Linf 0.00489482, total time[s] 0.065712 +Converged at iteration 21, L1 8.50693e-05, Linf 0.00490639, total time[s] 0.054282 +Converged at iteration 19, L1 6.64325e-05, Linf 0.00598334, total time[s] 0.059902 +Converged at iteration 21, L1 3.85223e-05, Linf 0.00313056, total time[s] 0.061169 +Converged at iteration 23, L1 9.06733e-05, Linf 0.00388478, total time[s] 0.059658 +Converged at iteration 24, L1 5.49228e-05, Linf 0.00437682, total time[s] 0.061471 +Converged at iteration 20, L1 4.88613e-05, Linf 0.00491513, total time[s] 0.053834 +Converged at iteration 17, L1 5.42642e-05, Linf 0.00183071, total time[s] 0.046388 +Converged at iteration 32, L1 5.56147e-05, Linf 0.00281002, total time[s] 0.085462 +Converged at iteration 19, L1 9.76253e-05, Linf 0.00622334, total time[s] 0.049764 +Converged at iteration 23, L1 7.24864e-05, Linf 0.00520564, total time[s] 0.061889 +Converged at iteration 26, L1 9.351e-05, Linf 0.00483851, total time[s] 0.072308 +Converged at iteration 23, L1 7.97558e-05, Linf 0.00449589, total time[s] 0.060582 +Converged at iteration 20, L1 9.21299e-05, Linf 0.00399125, total time[s] 0.054483 +Converged at iteration 23, L1 7.78093e-05, Linf 0.00287268, total time[s] 0.061572 +Converged at iteration 25, L1 8.45385e-05, Linf 0.00339273, total time[s] 0.065182 +Converged at iteration 27, L1 9.71697e-05, Linf 0.00384446, total time[s] 0.07076 +Converged at iteration 30, L1 6.27713e-05, Linf 0.00415481, total time[s] 0.07869 +Converged at iteration 28, L1 7.7467e-05, Linf 0.0042497, total time[s] 0.072209 +Converged at iteration 29, L1 8.96786e-05, Linf 0.00445956, total time[s] 0.074906 +Converged at iteration 29, L1 9.97247e-05, Linf 0.002766, total time[s] 0.075028 +Converged at iteration 28, L1 8.86901e-05, Linf 0.00170006, total time[s] 0.076519 +Converged at iteration 32, L1 9.32439e-05, Linf 0.00789284, total time[s] 0.08318 +Converged at iteration 26, L1 7.71618e-05, Linf 0.00292281, total time[s] 0.069203 +Converged at iteration 25, L1 9.38185e-05, Linf 0.00280303, total time[s] 0.066605 +Converged at iteration 23, L1 7.28034e-05, Linf 0.00285055, total time[s] 0.060598 +Converged at iteration 39, L1 5.33911e-05, Linf 0.00770369, total time[s] 0.10335 +Converged at iteration 36, L1 6.16172e-05, Linf 0.00697772, total time[s] 0.097413 +Converged at iteration 24, L1 8.91031e-05, Linf 0.00305523, total time[s] 0.062405 +Converged at iteration 30, L1 9.12772e-05, Linf 0.00620768, total time[s] 0.082946 +Converged at iteration 24, L1 9.79802e-05, Linf 0.00591941, total time[s] 0.083924 +Converged at iteration 21, L1 8.69147e-05, Linf 0.00499568, total time[s] 0.055901 +Converged at iteration 19, L1 6.61316e-05, Linf 0.00612224, total time[s] 0.051514 +Converged at iteration 21, L1 3.8723e-05, Linf 0.00312165, total time[s] 0.05484 +Converged at iteration 23, L1 8.8654e-05, Linf 0.00384006, total time[s] 0.060056 +Converged at iteration 24, L1 5.30916e-05, Linf 0.00432952, total time[s] 0.060946 +Converged at iteration 20, L1 4.85111e-05, Linf 0.00486621, total time[s] 0.054111 +Converged at iteration 17, L1 5.40956e-05, Linf 0.00177833, total time[s] 0.045036 +Converged at iteration 32, L1 5.51652e-05, Linf 0.00288853, total time[s] 0.083144 +Converged at iteration 19, L1 9.7537e-05, Linf 0.00610091, total time[s] 0.050409 +Converged at iteration 23, L1 7.18325e-05, Linf 0.00547354, total time[s] 0.059132 +Converged at iteration 26, L1 9.24794e-05, Linf 0.00486213, total time[s] 0.066046 +Converged at iteration 23, L1 8.04459e-05, Linf 0.00438996, total time[s] 0.060383 +Converged at iteration 20, L1 9.26769e-05, Linf 0.00388668, total time[s] 0.052205 +Converged at iteration 23, L1 7.82546e-05, Linf 0.00287064, total time[s] 0.064948 +Converged at iteration 25, L1 8.45378e-05, Linf 0.00334981, total time[s] 0.065203 +Converged at iteration 27, L1 9.5605e-05, Linf 0.00376924, total time[s] 0.069418 +Converged at iteration 30, L1 6.39233e-05, Linf 0.00416206, total time[s] 0.076762 +Converged at iteration 28, L1 7.97474e-05, Linf 0.0042455, total time[s] 0.089783 +Converged at iteration 29, L1 9.03061e-05, Linf 0.00450589, total time[s] 0.07225 +Converged at iteration 29, L1 9.97852e-05, Linf 0.00276771, total time[s] 0.074014 +Converged at iteration 28, L1 9.18387e-05, Linf 0.00162664, total time[s] 0.071686 +Converged at iteration 32, L1 9.26327e-05, Linf 0.00796823, total time[s] 0.080089 +Converged at iteration 26, L1 7.51464e-05, Linf 0.00283936, total time[s] 0.065808 +Converged at iteration 25, L1 9.42214e-05, Linf 0.00285808, total time[s] 0.063524 +Converged at iteration 23, L1 7.22696e-05, Linf 0.00281622, total time[s] 0.058944 +Converged at iteration 39, L1 5.18869e-05, Linf 0.00778436, total time[s] 0.102389 +Converged at iteration 36, L1 6.07557e-05, Linf 0.00695276, total time[s] 0.100197 +Converged at iteration 24, L1 8.92232e-05, Linf 0.00312411, total time[s] 0.078538 +Converged at iteration 30, L1 9.40523e-05, Linf 0.00905288, total time[s] 0.077102 +Converged at iteration 24, L1 9.50206e-05, Linf 0.00586841, total time[s] 0.070427 +Converged at iteration 21, L1 8.80219e-05, Linf 0.00510119, total time[s] 0.056255 +Converged at iteration 19, L1 6.60737e-05, Linf 0.00628902, total time[s] 0.050163 +Converged at iteration 21, L1 3.91642e-05, Linf 0.00309331, total time[s] 0.055692 +Converged at iteration 23, L1 8.5986e-05, Linf 0.003795, total time[s] 0.064905 +Converged at iteration 23, L1 9.702e-05, Linf 0.00556833, total time[s] 0.060417 +Converged at iteration 20, L1 4.73695e-05, Linf 0.00480654, total time[s] 0.053836 +Converged at iteration 17, L1 5.39018e-05, Linf 0.00171147, total time[s] 0.046403 +Converged at iteration 32, L1 5.46333e-05, Linf 0.0029809, total time[s] 0.081368 +Converged at iteration 19, L1 9.74485e-05, Linf 0.00599196, total time[s] 0.049889 +Converged at iteration 23, L1 7.11839e-05, Linf 0.00491928, total time[s] 0.062938 +Converged at iteration 26, L1 9.21314e-05, Linf 0.00490219, total time[s] 0.068458 +Converged at iteration 23, L1 8.16824e-05, Linf 0.00432383, total time[s] 0.060395 +Converged at iteration 20, L1 9.33916e-05, Linf 0.00375712, total time[s] 0.053213 +Converged at iteration 23, L1 7.80932e-05, Linf 0.00287829, total time[s] 0.060153 +Converged at iteration 25, L1 8.387e-05, Linf 0.00331991, total time[s] 0.065666 +Converged at iteration 27, L1 9.36031e-05, Linf 0.00369937, total time[s] 0.069628 +Converged at iteration 30, L1 6.5511e-05, Linf 0.00421442, total time[s] 0.076488 +Converged at iteration 28, L1 7.98841e-05, Linf 0.00426894, total time[s] 0.071878 +Converged at iteration 29, L1 9.09686e-05, Linf 0.00454862, total time[s] 0.074058 +Converged at iteration 29, L1 9.98915e-05, Linf 0.00276574, total time[s] 0.075058 +Converged at iteration 28, L1 9.61479e-05, Linf 0.00167469, total time[s] 0.072053 +Converged at iteration 32, L1 9.19373e-05, Linf 0.00805991, total time[s] 0.081574 +Converged at iteration 26, L1 7.28545e-05, Linf 0.00273785, total time[s] 0.067809 +Converged at iteration 25, L1 9.47195e-05, Linf 0.00292423, total time[s] 0.065339 +Converged at iteration 23, L1 7.14866e-05, Linf 0.00278168, total time[s] 0.062914 +Converged at iteration 39, L1 4.98733e-05, Linf 0.00787773, total time[s] 0.102143 +Converged at iteration 36, L1 5.97152e-05, Linf 0.00719107, total time[s] 0.09246 +Converged at iteration 24, L1 8.92001e-05, Linf 0.00334368, total time[s] 0.062751 +Converged at iteration 30, L1 8.89145e-05, Linf 0.00622682, total time[s] 0.077266 +Converged at iteration 24, L1 9.20232e-05, Linf 0.00580432, total time[s] 0.063005 +Converged at iteration 21, L1 8.97341e-05, Linf 0.00522605, total time[s] 0.055829 +Converged at iteration 19, L1 6.59386e-05, Linf 0.00648981, total time[s] 0.051365 +Converged at iteration 21, L1 3.95028e-05, Linf 0.00305784, total time[s] 0.061702 +Converged at iteration 23, L1 8.35702e-05, Linf 0.00373858, total time[s] 0.060833 +Converged at iteration 23, L1 9.20994e-05, Linf 0.00550427, total time[s] 0.061374 +Converged at iteration 20, L1 4.68947e-05, Linf 0.00473381, total time[s] 0.053573 +Converged at iteration 17, L1 5.40401e-05, Linf 0.00162602, total time[s] 0.046499 +Converged at iteration 32, L1 5.39636e-05, Linf 0.00309224, total time[s] 0.082229 +Converged at iteration 19, L1 9.74498e-05, Linf 0.00614187, total time[s] 0.050614 +Converged at iteration 23, L1 7.07928e-05, Linf 0.00477779, total time[s] 0.061102 +Converged at iteration 26, L1 9.35068e-05, Linf 0.00495102, total time[s] 0.067483 +Converged at iteration 23, L1 8.33766e-05, Linf 0.00424522, total time[s] 0.060396 +Converged at iteration 20, L1 9.41359e-05, Linf 0.00360169, total time[s] 0.053213 +Converged at iteration 23, L1 7.84596e-05, Linf 0.00291521, total time[s] 0.06046 +Converged at iteration 25, L1 8.33329e-05, Linf 0.00329799, total time[s] 0.065394 +Converged at iteration 27, L1 9.12274e-05, Linf 0.00375454, total time[s] 0.071973 +Converged at iteration 30, L1 6.69545e-05, Linf 0.00432273, total time[s] 0.077069 +Converged at iteration 28, L1 8.09064e-05, Linf 0.00406534, total time[s] 0.072339 +Converged at iteration 29, L1 9.18237e-05, Linf 0.00461016, total time[s] 0.075524 +Converged at iteration 30, L1 5.81335e-05, Linf 0.00200901, total time[s] 0.077001 +Converged at iteration 29, L1 5.48384e-05, Linf 0.00111875, total time[s] 0.074552 +Converged at iteration 32, L1 9.11759e-05, Linf 0.00817158, total time[s] 0.081765 +Converged at iteration 26, L1 7.08909e-05, Linf 0.00261608, total time[s] 0.067412 +Converged at iteration 25, L1 9.52729e-05, Linf 0.00300082, total time[s] 0.065126 +Converged at iteration 23, L1 7.08228e-05, Linf 0.00276267, total time[s] 0.061872 +Converged at iteration 39, L1 5.08286e-05, Linf 0.00783195, total time[s] 0.144326 +Converged at iteration 36, L1 6.013e-05, Linf 0.00713564, total time[s] 0.093461 +Converged at iteration 24, L1 8.91804e-05, Linf 0.00325633, total time[s] 0.064645 +Converged at iteration 30, L1 8.95788e-05, Linf 0.0062255, total time[s] 0.076577 +Converged at iteration 24, L1 9.34774e-05, Linf 0.00583563, total time[s] 0.062655 +Converged at iteration 21, L1 8.89076e-05, Linf 0.00516403, total time[s] 0.05486 +Converged at iteration 19, L1 6.59817e-05, Linf 0.00638949, total time[s] 0.051801 +Converged at iteration 21, L1 3.92071e-05, Linf 0.00307113, total time[s] 0.056392 +Converged at iteration 23, L1 8.49395e-05, Linf 0.00376365, total time[s] 0.062154 +Converged at iteration 23, L1 9.45371e-05, Linf 0.00553665, total time[s] 0.060552 +Converged at iteration 20, L1 4.70993e-05, Linf 0.00484062, total time[s] 0.053515 +Converged at iteration 17, L1 5.38939e-05, Linf 0.00166939, total time[s] 0.044825 +Converged at iteration 32, L1 5.43061e-05, Linf 0.00303678, total time[s] 0.083899 +Converged at iteration 19, L1 9.7322e-05, Linf 0.00585819, total time[s] 0.051497 +Converged at iteration 23, L1 7.11442e-05, Linf 0.00529369, total time[s] 0.060579 +Converged at iteration 26, L1 9.27378e-05, Linf 0.00492583, total time[s] 0.067523 +Converged at iteration 23, L1 8.26142e-05, Linf 0.00428683, total time[s] 0.060668 +Converged at iteration 20, L1 9.38767e-05, Linf 0.00368032, total time[s] 0.053318 +Converged at iteration 23, L1 7.82505e-05, Linf 0.00291821, total time[s] 0.061072 +Converged at iteration 25, L1 8.36076e-05, Linf 0.0033178, total time[s] 0.06534 +Converged at iteration 27, L1 9.2408e-05, Linf 0.00366606, total time[s] 0.070561 +Converged at iteration 30, L1 6.63239e-05, Linf 0.00426024, total time[s] 0.07755 +Converged at iteration 28, L1 8.03977e-05, Linf 0.00420721, total time[s] 0.073868 +Converged at iteration 29, L1 9.1424e-05, Linf 0.0045776, total time[s] 0.074763 +Converged at iteration 30, L1 5.82465e-05, Linf 0.00201995, total time[s] 0.078047 +Converged at iteration 28, L1 9.91178e-05, Linf 0.00176932, total time[s] 0.07241 +Converged at iteration 32, L1 9.15498e-05, Linf 0.00811554, total time[s] 0.081408 +Converged at iteration 26, L1 7.15018e-05, Linf 0.00267581, total time[s] 0.067787 +Converged at iteration 25, L1 9.4994e-05, Linf 0.00296511, total time[s] 0.067371 +Converged at iteration 23, L1 7.12653e-05, Linf 0.0027649, total time[s] 0.061276 +Converged at iteration 39, L1 4.97836e-05, Linf 0.0078886, total time[s] 0.10356 +Converged at iteration 36, L1 6.00177e-05, Linf 0.0072019, total time[s] 0.093734 +Converged at iteration 24, L1 8.92328e-05, Linf 0.00335782, total time[s] 0.06305 +Converged at iteration 30, L1 8.87721e-05, Linf 0.00622781, total time[s] 0.078079 +Converged at iteration 24, L1 9.17422e-05, Linf 0.00579831, total time[s] 0.063953 +Converged at iteration 21, L1 9.03502e-05, Linf 0.00523866, total time[s] 0.05804 +Converged at iteration 19, L1 6.59435e-05, Linf 0.00651067, total time[s] 0.053081 +Converged at iteration 21, L1 3.95427e-05, Linf 0.00305945, total time[s] 0.060043 +Converged at iteration 23, L1 8.32193e-05, Linf 0.00373391, total time[s] 0.061263 +Converged at iteration 23, L1 9.15748e-05, Linf 0.00549752, total time[s] 0.060408 +Converged at iteration 20, L1 4.68149e-05, Linf 0.00472647, total time[s] 0.054805 +Converged at iteration 17, L1 5.40322e-05, Linf 0.0016171, total time[s] 0.046176 +Converged at iteration 32, L1 5.38516e-05, Linf 0.00310364, total time[s] 0.08182 +Converged at iteration 19, L1 9.74589e-05, Linf 0.00606865, total time[s] 0.051146 +Converged at iteration 23, L1 7.06356e-05, Linf 0.00480797, total time[s] 0.060011 +Converged at iteration 26, L1 9.36026e-05, Linf 0.00495634, total time[s] 0.071121 +Converged at iteration 23, L1 8.35706e-05, Linf 0.00423571, total time[s] 0.060011 +Converged at iteration 20, L1 9.42137e-05, Linf 0.00358687, total time[s] 0.063201 +Converged at iteration 23, L1 7.85359e-05, Linf 0.00291041, total time[s] 0.071034 +Converged at iteration 25, L1 8.33027e-05, Linf 0.00334529, total time[s] 0.067491 +Converged at iteration 27, L1 9.09599e-05, Linf 0.0036267, total time[s] 0.070711 +Converged at iteration 30, L1 6.70813e-05, Linf 0.00433861, total time[s] 0.077576 +Converged at iteration 28, L1 8.10429e-05, Linf 0.00403471, total time[s] 0.072626 +Converged at iteration 29, L1 9.19651e-05, Linf 0.00461785, total time[s] 0.078906 +Converged at iteration 30, L1 5.81132e-05, Linf 0.00200676, total time[s] 0.077421 +Converged at iteration 29, L1 5.5149e-05, Linf 0.00113156, total time[s] 0.076468 +Converged at iteration 32, L1 9.11157e-05, Linf 0.00818345, total time[s] 0.083236 +Converged at iteration 26, L1 7.00475e-05, Linf 0.00260442, total time[s] 0.069392 +Converged at iteration 25, L1 9.53417e-05, Linf 0.00300999, total time[s] 0.068798 +Converged at iteration 23, L1 7.07771e-05, Linf 0.00276421, total time[s] 0.061708 +Converged at iteration 39, L1 4.83119e-05, Linf 0.00795496, total time[s] 0.107867 +Converged at iteration 36, L1 5.90407e-05, Linf 0.00728013, total time[s] 0.097103 +Converged at iteration 24, L1 8.9139e-05, Linf 0.00377068, total time[s] 0.065098 +Converged at iteration 30, L1 8.77854e-05, Linf 0.00623041, total time[s] 0.079282 +Converged at iteration 24, L1 8.9679e-05, Linf 0.00575411, total time[s] 0.065301 +Converged at iteration 21, L1 9.1001e-05, Linf 0.00532735, total time[s] 0.058366 +Converged at iteration 19, L1 6.5922e-05, Linf 0.00666774, total time[s] 0.055181 +Converged at iteration 21, L1 3.98299e-05, Linf 0.00308934, total time[s] 0.057324 +Converged at iteration 23, L1 8.17401e-05, Linf 0.00370632, total time[s] 0.065928 +Converged at iteration 23, L1 8.85864e-05, Linf 0.00545649, total time[s] 0.062121 +Converged at iteration 20, L1 4.61448e-05, Linf 0.00467393, total time[s] 0.054613 +Converged at iteration 17, L1 5.44539e-05, Linf 0.00155197, total time[s] 0.04904 +Converged at iteration 32, L1 5.33979e-05, Linf 0.00318427, total time[s] 0.116168 +Converged at iteration 19, L1 9.73651e-05, Linf 0.00597121, total time[s] 0.054675 +Converged at iteration 23, L1 6.99194e-05, Linf 0.00465888, total time[s] 0.061496 +Converged at iteration 26, L1 9.29758e-05, Linf 0.0049784, total time[s] 0.075312 +Converged at iteration 23, L1 8.47615e-05, Linf 0.00417251, total time[s] 0.062908 +Converged at iteration 20, L1 9.45077e-05, Linf 0.00347407, total time[s] 0.055824 +Converged at iteration 23, L1 7.89156e-05, Linf 0.00288702, total time[s] 0.06277 +Converged at iteration 25, L1 8.28579e-05, Linf 0.00326514, total time[s] 0.066417 +Converged at iteration 27, L1 8.92098e-05, Linf 0.00358194, total time[s] 0.072038 +Converged at iteration 30, L1 6.81681e-05, Linf 0.00445148, total time[s] 0.078498 +Converged at iteration 28, L1 8.15213e-05, Linf 0.0039266, total time[s] 0.074868 +Converged at iteration 29, L1 9.25801e-05, Linf 0.00467225, total time[s] 0.076529 +Converged at iteration 30, L1 5.79072e-05, Linf 0.00198798, total time[s] 0.079713 +Converged at iteration 29, L1 5.75145e-05, Linf 0.00121572, total time[s] 0.076244 +Converged at iteration 32, L1 9.05978e-05, Linf 0.0082651, total time[s] 0.083697 +Converged at iteration 26, L1 6.82259e-05, Linf 0.00251753, total time[s] 0.06969 +Converged at iteration 25, L1 9.57903e-05, Linf 0.00306941, total time[s] 0.068392 +Converged at iteration 23, L1 7.04882e-05, Linf 0.00276669, total time[s] 0.062385 +Converged at iteration 38, L1 9.93544e-05, Linf 0.00987856, total time[s] 0.109871 +Converged at iteration 36, L1 5.81545e-05, Linf 0.00746247, total time[s] 0.091382 +Converged at iteration 24, L1 8.91436e-05, Linf 0.00392871, total time[s] 0.065404 +Converged at iteration 30, L1 8.65623e-05, Linf 0.00621451, total time[s] 0.079406 +Converged at iteration 24, L1 8.73681e-05, Linf 0.00570194, total time[s] 0.065035 +Converged at iteration 21, L1 9.22687e-05, Linf 0.0054319, total time[s] 0.058478 +Converged at iteration 19, L1 6.59977e-05, Linf 0.00695741, total time[s] 0.054177 +Converged at iteration 21, L1 4.02247e-05, Linf 0.00305432, total time[s] 0.05801 +Converged at iteration 23, L1 8.07492e-05, Linf 0.00367312, total time[s] 0.062584 +Converged at iteration 23, L1 8.44949e-05, Linf 0.00538703, total time[s] 0.06366 +Converged at iteration 20, L1 4.58773e-05, Linf 0.00455916, total time[s] 0.058572 +Converged at iteration 17, L1 5.44608e-05, Linf 0.00147056, total time[s] 0.046392 +Converged at iteration 32, L1 5.29447e-05, Linf 0.00328074, total time[s] 0.085605 +Converged at iteration 19, L1 9.76038e-05, Linf 0.00572841, total time[s] 0.052723 +Converged at iteration 23, L1 6.98292e-05, Linf 0.0045567, total time[s] 0.06649 +Converged at iteration 26, L1 9.12428e-05, Linf 0.0049884, total time[s] 0.068927 +Converged at iteration 23, L1 8.63353e-05, Linf 0.00408464, total time[s] 0.063215 +Converged at iteration 20, L1 9.51548e-05, Linf 0.00334381, total time[s] 0.054792 +Converged at iteration 23, L1 7.90067e-05, Linf 0.00289108, total time[s] 0.062423 +Converged at iteration 25, L1 8.2228e-05, Linf 0.00323511, total time[s] 0.066724 +Converged at iteration 27, L1 8.78393e-05, Linf 0.00473532, total time[s] 0.072397 +Converged at iteration 30, L1 6.92386e-05, Linf 0.00458587, total time[s] 0.079786 +Converged at iteration 28, L1 8.22251e-05, Linf 0.00379709, total time[s] 0.408768 +Converged at iteration 29, L1 9.34921e-05, Linf 0.00473939, total time[s] 0.099359 +Converged at iteration 30, L1 5.75912e-05, Linf 0.00195888, total time[s] 0.077201 +Converged at iteration 29, L1 6.0638e-05, Linf 0.00138393, total time[s] 0.075121 +Converged at iteration 32, L1 9.00205e-05, Linf 0.00836488, total time[s] 0.081745 +Converged at iteration 26, L1 6.60665e-05, Linf 0.00241583, total time[s] 0.069834 +Converged at iteration 25, L1 9.6319e-05, Linf 0.00313737, total time[s] 0.065417 +Converged at iteration 23, L1 7.02605e-05, Linf 0.00276444, total time[s] 0.061532 +Converged at iteration 39, L1 4.757e-05, Linf 0.00798604, total time[s] 0.097968 +Converged at iteration 36, L1 5.86176e-05, Linf 0.00732452, total time[s] 0.091384 +Converged at iteration 24, L1 8.91475e-05, Linf 0.00385082, total time[s] 0.062406 +Converged at iteration 30, L1 8.80327e-05, Linf 0.00622435, total time[s] 0.077597 +Converged at iteration 24, L1 8.85314e-05, Linf 0.00572786, total time[s] 0.063159 +Converged at iteration 21, L1 9.27676e-05, Linf 0.00537991, total time[s] 0.055853 +Converged at iteration 19, L1 6.59357e-05, Linf 0.00678554, total time[s] 0.050395 +Converged at iteration 21, L1 4.00343e-05, Linf 0.00306273, total time[s] 0.055326 +Converged at iteration 23, L1 8.10607e-05, Linf 0.00369264, total time[s] 0.061208 +Converged at iteration 23, L1 8.6535e-05, Linf 0.00541875, total time[s] 0.063633 +Converged at iteration 20, L1 4.54564e-05, Linf 0.00464093, total time[s] 0.052708 +Converged at iteration 17, L1 5.44061e-05, Linf 0.00151163, total time[s] 0.046158 +Converged at iteration 32, L1 5.31642e-05, Linf 0.00323268, total time[s] 0.084913 +Converged at iteration 19, L1 9.73184e-05, Linf 0.00585008, total time[s] 0.051083 +Converged at iteration 23, L1 6.9713e-05, Linf 0.00460677, total time[s] 0.06061 +Converged at iteration 26, L1 9.20308e-05, Linf 0.00499065, total time[s] 0.070498 +Converged at iteration 23, L1 8.55269e-05, Linf 0.00413754, total time[s] 0.060565 +Converged at iteration 20, L1 9.47759e-05, Linf 0.00339224, total time[s] 0.053308 +Converged at iteration 23, L1 7.88298e-05, Linf 0.00289239, total time[s] 0.060746 +Converged at iteration 25, L1 8.25757e-05, Linf 0.00325626, total time[s] 0.065241 +Converged at iteration 27, L1 8.8212e-05, Linf 0.00367763, total time[s] 0.069444 +Converged at iteration 30, L1 6.88432e-05, Linf 0.00452106, total time[s] 0.076224 +Converged at iteration 28, L1 8.18201e-05, Linf 0.00394271, total time[s] 0.074074 +Converged at iteration 29, L1 9.36159e-05, Linf 0.0047055, total time[s] 0.074857 +Converged at iteration 30, L1 5.78825e-05, Linf 0.00197407, total time[s] 0.076433 +Converged at iteration 29, L1 5.90601e-05, Linf 0.0012626, total time[s] 0.074695 +Converged at iteration 32, L1 9.02962e-05, Linf 0.00831476, total time[s] 0.082054 +Converged at iteration 26, L1 6.71699e-05, Linf 0.00246661, total time[s] 0.066806 +Converged at iteration 25, L1 9.6054e-05, Linf 0.00310333, total time[s] 0.066074 +Converged at iteration 23, L1 7.03365e-05, Linf 0.00276223, total time[s] 0.059556 +Converged at iteration 38, L1 9.91819e-05, Linf 0.00989197, total time[s] 0.099873 +Converged at iteration 36, L1 5.80475e-05, Linf 0.00747157, total time[s] 0.095253 +Converged at iteration 24, L1 8.9175e-05, Linf 0.00394283, total time[s] 0.062338 +Converged at iteration 30, L1 8.64301e-05, Linf 0.00621267, total time[s] 0.118675 +Converged at iteration 24, L1 8.72726e-05, Linf 0.00569737, total time[s] 0.067334 +Converged at iteration 21, L1 9.2505e-05, Linf 0.00544257, total time[s] 0.057308 +Converged at iteration 19, L1 6.60211e-05, Linf 0.00699767, total time[s] 0.052801 +Converged at iteration 21, L1 4.02668e-05, Linf 0.00305054, total time[s] 0.057054 +Converged at iteration 23, L1 8.06901e-05, Linf 0.00366931, total time[s] 0.064022 +Converged at iteration 23, L1 8.33868e-05, Linf 0.00535236, total time[s] 0.059755 +Converged at iteration 20, L1 4.5164e-05, Linf 0.0046727, total time[s] 0.052708 +Converged at iteration 17, L1 5.44859e-05, Linf 0.00146521, total time[s] 0.050881 +Converged at iteration 32, L1 5.28967e-05, Linf 0.00329062, total time[s] 0.080212 +Converged at iteration 19, L1 9.72663e-05, Linf 0.00570415, total time[s] 0.049015 +Converged at iteration 23, L1 6.94069e-05, Linf 0.00486105, total time[s] 0.059794 +Converged at iteration 26, L1 9.11489e-05, Linf 0.00501557, total time[s] 0.066796 +Converged at iteration 23, L1 8.65059e-05, Linf 0.00407812, total time[s] 0.059695 +Converged at iteration 20, L1 9.52424e-05, Linf 0.00331468, total time[s] 0.054377 +Converged at iteration 23, L1 7.8917e-05, Linf 0.00291435, total time[s] 0.061167 +Converged at iteration 25, L1 8.21752e-05, Linf 0.00323621, total time[s] 0.064399 +Converged at iteration 27, L1 8.6993e-05, Linf 0.00352406, total time[s] 0.068691 +Converged at iteration 30, L1 6.92955e-05, Linf 0.00462998, total time[s] 0.076282 +Converged at iteration 28, L1 8.23363e-05, Linf 0.00372625, total time[s] 0.071808 +Converged at iteration 29, L1 9.35473e-05, Linf 0.00474688, total time[s] 0.073447 +Converged at iteration 29, L1 9.99829e-05, Linf 0.00273902, total time[s] 0.074028 +Converged at iteration 29, L1 6.09426e-05, Linf 0.00140842, total time[s] 0.073945 +Converged at iteration 32, L1 8.99661e-05, Linf 0.00837505, total time[s] 0.080324 +Converged at iteration 26, L1 6.58547e-05, Linf 0.00240605, total time[s] 0.068591 +Converged at iteration 25, L1 9.63843e-05, Linf 0.00314934, total time[s] 0.070469 +Converged at iteration 23, L1 7.02491e-05, Linf 0.00276424, total time[s] 0.062127 +Converged at iteration 38, L1 9.91549e-05, Linf 0.00997146, total time[s] 0.10311 +Converged at iteration 36, L1 5.79386e-05, Linf 0.00743692, total time[s] 0.09729 +Converged at iteration 24, L1 8.91373e-05, Linf 0.0040603, total time[s] 0.061873 +Converged at iteration 30, L1 8.62043e-05, Linf 0.00620424, total time[s] 0.076352 +Converged at iteration 24, L1 8.54931e-05, Linf 0.00565986, total time[s] 0.06124 +Converged at iteration 21, L1 9.48628e-05, Linf 0.00551491, total time[s] 0.054593 +Converged at iteration 19, L1 6.62506e-05, Linf 0.00744303, total time[s] 0.049003 +Converged at iteration 21, L1 4.05384e-05, Linf 0.0030341, total time[s] 0.055084 +Converged at iteration 23, L1 7.89961e-05, Linf 0.00364648, total time[s] 0.059464 +Converged at iteration 23, L1 8.0294e-05, Linf 0.00533564, total time[s] 0.060129 +Converged at iteration 20, L1 4.54959e-05, Linf 0.00462408, total time[s] 0.053652 +Converged at iteration 17, L1 5.45861e-05, Linf 0.00140097, total time[s] 0.048361 +Converged at iteration 32, L1 5.31723e-05, Linf 0.00335885, total time[s] 0.07999 +Converged at iteration 19, L1 9.72622e-05, Linf 0.00554147, total time[s] 0.049869 +Converged at iteration 23, L1 6.90342e-05, Linf 0.00448095, total time[s] 0.061623 +Converged at iteration 26, L1 9.0792e-05, Linf 0.00505474, total time[s] 0.06583 +Converged at iteration 23, L1 8.77509e-05, Linf 0.00406534, total time[s] 0.062931 +Converged at iteration 20, L1 9.58728e-05, Linf 0.0032521, total time[s] 0.054822 +Converged at iteration 23, L1 7.89625e-05, Linf 0.0028943, total time[s] 0.059981 +Converged at iteration 25, L1 8.16165e-05, Linf 0.00321851, total time[s] 0.065359 +Converged at iteration 27, L1 8.57062e-05, Linf 0.00348762, total time[s] 0.070916 +Converged at iteration 30, L1 6.99094e-05, Linf 0.00470855, total time[s] 0.076774 +Converged at iteration 28, L1 8.29893e-05, Linf 0.00353821, total time[s] 0.073472 +Converged at iteration 29, L1 9.48331e-05, Linf 0.00485483, total time[s] 0.074899 +Converged at iteration 30, L1 5.75983e-05, Linf 0.00193541, total time[s] 0.076759 +Converged at iteration 29, L1 6.43765e-05, Linf 0.00170971, total time[s] 0.074031 +Converged at iteration 32, L1 8.99566e-05, Linf 0.00846045, total time[s] 0.082512 +Converged at iteration 26, L1 6.53242e-05, Linf 0.00233971, total time[s] 0.066942 +Converged at iteration 25, L1 9.67334e-05, Linf 0.00319192, total time[s] 0.06691 +Converged at iteration 23, L1 7.0793e-05, Linf 0.00276283, total time[s] 0.060879 +Converged at iteration 38, L1 9.72567e-05, Linf 0.0101074, total time[s] 0.099087 +Converged at iteration 36, L1 5.76866e-05, Linf 0.00749074, total time[s] 0.091831 +Converged at iteration 24, L1 8.92624e-05, Linf 0.00420367, total time[s] 0.062925 +Converged at iteration 30, L1 8.55022e-05, Linf 0.00621503, total time[s] 0.076275 +Converged at iteration 24, L1 8.363e-05, Linf 0.00561724, total time[s] 0.062893 +Converged at iteration 21, L1 9.7142e-05, Linf 0.00560685, total time[s] 0.056147 +Converged at iteration 19, L1 6.67759e-05, Linf 0.00810626, total time[s] 0.052084 +Converged at iteration 21, L1 4.07206e-05, Linf 0.00300673, total time[s] 0.056536 +Converged at iteration 23, L1 7.81007e-05, Linf 0.0036128, total time[s] 0.061021 +Converged at iteration 23, L1 7.67831e-05, Linf 0.00527786, total time[s] 0.065019 +Converged at iteration 20, L1 4.48776e-05, Linf 0.00449656, total time[s] 0.0542 +Converged at iteration 17, L1 5.48357e-05, Linf 0.00141751, total time[s] 0.048721 +Converged at iteration 32, L1 5.27651e-05, Linf 0.00344003, total time[s] 0.084666 +Converged at iteration 19, L1 9.71179e-05, Linf 0.00546168, total time[s] 0.052071 +Converged at iteration 23, L1 6.90801e-05, Linf 0.00441084, total time[s] 0.061192 +Converged at iteration 26, L1 9.12529e-05, Linf 0.00507559, total time[s] 0.075536 +Converged at iteration 23, L1 8.92769e-05, Linf 0.00395757, total time[s] 0.061395 +Converged at iteration 20, L1 9.65878e-05, Linf 0.00326218, total time[s] 0.05382 +Converged at iteration 23, L1 7.91488e-05, Linf 0.00289722, total time[s] 0.061563 +Converged at iteration 25, L1 8.0395e-05, Linf 0.00319811, total time[s] 0.064989 +Converged at iteration 27, L1 8.41923e-05, Linf 0.00344783, total time[s] 0.0698 +Converged at iteration 30, L1 7.08977e-05, Linf 0.00481994, total time[s] 0.076885 +Converged at iteration 28, L1 8.38762e-05, Linf 0.00335585, total time[s] 0.101859 +Converged at iteration 29, L1 9.51124e-05, Linf 0.00489529, total time[s] 0.079487 +Converged at iteration 30, L1 5.74264e-05, Linf 0.00191336, total time[s] 0.077849 +Converged at iteration 29, L1 6.65239e-05, Linf 0.00212542, total time[s] 0.075643 +Converged at iteration 32, L1 8.9175e-05, Linf 0.00853685, total time[s] 0.082402 +Converged at iteration 26, L1 6.23471e-05, Linf 0.00225878, total time[s] 0.068099 +Converged at iteration 25, L1 9.75768e-05, Linf 0.00325125, total time[s] 0.068635 +Converged at iteration 23, L1 7.03729e-05, Linf 0.00277875, total time[s] 0.064534 +Converged at iteration 38, L1 9.53256e-05, Linf 0.010219, total time[s] 0.101875 +Converged at iteration 36, L1 5.52234e-05, Linf 0.00757083, total time[s] 0.101247 +Converged at iteration 24, L1 8.93455e-05, Linf 0.00438409, total time[s] 0.063862 +Converged at iteration 30, L1 8.33412e-05, Linf 0.00624888, total time[s] 0.078808 +Converged at iteration 24, L1 8.13039e-05, Linf 0.00556542, total time[s] 0.064557 +Converged at iteration 21, L1 9.50986e-05, Linf 0.00570822, total time[s] 0.057332 +Converged at iteration 19, L1 6.72147e-05, Linf 0.00807857, total time[s] 0.053103 +Converged at iteration 21, L1 4.11204e-05, Linf 0.00307287, total time[s] 0.058572 +Converged at iteration 23, L1 7.69109e-05, Linf 0.00359146, total time[s] 0.064371 +Converged at iteration 23, L1 7.25617e-05, Linf 0.00520421, total time[s] 0.06106 +Converged at iteration 20, L1 4.36495e-05, Linf 0.0044254, total time[s] 0.05428 +Converged at iteration 17, L1 5.53095e-05, Linf 0.00145621, total time[s] 0.047164 +Converged at iteration 32, L1 5.17407e-05, Linf 0.00353993, total time[s] 0.084069 +Converged at iteration 19, L1 9.68166e-05, Linf 0.00539658, total time[s] 0.051624 +Converged at iteration 23, L1 6.77121e-05, Linf 0.00433115, total time[s] 0.068816 +Converged at iteration 26, L1 9.2186e-05, Linf 0.00512032, total time[s] 0.070362 +Converged at iteration 23, L1 9.07333e-05, Linf 0.00392532, total time[s] 0.062324 +Converged at iteration 20, L1 9.766e-05, Linf 0.00323518, total time[s] 0.071944 +Converged at iteration 23, L1 7.94162e-05, Linf 0.00290016, total time[s] 0.080513 +Converged at iteration 25, L1 8.02696e-05, Linf 0.00317932, total time[s] 0.0678 +Converged at iteration 27, L1 8.17667e-05, Linf 0.00340579, total time[s] 0.076449 +Converged at iteration 30, L1 7.21982e-05, Linf 0.00493523, total time[s] 0.090177 +Converged at iteration 28, L1 8.47861e-05, Linf 0.0032299, total time[s] 0.089468 +Converged at iteration 29, L1 9.68755e-05, Linf 0.00494142, total time[s] 0.073537 +Converged at iteration 30, L1 5.80102e-05, Linf 0.00188632, total time[s] 0.077528 +Converged at iteration 29, L1 7.08477e-05, Linf 0.00250796, total time[s] 0.083345 +Converged at iteration 32, L1 8.87092e-05, Linf 0.00864515, total time[s] 0.093003 +Converged at iteration 26, L1 6.01682e-05, Linf 0.00217381, total time[s] 0.068789 +Converged at iteration 25, L1 9.7738e-05, Linf 0.00331692, total time[s] 0.06617 +Converged at iteration 23, L1 7.04426e-05, Linf 0.00279407, total time[s] 0.063423 +Converged at iteration 38, L1 9.55627e-05, Linf 0.0103124, total time[s] 0.095705 +Converged at iteration 36, L1 5.57711e-05, Linf 0.00763857, total time[s] 0.093514 +Converged at iteration 24, L1 8.92452e-05, Linf 0.00429257, total time[s] 0.064788 +Converged at iteration 30, L1 8.42623e-05, Linf 0.00623548, total time[s] 0.07757 +Converged at iteration 24, L1 8.2636e-05, Linf 0.00559064, total time[s] 0.063039 +Converged at iteration 21, L1 9.45945e-05, Linf 0.00565675, total time[s] 0.056455 +Converged at iteration 19, L1 6.69752e-05, Linf 0.00824297, total time[s] 0.051755 +Converged at iteration 21, L1 4.09046e-05, Linf 0.00303994, total time[s] 0.056482 +Converged at iteration 23, L1 7.69473e-05, Linf 0.00360383, total time[s] 0.063696 +Converged at iteration 23, L1 7.48239e-05, Linf 0.00524065, total time[s] 0.064286 +Converged at iteration 20, L1 4.41227e-05, Linf 0.00446102, total time[s] 0.057706 +Converged at iteration 17, L1 5.5008e-05, Linf 0.00143722, total time[s] 0.049117 +Converged at iteration 32, L1 5.19939e-05, Linf 0.0034921, total time[s] 0.084363 +Converged at iteration 19, L1 9.68823e-05, Linf 0.00542821, total time[s] 0.053025 +Converged at iteration 23, L1 6.83559e-05, Linf 0.00436866, total time[s] 0.062639 +Converged at iteration 26, L1 9.15956e-05, Linf 0.00507392, total time[s] 0.070008 +Converged at iteration 23, L1 8.9978e-05, Linf 0.00394056, total time[s] 0.062248 +Converged at iteration 20, L1 9.7099e-05, Linf 0.00325043, total time[s] 0.05574 +Converged at iteration 23, L1 7.92717e-05, Linf 0.00289878, total time[s] 0.062794 +Converged at iteration 25, L1 8.02361e-05, Linf 0.00318691, total time[s] 0.067469 +Converged at iteration 27, L1 8.28244e-05, Linf 0.00343233, total time[s] 0.075458 +Converged at iteration 30, L1 7.16259e-05, Linf 0.00487703, total time[s] 0.078131 +Converged at iteration 28, L1 8.42904e-05, Linf 0.00331225, total time[s] 0.073682 +Converged at iteration 29, L1 9.54993e-05, Linf 0.00494769, total time[s] 0.075102 +Converged at iteration 29, L1 9.99079e-05, Linf 0.00271694, total time[s] 0.080116 +Converged at iteration 29, L1 6.82548e-05, Linf 0.00232992, total time[s] 0.075611 +Converged at iteration 32, L1 8.89204e-05, Linf 0.0085907, total time[s] 0.082635 +Converged at iteration 26, L1 6.12306e-05, Linf 0.00221478, total time[s] 0.069028 +Converged at iteration 25, L1 9.74651e-05, Linf 0.00327479, total time[s] 0.065695 +Converged at iteration 23, L1 7.05542e-05, Linf 0.00278636, total time[s] 0.062674 +Converged at iteration 38, L1 9.45246e-05, Linf 0.0102438, total time[s] 0.098276 +Converged at iteration 36, L1 5.51028e-05, Linf 0.00768375, total time[s] 0.094868 +Converged at iteration 24, L1 8.94043e-05, Linf 0.00440086, total time[s] 0.062047 +Converged at iteration 30, L1 8.32426e-05, Linf 0.00625123, total time[s] 0.076641 +Converged at iteration 24, L1 8.12297e-05, Linf 0.00556055, total time[s] 0.062358 +Converged at iteration 21, L1 9.56428e-05, Linf 0.00571839, total time[s] 0.05584 +Converged at iteration 19, L1 6.74182e-05, Linf 0.00814539, total time[s] 0.05133 +Converged at iteration 21, L1 4.11834e-05, Linf 0.00308028, total time[s] 0.055135 +Converged at iteration 23, L1 7.713e-05, Linf 0.00358749, total time[s] 0.06145 +Converged at iteration 23, L1 7.25678e-05, Linf 0.00519535, total time[s] 0.06104 +Converged at iteration 20, L1 4.36602e-05, Linf 0.00441829, total time[s] 0.053295 +Converged at iteration 17, L1 5.53147e-05, Linf 0.00145925, total time[s] 0.076019 +Converged at iteration 32, L1 5.17155e-05, Linf 0.00354968, total time[s] 0.084754 +Converged at iteration 19, L1 9.71819e-05, Linf 0.0053909, total time[s] 0.052721 +Converged at iteration 23, L1 6.77795e-05, Linf 0.00432674, total time[s] 0.062701 +Converged at iteration 26, L1 9.24424e-05, Linf 0.00512918, total time[s] 0.068493 +Converged at iteration 23, L1 9.13356e-05, Linf 0.00392298, total time[s] 0.061171 +Converged at iteration 20, L1 9.79181e-05, Linf 0.00323248, total time[s] 0.055412 +Converged at iteration 23, L1 7.95716e-05, Linf 0.0029006, total time[s] 0.062321 +Converged at iteration 25, L1 8.00544e-05, Linf 0.0031761, total time[s] 0.067471 +Converged at iteration 27, L1 8.16115e-05, Linf 0.00340159, total time[s] 0.071058 +Converged at iteration 30, L1 7.23403e-05, Linf 0.00495283, total time[s] 0.078614 +Converged at iteration 28, L1 8.48751e-05, Linf 0.00321939, total time[s] 0.073543 +Converged at iteration 29, L1 9.60477e-05, Linf 0.00495297, total time[s] 0.079457 +Converged at iteration 29, L1 9.99198e-05, Linf 0.00270765, total time[s] 0.075846 +Converged at iteration 29, L1 7.05675e-05, Linf 0.00251126, total time[s] 0.074937 +Converged at iteration 32, L1 8.86487e-05, Linf 0.008656, total time[s] 0.083663 +Converged at iteration 26, L1 5.9945e-05, Linf 0.00216603, total time[s] 0.068731 +Converged at iteration 25, L1 9.77887e-05, Linf 0.0033263, total time[s] 0.06638 +Converged at iteration 23, L1 7.04699e-05, Linf 0.00279598, total time[s] 0.061909 +Converged at iteration 38, L1 9.3248e-05, Linf 0.0103329, total time[s] 0.097549 +Converged at iteration 36, L1 5.42774e-05, Linf 0.00762965, total time[s] 0.100748 +Converged at iteration 24, L1 8.93863e-05, Linf 0.00453613, total time[s] 0.064066 +Converged at iteration 30, L1 8.21611e-05, Linf 0.00625408, total time[s] 0.07789 +Converged at iteration 24, L1 7.95835e-05, Linf 0.00552525, total time[s] 0.063706 +Converged at iteration 21, L1 9.58542e-05, Linf 0.00579153, total time[s] 0.056817 +Converged at iteration 19, L1 6.76751e-05, Linf 0.00755084, total time[s] 0.052148 +Converged at iteration 21, L1 4.14373e-05, Linf 0.00312922, total time[s] 0.056098 +Converged at iteration 23, L1 7.56784e-05, Linf 0.00359024, total time[s] 0.061904 +Converged at iteration 23, L1 6.92023e-05, Linf 0.00514015, total time[s] 0.06104 +Converged at iteration 19, L1 9.97781e-05, Linf 0.00607841, total time[s] 0.051863 +Converged at iteration 17, L1 5.57284e-05, Linf 0.0014852, total time[s] 0.047401 +Converged at iteration 32, L1 5.13489e-05, Linf 0.00361764, total time[s] 0.081998 +Converged at iteration 19, L1 9.67005e-05, Linf 0.00534668, total time[s] 0.05666 +Converged at iteration 23, L1 6.73163e-05, Linf 0.00427293, total time[s] 0.062574 +Converged at iteration 26, L1 9.37225e-05, Linf 0.0051417, total time[s] 0.069429 +Converged at iteration 23, L1 9.20707e-05, Linf 0.00391467, total time[s] 0.062316 +Converged at iteration 20, L1 9.8714e-05, Linf 0.00320927, total time[s] 0.054076 +Converged at iteration 23, L1 7.96961e-05, Linf 0.00290229, total time[s] 0.061372 +Converged at iteration 25, L1 7.96578e-05, Linf 0.00316272, total time[s] 0.065737 +Converged at iteration 27, L1 8.02122e-05, Linf 0.00337595, total time[s] 0.070874 +Converged at iteration 30, L1 7.33493e-05, Linf 0.00503315, total time[s] 0.076809 +Converged at iteration 28, L1 8.54383e-05, Linf 0.00316632, total time[s] 0.07262 +Converged at iteration 29, L1 9.67005e-05, Linf 0.00506723, total time[s] 0.07496 +Converged at iteration 29, L1 9.98844e-05, Linf 0.0026981, total time[s] 0.074745 +Converged at iteration 29, L1 7.34779e-05, Linf 0.00265299, total time[s] 0.074856 +Converged at iteration 32, L1 8.83559e-05, Linf 0.00873536, total time[s] 0.082441 +Converged at iteration 25, L1 9.86236e-05, Linf 0.00335959, total time[s] 0.066125 +Converged at iteration 25, L1 9.89641e-05, Linf 0.00337834, total time[s] 0.065553 +Converged at iteration 23, L1 7.07875e-05, Linf 0.00280894, total time[s] 0.061958 +Converged at iteration 38, L1 9.16716e-05, Linf 0.0104457, total time[s] 0.096928 +Converged at iteration 36, L1 5.39123e-05, Linf 0.00769002, total time[s] 0.093062 +Converged at iteration 24, L1 8.94736e-05, Linf 0.00470057, total time[s] 0.06269 +Converged at iteration 30, L1 8.09758e-05, Linf 0.00618485, total time[s] 0.075984 +Converged at iteration 24, L1 7.79731e-05, Linf 0.00548426, total time[s] 0.064096 +Converged at iteration 21, L1 9.66005e-05, Linf 0.00587711, total time[s] 0.055263 +Converged at iteration 19, L1 6.79667e-05, Linf 0.00663074, total time[s] 0.051856 +Converged at iteration 21, L1 4.19084e-05, Linf 0.00318942, total time[s] 0.056593 +Converged at iteration 23, L1 7.50759e-05, Linf 0.00356827, total time[s] 0.061672 +Converged at iteration 23, L1 6.57245e-05, Linf 0.00507035, total time[s] 0.060804 +Converged at iteration 19, L1 9.90293e-05, Linf 0.00602851, total time[s] 0.053797 +Converged at iteration 17, L1 5.64829e-05, Linf 0.00151865, total time[s] 0.046823 +Converged at iteration 32, L1 5.10501e-05, Linf 0.00369811, total time[s] 0.081893 +Converged at iteration 19, L1 9.66553e-05, Linf 0.00529375, total time[s] 0.051822 +Converged at iteration 23, L1 6.66858e-05, Linf 0.00422102, total time[s] 0.061232 +Converged at iteration 26, L1 9.48713e-05, Linf 0.00511045, total time[s] 0.068165 +Converged at iteration 23, L1 9.35394e-05, Linf 0.00390147, total time[s] 0.060552 +Converged at iteration 20, L1 9.95576e-05, Linf 0.00317753, total time[s] 0.053422 +Converged at iteration 23, L1 7.9938e-05, Linf 0.00290398, total time[s] 0.060312 +Converged at iteration 25, L1 7.90286e-05, Linf 0.00314706, total time[s] 0.065125 +Converged at iteration 27, L1 7.85464e-05, Linf 0.00334223, total time[s] 0.070205 +Converged at iteration 30, L1 7.47614e-05, Linf 0.00516439, total time[s] 0.077271 +Converged at iteration 28, L1 8.61683e-05, Linf 0.00310592, total time[s] 0.073244 +Converged at iteration 29, L1 9.76859e-05, Linf 0.00513575, total time[s] 0.079487 +Converged at iteration 30, L1 5.70899e-05, Linf 0.00182577, total time[s] 0.076839 +Converged at iteration 29, L1 7.71546e-05, Linf 0.00273077, total time[s] 0.074976 +Converged at iteration 32, L1 8.79462e-05, Linf 0.00883066, total time[s] 0.082245 +Converged at iteration 25, L1 9.59909e-05, Linf 0.00335634, total time[s] 0.065814 +Converged at iteration 25, L1 9.85893e-05, Linf 0.00343799, total time[s] 0.0655 +Converged at iteration 23, L1 7.08374e-05, Linf 0.00282731, total time[s] 0.061393 +Converged at iteration 38, L1 8.98043e-05, Linf 0.0105816, total time[s] 0.097118 +Converged at iteration 36, L1 5.23181e-05, Linf 0.00775855, total time[s] 0.092606 +Converged at iteration 24, L1 8.98151e-05, Linf 0.00490355, total time[s] 0.06341 +Converged at iteration 30, L1 7.9625e-05, Linf 0.00608947, total time[s] 0.109433 +Converged at iteration 24, L1 7.60578e-05, Linf 0.00543708, total time[s] 0.065676 +Converged at iteration 21, L1 9.74563e-05, Linf 0.00597704, total time[s] 0.058308 +Converged at iteration 19, L1 6.82731e-05, Linf 0.00639494, total time[s] 0.051188 +Converged at iteration 21, L1 4.25164e-05, Linf 0.00326381, total time[s] 0.058581 +Converged at iteration 23, L1 7.39712e-05, Linf 0.00354715, total time[s] 0.061398 +Converged at iteration 23, L1 6.17166e-05, Linf 0.00498263, total time[s] 0.062933 +Converged at iteration 19, L1 9.84126e-05, Linf 0.00596731, total time[s] 0.051017 +Converged at iteration 17, L1 5.77344e-05, Linf 0.0015588, total time[s] 0.047348 +Converged at iteration 32, L1 5.06638e-05, Linf 0.00379543, total time[s] 0.085503 +Converged at iteration 19, L1 9.6653e-05, Linf 0.00540782, total time[s] 0.052919 +Converged at iteration 23, L1 6.64021e-05, Linf 0.00416468, total time[s] 0.06729 +Converged at iteration 26, L1 9.52352e-05, Linf 0.00763424, total time[s] 0.068204 +Converged at iteration 23, L1 9.59256e-05, Linf 0.00386929, total time[s] 0.060473 +Converged at iteration 21, L1 5.11197e-05, Linf 0.00222679, total time[s] 0.056851 +Converged at iteration 23, L1 8.00057e-05, Linf 0.00290515, total time[s] 0.060471 +Converged at iteration 25, L1 7.90592e-05, Linf 0.00312725, total time[s] 0.069296 +Converged at iteration 27, L1 7.69186e-05, Linf 0.003305, total time[s] 0.084023 +Converged at iteration 30, L1 7.72323e-05, Linf 0.00533148, total time[s] 0.078871 +Converged at iteration 28, L1 8.75308e-05, Linf 0.00326249, total time[s] 0.071526 +Converged at iteration 29, L1 9.85586e-05, Linf 0.0052039, total time[s] 0.073316 +Converged at iteration 29, L1 9.99344e-05, Linf 0.00269156, total time[s] 0.07377 +Converged at iteration 29, L1 8.23198e-05, Linf 0.00271929, total time[s] 0.074203 +Converged at iteration 32, L1 8.75687e-05, Linf 0.00894865, total time[s] 0.080687 +Converged at iteration 25, L1 9.29757e-05, Linf 0.00334308, total time[s] 0.064737 +Converged at iteration 25, L1 9.98658e-05, Linf 0.00350978, total time[s] 0.066394 +Converged at iteration 23, L1 7.12509e-05, Linf 0.00285122, total time[s] 0.060711 +Converged at iteration 38, L1 9.07942e-05, Linf 0.0105281, total time[s] 0.096928 +Converged at iteration 36, L1 5.30253e-05, Linf 0.00772196, total time[s] 0.09536 +Converged at iteration 24, L1 8.96712e-05, Linf 0.0048004, total time[s] 0.063069 +Converged at iteration 30, L1 8.09274e-05, Linf 0.00613456, total time[s] 0.078223 +Converged at iteration 24, L1 7.75758e-05, Linf 0.00545917, total time[s] 0.062876 +Converged at iteration 21, L1 9.71431e-05, Linf 0.00592774, total time[s] 0.058153 +Converged at iteration 19, L1 6.81277e-05, Linf 0.00650387, total time[s] 0.052938 +Converged at iteration 21, L1 4.213e-05, Linf 0.00322635, total time[s] 0.057357 +Converged at iteration 23, L1 7.45875e-05, Linf 0.00358554, total time[s] 0.060412 +Converged at iteration 23, L1 6.42829e-05, Linf 0.00502596, total time[s] 0.060499 +Converged at iteration 19, L1 9.93732e-05, Linf 0.00599809, total time[s] 0.051944 +Converged at iteration 17, L1 5.71992e-05, Linf 0.00153885, total time[s] 0.047526 +Converged at iteration 32, L1 5.09093e-05, Linf 0.00374701, total time[s] 0.081182 +Converged at iteration 19, L1 9.67552e-05, Linf 0.00528981, total time[s] 0.050231 +Converged at iteration 23, L1 6.67923e-05, Linf 0.00419413, total time[s] 0.063099 +Converged at iteration 26, L1 9.44694e-05, Linf 0.00510242, total time[s] 0.068569 +Converged at iteration 23, L1 9.5508e-05, Linf 0.00388016, total time[s] 0.06011 +Converged at iteration 21, L1 5.12116e-05, Linf 0.00194317, total time[s] 0.055429 +Converged at iteration 23, L1 8.0348e-05, Linf 0.00290461, total time[s] 0.059999 +Converged at iteration 25, L1 7.93843e-05, Linf 0.00313893, total time[s] 0.064538 +Converged at iteration 27, L1 7.78172e-05, Linf 0.00332499, total time[s] 0.069959 +Converged at iteration 30, L1 7.69662e-05, Linf 0.00525818, total time[s] 0.076806 +Converged at iteration 28, L1 8.68371e-05, Linf 0.00317304, total time[s] 0.072098 +Converged at iteration 29, L1 9.80697e-05, Linf 0.00517083, total time[s] 0.074339 +Converged at iteration 29, L1 9.99047e-05, Linf 0.0026911, total time[s] 0.075884 +Converged at iteration 29, L1 7.97346e-05, Linf 0.00273324, total time[s] 0.073928 +Converged at iteration 32, L1 8.7943e-05, Linf 0.00888982, total time[s] 0.082062 +Converged at iteration 25, L1 9.52592e-05, Linf 0.003351, total time[s] 0.064935 +Converged at iteration 25, L1 9.88002e-05, Linf 0.00347288, total time[s] 0.065219 +Converged at iteration 23, L1 7.1043e-05, Linf 0.00283915, total time[s] 0.060513 +Converged at iteration 38, L1 8.97741e-05, Linf 0.0110896, total time[s] 0.098654 +Converged at iteration 36, L1 5.22493e-05, Linf 0.00769047, total time[s] 0.095429 +Converged at iteration 24, L1 8.98274e-05, Linf 0.00492134, total time[s] 0.062554 +Converged at iteration 30, L1 8.05161e-05, Linf 0.00608081, total time[s] 0.076717 +Converged at iteration 24, L1 7.65875e-05, Linf 0.00543251, total time[s] 0.062581 +Converged at iteration 21, L1 9.94115e-05, Linf 0.00598744, total time[s] 0.056288 +Converged at iteration 19, L1 6.83006e-05, Linf 0.00634706, total time[s] 0.051614 +Converged at iteration 21, L1 4.25849e-05, Linf 0.00327224, total time[s] 0.056138 +Converged at iteration 23, L1 7.36932e-05, Linf 0.00355578, total time[s] 0.062595 +Converged at iteration 23, L1 6.17737e-05, Linf 0.0049733, total time[s] 0.06201 +Converged at iteration 19, L1 9.84017e-05, Linf 0.00605006, total time[s] 0.051433 +Converged at iteration 17, L1 5.79751e-05, Linf 0.00156304, total time[s] 0.046273 +Converged at iteration 32, L1 5.0624e-05, Linf 0.00380534, total time[s] 0.080658 +Converged at iteration 19, L1 9.66474e-05, Linf 0.0054311, total time[s] 0.051281 +Converged at iteration 23, L1 6.63271e-05, Linf 0.00415987, total time[s] 0.060355 +Converged at iteration 26, L1 9.45322e-05, Linf 0.00513186, total time[s] 0.067525 +Converged at iteration 23, L1 9.55328e-05, Linf 0.00386572, total time[s] 0.061756 +Converged at iteration 21, L1 5.12292e-05, Linf 0.00228235, total time[s] 0.055583 +Converged at iteration 23, L1 8.04324e-05, Linf 0.00290501, total time[s] 0.060871 +Converged at iteration 25, L1 7.93212e-05, Linf 0.00312617, total time[s] 0.067291 +Converged at iteration 27, L1 7.65217e-05, Linf 0.00330044, total time[s] 0.071058 +Converged at iteration 30, L1 7.73644e-05, Linf 0.00535094, total time[s] 0.077 +Converged at iteration 28, L1 8.78767e-05, Linf 0.00322822, total time[s] 0.071751 +Converged at iteration 29, L1 9.87336e-05, Linf 0.00521068, total time[s] 0.073164 +Converged at iteration 30, L1 5.75137e-05, Linf 0.00178225, total time[s] 0.075325 +Converged at iteration 29, L1 8.28564e-05, Linf 0.00267253, total time[s] 0.074002 +Converged at iteration 32, L1 8.76394e-05, Linf 0.00898646, total time[s] 0.100989 +Converged at iteration 25, L1 9.34751e-05, Linf 0.00333254, total time[s] 0.067672 +Converged at iteration 25, L1 9.91746e-05, Linf 0.00352529, total time[s] 0.064005 +Converged at iteration 23, L1 7.12414e-05, Linf 0.00285399, total time[s] 0.061599 +Converged at iteration 38, L1 8.84632e-05, Linf 0.0106907, total time[s] 0.09817 +Converged at iteration 36, L1 5.21237e-05, Linf 0.00781445, total time[s] 0.091775 +Converged at iteration 24, L1 8.98022e-05, Linf 0.005075, total time[s] 0.062822 +Converged at iteration 30, L1 8.02159e-05, Linf 0.00612387, total time[s] 0.076541 +Converged at iteration 24, L1 7.53313e-05, Linf 0.00539986, total time[s] 0.0625 +Converged at iteration 21, L1 9.95458e-05, Linf 0.00605683, total time[s] 0.055881 +Converged at iteration 19, L1 6.87435e-05, Linf 0.00622679, total time[s] 0.051328 +Converged at iteration 21, L1 4.30666e-05, Linf 0.0033288, total time[s] 0.055062 +Converged at iteration 23, L1 7.36263e-05, Linf 0.00356204, total time[s] 0.061123 +Converged at iteration 23, L1 5.91596e-05, Linf 0.00490497, total time[s] 0.060608 +Converged at iteration 19, L1 9.78271e-05, Linf 0.00591621, total time[s] 0.051421 +Converged at iteration 17, L1 5.87716e-05, Linf 0.00159157, total time[s] 0.046535 +Converged at iteration 32, L1 5.03267e-05, Linf 0.0038751, total time[s] 0.081696 +Converged at iteration 19, L1 9.65214e-05, Linf 0.00548011, total time[s] 0.053124 +Converged at iteration 23, L1 6.56321e-05, Linf 0.00412121, total time[s] 0.063119 +Converged at iteration 26, L1 9.53821e-05, Linf 0.0051924, total time[s] 0.072261 +Converged at iteration 23, L1 9.70439e-05, Linf 0.00385239, total time[s] 0.060174 +Converged at iteration 21, L1 5.12354e-05, Linf 0.0021992, total time[s] 0.056044 +Converged at iteration 23, L1 8.09518e-05, Linf 0.00290536, total time[s] 0.060835 +Converged at iteration 25, L1 7.78488e-05, Linf 0.00310809, total time[s] 0.065213 +Converged at iteration 27, L1 7.51792e-05, Linf 0.00327225, total time[s] 0.070223 +Converged at iteration 30, L1 7.83316e-05, Linf 0.00544195, total time[s] 0.077221 +Converged at iteration 28, L1 8.81279e-05, Linf 0.00314739, total time[s] 0.071585 +Converged at iteration 29, L1 9.95345e-05, Linf 0.00525753, total time[s] 0.07399 +Converged at iteration 29, L1 9.98642e-05, Linf 0.00269063, total time[s] 0.073771 +Converged at iteration 29, L1 8.68725e-05, Linf 0.00273817, total time[s] 0.074404 +Converged at iteration 32, L1 8.72871e-05, Linf 0.00904671, total time[s] 0.080747 +Converged at iteration 25, L1 9.10189e-05, Linf 0.00331629, total time[s] 0.065271 +Converged at iteration 25, L1 9.98435e-05, Linf 0.00356669, total time[s] 0.065154 +Converged at iteration 23, L1 7.15625e-05, Linf 0.00287281, total time[s] 0.063011 +Converged at iteration 38, L1 8.66431e-05, Linf 0.0108076, total time[s] 0.097978 +Converged at iteration 36, L1 5.07749e-05, Linf 0.00787614, total time[s] 0.090689 +Converged at iteration 24, L1 8.9675e-05, Linf 0.00526217, total time[s] 0.063024 +Converged at iteration 30, L1 7.99524e-05, Linf 0.00981686, total time[s] 0.075952 +Converged at iteration 24, L1 7.35959e-05, Linf 0.00536462, total time[s] 0.078203 +Converged at iteration 22, L1 5.49997e-05, Linf 0.00452163, total time[s] 0.057802 +Converged at iteration 19, L1 6.92933e-05, Linf 0.00642198, total time[s] 0.051244 +Converged at iteration 21, L1 4.35901e-05, Linf 0.00339771, total time[s] 0.057169 +Converged at iteration 23, L1 7.2677e-05, Linf 0.00354728, total time[s] 0.059547 +Converged at iteration 23, L1 5.59289e-05, Linf 0.00481841, total time[s] 0.060872 +Converged at iteration 19, L1 9.76015e-05, Linf 0.0058613, total time[s] 0.054783 +Converged at iteration 17, L1 5.98059e-05, Linf 0.00162505, total time[s] 0.047656 +Converged at iteration 32, L1 5.0108e-05, Linf 0.00395905, total time[s] 0.080379 +Converged at iteration 19, L1 9.65388e-05, Linf 0.0058257, total time[s] 0.050876 +Converged at iteration 23, L1 6.49735e-05, Linf 0.00407836, total time[s] 0.059677 +Converged at iteration 26, L1 9.62629e-05, Linf 0.00526369, total time[s] 0.068364 +Converged at iteration 23, L1 9.8896e-05, Linf 0.00382426, total time[s] 0.06057 +Converged at iteration 21, L1 5.19294e-05, Linf 0.00207567, total time[s] 0.05548 +Converged at iteration 23, L1 8.09801e-05, Linf 0.00290549, total time[s] 0.060833 +Converged at iteration 25, L1 7.89522e-05, Linf 0.00408451, total time[s] 0.065481 +Converged at iteration 27, L1 7.34756e-05, Linf 0.00323828, total time[s] 0.069804 +Converged at iteration 30, L1 7.98474e-05, Linf 0.00553749, total time[s] 0.077731 +Converged at iteration 28, L1 8.94646e-05, Linf 0.00320327, total time[s] 0.075003 +Converged at iteration 30, L1 5.69345e-05, Linf 0.00407532, total time[s] 0.087179 +Converged at iteration 29, L1 9.98435e-05, Linf 0.00267774, total time[s] 0.079216 +Converged at iteration 29, L1 9.1396e-05, Linf 0.00284912, total time[s] 0.074173 +Converged at iteration 32, L1 8.71886e-05, Linf 0.00915121, total time[s] 0.080816 +Converged at iteration 25, L1 8.86504e-05, Linf 0.00329233, total time[s] 0.064682 +Converged at iteration 25, L1 9.98308e-05, Linf 0.00366077, total time[s] 0.065399 +Converged at iteration 23, L1 7.22549e-05, Linf 0.00289851, total time[s] 0.060856 +Converged at iteration 38, L1 8.76199e-05, Linf 0.0107449, total time[s] 0.095481 +Converged at iteration 36, L1 5.1415e-05, Linf 0.00784372, total time[s] 0.091765 +Converged at iteration 24, L1 8.98791e-05, Linf 0.00516754, total time[s] 0.063083 +Converged at iteration 30, L1 8.0018e-05, Linf 0.00611637, total time[s] 0.077791 +Converged at iteration 24, L1 7.41234e-05, Linf 0.00538062, total time[s] 0.06368 +Converged at iteration 21, L1 9.85472e-05, Linf 0.00609768, total time[s] 0.055728 +Converged at iteration 19, L1 6.92526e-05, Linf 0.00631768, total time[s] 0.054438 +Converged at iteration 21, L1 4.33429e-05, Linf 0.0033635, total time[s] 0.056996 +Converged at iteration 23, L1 7.3408e-05, Linf 0.00352597, total time[s] 0.063703 +Converged at iteration 23, L1 5.73294e-05, Linf 0.0048622, total time[s] 0.058987 +Converged at iteration 19, L1 9.77068e-05, Linf 0.0058889, total time[s] 0.049393 +Converged at iteration 17, L1 5.94073e-05, Linf 0.00160848, total time[s] 0.046701 +Converged at iteration 32, L1 5.02028e-05, Linf 0.00391719, total time[s] 0.116193 +Converged at iteration 19, L1 9.64572e-05, Linf 0.00571385, total time[s] 0.052959 +Converged at iteration 23, L1 6.52268e-05, Linf 0.00409962, total time[s] 0.061395 +Converged at iteration 26, L1 9.59332e-05, Linf 0.00522536, total time[s] 0.069407 +Converged at iteration 23, L1 9.79687e-05, Linf 0.00384104, total time[s] 0.060436 +Converged at iteration 21, L1 5.15961e-05, Linf 0.00210447, total time[s] 0.055957 +Converged at iteration 23, L1 8.05078e-05, Linf 0.00290562, total time[s] 0.060552 +Converged at iteration 25, L1 7.809e-05, Linf 0.00309246, total time[s] 0.065489 +Converged at iteration 27, L1 7.41694e-05, Linf 0.0032552, total time[s] 0.07591 +Converged at iteration 30, L1 7.89385e-05, Linf 0.00548437, total time[s] 0.076568 +Converged at iteration 28, L1 8.85837e-05, Linf 0.0031941, total time[s] 0.072132 +Converged at iteration 30, L1 5.60281e-05, Linf 0.00405844, total time[s] 0.077466 +Converged at iteration 29, L1 9.99126e-05, Linf 0.00268566, total time[s] 0.074951 +Converged at iteration 29, L1 8.89217e-05, Linf 0.00278795, total time[s] 0.074291 +Converged at iteration 32, L1 8.712e-05, Linf 0.00910609, total time[s] 0.0809 +Converged at iteration 25, L1 9.03322e-05, Linf 0.003307, total time[s] 0.065414 +Converged at iteration 25, L1 9.97817e-05, Linf 0.00359854, total time[s] 0.064726 +Converged at iteration 23, L1 7.17747e-05, Linf 0.00288516, total time[s] 0.059995 +Converged at iteration 38, L1 8.6383e-05, Linf 0.0108273, total time[s] 0.099639 +Converged at iteration 36, L1 5.07839e-05, Linf 0.00780556, total time[s] 0.093691 +Converged at iteration 24, L1 8.97412e-05, Linf 0.0052801, total time[s] 0.063351 +Converged at iteration 30, L1 7.73819e-05, Linf 0.00610721, total time[s] 0.077175 +Converged at iteration 24, L1 7.32858e-05, Linf 0.00535886, total time[s] 0.06268 +Converged at iteration 22, L1 5.47523e-05, Linf 0.0045302, total time[s] 0.05897 +Converged at iteration 19, L1 6.9335e-05, Linf 0.00645522, total time[s] 0.052244 +Converged at iteration 21, L1 4.36223e-05, Linf 0.00340463, total time[s] 0.056809 +Converged at iteration 23, L1 7.27069e-05, Linf 0.00355058, total time[s] 0.060634 +Converged at iteration 23, L1 5.61301e-05, Linf 0.00480927, total time[s] 0.066554 +Converged at iteration 19, L1 9.76844e-05, Linf 0.00585582, total time[s] 0.051076 +Converged at iteration 17, L1 5.99478e-05, Linf 0.00162882, total time[s] 0.046647 +Converged at iteration 32, L1 4.99867e-05, Linf 0.00396763, total time[s] 0.080954 +Converged at iteration 19, L1 9.63908e-05, Linf 0.00584912, total time[s] 0.051411 +Converged at iteration 23, L1 6.48163e-05, Linf 0.00407775, total time[s] 0.060288 +Converged at iteration 27, L1 5.30764e-05, Linf 0.00285803, total time[s] 0.070943 +Converged at iteration 23, L1 9.90552e-05, Linf 0.00382426, total time[s] 0.060268 +Converged at iteration 21, L1 5.1851e-05, Linf 0.00209191, total time[s] 0.059486 +Converged at iteration 23, L1 8.08918e-05, Linf 0.00290545, total time[s] 0.060274 +Converged at iteration 25, L1 7.77074e-05, Linf 0.00307986, total time[s] 0.066035 +Converged at iteration 27, L1 7.36101e-05, Linf 0.0032359, total time[s] 0.069926 +Converged at iteration 30, L1 8.00181e-05, Linf 0.00554256, total time[s] 0.077345 +Converged at iteration 28, L1 8.95516e-05, Linf 0.00320333, total time[s] 0.07241 +Converged at iteration 30, L1 5.62612e-05, Linf 0.00407883, total time[s] 0.075099 +Converged at iteration 29, L1 9.99266e-05, Linf 0.00267595, total time[s] 0.073807 +Converged at iteration 29, L1 9.19541e-05, Linf 0.00286632, total time[s] 0.07407 +Converged at iteration 32, L1 8.69334e-05, Linf 0.0091614, total time[s] 0.081701 +Converged at iteration 25, L1 8.789e-05, Linf 0.00328882, total time[s] 0.066064 +Converged at iteration 26, L1 5.91036e-05, Linf 0.00254432, total time[s] 0.067487 +Converged at iteration 23, L1 7.20782e-05, Linf 0.00290128, total time[s] 0.060564 +Converged at iteration 38, L1 8.51813e-05, Linf 0.0109163, total time[s] 0.09882 +Converged at iteration 36, L1 5.00437e-05, Linf 0.00792298, total time[s] 0.090965 +Converged at iteration 24, L1 8.9792e-05, Linf 0.00541639, total time[s] 0.062458 +Converged at iteration 30, L1 7.67478e-05, Linf 0.00609602, total time[s] 0.077506 +Converged at iteration 24, L1 7.24916e-05, Linf 0.00533364, total time[s] 0.06326 +Converged at iteration 22, L1 5.42602e-05, Linf 0.00456808, total time[s] 0.058278 +Converged at iteration 19, L1 6.99873e-05, Linf 0.0065839, total time[s] 0.050892 +Converged at iteration 21, L1 4.39208e-05, Linf 0.00345353, total time[s] 0.055886 +Converged at iteration 23, L1 7.19212e-05, Linf 0.00353475, total time[s] 0.060715 +Converged at iteration 23, L1 5.34602e-05, Linf 0.00474365, total time[s] 0.064112 +Converged at iteration 19, L1 9.72545e-05, Linf 0.00581562, total time[s] 0.051506 +Converged at iteration 17, L1 6.07243e-05, Linf 0.00165288, total time[s] 0.045928 +Converged at iteration 32, L1 4.98793e-05, Linf 0.00402748, total time[s] 0.082227 +Converged at iteration 19, L1 9.69199e-05, Linf 0.00600959, total time[s] 0.05118 +Converged at iteration 23, L1 6.44282e-05, Linf 0.00404798, total time[s] 0.067239 +Converged at iteration 26, L1 9.5687e-05, Linf 0.00532268, total time[s] 0.067349 +Converged at iteration 24, L1 5.20333e-05, Linf 0.00182118, total time[s] 0.063523 +Converged at iteration 21, L1 5.28302e-05, Linf 0.00368877, total time[s] 0.056229 +Converged at iteration 23, L1 8.14039e-05, Linf 0.00290482, total time[s] 0.062788 +Converged at iteration 25, L1 7.74108e-05, Linf 0.00305714, total time[s] 0.065431 +Converged at iteration 27, L1 7.24096e-05, Linf 0.00320911, total time[s] 0.069751 +Converged at iteration 30, L1 8.09354e-05, Linf 0.00561097, total time[s] 0.07759 +Converged at iteration 28, L1 9.00759e-05, Linf 0.00320036, total time[s] 0.072972 +Converged at iteration 30, L1 5.65334e-05, Linf 0.004108, total time[s] 0.07645 +Converged at iteration 29, L1 9.99561e-05, Linf 0.00266073, total time[s] 0.075599 +Converged at iteration 29, L1 9.55963e-05, Linf 0.00299442, total time[s] 0.074296 +Converged at iteration 32, L1 8.67103e-05, Linf 0.00923762, total time[s] 0.083075 +Converged at iteration 25, L1 8.6068e-05, Linf 0.00325992, total time[s] 0.065441 +Converged at iteration 26, L1 5.86304e-05, Linf 0.00256201, total time[s] 0.067874 +Converged at iteration 23, L1 7.23908e-05, Linf 0.0029223, total time[s] 0.060445 +Converged at iteration 38, L1 8.37522e-05, Linf 0.0109995, total time[s] 0.0977 +Converged at iteration 36, L1 4.94115e-05, Linf 0.0079658, total time[s] 0.107035 +Converged at iteration 24, L1 8.98382e-05, Linf 0.0055806, total time[s] 0.062926 +Converged at iteration 30, L1 7.54644e-05, Linf 0.00608224, total time[s] 0.076503 +Converged at iteration 24, L1 7.1418e-05, Linf 0.00530266, total time[s] 0.061999 +Converged at iteration 21, L1 9.95968e-05, Linf 0.00629893, total time[s] 0.056095 +Converged at iteration 19, L1 7.04355e-05, Linf 0.00672241, total time[s] 0.053341 +Converged at iteration 21, L1 4.44032e-05, Linf 0.00351136, total time[s] 0.055006 +Converged at iteration 23, L1 7.08594e-05, Linf 0.00351269, total time[s] 0.060431 +Converged at iteration 23, L1 5.17105e-05, Linf 0.00466137, total time[s] 0.061234 +Converged at iteration 19, L1 9.66451e-05, Linf 0.00576669, total time[s] 0.051398 +Converged at iteration 17, L1 6.15897e-05, Linf 0.0016819, total time[s] 0.047197 +Converged at iteration 32, L1 4.96636e-05, Linf 0.00409721, total time[s] 0.080956 +Converged at iteration 19, L1 9.64304e-05, Linf 0.00620787, total time[s] 0.050776 +Converged at iteration 23, L1 6.41847e-05, Linf 0.00402958, total time[s] 0.061948 +Converged at iteration 26, L1 9.3216e-05, Linf 0.00538777, total time[s] 0.070105 +Converged at iteration 24, L1 5.24906e-05, Linf 0.00187708, total time[s] 0.062886 +Converged at iteration 21, L1 5.25954e-05, Linf 0.00207054, total time[s] 0.055594 +Converged at iteration 23, L1 8.12063e-05, Linf 0.00290436, total time[s] 0.060557 +Converged at iteration 25, L1 7.76876e-05, Linf 0.00303266, total time[s] 0.065766 +Converged at iteration 27, L1 7.10802e-05, Linf 0.00317515, total time[s] 0.0699 +Converged at iteration 30, L1 8.22465e-05, Linf 0.00568381, total time[s] 0.076791 +Converged at iteration 28, L1 9.07106e-05, Linf 0.00315153, total time[s] 0.072976 +Converged at iteration 30, L1 5.731e-05, Linf 0.00415552, total time[s] 0.076786 +Converged at iteration 29, L1 9.99914e-05, Linf 0.00264116, total time[s] 0.073858 +Converged at iteration 30, L1 4.55717e-05, Linf 0.0019385, total time[s] 0.076402 +Converged at iteration 32, L1 8.64544e-05, Linf 0.00932991, total time[s] 0.08092 +Converged at iteration 25, L1 8.4e-05, Linf 0.00321843, total time[s] 0.064629 +Converged at iteration 26, L1 5.90048e-05, Linf 0.00258219, total time[s] 0.067487 +Converged at iteration 23, L1 7.30487e-05, Linf 0.00295063, total time[s] 0.060051 +Converged at iteration 38, L1 8.25117e-05, Linf 0.0111144, total time[s] 0.096927 +Converged at iteration 36, L1 4.83351e-05, Linf 0.00803343, total time[s] 0.09123 +Converged at iteration 24, L1 8.98793e-05, Linf 0.00577799, total time[s] 0.06412 +Converged at iteration 30, L1 7.54814e-05, Linf 0.00606527, total time[s] 0.076465 +Converged at iteration 24, L1 6.99631e-05, Linf 0.00526887, total time[s] 0.06212 +Converged at iteration 22, L1 5.62098e-05, Linf 0.00466269, total time[s] 0.059083 +Converged at iteration 19, L1 7.13545e-05, Linf 0.00690055, total time[s] 0.05426 +Converged at iteration 21, L1 4.48952e-05, Linf 0.00357627, total time[s] 0.058198 +Converged at iteration 23, L1 7.06141e-05, Linf 0.00350826, total time[s] 0.07043 +Converged at iteration 22, L1 9.99457e-05, Linf 0.00608824, total time[s] 0.058119 +Converged at iteration 19, L1 9.57989e-05, Linf 0.00572843, total time[s] 0.050732 +Converged at iteration 17, L1 6.26166e-05, Linf 0.00171631, total time[s] 0.046354 +Converged at iteration 32, L1 4.94372e-05, Linf 0.00417866, total time[s] 0.0789 +Converged at iteration 19, L1 9.63141e-05, Linf 0.00630299, total time[s] 0.05197 +Converged at iteration 23, L1 6.34994e-05, Linf 0.00401399, total time[s] 0.060325 +Converged at iteration 26, L1 9.22616e-05, Linf 0.00546379, total time[s] 0.066978 +Converged at iteration 24, L1 5.32509e-05, Linf 0.00194318, total time[s] 0.063804 +Converged at iteration 21, L1 5.26612e-05, Linf 0.00208315, total time[s] 0.057015 +Converged at iteration 23, L1 8.15556e-05, Linf 0.00290261, total time[s] 0.063547 +Converged at iteration 25, L1 7.59535e-05, Linf 0.00300755, total time[s] 0.068909 +Converged at iteration 27, L1 6.91158e-05, Linf 0.00313235, total time[s] 0.069392 +Converged at iteration 30, L1 8.42071e-05, Linf 0.00579713, total time[s] 0.076366 +Converged at iteration 28, L1 9.16962e-05, Linf 0.00315235, total time[s] 0.072921 +Converged at iteration 30, L1 5.72362e-05, Linf 0.0042269, total time[s] 0.07585 +Converged at iteration 29, L1 9.99656e-05, Linf 0.00261815, total time[s] 0.073727 +Converged at iteration 30, L1 4.81014e-05, Linf 0.00209499, total time[s] 0.076366 +Converged at iteration 32, L1 8.6403e-05, Linf 0.00932366, total time[s] 0.08076 +Converged at iteration 25, L1 8.12695e-05, Linf 0.0032015, total time[s] 0.064691 +Converged at iteration 26, L1 5.87553e-05, Linf 0.00260817, total time[s] 0.06831 +Converged at iteration 23, L1 7.44062e-05, Linf 0.00298887, total time[s] 0.060269 +Converged at iteration 38, L1 8.27552e-05, Linf 0.0106591, total time[s] 0.094899 +Converged at iteration 36, L1 4.90036e-05, Linf 0.00811489, total time[s] 0.09211 +Converged at iteration 24, L1 8.98188e-05, Linf 0.00562476, total time[s] 0.062234 +Converged at iteration 30, L1 7.49277e-05, Linf 0.00607436, total time[s] 0.076384 +Converged at iteration 24, L1 7.03471e-05, Linf 0.0052835, total time[s] 0.063165 +Converged at iteration 22, L1 5.48582e-05, Linf 0.00463775, total time[s] 0.06098 +Converged at iteration 19, L1 7.08619e-05, Linf 0.00687022, total time[s] 0.052716 +Converged at iteration 21, L1 4.46604e-05, Linf 0.00354098, total time[s] 0.057158 +Converged at iteration 23, L1 7.06516e-05, Linf 0.00351787, total time[s] 0.062225 +Converged at iteration 23, L1 4.91647e-05, Linf 0.00464325, total time[s] 0.060948 +Converged at iteration 19, L1 9.62864e-05, Linf 0.00575771, total time[s] 0.052289 +Converged at iteration 17, L1 6.21556e-05, Linf 0.00169912, total time[s] 0.052886 +Converged at iteration 32, L1 4.96259e-05, Linf 0.00411037, total time[s] 0.081407 +Converged at iteration 19, L1 9.62459e-05, Linf 0.00622225, total time[s] 0.051356 +Converged at iteration 23, L1 6.37347e-05, Linf 0.00401922, total time[s] 0.062124 +Converged at iteration 26, L1 9.22088e-05, Linf 0.00542537, total time[s] 0.071296 +Converged at iteration 24, L1 5.28025e-05, Linf 0.00191005, total time[s] 0.066052 +Converged at iteration 21, L1 5.25242e-05, Linf 0.00204394, total time[s] 0.061149 +Converged at iteration 23, L1 8.13291e-05, Linf 0.00290327, total time[s] 0.062963 +Converged at iteration 25, L1 7.62139e-05, Linf 0.00301826, total time[s] 0.066457 +Converged at iteration 27, L1 6.99461e-05, Linf 0.0031542, total time[s] 0.088011 +Converged at iteration 30, L1 8.32041e-05, Linf 0.00574511, total time[s] 0.081303 +Converged at iteration 28, L1 9.11682e-05, Linf 0.00315422, total time[s] 0.077301 +Converged at iteration 30, L1 5.69414e-05, Linf 0.00421383, total time[s] 0.079344 +Converged at iteration 30, L1 5.63707e-05, Linf 0.00166756, total time[s] 0.077263 +Converged at iteration 30, L1 4.76413e-05, Linf 0.00202295, total time[s] 0.075918 +Converged at iteration 32, L1 8.63928e-05, Linf 0.00953689, total time[s] 0.080511 +Converged at iteration 25, L1 8.28502e-05, Linf 0.00318938, total time[s] 0.064376 +Converged at iteration 26, L1 5.90893e-05, Linf 0.0025959, total time[s] 0.066798 +Converged at iteration 23, L1 7.38051e-05, Linf 0.00296943, total time[s] 0.061062 +Converged at iteration 38, L1 8.17813e-05, Linf 0.0109985, total time[s] 0.09959 +Converged at iteration 36, L1 4.88215e-05, Linf 0.00816181, total time[s] 0.091587 +Converged at iteration 24, L1 8.98143e-05, Linf 0.00579803, total time[s] 0.062045 +Converged at iteration 30, L1 7.46171e-05, Linf 0.00618003, total time[s] 0.076448 +Converged at iteration 24, L1 6.96851e-05, Linf 0.00526353, total time[s] 0.063985 +Converged at iteration 22, L1 5.40713e-05, Linf 0.00466717, total time[s] 0.057624 +Converged at iteration 19, L1 7.14473e-05, Linf 0.00691793, total time[s] 0.050913 +Converged at iteration 21, L1 4.50703e-05, Linf 0.00357903, total time[s] 0.055802 +Converged at iteration 23, L1 7.06973e-05, Linf 0.00350436, total time[s] 0.060209 +Converged at iteration 22, L1 9.91283e-05, Linf 0.00608818, total time[s] 0.057424 +Converged at iteration 19, L1 9.5609e-05, Linf 0.00561399, total time[s] 0.051599 +Converged at iteration 17, L1 6.27836e-05, Linf 0.00171951, total time[s] 0.04655 +Converged at iteration 32, L1 4.94163e-05, Linf 0.00418514, total time[s] 0.082155 +Converged at iteration 19, L1 9.67933e-05, Linf 0.00628153, total time[s] 0.05067 +Converged at iteration 23, L1 6.36333e-05, Linf 0.00418226, total time[s] 0.059918 +Converged at iteration 26, L1 9.22741e-05, Linf 0.0054696, total time[s] 0.067262 +Converged at iteration 24, L1 5.33602e-05, Linf 0.00194988, total time[s] 0.063482 +Converged at iteration 21, L1 5.26896e-05, Linf 0.00209933, total time[s] 0.058457 +Converged at iteration 23, L1 8.18505e-05, Linf 0.00290644, total time[s] 0.070339 +Converged at iteration 25, L1 7.63668e-05, Linf 0.00301025, total time[s] 0.070421 +Converged at iteration 27, L1 6.9202e-05, Linf 0.00312861, total time[s] 0.067703 +Converged at iteration 30, L1 8.44222e-05, Linf 0.00580447, total time[s] 0.074119 +Converged at iteration 28, L1 9.19138e-05, Linf 0.00319629, total time[s] 0.07019 +Converged at iteration 30, L1 5.72401e-05, Linf 0.00423473, total time[s] 0.074294 +Converged at iteration 30, L1 5.61209e-05, Linf 0.00165552, total time[s] 0.076836 +Converged at iteration 30, L1 4.81931e-05, Linf 0.00210265, total time[s] 0.076144 +Converged at iteration 32, L1 8.62568e-05, Linf 0.00948812, total time[s] 0.07926 +Converged at iteration 25, L1 8.20277e-05, Linf 0.00318321, total time[s] 0.062552 +Converged at iteration 26, L1 5.90542e-05, Linf 0.00261043, total time[s] 0.065954 +Converged at iteration 23, L1 7.3744e-05, Linf 0.00299316, total time[s] 0.058314 +Converged at iteration 38, L1 8.05859e-05, Linf 0.0112116, total time[s] 0.103366 +Converged at iteration 36, L1 4.74747e-05, Linf 0.00800886, total time[s] 0.091083 +Converged at iteration 24, L1 9.01266e-05, Linf 0.00588987, total time[s] 0.060447 +Converged at iteration 30, L1 7.52905e-05, Linf 0.00627942, total time[s] 0.073782 +Converged at iteration 24, L1 6.90011e-05, Linf 0.00524235, total time[s] 0.06102 +Converged at iteration 22, L1 5.46067e-05, Linf 0.0047026, total time[s] 0.05568 +Converged at iteration 19, L1 7.21755e-05, Linf 0.00709223, total time[s] 0.04966 +Converged at iteration 21, L1 4.55296e-05, Linf 0.00363304, total time[s] 0.054828 +Converged at iteration 23, L1 7.05093e-05, Linf 0.00347554, total time[s] 0.059025 +Converged at iteration 22, L1 9.70844e-05, Linf 0.00605287, total time[s] 0.056682 +Converged at iteration 19, L1 9.5308e-05, Linf 0.00558931, total time[s] 0.050378 +Converged at iteration 17, L1 6.35148e-05, Linf 0.00174481, total time[s] 0.044933 +Converged at iteration 32, L1 4.94959e-05, Linf 0.0042449, total time[s] 0.078597 +Converged at iteration 19, L1 9.67419e-05, Linf 0.00614092, total time[s] 0.049209 +Converged at iteration 23, L1 6.33515e-05, Linf 0.00405226, total time[s] 0.058526 +Converged at iteration 26, L1 9.26574e-05, Linf 0.0055215, total time[s] 0.068831 +Converged at iteration 24, L1 5.42526e-05, Linf 0.00199782, total time[s] 0.060674 +Converged at iteration 21, L1 5.28873e-05, Linf 0.00205251, total time[s] 0.054712 +Converged at iteration 23, L1 8.17679e-05, Linf 0.00290078, total time[s] 0.059141 +Converged at iteration 25, L1 7.58436e-05, Linf 0.00299197, total time[s] 0.064061 +Converged at iteration 27, L1 6.77635e-05, Linf 0.00309676, total time[s] 0.068138 +Converged at iteration 30, L1 8.58897e-05, Linf 0.00594264, total time[s] 0.074571 +Converged at iteration 28, L1 9.28276e-05, Linf 0.00325841, total time[s] 0.069618 +Converged at iteration 30, L1 5.76414e-05, Linf 0.00429178, total time[s] 0.074294 +Converged at iteration 30, L1 5.59402e-05, Linf 0.00163443, total time[s] 0.073807 +Converged at iteration 30, L1 4.98534e-05, Linf 0.0021553, total time[s] 0.074079 +Converged at iteration 32, L1 8.59975e-05, Linf 0.00941141, total time[s] 0.078388 +Converged at iteration 25, L1 7.98908e-05, Linf 0.00310371, total time[s] 0.063339 +Converged at iteration 26, L1 5.89999e-05, Linf 0.0026469, total time[s] 0.065633 +Converged at iteration 23, L1 7.43451e-05, Linf 0.0030231, total time[s] 0.058528 +Converged at iteration 38, L1 7.91519e-05, Linf 0.0114916, total time[s] 0.091899 +Converged at iteration 36, L1 4.68276e-05, Linf 0.0082558, total time[s] 0.089143 +Converged at iteration 24, L1 9.04694e-05, Linf 0.00610054, total time[s] 0.061051 +Converged at iteration 30, L1 7.32314e-05, Linf 0.00648334, total time[s] 0.074152 +Converged at iteration 24, L1 6.88638e-05, Linf 0.00521586, total time[s] 0.060391 +Converged at iteration 22, L1 5.56581e-05, Linf 0.00473935, total time[s] 0.056067 +Converged at iteration 19, L1 7.33368e-05, Linf 0.00722931, total time[s] 0.04897 +Converged at iteration 21, L1 4.57826e-05, Linf 0.00367908, total time[s] 0.056026 +Converged at iteration 23, L1 7.0205e-05, Linf 0.00348918, total time[s] 0.072817 +Converged at iteration 22, L1 9.26201e-05, Linf 0.005928, total time[s] 0.058934 +Converged at iteration 19, L1 9.57423e-05, Linf 0.00562971, total time[s] 0.050682 +Converged at iteration 17, L1 6.43306e-05, Linf 0.00177447, total time[s] 0.046177 +Converged at iteration 32, L1 4.91598e-05, Linf 0.00431428, total time[s] 0.080085 +Converged at iteration 19, L1 9.63958e-05, Linf 0.00597449, total time[s] 0.050618 +Converged at iteration 23, L1 6.26108e-05, Linf 0.00399528, total time[s] 0.059236 +Converged at iteration 26, L1 9.26004e-05, Linf 0.00559181, total time[s] 0.065925 +Converged at iteration 24, L1 5.51158e-05, Linf 0.00206036, total time[s] 0.062004 +Converged at iteration 21, L1 5.42514e-05, Linf 0.00205947, total time[s] 0.055056 +Converged at iteration 23, L1 8.19298e-05, Linf 0.00289789, total time[s] 0.060421 +Converged at iteration 25, L1 7.57687e-05, Linf 0.00297734, total time[s] 0.064686 +Converged at iteration 27, L1 6.69435e-05, Linf 0.00305908, total time[s] 0.068592 +Converged at iteration 30, L1 8.72623e-05, Linf 0.00599172, total time[s] 0.076478 +Converged at iteration 28, L1 9.34493e-05, Linf 0.00322118, total time[s] 0.071675 +Converged at iteration 30, L1 5.78457e-05, Linf 0.00435866, total time[s] 0.076705 +Converged at iteration 30, L1 5.56844e-05, Linf 0.00160385, total time[s] 0.077266 +Converged at iteration 30, L1 5.19974e-05, Linf 0.00223524, total time[s] 0.076819 +Converged at iteration 32, L1 8.58876e-05, Linf 0.00963474, total time[s] 0.081674 +Converged at iteration 25, L1 7.80091e-05, Linf 0.00303248, total time[s] 0.071233 +Converged at iteration 26, L1 5.84234e-05, Linf 0.00264908, total time[s] 0.068574 +Converged at iteration 23, L1 7.50318e-05, Linf 0.00305984, total time[s] 0.061518 +Converged at iteration 38, L1 7.71501e-05, Linf 0.0114232, total time[s] 0.098012 +Converged at iteration 36, L1 4.56447e-05, Linf 0.00818489, total time[s] 0.091577 +Converged at iteration 24, L1 9.01783e-05, Linf 0.00631553, total time[s] 0.063852 +Converged at iteration 30, L1 7.3571e-05, Linf 0.00637269, total time[s] 0.07817 +Converged at iteration 24, L1 6.70453e-05, Linf 0.00518596, total time[s] 0.075293 +Converged at iteration 22, L1 5.34885e-05, Linf 0.00478575, total time[s] 0.057515 +Converged at iteration 19, L1 7.42456e-05, Linf 0.00732612, total time[s] 0.051058 +Converged at iteration 21, L1 4.68275e-05, Linf 0.00376889, total time[s] 0.058303 +Converged at iteration 23, L1 6.98822e-05, Linf 0.00346537, total time[s] 0.061524 +Converged at iteration 22, L1 8.90419e-05, Linf 0.00579096, total time[s] 0.059812 +Converged at iteration 19, L1 9.59058e-05, Linf 0.00554037, total time[s] 0.050643 +Converged at iteration 17, L1 6.55557e-05, Linf 0.00181055, total time[s] 0.047629 +Converged at iteration 32, L1 4.88931e-05, Linf 0.00442693, total time[s] 0.081742 +Converged at iteration 19, L1 9.65427e-05, Linf 0.00577414, total time[s] 0.051391 +Converged at iteration 23, L1 6.22214e-05, Linf 0.00398292, total time[s] 0.063149 +Converged at iteration 26, L1 9.28908e-05, Linf 0.00567095, total time[s] 0.068071 +Converged at iteration 24, L1 5.61146e-05, Linf 0.00213552, total time[s] 0.063348 +Converged at iteration 21, L1 5.42256e-05, Linf 0.00207218, total time[s] 0.056277 +Converged at iteration 23, L1 8.27996e-05, Linf 0.00289447, total time[s] 0.061023 +Converged at iteration 25, L1 7.55248e-05, Linf 0.00295635, total time[s] 0.064622 +Converged at iteration 26, L1 9.95103e-05, Linf 0.00369589, total time[s] 0.068213 +Converged at iteration 30, L1 8.88825e-05, Linf 0.00612024, total time[s] 0.07612 +Converged at iteration 28, L1 9.46977e-05, Linf 0.00328985, total time[s] 0.072338 +Converged at iteration 30, L1 5.82073e-05, Linf 0.00445135, total time[s] 0.076771 +Converged at iteration 30, L1 5.55482e-05, Linf 0.00157057, total time[s] 0.076595 +Converged at iteration 30, L1 5.49431e-05, Linf 0.00235457, total time[s] 0.07665 +Converged at iteration 32, L1 8.59655e-05, Linf 0.00975536, total time[s] 0.081203 +Converged at iteration 25, L1 7.76268e-05, Linf 0.00305382, total time[s] 0.065064 +Converged at iteration 26, L1 5.85414e-05, Linf 0.00267916, total time[s] 0.068779 +Converged at iteration 23, L1 7.62041e-05, Linf 0.00310502, total time[s] 0.06116 +Converged at iteration 38, L1 7.81669e-05, Linf 0.0113728, total time[s] 0.095952 +Converged at iteration 36, L1 4.61423e-05, Linf 0.00815623, total time[s] 0.092156 +Converged at iteration 24, L1 9.04131e-05, Linf 0.006214, total time[s] 0.063109 +Converged at iteration 30, L1 7.369e-05, Linf 0.00630467, total time[s] 0.076845 +Converged at iteration 24, L1 6.80285e-05, Linf 0.00520097, total time[s] 0.064416 +Converged at iteration 22, L1 5.35673e-05, Linf 0.00476395, total time[s] 0.058119 +Converged at iteration 19, L1 7.38307e-05, Linf 0.00725185, total time[s] 0.051434 +Converged at iteration 21, L1 4.67692e-05, Linf 0.00372178, total time[s] 0.056231 +Converged at iteration 23, L1 7.038e-05, Linf 0.00348166, total time[s] 0.064878 +Converged at iteration 22, L1 9.09425e-05, Linf 0.00587563, total time[s] 0.058326 +Converged at iteration 19, L1 9.57067e-05, Linf 0.00557267, total time[s] 0.051242 +Converged at iteration 17, L1 6.47953e-05, Linf 0.0017926, total time[s] 0.047613 +Converged at iteration 32, L1 4.89716e-05, Linf 0.00435596, total time[s] 0.082601 +Converged at iteration 19, L1 9.66211e-05, Linf 0.00587402, total time[s] 0.051996 +Converged at iteration 23, L1 6.27066e-05, Linf 0.00398938, total time[s] 0.060801 +Converged at iteration 26, L1 9.50432e-05, Linf 0.00563191, total time[s] 0.068938 +Converged at iteration 24, L1 5.56361e-05, Linf 0.00209801, total time[s] 0.068105 +Converged at iteration 21, L1 5.38034e-05, Linf 0.00205177, total time[s] 0.090332 +Converged at iteration 23, L1 8.25757e-05, Linf 0.0028968, total time[s] 0.070784 +Converged at iteration 25, L1 7.56518e-05, Linf 0.00296451, total time[s] 0.064312 +Converged at iteration 27, L1 6.59153e-05, Linf 0.00303112, total time[s] 0.0693 +Converged at iteration 30, L1 8.7719e-05, Linf 0.00606135, total time[s] 0.076245 +Converged at iteration 28, L1 9.42455e-05, Linf 0.00325838, total time[s] 0.071824 +Converged at iteration 30, L1 5.89824e-05, Linf 0.00440367, total time[s] 0.076544 +Converged at iteration 30, L1 5.5641e-05, Linf 0.00158679, total time[s] 0.076221 +Converged at iteration 30, L1 5.34961e-05, Linf 0.00229086, total time[s] 0.106574 +Converged at iteration 32, L1 8.57664e-05, Linf 0.0097051, total time[s] 0.121044 +Converged at iteration 25, L1 7.72438e-05, Linf 0.00298617, total time[s] 0.070021 +Converged at iteration 26, L1 5.83653e-05, Linf 0.00266144, total time[s] 0.094721 +Converged at iteration 23, L1 7.57713e-05, Linf 0.00308257, total time[s] 0.076307 +Converged at iteration 38, L1 7.69475e-05, Linf 0.0114866, total time[s] 0.109957 +Converged at iteration 36, L1 4.55396e-05, Linf 0.00818855, total time[s] 0.097731 +Converged at iteration 24, L1 9.0449e-05, Linf 0.00633616, total time[s] 0.069288 +Converged at iteration 30, L1 7.09686e-05, Linf 0.00637108, total time[s] 0.07599 +Converged at iteration 24, L1 6.65765e-05, Linf 0.0051838, total time[s] 0.061805 +Converged at iteration 22, L1 5.47901e-05, Linf 0.00478976, total time[s] 0.059587 +Converged at iteration 19, L1 7.43611e-05, Linf 0.00734402, total time[s] 0.053496 +Converged at iteration 21, L1 4.71271e-05, Linf 0.00377731, total time[s] 0.055384 +Converged at iteration 23, L1 6.9979e-05, Linf 0.00345254, total time[s] 0.059999 +Converged at iteration 22, L1 8.8302e-05, Linf 0.00581163, total time[s] 0.059092 +Converged at iteration 19, L1 9.6136e-05, Linf 0.005534, total time[s] 0.053149 +Converged at iteration 17, L1 6.55663e-05, Linf 0.00181416, total time[s] 0.052171 +Converged at iteration 32, L1 4.88536e-05, Linf 0.00440711, total time[s] 0.082835 +Converged at iteration 19, L1 9.65536e-05, Linf 0.00625187, total time[s] 0.052084 +Converged at iteration 22, L1 9.98117e-05, Linf 0.00597066, total time[s] 0.061315 +Converged at iteration 26, L1 9.25927e-05, Linf 0.0056749, total time[s] 0.068352 +Converged at iteration 24, L1 5.63169e-05, Linf 0.0021431, total time[s] 0.062412 +Converged at iteration 21, L1 5.42942e-05, Linf 0.0020815, total time[s] 0.056762 +Converged at iteration 23, L1 8.31466e-05, Linf 0.00289858, total time[s] 0.063169 +Converged at iteration 25, L1 7.43927e-05, Linf 0.00296071, total time[s] 0.065409 +Converged at iteration 26, L1 9.90288e-05, Linf 0.00373596, total time[s] 0.067245 +Converged at iteration 30, L1 8.87087e-05, Linf 0.00614335, total time[s] 0.076661 +Converged at iteration 28, L1 9.45971e-05, Linf 0.00329681, total time[s] 0.07196 +Converged at iteration 30, L1 5.82444e-05, Linf 0.00446162, total time[s] 0.082558 +Converged at iteration 30, L1 5.56031e-05, Linf 0.0015672, total time[s] 0.077462 +Converged at iteration 30, L1 5.52402e-05, Linf 0.00236672, total time[s] 0.076134 +Converged at iteration 32, L1 8.55664e-05, Linf 0.00976809, total time[s] 0.08075 +Converged at iteration 25, L1 7.57113e-05, Linf 0.00294201, total time[s] 0.06567 +Converged at iteration 26, L1 5.82906e-05, Linf 0.00267994, total time[s] 0.066791 +Converged at iteration 23, L1 7.61061e-05, Linf 0.00310963, total time[s] 0.059914 +Converged at iteration 38, L1 7.56416e-05, Linf 0.0115138, total time[s] 0.099193 +Converged at iteration 36, L1 4.49465e-05, Linf 0.00823264, total time[s] 0.091499 +Converged at iteration 24, L1 9.03316e-05, Linf 0.00648237, total time[s] 0.069854 +Converged at iteration 30, L1 7.03999e-05, Linf 0.00635995, total time[s] 0.076323 +Converged at iteration 24, L1 6.58782e-05, Linf 0.00516426, total time[s] 0.063951 +Converged at iteration 22, L1 5.33761e-05, Linf 0.00481904, total time[s] 0.057747 +Converged at iteration 19, L1 7.51796e-05, Linf 0.00745727, total time[s] 0.050595 +Converged at iteration 21, L1 4.71559e-05, Linf 0.00381697, total time[s] 0.055255 +Converged at iteration 23, L1 6.96532e-05, Linf 0.00347857, total time[s] 0.062882 +Converged at iteration 22, L1 8.45277e-05, Linf 0.00573299, total time[s] 0.057936 +Converged at iteration 19, L1 9.60018e-05, Linf 0.0054872, total time[s] 0.051288 +Converged at iteration 17, L1 6.65278e-05, Linf 0.00184047, total time[s] 0.046772 +Converged at iteration 32, L1 4.87164e-05, Linf 0.00446848, total time[s] 0.081627 +Converged at iteration 19, L1 9.61545e-05, Linf 0.0056054, total time[s] 0.052104 +Converged at iteration 22, L1 9.92825e-05, Linf 0.00590766, total time[s] 0.058678 +Converged at iteration 26, L1 9.25595e-05, Linf 0.0057392, total time[s] 0.069622 +Converged at iteration 24, L1 5.68672e-05, Linf 0.00219677, total time[s] 0.063348 +Converged at iteration 21, L1 5.49307e-05, Linf 0.00216625, total time[s] 0.056127 +Converged at iteration 23, L1 8.30404e-05, Linf 0.00289168, total time[s] 0.061135 +Converged at iteration 25, L1 7.41239e-05, Linf 0.00293798, total time[s] 0.066337 +Converged at iteration 26, L1 9.74028e-05, Linf 0.00367352, total time[s] 0.068543 +Converged at iteration 30, L1 9.00357e-05, Linf 0.0061813, total time[s] 0.079269 +Converged at iteration 28, L1 9.55295e-05, Linf 0.00334023, total time[s] 0.076846 +Converged at iteration 30, L1 5.84447e-05, Linf 0.00452919, total time[s] 0.094326 +Converged at iteration 30, L1 5.5528e-05, Linf 0.00154115, total time[s] 0.081077 +Converged at iteration 30, L1 5.74442e-05, Linf 0.0025016, total time[s] 0.082235 +Converged at iteration 32, L1 8.54143e-05, Linf 0.0098561, total time[s] 0.090632 +Converged at iteration 25, L1 7.43927e-05, Linf 0.00288963, total time[s] 0.066534 +Converged at iteration 26, L1 5.80151e-05, Linf 0.00270823, total time[s] 0.068058 +Converged at iteration 23, L1 7.69474e-05, Linf 0.00314205, total time[s] 0.086033 +Converged at iteration 38, L1 7.41431e-05, Linf 0.0116097, total time[s] 0.099219 +Converged at iteration 36, L1 4.4292e-05, Linf 0.00828228, total time[s] 0.093664 +Converged at iteration 24, L1 9.1238e-05, Linf 0.0066556, total time[s] 0.062658 +Converged at iteration 30, L1 7.08088e-05, Linf 0.00634619, total time[s] 0.07681 +Converged at iteration 24, L1 6.53419e-05, Linf 0.00514251, total time[s] 0.063246 +Converged at iteration 22, L1 5.33767e-05, Linf 0.00485208, total time[s] 0.060445 +Converged at iteration 19, L1 7.63758e-05, Linf 0.00754066, total time[s] 0.054053 +Converged at iteration 21, L1 4.8297e-05, Linf 0.00389942, total time[s] 0.057974 +Converged at iteration 23, L1 6.9672e-05, Linf 0.00346957, total time[s] 0.06125 +Converged at iteration 22, L1 8.31848e-05, Linf 0.00764692, total time[s] 0.05792 +Converged at iteration 19, L1 9.70309e-05, Linf 0.00543008, total time[s] 0.051165 +Converged at iteration 17, L1 6.78817e-05, Linf 0.00187089, total time[s] 0.046479 +Converged at iteration 32, L1 4.84881e-05, Linf 0.00454262, total time[s] 0.080645 +Converged at iteration 19, L1 9.60814e-05, Linf 0.00545113, total time[s] 0.051144 +Converged at iteration 22, L1 9.89215e-05, Linf 0.00584484, total time[s] 0.061355 +Converged at iteration 26, L1 9.25948e-05, Linf 0.00579029, total time[s] 0.068797 +Converged at iteration 24, L1 5.7952e-05, Linf 0.00226242, total time[s] 0.062541 +Converged at iteration 21, L1 5.57269e-05, Linf 0.0025212, total time[s] 0.056612 +Converged at iteration 23, L1 8.39033e-05, Linf 0.00288791, total time[s] 0.06051 +Converged at iteration 25, L1 7.50965e-05, Linf 0.00291977, total time[s] 0.065302 +Converged at iteration 26, L1 9.55146e-05, Linf 0.00364772, total time[s] 0.068989 +Converged at iteration 30, L1 9.18294e-05, Linf 0.00617062, total time[s] 0.076654 +Converged at iteration 28, L1 9.72204e-05, Linf 0.0033865, total time[s] 0.071265 +Converged at iteration 30, L1 5.88624e-05, Linf 0.0046016, total time[s] 0.075711 +Converged at iteration 30, L1 5.54427e-05, Linf 0.00152545, total time[s] 0.075552 +Converged at iteration 30, L1 6.01298e-05, Linf 0.00266841, total time[s] 0.076455 +Converged at iteration 32, L1 8.53192e-05, Linf 0.00996279, total time[s] 0.081032 +Converged at iteration 25, L1 7.28971e-05, Linf 0.00281675, total time[s] 0.065406 +Converged at iteration 26, L1 5.80361e-05, Linf 0.00273343, total time[s] 0.067593 +Converged at iteration 23, L1 7.7781e-05, Linf 0.00318173, total time[s] 0.060363 +Converged at iteration 38, L1 7.51231e-05, Linf 0.0115629, total time[s] 0.096408 +Converged at iteration 36, L1 4.46111e-05, Linf 0.00825766, total time[s] 0.092618 +Converged at iteration 24, L1 9.01531e-05, Linf 0.00656894, total time[s] 0.062752 +Converged at iteration 30, L1 7.27945e-05, Linf 0.00635306, total time[s] 0.078275 +Converged at iteration 24, L1 6.62555e-05, Linf 0.00515331, total time[s] 0.063556 +Converged at iteration 22, L1 5.35276e-05, Linf 0.00483599, total time[s] 0.05963 +Converged at iteration 19, L1 7.57142e-05, Linf 0.00752564, total time[s] 0.055884 +Converged at iteration 21, L1 4.7908e-05, Linf 0.00385512, total time[s] 0.058373 +Converged at iteration 23, L1 6.95793e-05, Linf 0.00347338, total time[s] 0.062785 +Converged at iteration 22, L1 8.29412e-05, Linf 0.00568471, total time[s] 0.060225 +Converged at iteration 19, L1 9.59913e-05, Linf 0.00545871, total time[s] 0.052369 +Converged at iteration 17, L1 6.71763e-05, Linf 0.00185607, total time[s] 0.047532 +Converged at iteration 32, L1 4.85885e-05, Linf 0.00450553, total time[s] 0.083717 +Converged at iteration 19, L1 9.67701e-05, Linf 0.00544827, total time[s] 0.052728 +Converged at iteration 22, L1 9.91537e-05, Linf 0.0058955, total time[s] 0.060792 +Converged at iteration 26, L1 9.25549e-05, Linf 0.00576499, total time[s] 0.068957 +Converged at iteration 24, L1 5.73886e-05, Linf 0.00222926, total time[s] 0.0655 +Converged at iteration 21, L1 5.52307e-05, Linf 0.00220924, total time[s] 0.057734 +Converged at iteration 23, L1 8.32269e-05, Linf 0.00289093, total time[s] 0.062005 +Converged at iteration 25, L1 7.38336e-05, Linf 0.00292863, total time[s] 0.067188 +Converged at iteration 26, L1 9.64513e-05, Linf 0.00367273, total time[s] 0.0702 +Converged at iteration 30, L1 9.08447e-05, Linf 0.00617043, total time[s] 0.078568 +Converged at iteration 28, L1 9.63522e-05, Linf 0.00336505, total time[s] 0.073587 +Converged at iteration 30, L1 5.86172e-05, Linf 0.00456592, total time[s] 0.078269 +Converged at iteration 30, L1 5.54873e-05, Linf 0.00152449, total time[s] 0.07858 +Converged at iteration 30, L1 5.87678e-05, Linf 0.0025867, total time[s] 0.078442 +Converged at iteration 32, L1 8.53735e-05, Linf 0.00990937, total time[s] 0.083167 +Converged at iteration 25, L1 7.35928e-05, Linf 0.00285437, total time[s] 0.067124 +Converged at iteration 26, L1 5.8089e-05, Linf 0.00272009, total time[s] 0.069713 +Converged at iteration 23, L1 7.73302e-05, Linf 0.00316225, total time[s] 0.062297 +Converged at iteration 38, L1 7.39532e-05, Linf 0.0116186, total time[s] 0.099005 +Converged at iteration 36, L1 4.44799e-05, Linf 0.00828794, total time[s] 0.093513 +Converged at iteration 24, L1 9.13186e-05, Linf 0.00667377, total time[s] 0.063861 +Converged at iteration 30, L1 6.89756e-05, Linf 0.00634469, total time[s] 0.085758 +Converged at iteration 24, L1 6.49012e-05, Linf 0.0051405, total time[s] 0.064577 +Converged at iteration 22, L1 5.32034e-05, Linf 0.00485503, total time[s] 0.060839 +Converged at iteration 19, L1 7.65281e-05, Linf 0.00760666, total time[s] 0.052944 +Converged at iteration 21, L1 4.83967e-05, Linf 0.00390821, total time[s] 0.05733 +Converged at iteration 23, L1 6.96635e-05, Linf 0.00347031, total time[s] 0.062369 +Converged at iteration 22, L1 8.1175e-05, Linf 0.00562506, total time[s] 0.060629 +Converged at iteration 19, L1 9.58809e-05, Linf 0.00542443, total time[s] 0.052476 +Converged at iteration 17, L1 6.79995e-05, Linf 0.00187424, total time[s] 0.049834 +Converged at iteration 32, L1 4.84604e-05, Linf 0.00455028, total time[s] 0.099658 +Converged at iteration 19, L1 9.63303e-05, Linf 0.00541074, total time[s] 0.217813 +Converged at iteration 22, L1 9.85396e-05, Linf 0.00568215, total time[s] 0.106393 +Converged at iteration 26, L1 9.27155e-05, Linf 0.00580374, total time[s] 0.084305 +Converged at iteration 24, L1 5.79969e-05, Linf 0.00226914, total time[s] 0.063925 +Converged at iteration 21, L1 5.52986e-05, Linf 0.00224412, total time[s] 0.057167 +Converged at iteration 23, L1 8.38224e-05, Linf 0.00289402, total time[s] 0.062997 +Converged at iteration 25, L1 7.36344e-05, Linf 0.00292289, total time[s] 0.066687 +Converged at iteration 26, L1 9.53512e-05, Linf 0.00364416, total time[s] 0.068307 +Converged at iteration 30, L1 9.18762e-05, Linf 0.00619434, total time[s] 0.080705 +Converged at iteration 28, L1 9.71782e-05, Linf 0.00339103, total time[s] 0.070893 +Converged at iteration 30, L1 5.89949e-05, Linf 0.0046088, total time[s] 0.0772 +Converged at iteration 30, L1 5.57039e-05, Linf 0.00152652, total time[s] 0.076904 +Converged at iteration 30, L1 6.04369e-05, Linf 0.00268659, total time[s] 0.075801 +Converged at iteration 32, L1 8.52433e-05, Linf 0.00997378, total time[s] 0.081915 +Converged at iteration 25, L1 7.26611e-05, Linf 0.00273086, total time[s] 0.064253 +Converged at iteration 26, L1 5.78972e-05, Linf 0.00273799, total time[s] 0.068314 +Converged at iteration 23, L1 7.78848e-05, Linf 0.00318588, total time[s] 0.060109 +Converged at iteration 38, L1 7.31254e-05, Linf 0.0116854, total time[s] 0.099312 +Converged at iteration 36, L1 4.38263e-05, Linf 0.00831883, total time[s] 0.106501 +Converged at iteration 24, L1 9.05816e-05, Linf 0.00679402, total time[s] 0.097008 +Converged at iteration 30, L1 6.82084e-05, Linf 0.00633437, total time[s] 0.082444 +Converged at iteration 24, L1 6.42795e-05, Linf 0.00512632, total time[s] 0.063104 +Converged at iteration 22, L1 5.31411e-05, Linf 0.00487677, total time[s] 0.058163 +Converged at iteration 19, L1 7.76642e-05, Linf 0.00770537, total time[s] 0.051307 +Converged at iteration 21, L1 4.87247e-05, Linf 0.00394899, total time[s] 0.056313 +Converged at iteration 23, L1 6.95292e-05, Linf 0.0034631, total time[s] 0.06223 +Converged at iteration 22, L1 7.85759e-05, Linf 0.00552137, total time[s] 0.058536 +Converged at iteration 19, L1 9.55694e-05, Linf 0.0053822, total time[s] 0.050783 +Converged at iteration 17, L1 6.92061e-05, Linf 0.00189729, total time[s] 0.046162 +Converged at iteration 32, L1 4.82949e-05, Linf 0.00460462, total time[s] 0.081642 +Converged at iteration 19, L1 9.63308e-05, Linf 0.00533181, total time[s] 0.051426 +Converged at iteration 22, L1 9.82271e-05, Linf 0.00579922, total time[s] 0.059686 +Converged at iteration 26, L1 9.33303e-05, Linf 0.00585788, total time[s] 0.075855 +Converged at iteration 24, L1 5.8785e-05, Linf 0.00231697, total time[s] 0.063123 +Converged at iteration 21, L1 5.54779e-05, Linf 0.00229617, total time[s] 0.060204 +Converged at iteration 23, L1 8.40058e-05, Linf 0.00288499, total time[s] 0.064537 +Converged at iteration 25, L1 7.33738e-05, Linf 0.00290585, total time[s] 0.065237 +Converged at iteration 26, L1 9.40612e-05, Linf 0.00361777, total time[s] 0.072741 +Converged at iteration 30, L1 9.31097e-05, Linf 0.00634251, total time[s] 0.077264 +Converged at iteration 28, L1 9.8235e-05, Linf 0.00341422, total time[s] 0.072319 +Converged at iteration 30, L1 5.91565e-05, Linf 0.00466011, total time[s] 0.077952 +Converged at iteration 30, L1 5.53923e-05, Linf 0.00153305, total time[s] 0.078053 +Converged at iteration 30, L1 6.24687e-05, Linf 0.00280739, total time[s] 0.07765 +Converged at iteration 32, L1 8.5132e-05, Linf 0.010052, total time[s] 0.082276 +Converged at iteration 25, L1 7.30449e-05, Linf 0.00264691, total time[s] 0.06638 +Converged at iteration 26, L1 5.7852e-05, Linf 0.00275302, total time[s] 0.069716 +Converged at iteration 23, L1 7.8619e-05, Linf 0.00321459, total time[s] 0.060418 +Converged at iteration 38, L1 7.15493e-05, Linf 0.0116388, total time[s] 0.098197 +Converged at iteration 36, L1 4.30131e-05, Linf 0.0083593, total time[s] 0.095971 +Converged at iteration 24, L1 9.10934e-05, Linf 0.00694755, total time[s] 0.06345 +Converged at iteration 30, L1 6.73293e-05, Linf 0.00641839, total time[s] 0.077354 +Converged at iteration 24, L1 6.34981e-05, Linf 0.0051119, total time[s] 0.063124 +Converged at iteration 22, L1 5.52874e-05, Linf 0.00490846, total time[s] 0.058446 +Converged at iteration 19, L1 7.8903e-05, Linf 0.00782826, total time[s] 0.051457 +Converged at iteration 21, L1 4.91228e-05, Linf 0.00400242, total time[s] 0.057254 +Converged at iteration 23, L1 6.87374e-05, Linf 0.00346456, total time[s] 0.061623 +Converged at iteration 22, L1 7.58983e-05, Linf 0.00546051, total time[s] 0.0584 +Converged at iteration 19, L1 9.53937e-05, Linf 0.00533269, total time[s] 0.051542 +Converged at iteration 17, L1 7.03625e-05, Linf 0.00192397, total time[s] 0.049587 +Converged at iteration 32, L1 4.81628e-05, Linf 0.00467131, total time[s] 0.082141 +Converged at iteration 19, L1 9.55604e-05, Linf 0.00529991, total time[s] 0.050339 +Converged at iteration 22, L1 9.75513e-05, Linf 0.0057479, total time[s] 0.062162 +Converged at iteration 26, L1 9.43194e-05, Linf 0.00590296, total time[s] 0.069785 +Converged at iteration 24, L1 5.9779e-05, Linf 0.00237385, total time[s] 0.063838 +Converged at iteration 21, L1 5.57842e-05, Linf 0.00231199, total time[s] 0.05617 +Converged at iteration 23, L1 8.44473e-05, Linf 0.00288165, total time[s] 0.064539 +Converged at iteration 25, L1 7.28183e-05, Linf 0.00289301, total time[s] 0.066209 +Converged at iteration 26, L1 9.25062e-05, Linf 0.00357508, total time[s] 0.068925 +Converged at iteration 30, L1 9.44772e-05, Linf 0.00655204, total time[s] 0.079018 +Converged at iteration 28, L1 9.93674e-05, Linf 0.00346091, total time[s] 0.073355 +Converged at iteration 30, L1 5.94476e-05, Linf 0.00471997, total time[s] 0.077623 +Converged at iteration 30, L1 5.54964e-05, Linf 0.00154142, total time[s] 0.078963 +Converged at iteration 30, L1 6.51795e-05, Linf 0.00290332, total time[s] 0.078071 +Converged at iteration 32, L1 8.50108e-05, Linf 0.0101459, total time[s] 0.082331 +Converged at iteration 25, L1 7.2421e-05, Linf 0.00255045, total time[s] 0.065783 +Converged at iteration 26, L1 5.83287e-05, Linf 0.00274548, total time[s] 0.068503 +Converged at iteration 23, L1 8.02715e-05, Linf 0.00324878, total time[s] 0.06183 +Converged at iteration 38, L1 7.12112e-05, Linf 0.011856, total time[s] 0.108346 +Converged at iteration 36, L1 4.22466e-05, Linf 0.00840008, total time[s] 0.095345 +Converged at iteration 24, L1 9.15106e-05, Linf 0.00712676, total time[s] 0.063278 +Converged at iteration 30, L1 6.62695e-05, Linf 0.00630589, total time[s] 0.077615 +Converged at iteration 24, L1 6.27626e-05, Linf 0.00509294, total time[s] 0.063276 +Converged at iteration 22, L1 5.54433e-05, Linf 0.00493381, total time[s] 0.059037 +Converged at iteration 19, L1 8.0324e-05, Linf 0.00799628, total time[s] 0.055163 +Converged at iteration 21, L1 4.96315e-05, Linf 0.00408082, total time[s] 0.062154 +Converged at iteration 23, L1 6.82423e-05, Linf 0.00345422, total time[s] 0.060975 +Converged at iteration 22, L1 7.27583e-05, Linf 0.00534798, total time[s] 0.058492 +Converged at iteration 19, L1 9.50062e-05, Linf 0.00530173, total time[s] 0.051274 +Converged at iteration 17, L1 7.21223e-05, Linf 0.00195615, total time[s] 0.052022 +Converged at iteration 32, L1 4.84515e-05, Linf 0.00471609, total time[s] 0.098536 +Converged at iteration 19, L1 9.63424e-05, Linf 0.00526473, total time[s] 0.05175 +Converged at iteration 22, L1 9.69284e-05, Linf 0.00568098, total time[s] 0.058325 +Converged at iteration 26, L1 9.50735e-05, Linf 0.00597291, total time[s] 0.068548 +Converged at iteration 24, L1 6.0981e-05, Linf 0.00244198, total time[s] 0.064899 +Converged at iteration 21, L1 5.61291e-05, Linf 0.00230453, total time[s] 0.056152 +Converged at iteration 23, L1 8.49035e-05, Linf 0.00287836, total time[s] 0.060945 +Converged at iteration 25, L1 7.25865e-05, Linf 0.00286551, total time[s] 0.066795 +Converged at iteration 26, L1 9.06782e-05, Linf 0.00350711, total time[s] 0.069154 +Converged at iteration 30, L1 9.64539e-05, Linf 0.00700004, total time[s] 0.081376 +Converged at iteration 29, L1 5.78118e-05, Linf 0.00240152, total time[s] 0.076251 +Converged at iteration 30, L1 5.97676e-05, Linf 0.00478293, total time[s] 0.080103 +Converged at iteration 30, L1 5.54252e-05, Linf 0.00154892, total time[s] 0.077693 +Converged at iteration 30, L1 6.84052e-05, Linf 0.00277053, total time[s] 0.078236 +Converged at iteration 32, L1 8.5667e-05, Linf 0.0102602, total time[s] 0.083863 +Converged at iteration 25, L1 6.92986e-05, Linf 0.00254738, total time[s] 0.066589 +Converged at iteration 26, L1 5.88886e-05, Linf 0.00281008, total time[s] 0.070828 +Converged at iteration 23, L1 8.07066e-05, Linf 0.00328968, total time[s] 0.061082 +Converged at iteration 38, L1 7.07959e-05, Linf 0.0116777, total time[s] 0.099336 +Converged at iteration 36, L1 4.26216e-05, Linf 0.00838107, total time[s] 0.093062 +Converged at iteration 24, L1 9.07784e-05, Linf 0.00708827, total time[s] 0.063639 +Converged at iteration 30, L1 6.68098e-05, Linf 0.00631488, total time[s] 0.077634 +Converged at iteration 24, L1 6.31579e-05, Linf 0.00510158, total time[s] 0.063927 +Converged at iteration 22, L1 5.30054e-05, Linf 0.00491406, total time[s] 0.058493 +Converged at iteration 19, L1 7.9545e-05, Linf 0.00790941, total time[s] 0.051497 +Converged at iteration 21, L1 4.92336e-05, Linf 0.00403764, total time[s] 0.056527 +Converged at iteration 23, L1 6.84499e-05, Linf 0.00345974, total time[s] 0.061171 +Converged at iteration 22, L1 7.42579e-05, Linf 0.0054047, total time[s] 0.058423 +Converged at iteration 19, L1 9.51107e-05, Linf 0.00530212, total time[s] 0.051349 +Converged at iteration 17, L1 7.11657e-05, Linf 0.00194009, total time[s] 0.046705 +Converged at iteration 32, L1 4.80923e-05, Linf 0.00471213, total time[s] 0.082929 +Converged at iteration 19, L1 9.54413e-05, Linf 0.00528197, total time[s] 0.052223 +Converged at iteration 22, L1 9.71539e-05, Linf 0.00571562, total time[s] 0.069262 +Converged at iteration 26, L1 9.48238e-05, Linf 0.00593766, total time[s] 0.070759 +Converged at iteration 24, L1 6.03893e-05, Linf 0.00240799, total time[s] 0.072844 +Converged at iteration 21, L1 5.59582e-05, Linf 0.00231748, total time[s] 0.071312 +Converged at iteration 23, L1 8.4795e-05, Linf 0.00287939, total time[s] 0.064823 +Converged at iteration 25, L1 7.25727e-05, Linf 0.00287595, total time[s] 0.073941 +Converged at iteration 26, L1 9.15189e-05, Linf 0.00354346, total time[s] 0.06826 +Converged at iteration 30, L1 9.54252e-05, Linf 0.00674284, total time[s] 0.077841 +Converged at iteration 28, L1 9.98746e-05, Linf 0.00348744, total time[s] 0.07288 +Converged at iteration 30, L1 5.96065e-05, Linf 0.00475319, total time[s] 0.077536 +Converged at iteration 30, L1 5.53805e-05, Linf 0.00154595, total time[s] 0.077637 +Converged at iteration 30, L1 6.66489e-05, Linf 0.0028349, total time[s] 0.083461 +Converged at iteration 32, L1 8.49496e-05, Linf 0.0102038, total time[s] 0.081537 +Converged at iteration 25, L1 6.98854e-05, Linf 0.00261811, total time[s] 0.065278 +Converged at iteration 26, L1 5.75806e-05, Linf 0.00279067, total time[s] 0.066806 +Converged at iteration 23, L1 8.04892e-05, Linf 0.00326922, total time[s] 0.0607 +Converged at iteration 38, L1 6.99462e-05, Linf 0.0118744, total time[s] 0.107817 +Converged at iteration 36, L1 4.21421e-05, Linf 0.00840505, total time[s] 0.095051 +Converged at iteration 24, L1 9.13125e-05, Linf 0.00714502, total time[s] 0.063573 +Converged at iteration 30, L1 6.68511e-05, Linf 0.00630418, total time[s] 0.077501 +Converged at iteration 24, L1 6.2962e-05, Linf 0.0050923, total time[s] 0.066964 +Converged at iteration 22, L1 5.42863e-05, Linf 0.00492897, total time[s] 0.05864 +Converged at iteration 19, L1 8.02548e-05, Linf 0.00801583, total time[s] 0.05162 +Converged at iteration 21, L1 4.98074e-05, Linf 0.00409039, total time[s] 0.056115 +Converged at iteration 23, L1 6.82203e-05, Linf 0.00345298, total time[s] 0.061146 +Converged at iteration 22, L1 7.24434e-05, Linf 0.00533624, total time[s] 0.058537 +Converged at iteration 19, L1 9.49903e-05, Linf 0.00526518, total time[s] 0.057187 +Converged at iteration 17, L1 7.22474e-05, Linf 0.00195932, total time[s] 0.052034 +Converged at iteration 32, L1 4.80104e-05, Linf 0.00476186, total time[s] 0.084917 +Converged at iteration 19, L1 9.54473e-05, Linf 0.00555454, total time[s] 0.051992 +Converged at iteration 22, L1 9.68349e-05, Linf 0.00606011, total time[s] 0.058573 +Converged at iteration 26, L1 9.50776e-05, Linf 0.00597451, total time[s] 0.067894 +Converged at iteration 24, L1 6.09715e-05, Linf 0.00244889, total time[s] 0.063778 +Converged at iteration 21, L1 5.61805e-05, Linf 0.00230322, total time[s] 0.057196 +Converged at iteration 23, L1 8.54214e-05, Linf 0.00288199, total time[s] 0.060656 +Converged at iteration 25, L1 7.2046e-05, Linf 0.00286533, total time[s] 0.065356 +Converged at iteration 26, L1 9.05966e-05, Linf 0.0035114, total time[s] 0.068604 +Converged at iteration 30, L1 9.69428e-05, Linf 0.00704903, total time[s] 0.07777 +Converged at iteration 29, L1 5.78132e-05, Linf 0.00239904, total time[s] 0.075356 +Converged at iteration 30, L1 5.99205e-05, Linf 0.00478862, total time[s] 0.081514 +Converged at iteration 30, L1 5.54418e-05, Linf 0.00154951, total time[s] 0.078807 +Converged at iteration 30, L1 6.87614e-05, Linf 0.00275738, total time[s] 0.077139 +Converged at iteration 32, L1 8.48265e-05, Linf 0.0102731, total time[s] 0.08202 +Converged at iteration 25, L1 6.91936e-05, Linf 0.0025535, total time[s] 0.065723 +Converged at iteration 26, L1 5.74517e-05, Linf 0.00280575, total time[s] 0.069172 +Converged at iteration 23, L1 8.09503e-05, Linf 0.00329434, total time[s] 0.062476 +Converged at iteration 38, L1 6.91872e-05, Linf 0.0119225, total time[s] 0.108411 +Converged at iteration 36, L1 4.15747e-05, Linf 0.00843949, total time[s] 0.092212 +Converged at iteration 24, L1 9.14214e-05, Linf 0.00727401, total time[s] 0.063246 +Converged at iteration 30, L1 6.54221e-05, Linf 0.00629249, total time[s] 0.103888 +Converged at iteration 24, L1 6.21875e-05, Linf 0.00508191, total time[s] 0.066585 +Converged at iteration 22, L1 5.28749e-05, Linf 0.0049462, total time[s] 0.059021 +Converged at iteration 19, L1 8.10077e-05, Linf 0.00817989, total time[s] 0.050849 +Converged at iteration 21, L1 5.01417e-05, Linf 0.00412932, total time[s] 0.055423 +Converged at iteration 23, L1 6.80788e-05, Linf 0.00344367, total time[s] 0.060038 +Converged at iteration 22, L1 7.03718e-05, Linf 0.00525264, total time[s] 0.059119 +Converged at iteration 19, L1 9.49754e-05, Linf 0.0052204, total time[s] 0.060544 +Converged at iteration 17, L1 7.37081e-05, Linf 0.00198172, total time[s] 0.064234 +Converged at iteration 32, L1 4.79004e-05, Linf 0.00482184, total time[s] 0.092648 +Converged at iteration 19, L1 9.54742e-05, Linf 0.00529327, total time[s] 0.072216 +Converged at iteration 22, L1 9.65988e-05, Linf 0.00612775, total time[s] 0.058947 +Converged at iteration 26, L1 9.52925e-05, Linf 0.00602199, total time[s] 0.067204 +Converged at iteration 24, L1 6.17836e-05, Linf 0.00249782, total time[s] 0.070321 +Converged at iteration 21, L1 5.66137e-05, Linf 0.00233738, total time[s] 0.055118 +Converged at iteration 23, L1 8.56919e-05, Linf 0.00287402, total time[s] 0.061694 +Converged at iteration 25, L1 7.17971e-05, Linf 0.00286124, total time[s] 0.06605 +Converged at iteration 26, L1 8.91143e-05, Linf 0.00345702, total time[s] 0.067127 +Converged at iteration 30, L1 9.76777e-05, Linf 0.00735605, total time[s] 0.08428 +Converged at iteration 29, L1 5.7948e-05, Linf 0.00239264, total time[s] 0.07449 +Converged at iteration 30, L1 5.99994e-05, Linf 0.00482765, total time[s] 0.082227 +Converged at iteration 30, L1 5.54644e-05, Linf 0.00155293, total time[s] 0.077283 +Converged at iteration 30, L1 7.10672e-05, Linf 0.00267147, total time[s] 0.077959 +Converged at iteration 32, L1 8.47463e-05, Linf 0.0103568, total time[s] 0.085774 +Converged at iteration 25, L1 7.20747e-05, Linf 0.00247147, total time[s] 0.067297 +Converged at iteration 26, L1 5.73476e-05, Linf 0.00282267, total time[s] 0.071328 +Converged at iteration 23, L1 8.19411e-05, Linf 0.0033236, total time[s] 0.062402 +Converged at iteration 38, L1 6.77181e-05, Linf 0.0118703, total time[s] 0.117416 +Converged at iteration 36, L1 4.09883e-05, Linf 0.00848084, total time[s] 0.099846 +Converged at iteration 24, L1 9.12951e-05, Linf 0.00742773, total time[s] 0.063531 +Converged at iteration 30, L1 6.45354e-05, Linf 0.00627822, total time[s] 0.076627 +Converged at iteration 24, L1 6.16522e-05, Linf 0.00507061, total time[s] 0.062352 +Converged at iteration 22, L1 5.27621e-05, Linf 0.00496582, total time[s] 0.058509 +Converged at iteration 19, L1 8.2242e-05, Linf 0.00842344, total time[s] 0.053088 +Converged at iteration 21, L1 5.0551e-05, Linf 0.00418382, total time[s] 0.059575 +Converged at iteration 23, L1 6.8031e-05, Linf 0.0034342, total time[s] 0.062736 +Converged at iteration 22, L1 6.79385e-05, Linf 0.00514835, total time[s] 0.06003 +Converged at iteration 19, L1 9.53173e-05, Linf 0.00516622, total time[s] 0.052307 +Converged at iteration 17, L1 7.51031e-05, Linf 0.00200813, total time[s] 0.04899 +Converged at iteration 32, L1 4.78189e-05, Linf 0.00489288, total time[s] 0.085122 +Converged at iteration 19, L1 9.54781e-05, Linf 0.00522949, total time[s] 0.053208 +Converged at iteration 22, L1 9.57935e-05, Linf 0.0055596, total time[s] 0.061609 +Converged at iteration 26, L1 9.54761e-05, Linf 0.00606776, total time[s] 0.070794 +Converged at iteration 24, L1 6.2716e-05, Linf 0.00255614, total time[s] 0.064456 +Converged at iteration 21, L1 5.76825e-05, Linf 0.00239872, total time[s] 0.057912 +Converged at iteration 23, L1 8.62293e-05, Linf 0.00287047, total time[s] 0.070928 +Converged at iteration 25, L1 7.14636e-05, Linf 0.002842, total time[s] 0.066987 +Converged at iteration 26, L1 8.75142e-05, Linf 0.00337014, total time[s] 0.069213 +Converged at iteration 30, L1 9.86052e-05, Linf 0.00734665, total time[s] 0.079874 +Converged at iteration 29, L1 5.8695e-05, Linf 0.00239787, total time[s] 0.075865 +Converged at iteration 30, L1 6.03686e-05, Linf 0.00487226, total time[s] 0.078237 +Converged at iteration 30, L1 5.56055e-05, Linf 0.00155694, total time[s] 0.079849 +Converged at iteration 30, L1 7.38718e-05, Linf 0.00269345, total time[s] 0.078359 +Converged at iteration 32, L1 8.47336e-05, Linf 0.0104584, total time[s] 0.083597 +Converged at iteration 25, L1 6.95303e-05, Linf 0.00236857, total time[s] 0.067422 +Converged at iteration 26, L1 5.77421e-05, Linf 0.00284278, total time[s] 0.068988 +Converged at iteration 23, L1 8.34028e-05, Linf 0.0033588, total time[s] 0.062705 +Converged at iteration 38, L1 6.60587e-05, Linf 0.0120839, total time[s] 0.098803 +Converged at iteration 36, L1 4.0337e-05, Linf 0.00853227, total time[s] 0.094814 +Converged at iteration 24, L1 9.15426e-05, Linf 0.00761137, total time[s] 0.065589 +Converged at iteration 30, L1 6.34502e-05, Linf 0.00626063, total time[s] 0.078197 +Converged at iteration 24, L1 6.12797e-05, Linf 0.00505929, total time[s] 0.06436 +Converged at iteration 22, L1 5.26282e-05, Linf 0.00499966, total time[s] 0.05975 +Converged at iteration 19, L1 8.36007e-05, Linf 0.00868721, total time[s] 0.052304 +Converged at iteration 21, L1 5.12806e-05, Linf 0.00425831, total time[s] 0.05707 +Converged at iteration 23, L1 6.7435e-05, Linf 0.00342536, total time[s] 0.062531 +Converged at iteration 22, L1 6.50588e-05, Linf 0.005021, total time[s] 0.060238 +Converged at iteration 19, L1 9.61312e-05, Linf 0.00509968, total time[s] 0.052777 +Converged at iteration 17, L1 7.7103e-05, Linf 0.00203976, total time[s] 0.047332 +Converged at iteration 32, L1 4.77887e-05, Linf 0.0049748, total time[s] 0.086539 +Converged at iteration 19, L1 9.55427e-05, Linf 0.00517892, total time[s] 0.053057 +Converged at iteration 22, L1 9.5155e-05, Linf 0.00547689, total time[s] 0.060685 +Converged at iteration 26, L1 9.58993e-05, Linf 0.00612468, total time[s] 0.071874 +Converged at iteration 24, L1 6.3955e-05, Linf 0.00262662, total time[s] 0.065117 +Converged at iteration 21, L1 5.91579e-05, Linf 0.00248137, total time[s] 0.05787 +Converged at iteration 23, L1 8.65112e-05, Linf 0.00286731, total time[s] 0.062068 +Converged at iteration 25, L1 7.09602e-05, Linf 0.00283179, total time[s] 0.066474 +Converged at iteration 26, L1 8.56271e-05, Linf 0.0032931, total time[s] 0.071466 +Converged at iteration 30, L1 9.98848e-05, Linf 0.00693144, total time[s] 0.079414 +Converged at iteration 29, L1 5.94674e-05, Linf 0.00243941, total time[s] 0.077015 +Converged at iteration 30, L1 6.06371e-05, Linf 0.00491473, total time[s] 0.079621 +Converged at iteration 30, L1 5.56543e-05, Linf 0.00156123, total time[s] 0.078506 +Converged at iteration 30, L1 7.84295e-05, Linf 0.00289117, total time[s] 0.078461 +Converged at iteration 32, L1 8.46122e-05, Linf 0.0105814, total time[s] 0.087867 +Converged at iteration 25, L1 6.69571e-05, Linf 0.00223901, total time[s] 0.067499 +Converged at iteration 26, L1 5.70779e-05, Linf 0.00286555, total time[s] 0.069778 +Converged at iteration 23, L1 8.39318e-05, Linf 0.00340071, total time[s] 0.061372 +Converged at iteration 38, L1 6.67607e-05, Linf 0.0120442, total time[s] 0.1235 +Converged at iteration 36, L1 4.06376e-05, Linf 0.0084285, total time[s] 0.093517 +Converged at iteration 24, L1 9.11987e-05, Linf 0.00751983, total time[s] 0.064559 +Converged at iteration 30, L1 6.40745e-05, Linf 0.00626945, total time[s] 0.078678 +Converged at iteration 24, L1 6.13697e-05, Linf 0.00506466, total time[s] 0.065075 +Converged at iteration 22, L1 5.42822e-05, Linf 0.00498292, total time[s] 0.059682 +Converged at iteration 19, L1 8.29969e-05, Linf 0.00856425, total time[s] 0.053303 +Converged at iteration 21, L1 5.07783e-05, Linf 0.00422132, total time[s] 0.057307 +Converged at iteration 23, L1 6.74072e-05, Linf 0.00342996, total time[s] 0.062283 +Converged at iteration 22, L1 6.64469e-05, Linf 0.00508569, total time[s] 0.059833 +Converged at iteration 19, L1 9.56027e-05, Linf 0.00513302, total time[s] 0.05459 +Converged at iteration 17, L1 7.60948e-05, Linf 0.00202404, total time[s] 0.048441 +Converged at iteration 32, L1 4.79973e-05, Linf 0.00493456, total time[s] 0.083268 +Converged at iteration 19, L1 9.55523e-05, Linf 0.00519125, total time[s] 0.052778 +Converged at iteration 22, L1 9.55319e-05, Linf 0.00551792, total time[s] 0.060054 +Converged at iteration 26, L1 9.55948e-05, Linf 0.0060967, total time[s] 0.069151 +Converged at iteration 24, L1 6.33476e-05, Linf 0.00259148, total time[s] 0.065806 +Converged at iteration 21, L1 5.83759e-05, Linf 0.00244001, total time[s] 0.058551 +Converged at iteration 23, L1 8.65269e-05, Linf 0.00286831, total time[s] 0.062759 +Converged at iteration 25, L1 7.10294e-05, Linf 0.00283878, total time[s] 0.066937 +Converged at iteration 26, L1 8.65792e-05, Linf 0.00333139, total time[s] 0.069836 +Converged at iteration 30, L1 9.91209e-05, Linf 0.00714842, total time[s] 0.079378 +Converged at iteration 29, L1 5.91201e-05, Linf 0.00241431, total time[s] 0.076619 +Converged at iteration 30, L1 6.00221e-05, Linf 0.00489513, total time[s] 0.078182 +Converged at iteration 30, L1 5.55598e-05, Linf 0.00155889, total time[s] 0.078744 +Converged at iteration 30, L1 7.53181e-05, Linf 0.00278987, total time[s] 0.079437 +Converged at iteration 32, L1 8.4665e-05, Linf 0.0105197, total time[s] 0.083058 +Converged at iteration 25, L1 6.89847e-05, Linf 0.00233419, total time[s] 0.067209 +Converged at iteration 26, L1 5.6996e-05, Linf 0.00285436, total time[s] 0.072103 +Converged at iteration 23, L1 8.3364e-05, Linf 0.00337992, total time[s] 0.061598 +Converged at iteration 38, L1 6.60566e-05, Linf 0.0120915, total time[s] 0.101666 +Converged at iteration 36, L1 4.03694e-05, Linf 0.00854064, total time[s] 0.101144 +Converged at iteration 24, L1 9.16143e-05, Linf 0.00762998, total time[s] 0.064305 +Converged at iteration 30, L1 6.34189e-05, Linf 0.00625876, total time[s] 0.077187 +Converged at iteration 24, L1 6.11053e-05, Linf 0.00505832, total time[s] 0.062941 +Converged at iteration 22, L1 5.26017e-05, Linf 0.00500306, total time[s] 0.059669 +Converged at iteration 19, L1 8.37363e-05, Linf 0.00871008, total time[s] 0.054848 +Converged at iteration 21, L1 5.13407e-05, Linf 0.00426583, total time[s] 0.058977 +Converged at iteration 23, L1 6.73621e-05, Linf 0.00342425, total time[s] 0.060314 +Converged at iteration 22, L1 6.47995e-05, Linf 0.00500757, total time[s] 0.057468 +Converged at iteration 19, L1 9.62641e-05, Linf 0.00509307, total time[s] 0.05077 +Converged at iteration 17, L1 7.72908e-05, Linf 0.00204326, total time[s] 0.045974 +Converged at iteration 32, L1 4.81142e-05, Linf 0.00498293, total time[s] 0.083352 +Converged at iteration 19, L1 9.58198e-05, Linf 0.00517575, total time[s] 0.052052 +Converged at iteration 22, L1 9.51312e-05, Linf 0.00546849, total time[s] 0.058723 +Converged at iteration 26, L1 9.59204e-05, Linf 0.00613264, total time[s] 0.071432 +Converged at iteration 24, L1 6.40796e-05, Linf 0.00263373, total time[s] 0.063991 +Converged at iteration 21, L1 5.93228e-05, Linf 0.00248966, total time[s] 0.057691 +Converged at iteration 23, L1 8.68648e-05, Linf 0.00286589, total time[s] 0.061398 +Converged at iteration 25, L1 7.08348e-05, Linf 0.00282802, total time[s] 0.066942 +Converged at iteration 26, L1 8.54105e-05, Linf 0.00328649, total time[s] 0.071823 +Converged at iteration 31, L1 5.00056e-05, Linf 0.00453364, total time[s] 0.0805 +Converged at iteration 29, L1 5.9517e-05, Linf 0.00244463, total time[s] 0.075445 +Converged at iteration 30, L1 6.0905e-05, Linf 0.00491923, total time[s] 0.077789 +Converged at iteration 30, L1 5.55821e-05, Linf 0.00156194, total time[s] 0.077825 +Converged at iteration 30, L1 7.97242e-05, Linf 0.00291355, total time[s] 0.079459 +Converged at iteration 32, L1 8.46141e-05, Linf 0.0105935, total time[s] 0.082801 +Converged at iteration 25, L1 6.72846e-05, Linf 0.00221844, total time[s] 0.066081 +Converged at iteration 26, L1 5.77945e-05, Linf 0.00287491, total time[s] 0.068856 +Converged at iteration 23, L1 8.40768e-05, Linf 0.00340504, total time[s] 0.06235 +Converged at iteration 38, L1 6.53344e-05, Linf 0.0121558, total time[s] 0.105778 +Converged at iteration 36, L1 4.02003e-05, Linf 0.00892742, total time[s] 0.092638 +Converged at iteration 24, L1 9.18036e-05, Linf 0.00776196, total time[s] 0.063672 +Converged at iteration 30, L1 6.25556e-05, Linf 0.00624563, total time[s] 0.07805 +Converged at iteration 24, L1 6.07229e-05, Linf 0.0050519, total time[s] 0.063612 +Converged at iteration 22, L1 5.39622e-05, Linf 0.00502398, total time[s] 0.058589 +Converged at iteration 19, L1 8.4752e-05, Linf 0.00884196, total time[s] 0.052409 +Converged at iteration 21, L1 5.15319e-05, Linf 0.00426981, total time[s] 0.056846 +Converged at iteration 23, L1 6.73578e-05, Linf 0.00341946, total time[s] 0.061751 +Converged at iteration 22, L1 6.31813e-05, Linf 0.00491105, total time[s] 0.059397 +Converged at iteration 19, L1 9.7312e-05, Linf 0.00504462, total time[s] 0.056508 +Converged at iteration 17, L1 7.88006e-05, Linf 0.00206619, total time[s] 0.04561 +Converged at iteration 32, L1 4.77546e-05, Linf 0.00503876, total time[s] 0.085655 +Converged at iteration 19, L1 9.61166e-05, Linf 0.00515721, total time[s] 0.05134 +Converged at iteration 22, L1 9.47189e-05, Linf 0.00540637, total time[s] 0.059172 +Converged at iteration 26, L1 9.60106e-05, Linf 0.00616895, total time[s] 0.071572 +Converged at iteration 24, L1 6.49716e-05, Linf 0.00268409, total time[s] 0.063733 +Converged at iteration 21, L1 6.03943e-05, Linf 0.00254909, total time[s] 0.056482 +Converged at iteration 23, L1 8.72295e-05, Linf 0.00286308, total time[s] 0.061699 +Converged at iteration 25, L1 7.12971e-05, Linf 0.00279664, total time[s] 0.083744 +Converged at iteration 26, L1 8.40562e-05, Linf 0.0032396, total time[s] 0.067261 +Converged at iteration 31, L1 5.03077e-05, Linf 0.00444242, total time[s] 0.078182 +Converged at iteration 29, L1 5.98231e-05, Linf 0.00247711, total time[s] 0.074155 +Converged at iteration 30, L1 6.11443e-05, Linf 0.00495239, total time[s] 0.077074 +Converged at iteration 30, L1 5.55608e-05, Linf 0.00156979, total time[s] 0.076605 +Converged at iteration 30, L1 8.05139e-05, Linf 0.0030534, total time[s] 0.07606 +Converged at iteration 32, L1 8.4543e-05, Linf 0.0106836, total time[s] 0.080441 +Converged at iteration 25, L1 6.65379e-05, Linf 0.00212588, total time[s] 0.063887 +Converged at iteration 26, L1 5.67441e-05, Linf 0.00288312, total time[s] 0.067018 +Converged at iteration 23, L1 8.49939e-05, Linf 0.00343482, total time[s] 0.061007 +Converged at iteration 38, L1 6.4326e-05, Linf 0.0122188, total time[s] 0.099064 +Converged at iteration 36, L1 4.02626e-05, Linf 0.00861763, total time[s] 0.093609 +Converged at iteration 24, L1 9.13952e-05, Linf 0.00791852, total time[s] 0.063518 +Converged at iteration 30, L1 6.16083e-05, Linf 0.0062296, total time[s] 0.077661 +Converged at iteration 24, L1 6.03802e-05, Linf 0.00504328, total time[s] 0.064507 +Converged at iteration 22, L1 5.53952e-05, Linf 0.00505024, total time[s] 0.06919 +Converged at iteration 19, L1 8.60478e-05, Linf 0.00892679, total time[s] 0.052485 +Converged at iteration 21, L1 5.12445e-05, Linf 0.00420291, total time[s] 0.05641 +Converged at iteration 23, L1 6.70651e-05, Linf 0.00341537, total time[s] 0.060942 +Converged at iteration 22, L1 6.08843e-05, Linf 0.00479037, total time[s] 0.058846 +Converged at iteration 19, L1 9.78307e-05, Linf 0.00498579, total time[s] 0.051604 +Converged at iteration 17, L1 8.05811e-05, Linf 0.00209322, total time[s] 0.046493 +Converged at iteration 32, L1 4.77622e-05, Linf 0.00510319, total time[s] 0.082343 +Converged at iteration 19, L1 9.56155e-05, Linf 0.00513862, total time[s] 0.050806 +Converged at iteration 22, L1 9.41604e-05, Linf 0.00533181, total time[s] 0.061568 +Converged at iteration 26, L1 9.44299e-05, Linf 0.00621241, total time[s] 0.069138 +Converged at iteration 24, L1 6.60403e-05, Linf 0.00274421, total time[s] 0.063065 +Converged at iteration 21, L1 6.10083e-05, Linf 0.00262017, total time[s] 0.055992 +Converged at iteration 23, L1 8.7687e-05, Linf 0.00286008, total time[s] 0.061609 +Converged at iteration 25, L1 7.04414e-05, Linf 0.00277712, total time[s] 0.067891 +Converged at iteration 26, L1 8.24346e-05, Linf 0.00319287, total time[s] 0.067889 +Converged at iteration 31, L1 5.0857e-05, Linf 0.0043122, total time[s] 0.080749 +Converged at iteration 29, L1 6.01512e-05, Linf 0.0025068, total time[s] 0.075778 +Converged at iteration 30, L1 6.13399e-05, Linf 0.00500178, total time[s] 0.077928 +Converged at iteration 30, L1 5.59008e-05, Linf 0.00158309, total time[s] 0.081424 +Converged at iteration 30, L1 8.41087e-05, Linf 0.00322177, total time[s] 0.077326 +Converged at iteration 32, L1 8.44873e-05, Linf 0.0107924, total time[s] 0.082068 +Converged at iteration 25, L1 6.62372e-05, Linf 0.00200485, total time[s] 0.065476 +Converged at iteration 26, L1 5.65807e-05, Linf 0.00289552, total time[s] 0.068926 +Converged at iteration 23, L1 8.60924e-05, Linf 0.00346964, total time[s] 0.061895 +Converged at iteration 38, L1 6.4112e-05, Linf 0.0121805, total time[s] 0.094055 +Converged at iteration 36, L1 3.95718e-05, Linf 0.00859397, total time[s] 0.093033 +Converged at iteration 24, L1 9.11738e-05, Linf 0.00784033, total time[s] 0.06317 +Converged at iteration 30, L1 6.20802e-05, Linf 0.00623765, total time[s] 0.077562 +Converged at iteration 24, L1 6.05304e-05, Linf 0.00504884, total time[s] 0.062095 +Converged at iteration 22, L1 5.24046e-05, Linf 0.00503783, total time[s] 0.05872 +Converged at iteration 19, L1 8.53722e-05, Linf 0.00889595, total time[s] 0.051627 +Converged at iteration 21, L1 5.12691e-05, Linf 0.00419204, total time[s] 0.056233 +Converged at iteration 23, L1 6.70844e-05, Linf 0.00341726, total time[s] 0.062087 +Converged at iteration 22, L1 6.19682e-05, Linf 0.00485126, total time[s] 0.058724 +Converged at iteration 19, L1 9.75841e-05, Linf 0.00501533, total time[s] 0.050991 +Converged at iteration 17, L1 7.96512e-05, Linf 0.00207955, total time[s] 0.048338 +Converged at iteration 32, L1 4.77385e-05, Linf 0.00507169, total time[s] 0.082135 +Converged at iteration 19, L1 9.58499e-05, Linf 0.00536903, total time[s] 0.051355 +Converged at iteration 22, L1 9.45454e-05, Linf 0.00545699, total time[s] 0.060035 +Converged at iteration 26, L1 9.53601e-05, Linf 0.00619428, total time[s] 0.068275 +Converged at iteration 24, L1 6.54988e-05, Linf 0.00271426, total time[s] 0.06335 +Converged at iteration 21, L1 6.07646e-05, Linf 0.00258467, total time[s] 0.05784 +Converged at iteration 23, L1 8.74607e-05, Linf 0.00286154, total time[s] 0.062541 +Converged at iteration 25, L1 7.02937e-05, Linf 0.00278769, total time[s] 0.065676 +Converged at iteration 26, L1 8.32451e-05, Linf 0.00321477, total time[s] 0.073157 +Converged at iteration 31, L1 5.05753e-05, Linf 0.00439248, total time[s] 0.080587 +Converged at iteration 29, L1 5.99841e-05, Linf 0.00249312, total time[s] 0.075477 +Converged at iteration 30, L1 6.10741e-05, Linf 0.00497575, total time[s] 0.078572 +Converged at iteration 30, L1 5.55659e-05, Linf 0.00157659, total time[s] 0.07754 +Converged at iteration 30, L1 8.19054e-05, Linf 0.00314242, total time[s] 0.077198 +Converged at iteration 32, L1 8.4527e-05, Linf 0.0107382, total time[s] 0.082078 +Converged at iteration 25, L1 6.7116e-05, Linf 0.00206594, total time[s] 0.065383 +Converged at iteration 26, L1 5.65423e-05, Linf 0.00289499, total time[s] 0.0681 +Converged at iteration 23, L1 8.55333e-05, Linf 0.00345238, total time[s] 0.060826 +Converged at iteration 38, L1 6.34106e-05, Linf 0.0122213, total time[s] 0.098337 +Converged at iteration 36, L1 4.03377e-05, Linf 0.00862023, total time[s] 0.097015 +Converged at iteration 24, L1 9.14319e-05, Linf 0.00793478, total time[s] 0.063505 +Converged at iteration 30, L1 6.1715e-05, Linf 0.0062279, total time[s] 0.077513 +Converged at iteration 24, L1 6.04432e-05, Linf 0.00504494, total time[s] 0.072976 +Converged at iteration 22, L1 5.61015e-05, Linf 0.0050528, total time[s] 0.059958 +Converged at iteration 19, L1 8.62315e-05, Linf 0.00893262, total time[s] 0.050882 +Converged at iteration 21, L1 5.15872e-05, Linf 0.00421131, total time[s] 0.055117 +Converged at iteration 23, L1 6.72581e-05, Linf 0.00341541, total time[s] 0.066733 +Converged at iteration 22, L1 6.06758e-05, Linf 0.00477776, total time[s] 0.060176 +Converged at iteration 19, L1 9.78583e-05, Linf 0.00497996, total time[s] 0.051203 +Converged at iteration 17, L1 8.07344e-05, Linf 0.00209587, total time[s] 0.053218 +Converged at iteration 32, L1 4.83312e-05, Linf 0.00505758, total time[s] 0.080778 +Converged at iteration 19, L1 9.62164e-05, Linf 0.00513693, total time[s] 0.051911 +Converged at iteration 22, L1 9.41271e-05, Linf 0.00532447, total time[s] 0.057842 +Converged at iteration 26, L1 9.42634e-05, Linf 0.00622025, total time[s] 0.067281 +Converged at iteration 24, L1 6.61497e-05, Linf 0.00275023, total time[s] 0.062905 +Converged at iteration 21, L1 6.10548e-05, Linf 0.0026273, total time[s] 0.055542 +Converged at iteration 23, L1 8.79251e-05, Linf 0.00286006, total time[s] 0.061356 +Converged at iteration 25, L1 7.00747e-05, Linf 0.00277071, total time[s] 0.065277 +Converged at iteration 26, L1 8.22498e-05, Linf 0.00318876, total time[s] 0.069325 +Converged at iteration 31, L1 5.09452e-05, Linf 0.00429393, total time[s] 0.079271 +Converged at iteration 29, L1 6.02195e-05, Linf 0.00250907, total time[s] 0.073435 +Converged at iteration 30, L1 6.37658e-05, Linf 0.00500977, total time[s] 0.077416 +Converged at iteration 30, L1 5.7201e-05, Linf 0.00158429, total time[s] 0.073915 +Converged at iteration 30, L1 8.46357e-05, Linf 0.00323493, total time[s] 0.074744 +Converged at iteration 32, L1 8.51817e-05, Linf 0.0108017, total time[s] 0.079603 +Converged at iteration 25, L1 6.90312e-05, Linf 0.00198579, total time[s] 0.0637 +Converged at iteration 26, L1 5.86876e-05, Linf 0.00294978, total time[s] 0.070626 +Converged at iteration 23, L1 8.75351e-05, Linf 0.00347312, total time[s] 0.05879 +Converged at iteration 38, L1 6.32263e-05, Linf 0.0122874, total time[s] 0.09317 +Converged at iteration 36, L1 3.93847e-05, Linf 0.00866512, total time[s] 0.089831 +Converged at iteration 24, L1 9.21923e-05, Linf 0.00804925, total time[s] 0.061575 +Converged at iteration 30, L1 6.30615e-05, Linf 0.00621608, total time[s] 0.077438 +Converged at iteration 24, L1 6.23129e-05, Linf 0.0102069, total time[s] 0.062662 +Converged at iteration 22, L1 5.71713e-05, Linf 0.00506684, total time[s] 0.058233 +Converged at iteration 19, L1 8.68819e-05, Linf 0.00900438, total time[s] 0.051058 +Converged at iteration 21, L1 5.20576e-05, Linf 0.0042699, total time[s] 0.055385 +Converged at iteration 23, L1 6.73588e-05, Linf 0.00341153, total time[s] 0.061781 +Converged at iteration 22, L1 6.05984e-05, Linf 0.00468755, total time[s] 0.057171 +Converged at iteration 19, L1 9.87919e-05, Linf 0.00505413, total time[s] 0.050567 +Converged at iteration 17, L1 8.19803e-05, Linf 0.00211507, total time[s] 0.045167 +Converged at iteration 32, L1 4.87304e-05, Linf 0.00507536, total time[s] 0.079669 +Converged at iteration 19, L1 9.61855e-05, Linf 0.0051266, total time[s] 0.079888 +Converged at iteration 22, L1 9.36462e-05, Linf 0.00527237, total time[s] 0.059938 +Converged at iteration 26, L1 9.30159e-05, Linf 0.00625197, total time[s] 0.082364 +Converged at iteration 24, L1 6.69387e-05, Linf 0.00279312, total time[s] 0.079876 +Converged at iteration 21, L1 6.13082e-05, Linf 0.00267837, total time[s] 0.07155 +Converged at iteration 23, L1 8.81277e-05, Linf 0.00285796, total time[s] 0.075728 +Converged at iteration 25, L1 6.98284e-05, Linf 0.00276027, total time[s] 0.108182 +Converged at iteration 26, L1 8.10638e-05, Linf 0.00316212, total time[s] 0.073234 +Converged at iteration 31, L1 5.16083e-05, Linf 0.00416074, total time[s] 0.082244 +Converged at iteration 29, L1 6.05595e-05, Linf 0.00252555, total time[s] 0.086159 +Converged at iteration 30, L1 6.15655e-05, Linf 0.0050448, total time[s] 0.080115 +Converged at iteration 30, L1 5.55572e-05, Linf 0.00159072, total time[s] 0.08297 +Converged at iteration 30, L1 8.68649e-05, Linf 0.00335931, total time[s] 0.078841 +Converged at iteration 32, L1 8.44455e-05, Linf 0.0108829, total time[s] 0.082365 +Converged at iteration 25, L1 6.61048e-05, Linf 0.00186982, total time[s] 0.065575 +Converged at iteration 26, L1 5.6446e-05, Linf 0.00284841, total time[s] 0.06827 +Converged at iteration 23, L1 8.70507e-05, Linf 0.00349705, total time[s] 0.061091 +Converged at iteration 38, L1 6.14e-05, Linf 0.0123196, total time[s] 0.100038 +Converged at iteration 35, L1 9.93701e-05, Linf 0.0123904, total time[s] 0.091286 +Converged at iteration 24, L1 9.16361e-05, Linf 0.00818794, total time[s] 0.06489 +Converged at iteration 30, L1 6.03703e-05, Linf 0.00620188, total time[s] 0.078931 +Converged at iteration 24, L1 5.98518e-05, Linf 0.00504038, total time[s] 0.063833 +Converged at iteration 22, L1 5.20517e-05, Linf 0.00508471, total time[s] 0.061814 +Converged at iteration 19, L1 8.7899e-05, Linf 0.00918067, total time[s] 0.052652 +Converged at iteration 21, L1 5.27945e-05, Linf 0.0042992, total time[s] 0.058522 +Converged at iteration 23, L1 6.71862e-05, Linf 0.00340332, total time[s] 0.065335 +Converged at iteration 22, L1 5.80175e-05, Linf 0.00457603, total time[s] 0.061701 +Converged at iteration 19, L1 9.83662e-05, Linf 0.00488529, total time[s] 0.053557 +Converged at iteration 17, L1 8.34889e-05, Linf 0.00213849, total time[s] 0.049719 +Converged at iteration 32, L1 4.76165e-05, Linf 0.00520944, total time[s] 0.086948 +Converged at iteration 19, L1 9.56866e-05, Linf 0.00511466, total time[s] 0.052862 +Converged at iteration 22, L1 9.34134e-05, Linf 0.00521304, total time[s] 0.059644 +Converged at iteration 26, L1 9.20602e-05, Linf 0.00628613, total time[s] 0.072794 +Converged at iteration 24, L1 6.78509e-05, Linf 0.00284403, total time[s] 0.064766 +Converged at iteration 21, L1 6.13611e-05, Linf 0.00273955, total time[s] 0.057954 +Converged at iteration 23, L1 8.84326e-05, Linf 0.00285562, total time[s] 0.062981 +Converged at iteration 25, L1 6.9355e-05, Linf 0.00274062, total time[s] 0.067566 +Converged at iteration 26, L1 7.96569e-05, Linf 0.00313336, total time[s] 0.070026 +Converged at iteration 31, L1 5.2046e-05, Linf 0.00399778, total time[s] 0.082177 +Converged at iteration 29, L1 6.07511e-05, Linf 0.00254721, total time[s] 0.07781 +Converged at iteration 30, L1 6.21914e-05, Linf 0.00508361, total time[s] 0.079019 +Converged at iteration 30, L1 5.55661e-05, Linf 0.00159611, total time[s] 0.079106 +Converged at iteration 30, L1 8.95886e-05, Linf 0.00350123, total time[s] 0.079155 +Converged at iteration 32, L1 8.4395e-05, Linf 0.0109784, total time[s] 0.084447 +Converged at iteration 25, L1 6.59946e-05, Linf 0.00170386, total time[s] 0.066641 +Converged at iteration 26, L1 5.62239e-05, Linf 0.00285576, total time[s] 0.069929 +Converged at iteration 23, L1 8.80381e-05, Linf 0.0035229, total time[s] 0.062697 +Converged at iteration 38, L1 6.01287e-05, Linf 0.0123833, total time[s] 0.099418 +Converged at iteration 35, L1 9.87185e-05, Linf 0.0125163, total time[s] 0.132765 +Converged at iteration 24, L1 9.22187e-05, Linf 0.00842187, total time[s] 0.067646 +Converged at iteration 30, L1 5.90183e-05, Linf 0.00611322, total time[s] 0.080178 +Converged at iteration 24, L1 5.95446e-05, Linf 0.00503713, total time[s] 0.06533 +Converged at iteration 22, L1 5.17632e-05, Linf 0.00510323, total time[s] 0.063319 +Converged at iteration 19, L1 8.91719e-05, Linf 0.00940641, total time[s] 0.054133 +Converged at iteration 21, L1 5.39779e-05, Linf 0.00441171, total time[s] 0.056702 +Converged at iteration 23, L1 6.65933e-05, Linf 0.0033987, total time[s] 0.063247 +Converged at iteration 22, L1 5.58371e-05, Linf 0.00443774, total time[s] 0.0604 +Converged at iteration 19, L1 9.88958e-05, Linf 0.00482187, total time[s] 0.055554 +Converged at iteration 17, L1 8.54158e-05, Linf 0.00216682, total time[s] 0.056302 +Converged at iteration 32, L1 4.75646e-05, Linf 0.00526978, total time[s] 0.085051 +Converged at iteration 19, L1 9.49726e-05, Linf 0.00510237, total time[s] 0.053798 +Converged at iteration 22, L1 9.26697e-05, Linf 0.00522996, total time[s] 0.061788 +Converged at iteration 26, L1 9.16009e-05, Linf 0.00632283, total time[s] 0.068917 +Converged at iteration 24, L1 6.90289e-05, Linf 0.00290674, total time[s] 0.064558 +Converged at iteration 21, L1 6.13826e-05, Linf 0.00281281, total time[s] 0.058367 +Converged at iteration 23, L1 8.86711e-05, Linf 0.00285389, total time[s] 0.062161 +Converged at iteration 25, L1 6.86768e-05, Linf 0.00273198, total time[s] 0.068773 +Converged at iteration 26, L1 7.80805e-05, Linf 0.00310035, total time[s] 0.071232 +Converged at iteration 31, L1 5.27993e-05, Linf 0.0042018, total time[s] 0.088191 +Converged at iteration 29, L1 6.116e-05, Linf 0.00258485, total time[s] 0.076712 +Converged at iteration 30, L1 6.22193e-05, Linf 0.00514488, total time[s] 0.079026 +Converged at iteration 30, L1 5.56119e-05, Linf 0.0016015, total time[s] 0.08022 +Converged at iteration 30, L1 9.34365e-05, Linf 0.00367039, total time[s] 0.079372 +Converged at iteration 32, L1 8.43381e-05, Linf 0.011094, total time[s] 0.081791 +Converged at iteration 24, L1 9.98204e-05, Linf 0.00365491, total time[s] 0.062424 +Converged at iteration 26, L1 5.62315e-05, Linf 0.00295347, total time[s] 0.067974 +Converged at iteration 23, L1 8.93384e-05, Linf 0.00354899, total time[s] 0.062271 +Converged at iteration 38, L1 6.07774e-05, Linf 0.0123464, total time[s] 0.095933 +Converged at iteration 35, L1 9.90123e-05, Linf 0.0124543, total time[s] 0.09502 +Converged at iteration 24, L1 9.19145e-05, Linf 0.00827028, total time[s] 0.06529 +Converged at iteration 30, L1 6.02921e-05, Linf 0.00619314, total time[s] 0.080996 +Converged at iteration 24, L1 5.96783e-05, Linf 0.00503803, total time[s] 0.065537 +Converged at iteration 22, L1 5.21219e-05, Linf 0.00509428, total time[s] 0.059854 +Converged at iteration 19, L1 8.86212e-05, Linf 0.009291, total time[s] 0.053358 +Converged at iteration 21, L1 5.28767e-05, Linf 0.00432762, total time[s] 0.059815 +Converged at iteration 23, L1 6.72202e-05, Linf 0.00340022, total time[s] 0.063666 +Converged at iteration 22, L1 5.69036e-05, Linf 0.00450735, total time[s] 0.060079 +Converged at iteration 19, L1 9.8577e-05, Linf 0.00485363, total time[s] 0.055992 +Converged at iteration 17, L1 8.43521e-05, Linf 0.00215209, total time[s] 0.048803 +Converged at iteration 32, L1 4.75857e-05, Linf 0.00524018, total time[s] 0.083978 +Converged at iteration 19, L1 9.55201e-05, Linf 0.00501742, total time[s] 0.053232 +Converged at iteration 22, L1 9.31624e-05, Linf 0.00517907, total time[s] 0.062199 +Converged at iteration 26, L1 9.173e-05, Linf 0.00630086, total time[s] 0.070737 +Converged at iteration 24, L1 6.8442e-05, Linf 0.00287487, total time[s] 0.069268 +Converged at iteration 21, L1 6.13834e-05, Linf 0.00277621, total time[s] 0.058021 +Converged at iteration 23, L1 8.86576e-05, Linf 0.00285472, total time[s] 0.063258 +Converged at iteration 25, L1 6.89811e-05, Linf 0.00273508, total time[s] 0.068155 +Converged at iteration 26, L1 7.8884e-05, Linf 0.00311696, total time[s] 0.07005 +Converged at iteration 31, L1 5.24602e-05, Linf 0.00408352, total time[s] 0.082658 +Converged at iteration 29, L1 6.09236e-05, Linf 0.00256251, total time[s] 0.076838 +Converged at iteration 30, L1 6.20316e-05, Linf 0.0051119, total time[s] 0.080862 +Converged at iteration 30, L1 5.55768e-05, Linf 0.00159887, total time[s] 0.080893 +Converged at iteration 30, L1 9.06228e-05, Linf 0.00358637, total time[s] 0.07934 +Converged at iteration 32, L1 8.43733e-05, Linf 0.0110365, total time[s] 0.084016 +Converged at iteration 25, L1 6.60059e-05, Linf 0.00172589, total time[s] 0.067146 +Converged at iteration 26, L1 5.62827e-05, Linf 0.00294411, total time[s] 0.069711 +Converged at iteration 23, L1 8.86398e-05, Linf 0.0035367, total time[s] 0.062704 +Converged at iteration 38, L1 6.00155e-05, Linf 0.0123841, total time[s] 0.101005 +Converged at iteration 35, L1 9.85757e-05, Linf 0.0125306, total time[s] 0.091379 +Converged at iteration 24, L1 9.22422e-05, Linf 0.0083675, total time[s] 0.064791 +Converged at iteration 30, L1 5.89273e-05, Linf 0.00618269, total time[s] 0.083729 +Converged at iteration 24, L1 5.94824e-05, Linf 0.00503708, total time[s] 0.064681 +Converged at iteration 22, L1 5.17385e-05, Linf 0.00510362, total time[s] 0.060319 +Converged at iteration 19, L1 8.93137e-05, Linf 0.00941945, total time[s] 0.053613 +Converged at iteration 21, L1 5.418e-05, Linf 0.00442828, total time[s] 0.058489 +Converged at iteration 23, L1 6.66274e-05, Linf 0.00346654, total time[s] 0.063726 +Converged at iteration 22, L1 5.56649e-05, Linf 0.00442219, total time[s] 0.058173 +Converged at iteration 19, L1 9.89483e-05, Linf 0.00481567, total time[s] 0.053818 +Converged at iteration 17, L1 8.53312e-05, Linf 0.00216947, total time[s] 0.048857 +Converged at iteration 32, L1 4.75608e-05, Linf 0.00527576, total time[s] 0.117216 +Converged at iteration 19, L1 9.49833e-05, Linf 0.00507037, total time[s] 0.052238 +Converged at iteration 22, L1 9.27055e-05, Linf 0.00560423, total time[s] 0.067597 +Converged at iteration 26, L1 9.15134e-05, Linf 0.00632353, total time[s] 0.067197 +Converged at iteration 24, L1 6.91479e-05, Linf 0.00291322, total time[s] 0.068188 +Converged at iteration 21, L1 6.13702e-05, Linf 0.00282015, total time[s] 0.055236 +Converged at iteration 23, L1 8.88486e-05, Linf 0.00285367, total time[s] 0.062704 +Converged at iteration 25, L1 6.87073e-05, Linf 0.00273048, total time[s] 0.064966 +Converged at iteration 26, L1 7.78359e-05, Linf 0.00309706, total time[s] 0.068114 +Converged at iteration 31, L1 5.28584e-05, Linf 0.00423347, total time[s] 0.08158 +Converged at iteration 29, L1 6.122e-05, Linf 0.00259273, total time[s] 0.076064 +Converged at iteration 30, L1 6.2268e-05, Linf 0.00515262, total time[s] 0.077907 +Converged at iteration 30, L1 5.56237e-05, Linf 0.00160211, total time[s] 0.081654 +Converged at iteration 30, L1 9.40019e-05, Linf 0.00368697, total time[s] 0.078305 +Converged at iteration 32, L1 8.43453e-05, Linf 0.0111062, total time[s] 0.084024 +Converged at iteration 24, L1 9.97671e-05, Linf 0.00362586, total time[s] 0.062902 +Converged at iteration 26, L1 5.62063e-05, Linf 0.00286846, total time[s] 0.069209 +Converged at iteration 23, L1 8.94162e-05, Linf 0.00355146, total time[s] 0.069477 +Converged at iteration 38, L1 5.91309e-05, Linf 0.0124284, total time[s] 0.105818 +Converged at iteration 35, L1 9.80395e-05, Linf 0.0126237, total time[s] 0.112614 +Converged at iteration 24, L1 9.23435e-05, Linf 0.00840674, total time[s] 0.064112 +Converged at iteration 30, L1 5.90321e-05, Linf 0.00626907, total time[s] 0.079016 +Converged at iteration 24, L1 5.92712e-05, Linf 0.00503676, total time[s] 0.070924 +Converged at iteration 22, L1 5.15528e-05, Linf 0.00511455, total time[s] 0.072959 +Converged at iteration 19, L1 9.02931e-05, Linf 0.00956721, total time[s] 0.051975 +Converged at iteration 21, L1 5.48835e-05, Linf 0.00449093, total time[s] 0.055884 +Converged at iteration 23, L1 6.65676e-05, Linf 0.00339481, total time[s] 0.061039 +Converged at iteration 22, L1 5.47195e-05, Linf 0.00432072, total time[s] 0.058872 +Converged at iteration 19, L1 9.96192e-05, Linf 0.00476952, total time[s] 0.050876 +Converged at iteration 17, L1 8.66357e-05, Linf 0.00219134, total time[s] 0.04677 +Converged at iteration 32, L1 4.75152e-05, Linf 0.00531657, total time[s] 0.095163 +Converged at iteration 19, L1 9.52352e-05, Linf 0.0050938, total time[s] 0.052397 +Converged at iteration 22, L1 9.23256e-05, Linf 0.00548369, total time[s] 0.066105 +Converged at iteration 26, L1 9.15174e-05, Linf 0.00634974, total time[s] 0.072532 +Converged at iteration 24, L1 7.0137e-05, Linf 0.0029608, total time[s] 0.065741 +Converged at iteration 21, L1 6.15356e-05, Linf 0.00287286, total time[s] 0.065679 +Converged at iteration 23, L1 8.89758e-05, Linf 0.0028522, total time[s] 0.074242 +Converged at iteration 25, L1 6.8296e-05, Linf 0.00272436, total time[s] 0.067671 +Converged at iteration 26, L1 7.66479e-05, Linf 0.00305814, total time[s] 0.070222 +Converged at iteration 31, L1 5.32447e-05, Linf 0.00426307, total time[s] 0.081672 +Converged at iteration 29, L1 6.15971e-05, Linf 0.0026238, total time[s] 0.076925 +Converged at iteration 30, L1 6.25157e-05, Linf 0.00521089, total time[s] 0.079478 +Converged at iteration 30, L1 5.5663e-05, Linf 0.00160596, total time[s] 0.079472 +Converged at iteration 30, L1 9.65662e-05, Linf 0.00380878, total time[s] 0.079203 +Converged at iteration 32, L1 8.43197e-05, Linf 0.0111909, total time[s] 0.083739 +Converged at iteration 24, L1 9.91643e-05, Linf 0.00352813, total time[s] 0.067326 +Converged at iteration 26, L1 5.61492e-05, Linf 0.00296967, total time[s] 0.068996 +Converged at iteration 23, L1 9.0328e-05, Linf 0.00356607, total time[s] 0.066603 +Converged at iteration 38, L1 5.80632e-05, Linf 0.012472, total time[s] 0.098814 +Converged at iteration 35, L1 9.72815e-05, Linf 0.0127309, total time[s] 0.092488 +Converged at iteration 24, L1 9.14624e-05, Linf 0.00862692, total time[s] 0.063708 +Converged at iteration 30, L1 5.73366e-05, Linf 0.00615465, total time[s] 0.080445 +Converged at iteration 24, L1 5.90325e-05, Linf 0.00503743, total time[s] 0.064498 +Converged at iteration 22, L1 5.13477e-05, Linf 0.00512442, total time[s] 0.060461 +Converged at iteration 19, L1 9.14387e-05, Linf 0.00975369, total time[s] 0.052298 +Converged at iteration 21, L1 5.54702e-05, Linf 0.00450046, total time[s] 0.061053 +Converged at iteration 23, L1 6.68632e-05, Linf 0.00339102, total time[s] 0.067736 +Converged at iteration 22, L1 5.33627e-05, Linf 0.00419612, total time[s] 0.05997 +Converged at iteration 19, L1 9.92932e-05, Linf 0.00471361, total time[s] 0.05444 +Converged at iteration 17, L1 8.81487e-05, Linf 0.00221613, total time[s] 0.050199 +Converged at iteration 32, L1 4.74874e-05, Linf 0.00536315, total time[s] 0.084875 +Converged at iteration 19, L1 9.51517e-05, Linf 0.0050848, total time[s] 0.052732 +Converged at iteration 22, L1 9.18334e-05, Linf 0.00505193, total time[s] 0.060269 +Converged at iteration 26, L1 9.12664e-05, Linf 0.00637955, total time[s] 0.069439 +Converged at iteration 24, L1 7.12966e-05, Linf 0.00302168, total time[s] 0.06687 +Converged at iteration 21, L1 6.21499e-05, Linf 0.00293602, total time[s] 0.061178 +Converged at iteration 23, L1 8.92253e-05, Linf 0.00285073, total time[s] 0.063046 +Converged at iteration 25, L1 6.782e-05, Linf 0.0027192, total time[s] 0.067478 +Converged at iteration 26, L1 7.52373e-05, Linf 0.00303392, total time[s] 0.069694 +Converged at iteration 31, L1 5.38015e-05, Linf 0.00414926, total time[s] 0.082278 +Converged at iteration 29, L1 6.21286e-05, Linf 0.00266209, total time[s] 0.077896 +Converged at iteration 30, L1 6.28034e-05, Linf 0.00527928, total time[s] 0.079156 +Converged at iteration 30, L1 5.57326e-05, Linf 0.00160972, total time[s] 0.079138 +Converged at iteration 30, L1 9.97925e-05, Linf 0.00395377, total time[s] 0.079348 +Converged at iteration 32, L1 8.42822e-05, Linf 0.0112933, total time[s] 0.084183 +Converged at iteration 24, L1 9.85283e-05, Linf 0.00338902, total time[s] 0.066555 +Converged at iteration 26, L1 5.60404e-05, Linf 0.00298667, total time[s] 0.067722 +Converged at iteration 23, L1 9.14905e-05, Linf 0.00358007, total time[s] 0.060755 +Converged at iteration 38, L1 5.68436e-05, Linf 0.0127317, total time[s] 0.108318 +Converged at iteration 35, L1 9.65115e-05, Linf 0.0128659, total time[s] 0.161503 +Converged at iteration 24, L1 9.18687e-05, Linf 0.00879922, total time[s] 0.063402 +Converged at iteration 30, L1 5.62679e-05, Linf 0.00613748, total time[s] 0.078279 +Converged at iteration 24, L1 5.88099e-05, Linf 0.00503908, total time[s] 0.06476 +Converged at iteration 22, L1 5.10618e-05, Linf 0.00513373, total time[s] 0.059813 +Converged at iteration 19, L1 9.28886e-05, Linf 0.0106138, total time[s] 0.052702 +Converged at iteration 21, L1 5.63999e-05, Linf 0.00465234, total time[s] 0.057348 +Converged at iteration 23, L1 6.69225e-05, Linf 0.00340281, total time[s] 0.065339 +Converged at iteration 22, L1 5.18229e-05, Linf 0.00404337, total time[s] 0.060259 +Converged at iteration 19, L1 9.98244e-05, Linf 0.00464596, total time[s] 0.0543 +Converged at iteration 17, L1 9.00694e-05, Linf 0.00224733, total time[s] 0.048585 +Converged at iteration 32, L1 4.74828e-05, Linf 0.00541647, total time[s] 0.086127 +Converged at iteration 19, L1 9.47554e-05, Linf 0.00507619, total time[s] 0.052302 +Converged at iteration 22, L1 9.15768e-05, Linf 0.00507747, total time[s] 0.060322 +Converged at iteration 26, L1 9.10501e-05, Linf 0.00641381, total time[s] 0.069957 +Converged at iteration 24, L1 7.25943e-05, Linf 0.00309443, total time[s] 0.0656 +Converged at iteration 21, L1 6.29208e-05, Linf 0.00301174, total time[s] 0.058684 +Converged at iteration 23, L1 8.94518e-05, Linf 0.00284521, total time[s] 0.065591 +Converged at iteration 25, L1 6.74152e-05, Linf 0.00271415, total time[s] 0.06911 +Converged at iteration 26, L1 7.34397e-05, Linf 0.00300122, total time[s] 0.072144 +Converged at iteration 31, L1 5.45936e-05, Linf 0.00394934, total time[s] 0.082117 +Converged at iteration 29, L1 6.27199e-05, Linf 0.00270735, total time[s] 0.076472 +Converged at iteration 30, L1 6.31774e-05, Linf 0.00537543, total time[s] 0.079111 +Converged at iteration 30, L1 5.58209e-05, Linf 0.00161236, total time[s] 0.079126 +Converged at iteration 31, L1 3.91965e-05, Linf 0.00183768, total time[s] 0.081013 +Converged at iteration 32, L1 8.42566e-05, Linf 0.0114163, total time[s] 0.084002 +Converged at iteration 24, L1 9.98246e-05, Linf 0.00320448, total time[s] 0.064302 +Converged at iteration 26, L1 5.5956e-05, Linf 0.0028925, total time[s] 0.069744 +Converged at iteration 23, L1 9.2886e-05, Linf 0.00359236, total time[s] 0.061798 +Converged at iteration 38, L1 5.74449e-05, Linf 0.0125026, total time[s] 0.099128 +Converged at iteration 35, L1 9.69038e-05, Linf 0.0128018, total time[s] 0.091846 +Converged at iteration 24, L1 9.1606e-05, Linf 0.00871193, total time[s] 0.065493 +Converged at iteration 30, L1 5.69083e-05, Linf 0.00614528, total time[s] 0.07835 +Converged at iteration 24, L1 5.90279e-05, Linf 0.00503835, total time[s] 0.064532 +Converged at iteration 22, L1 5.12032e-05, Linf 0.00513013, total time[s] 0.060252 +Converged at iteration 19, L1 9.20732e-05, Linf 0.0100498, total time[s] 0.053484 +Converged at iteration 21, L1 5.55746e-05, Linf 0.00457312, total time[s] 0.057564 +Converged at iteration 23, L1 6.71043e-05, Linf 0.00338836, total time[s] 0.062465 +Converged at iteration 22, L1 5.25289e-05, Linf 0.00411993, total time[s] 0.060383 +Converged at iteration 19, L1 9.93648e-05, Linf 0.00467987, total time[s] 0.053216 +Converged at iteration 17, L1 8.91681e-05, Linf 0.00223231, total time[s] 0.05298 +Converged at iteration 32, L1 4.74773e-05, Linf 0.00539021, total time[s] 0.093247 +Converged at iteration 19, L1 9.50008e-05, Linf 0.00508026, total time[s] 0.054756 +Converged at iteration 22, L1 9.17183e-05, Linf 0.00502624, total time[s] 0.065591 +Converged at iteration 26, L1 9.12633e-05, Linf 0.00639782, total time[s] 0.071149 +Converged at iteration 24, L1 7.1891e-05, Linf 0.00305813, total time[s] 0.064809 +Converged at iteration 21, L1 6.24776e-05, Linf 0.00297391, total time[s] 0.057646 +Converged at iteration 23, L1 8.93414e-05, Linf 0.00285, total time[s] 0.063477 +Converged at iteration 25, L1 6.76043e-05, Linf 0.0027185, total time[s] 0.071047 +Converged at iteration 26, L1 7.43236e-05, Linf 0.00300989, total time[s] 0.07047 +Converged at iteration 31, L1 5.41854e-05, Linf 0.00403632, total time[s] 0.081794 +Converged at iteration 29, L1 6.24222e-05, Linf 0.00268433, total time[s] 0.076761 +Converged at iteration 30, L1 6.2982e-05, Linf 0.00532582, total time[s] 0.078693 +Converged at iteration 30, L1 5.57942e-05, Linf 0.00161138, total time[s] 0.078856 +Converged at iteration 31, L1 3.93772e-05, Linf 0.00178626, total time[s] 0.08167 +Converged at iteration 32, L1 8.42936e-05, Linf 0.0115529, total time[s] 0.08441 +Converged at iteration 24, L1 9.81793e-05, Linf 0.00329624, total time[s] 0.065797 +Converged at iteration 26, L1 5.59914e-05, Linf 0.00290419, total time[s] 0.08163 +Converged at iteration 23, L1 9.21892e-05, Linf 0.00358706, total time[s] 0.069241 +Converged at iteration 38, L1 5.68368e-05, Linf 0.012528, total time[s] 0.274829 +Converged at iteration 35, L1 9.74778e-05, Linf 0.0128777, total time[s] 0.242349 +Converged at iteration 24, L1 9.18433e-05, Linf 0.00881672, total time[s] 0.077907 +Converged at iteration 30, L1 5.62862e-05, Linf 0.00613393, total time[s] 0.081782 +Converged at iteration 24, L1 5.94967e-05, Linf 0.00504043, total time[s] 0.06856 +Converged at iteration 22, L1 5.11565e-05, Linf 0.00513369, total time[s] 0.059261 +Converged at iteration 19, L1 9.3103e-05, Linf 0.0105408, total time[s] 0.052778 +Converged at iteration 21, L1 5.6349e-05, Linf 0.00466448, total time[s] 0.056959 +Converged at iteration 23, L1 6.68545e-05, Linf 0.00338609, total time[s] 0.061794 +Converged at iteration 22, L1 5.16949e-05, Linf 0.00402754, total time[s] 0.060529 +Converged at iteration 19, L1 9.99309e-05, Linf 0.00463896, total time[s] 0.052102 +Converged at iteration 17, L1 9.02167e-05, Linf 0.0022496, total time[s] 0.050016 +Converged at iteration 32, L1 4.7701e-05, Linf 0.00542183, total time[s] 0.085111 +Converged at iteration 19, L1 9.51476e-05, Linf 0.00508396, total time[s] 0.052336 +Converged at iteration 22, L1 9.14837e-05, Linf 0.00499854, total time[s] 0.067283 +Converged at iteration 26, L1 9.10347e-05, Linf 0.00641702, total time[s] 0.070279 +Converged at iteration 24, L1 7.28854e-05, Linf 0.00310181, total time[s] 0.064273 +Converged at iteration 21, L1 6.30169e-05, Linf 0.00301934, total time[s] 0.057879 +Converged at iteration 23, L1 8.95476e-05, Linf 0.0028492, total time[s] 0.062431 +Converged at iteration 25, L1 6.73964e-05, Linf 0.00272095, total time[s] 0.067056 +Converged at iteration 26, L1 7.32494e-05, Linf 0.0029789, total time[s] 0.070682 +Converged at iteration 31, L1 5.47802e-05, Linf 0.00394927, total time[s] 0.080602 +Converged at iteration 29, L1 6.29086e-05, Linf 0.00271271, total time[s] 0.073956 +Converged at iteration 30, L1 6.32316e-05, Linf 0.00538593, total time[s] 0.076215 +Converged at iteration 30, L1 5.58578e-05, Linf 0.001613, total time[s] 0.076152 +Converged at iteration 31, L1 3.97159e-05, Linf 0.00184826, total time[s] 0.078308 +Converged at iteration 32, L1 8.42701e-05, Linf 0.0114289, total time[s] 0.080603 +Converged at iteration 24, L1 9.78175e-05, Linf 0.00319601, total time[s] 0.063165 +Converged at iteration 26, L1 5.59798e-05, Linf 0.0030095, total time[s] 0.11408 +Converged at iteration 23, L1 9.30222e-05, Linf 0.00359333, total time[s] 0.063004 +Converged at iteration 38, L1 5.57895e-05, Linf 0.0125602, total time[s] 0.096485 +Converged at iteration 35, L1 9.60822e-05, Linf 0.0129747, total time[s] 0.09415 +Converged at iteration 24, L1 9.15978e-05, Linf 0.00894075, total time[s] 0.063132 +Converged at iteration 30, L1 5.57558e-05, Linf 0.00612022, total time[s] 0.076711 +Converged at iteration 24, L1 5.8754e-05, Linf 0.0050434, total time[s] 0.063082 +Converged at iteration 22, L1 5.08671e-05, Linf 0.00513763, total time[s] 0.05781 +Converged at iteration 19, L1 9.42123e-05, Linf 0.0108401, total time[s] 0.050606 +Converged at iteration 21, L1 5.69943e-05, Linf 0.00474999, total time[s] 0.056166 +Converged at iteration 23, L1 6.66948e-05, Linf 0.00338536, total time[s] 0.06096 +Converged at iteration 22, L1 5.08735e-05, Linf 0.00391506, total time[s] 0.058859 +Converged at iteration 20, L1 4.83496e-05, Linf 0.0024567, total time[s] 0.05352 +Converged at iteration 17, L1 9.16295e-05, Linf 0.00227066, total time[s] 0.045838 +Converged at iteration 32, L1 4.75092e-05, Linf 0.00545892, total time[s] 0.080927 +Converged at iteration 19, L1 9.53967e-05, Linf 0.00507333, total time[s] 0.050432 +Converged at iteration 22, L1 9.12589e-05, Linf 0.00496782, total time[s] 0.057593 +Converged at iteration 26, L1 9.08455e-05, Linf 0.00643964, total time[s] 0.06727 +Converged at iteration 24, L1 7.4645e-05, Linf 0.00573772, total time[s] 0.063028 +Converged at iteration 21, L1 6.35664e-05, Linf 0.0030717, total time[s] 0.055807 +Converged at iteration 23, L1 9.04255e-05, Linf 0.00284863, total time[s] 0.059842 +Converged at iteration 25, L1 6.75618e-05, Linf 0.00273391, total time[s] 0.064432 +Converged at iteration 26, L1 7.20086e-05, Linf 0.00295799, total time[s] 0.068915 +Converged at iteration 31, L1 5.53342e-05, Linf 0.00382167, total time[s] 0.082207 +Converged at iteration 29, L1 6.31905e-05, Linf 0.0027432, total time[s] 0.076364 +Converged at iteration 30, L1 6.35e-05, Linf 0.00546308, total time[s] 0.078718 +Converged at iteration 30, L1 5.59386e-05, Linf 0.00161476, total time[s] 0.077011 +Converged at iteration 31, L1 4.06799e-05, Linf 0.00192285, total time[s] 0.080613 +Converged at iteration 32, L1 8.42218e-05, Linf 0.0115201, total time[s] 0.085231 +Converged at iteration 24, L1 9.74485e-05, Linf 0.00306437, total time[s] 0.064553 +Converged at iteration 26, L1 5.69292e-05, Linf 0.0030296, total time[s] 0.069651 +Converged at iteration 23, L1 9.41837e-05, Linf 0.00359892, total time[s] 0.063194 +Converged at iteration 38, L1 5.47188e-05, Linf 0.0126003, total time[s] 0.100106 +Converged at iteration 35, L1 9.55297e-05, Linf 0.0130984, total time[s] 0.092581 +Converged at iteration 24, L1 9.10874e-05, Linf 0.00908908, total time[s] 0.06477 +Converged at iteration 29, L1 9.93349e-05, Linf 0.00753601, total time[s] 0.07763 +Converged at iteration 24, L1 5.84562e-05, Linf 0.00504833, total time[s] 0.065279 +Converged at iteration 22, L1 5.05861e-05, Linf 0.00513931, total time[s] 0.060419 +Converged at iteration 19, L1 9.57902e-05, Linf 0.0109954, total time[s] 0.052937 +Converged at iteration 21, L1 5.7456e-05, Linf 0.00479166, total time[s] 0.057724 +Converged at iteration 23, L1 6.71039e-05, Linf 0.00338644, total time[s] 0.062219 +Converged at iteration 22, L1 4.96327e-05, Linf 0.00377894, total time[s] 0.060469 +Converged at iteration 20, L1 4.82694e-05, Linf 0.00238879, total time[s] 0.055703 +Converged at iteration 17, L1 9.33336e-05, Linf 0.00229838, total time[s] 0.048671 +Converged at iteration 32, L1 4.75314e-05, Linf 0.00550283, total time[s] 0.084089 +Converged at iteration 19, L1 9.44384e-05, Linf 0.00506505, total time[s] 0.053113 +Converged at iteration 22, L1 9.08557e-05, Linf 0.00493894, total time[s] 0.060599 +Converged at iteration 26, L1 9.04946e-05, Linf 0.00646166, total time[s] 0.0698 +Converged at iteration 24, L1 7.5012e-05, Linf 0.003218, total time[s] 0.064737 +Converged at iteration 21, L1 6.38705e-05, Linf 0.003119, total time[s] 0.057821 +Converged at iteration 23, L1 8.9917e-05, Linf 0.00284775, total time[s] 0.062474 +Converged at iteration 25, L1 6.66522e-05, Linf 0.00277601, total time[s] 0.067356 +Converged at iteration 26, L1 7.05085e-05, Linf 0.00289509, total time[s] 0.069862 +Converged at iteration 31, L1 5.62015e-05, Linf 0.00417639, total time[s] 0.081088 +Converged at iteration 29, L1 6.37035e-05, Linf 0.00277634, total time[s] 0.075899 +Converged at iteration 30, L1 6.38185e-05, Linf 0.00555343, total time[s] 0.080663 +Converged at iteration 30, L1 5.60479e-05, Linf 0.00161684, total time[s] 0.078362 +Converged at iteration 31, L1 4.2888e-05, Linf 0.00201424, total time[s] 0.081759 +Converged at iteration 32, L1 8.42118e-05, Linf 0.0116291, total time[s] 0.0918 +Converged at iteration 24, L1 9.74989e-05, Linf 0.00290201, total time[s] 0.068513 +Converged at iteration 26, L1 5.59941e-05, Linf 0.0030421, total time[s] 0.071861 +Converged at iteration 23, L1 9.55026e-05, Linf 0.00360582, total time[s] 0.062637 +Converged at iteration 38, L1 5.52628e-05, Linf 0.0125828, total time[s] 0.098161 +Converged at iteration 35, L1 9.62905e-05, Linf 0.0130375, total time[s] 0.093404 +Converged at iteration 24, L1 9.1357e-05, Linf 0.00901507, total time[s] 0.064946 +Converged at iteration 30, L1 5.49976e-05, Linf 0.00611185, total time[s] 0.079038 +Converged at iteration 24, L1 5.85476e-05, Linf 0.00504562, total time[s] 0.064867 +Converged at iteration 22, L1 5.28261e-05, Linf 0.00513848, total time[s] 0.061174 +Converged at iteration 19, L1 9.51958e-05, Linf 0.0109175, total time[s] 0.055295 +Converged at iteration 21, L1 5.73403e-05, Linf 0.00477708, total time[s] 0.067984 +Converged at iteration 23, L1 6.68471e-05, Linf 0.00338527, total time[s] 0.069322 +Converged at iteration 22, L1 5.01887e-05, Linf 0.00384707, total time[s] 0.061736 +Converged at iteration 20, L1 4.90857e-05, Linf 0.00497152, total time[s] 0.055159 +Converged at iteration 17, L1 9.24176e-05, Linf 0.00228444, total time[s] 0.053806 +Converged at iteration 32, L1 4.75151e-05, Linf 0.00548094, total time[s] 0.08373 +Converged at iteration 19, L1 9.46241e-05, Linf 0.00506751, total time[s] 0.054102 +Converged at iteration 22, L1 9.10678e-05, Linf 0.00495315, total time[s] 0.057857 +Converged at iteration 26, L1 9.06538e-05, Linf 0.00644987, total time[s] 0.066893 +Converged at iteration 24, L1 7.43767e-05, Linf 0.00318616, total time[s] 0.062281 +Converged at iteration 21, L1 6.36913e-05, Linf 0.00311586, total time[s] 0.056957 +Converged at iteration 23, L1 8.99583e-05, Linf 0.00284803, total time[s] 0.066329 +Converged at iteration 25, L1 6.72356e-05, Linf 0.00276003, total time[s] 0.066642 +Converged at iteration 26, L1 7.1189e-05, Linf 0.00290263, total time[s] 0.06979 +Converged at iteration 31, L1 5.57454e-05, Linf 0.00395851, total time[s] 0.08228 +Converged at iteration 29, L1 6.34471e-05, Linf 0.00276043, total time[s] 0.075059 +Converged at iteration 30, L1 6.38861e-05, Linf 0.00550874, total time[s] 0.076707 +Converged at iteration 30, L1 5.60818e-05, Linf 0.00161576, total time[s] 0.076995 +Converged at iteration 31, L1 4.20491e-05, Linf 0.00196872, total time[s] 0.079178 +Converged at iteration 32, L1 8.42472e-05, Linf 0.011778, total time[s] 0.081346 +Converged at iteration 24, L1 9.76295e-05, Linf 0.00297997, total time[s] 0.063358 +Converged at iteration 26, L1 5.6676e-05, Linf 0.00290274, total time[s] 0.068385 +Converged at iteration 23, L1 9.52495e-05, Linf 0.00360213, total time[s] 0.061685 +Converged at iteration 38, L1 5.57899e-05, Linf 0.012606, total time[s] 0.124819 +Converged at iteration 35, L1 9.56761e-05, Linf 0.0131036, total time[s] 0.091053 +Converged at iteration 24, L1 9.11674e-05, Linf 0.00909668, total time[s] 0.065329 +Converged at iteration 29, L1 9.91946e-05, Linf 0.00753519, total time[s] 0.075583 +Converged at iteration 24, L1 5.84619e-05, Linf 0.00504902, total time[s] 0.064384 +Converged at iteration 22, L1 5.23161e-05, Linf 0.00513831, total time[s] 0.058063 +Converged at iteration 19, L1 9.59227e-05, Linf 0.0110118, total time[s] 0.050723 +Converged at iteration 21, L1 5.74847e-05, Linf 0.0047925, total time[s] 0.05612 +Converged at iteration 23, L1 6.72346e-05, Linf 0.00338724, total time[s] 0.060161 +Converged at iteration 22, L1 4.95525e-05, Linf 0.00376497, total time[s] 0.057709 +Converged at iteration 20, L1 4.8255e-05, Linf 0.00238208, total time[s] 0.053261 +Converged at iteration 17, L1 9.35113e-05, Linf 0.00230099, total time[s] 0.045427 +Converged at iteration 32, L1 4.75386e-05, Linf 0.00550732, total time[s] 0.080982 +Converged at iteration 19, L1 9.44381e-05, Linf 0.00507297, total time[s] 0.051114 +Converged at iteration 22, L1 9.08844e-05, Linf 0.00515492, total time[s] 0.058281 +Converged at iteration 26, L1 9.04636e-05, Linf 0.00646522, total time[s] 0.066957 +Converged at iteration 24, L1 7.5156e-05, Linf 0.0032245, total time[s] 0.062346 +Converged at iteration 21, L1 6.39158e-05, Linf 0.00315495, total time[s] 0.055941 +Converged at iteration 23, L1 8.99532e-05, Linf 0.0028431, total time[s] 0.060988 +Converged at iteration 25, L1 6.66172e-05, Linf 0.0027993, total time[s] 0.064526 +Converged at iteration 26, L1 7.04102e-05, Linf 0.00287547, total time[s] 0.066826 +Converged at iteration 31, L1 5.63034e-05, Linf 0.00419135, total time[s] 0.07932 +Converged at iteration 29, L1 6.37687e-05, Linf 0.00277921, total time[s] 0.073759 +Converged at iteration 30, L1 6.42206e-05, Linf 0.00552155, total time[s] 0.075926 +Converged at iteration 30, L1 5.62626e-05, Linf 0.00161679, total time[s] 0.077378 +Converged at iteration 31, L1 4.43165e-05, Linf 0.00202466, total time[s] 0.079438 +Converged at iteration 32, L1 8.44134e-05, Linf 0.0116413, total time[s] 0.081193 +Converged at iteration 25, L1 6.99528e-05, Linf 0.00175391, total time[s] 0.064734 +Converged at iteration 26, L1 5.65515e-05, Linf 0.00304456, total time[s] 0.067613 +Converged at iteration 23, L1 9.61766e-05, Linf 0.00360662, total time[s] 0.060616 +Converged at iteration 38, L1 5.40074e-05, Linf 0.0126407, total time[s] 0.099311 +Converged at iteration 35, L1 9.51476e-05, Linf 0.0131987, total time[s] 0.100957 +Converged at iteration 24, L1 9.01122e-05, Linf 0.00921026, total time[s] 0.064046 +Converged at iteration 29, L1 9.82538e-05, Linf 0.00752956, total time[s] 0.073852 +Converged at iteration 24, L1 5.83292e-05, Linf 0.00505342, total time[s] 0.062208 +Converged at iteration 22, L1 5.41218e-05, Linf 0.00513975, total time[s] 0.057782 +Converged at iteration 19, L1 9.65764e-05, Linf 0.0111272, total time[s] 0.0509 +Converged at iteration 21, L1 5.77037e-05, Linf 0.00482534, total time[s] 0.058853 +Converged at iteration 23, L1 6.73975e-05, Linf 0.00338922, total time[s] 0.063762 +Converged at iteration 22, L1 4.91219e-05, Linf 0.00366587, total time[s] 0.059577 +Converged at iteration 20, L1 4.80836e-05, Linf 0.00237965, total time[s] 0.053678 +Converged at iteration 17, L1 9.46436e-05, Linf 0.00231858, total time[s] 0.04991 +Converged at iteration 32, L1 4.77415e-05, Linf 0.00550408, total time[s] 0.094652 +Converged at iteration 19, L1 9.50648e-05, Linf 0.00506967, total time[s] 0.058099 +Converged at iteration 22, L1 9.07278e-05, Linf 0.00491806, total time[s] 0.061152 +Converged at iteration 26, L1 9.03311e-05, Linf 0.00647864, total time[s] 0.070444 +Converged at iteration 24, L1 7.61973e-05, Linf 0.00327088, total time[s] 0.062509 +Converged at iteration 21, L1 6.43015e-05, Linf 0.0031926, total time[s] 0.056995 +Converged at iteration 23, L1 9.07698e-05, Linf 0.00284702, total time[s] 0.060368 +Converged at iteration 25, L1 6.6574e-05, Linf 0.00285084, total time[s] 0.065444 +Converged at iteration 26, L1 6.94693e-05, Linf 0.00286002, total time[s] 0.067043 +Converged at iteration 31, L1 5.6991e-05, Linf 0.00406284, total time[s] 0.078304 +Converged at iteration 29, L1 6.43061e-05, Linf 0.00279967, total time[s] 0.073458 +Converged at iteration 30, L1 6.48081e-05, Linf 0.00558887, total time[s] 0.076079 +Converged at iteration 30, L1 5.68168e-05, Linf 0.0016183, total time[s] 0.076372 +Converged at iteration 31, L1 4.43887e-05, Linf 0.00208551, total time[s] 0.079855 +Converged at iteration 32, L1 8.44895e-05, Linf 0.0117193, total time[s] 0.081512 +Converged at iteration 24, L1 9.75829e-05, Linf 0.00276423, total time[s] 0.061809 +Converged at iteration 26, L1 5.69016e-05, Linf 0.00305477, total time[s] 0.066436 +Converged at iteration 23, L1 9.72643e-05, Linf 0.00361253, total time[s] 0.060391 +Converged at iteration 38, L1 5.30995e-05, Linf 0.0126709, total time[s] 0.099013 +Converged at iteration 35, L1 9.47963e-05, Linf 0.0133048, total time[s] 0.089397 +Converged at iteration 24, L1 9.07626e-05, Linf 0.00933751, total time[s] 0.062145 +Converged at iteration 29, L1 9.79671e-05, Linf 0.00752256, total time[s] 0.073363 +Converged at iteration 24, L1 5.81832e-05, Linf 0.00506018, total time[s] 0.062578 +Converged at iteration 22, L1 5.20174e-05, Linf 0.00513793, total time[s] 0.061695 +Converged at iteration 19, L1 9.79891e-05, Linf 0.0112668, total time[s] 0.056377 +Converged at iteration 21, L1 5.81594e-05, Linf 0.00490547, total time[s] 0.059772 +Converged at iteration 23, L1 6.7795e-05, Linf 0.00343518, total time[s] 0.059752 +Converged at iteration 22, L1 4.87073e-05, Linf 0.00354668, total time[s] 0.057096 +Converged at iteration 20, L1 4.79503e-05, Linf 0.0022761, total time[s] 0.053128 +Converged at iteration 17, L1 9.64467e-05, Linf 0.0041443, total time[s] 0.092192 +Converged at iteration 32, L1 4.75996e-05, Linf 0.00562329, total time[s] 0.086182 +Converged at iteration 19, L1 9.61507e-05, Linf 0.00506015, total time[s] 0.051176 +Converged at iteration 22, L1 9.03113e-05, Linf 0.00489977, total time[s] 0.058404 +Converged at iteration 26, L1 9.00655e-05, Linf 0.0064979, total time[s] 0.067136 +Converged at iteration 24, L1 7.7462e-05, Linf 0.003327, total time[s] 0.062431 +Converged at iteration 21, L1 6.48442e-05, Linf 0.0032494, total time[s] 0.055126 +Converged at iteration 23, L1 9.01391e-05, Linf 0.0028479, total time[s] 0.059998 +Converged at iteration 25, L1 6.62253e-05, Linf 0.00289443, total time[s] 0.065091 +Converged at iteration 26, L1 6.83282e-05, Linf 0.00282554, total time[s] 0.067953 +Converged at iteration 31, L1 5.74604e-05, Linf 0.00416624, total time[s] 0.081318 +Converged at iteration 29, L1 6.45963e-05, Linf 0.00282356, total time[s] 0.0745 +Converged at iteration 30, L1 6.50987e-05, Linf 0.00572233, total time[s] 0.076749 +Converged at iteration 30, L1 5.66452e-05, Linf 0.00161925, total time[s] 0.075921 +Converged at iteration 31, L1 4.54355e-05, Linf 0.00216142, total time[s] 0.077642 +Converged at iteration 32, L1 8.4172e-05, Linf 0.0118156, total time[s] 0.080532 +Converged at iteration 24, L1 9.95251e-05, Linf 0.00260322, total time[s] 0.063335 +Converged at iteration 26, L1 5.72254e-05, Linf 0.00311041, total time[s] 0.066737 +Converged at iteration 23, L1 9.84776e-05, Linf 0.00362053, total time[s] 0.065091 +Converged at iteration 38, L1 5.19259e-05, Linf 0.0129102, total time[s] 0.099059 +Converged at iteration 35, L1 9.44227e-05, Linf 0.0132792, total time[s] 0.091899 +Converged at iteration 24, L1 9.03745e-05, Linf 0.00948855, total time[s] 0.061856 +Converged at iteration 29, L1 9.62948e-05, Linf 0.00751402, total time[s] 0.073642 +Converged at iteration 24, L1 5.88846e-05, Linf 0.00506936, total time[s] 0.062888 +Converged at iteration 22, L1 5.1931e-05, Linf 0.00513442, total time[s] 0.064183 +Converged at iteration 19, L1 9.89365e-05, Linf 0.0114341, total time[s] 0.051559 +Converged at iteration 21, L1 5.89938e-05, Linf 0.0050044, total time[s] 0.055817 +Converged at iteration 23, L1 6.8214e-05, Linf 0.00344745, total time[s] 0.063262 +Converged at iteration 22, L1 4.77327e-05, Linf 0.00340318, total time[s] 0.057612 +Converged at iteration 20, L1 4.81593e-05, Linf 0.00220772, total time[s] 0.055214 +Converged at iteration 17, L1 9.77447e-05, Linf 0.00236668, total time[s] 0.04555 +Converged at iteration 32, L1 4.76654e-05, Linf 0.00562498, total time[s] 0.080995 +Converged at iteration 19, L1 9.48918e-05, Linf 0.00506203, total time[s] 0.050335 +Converged at iteration 22, L1 8.98028e-05, Linf 0.00488232, total time[s] 0.057302 +Converged at iteration 26, L1 8.96471e-05, Linf 0.0065138, total time[s] 0.06656 +Converged at iteration 24, L1 7.9125e-05, Linf 0.00339349, total time[s] 0.064368 +Converged at iteration 21, L1 6.58491e-05, Linf 0.00331592, total time[s] 0.055794 +Converged at iteration 23, L1 9.06784e-05, Linf 0.0028474, total time[s] 0.060183 +Converged at iteration 25, L1 6.56219e-05, Linf 0.00291705, total time[s] 0.064739 +Converged at iteration 26, L1 6.75384e-05, Linf 0.00278738, total time[s] 0.067009 +Converged at iteration 31, L1 5.80868e-05, Linf 0.00399134, total time[s] 0.08236 +Converged at iteration 29, L1 6.52685e-05, Linf 0.00285266, total time[s] 0.075666 +Converged at iteration 30, L1 6.68358e-05, Linf 0.00583013, total time[s] 0.078681 +Converged at iteration 30, L1 5.65351e-05, Linf 0.00161921, total time[s] 0.079445 +Converged at iteration 31, L1 4.70827e-05, Linf 0.00225484, total time[s] 0.081491 +Converged at iteration 32, L1 8.41805e-05, Linf 0.0117721, total time[s] 0.082758 +Converged at iteration 24, L1 9.87155e-05, Linf 0.00244731, total time[s] 0.065107 +Converged at iteration 26, L1 5.59872e-05, Linf 0.00301178, total time[s] 0.068895 +Converged at iteration 23, L1 9.95338e-05, Linf 0.00363136, total time[s] 0.061636 +Converged at iteration 38, L1 5.23679e-05, Linf 0.0125525, total time[s] 0.097356 +Converged at iteration 35, L1 9.44407e-05, Linf 0.0132141, total time[s] 0.093143 +Converged at iteration 24, L1 9.0816e-05, Linf 0.00941146, total time[s] 0.063461 +Converged at iteration 29, L1 9.64153e-05, Linf 0.00764266, total time[s] 0.076836 +Converged at iteration 24, L1 5.81046e-05, Linf 0.00506563, total time[s] 0.064909 +Converged at iteration 22, L1 5.00503e-05, Linf 0.00513706, total time[s] 0.061993 +Converged at iteration 19, L1 9.82313e-05, Linf 0.0113896, total time[s] 0.060739 +Converged at iteration 21, L1 5.86443e-05, Linf 0.00495774, total time[s] 0.057399 +Converged at iteration 23, L1 6.79763e-05, Linf 0.00344499, total time[s] 0.061611 +Converged at iteration 22, L1 4.79363e-05, Linf 0.0034743, total time[s] 0.059311 +Converged at iteration 20, L1 4.80239e-05, Linf 0.00224195, total time[s] 0.055519 +Converged at iteration 17, L1 9.69312e-05, Linf 0.00235456, total time[s] 0.049523 +Converged at iteration 32, L1 4.75937e-05, Linf 0.00560135, total time[s] 0.082743 +Converged at iteration 19, L1 9.50037e-05, Linf 0.00505995, total time[s] 0.052469 +Converged at iteration 22, L1 9.03677e-05, Linf 0.0048907, total time[s] 0.059443 +Converged at iteration 26, L1 8.98354e-05, Linf 0.00650733, total time[s] 0.068214 +Converged at iteration 24, L1 7.82702e-05, Linf 0.00336049, total time[s] 0.06369 +Converged at iteration 21, L1 6.52441e-05, Linf 0.00328263, total time[s] 0.056725 +Converged at iteration 23, L1 9.05032e-05, Linf 0.00284723, total time[s] 0.062863 +Converged at iteration 25, L1 6.58462e-05, Linf 0.00290319, total time[s] 0.069772 +Converged at iteration 26, L1 6.72874e-05, Linf 0.00280618, total time[s] 0.068723 +Converged at iteration 31, L1 5.77203e-05, Linf 0.00397445, total time[s] 0.080605 +Converged at iteration 29, L1 6.48722e-05, Linf 0.00283797, total time[s] 0.079358 +Converged at iteration 30, L1 6.44841e-05, Linf 0.00578165, total time[s] 0.078673 +Converged at iteration 30, L1 5.63181e-05, Linf 0.00161903, total time[s] 0.077846 +Converged at iteration 31, L1 4.62767e-05, Linf 0.00220686, total time[s] 0.080194 +Converged at iteration 32, L1 8.4244e-05, Linf 0.0117141, total time[s] 0.083676 +Converged at iteration 24, L1 9.80429e-05, Linf 0.0025136, total time[s] 0.064831 +Converged at iteration 26, L1 5.69321e-05, Linf 0.00299995, total time[s] 0.069701 +Converged at iteration 23, L1 9.89133e-05, Linf 0.0036258, total time[s] 0.062135 +Converged at iteration 38, L1 5.17671e-05, Linf 0.012688, total time[s] 0.104875 +Converged at iteration 35, L1 9.43034e-05, Linf 0.0134549, total time[s] 0.096721 +Converged at iteration 24, L1 9.02893e-05, Linf 0.00950535, total time[s] 0.064332 +Converged at iteration 29, L1 9.55819e-05, Linf 0.0076388, total time[s] 0.096346 +Converged at iteration 24, L1 5.80287e-05, Linf 0.0050697, total time[s] 0.063223 +Converged at iteration 21, L1 9.9913e-05, Linf 0.00786397, total time[s] 0.057818 +Converged at iteration 19, L1 9.90673e-05, Linf 0.0114475, total time[s] 0.053648 +Converged at iteration 21, L1 5.9055e-05, Linf 0.005011, total time[s] 0.056851 +Converged at iteration 23, L1 6.8266e-05, Linf 0.00345073, total time[s] 0.061672 +Converged at iteration 22, L1 4.7982e-05, Linf 0.00338852, total time[s] 0.060652 +Converged at iteration 20, L1 4.81345e-05, Linf 0.00224703, total time[s] 0.054193 +Converged at iteration 17, L1 9.79437e-05, Linf 0.00237028, total time[s] 0.047069 +Converged at iteration 32, L1 4.75813e-05, Linf 0.00562968, total time[s] 0.083321 +Converged at iteration 19, L1 9.519e-05, Linf 0.0050599, total time[s] 0.052238 +Converged at iteration 22, L1 8.98573e-05, Linf 0.00488066, total time[s] 0.059327 +Converged at iteration 26, L1 8.9623e-05, Linf 0.00651812, total time[s] 0.070566 +Converged at iteration 24, L1 7.92435e-05, Linf 0.00340022, total time[s] 0.064595 +Converged at iteration 21, L1 6.59298e-05, Linf 0.0033231, total time[s] 0.058064 +Converged at iteration 23, L1 9.03408e-05, Linf 0.0028426, total time[s] 0.062016 +Converged at iteration 25, L1 6.5624e-05, Linf 0.00292002, total time[s] 0.066679 +Converged at iteration 26, L1 6.6335e-05, Linf 0.00276771, total time[s] 0.068552 +Converged at iteration 31, L1 5.81247e-05, Linf 0.0039895, total time[s] 0.08062 +Converged at iteration 29, L1 6.51802e-05, Linf 0.00285451, total time[s] 0.075583 +Converged at iteration 30, L1 6.4661e-05, Linf 0.00585594, total time[s] 0.079106 +Converged at iteration 30, L1 5.6401e-05, Linf 0.00161902, total time[s] 0.078127 +Converged at iteration 31, L1 4.72472e-05, Linf 0.00226147, total time[s] 0.080708 +Converged at iteration 32, L1 8.41571e-05, Linf 0.0119448, total time[s] 0.082976 +Converged at iteration 24, L1 9.87137e-05, Linf 0.00242042, total time[s] 0.064529 +Converged at iteration 26, L1 5.5978e-05, Linf 0.0030187, total time[s] 0.070214 +Converged at iteration 23, L1 9.96902e-05, Linf 0.00363274, total time[s] 0.061697 +Converged at iteration 38, L1 5.09952e-05, Linf 0.0127201, total time[s] 0.114515 +Converged at iteration 35, L1 9.41268e-05, Linf 0.0135417, total time[s] 0.092437 +Converged at iteration 24, L1 9.02005e-05, Linf 0.0097053, total time[s] 0.064466 +Converged at iteration 29, L1 9.45313e-05, Linf 0.00740821, total time[s] 0.076274 +Converged at iteration 24, L1 5.79265e-05, Linf 0.00507835, total time[s] 0.065871 +Converged at iteration 22, L1 5.03308e-05, Linf 0.00512638, total time[s] 0.062863 +Converged at iteration 20, L1 2.59043e-05, Linf 0.00575278, total time[s] 0.056262 +Converged at iteration 21, L1 5.94327e-05, Linf 0.00506678, total time[s] 0.058891 +Converged at iteration 23, L1 6.86774e-05, Linf 0.00342195, total time[s] 0.061624 +Converged at iteration 21, L1 9.92319e-05, Linf 0.00536448, total time[s] 0.057079 +Converged at iteration 20, L1 4.84067e-05, Linf 0.00215239, total time[s] 0.054364 +Converged at iteration 17, L1 9.94557e-05, Linf 0.00238883, total time[s] 0.047204 +Converged at iteration 32, L1 4.75749e-05, Linf 0.00566418, total time[s] 0.08207 +Converged at iteration 19, L1 9.44853e-05, Linf 0.0050628, total time[s] 0.051216 +Converged at iteration 22, L1 8.97408e-05, Linf 0.00488043, total time[s] 0.059661 +Converged at iteration 26, L1 8.9411e-05, Linf 0.00653347, total time[s] 0.07051 +Converged at iteration 24, L1 8.03041e-05, Linf 0.00344687, total time[s] 0.064611 +Converged at iteration 21, L1 6.68965e-05, Linf 0.00337159, total time[s] 0.059295 +Converged at iteration 23, L1 9.09292e-05, Linf 0.00284994, total time[s] 0.061267 +Converged at iteration 25, L1 6.53251e-05, Linf 0.00293903, total time[s] 0.066225 +Converged at iteration 26, L1 6.5315e-05, Linf 0.00275924, total time[s] 0.068964 +Converged at iteration 31, L1 5.8745e-05, Linf 0.00399471, total time[s] 0.080425 +Converged at iteration 29, L1 6.55977e-05, Linf 0.00287491, total time[s] 0.076153 +Converged at iteration 30, L1 6.4874e-05, Linf 0.00594579, total time[s] 0.078026 +Converged at iteration 30, L1 5.64979e-05, Linf 0.00161775, total time[s] 0.07807 +Converged at iteration 31, L1 4.86395e-05, Linf 0.00232542, total time[s] 0.082528 +Converged at iteration 32, L1 8.41533e-05, Linf 0.0120294, total time[s] 0.083497 +Converged at iteration 24, L1 9.94273e-05, Linf 0.00230911, total time[s] 0.064544 +Converged at iteration 26, L1 5.5973e-05, Linf 0.00310365, total time[s] 0.069255 +Converged at iteration 24, L1 5.40382e-05, Linf 0.00191192, total time[s] 0.063732 +Converged at iteration 38, L1 4.99884e-05, Linf 0.0127229, total time[s] 0.109681 +Converged at iteration 35, L1 9.37972e-05, Linf 0.0136642, total time[s] 0.128426 +Converged at iteration 24, L1 9.01364e-05, Linf 0.00974619, total time[s] 0.081878 +Converged at iteration 29, L1 9.45717e-05, Linf 0.007499, total time[s] 0.083094 +Converged at iteration 24, L1 5.80158e-05, Linf 0.00508925, total time[s] 0.071743 +Converged at iteration 22, L1 5.56871e-05, Linf 0.00511979, total time[s] 0.075004 +Converged at iteration 20, L1 2.61814e-05, Linf 0.00579984, total time[s] 0.076672 +Converged at iteration 21, L1 5.99289e-05, Linf 0.00511233, total time[s] 0.055225 +Converged at iteration 23, L1 6.90029e-05, Linf 0.00340855, total time[s] 0.059889 +Converged at iteration 21, L1 9.82624e-05, Linf 0.00524907, total time[s] 0.052929 +Converged at iteration 20, L1 4.89221e-05, Linf 0.00217449, total time[s] 0.05317 +Converged at iteration 18, L1 4.75944e-05, Linf 0.00123661, total time[s] 0.054562 +Converged at iteration 32, L1 4.76707e-05, Linf 0.00575258, total time[s] 0.082157 +Converged at iteration 19, L1 9.43001e-05, Linf 0.0051055, total time[s] 0.052734 +Converged at iteration 22, L1 8.9657e-05, Linf 0.00491264, total time[s] 0.058556 +Converged at iteration 26, L1 8.92577e-05, Linf 0.0065463, total time[s] 0.067261 +Converged at iteration 24, L1 8.17203e-05, Linf 0.00350176, total time[s] 0.062051 +Converged at iteration 21, L1 6.78503e-05, Linf 0.00342983, total time[s] 0.056965 +Converged at iteration 23, L1 9.12137e-05, Linf 0.00284804, total time[s] 0.068495 +Converged at iteration 25, L1 6.51203e-05, Linf 0.00294975, total time[s] 0.065088 +Converged at iteration 25, L1 9.97393e-05, Linf 0.0034483, total time[s] 0.066309 +Converged at iteration 31, L1 5.94656e-05, Linf 0.003969, total time[s] 0.080884 +Converged at iteration 29, L1 6.62579e-05, Linf 0.00290213, total time[s] 0.074817 +Converged at iteration 30, L1 6.47737e-05, Linf 0.00604935, total time[s] 0.07862 +Converged at iteration 30, L1 5.6857e-05, Linf 0.00161547, total time[s] 0.076022 +Converged at iteration 31, L1 4.9915e-05, Linf 0.00240082, total time[s] 0.07866 +Converged at iteration 32, L1 8.45634e-05, Linf 0.0121322, total time[s] 0.081708 +Converged at iteration 25, L1 7.48558e-05, Linf 0.00193244, total time[s] 0.066043 +Converged at iteration 26, L1 5.59536e-05, Linf 0.00311913, total time[s] 0.069775 +Converged at iteration 24, L1 5.48499e-05, Linf 0.00193858, total time[s] 0.066478 +Converged at iteration 38, L1 4.8904e-05, Linf 0.012738, total time[s] 0.106923 +Converged at iteration 35, L1 9.33148e-05, Linf 0.0138109, total time[s] 0.094923 +Converged at iteration 24, L1 8.98993e-05, Linf 0.00990056, total time[s] 0.067785 +Converged at iteration 29, L1 9.19006e-05, Linf 0.00748952, total time[s] 0.076762 +Converged at iteration 24, L1 5.7777e-05, Linf 0.00510192, total time[s] 0.063827 +Converged at iteration 22, L1 5.12048e-05, Linf 0.00511031, total time[s] 0.05926 +Converged at iteration 20, L1 2.63516e-05, Linf 0.00585825, total time[s] 0.054789 +Converged at iteration 21, L1 6.06348e-05, Linf 0.00515639, total time[s] 0.056898 +Converged at iteration 23, L1 6.96261e-05, Linf 0.00341828, total time[s] 0.061677 +Converged at iteration 21, L1 9.63913e-05, Linf 0.00510544, total time[s] 0.057994 +Converged at iteration 20, L1 4.96088e-05, Linf 0.00221691, total time[s] 0.05516 +Converged at iteration 18, L1 4.84951e-05, Linf 0.00125032, total time[s] 0.050446 +Converged at iteration 32, L1 4.74746e-05, Linf 0.00573995, total time[s] 0.083064 +Converged at iteration 19, L1 9.38178e-05, Linf 0.00506093, total time[s] 0.062608 +Converged at iteration 22, L1 8.89492e-05, Linf 0.00485299, total time[s] 0.05978 +Converged at iteration 26, L1 8.92017e-05, Linf 0.00656009, total time[s] 0.069155 +Converged at iteration 24, L1 8.32601e-05, Linf 0.00356517, total time[s] 0.078788 +Converged at iteration 21, L1 6.88445e-05, Linf 0.00351264, total time[s] 0.056214 +Converged at iteration 23, L1 9.15777e-05, Linf 0.00284858, total time[s] 0.062705 +Converged at iteration 25, L1 6.45509e-05, Linf 0.00289575, total time[s] 0.070981 +Converged at iteration 25, L1 9.75716e-05, Linf 0.0033965, total time[s] 0.067212 +Converged at iteration 31, L1 6.02989e-05, Linf 0.00390357, total time[s] 0.081766 +Converged at iteration 29, L1 6.73384e-05, Linf 0.00293628, total time[s] 0.076338 +Converged at iteration 30, L1 6.55609e-05, Linf 0.00616849, total time[s] 0.078579 +Converged at iteration 30, L1 5.68285e-05, Linf 0.00161052, total time[s] 0.078172 +Converged at iteration 31, L1 5.16065e-05, Linf 0.0024909, total time[s] 0.081068 +Converged at iteration 32, L1 8.41066e-05, Linf 0.0122559, total time[s] 0.083392 +Converged at iteration 25, L1 7.38807e-05, Linf 0.00197743, total time[s] 0.066916 +Converged at iteration 26, L1 5.5931e-05, Linf 0.00313663, total time[s] 0.069045 +Converged at iteration 24, L1 5.55517e-05, Linf 0.00196312, total time[s] 0.064015 +Converged at iteration 38, L1 4.94244e-05, Linf 0.0127326, total time[s] 0.09454 +Converged at iteration 35, L1 9.34859e-05, Linf 0.0137387, total time[s] 0.091778 +Converged at iteration 24, L1 8.99869e-05, Linf 0.00982509, total time[s] 0.067337 +Converged at iteration 29, L1 9.40718e-05, Linf 0.00749425, total time[s] 0.07635 +Converged at iteration 24, L1 5.78162e-05, Linf 0.00509517, total time[s] 0.064477 +Converged at iteration 21, L1 9.94828e-05, Linf 0.0079715, total time[s] 0.057652 +Converged at iteration 20, L1 2.61868e-05, Linf 0.00582959, total time[s] 0.059839 +Converged at iteration 21, L1 6.03122e-05, Linf 0.00513382, total time[s] 0.057841 +Converged at iteration 23, L1 6.94223e-05, Linf 0.00341415, total time[s] 0.062481 +Converged at iteration 21, L1 9.73163e-05, Linf 0.00517782, total time[s] 0.057394 +Converged at iteration 20, L1 4.92612e-05, Linf 0.00219569, total time[s] 0.055836 +Converged at iteration 18, L1 4.80644e-05, Linf 0.00124345, total time[s] 0.050381 +Converged at iteration 32, L1 4.75191e-05, Linf 0.0057332, total time[s] 0.084785 +Converged at iteration 19, L1 9.40584e-05, Linf 0.00519039, total time[s] 0.053578 +Converged at iteration 22, L1 8.92904e-05, Linf 0.00485656, total time[s] 0.060421 +Converged at iteration 26, L1 8.91961e-05, Linf 0.0065484, total time[s] 0.070055 +Converged at iteration 24, L1 8.24867e-05, Linf 0.00353403, total time[s] 0.064069 +Converged at iteration 21, L1 6.83637e-05, Linf 0.00346477, total time[s] 0.05872 +Converged at iteration 23, L1 9.13924e-05, Linf 0.00284832, total time[s] 0.062338 +Converged at iteration 25, L1 6.47871e-05, Linf 0.00292299, total time[s] 0.067142 +Converged at iteration 25, L1 9.86702e-05, Linf 0.0034221, total time[s] 0.066759 +Converged at iteration 31, L1 6.0163e-05, Linf 0.00393145, total time[s] 0.080871 +Converged at iteration 29, L1 6.67024e-05, Linf 0.00291882, total time[s] 0.077931 +Converged at iteration 30, L1 6.53299e-05, Linf 0.00610837, total time[s] 0.078919 +Converged at iteration 30, L1 5.67171e-05, Linf 0.00161323, total time[s] 0.078188 +Converged at iteration 31, L1 5.19299e-05, Linf 0.00244987, total time[s] 0.085092 +Converged at iteration 32, L1 8.47294e-05, Linf 0.0127013, total time[s] 0.102479 +Converged at iteration 25, L1 7.29706e-05, Linf 0.0019564, total time[s] 0.107366 +Converged at iteration 26, L1 5.59394e-05, Linf 0.00312776, total time[s] 0.076242 +Converged at iteration 24, L1 5.57437e-05, Linf 0.00195467, total time[s] 0.063806 +Converged at iteration 38, L1 4.87139e-05, Linf 0.0127419, total time[s] 0.097115 +Converged at iteration 35, L1 9.32881e-05, Linf 0.0138251, total time[s] 0.090426 +Converged at iteration 24, L1 8.98217e-05, Linf 0.00991928, total time[s] 0.06316 +Converged at iteration 29, L1 9.22187e-05, Linf 0.00748847, total time[s] 0.075708 +Converged at iteration 24, L1 5.77152e-05, Linf 0.00510338, total time[s] 0.062263 +Converged at iteration 21, L1 9.90206e-05, Linf 0.00800936, total time[s] 0.055989 +Converged at iteration 20, L1 2.63854e-05, Linf 0.00586446, total time[s] 0.054506 +Converged at iteration 21, L1 6.06354e-05, Linf 0.00516198, total time[s] 0.056585 +Converged at iteration 23, L1 6.95796e-05, Linf 0.0034193, total time[s] 0.061569 +Converged at iteration 21, L1 9.68621e-05, Linf 0.00506427, total time[s] 0.055998 +Converged at iteration 20, L1 4.96897e-05, Linf 0.00222124, total time[s] 0.054794 +Converged at iteration 18, L1 4.85531e-05, Linf 0.00125143, total time[s] 0.06918 +Converged at iteration 32, L1 4.7477e-05, Linf 0.00574482, total time[s] 0.1016 +Converged at iteration 19, L1 9.42968e-05, Linf 0.00507184, total time[s] 0.05135 +Converged at iteration 22, L1 8.90759e-05, Linf 0.00485242, total time[s] 0.059169 +Converged at iteration 26, L1 8.94097e-05, Linf 0.00656112, total time[s] 0.066393 +Converged at iteration 24, L1 8.34179e-05, Linf 0.00357136, total time[s] 0.061447 +Converged at iteration 21, L1 6.89344e-05, Linf 0.00350669, total time[s] 0.054726 +Converged at iteration 23, L1 9.14774e-05, Linf 0.0028493, total time[s] 0.059334 +Converged at iteration 25, L1 6.45063e-05, Linf 0.00289284, total time[s] 0.064653 +Converged at iteration 25, L1 9.74534e-05, Linf 0.00339054, total time[s] 0.063995 +Converged at iteration 31, L1 6.03902e-05, Linf 0.00391082, total time[s] 0.078355 +Converged at iteration 29, L1 6.71752e-05, Linf 0.00293903, total time[s] 0.07268 +Converged at iteration 30, L1 6.76397e-05, Linf 0.00619675, total time[s] 0.074898 +Converged at iteration 30, L1 6.11279e-05, Linf 0.00160989, total time[s] 0.07427 +Converged at iteration 31, L1 5.27549e-05, Linf 0.00250111, total time[s] 0.077275 +Converged at iteration 32, L1 8.4219e-05, Linf 0.0124998, total time[s] 0.082873 +Converged at iteration 25, L1 7.41825e-05, Linf 0.00198647, total time[s] 0.069076 +Converged at iteration 26, L1 5.59296e-05, Linf 0.00313825, total time[s] 0.085883 +Converged at iteration 24, L1 5.56387e-05, Linf 0.00197421, total time[s] 0.072436 +Converged at iteration 38, L1 4.79126e-05, Linf 0.0127486, total time[s] 0.105917 +Converged at iteration 35, L1 9.3133e-05, Linf 0.0139351, total time[s] 0.09168 +Converged at iteration 24, L1 8.86527e-05, Linf 0.0100326, total time[s] 0.06367 +Converged at iteration 29, L1 9.06774e-05, Linf 0.00748129, total time[s] 0.075085 +Converged at iteration 24, L1 5.76655e-05, Linf 0.00511366, total time[s] 0.065344 +Converged at iteration 21, L1 9.88233e-05, Linf 0.00805375, total time[s] 0.056263 +Converged at iteration 20, L1 2.66972e-05, Linf 0.00590801, total time[s] 0.056367 +Converged at iteration 21, L1 6.10256e-05, Linf 0.00519311, total time[s] 0.058103 +Converged at iteration 23, L1 6.99899e-05, Linf 0.00342546, total time[s] 0.073756 +Converged at iteration 21, L1 9.48859e-05, Linf 0.00498188, total time[s] 0.057859 +Converged at iteration 20, L1 5.02197e-05, Linf 0.00225205, total time[s] 0.072633 +Converged at iteration 18, L1 4.92242e-05, Linf 0.00127115, total time[s] 0.051098 +Converged at iteration 32, L1 4.74649e-05, Linf 0.00580061, total time[s] 0.083735 +Converged at iteration 19, L1 9.35307e-05, Linf 0.00507341, total time[s] 0.053257 +Converged at iteration 22, L1 8.89251e-05, Linf 0.00484872, total time[s] 0.061999 +Converged at iteration 26, L1 8.92906e-05, Linf 0.00657164, total time[s] 0.067576 +Converged at iteration 24, L1 8.45058e-05, Linf 0.00361433, total time[s] 0.063241 +Converged at iteration 21, L1 6.95394e-05, Linf 0.00355699, total time[s] 0.055733 +Converged at iteration 23, L1 9.18669e-05, Linf 0.00284943, total time[s] 0.060087 +Converged at iteration 25, L1 6.42925e-05, Linf 0.00287407, total time[s] 0.064846 +Converged at iteration 25, L1 9.60191e-05, Linf 0.00335444, total time[s] 0.066038 +Converged at iteration 31, L1 6.09618e-05, Linf 0.00397123, total time[s] 0.079464 +Converged at iteration 29, L1 6.76135e-05, Linf 0.00296192, total time[s] 0.074072 +Converged at iteration 30, L1 6.57748e-05, Linf 0.00625945, total time[s] 0.076351 +Converged at iteration 30, L1 5.69874e-05, Linf 0.00160488, total time[s] 0.076716 +Converged at iteration 31, L1 5.25533e-05, Linf 0.00256217, total time[s] 0.079443 +Converged at iteration 32, L1 8.41018e-05, Linf 0.0123601, total time[s] 0.081835 +Converged at iteration 25, L1 7.57336e-05, Linf 0.00202535, total time[s] 0.06523 +Converged at iteration 26, L1 5.59177e-05, Linf 0.0031543, total time[s] 0.070171 +Converged at iteration 24, L1 5.65875e-05, Linf 0.00199578, total time[s] 0.062697 +Converged at iteration 38, L1 4.69493e-05, Linf 0.0127565, total time[s] 0.095727 +Converged at iteration 35, L1 9.30629e-05, Linf 0.0140635, total time[s] 0.090248 +Converged at iteration 24, L1 8.91886e-05, Linf 0.0101675, total time[s] 0.063778 +Converged at iteration 29, L1 8.93826e-05, Linf 0.00747242, total time[s] 0.074762 +Converged at iteration 24, L1 5.76233e-05, Linf 0.00512724, total time[s] 0.062986 +Converged at iteration 21, L1 9.85198e-05, Linf 0.00810541, total time[s] 0.056359 +Converged at iteration 20, L1 2.68894e-05, Linf 0.00596239, total time[s] 0.062637 +Converged at iteration 21, L1 6.1759e-05, Linf 0.00523673, total time[s] 0.057527 +Converged at iteration 23, L1 7.02089e-05, Linf 0.00343206, total time[s] 0.062071 +Converged at iteration 21, L1 9.38678e-05, Linf 0.0048497, total time[s] 0.057859 +Converged at iteration 20, L1 5.09944e-05, Linf 0.0022892, total time[s] 0.055751 +Converged at iteration 18, L1 5.01198e-05, Linf 0.00200507, total time[s] 0.049992 +Converged at iteration 32, L1 4.73731e-05, Linf 0.0058529, total time[s] 0.083536 +Converged at iteration 19, L1 9.39535e-05, Linf 0.00508005, total time[s] 0.052317 +Converged at iteration 22, L1 8.91301e-05, Linf 0.00484657, total time[s] 0.062377 +Converged at iteration 26, L1 8.92191e-05, Linf 0.00658142, total time[s] 0.071637 +Converged at iteration 24, L1 8.57001e-05, Linf 0.00366298, total time[s] 0.064433 +Converged at iteration 21, L1 7.03125e-05, Linf 0.00362737, total time[s] 0.055952 +Converged at iteration 23, L1 9.19594e-05, Linf 0.00285043, total time[s] 0.060637 +Converged at iteration 25, L1 6.38425e-05, Linf 0.00285714, total time[s] 0.065083 +Converged at iteration 25, L1 9.37984e-05, Linf 0.00331219, total time[s] 0.066357 +Converged at iteration 31, L1 6.16594e-05, Linf 0.00380974, total time[s] 0.079658 +Converged at iteration 29, L1 6.81706e-05, Linf 0.00298734, total time[s] 0.074379 +Converged at iteration 30, L1 6.60267e-05, Linf 0.00635639, total time[s] 0.080523 +Converged at iteration 30, L1 5.72055e-05, Linf 0.00159765, total time[s] 0.079421 +Converged at iteration 31, L1 5.43458e-05, Linf 0.00263729, total time[s] 0.078389 +Converged at iteration 32, L1 8.41154e-05, Linf 0.0124691, total time[s] 0.083252 +Converged at iteration 25, L1 7.7689e-05, Linf 0.00206983, total time[s] 0.065361 +Converged at iteration 26, L1 5.58629e-05, Linf 0.00318501, total time[s] 0.066893 +Converged at iteration 24, L1 5.69632e-05, Linf 0.00202673, total time[s] 0.062428 +Converged at iteration 38, L1 4.73972e-05, Linf 0.0127525, total time[s] 0.094756 +Converged at iteration 35, L1 9.30897e-05, Linf 0.0140009, total time[s] 0.104518 +Converged at iteration 24, L1 8.92062e-05, Linf 0.0101013, total time[s] 0.070313 +Converged at iteration 29, L1 9.00298e-05, Linf 0.00747683, total time[s] 0.074855 +Converged at iteration 24, L1 5.76414e-05, Linf 0.00511968, total time[s] 0.062255 +Converged at iteration 21, L1 9.86902e-05, Linf 0.00807986, total time[s] 0.054913 +Converged at iteration 20, L1 2.67575e-05, Linf 0.00593499, total time[s] 0.054706 +Converged at iteration 21, L1 6.14327e-05, Linf 0.00521734, total time[s] 0.056602 +Converged at iteration 23, L1 6.99753e-05, Linf 0.0034291, total time[s] 0.06337 +Converged at iteration 21, L1 9.43268e-05, Linf 0.00491569, total time[s] 0.058421 +Converged at iteration 20, L1 5.06618e-05, Linf 0.00227063, total time[s] 0.05472 +Converged at iteration 18, L1 4.94875e-05, Linf 0.00129711, total time[s] 0.048876 +Converged at iteration 32, L1 4.76347e-05, Linf 0.00582921, total time[s] 0.086872 +Converged at iteration 19, L1 9.38376e-05, Linf 0.00507664, total time[s] 0.053519 +Converged at iteration 22, L1 8.87488e-05, Linf 0.00484741, total time[s] 0.058726 +Converged at iteration 26, L1 8.93078e-05, Linf 0.00657539, total time[s] 0.069279 +Converged at iteration 24, L1 8.51004e-05, Linf 0.00363916, total time[s] 0.064983 +Converged at iteration 21, L1 6.99212e-05, Linf 0.00358721, total time[s] 0.059047 +Converged at iteration 23, L1 9.18578e-05, Linf 0.00284993, total time[s] 0.062764 +Converged at iteration 25, L1 6.40622e-05, Linf 0.00286599, total time[s] 0.064993 +Converged at iteration 25, L1 9.51011e-05, Linf 0.00333278, total time[s] 0.065891 +Converged at iteration 31, L1 6.13027e-05, Linf 0.00383478, total time[s] 0.079682 +Converged at iteration 29, L1 6.78842e-05, Linf 0.00297485, total time[s] 0.075364 +Converged at iteration 30, L1 6.59026e-05, Linf 0.00630388, total time[s] 0.076989 +Converged at iteration 30, L1 5.70945e-05, Linf 0.00160142, total time[s] 0.078097 +Converged at iteration 31, L1 5.33437e-05, Linf 0.00260017, total time[s] 0.07964 +Converged at iteration 32, L1 8.41318e-05, Linf 0.0124143, total time[s] 0.08211 +Converged at iteration 25, L1 7.67932e-05, Linf 0.00204731, total time[s] 0.064926 +Converged at iteration 26, L1 5.58941e-05, Linf 0.00316969, total time[s] 0.067821 +Converged at iteration 24, L1 5.66118e-05, Linf 0.00201228, total time[s] 0.063025 +Converged at iteration 38, L1 4.68571e-05, Linf 0.0127568, total time[s] 0.100359 +Converged at iteration 35, L1 9.30222e-05, Linf 0.0140776, total time[s] 0.093361 +Converged at iteration 24, L1 8.9265e-05, Linf 0.0101814, total time[s] 0.065812 +Converged at iteration 29, L1 8.92948e-05, Linf 0.00747146, total time[s] 0.078123 +Converged at iteration 24, L1 5.77884e-05, Linf 0.00512889, total time[s] 0.065558 +Converged at iteration 22, L1 5.24651e-05, Linf 0.00507452, total time[s] 0.061092 +Converged at iteration 20, L1 2.69089e-05, Linf 0.00593674, total time[s] 0.055611 +Converged at iteration 21, L1 6.17878e-05, Linf 0.00523985, total time[s] 0.05707 +Converged at iteration 23, L1 7.01763e-05, Linf 0.00343295, total time[s] 0.060628 +Converged at iteration 21, L1 9.38472e-05, Linf 0.00483585, total time[s] 0.056283 +Converged at iteration 20, L1 5.10824e-05, Linf 0.00229297, total time[s] 0.054753 +Converged at iteration 18, L1 4.9898e-05, Linf 0.00132863, total time[s] 0.049863 +Converged at iteration 32, L1 4.74095e-05, Linf 0.00585773, total time[s] 0.08232 +Converged at iteration 19, L1 9.39483e-05, Linf 0.00508084, total time[s] 0.051336 +Converged at iteration 22, L1 8.85627e-05, Linf 0.00484657, total time[s] 0.058276 +Converged at iteration 26, L1 8.9199e-05, Linf 0.00658001, total time[s] 0.067907 +Converged at iteration 24, L1 8.58263e-05, Linf 0.00366768, total time[s] 0.063113 +Converged at iteration 21, L1 7.03919e-05, Linf 0.0036235, total time[s] 0.056775 +Converged at iteration 23, L1 9.19856e-05, Linf 0.00285055, total time[s] 0.06407 +Converged at iteration 25, L1 6.38325e-05, Linf 0.00285628, total time[s] 0.065486 +Converged at iteration 25, L1 9.35034e-05, Linf 0.00330769, total time[s] 0.069799 +Converged at iteration 31, L1 6.1742e-05, Linf 0.00380432, total time[s] 0.079558 +Converged at iteration 29, L1 6.82272e-05, Linf 0.00298993, total time[s] 0.075161 +Converged at iteration 30, L1 6.60513e-05, Linf 0.00636774, total time[s] 0.076588 +Converged at iteration 30, L1 5.72298e-05, Linf 0.00159684, total time[s] 0.076904 +Converged at iteration 31, L1 5.45604e-05, Linf 0.00264526, total time[s] 0.080566 +Converged at iteration 32, L1 8.41176e-05, Linf 0.0124801, total time[s] 0.081997 +Converged at iteration 25, L1 7.79276e-05, Linf 0.00207478, total time[s] 0.06542 +Converged at iteration 26, L1 5.65553e-05, Linf 0.00318977, total time[s] 0.067861 +Converged at iteration 24, L1 5.70738e-05, Linf 0.00203143, total time[s] 0.063033 +Converged at iteration 40, L1 6.79636e-05, Linf 0.00367458, total time[s] 0.201998 +Converged at iteration 35, L1 7.6152e-05, Linf 0.00337106, total time[s] 0.120737 +Converged at iteration 30, L1 9.62549e-05, Linf 0.0043262, total time[s] 0.080843 +Converged at iteration 31, L1 6.2572e-05, Linf 0.00502562, total time[s] 0.07987 +Converged at iteration 27, L1 6.26015e-05, Linf 0.00499565, total time[s] 0.070333 +Converged at iteration 22, L1 8.62388e-05, Linf 0.00448845, total time[s] 0.057653 +Converged at iteration 20, L1 9.60209e-05, Linf 0.00397839, total time[s] 0.055804 +Converged at iteration 24, L1 8.84315e-05, Linf 0.00482886, total time[s] 0.064926 +Converged at iteration 28, L1 7.3868e-05, Linf 0.00445903, total time[s] 0.071253 +Converged at iteration 26, L1 8.11456e-05, Linf 0.00547989, total time[s] 0.066985 +Converged at iteration 22, L1 7.46685e-05, Linf 0.0050474, total time[s] 0.059334 +Converged at iteration 19, L1 6.63261e-05, Linf 0.00393082, total time[s] 0.051753 +Converged at iteration 30, L1 7.98737e-05, Linf 0.00329631, total time[s] 0.077557 +Converged at iteration 20, L1 8.45263e-05, Linf 0.00455007, total time[s] 0.053189 +Converged at iteration 24, L1 7.12295e-05, Linf 0.00485243, total time[s] 0.066382 +Converged at iteration 31, L1 8.93451e-05, Linf 0.00570025, total time[s] 0.081266 +Converged at iteration 27, L1 9.91819e-05, Linf 0.0056995, total time[s] 0.070344 +Converged at iteration 24, L1 8.84726e-05, Linf 0.00464951, total time[s] 0.065224 +Converged at iteration 23, L1 9.21937e-05, Linf 0.00419665, total time[s] 0.060129 +Converged at iteration 26, L1 7.22327e-05, Linf 0.00446093, total time[s] 0.067625 +Converged at iteration 29, L1 7.8132e-05, Linf 0.00479632, total time[s] 0.074774 +Converged at iteration 34, L1 7.0831e-05, Linf 0.00422642, total time[s] 0.086745 +Converged at iteration 30, L1 9.41216e-05, Linf 0.00442613, total time[s] 0.077353 +Converged at iteration 28, L1 9.49882e-05, Linf 0.00310979, total time[s] 0.071884 +Converged at iteration 32, L1 9.40639e-05, Linf 0.00374097, total time[s] 0.081879 +Converged at iteration 37, L1 7.34001e-05, Linf 0.00327841, total time[s] 0.093261 +Converged at iteration 33, L1 8.4477e-05, Linf 0.00469109, total time[s] 0.08391 +Converged at iteration 28, L1 9.67016e-05, Linf 0.0043004, total time[s] 0.07208 +Converged at iteration 24, L1 8.82898e-05, Linf 0.00325072, total time[s] 0.063486 +Converged at iteration 26, L1 8.97483e-05, Linf 0.00383935, total time[s] 0.067678 +Converged at iteration 40, L1 6.69987e-05, Linf 0.0038296, total time[s] 0.102832 +Converged at iteration 35, L1 8.23637e-05, Linf 0.00351908, total time[s] 0.087608 +Converged at iteration 30, L1 9.61837e-05, Linf 0.00422173, total time[s] 0.07525 +Converged at iteration 31, L1 6.18331e-05, Linf 0.00503819, total time[s] 0.079768 +Converged at iteration 27, L1 6.00597e-05, Linf 0.00494137, total time[s] 0.069203 +Converged at iteration 22, L1 7.71051e-05, Linf 0.00421259, total time[s] 0.062472 +Converged at iteration 21, L1 6.27901e-05, Linf 0.00334451, total time[s] 0.05694 +Converged at iteration 24, L1 9.0434e-05, Linf 0.00488807, total time[s] 0.063887 +Converged at iteration 28, L1 7.42008e-05, Linf 0.00444376, total time[s] 0.073932 +Converged at iteration 26, L1 8.04801e-05, Linf 0.00549633, total time[s] 0.068601 +Converged at iteration 22, L1 7.22082e-05, Linf 0.00483104, total time[s] 0.05936 +Converged at iteration 19, L1 5.91174e-05, Linf 0.00361615, total time[s] 0.051801 +Converged at iteration 30, L1 8.86651e-05, Linf 0.00330561, total time[s] 0.078838 +Converged at iteration 20, L1 8.60981e-05, Linf 0.00498263, total time[s] 0.057385 +Converged at iteration 24, L1 7.17991e-05, Linf 0.0046801, total time[s] 0.071125 +Converged at iteration 31, L1 9.34528e-05, Linf 0.00531548, total time[s] 0.079452 +Converged at iteration 27, L1 9.88801e-05, Linf 0.00537794, total time[s] 0.069772 +Converged at iteration 24, L1 8.69878e-05, Linf 0.00450382, total time[s] 0.064519 +Converged at iteration 23, L1 9.25793e-05, Linf 0.00421971, total time[s] 0.061131 +Converged at iteration 26, L1 7.18525e-05, Linf 0.00456702, total time[s] 0.068789 +Converged at iteration 29, L1 7.63194e-05, Linf 0.00485522, total time[s] 0.080833 +Converged at iteration 34, L1 7.86096e-05, Linf 0.004333, total time[s] 0.089441 +Converged at iteration 31, L1 6.91585e-05, Linf 0.00361739, total time[s] 0.096084 +Converged at iteration 28, L1 9.86951e-05, Linf 0.00321118, total time[s] 0.087246 +Converged at iteration 32, L1 8.62959e-05, Linf 0.00362273, total time[s] 0.083206 +Converged at iteration 36, L1 9.57581e-05, Linf 0.0036728, total time[s] 0.0952 +Converged at iteration 33, L1 8.39313e-05, Linf 0.00484038, total time[s] 0.0852 +Converged at iteration 28, L1 9.36352e-05, Linf 0.0042049, total time[s] 0.072394 +Converged at iteration 24, L1 8.21782e-05, Linf 0.00304608, total time[s] 0.066853 +Converged at iteration 26, L1 8.69621e-05, Linf 0.00389535, total time[s] 0.081868 +Converged at iteration 40, L1 6.60143e-05, Linf 0.00398565, total time[s] 0.100052 +Converged at iteration 35, L1 8.8701e-05, Linf 0.00365315, total time[s] 0.096621 +Converged at iteration 30, L1 9.00496e-05, Linf 0.00417718, total time[s] 0.077266 +Converged at iteration 31, L1 6.16485e-05, Linf 0.00505099, total time[s] 0.088764 +Converged at iteration 26, L1 9.69241e-05, Linf 0.00576117, total time[s] 0.066639 +Converged at iteration 22, L1 6.8929e-05, Linf 0.00411832, total time[s] 0.060429 +Converged at iteration 21, L1 6.50743e-05, Linf 0.00356311, total time[s] 0.056521 +Converged at iteration 24, L1 8.90401e-05, Linf 0.004988, total time[s] 0.067019 +Converged at iteration 28, L1 7.21883e-05, Linf 0.00442746, total time[s] 0.074818 +Converged at iteration 26, L1 8.0455e-05, Linf 0.00521295, total time[s] 0.067048 +Converged at iteration 22, L1 6.98386e-05, Linf 0.00765948, total time[s] 0.057757 +Converged at iteration 18, L1 9.77843e-05, Linf 0.00399384, total time[s] 0.054296 +Converged at iteration 30, L1 9.84801e-05, Linf 0.00331017, total time[s] 0.076116 +Converged at iteration 20, L1 8.34598e-05, Linf 0.00469571, total time[s] 0.053266 +Converged at iteration 24, L1 7.08748e-05, Linf 0.00479558, total time[s] 0.064246 +Converged at iteration 31, L1 9.50575e-05, Linf 0.00443953, total time[s] 0.084809 +Converged at iteration 27, L1 8.86696e-05, Linf 0.0042534, total time[s] 0.07034 +Converged at iteration 24, L1 8.34616e-05, Linf 0.00411275, total time[s] 0.065334 +Converged at iteration 23, L1 9.22168e-05, Linf 0.00437517, total time[s] 0.075402 +Converged at iteration 26, L1 7.09247e-05, Linf 0.00470743, total time[s] 0.088646 +Converged at iteration 29, L1 7.50291e-05, Linf 0.00490087, total time[s] 0.077815 +Converged at iteration 34, L1 8.32356e-05, Linf 0.00373673, total time[s] 0.088151 +Converged at iteration 31, L1 7.31899e-05, Linf 0.00351135, total time[s] 0.079445 +Converged at iteration 29, L1 7.18317e-05, Linf 0.00276078, total time[s] 0.075633 +Converged at iteration 32, L1 8.04843e-05, Linf 0.00350839, total time[s] 0.082498 +Converged at iteration 36, L1 8.24112e-05, Linf 0.00351373, total time[s] 0.098239 +Converged at iteration 33, L1 8.27821e-05, Linf 0.00470129, total time[s] 0.085167 +Converged at iteration 28, L1 9.03284e-05, Linf 0.00410072, total time[s] 0.081445 +Converged at iteration 24, L1 7.95705e-05, Linf 0.00283993, total time[s] 0.066895 +Converged at iteration 26, L1 8.32428e-05, Linf 0.00394022, total time[s] 0.074288 +Converged at iteration 39, L1 9.9111e-05, Linf 0.00501372, total time[s] 0.099085 +Converged at iteration 36, L1 6.78593e-05, Linf 0.00333828, total time[s] 0.098107 +Converged at iteration 29, L1 8.70942e-05, Linf 0.00578143, total time[s] 0.075832 +Converged at iteration 31, L1 6.27791e-05, Linf 0.00506858, total time[s] 0.079291 +Converged at iteration 26, L1 8.93859e-05, Linf 0.00564757, total time[s] 0.07427 +Converged at iteration 21, L1 9.01959e-05, Linf 0.00446951, total time[s] 0.05955 +Converged at iteration 21, L1 6.51217e-05, Linf 0.00406165, total time[s] 0.057393 +Converged at iteration 24, L1 6.99354e-05, Linf 0.005303, total time[s] 0.064814 +Converged at iteration 28, L1 6.26417e-05, Linf 0.00441021, total time[s] 0.072851 +Converged at iteration 26, L1 7.34343e-05, Linf 0.00374109, total time[s] 0.074638 +Converged at iteration 21, L1 6.96433e-05, Linf 0.00787548, total time[s] 0.058263 +Converged at iteration 18, L1 6.28773e-05, Linf 0.00279219, total time[s] 0.049966 +Converged at iteration 31, L1 7.87189e-05, Linf 0.00269982, total time[s] 0.081346 +Converged at iteration 20, L1 8.11706e-05, Linf 0.00504168, total time[s] 0.054147 +Converged at iteration 24, L1 6.82646e-05, Linf 0.00493035, total time[s] 0.064463 +Converged at iteration 30, L1 7.14736e-05, Linf 0.00295393, total time[s] 0.079794 +Converged at iteration 25, L1 6.42898e-05, Linf 0.00436278, total time[s] 0.064841 +Converged at iteration 22, L1 9.63596e-05, Linf 0.00438881, total time[s] 0.058004 +Converged at iteration 23, L1 9.36121e-05, Linf 0.00460607, total time[s] 0.060218 +Converged at iteration 26, L1 6.76514e-05, Linf 0.00485355, total time[s] 0.068276 +Converged at iteration 29, L1 6.98651e-05, Linf 0.00476997, total time[s] 0.072705 +Converged at iteration 31, L1 8.70331e-05, Linf 0.00390643, total time[s] 0.078488 +Converged at iteration 30, L1 8.03089e-05, Linf 0.00316845, total time[s] 0.075741 +Converged at iteration 29, L1 7.96839e-05, Linf 0.00298731, total time[s] 0.072934 +Converged at iteration 32, L1 7.22057e-05, Linf 0.00331809, total time[s] 0.079993 +Converged at iteration 35, L1 7.04451e-05, Linf 0.00380859, total time[s] 0.087618 +Converged at iteration 33, L1 7.96e-05, Linf 0.0048777, total time[s] 0.081848 +Converged at iteration 28, L1 8.15494e-05, Linf 0.00389268, total time[s] 0.071623 +Converged at iteration 24, L1 7.83679e-05, Linf 0.00242248, total time[s] 0.062076 +Converged at iteration 26, L1 7.89099e-05, Linf 0.00410381, total time[s] 0.065815 +Converged at iteration 39, L1 9.01435e-05, Linf 0.00571845, total time[s] 0.097038 +Converged at iteration 36, L1 7.35109e-05, Linf 0.0040825, total time[s] 0.09177 +Converged at iteration 26, L1 5.47006e-05, Linf 0.00580012, total time[s] 0.066477 +Converged at iteration 31, L1 6.20225e-05, Linf 0.00836929, total time[s] 0.079488 +Converged at iteration 26, L1 7.09507e-05, Linf 0.00533279, total time[s] 0.066669 +Converged at iteration 21, L1 6.39688e-05, Linf 0.00341145, total time[s] 0.054699 +Converged at iteration 20, L1 5.51814e-05, Linf 0.00444398, total time[s] 0.054093 +Converged at iteration 22, L1 4.42738e-05, Linf 0.00764432, total time[s] 0.105046 +Converged at iteration 26, L1 6.85007e-05, Linf 0.00593038, total time[s] 0.075309 +Converged at iteration 25, L1 6.24235e-05, Linf 0.00405001, total time[s] 0.073236 +Converged at iteration 20, L1 7.90689e-05, Linf 0.00549734, total time[s] 0.069216 +Converged at iteration 17, L1 7.55467e-05, Linf 0.00405403, total time[s] 0.070155 +Converged at iteration 31, L1 9.71281e-05, Linf 0.00279655, total time[s] 0.080776 +Converged at iteration 20, L1 6.21566e-05, Linf 0.00521842, total time[s] 0.05204 +Converged at iteration 23, L1 9.74253e-05, Linf 0.00670132, total time[s] 0.060499 +Converged at iteration 27, L1 8.57288e-05, Linf 0.00521378, total time[s] 0.069677 +Converged at iteration 23, L1 8.32969e-05, Linf 0.00705363, total time[s] 0.059859 +Converged at iteration 21, L1 8.00117e-05, Linf 0.00481008, total time[s] 0.057359 +Converged at iteration 23, L1 7.32195e-05, Linf 0.00375605, total time[s] 0.061221 +Converged at iteration 25, L1 9.63644e-05, Linf 0.00631097, total time[s] 0.065988 +Converged at iteration 28, L1 9.41833e-05, Linf 0.00547337, total time[s] 0.072643 +Converged at iteration 30, L1 5.87455e-05, Linf 0.00493004, total time[s] 0.077568 +Converged at iteration 28, L1 6.73861e-05, Linf 0.00331994, total time[s] 0.072625 +Converged at iteration 29, L1 8.61646e-05, Linf 0.00343145, total time[s] 0.073831 +Converged at iteration 30, L1 8.65915e-05, Linf 0.00304732, total time[s] 0.077736 +Converged at iteration 30, L1 8.91879e-05, Linf 0.00326482, total time[s] 0.076375 +Converged at iteration 33, L1 7.14384e-05, Linf 0.00542243, total time[s] 0.08329 +Converged at iteration 28, L1 6.41702e-05, Linf 0.00353976, total time[s] 0.071549 +Converged at iteration 24, L1 8.83208e-05, Linf 0.00177425, total time[s] 0.062898 +Converged at iteration 24, L1 8.9397e-05, Linf 0.00467984, total time[s] 0.063247 +Converged at iteration 39, L1 7.11923e-05, Linf 0.00700335, total time[s] 0.098592 +Converged at iteration 36, L1 7.16339e-05, Linf 0.00581403, total time[s] 0.093892 +Converged at iteration 24, L1 6.16041e-05, Linf 0.0028624, total time[s] 0.068338 +Converged at iteration 31, L1 5.69912e-05, Linf 0.00508744, total time[s] 0.087622 +Converged at iteration 25, L1 7.34729e-05, Linf 0.00540444, total time[s] 0.065235 +Converged at iteration 20, L1 9.81883e-05, Linf 0.00429005, total time[s] 0.054542 +Converged at iteration 19, L1 5.8817e-05, Linf 0.0044147, total time[s] 0.051528 +Converged at iteration 20, L1 7.77201e-05, Linf 0.00669256, total time[s] 0.053233 +Converged at iteration 24, L1 5.60371e-05, Linf 0.00384941, total time[s] 0.063607 +Converged at iteration 24, L1 6.51935e-05, Linf 0.00478766, total time[s] 0.064407 +Converged at iteration 20, L1 5.38675e-05, Linf 0.00527045, total time[s] 0.053457 +Converged at iteration 16, L1 9.22952e-05, Linf 0.00350083, total time[s] 0.044855 +Converged at iteration 32, L1 6.81865e-05, Linf 0.00267633, total time[s] 0.081772 +Converged at iteration 19, L1 9.10045e-05, Linf 0.00666417, total time[s] 0.053889 +Converged at iteration 23, L1 7.25209e-05, Linf 0.00651743, total time[s] 0.063122 +Converged at iteration 26, L1 6.72841e-05, Linf 0.0055199, total time[s] 0.068913 +Converged at iteration 23, L1 5.44002e-05, Linf 0.00523321, total time[s] 0.061602 +Converged at iteration 20, L1 6.9737e-05, Linf 0.00498689, total time[s] 0.055173 +Converged at iteration 22, L1 9.64203e-05, Linf 0.00421046, total time[s] 0.058899 +Converged at iteration 25, L1 8.13299e-05, Linf 0.00375222, total time[s] 0.067472 +Converged at iteration 28, L1 7.15717e-05, Linf 0.00375838, total time[s] 0.072413 +Converged at iteration 29, L1 6.61214e-05, Linf 0.00599597, total time[s] 0.07582 +Converged at iteration 27, L1 6.57594e-05, Linf 0.00389127, total time[s] 0.070385 +Converged at iteration 29, L1 7.48223e-05, Linf 0.00398896, total time[s] 0.07628 +Converged at iteration 29, L1 8.37793e-05, Linf 0.00274492, total time[s] 0.079453 +Converged at iteration 28, L1 6.66474e-05, Linf 0.00227464, total time[s] 0.07453 +Converged at iteration 33, L1 5.76527e-05, Linf 0.00604969, total time[s] 0.084416 +Converged at iteration 26, L1 9.40898e-05, Linf 0.00347859, total time[s] 0.067176 +Converged at iteration 25, L1 7.06137e-05, Linf 0.00197686, total time[s] 0.068116 +Converged at iteration 23, L1 6.10104e-05, Linf 0.00273805, total time[s] 0.06915 +Converged at iteration 39, L1 7.05223e-05, Linf 0.00700899, total time[s] 0.099499 +Converged at iteration 36, L1 7.07876e-05, Linf 0.00585204, total time[s] 0.09461 +Converged at iteration 24, L1 6.20075e-05, Linf 0.00283904, total time[s] 0.062843 +Converged at iteration 31, L1 5.6878e-05, Linf 0.00507791, total time[s] 0.07846 +Converged at iteration 25, L1 7.43183e-05, Linf 0.00547897, total time[s] 0.076013 +Converged at iteration 20, L1 9.97887e-05, Linf 0.00432898, total time[s] 0.055145 +Converged at iteration 19, L1 5.80128e-05, Linf 0.00438082, total time[s] 0.050923 +Converged at iteration 20, L1 7.7591e-05, Linf 0.00653708, total time[s] 0.087702 +Converged at iteration 24, L1 5.52443e-05, Linf 0.00400709, total time[s] 0.101635 +Converged at iteration 24, L1 6.608e-05, Linf 0.0048025, total time[s] 0.084221 +Converged at iteration 20, L1 5.49543e-05, Linf 0.00527434, total time[s] 0.087869 +Converged at iteration 16, L1 9.14833e-05, Linf 0.00361822, total time[s] 0.061333 +Converged at iteration 32, L1 6.81203e-05, Linf 0.00269926, total time[s] 0.105297 +Converged at iteration 19, L1 9.1201e-05, Linf 0.00663134, total time[s] 0.058982 +Converged at iteration 23, L1 7.23019e-05, Linf 0.00643717, total time[s] 0.070072 +Converged at iteration 26, L1 6.73588e-05, Linf 0.00545487, total time[s] 0.071822 +Converged at iteration 23, L1 5.38779e-05, Linf 0.00517484, total time[s] 0.062574 +Converged at iteration 20, L1 6.96146e-05, Linf 0.00496579, total time[s] 0.054959 +Converged at iteration 22, L1 9.68261e-05, Linf 0.00414127, total time[s] 0.065565 +Converged at iteration 25, L1 8.10898e-05, Linf 0.0036811, total time[s] 0.067708 +Converged at iteration 28, L1 7.17695e-05, Linf 0.00365739, total time[s] 0.069038 +Converged at iteration 29, L1 6.59409e-05, Linf 0.00599151, total time[s] 0.071836 +Converged at iteration 27, L1 6.58713e-05, Linf 0.00385045, total time[s] 0.069346 +Converged at iteration 29, L1 7.56021e-05, Linf 0.00400728, total time[s] 0.073557 +Converged at iteration 29, L1 8.41055e-05, Linf 0.00274454, total time[s] 0.075403 +Converged at iteration 28, L1 6.65456e-05, Linf 0.00225801, total time[s] 0.073658 +Converged at iteration 32, L1 9.98928e-05, Linf 0.00721957, total time[s] 0.099811 +Converged at iteration 26, L1 9.44832e-05, Linf 0.00353784, total time[s] 0.073491 +Converged at iteration 25, L1 7.20267e-05, Linf 0.00200844, total time[s] 0.066479 +Converged at iteration 23, L1 6.08352e-05, Linf 0.00271379, total time[s] 0.062062 +Converged at iteration 39, L1 6.89328e-05, Linf 0.00701381, total time[s] 0.102131 +Converged at iteration 36, L1 6.97068e-05, Linf 0.00589474, total time[s] 0.093345 +Converged at iteration 24, L1 6.17054e-05, Linf 0.00285698, total time[s] 0.06412 +Converged at iteration 31, L1 5.5656e-05, Linf 0.00506006, total time[s] 0.079629 +Converged at iteration 25, L1 7.49422e-05, Linf 0.00557498, total time[s] 0.066261 +Converged at iteration 20, L1 9.95093e-05, Linf 0.00435966, total time[s] 0.060002 +Converged at iteration 19, L1 5.67509e-05, Linf 0.00436309, total time[s] 0.052943 +Converged at iteration 20, L1 7.72936e-05, Linf 0.00633053, total time[s] 0.056238 +Converged at iteration 24, L1 5.48152e-05, Linf 0.00409046, total time[s] 0.068878 +Converged at iteration 24, L1 6.78764e-05, Linf 0.00487698, total time[s] 0.064536 +Converged at iteration 20, L1 5.55177e-05, Linf 0.00523765, total time[s] 0.056007 +Converged at iteration 16, L1 9.05944e-05, Linf 0.00371645, total time[s] 0.04585 +Converged at iteration 32, L1 6.78744e-05, Linf 0.00271882, total time[s] 0.083695 +Converged at iteration 19, L1 9.12072e-05, Linf 0.00661658, total time[s] 0.051624 +Converged at iteration 23, L1 7.2309e-05, Linf 0.00634875, total time[s] 0.062608 +Converged at iteration 26, L1 6.66744e-05, Linf 0.00540701, total time[s] 0.07228 +Converged at iteration 23, L1 5.37174e-05, Linf 0.00516172, total time[s] 0.063765 +Converged at iteration 20, L1 6.99441e-05, Linf 0.00492282, total time[s] 0.054933 +Converged at iteration 22, L1 9.83118e-05, Linf 0.00428445, total time[s] 0.073572 +Converged at iteration 25, L1 8.05719e-05, Linf 0.00362352, total time[s] 0.06617 +Converged at iteration 28, L1 7.10293e-05, Linf 0.00357349, total time[s] 0.073857 +Converged at iteration 29, L1 6.65244e-05, Linf 0.00602667, total time[s] 0.076732 +Converged at iteration 27, L1 6.65132e-05, Linf 0.00386733, total time[s] 0.073181 +Converged at iteration 29, L1 7.65299e-05, Linf 0.0040385, total time[s] 0.077934 +Converged at iteration 29, L1 8.47225e-05, Linf 0.00275099, total time[s] 0.075497 +Converged at iteration 28, L1 6.67082e-05, Linf 0.00223909, total time[s] 0.074082 +Converged at iteration 32, L1 9.88992e-05, Linf 0.00723406, total time[s] 0.082981 +Converged at iteration 26, L1 9.52586e-05, Linf 0.00361139, total time[s] 0.068101 +Converged at iteration 25, L1 7.38257e-05, Linf 0.0020657, total time[s] 0.066492 +Converged at iteration 23, L1 6.07189e-05, Linf 0.00268479, total time[s] 0.066291 +Converged at iteration 39, L1 6.7946e-05, Linf 0.00700638, total time[s] 0.099583 +Converged at iteration 36, L1 6.86902e-05, Linf 0.00593327, total time[s] 0.093843 +Converged at iteration 24, L1 6.18979e-05, Linf 0.002843, total time[s] 0.06324 +Converged at iteration 30, L1 9.93533e-05, Linf 0.00621026, total time[s] 0.078645 +Converged at iteration 25, L1 7.75644e-05, Linf 0.0057454, total time[s] 0.066575 +Converged at iteration 20, L1 9.96653e-05, Linf 0.00435735, total time[s] 0.054882 +Converged at iteration 19, L1 5.57546e-05, Linf 0.00436476, total time[s] 0.052726 +Converged at iteration 20, L1 7.6739e-05, Linf 0.0063572, total time[s] 0.054754 +Converged at iteration 24, L1 5.38491e-05, Linf 0.0036643, total time[s] 0.064674 +Converged at iteration 24, L1 6.85538e-05, Linf 0.00496755, total time[s] 0.064572 +Converged at iteration 20, L1 5.72552e-05, Linf 0.00534503, total time[s] 0.053477 +Converged at iteration 16, L1 9.03209e-05, Linf 0.00382927, total time[s] 0.045364 +Converged at iteration 32, L1 6.72867e-05, Linf 0.00273723, total time[s] 0.082419 +Converged at iteration 19, L1 9.16785e-05, Linf 0.00650792, total time[s] 0.053396 +Converged at iteration 23, L1 7.23127e-05, Linf 0.00599827, total time[s] 0.061913 +Converged at iteration 26, L1 6.71498e-05, Linf 0.0054061, total time[s] 0.069296 +Converged at iteration 23, L1 5.33126e-05, Linf 0.00513775, total time[s] 0.062029 +Converged at iteration 20, L1 7.0381e-05, Linf 0.004926, total time[s] 0.055333 +Converged at iteration 23, L1 6.3406e-05, Linf 0.00275522, total time[s] 0.06177 +Converged at iteration 25, L1 8.08647e-05, Linf 0.00356875, total time[s] 0.066947 +Converged at iteration 28, L1 7.14603e-05, Linf 0.00351123, total time[s] 0.07354 +Converged at iteration 29, L1 6.74076e-05, Linf 0.0060545, total time[s] 0.076012 +Converged at iteration 27, L1 6.72518e-05, Linf 0.00388176, total time[s] 0.071516 +Converged at iteration 29, L1 7.74326e-05, Linf 0.00407895, total time[s] 0.075736 +Converged at iteration 29, L1 8.52371e-05, Linf 0.00275707, total time[s] 0.076558 +Converged at iteration 28, L1 6.68567e-05, Linf 0.00221625, total time[s] 0.074502 +Converged at iteration 32, L1 9.73771e-05, Linf 0.00723313, total time[s] 0.085222 +Converged at iteration 26, L1 9.75926e-05, Linf 0.0037537, total time[s] 0.077826 +Converged at iteration 25, L1 7.47177e-05, Linf 0.00212498, total time[s] 0.065121 +Converged at iteration 23, L1 6.09916e-05, Linf 0.00255924, total time[s] 0.204616 +Converged at iteration 39, L1 6.68459e-05, Linf 0.00698627, total time[s] 0.122099 +Converged at iteration 36, L1 6.71149e-05, Linf 0.00596269, total time[s] 0.090649 +Converged at iteration 24, L1 6.23551e-05, Linf 0.00278688, total time[s] 0.062366 +Converged at iteration 30, L1 9.84191e-05, Linf 0.00618071, total time[s] 0.075147 +Converged at iteration 25, L1 8.20085e-05, Linf 0.0059976, total time[s] 0.065362 +Converged at iteration 21, L1 5.98872e-05, Linf 0.00385112, total time[s] 0.054965 +Converged at iteration 19, L1 5.53405e-05, Linf 0.00437875, total time[s] 0.049837 +Converged at iteration 20, L1 7.57613e-05, Linf 0.00675627, total time[s] 0.053842 +Converged at iteration 24, L1 5.2871e-05, Linf 0.00316163, total time[s] 0.063163 +Converged at iteration 24, L1 7.27665e-05, Linf 0.00510487, total time[s] 0.062873 +Converged at iteration 20, L1 6.09289e-05, Linf 0.00542554, total time[s] 0.057122 +Converged at iteration 16, L1 8.99974e-05, Linf 0.00397809, total time[s] 0.081856 +Converged at iteration 32, L1 6.64847e-05, Linf 0.00275664, total time[s] 0.087459 +Converged at iteration 19, L1 9.21232e-05, Linf 0.00648723, total time[s] 0.050759 +Converged at iteration 23, L1 7.26182e-05, Linf 0.00614718, total time[s] 0.063984 +Converged at iteration 26, L1 6.78713e-05, Linf 0.00536595, total time[s] 0.076405 +Converged at iteration 23, L1 5.29247e-05, Linf 0.00511411, total time[s] 0.059332 +Converged at iteration 20, L1 7.14295e-05, Linf 0.00496445, total time[s] 0.05347 +Converged at iteration 23, L1 6.63028e-05, Linf 0.00372038, total time[s] 0.060142 +Converged at iteration 25, L1 8.16055e-05, Linf 0.00351885, total time[s] 0.065004 +Converged at iteration 28, L1 7.25679e-05, Linf 0.00345934, total time[s] 0.071886 +Converged at iteration 29, L1 6.89678e-05, Linf 0.00611671, total time[s] 0.07318 +Converged at iteration 27, L1 6.86755e-05, Linf 0.00390899, total time[s] 0.068325 +Converged at iteration 29, L1 7.88323e-05, Linf 0.00413058, total time[s] 0.07256 +Converged at iteration 29, L1 8.57548e-05, Linf 0.0027634, total time[s] 0.072996 +Converged at iteration 28, L1 6.71513e-05, Linf 0.00218439, total time[s] 0.071282 +Converged at iteration 32, L1 9.57133e-05, Linf 0.00721308, total time[s] 0.080235 +Converged at iteration 27, L1 6.05217e-05, Linf 0.00339324, total time[s] 0.068462 +Converged at iteration 25, L1 7.55276e-05, Linf 0.00219146, total time[s] 0.063737 +Converged at iteration 23, L1 6.19932e-05, Linf 0.00253549, total time[s] 0.060862 +Converged at iteration 39, L1 6.56758e-05, Linf 0.00695812, total time[s] 0.099362 +Converged at iteration 36, L1 6.5119e-05, Linf 0.00599361, total time[s] 0.098682 +Converged at iteration 24, L1 6.36689e-05, Linf 0.00273112, total time[s] 0.063311 +Converged at iteration 30, L1 9.66363e-05, Linf 0.00614716, total time[s] 0.076972 +Converged at iteration 25, L1 8.6949e-05, Linf 0.00632786, total time[s] 0.065492 +Converged at iteration 21, L1 5.97416e-05, Linf 0.00376484, total time[s] 0.056121 +Converged at iteration 19, L1 5.50557e-05, Linf 0.00439439, total time[s] 0.051122 +Converged at iteration 20, L1 7.44824e-05, Linf 0.0064266, total time[s] 0.053281 +Converged at iteration 24, L1 5.14297e-05, Linf 0.0035294, total time[s] 0.075187 +Converged at iteration 24, L1 7.59309e-05, Linf 0.00528499, total time[s] 0.065769 +Converged at iteration 20, L1 6.32436e-05, Linf 0.00552666, total time[s] 0.053587 +Converged at iteration 16, L1 9.00194e-05, Linf 0.00418454, total time[s] 0.044437 +Converged at iteration 32, L1 6.4601e-05, Linf 0.00277656, total time[s] 0.090606 +Converged at iteration 19, L1 9.14563e-05, Linf 0.00640463, total time[s] 0.053055 +Converged at iteration 23, L1 7.20552e-05, Linf 0.00599671, total time[s] 0.062006 +Converged at iteration 26, L1 6.83017e-05, Linf 0.00536554, total time[s] 0.06969 +Converged at iteration 23, L1 5.27787e-05, Linf 0.00511065, total time[s] 0.062141 +Converged at iteration 20, L1 7.3236e-05, Linf 0.00498623, total time[s] 0.054138 +Converged at iteration 23, L1 6.70026e-05, Linf 0.00267498, total time[s] 0.062512 +Converged at iteration 25, L1 8.26639e-05, Linf 0.00345051, total time[s] 0.067375 +Converged at iteration 28, L1 7.35899e-05, Linf 0.00340841, total time[s] 0.073397 +Converged at iteration 29, L1 7.1155e-05, Linf 0.00615283, total time[s] 0.076548 +Converged at iteration 27, L1 7.07547e-05, Linf 0.00391115, total time[s] 0.071026 +Converged at iteration 29, L1 8.07328e-05, Linf 0.00419067, total time[s] 0.076179 +Converged at iteration 29, L1 8.59947e-05, Linf 0.00278122, total time[s] 0.075343 +Converged at iteration 28, L1 6.74487e-05, Linf 0.00214397, total time[s] 0.074586 +Converged at iteration 32, L1 9.38729e-05, Linf 0.00717759, total time[s] 0.082941 +Converged at iteration 27, L1 6.48025e-05, Linf 0.00368841, total time[s] 0.071318 +Converged at iteration 25, L1 7.41918e-05, Linf 0.002246, total time[s] 0.066199 +Converged at iteration 23, L1 6.33846e-05, Linf 0.00248015, total time[s] 0.061976 +Converged at iteration 39, L1 6.49326e-05, Linf 0.00691747, total time[s] 0.101511 +Converged at iteration 36, L1 6.35385e-05, Linf 0.00600889, total time[s] 0.09585 +Converged at iteration 24, L1 6.55815e-05, Linf 0.00271402, total time[s] 0.063672 +Converged at iteration 30, L1 9.52568e-05, Linf 0.00610857, total time[s] 0.079318 +Converged at iteration 25, L1 9.28381e-05, Linf 0.00670845, total time[s] 0.067336 +Converged at iteration 21, L1 6.4951e-05, Linf 0.00367324, total time[s] 0.060492 +Converged at iteration 19, L1 5.45294e-05, Linf 0.00442131, total time[s] 0.054413 +Converged at iteration 20, L1 7.35388e-05, Linf 0.00617018, total time[s] 0.05461 +Converged at iteration 23, L1 9.84053e-05, Linf 0.00489762, total time[s] 0.064145 +Converged at iteration 24, L1 8.00979e-05, Linf 0.00548957, total time[s] 0.064596 +Converged at iteration 20, L1 6.76113e-05, Linf 0.0056405, total time[s] 0.055415 +Converged at iteration 16, L1 8.99583e-05, Linf 0.00442769, total time[s] 0.045173 +Converged at iteration 32, L1 6.27482e-05, Linf 0.00278382, total time[s] 0.087272 +Converged at iteration 19, L1 9.06743e-05, Linf 0.00631067, total time[s] 0.053504 +Converged at iteration 23, L1 7.11931e-05, Linf 0.00584381, total time[s] 0.063857 +Converged at iteration 26, L1 6.90732e-05, Linf 0.00533455, total time[s] 0.068788 +Converged at iteration 23, L1 5.30143e-05, Linf 0.00510073, total time[s] 0.062443 +Converged at iteration 20, L1 7.54539e-05, Linf 0.00502925, total time[s] 0.05535 +Converged at iteration 23, L1 6.87526e-05, Linf 0.00262507, total time[s] 0.063037 +Converged at iteration 25, L1 8.36874e-05, Linf 0.00339557, total time[s] 0.070303 +Converged at iteration 28, L1 7.50537e-05, Linf 0.0034621, total time[s] 0.073821 +Converged at iteration 29, L1 7.38324e-05, Linf 0.00621187, total time[s] 0.075643 +Converged at iteration 27, L1 7.28941e-05, Linf 0.00388705, total time[s] 0.072477 +Converged at iteration 29, L1 8.21823e-05, Linf 0.00425794, total time[s] 0.075835 +Converged at iteration 29, L1 8.68831e-05, Linf 0.00280067, total time[s] 0.075661 +Converged at iteration 28, L1 6.80444e-05, Linf 0.00210389, total time[s] 0.073158 +Converged at iteration 32, L1 9.20625e-05, Linf 0.00712791, total time[s] 0.08412 +Converged at iteration 27, L1 6.82761e-05, Linf 0.00402608, total time[s] 0.071629 +Converged at iteration 24, L1 9.99708e-05, Linf 0.00279766, total time[s] 0.064838 +Converged at iteration 23, L1 6.49234e-05, Linf 0.00242185, total time[s] 0.06224 +Converged at iteration 39, L1 6.41335e-05, Linf 0.00687435, total time[s] 0.100953 +Converged at iteration 36, L1 6.11254e-05, Linf 0.00600244, total time[s] 0.098334 +Converged at iteration 24, L1 6.78417e-05, Linf 0.00272104, total time[s] 0.063994 +Converged at iteration 30, L1 9.4498e-05, Linf 0.00606473, total time[s] 0.077034 +Converged at iteration 25, L1 9.95282e-05, Linf 0.00714157, total time[s] 0.064953 +Converged at iteration 21, L1 7.43744e-05, Linf 0.00352749, total time[s] 0.055987 +Converged at iteration 19, L1 5.45652e-05, Linf 0.00441375, total time[s] 0.051239 +Converged at iteration 20, L1 7.22966e-05, Linf 0.00628243, total time[s] 0.053688 +Converged at iteration 23, L1 9.54026e-05, Linf 0.00454475, total time[s] 0.062202 +Converged at iteration 24, L1 8.45747e-05, Linf 0.00571498, total time[s] 0.06317 +Converged at iteration 20, L1 7.28286e-05, Linf 0.0057633, total time[s] 0.053725 +Converged at iteration 16, L1 8.98114e-05, Linf 0.0047197, total time[s] 0.044101 +Converged at iteration 32, L1 6.01176e-05, Linf 0.00276727, total time[s] 0.082078 +Converged at iteration 19, L1 9.01082e-05, Linf 0.00620936, total time[s] 0.050719 +Converged at iteration 23, L1 7.03866e-05, Linf 0.00567777, total time[s] 0.067433 +Converged at iteration 26, L1 7.01791e-05, Linf 0.00529939, total time[s] 0.071912 +Converged at iteration 23, L1 5.34612e-05, Linf 0.00509585, total time[s] 0.061208 +Converged at iteration 20, L1 7.86885e-05, Linf 0.00508358, total time[s] 0.056133 +Converged at iteration 23, L1 6.99411e-05, Linf 0.00256698, total time[s] 0.059032 +Converged at iteration 25, L1 8.50524e-05, Linf 0.00334953, total time[s] 0.065567 +Converged at iteration 28, L1 7.67558e-05, Linf 0.00354111, total time[s] 0.072459 +Converged at iteration 29, L1 7.66676e-05, Linf 0.00629344, total time[s] 0.075605 +Converged at iteration 27, L1 7.55734e-05, Linf 0.00376124, total time[s] 0.071064 +Converged at iteration 29, L1 8.41408e-05, Linf 0.0043308, total time[s] 0.076263 +Converged at iteration 29, L1 8.77477e-05, Linf 0.00283489, total time[s] 0.080657 +Converged at iteration 28, L1 6.87355e-05, Linf 0.00206753, total time[s] 0.073041 +Converged at iteration 32, L1 8.98022e-05, Linf 0.00706054, total time[s] 0.082123 +Converged at iteration 27, L1 7.24239e-05, Linf 0.00442611, total time[s] 0.069788 +Converged at iteration 24, L1 9.45189e-05, Linf 0.00274233, total time[s] 0.063508 +Converged at iteration 23, L1 6.67908e-05, Linf 0.00241361, total time[s] 0.06042 +Converged at iteration 39, L1 6.35013e-05, Linf 0.00681992, total time[s] 0.123555 +Converged at iteration 36, L1 5.82933e-05, Linf 0.00593547, total time[s] 0.111389 +Converged at iteration 24, L1 7.0387e-05, Linf 0.00278454, total time[s] 0.069281 +Converged at iteration 30, L1 9.21721e-05, Linf 0.00601269, total time[s] 0.090643 +Converged at iteration 26, L1 5.94848e-05, Linf 0.00634967, total time[s] 0.070393 +Converged at iteration 21, L1 8.78424e-05, Linf 0.00408936, total time[s] 0.059109 +Converged at iteration 19, L1 5.58972e-05, Linf 0.00451146, total time[s] 0.053789 +Converged at iteration 20, L1 7.09117e-05, Linf 0.00582226, total time[s] 0.054457 +Converged at iteration 23, L1 9.30533e-05, Linf 0.00477458, total time[s] 0.064396 +Converged at iteration 24, L1 8.8093e-05, Linf 0.00595678, total time[s] 0.06535 +Converged at iteration 20, L1 7.8733e-05, Linf 0.00583475, total time[s] 0.055023 +Converged at iteration 16, L1 9.00458e-05, Linf 0.00503349, total time[s] 0.045295 +Converged at iteration 32, L1 5.51378e-05, Linf 0.0027192, total time[s] 0.082192 +Converged at iteration 19, L1 8.91542e-05, Linf 0.00607599, total time[s] 0.053486 +Converged at iteration 23, L1 6.9024e-05, Linf 0.00549401, total time[s] 0.061255 +Converged at iteration 26, L1 7.14748e-05, Linf 0.00526633, total time[s] 0.069019 +Converged at iteration 23, L1 5.38226e-05, Linf 0.00513982, total time[s] 0.063382 +Converged at iteration 20, L1 8.27271e-05, Linf 0.00515892, total time[s] 0.054754 +Converged at iteration 23, L1 7.09423e-05, Linf 0.00249431, total time[s] 0.061261 +Converged at iteration 25, L1 8.66314e-05, Linf 0.00331117, total time[s] 0.066729 +Converged at iteration 28, L1 7.87119e-05, Linf 0.0036648, total time[s] 0.072956 +Converged at iteration 29, L1 8.02187e-05, Linf 0.00642133, total time[s] 0.074758 +Converged at iteration 27, L1 7.77449e-05, Linf 0.00352411, total time[s] 0.070093 +Converged at iteration 29, L1 8.55774e-05, Linf 0.004411, total time[s] 0.074164 +Converged at iteration 29, L1 9.03763e-05, Linf 0.00285746, total time[s] 0.074492 +Converged at iteration 28, L1 7.02185e-05, Linf 0.00201947, total time[s] 0.073477 +Converged at iteration 32, L1 8.68678e-05, Linf 0.00696828, total time[s] 0.082578 +Converged at iteration 27, L1 7.86671e-05, Linf 0.00489619, total time[s] 0.070281 +Converged at iteration 24, L1 9.45629e-05, Linf 0.00274391, total time[s] 0.063523 +Converged at iteration 23, L1 6.91461e-05, Linf 0.00243562, total time[s] 0.061656 +Converged at iteration 39, L1 6.27556e-05, Linf 0.00674657, total time[s] 0.09889 +Converged at iteration 36, L1 5.37831e-05, Linf 0.00574102, total time[s] 0.095016 +Converged at iteration 24, L1 7.48027e-05, Linf 0.00291553, total time[s] 0.063257 +Converged at iteration 30, L1 8.9657e-05, Linf 0.00595459, total time[s] 0.076716 +Converged at iteration 26, L1 6.39874e-05, Linf 0.00669151, total time[s] 0.067942 +Converged at iteration 22, L1 5.41672e-05, Linf 0.0040638, total time[s] 0.058725 +Converged at iteration 19, L1 5.64679e-05, Linf 0.00458748, total time[s] 0.052631 +Converged at iteration 20, L1 6.94471e-05, Linf 0.0056015, total time[s] 0.054607 +Converged at iteration 23, L1 9.05514e-05, Linf 0.00429993, total time[s] 0.060999 +Converged at iteration 24, L1 9.45589e-05, Linf 0.00620022, total time[s] 0.064817 +Converged at iteration 20, L1 8.51671e-05, Linf 0.00596709, total time[s] 0.054754 +Converged at iteration 16, L1 9.05121e-05, Linf 0.00534722, total time[s] 0.045999 +Converged at iteration 31, L1 9.35131e-05, Linf 0.00338308, total time[s] 0.081603 +Converged at iteration 19, L1 8.72549e-05, Linf 0.00607173, total time[s] 0.052089 +Converged at iteration 23, L1 6.74905e-05, Linf 0.00529664, total time[s] 0.06665 +Converged at iteration 26, L1 7.29763e-05, Linf 0.00522717, total time[s] 0.073826 +Converged at iteration 23, L1 5.39143e-05, Linf 0.00521501, total time[s] 0.062151 +Converged at iteration 20, L1 8.8085e-05, Linf 0.00526506, total time[s] 0.055005 +Converged at iteration 23, L1 7.12305e-05, Linf 0.0024018, total time[s] 0.063179 +Converged at iteration 25, L1 8.65798e-05, Linf 0.00326249, total time[s] 0.069061 +Converged at iteration 28, L1 8.12827e-05, Linf 0.00382895, total time[s] 0.074714 +Converged at iteration 29, L1 8.37671e-05, Linf 0.00658271, total time[s] 0.074363 +Converged at iteration 27, L1 7.95119e-05, Linf 0.0034518, total time[s] 0.069349 +Converged at iteration 29, L1 8.67892e-05, Linf 0.00450876, total time[s] 0.074312 +Converged at iteration 29, L1 8.97299e-05, Linf 0.00290293, total time[s] 0.074502 +Converged at iteration 28, L1 7.17049e-05, Linf 0.00200333, total time[s] 0.072653 +Converged at iteration 32, L1 8.28262e-05, Linf 0.00695439, total time[s] 0.082756 +Converged at iteration 27, L1 8.60183e-05, Linf 0.00538833, total time[s] 0.07008 +Converged at iteration 24, L1 9.72315e-05, Linf 0.00269298, total time[s] 0.062816 +Converged at iteration 23, L1 7.27467e-05, Linf 0.00249646, total time[s] 0.061699 +Converged at iteration 39, L1 6.15391e-05, Linf 0.00665493, total time[s] 0.099253 +Converged at iteration 35, L1 9.19489e-05, Linf 0.00678254, total time[s] 0.092555 +Converged at iteration 24, L1 7.91475e-05, Linf 0.0030437, total time[s] 0.063132 +Converged at iteration 30, L1 8.61933e-05, Linf 0.00589105, total time[s] 0.076718 +Converged at iteration 26, L1 6.88925e-05, Linf 0.00712876, total time[s] 0.067238 +Converged at iteration 22, L1 6.86943e-05, Linf 0.00498016, total time[s] 0.058315 +Converged at iteration 19, L1 5.85657e-05, Linf 0.00469049, total time[s] 0.052299 +Converged at iteration 20, L1 6.79042e-05, Linf 0.00518921, total time[s] 0.054722 +Converged at iteration 23, L1 8.83552e-05, Linf 0.00430906, total time[s] 0.061266 +Converged at iteration 24, L1 9.86852e-05, Linf 0.00643087, total time[s] 0.066579 +Converged at iteration 20, L1 9.16522e-05, Linf 0.00615458, total time[s] 0.055568 +Converged at iteration 16, L1 9.09855e-05, Linf 0.00562812, total time[s] 0.045416 +Converged at iteration 31, L1 8.68888e-05, Linf 0.0034576, total time[s] 0.078244 +Converged at iteration 19, L1 8.22722e-05, Linf 0.00567895, total time[s] 0.051503 +Converged at iteration 23, L1 6.56905e-05, Linf 0.00509163, total time[s] 0.062072 +Converged at iteration 26, L1 7.42159e-05, Linf 0.00519742, total time[s] 0.068104 +Converged at iteration 23, L1 5.44391e-05, Linf 0.00530759, total time[s] 0.061868 +Converged at iteration 20, L1 9.38492e-05, Linf 0.00539618, total time[s] 0.054912 +Converged at iteration 23, L1 7.05851e-05, Linf 0.00229099, total time[s] 0.060565 +Converged at iteration 25, L1 8.6351e-05, Linf 0.00322162, total time[s] 0.066509 +Converged at iteration 28, L1 8.42311e-05, Linf 0.00403965, total time[s] 0.07277 +Converged at iteration 29, L1 8.79112e-05, Linf 0.00675791, total time[s] 0.078309 +Converged at iteration 27, L1 8.20612e-05, Linf 0.00370547, total time[s] 0.072294 +Converged at iteration 29, L1 8.92639e-05, Linf 0.00453995, total time[s] 0.074963 +Converged at iteration 29, L1 9.0304e-05, Linf 0.00290869, total time[s] 0.074558 +Converged at iteration 28, L1 7.39609e-05, Linf 0.00199779, total time[s] 0.072953 +Converged at iteration 32, L1 7.8058e-05, Linf 0.00649525, total time[s] 0.084323 +Converged at iteration 27, L1 9.16511e-05, Linf 0.00587208, total time[s] 0.070431 +Converged at iteration 25, L1 6.18291e-05, Linf 0.00238826, total time[s] 0.065705 +Converged at iteration 23, L1 7.77696e-05, Linf 0.00257061, total time[s] 0.061019 +Converged at iteration 39, L1 5.85708e-05, Linf 0.00653759, total time[s] 0.101034 +Converged at iteration 35, L1 8.34922e-05, Linf 0.00678618, total time[s] 0.119644 +Converged at iteration 24, L1 8.3373e-05, Linf 0.00316012, total time[s] 0.092409 +Converged at iteration 30, L1 8.0346e-05, Linf 0.00582468, total time[s] 0.081978 +Converged at iteration 26, L1 7.2602e-05, Linf 0.00757008, total time[s] 0.077113 +Converged at iteration 22, L1 8.4356e-05, Linf 0.00589515, total time[s] 0.062279 +Converged at iteration 19, L1 6.20873e-05, Linf 0.00477022, total time[s] 0.05845 +Converged at iteration 20, L1 6.63412e-05, Linf 0.0046499, total time[s] 0.069887 +Converged at iteration 23, L1 8.61304e-05, Linf 0.00432836, total time[s] 0.063002 +Converged at iteration 25, L1 5.53008e-05, Linf 0.00539088, total time[s] 0.065051 +Converged at iteration 20, L1 9.81203e-05, Linf 0.00627243, total time[s] 0.058573 +Converged at iteration 16, L1 9.14487e-05, Linf 0.00573105, total time[s] 0.049114 +Converged at iteration 31, L1 8.29785e-05, Linf 0.00352287, total time[s] 0.083057 +Converged at iteration 19, L1 7.78759e-05, Linf 0.00542763, total time[s] 0.053857 +Converged at iteration 23, L1 6.33351e-05, Linf 0.00511802, total time[s] 0.064251 +Converged at iteration 26, L1 7.64997e-05, Linf 0.00519948, total time[s] 0.067259 +Converged at iteration 23, L1 5.49594e-05, Linf 0.00543099, total time[s] 0.059446 +Converged at iteration 21, L1 5.02691e-05, Linf 0.0038031, total time[s] 0.054821 +Converged at iteration 23, L1 6.97629e-05, Linf 0.00216435, total time[s] 0.061526 +Converged at iteration 25, L1 8.73216e-05, Linf 0.00319241, total time[s] 0.077081 +Converged at iteration 28, L1 8.70785e-05, Linf 0.00428566, total time[s] 0.079855 +Converged at iteration 29, L1 9.18255e-05, Linf 0.00695557, total time[s] 0.077212 +Converged at iteration 27, L1 8.49206e-05, Linf 0.00405519, total time[s] 0.070997 +Converged at iteration 29, L1 9.23309e-05, Linf 0.00469338, total time[s] 0.075135 +Converged at iteration 29, L1 9.14047e-05, Linf 0.00296175, total time[s] 0.073235 +Converged at iteration 28, L1 7.61702e-05, Linf 0.00205378, total time[s] 0.073031 +Converged at iteration 32, L1 7.32829e-05, Linf 0.00663186, total time[s] 0.082383 +Converged at iteration 27, L1 9.50228e-05, Linf 0.00639497, total time[s] 0.068938 +Converged at iteration 25, L1 6.64099e-05, Linf 0.00295991, total time[s] 0.064818 +Converged at iteration 23, L1 8.20381e-05, Linf 0.00265597, total time[s] 0.059187 +Converged at iteration 39, L1 5.45066e-05, Linf 0.00641942, total time[s] 0.096961 +Converged at iteration 35, L1 7.704e-05, Linf 0.00663902, total time[s] 0.092649 +Converged at iteration 24, L1 8.66884e-05, Linf 0.00326271, total time[s] 0.065186 +Converged at iteration 30, L1 7.63175e-05, Linf 0.00575834, total time[s] 0.076101 +Converged at iteration 26, L1 7.66161e-05, Linf 0.00800815, total time[s] 0.066743 +Converged at iteration 23, L1 5.56903e-05, Linf 0.00559606, total time[s] 0.062688 +Converged at iteration 19, L1 6.6161e-05, Linf 0.00497389, total time[s] 0.052198 +Converged at iteration 20, L1 6.4587e-05, Linf 0.00454005, total time[s] 0.053488 +Converged at iteration 23, L1 8.38642e-05, Linf 0.00435744, total time[s] 0.060426 +Converged at iteration 25, L1 5.88543e-05, Linf 0.00561014, total time[s] 0.065081 +Converged at iteration 21, L1 5.31096e-05, Linf 0.00532813, total time[s] 0.055522 +Converged at iteration 16, L1 9.27602e-05, Linf 0.00605881, total time[s] 0.042524 +Converged at iteration 31, L1 8.14637e-05, Linf 0.00362326, total time[s] 0.07886 +Converged at iteration 19, L1 7.17357e-05, Linf 0.00512395, total time[s] 0.049388 +Converged at iteration 22, L1 9.68555e-05, Linf 0.00634965, total time[s] 0.061762 +Converged at iteration 26, L1 7.95353e-05, Linf 0.00519712, total time[s] 0.066889 +Converged at iteration 23, L1 5.55542e-05, Linf 0.00555851, total time[s] 0.060419 +Converged at iteration 21, L1 5.38515e-05, Linf 0.00370978, total time[s] 0.055448 +Converged at iteration 23, L1 6.86384e-05, Linf 0.00202146, total time[s] 0.064928 +Converged at iteration 25, L1 8.82052e-05, Linf 0.00326204, total time[s] 0.064899 +Converged at iteration 28, L1 8.89714e-05, Linf 0.00507354, total time[s] 0.072489 +Converged at iteration 29, L1 9.5476e-05, Linf 0.00714025, total time[s] 0.073188 +Converged at iteration 27, L1 8.79154e-05, Linf 0.0050397, total time[s] 0.069781 +Converged at iteration 29, L1 9.59984e-05, Linf 0.00480447, total time[s] 0.073182 +Converged at iteration 29, L1 9.27686e-05, Linf 0.00300456, total time[s] 0.077062 +Converged at iteration 28, L1 7.90341e-05, Linf 0.00208917, total time[s] 0.072392 +Converged at iteration 32, L1 6.90391e-05, Linf 0.00650536, total time[s] 0.082408 +Converged at iteration 27, L1 9.90502e-05, Linf 0.00696126, total time[s] 0.070095 +Converged at iteration 25, L1 7.22285e-05, Linf 0.00354641, total time[s] 0.064569 +Converged at iteration 23, L1 8.67849e-05, Linf 0.0027851, total time[s] 0.061754 +Converged at iteration 39, L1 5.21943e-05, Linf 0.00640738, total time[s] 0.098198 +Converged at iteration 35, L1 6.73505e-05, Linf 0.00633154, total time[s] 0.094197 +Converged at iteration 24, L1 8.97384e-05, Linf 0.00335502, total time[s] 0.062986 +Converged at iteration 30, L1 7.22248e-05, Linf 0.00569862, total time[s] 0.076851 +Converged at iteration 26, L1 8.03672e-05, Linf 0.00844535, total time[s] 0.067252 +Converged at iteration 23, L1 6.70592e-05, Linf 0.00640529, total time[s] 0.059545 +Converged at iteration 19, L1 6.95597e-05, Linf 0.00528028, total time[s] 0.052923 +Converged at iteration 20, L1 6.29149e-05, Linf 0.00438662, total time[s] 0.054091 +Converged at iteration 23, L1 8.27224e-05, Linf 0.00438901, total time[s] 0.06261 +Converged at iteration 25, L1 6.08367e-05, Linf 0.00581669, total time[s] 0.074135 +Converged at iteration 21, L1 5.77092e-05, Linf 0.00545662, total time[s] 0.054782 +Converged at iteration 16, L1 9.31974e-05, Linf 0.00618808, total time[s] 0.051156 +Converged at iteration 31, L1 7.92269e-05, Linf 0.0037002, total time[s] 0.081146 +Converged at iteration 19, L1 6.57988e-05, Linf 0.00480386, total time[s] 0.050312 +Converged at iteration 22, L1 9.1389e-05, Linf 0.00601977, total time[s] 0.057205 +Converged at iteration 26, L1 8.34217e-05, Linf 0.00517152, total time[s] 0.06837 +Converged at iteration 23, L1 5.6866e-05, Linf 0.00567518, total time[s] 0.059766 +Converged at iteration 21, L1 5.74317e-05, Linf 0.00360522, total time[s] 0.054991 +Converged at iteration 23, L1 6.75498e-05, Linf 0.00329676, total time[s] 0.060752 +Converged at iteration 25, L1 8.80562e-05, Linf 0.00308631, total time[s] 0.066296 +Converged at iteration 28, L1 9.14744e-05, Linf 0.00489923, total time[s] 0.07251 +Converged at iteration 29, L1 9.95806e-05, Linf 0.00731737, total time[s] 0.074935 +Converged at iteration 27, L1 9.10813e-05, Linf 0.00571424, total time[s] 0.073177 +Converged at iteration 29, L1 9.87239e-05, Linf 0.00492801, total time[s] 0.073675 +Converged at iteration 29, L1 9.69227e-05, Linf 0.00302678, total time[s] 0.080976 +Converged at iteration 28, L1 8.24409e-05, Linf 0.00208275, total time[s] 0.071707 +Converged at iteration 32, L1 6.22664e-05, Linf 0.00631699, total time[s] 0.081989 +Converged at iteration 28, L1 6.15858e-05, Linf 0.00632425, total time[s] 0.071335 +Converged at iteration 25, L1 7.89108e-05, Linf 0.00414649, total time[s] 0.079255 +Converged at iteration 23, L1 9.20055e-05, Linf 0.00291792, total time[s] 0.05996 +Converged at iteration 38, L1 9.44609e-05, Linf 0.0074602, total time[s] 0.097362 +Converged at iteration 35, L1 5.73576e-05, Linf 0.00598141, total time[s] 0.090687 +Converged at iteration 24, L1 9.2894e-05, Linf 0.00342838, total time[s] 0.062273 +Converged at iteration 30, L1 6.79028e-05, Linf 0.00563633, total time[s] 0.075938 +Converged at iteration 26, L1 8.50484e-05, Linf 0.00888445, total time[s] 0.069451 +Converged at iteration 23, L1 7.94665e-05, Linf 0.00719009, total time[s] 0.060526 +Converged at iteration 19, L1 7.43881e-05, Linf 0.00550574, total time[s] 0.051209 +Converged at iteration 20, L1 6.04046e-05, Linf 0.00436873, total time[s] 0.054299 +Converged at iteration 23, L1 8.30933e-05, Linf 0.00443575, total time[s] 0.060892 +Converged at iteration 25, L1 6.36197e-05, Linf 0.00601145, total time[s] 0.065707 +Converged at iteration 21, L1 6.07252e-05, Linf 0.00556985, total time[s] 0.057948 +Converged at iteration 16, L1 9.46001e-05, Linf 0.0062629, total time[s] 0.045683 +Converged at iteration 31, L1 7.68789e-05, Linf 0.00378902, total time[s] 0.079429 +Converged at iteration 18, L1 9.88646e-05, Linf 0.00618632, total time[s] 0.047636 +Converged at iteration 22, L1 8.53094e-05, Linf 0.00536158, total time[s] 0.063899 +Converged at iteration 26, L1 8.64802e-05, Linf 0.00513443, total time[s] 0.080224 +Converged at iteration 23, L1 5.85671e-05, Linf 0.00577725, total time[s] 0.059834 +Converged at iteration 21, L1 6.17424e-05, Linf 0.00352157, total time[s] 0.054842 +Converged at iteration 23, L1 6.522e-05, Linf 0.00165607, total time[s] 0.060105 +Converged at iteration 25, L1 8.66734e-05, Linf 0.00296696, total time[s] 0.065379 +Converged at iteration 28, L1 9.54413e-05, Linf 0.00581353, total time[s] 0.071068 +Converged at iteration 30, L1 4.95396e-05, Linf 0.00390751, total time[s] 0.076113 +Converged at iteration 27, L1 9.26246e-05, Linf 0.00542579, total time[s] 0.068776 +Converged at iteration 30, L1 6.12859e-05, Linf 0.00407982, total time[s] 0.075395 +Converged at iteration 29, L1 9.54242e-05, Linf 0.00302924, total time[s] 0.081727 +Converged at iteration 28, L1 8.63142e-05, Linf 0.00202975, total time[s] 0.073862 +Converged at iteration 31, L1 9.90255e-05, Linf 0.00759772, total time[s] 0.078433 +Converged at iteration 28, L1 7.00497e-05, Linf 0.00684617, total time[s] 0.070909 +Converged at iteration 25, L1 8.69972e-05, Linf 0.00476233, total time[s] 0.064507 +Converged at iteration 23, L1 9.72084e-05, Linf 0.00303964, total time[s] 0.060029 +Converged at iteration 38, L1 8.71434e-05, Linf 0.00726273, total time[s] 0.09821 +Converged at iteration 34, L1 9.66663e-05, Linf 0.00726301, total time[s] 0.092136 +Converged at iteration 24, L1 9.4811e-05, Linf 0.00348945, total time[s] 0.061692 +Converged at iteration 30, L1 6.65951e-05, Linf 0.00556995, total time[s] 0.07565 +Converged at iteration 26, L1 8.9911e-05, Linf 0.00932402, total time[s] 0.067397 +Converged at iteration 23, L1 9.18066e-05, Linf 0.00806442, total time[s] 0.059776 +Converged at iteration 19, L1 7.96674e-05, Linf 0.00632283, total time[s] 0.050181 +Converged at iteration 20, L1 5.81758e-05, Linf 0.00422434, total time[s] 0.052576 +Converged at iteration 23, L1 8.4139e-05, Linf 0.00448925, total time[s] 0.059697 +Converged at iteration 25, L1 6.58022e-05, Linf 0.00619261, total time[s] 0.06504 +Converged at iteration 21, L1 6.53821e-05, Linf 0.0056673, total time[s] 0.055259 +Converged at iteration 16, L1 9.58552e-05, Linf 0.00628756, total time[s] 0.046819 +Converged at iteration 31, L1 7.50483e-05, Linf 0.00389064, total time[s] 0.084295 +Converged at iteration 18, L1 8.8392e-05, Linf 0.00579031, total time[s] 0.050643 +Converged at iteration 22, L1 7.9193e-05, Linf 0.00462181, total time[s] 0.058171 +Converged at iteration 26, L1 8.96406e-05, Linf 0.00510846, total time[s] 0.066697 +Converged at iteration 23, L1 6.06441e-05, Linf 0.00590054, total time[s] 0.063013 +Converged at iteration 21, L1 6.60974e-05, Linf 0.00350922, total time[s] 0.059648 +Converged at iteration 23, L1 6.29996e-05, Linf 0.00165194, total time[s] 0.062122 +Converged at iteration 25, L1 8.41267e-05, Linf 0.00280877, total time[s] 0.068861 +Converged at iteration 28, L1 9.91918e-05, Linf 0.00568514, total time[s] 0.074837 +Converged at iteration 30, L1 5.37006e-05, Linf 0.00405793, total time[s] 0.082156 +Converged at iteration 27, L1 9.39924e-05, Linf 0.00499806, total time[s] 0.071319 +Converged at iteration 30, L1 6.27393e-05, Linf 0.00419857, total time[s] 0.07813 +Converged at iteration 29, L1 9.53899e-05, Linf 0.00299628, total time[s] 0.076876 +Converged at iteration 28, L1 9.00622e-05, Linf 0.00195155, total time[s] 0.073987 +Converged at iteration 31, L1 8.80966e-05, Linf 0.00747006, total time[s] 0.081795 +Converged at iteration 28, L1 7.78082e-05, Linf 0.00733621, total time[s] 0.073452 +Converged at iteration 25, L1 9.6848e-05, Linf 0.00539594, total time[s] 0.066878 +Converged at iteration 24, L1 5.70336e-05, Linf 0.00223691, total time[s] 0.063752 +Converged at iteration 38, L1 7.87587e-05, Linf 0.00703672, total time[s] 0.101959 +Converged at iteration 34, L1 8.59268e-05, Linf 0.00708594, total time[s] 0.089817 +Converged at iteration 24, L1 9.6744e-05, Linf 0.00354151, total time[s] 0.064302 +Converged at iteration 30, L1 6.17883e-05, Linf 0.00550086, total time[s] 0.078506 +Converged at iteration 26, L1 9.50141e-05, Linf 0.00976688, total time[s] 0.070948 +Converged at iteration 24, L1 5.39503e-05, Linf 0.00727347, total time[s] 0.06485 +Converged at iteration 19, L1 8.55407e-05, Linf 0.00598844, total time[s] 0.064466 +Converged at iteration 20, L1 5.66114e-05, Linf 0.00398082, total time[s] 0.054908 +Converged at iteration 23, L1 8.48486e-05, Linf 0.00455469, total time[s] 0.062667 +Converged at iteration 25, L1 6.98884e-05, Linf 0.00636236, total time[s] 0.066375 +Converged at iteration 21, L1 6.8542e-05, Linf 0.00575159, total time[s] 0.057594 +Converged at iteration 16, L1 9.74401e-05, Linf 0.00626982, total time[s] 0.044065 +Converged at iteration 31, L1 7.38292e-05, Linf 0.00397583, total time[s] 0.081347 +Converged at iteration 18, L1 7.70845e-05, Linf 0.00534521, total time[s] 0.058675 +Converged at iteration 22, L1 7.1739e-05, Linf 0.00453153, total time[s] 0.059878 +Converged at iteration 26, L1 9.38387e-05, Linf 0.00511563, total time[s] 0.06899 +Converged at iteration 23, L1 6.34705e-05, Linf 0.00598064, total time[s] 0.063827 +Converged at iteration 21, L1 7.05444e-05, Linf 0.00362971, total time[s] 0.058382 +Converged at iteration 22, L1 9.72408e-05, Linf 0.00242724, total time[s] 0.060008 +Converged at iteration 25, L1 8.18489e-05, Linf 0.00266543, total time[s] 0.066794 +Converged at iteration 29, L1 6.5871e-05, Linf 0.00390088, total time[s] 0.080154 +Converged at iteration 30, L1 5.53708e-05, Linf 0.00420327, total time[s] 0.077826 +Converged at iteration 27, L1 9.55837e-05, Linf 0.00464874, total time[s] 0.07193 +Converged at iteration 30, L1 6.45232e-05, Linf 0.00432604, total time[s] 0.078379 +Converged at iteration 29, L1 9.57946e-05, Linf 0.00296581, total time[s] 0.07676 +Converged at iteration 28, L1 9.46025e-05, Linf 0.00186004, total time[s] 0.073532 +Converged at iteration 31, L1 8.05071e-05, Linf 0.00737341, total time[s] 0.080405 +Converged at iteration 28, L1 8.43261e-05, Linf 0.00781922, total time[s] 0.073526 +Converged at iteration 26, L1 6.05564e-05, Linf 0.00472533, total time[s] 0.069468 +Converged at iteration 24, L1 6.0446e-05, Linf 0.00234801, total time[s] 0.064374 +Converged at iteration 38, L1 7.05548e-05, Linf 0.0068373, total time[s] 0.101813 +Converged at iteration 34, L1 8.05644e-05, Linf 0.00695022, total time[s] 0.092826 +Converged at iteration 24, L1 9.78392e-05, Linf 0.00358167, total time[s] 0.076259 +Converged at iteration 30, L1 5.97158e-05, Linf 0.00542655, total time[s] 0.075918 +Converged at iteration 26, L1 9.97809e-05, Linf 0.0102026, total time[s] 0.067154 +Converged at iteration 24, L1 6.22425e-05, Linf 0.00787453, total time[s] 0.064365 +Converged at iteration 19, L1 9.15264e-05, Linf 0.005638, total time[s] 0.051639 +Converged at iteration 20, L1 5.52937e-05, Linf 0.00385649, total time[s] 0.054119 +Converged at iteration 23, L1 8.54218e-05, Linf 0.00461788, total time[s] 0.066417 +Converged at iteration 25, L1 7.32387e-05, Linf 0.00651921, total time[s] 0.066372 +Converged at iteration 21, L1 7.27042e-05, Linf 0.00582169, total time[s] 0.056914 +Converged at iteration 16, L1 9.87956e-05, Linf 0.00604382, total time[s] 0.04446 +Converged at iteration 31, L1 7.2653e-05, Linf 0.00406034, total time[s] 0.082248 +Converged at iteration 18, L1 6.51939e-05, Linf 0.00492797, total time[s] 0.04909 +Converged at iteration 21, L1 9.80016e-05, Linf 0.00478292, total time[s] 0.057021 +Converged at iteration 26, L1 9.80485e-05, Linf 0.00512781, total time[s] 0.069314 +Converged at iteration 23, L1 6.67364e-05, Linf 0.00613318, total time[s] 0.060605 +Converged at iteration 21, L1 7.58722e-05, Linf 0.00385414, total time[s] 0.056806 +Converged at iteration 22, L1 9.20421e-05, Linf 0.00247613, total time[s] 0.058466 +Converged at iteration 25, L1 8.01229e-05, Linf 0.0025337, total time[s] 0.06519 +Converged at iteration 29, L1 6.70524e-05, Linf 0.00411154, total time[s] 0.073993 +Converged at iteration 30, L1 5.77312e-05, Linf 0.004379, total time[s] 0.077429 +Converged at iteration 27, L1 9.6833e-05, Linf 0.00438279, total time[s] 0.07408 +Converged at iteration 30, L1 6.75298e-05, Linf 0.00438131, total time[s] 0.084122 +Converged at iteration 29, L1 9.82028e-05, Linf 0.0029767, total time[s] 0.078016 +Converged at iteration 29, L1 5.87575e-05, Linf 0.00122866, total time[s] 0.07511 +Converged at iteration 31, L1 7.80248e-05, Linf 0.0072697, total time[s] 0.079857 +Converged at iteration 28, L1 9.19389e-05, Linf 0.00830325, total time[s] 0.071859 +Converged at iteration 26, L1 6.83209e-05, Linf 0.0052966, total time[s] 0.067591 +Converged at iteration 24, L1 6.42051e-05, Linf 0.00245872, total time[s] 0.061796 +Converged at iteration 38, L1 6.49788e-05, Linf 0.00668541, total time[s] 0.129767 +Converged at iteration 34, L1 7.77701e-05, Linf 0.0067948, total time[s] 0.092131 +Converged at iteration 24, L1 9.84869e-05, Linf 0.00362297, total time[s] 0.063019 +Converged at iteration 30, L1 5.74777e-05, Linf 0.00535626, total time[s] 0.076545 +Converged at iteration 27, L1 5.13653e-05, Linf 0.00827915, total time[s] 0.069318 +Converged at iteration 24, L1 6.88448e-05, Linf 0.00859347, total time[s] 0.063591 +Converged at iteration 19, L1 9.63004e-05, Linf 0.0054303, total time[s] 0.051492 +Converged at iteration 20, L1 5.41447e-05, Linf 0.00371094, total time[s] 0.052913 +Converged at iteration 23, L1 8.59212e-05, Linf 0.0046587, total time[s] 0.062812 +Converged at iteration 25, L1 7.58175e-05, Linf 0.00666396, total time[s] 0.065611 +Converged at iteration 21, L1 7.46524e-05, Linf 0.00564342, total time[s] 0.055087 +Converged at iteration 16, L1 9.98907e-05, Linf 0.00613156, total time[s] 0.045449 +Converged at iteration 31, L1 7.06807e-05, Linf 0.0041309, total time[s] 0.078277 +Converged at iteration 17, L1 9.07309e-05, Linf 0.00638982, total time[s] 0.045778 +Converged at iteration 21, L1 8.62821e-05, Linf 0.00426651, total time[s] 0.056539 +Converged at iteration 27, L1 5.14547e-05, Linf 0.00226281, total time[s] 0.070006 +Converged at iteration 23, L1 6.90377e-05, Linf 0.00622111, total time[s] 0.060792 +Converged at iteration 21, L1 8.08606e-05, Linf 0.00398331, total time[s] 0.056798 +Converged at iteration 22, L1 8.57917e-05, Linf 0.00256861, total time[s] 0.058635 +Converged at iteration 25, L1 7.80935e-05, Linf 0.00244171, total time[s] 0.066123 +Converged at iteration 29, L1 6.71868e-05, Linf 0.00433593, total time[s] 0.074651 +Converged at iteration 30, L1 6.07085e-05, Linf 0.00457501, total time[s] 0.07693 +Converged at iteration 27, L1 9.81405e-05, Linf 0.00421363, total time[s] 0.069867 +Converged at iteration 30, L1 6.81411e-05, Linf 0.00457351, total time[s] 0.07706 +Converged at iteration 29, L1 9.83598e-05, Linf 0.00301975, total time[s] 0.074493 +Converged at iteration 29, L1 6.0947e-05, Linf 0.00122851, total time[s] 0.074116 +Converged at iteration 31, L1 7.31232e-05, Linf 0.00711261, total time[s] 0.080115 +Converged at iteration 28, L1 9.64008e-05, Linf 0.00880785, total time[s] 0.073474 +Converged at iteration 26, L1 7.56227e-05, Linf 0.00589397, total time[s] 0.068092 +Converged at iteration 24, L1 6.76382e-05, Linf 0.00256511, total time[s] 0.064014 +Converged at iteration 38, L1 6.05803e-05, Linf 0.0065172, total time[s] 0.098329 +Converged at iteration 34, L1 7.56461e-05, Linf 0.00657793, total time[s] 0.088967 +Converged at iteration 25, L1 4.14288e-05, Linf 0.0023032, total time[s] 0.065065 +Converged at iteration 30, L1 5.62267e-05, Linf 0.00527548, total time[s] 0.076622 +Converged at iteration 27, L1 5.25309e-05, Linf 0.00862642, total time[s] 0.071644 +Converged at iteration 24, L1 7.6864e-05, Linf 0.00933505, total time[s] 0.063461 +Converged at iteration 20, L1 4.02475e-05, Linf 0.00360989, total time[s] 0.057532 +Converged at iteration 20, L1 5.2976e-05, Linf 0.00373713, total time[s] 0.053318 +Converged at iteration 23, L1 8.63482e-05, Linf 0.00469938, total time[s] 0.061065 +Converged at iteration 25, L1 7.8972e-05, Linf 0.00680179, total time[s] 0.066938 +Converged at iteration 21, L1 7.69222e-05, Linf 0.00568502, total time[s] 0.056818 +Converged at iteration 17, L1 5.29327e-05, Linf 0.0036204, total time[s] 0.055655 +Converged at iteration 31, L1 6.93577e-05, Linf 0.00424632, total time[s] 0.092763 +Converged at iteration 17, L1 7.15615e-05, Linf 0.00585865, total time[s] 0.049025 +Converged at iteration 21, L1 7.22695e-05, Linf 0.00368608, total time[s] 0.055174 +Converged at iteration 27, L1 5.25312e-05, Linf 0.00237712, total time[s] 0.069078 +Converged at iteration 23, L1 7.19243e-05, Linf 0.00631347, total time[s] 0.061537 +Converged at iteration 21, L1 8.67305e-05, Linf 0.0041018, total time[s] 0.056968 +Converged at iteration 22, L1 7.90414e-05, Linf 0.0028414, total time[s] 0.060032 +Converged at iteration 25, L1 7.63854e-05, Linf 0.00215308, total time[s] 0.067272 +Converged at iteration 29, L1 6.82377e-05, Linf 0.00460796, total time[s] 0.078307 +Converged at iteration 30, L1 6.32414e-05, Linf 0.00474069, total time[s] 0.078816 +Converged at iteration 27, L1 9.94421e-05, Linf 0.00404556, total time[s] 0.070547 +Converged at iteration 30, L1 7.07404e-05, Linf 0.00470574, total time[s] 0.07683 +Converged at iteration 29, L1 9.92215e-05, Linf 0.0030518, total time[s] 0.074596 +Converged at iteration 29, L1 6.31248e-05, Linf 0.00123403, total time[s] 0.075051 +Converged at iteration 31, L1 6.71417e-05, Linf 0.00692238, total time[s] 0.082359 +Converged at iteration 29, L1 4.91279e-05, Linf 0.00752854, total time[s] 0.074851 +Converged at iteration 26, L1 8.48248e-05, Linf 0.00655012, total time[s] 0.068185 +Converged at iteration 24, L1 7.09007e-05, Linf 0.002704, total time[s] 0.062918 +Converged at iteration 38, L1 5.74904e-05, Linf 0.00630043, total time[s] 0.098825 +Converged at iteration 34, L1 7.34041e-05, Linf 0.00632733, total time[s] 0.092963 +Converged at iteration 25, L1 4.18204e-05, Linf 0.0023179, total time[s] 0.065289 +Converged at iteration 30, L1 5.65328e-05, Linf 0.00517579, total time[s] 0.077569 +Converged at iteration 27, L1 5.43483e-05, Linf 0.00890218, total time[s] 0.069722 +Converged at iteration 24, L1 8.52475e-05, Linf 0.0100961, total time[s] 0.065368 +Converged at iteration 20, L1 4.36065e-05, Linf 0.00409389, total time[s] 0.056087 +Converged at iteration 20, L1 5.09735e-05, Linf 0.00375018, total time[s] 0.054845 +Converged at iteration 23, L1 8.67888e-05, Linf 0.0047528, total time[s] 0.06184 +Converged at iteration 25, L1 8.16548e-05, Linf 0.00693251, total time[s] 0.070936 +Converged at iteration 21, L1 7.89322e-05, Linf 0.00569627, total time[s] 0.057739 +Converged at iteration 17, L1 5.36121e-05, Linf 0.00356434, total time[s] 0.048508 +Converged at iteration 31, L1 6.75564e-05, Linf 0.00436175, total time[s] 0.081388 +Converged at iteration 17, L1 5.7558e-05, Linf 0.00527028, total time[s] 0.047478 +Converged at iteration 20, L1 8.81813e-05, Linf 0.00371998, total time[s] 0.05507 +Converged at iteration 27, L1 5.63495e-05, Linf 0.00253919, total time[s] 0.071347 +Converged at iteration 23, L1 7.47924e-05, Linf 0.00642468, total time[s] 0.062111 +Converged at iteration 21, L1 9.20782e-05, Linf 0.00425404, total time[s] 0.057382 +Converged at iteration 22, L1 7.27365e-05, Linf 0.00309708, total time[s] 0.059587 +Converged at iteration 25, L1 7.45114e-05, Linf 0.00216237, total time[s] 0.069626 +Converged at iteration 29, L1 6.99334e-05, Linf 0.00486036, total time[s] 0.075864 +Converged at iteration 30, L1 6.63975e-05, Linf 0.00493934, total time[s] 0.0791 +Converged at iteration 28, L1 5.85797e-05, Linf 0.00301006, total time[s] 0.074681 +Converged at iteration 30, L1 7.16915e-05, Linf 0.00483944, total time[s] 0.078169 +Converged at iteration 30, L1 6.20497e-05, Linf 0.00230693, total time[s] 0.078081 +Converged at iteration 29, L1 6.536e-05, Linf 0.00122783, total time[s] 0.075112 +Converged at iteration 31, L1 5.99506e-05, Linf 0.00671531, total time[s] 0.080624 +Converged at iteration 29, L1 5.17472e-05, Linf 0.00797731, total time[s] 0.075988 +Converged at iteration 26, L1 9.49464e-05, Linf 0.00730132, total time[s] 0.070654 +Converged at iteration 24, L1 7.54497e-05, Linf 0.00278382, total time[s] 0.073413 +Converged at iteration 38, L1 5.47525e-05, Linf 0.00614055, total time[s] 0.108391 +Converged at iteration 34, L1 7.01509e-05, Linf 0.00607558, total time[s] 0.10224 +Converged at iteration 25, L1 4.24155e-05, Linf 0.00232539, total time[s] 0.094476 +Converged at iteration 30, L1 5.75084e-05, Linf 0.00512645, total time[s] 0.347053 +Converged at iteration 27, L1 5.70578e-05, Linf 0.00937862, total time[s] 0.080846 +Converged at iteration 24, L1 9.44288e-05, Linf 0.0108924, total time[s] 0.06517 +Converged at iteration 20, L1 4.702e-05, Linf 0.00435996, total time[s] 0.052816 +Converged at iteration 20, L1 4.94925e-05, Linf 0.00377403, total time[s] 0.064221 +Converged at iteration 23, L1 8.93889e-05, Linf 0.00479041, total time[s] 0.07541 +Converged at iteration 25, L1 8.39252e-05, Linf 0.00706021, total time[s] 0.078581 +Converged at iteration 21, L1 7.91129e-05, Linf 0.0057716, total time[s] 0.066403 +Converged at iteration 17, L1 5.50493e-05, Linf 0.00346934, total time[s] 0.047675 +Converged at iteration 31, L1 6.54887e-05, Linf 0.00449737, total time[s] 0.081826 +Converged at iteration 16, L1 9.61823e-05, Linf 0.00749431, total time[s] 0.04281 +Converged at iteration 20, L1 6.55863e-05, Linf 0.00291172, total time[s] 0.058178 +Converged at iteration 27, L1 5.77061e-05, Linf 0.0027102, total time[s] 0.072545 +Converged at iteration 23, L1 7.76264e-05, Linf 0.00659015, total time[s] 0.062304 +Converged at iteration 21, L1 9.83353e-05, Linf 0.00460625, total time[s] 0.057731 +Converged at iteration 22, L1 7.44211e-05, Linf 0.00301647, total time[s] 0.061985 +Converged at iteration 25, L1 7.23746e-05, Linf 0.00220624, total time[s] 0.070088 +Converged at iteration 29, L1 7.13616e-05, Linf 0.00502768, total time[s] 0.076417 +Converged at iteration 30, L1 7.00868e-05, Linf 0.00514242, total time[s] 0.078385 +Converged at iteration 28, L1 5.88131e-05, Linf 0.00299015, total time[s] 0.073701 +Converged at iteration 30, L1 7.39236e-05, Linf 0.00498099, total time[s] 0.078331 +Converged at iteration 30, L1 6.29588e-05, Linf 0.00230255, total time[s] 0.07867 +Converged at iteration 29, L1 6.86858e-05, Linf 0.00122535, total time[s] 0.076797 +Converged at iteration 30, L1 9.79958e-05, Linf 0.00845097, total time[s] 0.07789 +Converged at iteration 29, L1 5.48959e-05, Linf 0.0084671, total time[s] 0.07639 +Converged at iteration 27, L1 5.56089e-05, Linf 0.00625813, total time[s] 0.071851 +Converged at iteration 24, L1 7.90706e-05, Linf 0.00289645, total time[s] 0.063286 +Converged at iteration 37, L1 9.87601e-05, Linf 0.00722549, total time[s] 0.099249 +Converged at iteration 34, L1 6.60963e-05, Linf 0.00583975, total time[s] 0.095971 +Converged at iteration 25, L1 4.41941e-05, Linf 0.00232676, total time[s] 0.067642 +Converged at iteration 29, L1 9.38722e-05, Linf 0.00665011, total time[s] 0.081932 +Converged at iteration 27, L1 5.85112e-05, Linf 0.00978603, total time[s] 0.071363 +Converged at iteration 25, L1 4.41472e-05, Linf 0.00942458, total time[s] 0.067192 +Converged at iteration 20, L1 5.15732e-05, Linf 0.00453958, total time[s] 0.055386 +Converged at iteration 20, L1 4.74876e-05, Linf 0.00379614, total time[s] 0.055467 +Converged at iteration 23, L1 9.09617e-05, Linf 0.00482183, total time[s] 0.063067 +Converged at iteration 25, L1 8.44617e-05, Linf 0.00718602, total time[s] 0.066899 +Converged at iteration 21, L1 7.95777e-05, Linf 0.00574344, total time[s] 0.056974 +Converged at iteration 17, L1 5.67834e-05, Linf 0.00333495, total time[s] 0.050047 +Converged at iteration 31, L1 6.33376e-05, Linf 0.00465318, total time[s] 0.080916 +Converged at iteration 16, L1 9.77561e-05, Linf 0.00682273, total time[s] 0.046656 +Converged at iteration 19, L1 6.61518e-05, Linf 0.00285677, total time[s] 0.053077 +Converged at iteration 27, L1 5.98417e-05, Linf 0.00285641, total time[s] 0.072061 +Converged at iteration 23, L1 8.18862e-05, Linf 0.00676579, total time[s] 0.062101 +Converged at iteration 22, L1 5.45831e-05, Linf 0.00357475, total time[s] 0.06207 +Converged at iteration 22, L1 7.99973e-05, Linf 0.00303227, total time[s] 0.06047 +Converged at iteration 25, L1 6.99696e-05, Linf 0.00202955, total time[s] 0.072336 +Converged at iteration 29, L1 7.23559e-05, Linf 0.00468617, total time[s] 0.075089 +Converged at iteration 30, L1 7.44724e-05, Linf 0.00527609, total time[s] 0.078497 +Converged at iteration 28, L1 5.91985e-05, Linf 0.00284371, total time[s] 0.073267 +Converged at iteration 30, L1 7.67649e-05, Linf 0.00513779, total time[s] 0.07861 +Converged at iteration 30, L1 6.43023e-05, Linf 0.00230858, total time[s] 0.078149 +Converged at iteration 29, L1 7.25487e-05, Linf 0.00125974, total time[s] 0.075225 +Converged at iteration 30, L1 8.87636e-05, Linf 0.00820221, total time[s] 0.079534 +Converged at iteration 29, L1 5.90997e-05, Linf 0.00898826, total time[s] 0.075849 +Converged at iteration 27, L1 6.35814e-05, Linf 0.00672983, total time[s] 0.071516 +Converged at iteration 24, L1 8.22024e-05, Linf 0.00300877, total time[s] 0.064098 +Converged at iteration 37, L1 9.35061e-05, Linf 0.00694146, total time[s] 0.09684 +Converged at iteration 34, L1 6.12435e-05, Linf 0.005623, total time[s] 0.094495 +Converged at iteration 25, L1 4.58998e-05, Linf 0.00230822, total time[s] 0.066013 +Converged at iteration 29, L1 8.79203e-05, Linf 0.00654658, total time[s] 0.075935 +Converged at iteration 27, L1 6.14916e-05, Linf 0.0103267, total time[s] 0.071363 +Converged at iteration 25, L1 4.92316e-05, Linf 0.0102166, total time[s] 0.066752 +Converged at iteration 20, L1 5.56053e-05, Linf 0.00473945, total time[s] 0.054863 +Converged at iteration 20, L1 4.54475e-05, Linf 0.00380564, total time[s] 0.054843 +Converged at iteration 23, L1 9.11559e-05, Linf 0.00482519, total time[s] 0.06294 +Converged at iteration 25, L1 7.91707e-05, Linf 0.00730833, total time[s] 0.066555 +Converged at iteration 21, L1 8.01393e-05, Linf 0.0056916, total time[s] 0.057638 +Converged at iteration 17, L1 5.97843e-05, Linf 0.00315195, total time[s] 0.048039 +Converged at iteration 31, L1 6.12067e-05, Linf 0.00482895, total time[s] 0.081837 +Converged at iteration 17, L1 7.20682e-05, Linf 0.00303298, total time[s] 0.050374 +Converged at iteration 18, L1 7.84443e-05, Linf 0.0030283, total time[s] 0.060214 +Converged at iteration 27, L1 6.33622e-05, Linf 0.0030009, total time[s] 0.072644 +Converged at iteration 23, L1 8.52828e-05, Linf 0.00699311, total time[s] 0.062551 +Converged at iteration 22, L1 5.75429e-05, Linf 0.00386477, total time[s] 0.06139 +Converged at iteration 22, L1 8.72962e-05, Linf 0.00299182, total time[s] 0.062277 +Converged at iteration 25, L1 6.69595e-05, Linf 0.00182256, total time[s] 0.072059 +Converged at iteration 29, L1 7.32109e-05, Linf 0.00511902, total time[s] 0.07672 +Converged at iteration 30, L1 7.72246e-05, Linf 0.00549479, total time[s] 0.085276 +Converged at iteration 28, L1 5.93137e-05, Linf 0.00276103, total time[s] 0.08206 +Converged at iteration 30, L1 7.94085e-05, Linf 0.00530529, total time[s] 0.079092 +Converged at iteration 30, L1 6.69069e-05, Linf 0.0023451, total time[s] 0.079097 +Converged at iteration 29, L1 7.74202e-05, Linf 0.00139495, total time[s] 0.075671 +Converged at iteration 30, L1 8.05178e-05, Linf 0.00813863, total time[s] 0.080338 +Converged at iteration 29, L1 6.42464e-05, Linf 0.00955189, total time[s] 0.076778 +Converged at iteration 27, L1 7.27549e-05, Linf 0.0075744, total time[s] 0.0703 +Converged at iteration 24, L1 8.4837e-05, Linf 0.00312623, total time[s] 0.063421 +Converged at iteration 37, L1 8.78564e-05, Linf 0.0066668, total time[s] 0.099353 +Converged at iteration 34, L1 5.62764e-05, Linf 0.00542173, total time[s] 0.091969 +Converged at iteration 25, L1 4.71976e-05, Linf 0.00230944, total time[s] 0.066263 +Converged at iteration 29, L1 8.2864e-05, Linf 0.00646077, total time[s] 0.075721 +Converged at iteration 27, L1 6.39079e-05, Linf 0.0106717, total time[s] 0.071237 +Converged at iteration 25, L1 5.48845e-05, Linf 0.011033, total time[s] 0.066904 +Converged at iteration 20, L1 5.96794e-05, Linf 0.00500773, total time[s] 0.058787 +Converged at iteration 20, L1 4.28293e-05, Linf 0.00378371, total time[s] 0.057489 +Converged at iteration 23, L1 9.53378e-05, Linf 0.00487648, total time[s] 0.063272 +Converged at iteration 25, L1 6.93655e-05, Linf 0.00741276, total time[s] 0.066741 +Converged at iteration 21, L1 8.03005e-05, Linf 0.00564309, total time[s] 0.05749 +Converged at iteration 17, L1 6.22257e-05, Linf 0.00291817, total time[s] 0.04818 +Converged at iteration 31, L1 5.88391e-05, Linf 0.00502142, total time[s] 0.082455 +Converged at iteration 17, L1 9.31075e-05, Linf 0.0022876, total time[s] 0.046725 +Converged at iteration 18, L1 9.30229e-05, Linf 0.00179997, total time[s] 0.048621 +Converged at iteration 27, L1 6.72584e-05, Linf 0.00317644, total time[s] 0.073917 +Converged at iteration 23, L1 9.06875e-05, Linf 0.00728368, total time[s] 0.067237 +Converged at iteration 22, L1 6.19972e-05, Linf 0.00414585, total time[s] 0.060111 +Converged at iteration 22, L1 9.67388e-05, Linf 0.00321907, total time[s] 0.060267 +Converged at iteration 24, L1 9.67294e-05, Linf 0.00167787, total time[s] 0.064482 +Converged at iteration 29, L1 7.31827e-05, Linf 0.00530995, total time[s] 0.11469 +Converged at iteration 30, L1 8.14043e-05, Linf 0.00572577, total time[s] 0.080569 +Converged at iteration 28, L1 5.91676e-05, Linf 0.00271955, total time[s] 0.101263 +Converged at iteration 30, L1 8.24374e-05, Linf 0.00548781, total time[s] 0.110726 +Converged at iteration 30, L1 7.08506e-05, Linf 0.00241501, total time[s] 0.079017 +Converged at iteration 29, L1 8.24489e-05, Linf 0.00155323, total time[s] 0.07587 +Converged at iteration 30, L1 7.41181e-05, Linf 0.0079903, total time[s] 0.08148 +Converged at iteration 29, L1 7.06386e-05, Linf 0.0101986, total time[s] 0.08578 +Converged at iteration 27, L1 8.27371e-05, Linf 0.00826381, total time[s] 0.109527 +Converged at iteration 24, L1 8.83088e-05, Linf 0.00324806, total time[s] 0.076959 +Converged at iteration 37, L1 8.27056e-05, Linf 0.00641511, total time[s] 0.1028 +Converged at iteration 34, L1 5.16209e-05, Linf 0.00527631, total time[s] 0.105708 +Converged at iteration 25, L1 4.87249e-05, Linf 0.00229215, total time[s] 0.076393 +Converged at iteration 29, L1 7.90322e-05, Linf 0.00628488, total time[s] 0.088286 +Converged at iteration 27, L1 6.70499e-05, Linf 0.011018, total time[s] 0.075518 +Converged at iteration 25, L1 6.07574e-05, Linf 0.011789, total time[s] 0.093251 +Converged at iteration 20, L1 6.37791e-05, Linf 0.00531053, total time[s] 0.076898 +Converged at iteration 20, L1 4.0496e-05, Linf 0.00376548, total time[s] 0.078566 +Converged at iteration 23, L1 9.71369e-05, Linf 0.00490631, total time[s] 0.069902 +Converged at iteration 25, L1 5.97539e-05, Linf 0.00748868, total time[s] 0.072778 +Converged at iteration 21, L1 7.93764e-05, Linf 0.00559697, total time[s] 0.060631 +Converged at iteration 17, L1 6.63541e-05, Linf 0.00264107, total time[s] 0.047512 +Converged at iteration 31, L1 5.6268e-05, Linf 0.00520704, total time[s] 0.088009 +Converged at iteration 18, L1 8.0664e-05, Linf 0.00170836, total time[s] 0.054869 +Converged at iteration 19, L1 8.55612e-05, Linf 0.00193169, total time[s] 0.053692 +Converged at iteration 27, L1 7.07095e-05, Linf 0.00336551, total time[s] 0.069932 +Converged at iteration 23, L1 9.66633e-05, Linf 0.00757522, total time[s] 0.062512 +Converged at iteration 22, L1 6.56336e-05, Linf 0.00441223, total time[s] 0.06836 +Converged at iteration 23, L1 6.36051e-05, Linf 0.00236392, total time[s] 0.069942 +Converged at iteration 24, L1 9.18369e-05, Linf 0.00166707, total time[s] 0.064397 +Converged at iteration 29, L1 7.32992e-05, Linf 0.00483076, total time[s] 0.084852 +Converged at iteration 30, L1 8.59634e-05, Linf 0.00595411, total time[s] 0.087228 +Converged at iteration 28, L1 5.96316e-05, Linf 0.00270416, total time[s] 0.08331 +Converged at iteration 30, L1 8.60755e-05, Linf 0.00576019, total time[s] 0.07821 +Converged at iteration 30, L1 7.28713e-05, Linf 0.00249471, total time[s] 0.077931 +Converged at iteration 29, L1 8.75406e-05, Linf 0.00170909, total time[s] 0.07402 +Converged at iteration 30, L1 6.91059e-05, Linf 0.00784692, total time[s] 0.077537 +Converged at iteration 29, L1 7.59665e-05, Linf 0.0108065, total time[s] 0.075729 +Converged at iteration 27, L1 9.34759e-05, Linf 0.0089608, total time[s] 0.069765 +Converged at iteration 24, L1 9.26063e-05, Linf 0.00339036, total time[s] 0.06752 +Converged at iteration 37, L1 7.66381e-05, Linf 0.00619197, total time[s] 0.103544 +Converged at iteration 33, L1 9.85058e-05, Linf 0.00628383, total time[s] 0.117768 +Converged at iteration 25, L1 5.08136e-05, Linf 0.00226871, total time[s] 0.088654 +Converged at iteration 29, L1 7.91256e-05, Linf 0.00626541, total time[s] 0.087926 +Converged at iteration 27, L1 7.25399e-05, Linf 0.0115178, total time[s] 0.085905 +Converged at iteration 25, L1 6.7208e-05, Linf 0.0123734, total time[s] 0.079166 +Converged at iteration 20, L1 6.82646e-05, Linf 0.00574295, total time[s] 0.05964 +Converged at iteration 19, L1 9.85301e-05, Linf 0.00568842, total time[s] 0.064373 +Converged at iteration 23, L1 9.83663e-05, Linf 0.00491783, total time[s] 0.073818 +Converged at iteration 25, L1 5.29583e-05, Linf 0.00751617, total time[s] 0.072555 +Converged at iteration 21, L1 7.80436e-05, Linf 0.00560137, total time[s] 0.059466 +Converged at iteration 17, L1 7.12441e-05, Linf 0.00231695, total time[s] 0.048126 +Converged at iteration 31, L1 5.46057e-05, Linf 0.0054462, total time[s] 0.098352 +Converged at iteration 18, L1 9.85541e-05, Linf 0.00221581, total time[s] 0.049233 +Converged at iteration 20, L1 7.55276e-05, Linf 0.00237022, total time[s] 0.054077 +Converged at iteration 27, L1 7.24265e-05, Linf 0.00354354, total time[s] 0.069974 +Converged at iteration 24, L1 4.55801e-05, Linf 0.00377858, total time[s] 0.062864 +Converged at iteration 22, L1 6.9828e-05, Linf 0.00461969, total time[s] 0.058441 +Converged at iteration 23, L1 7.13501e-05, Linf 0.0026214, total time[s] 0.061952 +Converged at iteration 24, L1 8.53733e-05, Linf 0.00167204, total time[s] 0.065035 +Converged at iteration 29, L1 7.22034e-05, Linf 0.00527646, total time[s] 0.074466 +Converged at iteration 30, L1 9.08062e-05, Linf 0.00615608, total time[s] 0.077113 +Converged at iteration 28, L1 5.93894e-05, Linf 0.00270227, total time[s] 0.073013 +Converged at iteration 30, L1 8.80026e-05, Linf 0.00589359, total time[s] 0.077276 +Converged at iteration 30, L1 7.49233e-05, Linf 0.00251665, total time[s] 0.078927 +Converged at iteration 29, L1 9.30679e-05, Linf 0.00186396, total time[s] 0.074414 +Converged at iteration 30, L1 6.50124e-05, Linf 0.00770779, total time[s] 0.078236 +Converged at iteration 29, L1 8.21547e-05, Linf 0.0115105, total time[s] 0.074903 +Converged at iteration 28, L1 4.85195e-05, Linf 0.00761983, total time[s] 0.073416 +Converged at iteration 24, L1 9.42009e-05, Linf 0.00346709, total time[s] 0.064341 +Converged at iteration 37, L1 7.10995e-05, Linf 0.00599484, total time[s] 0.119574 +Converged at iteration 33, L1 9.2691e-05, Linf 0.00597314, total time[s] 0.096063 +Converged at iteration 25, L1 5.16796e-05, Linf 0.00224104, total time[s] 0.066166 +Converged at iteration 29, L1 7.3803e-05, Linf 0.00620666, total time[s] 0.074345 +Converged at iteration 27, L1 7.48469e-05, Linf 0.0118688, total time[s] 0.06925 +Converged at iteration 25, L1 7.2604e-05, Linf 0.013208, total time[s] 0.066763 +Converged at iteration 20, L1 7.25984e-05, Linf 0.00613898, total time[s] 0.054336 +Converged at iteration 19, L1 9.28977e-05, Linf 0.00570944, total time[s] 0.058728 +Converged at iteration 23, L1 9.80029e-05, Linf 0.00491152, total time[s] 0.091016 +Converged at iteration 24, L1 9.90499e-05, Linf 0.00989215, total time[s] 0.071642 +Converged at iteration 21, L1 7.61655e-05, Linf 0.00558875, total time[s] 0.059282 +Converged at iteration 17, L1 7.8438e-05, Linf 0.00194958, total time[s] 0.048641 +Converged at iteration 31, L1 5.4112e-05, Linf 0.00569298, total time[s] 0.094352 +Converged at iteration 19, L1 7.37335e-05, Linf 0.00247281, total time[s] 0.054865 +Converged at iteration 20, L1 9.96133e-05, Linf 0.00317868, total time[s] 0.056114 +Converged at iteration 27, L1 7.36089e-05, Linf 0.00368533, total time[s] 0.072594 +Converged at iteration 24, L1 4.87763e-05, Linf 0.00399194, total time[s] 0.062826 +Converged at iteration 22, L1 7.36629e-05, Linf 0.00472947, total time[s] 0.058675 +Converged at iteration 23, L1 7.92928e-05, Linf 0.0030779, total time[s] 0.060313 +Converged at iteration 24, L1 7.85793e-05, Linf 0.00168535, total time[s] 0.064445 +Converged at iteration 29, L1 7.08097e-05, Linf 0.00513956, total time[s] 0.081118 +Converged at iteration 30, L1 9.53316e-05, Linf 0.00641274, total time[s] 0.077535 +Converged at iteration 28, L1 5.95337e-05, Linf 0.00258973, total time[s] 0.073196 +Converged at iteration 30, L1 9.07884e-05, Linf 0.00611545, total time[s] 0.07877 +Converged at iteration 30, L1 7.75929e-05, Linf 0.00260369, total time[s] 0.077297 +Converged at iteration 29, L1 9.86972e-05, Linf 0.00201, total time[s] 0.075168 +Converged at iteration 30, L1 6.15283e-05, Linf 0.00757573, total time[s] 0.077926 +Converged at iteration 29, L1 8.91439e-05, Linf 0.0122495, total time[s] 0.076769 +Converged at iteration 28, L1 5.46822e-05, Linf 0.00824168, total time[s] 0.072097 +Converged at iteration 24, L1 9.75588e-05, Linf 0.00344016, total time[s] 0.064294 +Converged at iteration 37, L1 6.56946e-05, Linf 0.00582364, total time[s] 0.097942 +Converged at iteration 33, L1 8.84864e-05, Linf 0.00564947, total time[s] 0.095693 +Converged at iteration 25, L1 5.29759e-05, Linf 0.0022709, total time[s] 0.067211 +Converged at iteration 29, L1 6.76925e-05, Linf 0.00617757, total time[s] 0.074388 +Converged at iteration 27, L1 7.72789e-05, Linf 0.012163, total time[s] 0.070846 +Converged at iteration 25, L1 7.82638e-05, Linf 0.0138883, total time[s] 0.071314 +Converged at iteration 20, L1 7.68742e-05, Linf 0.00651317, total time[s] 0.054741 +Converged at iteration 19, L1 8.97959e-05, Linf 0.00573623, total time[s] 0.05504 +Converged at iteration 23, L1 9.94279e-05, Linf 0.00488716, total time[s] 0.067292 +Converged at iteration 24, L1 8.46804e-05, Linf 0.00991909, total time[s] 0.065275 +Converged at iteration 21, L1 7.35327e-05, Linf 0.0055859, total time[s] 0.057631 +Converged at iteration 17, L1 8.53305e-05, Linf 0.00169059, total time[s] 0.047668 +Converged at iteration 31, L1 5.3943e-05, Linf 0.00592266, total time[s] 0.129143 +Converged at iteration 19, L1 8.4242e-05, Linf 0.0030984, total time[s] 0.098475 +Converged at iteration 21, L1 7.86482e-05, Linf 0.00359075, total time[s] 0.070794 +Converged at iteration 27, L1 7.33233e-05, Linf 0.00373108, total time[s] 0.075567 +Converged at iteration 24, L1 5.23677e-05, Linf 0.00417031, total time[s] 0.081471 +Converged at iteration 22, L1 7.76862e-05, Linf 0.00481827, total time[s] 0.060346 +Converged at iteration 23, L1 9.00308e-05, Linf 0.00354621, total time[s] 0.062216 +Converged at iteration 24, L1 7.15688e-05, Linf 0.00167562, total time[s] 0.075759 +Converged at iteration 29, L1 6.94269e-05, Linf 0.00516351, total time[s] 0.090452 +Converged at iteration 31, L1 5.20229e-05, Linf 0.00372246, total time[s] 0.089646 +Converged at iteration 28, L1 5.95583e-05, Linf 0.00259376, total time[s] 0.07678 +Converged at iteration 30, L1 9.25958e-05, Linf 0.00634757, total time[s] 0.081172 +Converged at iteration 30, L1 8.03441e-05, Linf 0.00267252, total time[s] 0.079527 +Converged at iteration 30, L1 5.22309e-05, Linf 0.00122012, total time[s] 0.078926 +Converged at iteration 30, L1 5.88385e-05, Linf 0.00744125, total time[s] 0.078964 +Converged at iteration 29, L1 9.61942e-05, Linf 0.0130375, total time[s] 0.080193 +Converged at iteration 28, L1 6.14613e-05, Linf 0.00887002, total time[s] 0.079764 +Converged at iteration 25, L1 5.36834e-05, Linf 0.0020542, total time[s] 0.073736 +Converged at iteration 37, L1 6.04149e-05, Linf 0.00564652, total time[s] 0.108895 +Converged at iteration 33, L1 8.49105e-05, Linf 0.00534139, total time[s] 0.101958 +Converged at iteration 25, L1 5.25487e-05, Linf 0.00230175, total time[s] 0.075095 +Converged at iteration 29, L1 6.13771e-05, Linf 0.00618045, total time[s] 0.078202 +Converged at iteration 27, L1 8.0619e-05, Linf 0.012321, total time[s] 0.072658 +Converged at iteration 25, L1 8.4814e-05, Linf 0.0145924, total time[s] 0.073176 +Converged at iteration 20, L1 8.14911e-05, Linf 0.00732682, total time[s] 0.090003 +Converged at iteration 19, L1 8.38892e-05, Linf 0.00575751, total time[s] 0.072958 +Converged at iteration 23, L1 9.94397e-05, Linf 0.00487943, total time[s] 0.089797 +Converged at iteration 24, L1 7.48956e-05, Linf 0.0098466, total time[s] 0.065778 +Converged at iteration 21, L1 7.08397e-05, Linf 0.00560459, total time[s] 0.058502 +Converged at iteration 17, L1 9.4942e-05, Linf 0.00192096, total time[s] 0.046653 +Converged at iteration 31, L1 5.49496e-05, Linf 0.00617978, total time[s] 0.089353 +Converged at iteration 19, L1 9.89099e-05, Linf 0.00405495, total time[s] 0.053509 +Converged at iteration 21, L1 9.332e-05, Linf 0.00446348, total time[s] 0.067078 +Converged at iteration 27, L1 7.43502e-05, Linf 0.00380647, total time[s] 0.104266 +Converged at iteration 24, L1 5.54656e-05, Linf 0.0043195, total time[s] 0.068438 +Converged at iteration 22, L1 8.17966e-05, Linf 0.00507543, total time[s] 0.058368 +Converged at iteration 23, L1 9.88081e-05, Linf 0.00409558, total time[s] 0.066418 +Converged at iteration 23, L1 8.97957e-05, Linf 0.00249922, total time[s] 0.07059 +Converged at iteration 29, L1 6.74138e-05, Linf 0.00513498, total time[s] 0.078183 +Converged at iteration 31, L1 5.47093e-05, Linf 0.00385379, total time[s] 0.087826 +Converged at iteration 27, L1 9.93974e-05, Linf 0.00359649, total time[s] 0.071963 +Converged at iteration 30, L1 9.52637e-05, Linf 0.00659919, total time[s] 0.080945 +Converged at iteration 30, L1 8.23489e-05, Linf 0.00281685, total time[s] 0.078477 +Converged at iteration 30, L1 5.46379e-05, Linf 0.00126696, total time[s] 0.076365 +Converged at iteration 30, L1 5.74815e-05, Linf 0.00728078, total time[s] 0.078751 +Converged at iteration 30, L1 4.05615e-05, Linf 0.00975913, total time[s] 0.079299 +Converged at iteration 28, L1 6.89941e-05, Linf 0.00953312, total time[s] 0.073765 +Converged at iteration 25, L1 5.30665e-05, Linf 0.00211321, total time[s] 0.066658 +Converged at iteration 37, L1 5.57909e-05, Linf 0.00544296, total time[s] 0.099811 +Converged at iteration 33, L1 8.25887e-05, Linf 0.00508546, total time[s] 0.100937 +Converged at iteration 25, L1 5.48896e-05, Linf 0.00238737, total time[s] 0.074836 +Converged at iteration 28, L1 9.29522e-05, Linf 0.00808718, total time[s] 0.084016 +Converged at iteration 27, L1 8.01674e-05, Linf 0.0112919, total time[s] 0.074082 +Converged at iteration 25, L1 9.22114e-05, Linf 0.0153336, total time[s] 0.067057 +Converged at iteration 20, L1 8.6046e-05, Linf 0.00764577, total time[s] 0.054952 +Converged at iteration 19, L1 8.09347e-05, Linf 0.00575924, total time[s] 0.083001 +Converged at iteration 23, L1 9.94984e-05, Linf 0.0048653, total time[s] 0.068032 +Converged at iteration 24, L1 6.34493e-05, Linf 0.00968603, total time[s] 0.068685 +Converged at iteration 21, L1 6.31279e-05, Linf 0.00554961, total time[s] 0.058174 +Converged at iteration 18, L1 5.4433e-05, Linf 0.00135651, total time[s] 0.053732 +Converged at iteration 31, L1 5.69448e-05, Linf 0.00644984, total time[s] 0.089769 +Converged at iteration 20, L1 7.02862e-05, Linf 0.00355774, total time[s] 0.05557 +Converged at iteration 22, L1 6.23885e-05, Linf 0.0041889, total time[s] 0.061042 +Converged at iteration 27, L1 7.7535e-05, Linf 0.00392737, total time[s] 0.080922 +Converged at iteration 24, L1 5.87118e-05, Linf 0.0044816, total time[s] 0.065669 +Converged at iteration 22, L1 8.7118e-05, Linf 0.0053201, total time[s] 0.06027 +Converged at iteration 24, L1 6.07077e-05, Linf 0.00328456, total time[s] 0.070767 +Converged at iteration 23, L1 8.09248e-05, Linf 0.00249957, total time[s] 0.062664 +Converged at iteration 29, L1 6.55374e-05, Linf 0.00510353, total time[s] 0.077099 +Converged at iteration 31, L1 5.77846e-05, Linf 0.00403281, total time[s] 0.08011 +Converged at iteration 27, L1 9.83109e-05, Linf 0.00358538, total time[s] 0.159899 +Converged at iteration 30, L1 9.74957e-05, Linf 0.00687188, total time[s] 0.18581 +Converged at iteration 30, L1 8.57146e-05, Linf 0.00299324, total time[s] 0.118861 +Converged at iteration 30, L1 5.61714e-05, Linf 0.00129604, total time[s] 0.082276 +Converged at iteration 30, L1 5.62155e-05, Linf 0.00706671, total time[s] 0.080024 +Converged at iteration 30, L1 4.47056e-05, Linf 0.010454, total time[s] 0.078871 +Converged at iteration 28, L1 7.78078e-05, Linf 0.0102418, total time[s] 0.07342 +Converged at iteration 25, L1 5.32468e-05, Linf 0.00215612, total time[s] 0.066641 +Converged at iteration 36, L1 9.7288e-05, Linf 0.00665697, total time[s] 0.093411 +Converged at iteration 33, L1 8.12038e-05, Linf 0.00488687, total time[s] 0.089742 +Converged at iteration 25, L1 5.79415e-05, Linf 0.00249523, total time[s] 0.073097 +Converged at iteration 28, L1 7.04568e-05, Linf 0.00802768, total time[s] 0.081258 +Converged at iteration 27, L1 8.1657e-05, Linf 0.0114709, total time[s] 0.071798 +Converged at iteration 25, L1 9.7089e-05, Linf 0.0148519, total time[s] 0.070459 +Converged at iteration 20, L1 9.0316e-05, Linf 0.007973, total time[s] 0.056329 +Converged at iteration 19, L1 7.87791e-05, Linf 0.00573543, total time[s] 0.064008 +Converged at iteration 24, L1 5.43943e-05, Linf 0.00279348, total time[s] 0.070371 +Converged at iteration 24, L1 5.40327e-05, Linf 0.0094388, total time[s] 0.067674 +Converged at iteration 21, L1 5.30685e-05, Linf 0.00537729, total time[s] 0.062482 +Converged at iteration 18, L1 6.23179e-05, Linf 0.00156188, total time[s] 0.048153 +Converged at iteration 31, L1 5.91185e-05, Linf 0.00672738, total time[s] 0.084135 +Converged at iteration 20, L1 8.23063e-05, Linf 0.00367837, total time[s] 0.053586 +Converged at iteration 22, L1 6.80703e-05, Linf 0.00476608, total time[s] 0.070565 +Converged at iteration 27, L1 8.06557e-05, Linf 0.00408032, total time[s] 0.072599 +Converged at iteration 24, L1 6.15186e-05, Linf 0.00465246, total time[s] 0.065688 +Converged at iteration 22, L1 9.19225e-05, Linf 0.00548912, total time[s] 0.060055 +Converged at iteration 24, L1 6.73632e-05, Linf 0.00371307, total time[s] 0.098693 +Converged at iteration 23, L1 7.46216e-05, Linf 0.00295915, total time[s] 0.096912 +Converged at iteration 28, L1 9.74234e-05, Linf 0.00642016, total time[s] 0.072899 +Converged at iteration 31, L1 6.22814e-05, Linf 0.0043295, total time[s] 0.08029 +Converged at iteration 27, L1 9.71674e-05, Linf 0.0035772, total time[s] 0.069038 +Converged at iteration 31, L1 5.10428e-05, Linf 0.00545776, total time[s] 0.078294 +Converged at iteration 30, L1 8.69906e-05, Linf 0.00317551, total time[s] 0.07732 +Converged at iteration 30, L1 5.83019e-05, Linf 0.00139949, total time[s] 0.077721 +Converged at iteration 30, L1 5.56897e-05, Linf 0.00675277, total time[s] 0.078251 +Converged at iteration 30, L1 4.89634e-05, Linf 0.0111489, total time[s] 0.084492 +Converged at iteration 28, L1 8.63951e-05, Linf 0.0109821, total time[s] 0.081227 +Converged at iteration 25, L1 5.25376e-05, Linf 0.00220568, total time[s] 0.066091 +Converged at iteration 36, L1 9.27098e-05, Linf 0.00649656, total time[s] 0.092785 +Converged at iteration 33, L1 8.06362e-05, Linf 0.00474339, total time[s] 0.086955 +Converged at iteration 25, L1 6.01683e-05, Linf 0.00258437, total time[s] 0.074706 +Converged at iteration 28, L1 4.83879e-05, Linf 0.00784554, total time[s] 0.077893 +Converged at iteration 27, L1 8.20932e-05, Linf 0.0116035, total time[s] 0.070148 +Converged at iteration 25, L1 9.90243e-05, Linf 0.0152354, total time[s] 0.064512 +Converged at iteration 20, L1 9.57507e-05, Linf 0.00822122, total time[s] 0.060167 +Converged at iteration 19, L1 7.71603e-05, Linf 0.00568961, total time[s] 0.060509 +Converged at iteration 24, L1 5.62357e-05, Linf 0.00276169, total time[s] 0.072164 +Converged at iteration 24, L1 4.69388e-05, Linf 0.0091543, total time[s] 0.077822 +Converged at iteration 21, L1 4.49401e-05, Linf 0.00500287, total time[s] 0.066888 +Converged at iteration 18, L1 7.03199e-05, Linf 0.00177994, total time[s] 0.068644 +Converged at iteration 31, L1 6.12168e-05, Linf 0.00701815, total time[s] 0.09819 +Converged at iteration 20, L1 9.03665e-05, Linf 0.00419995, total time[s] 0.063037 +Converged at iteration 22, L1 7.64614e-05, Linf 0.00526644, total time[s] 0.06362 +Converged at iteration 27, L1 8.29439e-05, Linf 0.00424548, total time[s] 0.074774 +Converged at iteration 24, L1 6.44254e-05, Linf 0.0048255, total time[s] 0.076862 +Converged at iteration 22, L1 9.6137e-05, Linf 0.00559719, total time[s] 0.081005 +Converged at iteration 24, L1 7.52952e-05, Linf 0.0043076, total time[s] 0.064737 +Converged at iteration 23, L1 7.32929e-05, Linf 0.00371432, total time[s] 0.070746 +Converged at iteration 28, L1 9.48323e-05, Linf 0.00613981, total time[s] 0.07647 +Converged at iteration 31, L1 6.65332e-05, Linf 0.0050298, total time[s] 0.091593 +Converged at iteration 27, L1 9.70607e-05, Linf 0.00357751, total time[s] 0.08111 +Converged at iteration 31, L1 5.27128e-05, Linf 0.00558653, total time[s] 0.117023 +Converged at iteration 30, L1 9.23299e-05, Linf 0.00319584, total time[s] 0.094571 +Converged at iteration 30, L1 6.17936e-05, Linf 0.00157707, total time[s] 0.087539 +Converged at iteration 30, L1 5.65563e-05, Linf 0.00651239, total time[s] 0.098658 +Converged at iteration 30, L1 5.43358e-05, Linf 0.0121716, total time[s] 0.079687 +Converged at iteration 28, L1 9.47475e-05, Linf 0.0119378, total time[s] 0.079882 +Converged at iteration 25, L1 5.20906e-05, Linf 0.00221886, total time[s] 0.080483 +Converged at iteration 36, L1 8.96192e-05, Linf 0.00634047, total time[s] 0.110667 +Converged at iteration 33, L1 8.05936e-05, Linf 0.00464754, total time[s] 0.113335 +Converged at iteration 25, L1 6.09325e-05, Linf 0.00263304, total time[s] 0.069349 +Converged at iteration 27, L1 7.1145e-05, Linf 0.00982231, total time[s] 0.073356 +Converged at iteration 27, L1 8.14712e-05, Linf 0.0110799, total time[s] 0.072879 +Converged at iteration 26, L1 3.11522e-05, Linf 0.0100991, total time[s] 0.077333 +Converged at iteration 21, L1 3.65226e-05, Linf 0.00636155, total time[s] 0.060526 +Converged at iteration 19, L1 7.70479e-05, Linf 0.00563946, total time[s] 0.074793 +Converged at iteration 23, L1 5.78196e-05, Linf 0.00265842, total time[s] 0.310972 +Converged at iteration 24, L1 3.97198e-05, Linf 0.00866672, total time[s] 0.144082 +Converged at iteration 20, L1 9.56336e-05, Linf 0.00667104, total time[s] 0.056871 +Converged at iteration 18, L1 7.67955e-05, Linf 0.00200989, total time[s] 0.051888 +Converged at iteration 31, L1 6.38603e-05, Linf 0.00730933, total time[s] 0.089016 +Converged at iteration 20, L1 9.10756e-05, Linf 0.00469123, total time[s] 0.062599 +Converged at iteration 22, L1 7.94439e-05, Linf 0.0057407, total time[s] 0.06187 +Converged at iteration 27, L1 8.30994e-05, Linf 0.00434381, total time[s] 0.085706 +Converged at iteration 24, L1 6.63416e-05, Linf 0.00499755, total time[s] 0.068665 +Converged at iteration 23, L1 5.37666e-05, Linf 0.00350118, total time[s] 0.059763 +Converged at iteration 24, L1 8.23848e-05, Linf 0.00590809, total time[s] 0.063952 +Converged at iteration 23, L1 7.54837e-05, Linf 0.00448495, total time[s] 0.06073 +Converged at iteration 28, L1 8.98356e-05, Linf 0.0058242, total time[s] 0.0838 +Converged at iteration 31, L1 7.01679e-05, Linf 0.00505892, total time[s] 0.079876 +Converged at iteration 27, L1 9.5837e-05, Linf 0.0035591, total time[s] 0.070762 +Converged at iteration 31, L1 5.41047e-05, Linf 0.00587151, total time[s] 0.077527 +Converged at iteration 30, L1 9.35588e-05, Linf 0.00315635, total time[s] 0.076405 +Converged at iteration 30, L1 7.13268e-05, Linf 0.00182803, total time[s] 0.074176 +Converged at iteration 30, L1 5.76656e-05, Linf 0.00616412, total time[s] 0.095262 +Converged at iteration 30, L1 6.08319e-05, Linf 0.0132471, total time[s] 0.077856 +Converged at iteration 29, L1 4.48638e-05, Linf 0.00913563, total time[s] 0.076832 +Converged at iteration 25, L1 5.26344e-05, Linf 0.00220178, total time[s] 0.064346 +Converged at iteration 36, L1 8.73685e-05, Linf 0.00623578, total time[s] 0.091621 +Converged at iteration 33, L1 8.20878e-05, Linf 0.00466359, total time[s] 0.089706 +Converged at iteration 25, L1 6.17441e-05, Linf 0.00263763, total time[s] 0.068654 +Converged at iteration 27, L1 4.86614e-05, Linf 0.00950546, total time[s] 0.069996 +Converged at iteration 27, L1 8.12876e-05, Linf 0.011029, total time[s] 0.104451 +Converged at iteration 26, L1 3.23885e-05, Linf 0.0117806, total time[s] 0.086909 +Converged at iteration 21, L1 3.81063e-05, Linf 0.00671013, total time[s] 0.065376 +Converged at iteration 19, L1 7.58773e-05, Linf 0.00557539, total time[s] 0.073753 +Converged at iteration 24, L1 5.57552e-05, Linf 0.00266451, total time[s] 0.081109 +Converged at iteration 23, L1 9.28547e-05, Linf 0.0130759, total time[s] 0.084673 +Converged at iteration 20, L1 8.87792e-05, Linf 0.00618428, total time[s] 0.081398 +Converged at iteration 18, L1 8.41947e-05, Linf 0.00224041, total time[s] 0.088066 +Converged at iteration 31, L1 6.62885e-05, Linf 0.0076253, total time[s] 0.107743 +Converged at iteration 21, L1 6.23419e-05, Linf 0.0037565, total time[s] 0.077336 +Converged at iteration 22, L1 8.65964e-05, Linf 0.00630567, total time[s] 0.056881 +Converged at iteration 27, L1 8.22842e-05, Linf 0.00437682, total time[s] 0.070897 +Converged at iteration 24, L1 6.83687e-05, Linf 0.00518235, total time[s] 0.062417 +Converged at iteration 23, L1 5.64832e-05, Linf 0.00364053, total time[s] 0.07144 +Converged at iteration 24, L1 8.90271e-05, Linf 0.00695438, total time[s] 0.081787 +Converged at iteration 23, L1 8.00538e-05, Linf 0.00525129, total time[s] 0.064172 +Converged at iteration 28, L1 8.158e-05, Linf 0.0054938, total time[s] 0.072234 +Converged at iteration 31, L1 7.42049e-05, Linf 0.00493127, total time[s] 0.079003 +Converged at iteration 27, L1 9.5174e-05, Linf 0.00351946, total time[s] 0.086004 +Converged at iteration 31, L1 5.59273e-05, Linf 0.00618425, total time[s] 0.084994 +Converged at iteration 30, L1 9.36408e-05, Linf 0.00335187, total time[s] 0.114811 +Converged at iteration 30, L1 7.53986e-05, Linf 0.00209356, total time[s] 0.090181 +Converged at iteration 30, L1 5.80907e-05, Linf 0.00576349, total time[s] 0.078352 +Converged at iteration 30, L1 6.90857e-05, Linf 0.0143334, total time[s] 0.077258 +Converged at iteration 29, L1 4.789e-05, Linf 0.00971263, total time[s] 0.076432 +Converged at iteration 25, L1 4.99602e-05, Linf 0.00218972, total time[s] 0.066441 +Converged at iteration 36, L1 8.60174e-05, Linf 0.00622215, total time[s] 0.093375 +Converged at iteration 33, L1 8.49195e-05, Linf 0.0048136, total time[s] 0.093573 +Converged at iteration 25, L1 6.05427e-05, Linf 0.00271231, total time[s] 0.067529 +Converged at iteration 26, L1 7.38156e-05, Linf 0.0116423, total time[s] 0.072367 +Converged at iteration 27, L1 8.36723e-05, Linf 0.0114517, total time[s] 0.075833 +Converged at iteration 26, L1 3.40785e-05, Linf 0.0123013, total time[s] 0.07132 +Converged at iteration 21, L1 4.03425e-05, Linf 0.00693861, total time[s] 0.061213 +Converged at iteration 19, L1 7.89735e-05, Linf 0.00548987, total time[s] 0.062776 +Converged at iteration 24, L1 5.62257e-05, Linf 0.00263899, total time[s] 0.078577 +Converged at iteration 23, L1 8.18056e-05, Linf 0.0124446, total time[s] 0.064865 +Converged at iteration 20, L1 8.49855e-05, Linf 0.00534003, total time[s] 0.064868 +Converged at iteration 18, L1 9.35926e-05, Linf 0.00258301, total time[s] 0.07714 +Converged at iteration 31, L1 6.85545e-05, Linf 0.00806809, total time[s] 0.105174 +Converged at iteration 21, L1 8.76156e-05, Linf 0.00400726, total time[s] 0.06441 +Converged at iteration 22, L1 9.12715e-05, Linf 0.00669556, total time[s] 0.057979 +Converged at iteration 27, L1 7.80573e-05, Linf 0.00431667, total time[s] 0.069716 +Converged at iteration 24, L1 7.13589e-05, Linf 0.00546956, total time[s] 0.063819 +Converged at iteration 23, L1 6.01005e-05, Linf 0.00379269, total time[s] 0.063751 +Converged at iteration 24, L1 9.6656e-05, Linf 0.00799095, total time[s] 0.07518 +Converged at iteration 23, L1 9.0676e-05, Linf 0.0062631, total time[s] 0.062044 +Converged at iteration 28, L1 7.04869e-05, Linf 0.00511045, total time[s] 0.072657 +Converged at iteration 31, L1 8.02228e-05, Linf 0.00546962, total time[s] 0.080692 +Converged at iteration 27, L1 9.2186e-05, Linf 0.00344121, total time[s] 0.08892 +Converged at iteration 31, L1 5.50625e-05, Linf 0.00648183, total time[s] 0.103256 +Converged at iteration 30, L1 9.59645e-05, Linf 0.00343495, total time[s] 0.082726 +Converged at iteration 30, L1 8.81417e-05, Linf 0.00255412, total time[s] 0.080246 +Converged at iteration 30, L1 5.832e-05, Linf 0.00526941, total time[s] 0.077382 +Converged at iteration 30, L1 8.00326e-05, Linf 0.015543, total time[s] 0.081017 +Converged at iteration 29, L1 5.33021e-05, Linf 0.010447, total time[s] 0.07525 +Converged at iteration 25, L1 4.96741e-05, Linf 0.00220862, total time[s] 0.065833 +Converged at iteration 36, L1 8.59473e-05, Linf 0.00632445, total time[s] 0.111228 +Converged at iteration 33, L1 8.71914e-05, Linf 0.00492093, total time[s] 0.110192 +Converged at iteration 25, L1 5.98018e-05, Linf 0.00275537, total time[s] 0.069817 +Converged at iteration 26, L1 5.9642e-05, Linf 0.0113924, total time[s] 0.067626 +Converged at iteration 27, L1 9.02222e-05, Linf 0.0118117, total time[s] 0.069656 +Converged at iteration 26, L1 3.59518e-05, Linf 0.0128429, total time[s] 0.085941 +Converged at iteration 21, L1 4.13336e-05, Linf 0.0071653, total time[s] 0.062284 +Converged at iteration 19, L1 8.06287e-05, Linf 0.00546559, total time[s] 0.06156 +Converged at iteration 24, L1 5.63639e-05, Linf 0.00260919, total time[s] 0.072976 +Converged at iteration 23, L1 7.74527e-05, Linf 0.0120528, total time[s] 0.069805 +Converged at iteration 20, L1 8.37758e-05, Linf 0.00477951, total time[s] 0.074489 +Converged at iteration 18, L1 9.87514e-05, Linf 0.00274492, total time[s] 0.073357 +Converged at iteration 31, L1 6.99104e-05, Linf 0.00831253, total time[s] 0.093474 +Converged at iteration 21, L1 9.2587e-05, Linf 0.00412374, total time[s] 0.055914 +Converged at iteration 22, L1 9.34362e-05, Linf 0.0070054, total time[s] 0.058999 +Converged at iteration 27, L1 7.63245e-05, Linf 0.00427233, total time[s] 0.068775 +Converged at iteration 24, L1 7.27046e-05, Linf 0.00557405, total time[s] 0.062572 +Converged at iteration 23, L1 6.22093e-05, Linf 0.00385737, total time[s] 0.058983 +Converged at iteration 25, L1 5.49489e-05, Linf 0.00370735, total time[s] 0.071124 +Converged at iteration 23, L1 9.89321e-05, Linf 0.0068383, total time[s] 0.06462 +Converged at iteration 27, L1 9.9556e-05, Linf 0.00633125, total time[s] 0.077563 +Converged at iteration 31, L1 8.27804e-05, Linf 0.00531889, total time[s] 0.09465 +Converged at iteration 27, L1 9.09468e-05, Linf 0.00339061, total time[s] 0.075122 +Converged at iteration 31, L1 5.62178e-05, Linf 0.00669605, total time[s] 0.092616 +Converged at iteration 30, L1 9.70928e-05, Linf 0.00328125, total time[s] 0.079399 +Converged at iteration 30, L1 9.35585e-05, Linf 0.00281898, total time[s] 0.082671 +Converged at iteration 29, L1 9.88575e-05, Linf 0.0084738, total time[s] 0.074508 +Converged at iteration 30, L1 8.64197e-05, Linf 0.0159123, total time[s] 0.076853 +Converged at iteration 29, L1 5.65565e-05, Linf 0.0108532, total time[s] 0.079791 +Converged at iteration 25, L1 4.96008e-05, Linf 0.00220164, total time[s] 0.071003 +Converged at iteration 36, L1 8.67405e-05, Linf 0.00648124, total time[s] 0.1035 +Converged at iteration 33, L1 9.11587e-05, Linf 0.00509386, total time[s] 0.175506 +Converged at iteration 25, L1 6.17282e-05, Linf 0.00284504, total time[s] 0.096999 +Converged at iteration 26, L1 4.53344e-05, Linf 0.0109204, total time[s] 0.093538 +Converged at iteration 27, L1 9.49528e-05, Linf 0.0116596, total time[s] 0.074355 +Converged at iteration 26, L1 3.71002e-05, Linf 0.0131476, total time[s] 0.082906 +Converged at iteration 21, L1 4.24591e-05, Linf 0.00735579, total time[s] 0.069144 +Converged at iteration 19, L1 8.12251e-05, Linf 0.00538944, total time[s] 0.066639 +Converged at iteration 24, L1 5.70319e-05, Linf 0.0025654, total time[s] 0.086232 +Converged at iteration 23, L1 7.4975e-05, Linf 0.0114918, total time[s] 0.086915 +Converged at iteration 20, L1 8.2336e-05, Linf 0.00491635, total time[s] 0.08718 +Converged at iteration 19, L1 5.12219e-05, Linf 0.0016052, total time[s] 0.066432 +Converged at iteration 31, L1 7.1998e-05, Linf 0.00865867, total time[s] 0.087511 +Converged at iteration 21, L1 9.30176e-05, Linf 0.00421726, total time[s] 0.066224 +Converged at iteration 22, L1 9.89053e-05, Linf 0.00736795, total time[s] 0.085821 +Converged at iteration 27, L1 7.54988e-05, Linf 0.00420339, total time[s] 0.079716 +Converged at iteration 24, L1 7.37745e-05, Linf 0.00566297, total time[s] 0.068795 +Converged at iteration 23, L1 6.51534e-05, Linf 0.00392654, total time[s] 0.079391 +Converged at iteration 25, L1 5.84509e-05, Linf 0.00388454, total time[s] 0.08072 +Converged at iteration 24, L1 6.39087e-05, Linf 0.00550942, total time[s] 0.062558 +Converged at iteration 27, L1 8.95236e-05, Linf 0.00625027, total time[s] 0.071859 +Converged at iteration 31, L1 8.61246e-05, Linf 0.00505142, total time[s] 0.07846 +Converged at iteration 27, L1 8.82817e-05, Linf 0.00326722, total time[s] 0.068699 +Converged at iteration 31, L1 5.83018e-05, Linf 0.00689984, total time[s] 0.077964 +Converged at iteration 30, L1 9.87138e-05, Linf 0.00322581, total time[s] 0.077363 +Converged at iteration 31, L1 4.70995e-05, Linf 0.00170103, total time[s] 0.077792 +Converged at iteration 29, L1 9.73371e-05, Linf 0.00805108, total time[s] 0.073576 +Converged at iteration 30, L1 9.41905e-05, Linf 0.0155767, total time[s] 0.080735 +Converged at iteration 29, L1 6.12158e-05, Linf 0.0114047, total time[s] 0.073758 +Converged at iteration 25, L1 4.9691e-05, Linf 0.00219378, total time[s] 0.065601 +Converged at iteration 36, L1 8.84027e-05, Linf 0.00670803, total time[s] 0.092236 +Converged at iteration 33, L1 9.54384e-05, Linf 0.0052872, total time[s] 0.086491 +Converged at iteration 25, L1 6.27614e-05, Linf 0.00286953, total time[s] 0.06919 +Converged at iteration 25, L1 9.39311e-05, Linf 0.0137781, total time[s] 0.064296 +Converged at iteration 27, L1 9.25273e-05, Linf 0.012949, total time[s] 0.069052 +Converged at iteration 26, L1 3.89073e-05, Linf 0.013583, total time[s] 0.066295 +Converged at iteration 21, L1 4.3267e-05, Linf 0.00747304, total time[s] 0.05574 +Converged at iteration 19, L1 8.12157e-05, Linf 0.00532671, total time[s] 0.049997 +Converged at iteration 24, L1 5.75637e-05, Linf 0.00253182, total time[s] 0.066598 +Converged at iteration 23, L1 7.24411e-05, Linf 0.0111155, total time[s] 0.059768 +Converged at iteration 20, L1 8.27316e-05, Linf 0.00496019, total time[s] 0.054964 +Converged at iteration 19, L1 5.51912e-05, Linf 0.00174408, total time[s] 0.053495 +Converged at iteration 31, L1 7.37336e-05, Linf 0.00896422, total time[s] 0.088083 +Converged at iteration 21, L1 8.99382e-05, Linf 0.00422871, total time[s] 0.057023 +Converged at iteration 23, L1 5.61556e-05, Linf 0.0052285, total time[s] 0.062125 +Converged at iteration 27, L1 7.55037e-05, Linf 0.00415984, total time[s] 0.070403 +Converged at iteration 24, L1 7.96784e-05, Linf 0.00567096, total time[s] 0.066563 +Converged at iteration 23, L1 6.69901e-05, Linf 0.00399147, total time[s] 0.062262 +Converged at iteration 25, L1 5.93241e-05, Linf 0.00398504, total time[s] 0.065523 +Converged at iteration 24, L1 7.29679e-05, Linf 0.00603677, total time[s] 0.063208 +Converged at iteration 27, L1 8.34545e-05, Linf 0.00619788, total time[s] 0.070464 +Converged at iteration 31, L1 9.46649e-05, Linf 0.00512163, total time[s] 0.079308 +Converged at iteration 27, L1 8.53829e-05, Linf 0.00315, total time[s] 0.073478 +Converged at iteration 31, L1 5.80314e-05, Linf 0.00710482, total time[s] 0.083563 +Converged at iteration 31, L1 6.12695e-05, Linf 0.00226074, total time[s] 0.080402 +Converged at iteration 31, L1 5.16982e-05, Linf 0.00187259, total time[s] 0.080352 +Converged at iteration 29, L1 9.65641e-05, Linf 0.00766725, total time[s] 0.076326 +Converged at iteration 30, L1 9.99318e-05, Linf 0.0141643, total time[s] 0.080635 +Converged at iteration 29, L1 6.33061e-05, Linf 0.0118768, total time[s] 0.075783 +Converged at iteration 25, L1 4.95222e-05, Linf 0.00216212, total time[s] 0.067399 +Converged at iteration 36, L1 9.06872e-05, Linf 0.00700455, total time[s] 0.093557 +Converged at iteration 34, L1 4.44765e-05, Linf 0.00426287, total time[s] 0.126334 +Converged at iteration 25, L1 6.45229e-05, Linf 0.00296153, total time[s] 0.09549 +Converged at iteration 25, L1 8.22718e-05, Linf 0.0134079, total time[s] 0.093499 +Converged at iteration 27, L1 9.09388e-05, Linf 0.0130733, total time[s] 0.077475 +Converged at iteration 26, L1 4.21667e-05, Linf 0.0140922, total time[s] 0.075799 +Converged at iteration 21, L1 4.40197e-05, Linf 0.0078162, total time[s] 0.081731 +Converged at iteration 19, L1 8.19465e-05, Linf 0.00521456, total time[s] 0.061969 +Converged at iteration 24, L1 5.79957e-05, Linf 0.00249591, total time[s] 0.06322 +Converged at iteration 23, L1 6.95137e-05, Linf 0.010645, total time[s] 0.071429 +Converged at iteration 20, L1 8.41418e-05, Linf 0.00498631, total time[s] 0.059288 +Converged at iteration 19, L1 5.79236e-05, Linf 0.00190187, total time[s] 0.066365 +Converged at iteration 31, L1 7.52213e-05, Linf 0.00933615, total time[s] 0.087528 +Converged at iteration 21, L1 8.89517e-05, Linf 0.00425864, total time[s] 0.057745 +Converged at iteration 23, L1 5.79414e-05, Linf 0.00545478, total time[s] 0.060115 +Converged at iteration 27, L1 7.45739e-05, Linf 0.0041252, total time[s] 0.069057 +Converged at iteration 24, L1 7.37788e-05, Linf 0.00563574, total time[s] 0.065486 +Converged at iteration 23, L1 6.8414e-05, Linf 0.00408273, total time[s] 0.060105 +Converged at iteration 25, L1 5.9537e-05, Linf 0.00408826, total time[s] 0.064051 +Converged at iteration 24, L1 8.41481e-05, Linf 0.00662959, total time[s] 0.063193 +Converged at iteration 27, L1 7.94356e-05, Linf 0.00617106, total time[s] 0.10576 +Converged at iteration 31, L1 9.29047e-05, Linf 0.00534122, total time[s] 0.084683 +Converged at iteration 27, L1 8.22453e-05, Linf 0.00303502, total time[s] 0.068546 +Converged at iteration 31, L1 6.0098e-05, Linf 0.00736264, total time[s] 0.083736 +Converged at iteration 31, L1 6.17319e-05, Linf 0.00230161, total time[s] 0.079775 +Converged at iteration 31, L1 5.65612e-05, Linf 0.00210176, total time[s] 0.079783 +Converged at iteration 29, L1 9.65744e-05, Linf 0.00724554, total time[s] 0.074862 +Converged at iteration 31, L1 3.59072e-05, Linf 0.00843364, total time[s] 0.079144 +Converged at iteration 29, L1 6.59592e-05, Linf 0.0124183, total time[s] 0.074801 +Converged at iteration 25, L1 4.90378e-05, Linf 0.00215021, total time[s] 0.065728 +Converged at iteration 36, L1 9.32712e-05, Linf 0.00724824, total time[s] 0.093275 +Converged at iteration 34, L1 4.66107e-05, Linf 0.00427497, total time[s] 0.09977 +Converged at iteration 25, L1 6.41238e-05, Linf 0.00299753, total time[s] 0.076841 +Converged at iteration 25, L1 6.87982e-05, Linf 0.0130667, total time[s] 0.065264 +Converged at iteration 27, L1 8.5887e-05, Linf 0.0131231, total time[s] 0.070037 +Converged at iteration 26, L1 4.38738e-05, Linf 0.0144677, total time[s] 0.067986 +Converged at iteration 21, L1 4.44355e-05, Linf 0.0079256, total time[s] 0.060893 +Converged at iteration 19, L1 8.23517e-05, Linf 0.00514492, total time[s] 0.050876 +Converged at iteration 24, L1 5.73667e-05, Linf 0.00250258, total time[s] 0.072062 +Converged at iteration 23, L1 6.78716e-05, Linf 0.0103236, total time[s] 0.067653 +Converged at iteration 20, L1 8.52017e-05, Linf 0.00494951, total time[s] 0.058128 +Converged at iteration 19, L1 6.09714e-05, Linf 0.00202257, total time[s] 0.054641 +Converged at iteration 31, L1 7.64889e-05, Linf 0.00963599, total time[s] 0.087415 +Converged at iteration 21, L1 8.89379e-05, Linf 0.00431277, total time[s] 0.064266 +Converged at iteration 23, L1 6.05312e-05, Linf 0.00559192, total time[s] 0.06401 +Converged at iteration 27, L1 7.56524e-05, Linf 0.00412573, total time[s] 0.072575 +Converged at iteration 24, L1 7.32099e-05, Linf 0.00556016, total time[s] 0.06455 +Converged at iteration 23, L1 7.036e-05, Linf 0.00431128, total time[s] 0.06204 +Converged at iteration 25, L1 5.99831e-05, Linf 0.00413732, total time[s] 0.066904 +Converged at iteration 24, L1 9.16143e-05, Linf 0.00704474, total time[s] 0.064312 +Converged at iteration 27, L1 7.70499e-05, Linf 0.00616818, total time[s] 0.072095 +Converged at iteration 31, L1 9.39986e-05, Linf 0.0052336, total time[s] 0.080594 +Converged at iteration 27, L1 7.91906e-05, Linf 0.00293095, total time[s] 0.072034 +Converged at iteration 31, L1 6.1518e-05, Linf 0.00753568, total time[s] 0.08083 +Converged at iteration 31, L1 6.30097e-05, Linf 0.00244625, total time[s] 0.080484 +Converged at iteration 31, L1 5.98665e-05, Linf 0.00227065, total time[s] 0.080387 +Converged at iteration 29, L1 9.63227e-05, Linf 0.00690925, total time[s] 0.075796 +Converged at iteration 31, L1 3.85432e-05, Linf 0.00844424, total time[s] 0.080539 +Converged at iteration 29, L1 6.7419e-05, Linf 0.012816, total time[s] 0.076627 +Converged at iteration 25, L1 4.86861e-05, Linf 0.00218245, total time[s] 0.066629 +Converged at iteration 36, L1 9.61673e-05, Linf 0.00753425, total time[s] 0.102424 +Converged at iteration 34, L1 5.03362e-05, Linf 0.00434514, total time[s] 0.1023 +Converged at iteration 25, L1 6.38846e-05, Linf 0.0030141, total time[s] 0.067144 +Converged at iteration 25, L1 5.94811e-05, Linf 0.0126457, total time[s] 0.06715 +Converged at iteration 27, L1 6.69417e-05, Linf 0.0130831, total time[s] 0.072828 +Converged at iteration 26, L1 4.62387e-05, Linf 0.0148885, total time[s] 0.072009 +Converged at iteration 21, L1 4.4995e-05, Linf 0.00812807, total time[s] 0.062723 +Converged at iteration 19, L1 7.9924e-05, Linf 0.00508908, total time[s] 0.052929 +Converged at iteration 24, L1 5.8179e-05, Linf 0.0025114, total time[s] 0.067734 +Converged at iteration 23, L1 6.7019e-05, Linf 0.00983962, total time[s] 0.06352 +Converged at iteration 20, L1 8.72164e-05, Linf 0.00491834, total time[s] 0.063809 +Converged at iteration 19, L1 6.47073e-05, Linf 0.00216974, total time[s] 0.067368 +Converged at iteration 31, L1 7.7108e-05, Linf 0.00999173, total time[s] 0.083394 +Converged at iteration 21, L1 9.06976e-05, Linf 0.00442153, total time[s] 0.056507 +Converged at iteration 23, L1 6.34441e-05, Linf 0.0057665, total time[s] 0.064322 +Converged at iteration 27, L1 7.63614e-05, Linf 0.00416872, total time[s] 0.069343 +Converged at iteration 24, L1 7.22215e-05, Linf 0.00545872, total time[s] 0.061422 +Converged at iteration 23, L1 7.29146e-05, Linf 0.00439812, total time[s] 0.061802 +Converged at iteration 25, L1 6.19207e-05, Linf 0.00419134, total time[s] 0.066513 +Converged at iteration 25, L1 5.72468e-05, Linf 0.00533623, total time[s] 0.066539 +Converged at iteration 27, L1 7.53611e-05, Linf 0.00619392, total time[s] 0.071246 +Converged at iteration 31, L1 9.676e-05, Linf 0.00529112, total time[s] 0.080896 +Converged at iteration 27, L1 7.60729e-05, Linf 0.00281054, total time[s] 0.071181 +Converged at iteration 31, L1 6.27684e-05, Linf 0.00779818, total time[s] 0.081568 +Converged at iteration 31, L1 6.30859e-05, Linf 0.00228509, total time[s] 0.085724 +Converged at iteration 31, L1 6.61043e-05, Linf 0.00252234, total time[s] 0.08015 +Converged at iteration 29, L1 9.62372e-05, Linf 0.00654732, total time[s] 0.076635 +Converged at iteration 31, L1 4.23171e-05, Linf 0.00912006, total time[s] 0.079968 +Converged at iteration 29, L1 6.87123e-05, Linf 0.0132639, total time[s] 0.076104 +Converged at iteration 25, L1 4.87993e-05, Linf 0.00224794, total time[s] 0.067224 +Converged at iteration 36, L1 9.89876e-05, Linf 0.00776444, total time[s] 0.096558 +Converged at iteration 34, L1 5.32581e-05, Linf 0.00479269, total time[s] 0.099076 +Converged at iteration 25, L1 6.28381e-05, Linf 0.0030759, total time[s] 0.065262 +Converged at iteration 25, L1 5.49573e-05, Linf 0.0123052, total time[s] 0.064286 +Converged at iteration 27, L1 6.05203e-05, Linf 0.0128959, total time[s] 0.068281 +Converged at iteration 26, L1 4.74377e-05, Linf 0.0151758, total time[s] 0.065861 +Converged at iteration 21, L1 4.52283e-05, Linf 0.00827904, total time[s] 0.070018 +Converged at iteration 19, L1 7.6747e-05, Linf 0.00508379, total time[s] 0.053773 +Converged at iteration 24, L1 5.74228e-05, Linf 0.00238914, total time[s] 0.086213 +Converged at iteration 23, L1 6.74755e-05, Linf 0.00948811, total time[s] 0.073255 +Converged at iteration 20, L1 8.86497e-05, Linf 0.00485533, total time[s] 0.054285 +Converged at iteration 19, L1 6.77298e-05, Linf 0.00229251, total time[s] 0.053331 +Converged at iteration 31, L1 7.62886e-05, Linf 0.0102483, total time[s] 0.087102 +Converged at iteration 21, L1 9.15954e-05, Linf 0.00451961, total time[s] 0.060733 +Converged at iteration 23, L1 6.76264e-05, Linf 0.00589483, total time[s] 0.063607 +Converged at iteration 27, L1 7.6644e-05, Linf 0.0041732, total time[s] 0.072736 +Converged at iteration 24, L1 7.10159e-05, Linf 0.00535291, total time[s] 0.064316 +Converged at iteration 23, L1 7.45593e-05, Linf 0.00442236, total time[s] 0.068129 +Converged at iteration 25, L1 6.29537e-05, Linf 0.00424325, total time[s] 0.084364 +Converged at iteration 25, L1 6.00177e-05, Linf 0.00553448, total time[s] 0.075468 +Converged at iteration 27, L1 7.30655e-05, Linf 0.00624232, total time[s] 0.106326 +Converged at iteration 31, L1 9.86741e-05, Linf 0.00525954, total time[s] 0.089067 +Converged at iteration 27, L1 7.41813e-05, Linf 0.00271018, total time[s] 0.07249 +Converged at iteration 31, L1 6.4581e-05, Linf 0.00794457, total time[s] 0.080849 +Converged at iteration 31, L1 6.23403e-05, Linf 0.00231925, total time[s] 0.080226 +Converged at iteration 31, L1 7.1231e-05, Linf 0.00269982, total time[s] 0.079122 +Converged at iteration 29, L1 9.62834e-05, Linf 0.00628912, total time[s] 0.076274 +Converged at iteration 31, L1 4.54551e-05, Linf 0.0096321, total time[s] 0.080064 +Converged at iteration 29, L1 6.90469e-05, Linf 0.0135858, total time[s] 0.07473 +Converged at iteration 25, L1 4.96537e-05, Linf 0.00230304, total time[s] 0.067196 +Converged at iteration 37, L1 5.3848e-05, Linf 0.00626806, total time[s] 0.09548 +Converged at iteration 34, L1 5.6957e-05, Linf 0.00448598, total time[s] 0.089267 +Converged at iteration 25, L1 6.18976e-05, Linf 0.00310095, total time[s] 0.068936 +Converged at iteration 25, L1 4.85843e-05, Linf 0.0118597, total time[s] 0.066028 +Converged at iteration 27, L1 4.35099e-05, Linf 0.0123901, total time[s] 0.069835 +Converged at iteration 26, L1 4.76979e-05, Linf 0.0154715, total time[s] 0.071412 +Converged at iteration 21, L1 4.66523e-05, Linf 0.00845871, total time[s] 0.064404 +Converged at iteration 19, L1 7.39229e-05, Linf 0.00500321, total time[s] 0.053045 +Converged at iteration 24, L1 5.78125e-05, Linf 0.00252532, total time[s] 0.067537 +Converged at iteration 23, L1 6.90476e-05, Linf 0.0088859, total time[s] 0.070289 +Converged at iteration 20, L1 9.15599e-05, Linf 0.00477485, total time[s] 0.06108 +Converged at iteration 19, L1 7.2511e-05, Linf 0.00246078, total time[s] 0.060474 +Converged at iteration 31, L1 7.57551e-05, Linf 0.0106384, total time[s] 0.082259 +Converged at iteration 21, L1 9.20403e-05, Linf 0.00466622, total time[s] 0.059764 +Converged at iteration 23, L1 6.9235e-05, Linf 0.00607808, total time[s] 0.061516 +Converged at iteration 27, L1 7.49708e-05, Linf 0.00419306, total time[s] 0.071877 +Converged at iteration 24, L1 6.91605e-05, Linf 0.00517936, total time[s] 0.063237 +Converged at iteration 23, L1 7.7007e-05, Linf 0.00451762, total time[s] 0.073736 +Converged at iteration 25, L1 6.5127e-05, Linf 0.00433378, total time[s] 0.086533 +Converged at iteration 25, L1 6.28539e-05, Linf 0.00578246, total time[s] 0.070975 +Converged at iteration 27, L1 7.10461e-05, Linf 0.00633941, total time[s] 0.069969 +Converged at iteration 32, L1 5.24531e-05, Linf 0.0030694, total time[s] 0.085569 +Converged at iteration 27, L1 6.96934e-05, Linf 0.00258502, total time[s] 0.080082 +Converged at iteration 31, L1 6.55095e-05, Linf 0.00812148, total time[s] 0.086647 +Converged at iteration 31, L1 6.19505e-05, Linf 0.0023438, total time[s] 0.084787 +Converged at iteration 31, L1 7.70519e-05, Linf 0.00296879, total time[s] 0.08103 +Converged at iteration 29, L1 9.78604e-05, Linf 0.00602355, total time[s] 0.080442 +Converged at iteration 31, L1 4.95538e-05, Linf 0.0103816, total time[s] 0.087005 +Converged at iteration 29, L1 7.04118e-05, Linf 0.0140028, total time[s] 0.079181 +Converged at iteration 25, L1 4.92962e-05, Linf 0.00239961, total time[s] 0.070937 +Converged at iteration 37, L1 5.5473e-05, Linf 0.00645623, total time[s] 0.106412 +Converged at iteration 34, L1 5.99168e-05, Linf 0.00477586, total time[s] 0.100185 +Converged at iteration 25, L1 6.06402e-05, Linf 0.00312607, total time[s] 0.068298 +Converged at iteration 25, L1 4.63699e-05, Linf 0.0115267, total time[s] 0.071077 +Converged at iteration 27, L1 4.4339e-05, Linf 0.0118568, total time[s] 0.074129 +Converged at iteration 26, L1 5.44141e-05, Linf 0.015577, total time[s] 0.068703 +Converged at iteration 21, L1 4.7966e-05, Linf 0.008605, total time[s] 0.059209 +Converged at iteration 19, L1 7.29961e-05, Linf 0.00495565, total time[s] 0.059008 +Converged at iteration 24, L1 5.69096e-05, Linf 0.00243919, total time[s] 0.083087 +Converged at iteration 23, L1 6.86109e-05, Linf 0.00811865, total time[s] 0.072445 +Converged at iteration 20, L1 9.27305e-05, Linf 0.00468089, total time[s] 0.069218 +Converged at iteration 19, L1 7.54813e-05, Linf 0.00258777, total time[s] 0.054772 +Converged at iteration 31, L1 7.58721e-05, Linf 0.0108902, total time[s] 0.103123 +Converged at iteration 21, L1 9.30939e-05, Linf 0.00477344, total time[s] 0.086814 +Converged at iteration 23, L1 6.8633e-05, Linf 0.00623797, total time[s] 0.488252 +Converged at iteration 27, L1 7.58759e-05, Linf 0.00709982, total time[s] 0.133027 +Converged at iteration 24, L1 6.80465e-05, Linf 0.00506282, total time[s] 0.079192 +Converged at iteration 23, L1 7.83698e-05, Linf 0.00447846, total time[s] 0.091346 +Converged at iteration 25, L1 6.75099e-05, Linf 0.00438927, total time[s] 0.074169 +Converged at iteration 25, L1 6.44498e-05, Linf 0.00591512, total time[s] 0.092354 +Converged at iteration 27, L1 7.17359e-05, Linf 0.00640334, total time[s] 0.093003 +Converged at iteration 32, L1 5.31732e-05, Linf 0.00303328, total time[s] 0.108499 +Converged at iteration 27, L1 6.69765e-05, Linf 0.00248529, total time[s] 0.086213 +Converged at iteration 31, L1 6.94361e-05, Linf 0.008208, total time[s] 0.080737 +Converged at iteration 31, L1 6.22507e-05, Linf 0.00232304, total time[s] 0.079495 +Converged at iteration 31, L1 8.1465e-05, Linf 0.00314657, total time[s] 0.080161 +Converged at iteration 29, L1 9.89212e-05, Linf 0.00587369, total time[s] 0.08209 +Converged at iteration 31, L1 5.41153e-05, Linf 0.0114382, total time[s] 0.081854 +Converged at iteration 29, L1 7.14923e-05, Linf 0.0142642, total time[s] 0.124479 +Converged at iteration 25, L1 5.02325e-05, Linf 0.00245632, total time[s] 0.065664 +Converged at iteration 37, L1 5.72141e-05, Linf 0.00671367, total time[s] 0.099587 +Converged at iteration 34, L1 6.33825e-05, Linf 0.00534223, total time[s] 0.105684 +Converged at iteration 25, L1 5.82759e-05, Linf 0.00319212, total time[s] 0.092973 +Converged at iteration 25, L1 4.30117e-05, Linf 0.0110508, total time[s] 0.067759 +Converged at iteration 26, L1 8.67923e-05, Linf 0.0173715, total time[s] 0.072212 +Converged at iteration 26, L1 4.63436e-05, Linf 0.0155727, total time[s] 0.097671 +Converged at iteration 21, L1 4.82391e-05, Linf 0.0087962, total time[s] 0.066134 +Converged at iteration 19, L1 7.11141e-05, Linf 0.00487154, total time[s] 0.085649 +Converged at iteration 24, L1 5.70461e-05, Linf 0.00247809, total time[s] 0.07857 +Converged at iteration 23, L1 7.18412e-05, Linf 0.00749398, total time[s] 0.070318 +Converged at iteration 20, L1 9.61007e-05, Linf 0.00456749, total time[s] 0.061385 +Converged at iteration 19, L1 8.04866e-05, Linf 0.00277071, total time[s] 0.058179 +Converged at iteration 31, L1 7.67676e-05, Linf 0.0113684, total time[s] 0.097338 +Converged at iteration 21, L1 9.1896e-05, Linf 0.00493087, total time[s] 0.055697 +Converged at iteration 23, L1 6.77787e-05, Linf 0.00664172, total time[s] 0.060233 +Converged at iteration 27, L1 7.06876e-05, Linf 0.00407037, total time[s] 0.073074 +Converged at iteration 24, L1 6.65003e-05, Linf 0.00489607, total time[s] 0.067697 +Converged at iteration 23, L1 8.01339e-05, Linf 0.00453562, total time[s] 0.062636 +Converged at iteration 25, L1 6.95619e-05, Linf 0.00449042, total time[s] 0.069919 +Converged at iteration 25, L1 6.70148e-05, Linf 0.00641691, total time[s] 0.065725 +Converged at iteration 27, L1 7.16257e-05, Linf 0.0065259, total time[s] 0.069824 +Converged at iteration 32, L1 5.49035e-05, Linf 0.00301145, total time[s] 0.081315 +Converged at iteration 27, L1 6.39924e-05, Linf 0.00235456, total time[s] 0.069421 +Converged at iteration 31, L1 6.79561e-05, Linf 0.00843865, total time[s] 0.08001 +Converged at iteration 31, L1 6.09141e-05, Linf 0.00236627, total time[s] 0.079461 +Converged at iteration 31, L1 8.88807e-05, Linf 0.0034459, total time[s] 0.079624 +Converged at iteration 30, L1 6.69272e-05, Linf 0.00330089, total time[s] 0.078382 +Converged at iteration 31, L1 5.86286e-05, Linf 0.0120154, total time[s] 0.078962 +Converged at iteration 29, L1 7.19106e-05, Linf 0.0146585, total time[s] 0.081472 +Converged at iteration 25, L1 5.05522e-05, Linf 0.00249077, total time[s] 0.065979 +Converged at iteration 37, L1 5.86426e-05, Linf 0.00689257, total time[s] 0.097797 +Converged at iteration 34, L1 6.90957e-05, Linf 0.00517362, total time[s] 0.096494 +Converged at iteration 25, L1 5.88292e-05, Linf 0.00323517, total time[s] 0.072879 +Converged at iteration 25, L1 4.23839e-05, Linf 0.0106955, total time[s] 0.0665 +Converged at iteration 26, L1 8.12202e-05, Linf 0.017074, total time[s] 0.068825 +Converged at iteration 26, L1 4.56575e-05, Linf 0.0157203, total time[s] 0.074563 +Converged at iteration 21, L1 4.91127e-05, Linf 0.00892163, total time[s] 0.059081 +Converged at iteration 19, L1 7.00032e-05, Linf 0.0048457, total time[s] 0.054463 +Converged at iteration 24, L1 5.70144e-05, Linf 0.00248891, total time[s] 0.072781 +Converged at iteration 23, L1 7.45147e-05, Linf 0.00695585, total time[s] 0.067742 +Converged at iteration 20, L1 9.70911e-05, Linf 0.00444503, total time[s] 0.067479 +Converged at iteration 19, L1 8.32367e-05, Linf 0.00289489, total time[s] 0.053764 +Converged at iteration 31, L1 7.67983e-05, Linf 0.0114705, total time[s] 0.093486 +Converged at iteration 21, L1 9.17983e-05, Linf 0.004942, total time[s] 0.061906 +Converged at iteration 23, L1 6.7255e-05, Linf 0.00611944, total time[s] 0.065977 +Converged at iteration 27, L1 6.95124e-05, Linf 0.00399246, total time[s] 0.071901 +Converged at iteration 24, L1 6.54904e-05, Linf 0.0047853, total time[s] 0.064641 +Converged at iteration 23, L1 8.1159e-05, Linf 0.00458234, total time[s] 0.063836 +Converged at iteration 25, L1 7.07715e-05, Linf 0.00455219, total time[s] 0.066922 +Converged at iteration 25, L1 6.89853e-05, Linf 0.0067844, total time[s] 0.066777 +Converged at iteration 27, L1 7.12151e-05, Linf 0.00662899, total time[s] 0.071746 +Converged at iteration 32, L1 5.5136e-05, Linf 0.00301294, total time[s] 0.085393 +Converged at iteration 27, L1 6.18505e-05, Linf 0.00226032, total time[s] 0.07276 +Converged at iteration 31, L1 6.83252e-05, Linf 0.00851722, total time[s] 0.081363 +Converged at iteration 31, L1 6.08545e-05, Linf 0.00236186, total time[s] 0.083662 +Converged at iteration 31, L1 9.26279e-05, Linf 0.0036053, total time[s] 0.083718 +Converged at iteration 30, L1 6.80675e-05, Linf 0.00337377, total time[s] 0.078584 +Converged at iteration 31, L1 5.80368e-05, Linf 0.0124192, total time[s] 0.0823 +Converged at iteration 29, L1 7.21924e-05, Linf 0.0148821, total time[s] 0.082559 +Converged at iteration 25, L1 5.18873e-05, Linf 0.00249232, total time[s] 0.080675 +Converged at iteration 37, L1 6.06446e-05, Linf 0.00717173, total time[s] 0.109254 +Converged at iteration 34, L1 7.05155e-05, Linf 0.00524402, total time[s] 0.101112 +Converged at iteration 25, L1 5.7969e-05, Linf 0.00325647, total time[s] 0.067826 +Converged at iteration 25, L1 4.15128e-05, Linf 0.0101621, total time[s] 0.066856 +Converged at iteration 26, L1 6.61297e-05, Linf 0.0164293, total time[s] 0.069143 +Converged at iteration 26, L1 4.45867e-05, Linf 0.0156698, total time[s] 0.074078 +Converged at iteration 21, L1 5.02747e-05, Linf 0.00910514, total time[s] 0.064721 +Converged at iteration 19, L1 6.85185e-05, Linf 0.00475222, total time[s] 0.052566 +Converged at iteration 24, L1 5.79507e-05, Linf 0.00248135, total time[s] 0.064154 +Converged at iteration 23, L1 7.88305e-05, Linf 0.00640277, total time[s] 0.062003 +Converged at iteration 21, L1 4.60197e-05, Linf 0.0024247, total time[s] 0.072774 +Converged at iteration 19, L1 8.86074e-05, Linf 0.00310045, total time[s] 0.055325 +Converged at iteration 31, L1 7.71675e-05, Linf 0.0118443, total time[s] 0.104427 +Converged at iteration 21, L1 9.15147e-05, Linf 0.00516656, total time[s] 0.089048 +Converged at iteration 23, L1 6.65565e-05, Linf 0.00657946, total time[s] 0.078327 +Converged at iteration 27, L1 6.88977e-05, Linf 0.00385578, total time[s] 0.079023 +Converged at iteration 24, L1 6.61737e-05, Linf 0.00463567, total time[s] 0.067127 +Converged at iteration 23, L1 8.35251e-05, Linf 0.00467387, total time[s] 0.074904 +Converged at iteration 25, L1 7.22013e-05, Linf 0.00467896, total time[s] 0.097397 +Converged at iteration 25, L1 7.28262e-05, Linf 0.00624958, total time[s] 0.072752 +Converged at iteration 27, L1 7.0852e-05, Linf 0.00662321, total time[s] 0.080493 +Converged at iteration 32, L1 5.6474e-05, Linf 0.00300481, total time[s] 0.08402 +Converged at iteration 26, L1 9.84802e-05, Linf 0.00304297, total time[s] 0.071766 +Converged at iteration 31, L1 6.96024e-05, Linf 0.00871623, total time[s] 0.09288 +Converged at iteration 31, L1 6.02546e-05, Linf 0.00237441, total time[s] 0.089047 +Converged at iteration 31, L1 9.97192e-05, Linf 0.00388765, total time[s] 0.083388 +Converged at iteration 30, L1 7.10678e-05, Linf 0.00321453, total time[s] 0.079766 +Converged at iteration 31, L1 6.19515e-05, Linf 0.0130921, total time[s] 0.081188 +Converged at iteration 29, L1 7.37376e-05, Linf 0.0153013, total time[s] 0.076936 +Converged at iteration 25, L1 5.21447e-05, Linf 0.00250301, total time[s] 0.067129 +Converged at iteration 37, L1 6.21006e-05, Linf 0.0073357, total time[s] 0.096599 +Converged at iteration 34, L1 7.30998e-05, Linf 0.00574417, total time[s] 0.09725 +Converged at iteration 25, L1 5.77087e-05, Linf 0.00328552, total time[s] 0.079278 +Converged at iteration 25, L1 4.0668e-05, Linf 0.00983036, total time[s] 0.067556 +Converged at iteration 26, L1 6.01819e-05, Linf 0.0159689, total time[s] 0.073105 +Converged at iteration 26, L1 4.31929e-05, Linf 0.0155627, total time[s] 0.068557 +Converged at iteration 21, L1 5.09477e-05, Linf 0.00920431, total time[s] 0.059373 +Converged at iteration 19, L1 6.75424e-05, Linf 0.00474714, total time[s] 0.05877 +Converged at iteration 24, L1 5.64927e-05, Linf 0.00246415, total time[s] 0.074167 +Converged at iteration 23, L1 7.98315e-05, Linf 0.00604945, total time[s] 0.093827 +Converged at iteration 21, L1 4.68779e-05, Linf 0.0024941, total time[s] 0.244278 +Converged at iteration 19, L1 9.15004e-05, Linf 0.00321822, total time[s] 0.074785 +Converged at iteration 31, L1 7.72712e-05, Linf 0.0120223, total time[s] 0.115515 +Converged at iteration 21, L1 9.10706e-05, Linf 0.00523983, total time[s] 0.083966 +Converged at iteration 23, L1 6.93934e-05, Linf 0.00662054, total time[s] 0.069581 +Converged at iteration 27, L1 6.78213e-05, Linf 0.00380852, total time[s] 0.07952 +Converged at iteration 24, L1 6.56072e-05, Linf 0.00458118, total time[s] 0.066096 +Converged at iteration 23, L1 8.36934e-05, Linf 0.0047075, total time[s] 0.077469 +Converged at iteration 25, L1 7.38024e-05, Linf 0.00474089, total time[s] 0.070433 +Converged at iteration 25, L1 7.55074e-05, Linf 0.00513855, total time[s] 0.074406 +Converged at iteration 27, L1 6.99965e-05, Linf 0.00661191, total time[s] 0.076036 +Converged at iteration 32, L1 5.68937e-05, Linf 0.00300177, total time[s] 0.087899 +Converged at iteration 26, L1 9.59651e-05, Linf 0.00293676, total time[s] 0.078639 +Converged at iteration 31, L1 6.96567e-05, Linf 0.00875965, total time[s] 0.086034 +Converged at iteration 31, L1 5.96148e-05, Linf 0.00237094, total time[s] 0.084684 +Converged at iteration 32, L1 4.62689e-05, Linf 0.00204628, total time[s] 0.086489 +Converged at iteration 30, L1 7.2881e-05, Linf 0.00322581, total time[s] 0.078641 +Converged at iteration 31, L1 6.4536e-05, Linf 0.0134778, total time[s] 0.079421 +Converged at iteration 29, L1 7.4427e-05, Linf 0.0164107, total time[s] 0.078243 +Converged at iteration 25, L1 5.23995e-05, Linf 0.0025484, total time[s] 0.065531 +Converged at iteration 37, L1 6.49067e-05, Linf 0.00765083, total time[s] 0.094315 +Converged at iteration 34, L1 7.93148e-05, Linf 0.00621447, total time[s] 0.096934 +Converged at iteration 25, L1 5.90939e-05, Linf 0.00337315, total time[s] 0.066011 +Converged at iteration 25, L1 4.21153e-05, Linf 0.00925859, total time[s] 0.063507 +Converged at iteration 26, L1 5.26491e-05, Linf 0.0148468, total time[s] 0.065702 +Converged at iteration 26, L1 4.22621e-05, Linf 0.0154628, total time[s] 0.06743 +Converged at iteration 21, L1 5.18864e-05, Linf 0.00946645, total time[s] 0.056912 +Converged at iteration 19, L1 6.58823e-05, Linf 0.00462462, total time[s] 0.053739 +Converged at iteration 24, L1 5.60606e-05, Linf 0.00236585, total time[s] 0.068316 +Converged at iteration 23, L1 8.33369e-05, Linf 0.00525475, total time[s] 0.071603 +Converged at iteration 21, L1 4.99349e-05, Linf 0.00263485, total time[s] 0.078234 +Converged at iteration 19, L1 9.82129e-05, Linf 0.00345292, total time[s] 0.059018 +Converged at iteration 31, L1 7.88393e-05, Linf 0.0124166, total time[s] 0.092968 +Converged at iteration 21, L1 9.41205e-05, Linf 0.00538853, total time[s] 0.06525 +Converged at iteration 23, L1 7.53746e-05, Linf 0.00676225, total time[s] 0.068427 +Converged at iteration 27, L1 6.65512e-05, Linf 0.00370837, total time[s] 0.09091 +Converged at iteration 24, L1 6.57535e-05, Linf 0.00455045, total time[s] 0.111112 +Converged at iteration 23, L1 8.61697e-05, Linf 0.00479063, total time[s] 0.075525 +Converged at iteration 25, L1 8.02318e-05, Linf 0.00490083, total time[s] 0.067777 +Converged at iteration 25, L1 8.13198e-05, Linf 0.00529061, total time[s] 0.067085 +Converged at iteration 27, L1 7.04487e-05, Linf 0.00670159, total time[s] 0.071233 +Converged at iteration 32, L1 5.92977e-05, Linf 0.00304618, total time[s] 0.094705 +Converged at iteration 26, L1 9.14965e-05, Linf 0.00272359, total time[s] 0.078244 +Converged at iteration 31, L1 7.08984e-05, Linf 0.00896023, total time[s] 0.08171 +Converged at iteration 31, L1 5.87554e-05, Linf 0.00238757, total time[s] 0.078072 +Converged at iteration 32, L1 4.85386e-05, Linf 0.00219345, total time[s] 0.088199 +Converged at iteration 30, L1 7.35631e-05, Linf 0.00336152, total time[s] 0.091099 +Converged at iteration 31, L1 6.96225e-05, Linf 0.0145566, total time[s] 0.085816 +Converged at iteration 29, L1 7.62338e-05, Linf 0.016088, total time[s] 0.085464 +Converged at iteration 25, L1 5.27766e-05, Linf 0.00242791, total time[s] 0.072531 +Converged at iteration 37, L1 6.64826e-05, Linf 0.00780365, total time[s] 0.141666 +Converged at iteration 34, L1 8.14453e-05, Linf 0.00625533, total time[s] 0.122006 +Converged at iteration 25, L1 6.10638e-05, Linf 0.00338281, total time[s] 0.087494 +Converged at iteration 25, L1 4.20821e-05, Linf 0.00903111, total time[s] 0.066785 +Converged at iteration 26, L1 4.71842e-05, Linf 0.0144284, total time[s] 0.070589 +Converged at iteration 26, L1 4.19391e-05, Linf 0.0155029, total time[s] 0.078256 +Converged at iteration 21, L1 5.18834e-05, Linf 0.00946856, total time[s] 0.082197 +Converged at iteration 19, L1 6.49649e-05, Linf 0.00462527, total time[s] 0.05673 +Converged at iteration 24, L1 5.50299e-05, Linf 0.00232487, total time[s] 0.087283 +Converged at iteration 23, L1 8.50833e-05, Linf 0.00501482, total time[s] 0.118048 +Converged at iteration 21, L1 8.26957e-05, Linf 0.00297349, total time[s] 0.211754 +Converged at iteration 20, L1 4.57982e-05, Linf 0.00216415, total time[s] 0.138494 +Converged at iteration 31, L1 7.90149e-05, Linf 0.0125631, total time[s] 0.10939 +Converged at iteration 21, L1 9.2989e-05, Linf 0.00555564, total time[s] 0.063962 +Converged at iteration 23, L1 7.69419e-05, Linf 0.0067936, total time[s] 0.06355 +Converged at iteration 27, L1 6.58368e-05, Linf 0.00367767, total time[s] 0.085912 +Converged at iteration 24, L1 6.54692e-05, Linf 0.00453942, total time[s] 0.088966 +Converged at iteration 23, L1 8.52423e-05, Linf 0.00482129, total time[s] 0.084773 +Converged at iteration 25, L1 8.23067e-05, Linf 0.00496621, total time[s] 0.091434 +Converged at iteration 25, L1 8.40722e-05, Linf 0.00538015, total time[s] 0.076082 +Converged at iteration 27, L1 7.06304e-05, Linf 0.00703896, total time[s] 0.092467 +Converged at iteration 32, L1 5.90001e-05, Linf 0.00306565, total time[s] 0.096417 +Converged at iteration 26, L1 8.95169e-05, Linf 0.00264067, total time[s] 0.076083 +Converged at iteration 31, L1 7.08604e-05, Linf 0.00898659, total time[s] 0.085794 +Converged at iteration 31, L1 5.83399e-05, Linf 0.00239831, total time[s] 0.095149 +Converged at iteration 32, L1 4.92759e-05, Linf 0.0022434, total time[s] 0.100938 +Converged at iteration 30, L1 7.20844e-05, Linf 0.00339846, total time[s] 0.087639 +Converged at iteration 31, L1 7.20575e-05, Linf 0.0146225, total time[s] 0.082722 +Converged at iteration 29, L1 7.80941e-05, Linf 0.0164225, total time[s] 0.089634 +Converged at iteration 25, L1 5.30965e-05, Linf 0.00243307, total time[s] 0.074747 +Converged at iteration 37, L1 6.91319e-05, Linf 0.00817982, total time[s] 0.108358 +Converged at iteration 34, L1 9.36415e-05, Linf 0.00638937, total time[s] 0.124331 +Converged at iteration 25, L1 6.28197e-05, Linf 0.00343379, total time[s] 0.083938 +Converged at iteration 25, L1 4.50629e-05, Linf 0.00857044, total time[s] 0.069351 +Converged at iteration 26, L1 3.92637e-05, Linf 0.0130695, total time[s] 0.072676 +Converged at iteration 26, L1 4.06182e-05, Linf 0.0148554, total time[s] 0.08845 +Converged at iteration 21, L1 5.16717e-05, Linf 0.00964499, total time[s] 0.075915 +Converged at iteration 19, L1 6.14255e-05, Linf 0.00448529, total time[s] 0.054673 +Converged at iteration 24, L1 5.40121e-05, Linf 0.00228535, total time[s] 0.066751 +Converged at iteration 23, L1 8.96034e-05, Linf 0.00428646, total time[s] 0.062727 +Converged at iteration 21, L1 5.48031e-05, Linf 0.00287008, total time[s] 0.057744 +Converged at iteration 20, L1 4.95803e-05, Linf 0.00229345, total time[s] 0.053918 +Converged at iteration 31, L1 8.13479e-05, Linf 0.0130259, total time[s] 0.084934 +Converged at iteration 21, L1 9.43225e-05, Linf 0.0056219, total time[s] 0.05806 +Converged at iteration 23, L1 8.31437e-05, Linf 0.00700102, total time[s] 0.060767 +Converged at iteration 27, L1 6.37818e-05, Linf 0.00355702, total time[s] 0.069315 +Converged at iteration 24, L1 6.72153e-05, Linf 0.00457448, total time[s] 0.064896 +Converged at iteration 23, L1 8.93402e-05, Linf 0.00559531, total time[s] 0.061984 +Converged at iteration 25, L1 8.77454e-05, Linf 0.00517867, total time[s] 0.073484 +Converged at iteration 25, L1 9.42456e-05, Linf 0.0056904, total time[s] 0.064861 +Converged at iteration 27, L1 7.25954e-05, Linf 0.00713139, total time[s] 0.070495 +Converged at iteration 32, L1 6.06474e-05, Linf 0.00309935, total time[s] 0.081599 +Converged at iteration 26, L1 8.51421e-05, Linf 0.00240115, total time[s] 0.067108 +Converged at iteration 31, L1 7.21641e-05, Linf 0.00913661, total time[s] 0.078776 +Converged at iteration 31, L1 5.83839e-05, Linf 0.00241653, total time[s] 0.079252 +Converged at iteration 32, L1 5.28042e-05, Linf 0.00236055, total time[s] 0.081232 +Converged at iteration 30, L1 6.6658e-05, Linf 0.00361327, total time[s] 0.081246 +Converged at iteration 31, L1 7.92501e-05, Linf 0.0155441, total time[s] 0.079225 +Converged at iteration 29, L1 7.95868e-05, Linf 0.0167007, total time[s] 0.0758 +Converged at iteration 25, L1 5.46672e-05, Linf 0.00239528, total time[s] 0.06737 +Converged at iteration 37, L1 7.05109e-05, Linf 0.00831934, total time[s] 0.094125 +Converged at iteration 34, L1 9.04083e-05, Linf 0.00644393, total time[s] 0.091795 +Converged at iteration 25, L1 6.23517e-05, Linf 0.00344407, total time[s] 0.067474 +Converged at iteration 25, L1 4.54997e-05, Linf 0.00837424, total time[s] 0.065095 +Converged at iteration 26, L1 3.95686e-05, Linf 0.0125755, total time[s] 0.06763 +Converged at iteration 26, L1 4.02576e-05, Linf 0.0147114, total time[s] 0.068481 +Converged at iteration 21, L1 5.18606e-05, Linf 0.00972452, total time[s] 0.057761 +Converged at iteration 19, L1 6.02788e-05, Linf 0.00449108, total time[s] 0.052436 +Converged at iteration 24, L1 5.34935e-05, Linf 0.00225451, total time[s] 0.068564 +Converged at iteration 23, L1 9.02223e-05, Linf 0.00419002, total time[s] 0.066964 +Converged at iteration 21, L1 5.61576e-05, Linf 0.00292264, total time[s] 0.0632 +Converged at iteration 20, L1 5.08812e-05, Linf 0.0023547, total time[s] 0.084333 +Converged at iteration 31, L1 8.15114e-05, Linf 0.0131101, total time[s] 0.091326 +Converged at iteration 21, L1 9.47888e-05, Linf 0.00567598, total time[s] 0.055969 +Converged at iteration 23, L1 8.17934e-05, Linf 0.00708474, total time[s] 0.068885 +Converged at iteration 27, L1 6.32784e-05, Linf 0.00353843, total time[s] 0.07363 +Converged at iteration 24, L1 6.73812e-05, Linf 0.00462692, total time[s] 0.063518 +Converged at iteration 23, L1 8.73106e-05, Linf 0.00490924, total time[s] 0.059786 +Converged at iteration 25, L1 8.89548e-05, Linf 0.00526707, total time[s] 0.065973 +Converged at iteration 25, L1 9.76903e-05, Linf 0.00573715, total time[s] 0.066748 +Converged at iteration 27, L1 7.14078e-05, Linf 0.007097, total time[s] 0.070282 +Converged at iteration 32, L1 6.07982e-05, Linf 0.00311622, total time[s] 0.083298 +Converged at iteration 26, L1 8.36803e-05, Linf 0.00232659, total time[s] 0.06753 +Converged at iteration 31, L1 7.21462e-05, Linf 0.00920918, total time[s] 0.078013 +Converged at iteration 30, L1 9.9912e-05, Linf 0.00348838, total time[s] 0.076388 +Converged at iteration 32, L1 5.26299e-05, Linf 0.00239731, total time[s] 0.080434 +Converged at iteration 30, L1 6.49563e-05, Linf 0.00361065, total time[s] 0.075999 +Converged at iteration 31, L1 8.16437e-05, Linf 0.0158721, total time[s] 0.077763 +Converged at iteration 29, L1 8.07094e-05, Linf 0.0168512, total time[s] 0.07364 +Converged at iteration 25, L1 5.55474e-05, Linf 0.00236801, total time[s] 0.06451 +Converged at iteration 37, L1 7.26079e-05, Linf 0.00866874, total time[s] 0.097766 +Converged at iteration 34, L1 9.76316e-05, Linf 0.00722876, total time[s] 0.094481 +Converged at iteration 25, L1 6.18728e-05, Linf 0.0034833, total time[s] 0.065883 +Converged at iteration 25, L1 4.90741e-05, Linf 0.00809413, total time[s] 0.073778 +Converged at iteration 25, L1 9.85991e-05, Linf 0.0210882, total time[s] 0.064466 +Converged at iteration 26, L1 3.98403e-05, Linf 0.0143681, total time[s] 0.074764 +Converged at iteration 21, L1 5.25847e-05, Linf 0.0100523, total time[s] 0.064158 +Converged at iteration 19, L1 5.78557e-05, Linf 0.00434245, total time[s] 0.052707 +Converged at iteration 24, L1 5.33479e-05, Linf 0.00327405, total time[s] 0.067464 +Converged at iteration 23, L1 9.26122e-05, Linf 0.00373662, total time[s] 0.062415 +Converged at iteration 21, L1 5.92035e-05, Linf 0.00307498, total time[s] 0.058121 +Converged at iteration 20, L1 5.4442e-05, Linf 0.00255884, total time[s] 0.054592 +Converged at iteration 31, L1 8.39062e-05, Linf 0.0135115, total time[s] 0.08882 +Converged at iteration 21, L1 9.59702e-05, Linf 0.00582151, total time[s] 0.059725 +Converged at iteration 23, L1 9.09281e-05, Linf 0.00685801, total time[s] 0.063245 +Converged at iteration 27, L1 6.07866e-05, Linf 0.00343607, total time[s] 0.07169 +Converged at iteration 24, L1 6.76852e-05, Linf 0.0047914, total time[s] 0.062346 +Converged at iteration 23, L1 8.8898e-05, Linf 0.00493858, total time[s] 0.060101 +Converged at iteration 25, L1 9.31713e-05, Linf 0.00545498, total time[s] 0.065177 +Converged at iteration 26, L1 5.7753e-05, Linf 0.00380651, total time[s] 0.066361 +Converged at iteration 27, L1 7.04186e-05, Linf 0.00626476, total time[s] 0.070672 +Converged at iteration 32, L1 6.09041e-05, Linf 0.00313514, total time[s] 0.081109 +Converged at iteration 26, L1 7.91219e-05, Linf 0.00225644, total time[s] 0.066483 +Converged at iteration 31, L1 7.37116e-05, Linf 0.00942096, total time[s] 0.078307 +Converged at iteration 30, L1 9.90514e-05, Linf 0.00350007, total time[s] 0.078516 +Converged at iteration 32, L1 5.46607e-05, Linf 0.00246751, total time[s] 0.093133 +Converged at iteration 30, L1 6.46863e-05, Linf 0.00364333, total time[s] 0.102825 +Converged at iteration 31, L1 8.78659e-05, Linf 0.0167037, total time[s] 0.085607 +Converged at iteration 29, L1 8.37954e-05, Linf 0.0173318, total time[s] 0.088273 +Converged at iteration 25, L1 5.73748e-05, Linf 0.00230569, total time[s] 0.07397 +Converged at iteration 37, L1 7.3707e-05, Linf 0.00880941, total time[s] 0.099978 +Converged at iteration 35, L1 3.46173e-05, Linf 0.00403743, total time[s] 0.101465 +Converged at iteration 25, L1 6.18357e-05, Linf 0.00348817, total time[s] 0.066986 +Converged at iteration 25, L1 4.97071e-05, Linf 0.00793343, total time[s] 0.068438 +Converged at iteration 25, L1 9.39013e-05, Linf 0.0207638, total time[s] 0.06426 +Converged at iteration 26, L1 4.0044e-05, Linf 0.0142274, total time[s] 0.068088 +Converged at iteration 21, L1 5.31883e-05, Linf 0.00991503, total time[s] 0.065288 +Converged at iteration 19, L1 5.65988e-05, Linf 0.00434187, total time[s] 0.053034 +Converged at iteration 24, L1 5.25375e-05, Linf 0.00220943, total time[s] 0.063391 +Converged at iteration 23, L1 9.3984e-05, Linf 0.00355266, total time[s] 0.061485 +Converged at iteration 21, L1 6.071e-05, Linf 0.00314142, total time[s] 0.056034 +Converged at iteration 20, L1 5.57832e-05, Linf 0.00257595, total time[s] 0.056639 +Converged at iteration 31, L1 8.50362e-05, Linf 0.0136205, total time[s] 0.090933 +Converged at iteration 21, L1 9.91645e-05, Linf 0.00577949, total time[s] 0.067961 +Converged at iteration 23, L1 9.30901e-05, Linf 0.00721496, total time[s] 0.067426 +Converged at iteration 27, L1 6.00994e-05, Linf 0.00341894, total time[s] 0.076267 +Converged at iteration 24, L1 6.78332e-05, Linf 0.00484952, total time[s] 0.079975 +Converged at iteration 23, L1 8.95755e-05, Linf 0.00493201, total time[s] 0.074423 +Converged at iteration 25, L1 9.44126e-05, Linf 0.0055234, total time[s] 0.069623 +Converged at iteration 26, L1 6.01959e-05, Linf 0.00398388, total time[s] 0.069125 +Converged at iteration 27, L1 7.07164e-05, Linf 0.00596095, total time[s] 0.069859 +Converged at iteration 32, L1 6.08735e-05, Linf 0.00314438, total time[s] 0.084927 +Converged at iteration 26, L1 7.76273e-05, Linf 0.00230562, total time[s] 0.069284 +Converged at iteration 31, L1 7.43281e-05, Linf 0.00948158, total time[s] 0.080493 +Converged at iteration 31, L1 5.8293e-05, Linf 0.00240168, total time[s] 0.080236 +Converged at iteration 32, L1 5.72078e-05, Linf 0.00260526, total time[s] 0.082096 +Converged at iteration 30, L1 6.49725e-05, Linf 0.00368621, total time[s] 0.080469 +Converged at iteration 31, L1 9.0653e-05, Linf 0.0170408, total time[s] 0.091254 +Converged at iteration 29, L1 8.4479e-05, Linf 0.0174599, total time[s] 0.081258 +Converged at iteration 25, L1 5.7133e-05, Linf 0.00235096, total time[s] 0.082016 +Converged at iteration 37, L1 7.6048e-05, Linf 0.00917657, total time[s] 0.123246 +Converged at iteration 35, L1 3.82542e-05, Linf 0.00428733, total time[s] 0.116083 +Converged at iteration 25, L1 6.22858e-05, Linf 0.00350116, total time[s] 0.065822 +Converged at iteration 25, L1 5.42581e-05, Linf 0.00770998, total time[s] 0.066726 +Converged at iteration 25, L1 8.48742e-05, Linf 0.0195282, total time[s] 0.068176 +Converged at iteration 26, L1 4.01529e-05, Linf 0.0139138, total time[s] 0.075966 +Converged at iteration 21, L1 5.52694e-05, Linf 0.0100443, total time[s] 0.073506 +Converged at iteration 19, L1 5.49001e-05, Linf 0.00419453, total time[s] 0.06164 +Converged at iteration 24, L1 5.17783e-05, Linf 0.0021855, total time[s] 0.096024 +Converged at iteration 23, L1 9.78204e-05, Linf 0.00330701, total time[s] 0.086948 +Converged at iteration 21, L1 6.43074e-05, Linf 0.00326271, total time[s] 0.064988 +Converged at iteration 20, L1 5.9821e-05, Linf 0.00274206, total time[s] 0.077341 +Converged at iteration 31, L1 8.84203e-05, Linf 0.013957, total time[s] 0.102162 +Converged at iteration 21, L1 9.90703e-05, Linf 0.00603599, total time[s] 0.06038 +Converged at iteration 23, L1 9.54547e-05, Linf 0.006931, total time[s] 0.064353 +Converged at iteration 27, L1 5.92022e-05, Linf 0.00333848, total time[s] 0.080186 +Converged at iteration 24, L1 6.87098e-05, Linf 0.00500387, total time[s] 0.076552 +Converged at iteration 23, L1 9.13178e-05, Linf 0.00494935, total time[s] 0.060921 +Converged at iteration 26, L1 4.94917e-05, Linf 0.00324883, total time[s] 0.067991 +Converged at iteration 26, L1 6.58514e-05, Linf 0.0041611, total time[s] 0.068939 +Converged at iteration 27, L1 7.33e-05, Linf 0.00565778, total time[s] 0.071405 +Converged at iteration 32, L1 6.11457e-05, Linf 0.00318126, total time[s] 0.084313 +Converged at iteration 26, L1 7.37201e-05, Linf 0.00242847, total time[s] 0.071098 +Converged at iteration 31, L1 7.44318e-05, Linf 0.00952322, total time[s] 0.083699 +Converged at iteration 30, L1 9.98381e-05, Linf 0.00353548, total time[s] 0.088897 +Converged at iteration 32, L1 5.82621e-05, Linf 0.00259794, total time[s] 0.095254 +Converged at iteration 30, L1 6.77189e-05, Linf 0.0036549, total time[s] 0.095311 +Converged at iteration 31, L1 9.88883e-05, Linf 0.0178986, total time[s] 0.083203 +Converged at iteration 29, L1 8.57456e-05, Linf 0.0180559, total time[s] 0.080604 +Converged at iteration 25, L1 5.7498e-05, Linf 0.00243578, total time[s] 0.068667 +Converged at iteration 37, L1 7.70127e-05, Linf 0.0093224, total time[s] 0.099316 +Converged at iteration 35, L1 3.82451e-05, Linf 0.00437834, total time[s] 0.29231 +Converged at iteration 25, L1 6.23783e-05, Linf 0.00349777, total time[s] 0.147397 +Converged at iteration 25, L1 5.45119e-05, Linf 0.00750735, total time[s] 0.091042 +Converged at iteration 25, L1 8.7069e-05, Linf 0.0190213, total time[s] 0.080035 +Converged at iteration 26, L1 4.12022e-05, Linf 0.0137711, total time[s] 0.066847 +Converged at iteration 21, L1 5.6081e-05, Linf 0.0101017, total time[s] 0.056476 +Converged at iteration 19, L1 5.42951e-05, Linf 0.00419511, total time[s] 0.050579 +Converged at iteration 23, L1 9.90179e-05, Linf 0.00358785, total time[s] 0.060893 +Converged at iteration 24, L1 6.16301e-05, Linf 0.00316001, total time[s] 0.065623 +Converged at iteration 21, L1 6.57168e-05, Linf 0.00332273, total time[s] 0.055938 +Converged at iteration 20, L1 6.39223e-05, Linf 0.00280855, total time[s] 0.052584 +Converged at iteration 31, L1 9.23571e-05, Linf 0.0140618, total time[s] 0.077793 +Converged at iteration 22, L1 5.58653e-05, Linf 0.00335268, total time[s] 0.057696 +Converged at iteration 23, L1 9.60157e-05, Linf 0.00734331, total time[s] 0.059954 +Converged at iteration 27, L1 5.78534e-05, Linf 0.00330799, total time[s] 0.068927 +Converged at iteration 24, L1 6.84345e-05, Linf 0.00510997, total time[s] 0.083821 +Converged at iteration 23, L1 9.16411e-05, Linf 0.00493863, total time[s] 0.06635 +Converged at iteration 26, L1 5.00422e-05, Linf 0.00329873, total time[s] 0.086892 +Converged at iteration 26, L1 6.79688e-05, Linf 0.00424019, total time[s] 0.087303 +Converged at iteration 27, L1 7.33783e-05, Linf 0.00583362, total time[s] 0.07653 +Converged at iteration 32, L1 6.15298e-05, Linf 0.00322072, total time[s] 0.091532 +Converged at iteration 26, L1 7.26617e-05, Linf 0.00246612, total time[s] 0.092771 +Converged at iteration 31, L1 7.35378e-05, Linf 0.00953267, total time[s] 0.085186 +Converged at iteration 30, L1 9.92449e-05, Linf 0.00353587, total time[s] 0.086394 +Converged at iteration 32, L1 6.02673e-05, Linf 0.00262923, total time[s] 0.10303 +Converged at iteration 30, L1 6.82183e-05, Linf 0.00384787, total time[s] 0.0829 +Converged at iteration 32, L1 3.85774e-05, Linf 0.00806105, total time[s] 0.082824 +Converged at iteration 29, L1 8.62116e-05, Linf 0.0179965, total time[s] 0.075869 +Converged at iteration 25, L1 5.73873e-05, Linf 0.00234741, total time[s] 0.067002 +Converged at iteration 37, L1 7.97709e-05, Linf 0.00982404, total time[s] 0.096287 +Converged at iteration 35, L1 4.1872e-05, Linf 0.00484044, total time[s] 0.099709 +Converged at iteration 25, L1 6.56156e-05, Linf 0.00348158, total time[s] 0.06749 +Converged at iteration 25, L1 5.86727e-05, Linf 0.00737031, total time[s] 0.065714 +Converged at iteration 25, L1 6.82498e-05, Linf 0.017199, total time[s] 0.065126 +Converged at iteration 26, L1 4.14457e-05, Linf 0.013491, total time[s] 0.067985 +Converged at iteration 21, L1 5.84201e-05, Linf 0.0102371, total time[s] 0.062374 +Converged at iteration 19, L1 5.0319e-05, Linf 0.00398557, total time[s] 0.05235 +Converged at iteration 23, L1 9.74333e-05, Linf 0.00340829, total time[s] 0.064827 +Converged at iteration 24, L1 6.19768e-05, Linf 0.00242077, total time[s] 0.06531 +Converged at iteration 21, L1 6.98765e-05, Linf 0.00351254, total time[s] 0.058755 +Converged at iteration 20, L1 6.7036e-05, Linf 0.00304114, total time[s] 0.063908 +Converged at iteration 31, L1 9.46901e-05, Linf 0.0144766, total time[s] 0.088337 +Converged at iteration 22, L1 5.74096e-05, Linf 0.00345841, total time[s] 0.062682 +Converged at iteration 23, L1 9.50066e-05, Linf 0.00756126, total time[s] 0.072619 +Converged at iteration 27, L1 5.44647e-05, Linf 0.0031626, total time[s] 0.074806 +Converged at iteration 24, L1 6.89092e-05, Linf 0.00530238, total time[s] 0.062093 +Converged at iteration 23, L1 9.4052e-05, Linf 0.00494844, total time[s] 0.060196 +Converged at iteration 26, L1 5.22059e-05, Linf 0.00346182, total time[s] 0.066566 +Converged at iteration 26, L1 7.76253e-05, Linf 0.00459117, total time[s] 0.069992 +Converged at iteration 27, L1 7.54868e-05, Linf 0.00658407, total time[s] 0.084333 +Converged at iteration 32, L1 6.41334e-05, Linf 0.00333518, total time[s] 0.095613 +Converged at iteration 26, L1 7.01078e-05, Linf 0.00260737, total time[s] 0.071801 +Converged at iteration 31, L1 7.45534e-05, Linf 0.00974839, total time[s] 0.079257 +Converged at iteration 31, L1 5.89242e-05, Linf 0.00243577, total time[s] 0.08071 +Converged at iteration 32, L1 6.29076e-05, Linf 0.00424733, total time[s] 0.082569 +Converged at iteration 30, L1 7.18218e-05, Linf 0.00401702, total time[s] 0.078027 +Converged at iteration 32, L1 4.13013e-05, Linf 0.00869161, total time[s] 0.082907 +Converged at iteration 29, L1 8.90766e-05, Linf 0.0178676, total time[s] 0.076004 +Converged at iteration 25, L1 5.96031e-05, Linf 0.00335522, total time[s] 0.066778 +Converged at iteration 37, L1 8.06446e-05, Linf 0.00995752, total time[s] 0.094985 +Converged at iteration 35, L1 4.27408e-05, Linf 0.00496037, total time[s] 0.093733 +Converged at iteration 25, L1 6.57886e-05, Linf 0.00348015, total time[s] 0.067935 +Converged at iteration 25, L1 5.90536e-05, Linf 0.0072544, total time[s] 0.066527 +Converged at iteration 25, L1 6.53248e-05, Linf 0.0165755, total time[s] 0.066619 +Converged at iteration 26, L1 4.19653e-05, Linf 0.013425, total time[s] 0.070978 +Converged at iteration 21, L1 5.90242e-05, Linf 0.010181, total time[s] 0.070827 +Converged at iteration 19, L1 5.09344e-05, Linf 0.00398653, total time[s] 0.057953 +Converged at iteration 23, L1 9.71097e-05, Linf 0.00335034, total time[s] 0.066438 +Converged at iteration 24, L1 6.30277e-05, Linf 0.00247921, total time[s] 0.065739 +Converged at iteration 21, L1 7.12454e-05, Linf 0.00356139, total time[s] 0.06077 +Converged at iteration 20, L1 6.79799e-05, Linf 0.00310578, total time[s] 0.054858 +Converged at iteration 31, L1 9.62585e-05, Linf 0.0145529, total time[s] 0.084086 +Converged at iteration 22, L1 5.78348e-05, Linf 0.00348467, total time[s] 0.061261 +Converged at iteration 23, L1 9.42911e-05, Linf 0.00757113, total time[s] 0.060711 +Converged at iteration 27, L1 5.40774e-05, Linf 0.00313534, total time[s] 0.072061 +Converged at iteration 24, L1 6.88978e-05, Linf 0.00537392, total time[s] 0.083427 +Converged at iteration 23, L1 9.42686e-05, Linf 0.00493256, total time[s] 0.082201 +Converged at iteration 26, L1 5.27398e-05, Linf 0.00349075, total time[s] 0.070129 +Converged at iteration 26, L1 8.12355e-05, Linf 0.00468151, total time[s] 0.070853 +Converged at iteration 27, L1 7.59902e-05, Linf 0.00611499, total time[s] 0.075907 +Converged at iteration 32, L1 6.47083e-05, Linf 0.00338164, total time[s] 0.085113 +Converged at iteration 26, L1 6.9743e-05, Linf 0.00263101, total time[s] 0.066778 +Converged at iteration 31, L1 7.39606e-05, Linf 0.00968688, total time[s] 0.079007 +Converged at iteration 30, L1 9.90681e-05, Linf 0.00358469, total time[s] 0.077419 +Converged at iteration 32, L1 6.20927e-05, Linf 0.00276412, total time[s] 0.082532 +Converged at iteration 30, L1 7.25639e-05, Linf 0.00414455, total time[s] 0.07779 +Converged at iteration 32, L1 4.21348e-05, Linf 0.00886971, total time[s] 0.082282 +Converged at iteration 29, L1 9.06355e-05, Linf 0.0172824, total time[s] 0.075263 +Converged at iteration 25, L1 5.89771e-05, Linf 0.00279015, total time[s] 0.065072 +Converged at iteration 37, L1 8.25766e-05, Linf 0.010392, total time[s] 0.103552 +Converged at iteration 35, L1 4.56568e-05, Linf 0.00536248, total time[s] 0.09906 +Converged at iteration 25, L1 6.87045e-05, Linf 0.00354856, total time[s] 0.071414 +Converged at iteration 25, L1 6.28301e-05, Linf 0.00717546, total time[s] 0.065729 +Converged at iteration 25, L1 5.83364e-05, Linf 0.0151231, total time[s] 0.06591 +Converged at iteration 26, L1 4.33085e-05, Linf 0.0132866, total time[s] 0.072022 +Converged at iteration 21, L1 6.04003e-05, Linf 0.0103718, total time[s] 0.064808 +Converged at iteration 19, L1 5.12079e-05, Linf 0.00381083, total time[s] 0.055873 +Converged at iteration 23, L1 9.72343e-05, Linf 0.00356921, total time[s] 0.068455 +Converged at iteration 24, L1 6.58754e-05, Linf 0.00265203, total time[s] 0.076569 +Converged at iteration 21, L1 7.57658e-05, Linf 0.00369881, total time[s] 0.069383 +Converged at iteration 20, L1 7.25866e-05, Linf 0.00330145, total time[s] 0.071054 +Converged at iteration 32, L1 3.75841e-05, Linf 0.00847061, total time[s] 0.105426 +Converged at iteration 22, L1 6.06749e-05, Linf 0.00356644, total time[s] 0.061224 +Converged at iteration 23, L1 9.42361e-05, Linf 0.00772757, total time[s] 0.064802 +Converged at iteration 27, L1 5.29998e-05, Linf 0.00301174, total time[s] 0.071963 +Converged at iteration 24, L1 6.72314e-05, Linf 0.00541681, total time[s] 0.066127 +Converged at iteration 23, L1 9.52918e-05, Linf 0.00491085, total time[s] 0.064932 +Converged at iteration 26, L1 5.65244e-05, Linf 0.00363732, total time[s] 0.073234 +Converged at iteration 26, L1 8.82209e-05, Linf 0.00501153, total time[s] 0.07927 +Converged at iteration 27, L1 7.86271e-05, Linf 0.00619676, total time[s] 0.072174 +Converged at iteration 32, L1 6.73838e-05, Linf 0.00350462, total time[s] 0.091018 +Converged at iteration 26, L1 7.00799e-05, Linf 0.00272229, total time[s] 0.079412 +Converged at iteration 31, L1 7.45438e-05, Linf 0.00979766, total time[s] 0.096879 +Converged at iteration 30, L1 9.91122e-05, Linf 0.00361193, total time[s] 0.077506 +Converged at iteration 32, L1 6.57475e-05, Linf 0.00285436, total time[s] 0.085435 +Converged at iteration 30, L1 7.52683e-05, Linf 0.00411376, total time[s] 0.080909 +Converged at iteration 32, L1 4.56817e-05, Linf 0.00949367, total time[s] 0.086665 +Converged at iteration 29, L1 9.05877e-05, Linf 0.0156854, total time[s] 0.073775 +Converged at iteration 25, L1 5.97697e-05, Linf 0.00286772, total time[s] 0.064679 +Converged at iteration 37, L1 8.33192e-05, Linf 0.0107196, total time[s] 0.105996 +Converged at iteration 35, L1 4.6683e-05, Linf 0.00548842, total time[s] 0.098231 +Converged at iteration 25, L1 6.93914e-05, Linf 0.00353474, total time[s] 0.065799 +Converged at iteration 25, L1 6.29634e-05, Linf 0.00708943, total time[s] 0.067986 +Converged at iteration 25, L1 5.63753e-05, Linf 0.0145028, total time[s] 0.064381 +Converged at iteration 26, L1 4.33413e-05, Linf 0.0132531, total time[s] 0.068301 +Converged at iteration 21, L1 6.15502e-05, Linf 0.0105425, total time[s] 0.062366 +Converged at iteration 19, L1 5.33797e-05, Linf 0.00379938, total time[s] 0.061201 +Converged at iteration 23, L1 9.63287e-05, Linf 0.00365445, total time[s] 0.083028 +Converged at iteration 24, L1 6.60465e-05, Linf 0.00268984, total time[s] 0.06749 +Converged at iteration 21, L1 7.76796e-05, Linf 0.00373678, total time[s] 0.059346 +Converged at iteration 20, L1 7.37841e-05, Linf 0.00336604, total time[s] 0.062319 +Converged at iteration 32, L1 3.78205e-05, Linf 0.0084388, total time[s] 0.086349 +Converged at iteration 22, L1 6.28991e-05, Linf 0.00359845, total time[s] 0.062147 +Converged at iteration 23, L1 9.38719e-05, Linf 0.00769527, total time[s] 0.062361 +Converged at iteration 27, L1 5.27351e-05, Linf 0.00299538, total time[s] 0.070183 +Converged at iteration 24, L1 6.65198e-05, Linf 0.00540946, total time[s] 0.062554 +Converged at iteration 23, L1 9.53285e-05, Linf 0.0048827, total time[s] 0.060591 +Converged at iteration 26, L1 5.73555e-05, Linf 0.00368167, total time[s] 0.066728 +Converged at iteration 26, L1 9.11914e-05, Linf 0.00511034, total time[s] 0.068281 +Converged at iteration 27, L1 7.87204e-05, Linf 0.00622349, total time[s] 0.069569 +Converged at iteration 32, L1 6.81293e-05, Linf 0.00356087, total time[s] 0.085733 +Converged at iteration 26, L1 7.04827e-05, Linf 0.00273922, total time[s] 0.081305 +Converged at iteration 31, L1 7.40848e-05, Linf 0.00974815, total time[s] 0.083672 +Converged at iteration 31, L1 5.63634e-05, Linf 0.00244829, total time[s] 0.099389 +Converged at iteration 32, L1 6.66366e-05, Linf 0.00288805, total time[s] 0.087367 +Converged at iteration 30, L1 7.61509e-05, Linf 0.00424305, total time[s] 0.076658 +Converged at iteration 32, L1 4.68504e-05, Linf 0.00959259, total time[s] 0.081331 +Converged at iteration 29, L1 9.05246e-05, Linf 0.0151209, total time[s] 0.074408 +Converged at iteration 25, L1 6.06763e-05, Linf 0.00278399, total time[s] 0.06872 +Converged at iteration 37, L1 8.50732e-05, Linf 0.0104561, total time[s] 0.106808 +Converged at iteration 35, L1 5.09414e-05, Linf 0.00599193, total time[s] 0.103371 +Converged at iteration 25, L1 7.19364e-05, Linf 0.00352807, total time[s] 0.07261 +Converged at iteration 25, L1 6.61575e-05, Linf 0.00696065, total time[s] 0.073825 +Converged at iteration 25, L1 5.21343e-05, Linf 0.0129128, total time[s] 0.067113 +Converged at iteration 26, L1 4.49151e-05, Linf 0.013595, total time[s] 0.075702 +Converged at iteration 21, L1 6.37948e-05, Linf 0.0104964, total time[s] 0.064913 +Converged at iteration 19, L1 6.06582e-05, Linf 0.00354432, total time[s] 0.060539 +Converged at iteration 23, L1 9.5448e-05, Linf 0.00306541, total time[s] 0.09044 +Converged at iteration 24, L1 6.77167e-05, Linf 0.00280157, total time[s] 0.073036 +Converged at iteration 21, L1 8.1713e-05, Linf 0.00389121, total time[s] 0.058328 +Converged at iteration 20, L1 7.8769e-05, Linf 0.00358068, total time[s] 0.061107 +Converged at iteration 32, L1 3.93873e-05, Linf 0.00846304, total time[s] 0.088047 +Converged at iteration 22, L1 6.40876e-05, Linf 0.00369294, total time[s] 0.069763 +Converged at iteration 23, L1 9.49514e-05, Linf 0.00786569, total time[s] 0.067744 +Converged at iteration 27, L1 5.01002e-05, Linf 0.00289331, total time[s] 0.077889 +Converged at iteration 24, L1 6.5695e-05, Linf 0.00525137, total time[s] 0.064608 +Converged at iteration 23, L1 9.681e-05, Linf 0.00485102, total time[s] 0.064219 +Converged at iteration 26, L1 6.10472e-05, Linf 0.00385784, total time[s] 0.084611 +Converged at iteration 27, L1 5.30782e-05, Linf 0.00340516, total time[s] 0.074151 +Converged at iteration 27, L1 7.71067e-05, Linf 0.00629102, total time[s] 0.070685 +Converged at iteration 32, L1 7.17141e-05, Linf 0.00374912, total time[s] 0.085512 +Converged at iteration 26, L1 7.42505e-05, Linf 0.00282786, total time[s] 0.069262 +Converged at iteration 31, L1 7.44144e-05, Linf 0.00992114, total time[s] 0.084567 +Converged at iteration 30, L1 9.78926e-05, Linf 0.0036257, total time[s] 0.077996 +Converged at iteration 32, L1 7.14792e-05, Linf 0.00299476, total time[s] 0.085756 +Converged at iteration 30, L1 7.90948e-05, Linf 0.00472133, total time[s] 0.076562 +Converged at iteration 32, L1 5.16597e-05, Linf 0.0104494, total time[s] 0.095533 +Converged at iteration 29, L1 9.04603e-05, Linf 0.0134693, total time[s] 0.087495 +Converged at iteration 25, L1 6.19138e-05, Linf 0.00279449, total time[s] 0.084756 +Converged at iteration 37, L1 8.55368e-05, Linf 0.0105896, total time[s] 0.106501 +Converged at iteration 35, L1 5.16938e-05, Linf 0.00612211, total time[s] 0.098165 +Converged at iteration 25, L1 7.18963e-05, Linf 0.00351232, total time[s] 0.080227 +Converged at iteration 25, L1 6.63863e-05, Linf 0.00686082, total time[s] 0.071113 +Converged at iteration 25, L1 5.27871e-05, Linf 0.0124661, total time[s] 0.082961 +Converged at iteration 26, L1 4.55068e-05, Linf 0.0132444, total time[s] 0.085002 +Converged at iteration 21, L1 6.42675e-05, Linf 0.0104134, total time[s] 0.06713 +Converged at iteration 19, L1 6.42435e-05, Linf 0.00352838, total time[s] 0.068946 +Converged at iteration 23, L1 9.43698e-05, Linf 0.00303421, total time[s] 0.089652 +Converged at iteration 24, L1 6.8243e-05, Linf 0.00282833, total time[s] 0.084748 +Converged at iteration 21, L1 8.28504e-05, Linf 0.00391633, total time[s] 0.086245 +Converged at iteration 20, L1 8.06194e-05, Linf 0.00364117, total time[s] 0.068466 +Converged at iteration 32, L1 3.98606e-05, Linf 0.00842406, total time[s] 0.111937 +Converged at iteration 22, L1 6.23185e-05, Linf 0.00372052, total time[s] 0.0672 +Converged at iteration 23, L1 9.42889e-05, Linf 0.0079293, total time[s] 0.067025 +Converged at iteration 27, L1 4.96526e-05, Linf 0.00287257, total time[s] 0.078651 +Converged at iteration 24, L1 6.54508e-05, Linf 0.00517221, total time[s] 0.062336 +Converged at iteration 23, L1 9.69692e-05, Linf 0.00483891, total time[s] 0.06957 +Converged at iteration 26, L1 6.58639e-05, Linf 0.00858698, total time[s] 0.070792 +Converged at iteration 27, L1 5.48795e-05, Linf 0.00346902, total time[s] 0.080946 +Converged at iteration 27, L1 7.77874e-05, Linf 0.0063114, total time[s] 0.076467 +Converged at iteration 32, L1 7.25469e-05, Linf 0.00380138, total time[s] 0.08423 +Converged at iteration 26, L1 7.66907e-05, Linf 0.00284252, total time[s] 0.072171 +Converged at iteration 31, L1 7.42578e-05, Linf 0.0099275, total time[s] 0.081247 +Converged at iteration 30, L1 9.79508e-05, Linf 0.00361904, total time[s] 0.077888 +Converged at iteration 32, L1 7.15358e-05, Linf 0.00303388, total time[s] 0.081832 +Converged at iteration 30, L1 7.98616e-05, Linf 0.00457094, total time[s] 0.079961 +Converged at iteration 32, L1 5.32275e-05, Linf 0.0106749, total time[s] 0.082865 +Converged at iteration 29, L1 9.13336e-05, Linf 0.0135587, total time[s] 0.075171 +Converged at iteration 25, L1 6.24821e-05, Linf 0.0028349, total time[s] 0.066042 +Converged at iteration 37, L1 8.70991e-05, Linf 0.0110938, total time[s] 0.098328 +Converged at iteration 35, L1 5.59929e-05, Linf 0.00667856, total time[s] 0.102024 +Converged at iteration 25, L1 7.32668e-05, Linf 0.00346309, total time[s] 0.067498 +Converged at iteration 25, L1 6.9222e-05, Linf 0.00667919, total time[s] 0.066628 +Converged at iteration 25, L1 4.59944e-05, Linf 0.0108703, total time[s] 0.066712 +Converged at iteration 26, L1 4.79867e-05, Linf 0.0134027, total time[s] 0.069281 +Converged at iteration 21, L1 6.56284e-05, Linf 0.0107077, total time[s] 0.065086 +Converged at iteration 19, L1 7.2489e-05, Linf 0.0034279, total time[s] 0.063215 +Converged at iteration 23, L1 9.17064e-05, Linf 0.00295697, total time[s] 0.06586 +Converged at iteration 24, L1 7.20589e-05, Linf 0.0029132, total time[s] 0.075656 +Converged at iteration 21, L1 8.65121e-05, Linf 0.00403314, total time[s] 0.060159 +Converged at iteration 20, L1 8.39027e-05, Linf 0.00385024, total time[s] 0.056119 +Converged at iteration 32, L1 4.13778e-05, Linf 0.00843706, total time[s] 0.08538 +Converged at iteration 22, L1 6.46746e-05, Linf 0.00383872, total time[s] 0.065824 +Converged at iteration 23, L1 9.48707e-05, Linf 0.00800773, total time[s] 0.062304 +Converged at iteration 27, L1 4.82178e-05, Linf 0.00279072, total time[s] 0.072929 +Converged at iteration 24, L1 6.17023e-05, Linf 0.00484919, total time[s] 0.063764 +Converged at iteration 23, L1 9.7396e-05, Linf 0.00479105, total time[s] 0.060386 +Converged at iteration 26, L1 6.85339e-05, Linf 0.00410093, total time[s] 0.066666 +Converged at iteration 27, L1 6.33217e-05, Linf 0.00374216, total time[s] 0.068889 +Converged at iteration 27, L1 7.76528e-05, Linf 0.00637523, total time[s] 0.071479 +Converged at iteration 32, L1 7.5191e-05, Linf 0.00403002, total time[s] 0.081752 +Converged at iteration 26, L1 8.38506e-05, Linf 0.00293966, total time[s] 0.067715 +Converged at iteration 31, L1 7.54403e-05, Linf 0.0099621, total time[s] 0.079989 +Converged at iteration 30, L1 9.99865e-05, Linf 0.00363544, total time[s] 0.07778 +Converged at iteration 32, L1 7.64233e-05, Linf 0.00324123, total time[s] 0.081067 +Converged at iteration 30, L1 8.34524e-05, Linf 0.00493482, total time[s] 0.076831 +Converged at iteration 32, L1 5.82695e-05, Linf 0.0115262, total time[s] 0.081331 +Converged at iteration 29, L1 9.28707e-05, Linf 0.0142926, total time[s] 0.074864 +Converged at iteration 25, L1 6.45029e-05, Linf 0.00293474, total time[s] 0.065143 +Converged at iteration 37, L1 8.74244e-05, Linf 0.0112282, total time[s] 0.09851 +Converged at iteration 35, L1 5.70075e-05, Linf 0.0068039, total time[s] 0.096024 +Converged at iteration 25, L1 7.32844e-05, Linf 0.00343632, total time[s] 0.067379 +Converged at iteration 25, L1 7.0919e-05, Linf 0.0101611, total time[s] 0.065004 +Converged at iteration 25, L1 4.5458e-05, Linf 0.0105084, total time[s] 0.066185 +Converged at iteration 26, L1 4.8821e-05, Linf 0.0134515, total time[s] 0.067994 +Converged at iteration 21, L1 6.59319e-05, Linf 0.0106043, total time[s] 0.057134 +Converged at iteration 19, L1 7.55466e-05, Linf 0.00343415, total time[s] 0.052886 +Converged at iteration 23, L1 9.14348e-05, Linf 0.00289607, total time[s] 0.079898 +Converged at iteration 24, L1 7.22872e-05, Linf 0.00290373, total time[s] 0.064042 +Converged at iteration 21, L1 8.75435e-05, Linf 0.00407963, total time[s] 0.069173 +Converged at iteration 20, L1 8.50801e-05, Linf 0.00390398, total time[s] 0.055974 +Converged at iteration 32, L1 4.18779e-05, Linf 0.00842867, total time[s] 0.088177 +Converged at iteration 22, L1 6.30764e-05, Linf 0.00386974, total time[s] 0.059414 +Converged at iteration 23, L1 9.46789e-05, Linf 0.00805986, total time[s] 0.06141 +Converged at iteration 27, L1 4.84259e-05, Linf 0.00278435, total time[s] 0.070677 +Converged at iteration 24, L1 6.13895e-05, Linf 0.00475023, total time[s] 0.064331 +Converged at iteration 23, L1 9.63523e-05, Linf 0.00476525, total time[s] 0.061291 +Converged at iteration 26, L1 6.95048e-05, Linf 0.00414844, total time[s] 0.068104 +Converged at iteration 27, L1 6.44506e-05, Linf 0.00380914, total time[s] 0.070276 +Converged at iteration 27, L1 7.82461e-05, Linf 0.00639213, total time[s] 0.075861 +Converged at iteration 32, L1 7.57347e-05, Linf 0.00408164, total time[s] 0.083861 +Converged at iteration 26, L1 8.60742e-05, Linf 0.00295635, total time[s] 0.069812 +Converged at iteration 31, L1 7.51904e-05, Linf 0.0100307, total time[s] 0.08087 +Converged at iteration 31, L1 5.52065e-05, Linf 0.00243168, total time[s] 0.081331 +Converged at iteration 32, L1 7.72877e-05, Linf 0.00329348, total time[s] 0.083521 +Converged at iteration 30, L1 8.38092e-05, Linf 0.00505332, total time[s] 0.079062 +Converged at iteration 32, L1 5.91587e-05, Linf 0.0117775, total time[s] 0.083494 +Converged at iteration 29, L1 9.22707e-05, Linf 0.0141046, total time[s] 0.076896 +Converged at iteration 25, L1 6.48753e-05, Linf 0.00292877, total time[s] 0.068563 +Converged at iteration 37, L1 8.86009e-05, Linf 0.0109338, total time[s] 0.096689 +Converged at iteration 35, L1 6.12998e-05, Linf 0.007339, total time[s] 0.127091 +Converged at iteration 25, L1 7.41995e-05, Linf 0.00338484, total time[s] 0.075708 +Converged at iteration 25, L1 7.21516e-05, Linf 0.00644061, total time[s] 0.06597 +Converged at iteration 25, L1 4.30341e-05, Linf 0.00926925, total time[s] 0.06431 +Converged at iteration 26, L1 5.09804e-05, Linf 0.0135866, total time[s] 0.079636 +Converged at iteration 21, L1 6.73074e-05, Linf 0.0106829, total time[s] 0.058666 +Converged at iteration 19, L1 8.20729e-05, Linf 0.00326846, total time[s] 0.055411 +Converged at iteration 23, L1 8.90193e-05, Linf 0.00289503, total time[s] 0.061343 +Converged at iteration 24, L1 7.39673e-05, Linf 0.002945, total time[s] 0.06475 +Converged at iteration 21, L1 9.07816e-05, Linf 0.00415772, total time[s] 0.058217 +Converged at iteration 20, L1 8.93391e-05, Linf 0.00408692, total time[s] 0.053866 +Converged at iteration 32, L1 4.46375e-05, Linf 0.00844182, total time[s] 0.090809 +Converged at iteration 22, L1 6.4561e-05, Linf 0.00399326, total time[s] 0.074939 +Converged at iteration 23, L1 9.53872e-05, Linf 0.00758208, total time[s] 0.063228 +Converged at iteration 27, L1 4.82549e-05, Linf 0.00271592, total time[s] 0.07095 +Converged at iteration 24, L1 6.10662e-05, Linf 0.00443741, total time[s] 0.06855 +Converged at iteration 23, L1 9.4455e-05, Linf 0.00469247, total time[s] 0.060008 +Converged at iteration 26, L1 7.28662e-05, Linf 0.00434933, total time[s] 0.067287 +Converged at iteration 27, L1 6.99138e-05, Linf 0.00408332, total time[s] 0.074834 +Converged at iteration 27, L1 7.89923e-05, Linf 0.00640573, total time[s] 0.068973 +Converged at iteration 32, L1 7.78656e-05, Linf 0.00425479, total time[s] 0.07992 +Converged at iteration 26, L1 9.76537e-05, Linf 0.00305916, total time[s] 0.066254 +Converged at iteration 31, L1 7.54038e-05, Linf 0.0101069, total time[s] 0.078029 +Converged at iteration 31, L1 5.68235e-05, Linf 0.00244265, total time[s] 0.077561 +Converged at iteration 32, L1 8.35298e-05, Linf 0.00352806, total time[s] 0.080579 +Converged at iteration 30, L1 8.77943e-05, Linf 0.00553466, total time[s] 0.075832 +Converged at iteration 32, L1 6.38931e-05, Linf 0.0126889, total time[s] 0.079875 +Converged at iteration 29, L1 9.27623e-05, Linf 0.0141829, total time[s] 0.073341 +Converged at iteration 25, L1 6.59137e-05, Linf 0.00314627, total time[s] 0.063669 +Converged at iteration 37, L1 8.91529e-05, Linf 0.0110709, total time[s] 0.09553 +Converged at iteration 35, L1 6.22954e-05, Linf 0.00747514, total time[s] 0.094448 +Converged at iteration 25, L1 7.42157e-05, Linf 0.00336221, total time[s] 0.066653 +Converged at iteration 25, L1 7.19377e-05, Linf 0.00635342, total time[s] 0.064108 +Converged at iteration 25, L1 4.2633e-05, Linf 0.00897991, total time[s] 0.064104 +Converged at iteration 26, L1 5.19156e-05, Linf 0.0138535, total time[s] 0.066449 +Converged at iteration 21, L1 6.9113e-05, Linf 0.0107154, total time[s] 0.061702 +Converged at iteration 19, L1 8.49647e-05, Linf 0.00326566, total time[s] 0.051028 +Converged at iteration 23, L1 8.85239e-05, Linf 0.00287747, total time[s] 0.071878 +Converged at iteration 24, L1 7.44239e-05, Linf 0.00297321, total time[s] 0.0679 +Converged at iteration 21, L1 9.20469e-05, Linf 0.00419698, total time[s] 0.05698 +Converged at iteration 20, L1 9.04839e-05, Linf 0.00414323, total time[s] 0.062413 +Converged at iteration 32, L1 4.49039e-05, Linf 0.00843757, total time[s] 0.092333 +Converged at iteration 22, L1 6.50384e-05, Linf 0.00402278, total time[s] 0.061923 +Converged at iteration 23, L1 9.71875e-05, Linf 0.00848245, total time[s] 0.063566 +Converged at iteration 27, L1 4.81839e-05, Linf 0.00270729, total time[s] 0.074604 +Converged at iteration 24, L1 6.03262e-05, Linf 0.0043397, total time[s] 0.062061 +Converged at iteration 23, L1 9.32053e-05, Linf 0.00466666, total time[s] 0.062815 +Converged at iteration 26, L1 7.39823e-05, Linf 0.00439455, total time[s] 0.066339 +Converged at iteration 27, L1 7.19844e-05, Linf 0.00416178, total time[s] 0.068382 +Converged at iteration 27, L1 7.93591e-05, Linf 0.00643728, total time[s] 0.06925 +Converged at iteration 32, L1 7.82681e-05, Linf 0.00429626, total time[s] 0.079827 +Converged at iteration 27, L1 6.28204e-05, Linf 0.00201491, total time[s] 0.069996 +Converged at iteration 31, L1 7.52856e-05, Linf 0.0101062, total time[s] 0.077751 +Converged at iteration 31, L1 5.73189e-05, Linf 0.00243273, total time[s] 0.078256 +Converged at iteration 32, L1 8.50845e-05, Linf 0.00359515, total time[s] 0.080104 +Converged at iteration 30, L1 8.88722e-05, Linf 0.0056685, total time[s] 0.076085 +Converged at iteration 32, L1 6.53938e-05, Linf 0.0129422, total time[s] 0.082193 +Converged at iteration 29, L1 9.25331e-05, Linf 0.0142283, total time[s] 0.095506 +Converged at iteration 25, L1 6.62852e-05, Linf 0.00313665, total time[s] 0.067603 +Converged at iteration 37, L1 9.12669e-05, Linf 0.0114201, total time[s] 0.109048 +Converged at iteration 35, L1 6.70997e-05, Linf 0.00808885, total time[s] 0.119107 +Converged at iteration 25, L1 7.53373e-05, Linf 0.00331333, total time[s] 0.076768 +Converged at iteration 25, L1 7.50804e-05, Linf 0.00628655, total time[s] 0.065964 +Converged at iteration 25, L1 4.14536e-05, Linf 0.00795488, total time[s] 0.064929 +Converged at iteration 26, L1 5.57239e-05, Linf 0.0142721, total time[s] 0.072665 +Converged at iteration 21, L1 6.63937e-05, Linf 0.0109694, total time[s] 0.05603 +Converged at iteration 19, L1 9.1927e-05, Linf 0.00347362, total time[s] 0.054721 +Converged at iteration 23, L1 8.70972e-05, Linf 0.00293992, total time[s] 0.063232 +Converged at iteration 24, L1 7.66665e-05, Linf 0.00306526, total time[s] 0.065316 +Converged at iteration 21, L1 9.55208e-05, Linf 0.00432935, total time[s] 0.110634 +Converged at iteration 20, L1 9.53972e-05, Linf 0.00433578, total time[s] 0.060856 +Converged at iteration 32, L1 4.65771e-05, Linf 0.00843962, total time[s] 0.094212 +Converged at iteration 22, L1 6.68874e-05, Linf 0.00414936, total time[s] 0.061893 +Converged at iteration 23, L1 9.708e-05, Linf 0.00806712, total time[s] 0.062175 +Converged at iteration 27, L1 4.6457e-05, Linf 0.00262187, total time[s] 0.070736 +Converged at iteration 24, L1 5.76846e-05, Linf 0.0040912, total time[s] 0.065389 +Converged at iteration 23, L1 8.85591e-05, Linf 0.00453022, total time[s] 0.068017 +Converged at iteration 26, L1 7.82787e-05, Linf 0.00458821, total time[s] 0.069648 +Converged at iteration 27, L1 7.84181e-05, Linf 0.00447708, total time[s] 0.088487 +Converged at iteration 27, L1 8.11643e-05, Linf 0.00647639, total time[s] 0.096796 +Converged at iteration 32, L1 8.10672e-05, Linf 0.00445956, total time[s] 0.094557 +Converged at iteration 27, L1 6.90047e-05, Linf 0.00204773, total time[s] 0.081972 +Converged at iteration 31, L1 7.70352e-05, Linf 0.0101079, total time[s] 0.081224 +Converged at iteration 31, L1 5.60164e-05, Linf 0.00238506, total time[s] 0.090342 +Converged at iteration 32, L1 9.30603e-05, Linf 0.00390918, total time[s] 0.081469 +Converged at iteration 30, L1 9.48971e-05, Linf 0.00622094, total time[s] 0.076955 +Converged at iteration 32, L1 7.15365e-05, Linf 0.0138402, total time[s] 0.082932 +Converged at iteration 29, L1 9.22675e-05, Linf 0.0147465, total time[s] 0.07486 +Converged at iteration 25, L1 6.72585e-05, Linf 0.00309681, total time[s] 0.067611 +Converged at iteration 37, L1 9.25979e-05, Linf 0.011598, total time[s] 0.095567 +Converged at iteration 35, L1 6.84868e-05, Linf 0.00824125, total time[s] 0.122651 +Converged at iteration 25, L1 7.47804e-05, Linf 0.00329598, total time[s] 0.071665 +Converged at iteration 25, L1 7.5576e-05, Linf 0.00625021, total time[s] 0.069124 +Converged at iteration 25, L1 4.12637e-05, Linf 0.00774461, total time[s] 0.081136 +Converged at iteration 26, L1 5.66721e-05, Linf 0.0144067, total time[s] 0.073892 +Converged at iteration 21, L1 6.58004e-05, Linf 0.0108172, total time[s] 0.058315 +Converged at iteration 19, L1 9.4135e-05, Linf 0.00350427, total time[s] 0.057859 +Converged at iteration 23, L1 8.65427e-05, Linf 0.00294454, total time[s] 0.063808 +Converged at iteration 24, L1 7.78976e-05, Linf 0.00309182, total time[s] 0.065281 +Converged at iteration 21, L1 9.64089e-05, Linf 0.00437583, total time[s] 0.061021 +Converged at iteration 20, L1 9.74426e-05, Linf 0.00438765, total time[s] 0.068595 +Converged at iteration 32, L1 4.68617e-05, Linf 0.00829816, total time[s] 0.086149 +Converged at iteration 22, L1 6.85033e-05, Linf 0.00417887, total time[s] 0.057088 +Converged at iteration 23, L1 9.8081e-05, Linf 0.00864776, total time[s] 0.068925 +Converged at iteration 27, L1 4.71822e-05, Linf 0.00260441, total time[s] 0.071575 +Converged at iteration 24, L1 5.70347e-05, Linf 0.0040122, total time[s] 0.065347 +Converged at iteration 23, L1 8.7877e-05, Linf 0.00448216, total time[s] 0.061968 +Converged at iteration 26, L1 7.86435e-05, Linf 0.00463501, total time[s] 0.066407 +Converged at iteration 27, L1 8.07819e-05, Linf 0.00456178, total time[s] 0.069143 +Converged at iteration 27, L1 8.16214e-05, Linf 0.00643667, total time[s] 0.070603 +Converged at iteration 32, L1 8.15014e-05, Linf 0.00449182, total time[s] 0.089802 +Converged at iteration 27, L1 7.02929e-05, Linf 0.00206545, total time[s] 0.073426 +Converged at iteration 31, L1 7.57822e-05, Linf 0.010183, total time[s] 0.085049 +Converged at iteration 31, L1 5.56307e-05, Linf 0.00241755, total time[s] 0.084708 +Converged at iteration 32, L1 9.43729e-05, Linf 0.00396479, total time[s] 0.097591 +Converged at iteration 30, L1 9.65038e-05, Linf 0.00622801, total time[s] 0.082067 +Converged at iteration 32, L1 7.29739e-05, Linf 0.0142952, total time[s] 0.095726 +Converged at iteration 29, L1 9.28949e-05, Linf 0.0145396, total time[s] 0.082222 +Converged at iteration 25, L1 6.74759e-05, Linf 0.00310686, total time[s] 0.158761 +Converged at iteration 37, L1 9.49515e-05, Linf 0.0120608, total time[s] 0.144929 +Converged at iteration 35, L1 7.31499e-05, Linf 0.00884399, total time[s] 0.09813 +Converged at iteration 25, L1 7.48544e-05, Linf 0.00322728, total time[s] 0.066606 +Converged at iteration 25, L1 7.97881e-05, Linf 0.00624015, total time[s] 0.065715 +Converged at iteration 25, L1 4.14098e-05, Linf 0.00705742, total time[s] 0.069518 +Converged at iteration 26, L1 6.08882e-05, Linf 0.0149872, total time[s] 0.075388 +Converged at iteration 21, L1 6.52531e-05, Linf 0.0108887, total time[s] 0.055922 +Converged at iteration 19, L1 9.87518e-05, Linf 0.00373788, total time[s] 0.054392 +Converged at iteration 23, L1 8.60638e-05, Linf 0.00298719, total time[s] 0.062069 +Converged at iteration 24, L1 8.01896e-05, Linf 0.00314092, total time[s] 0.065595 +Converged at iteration 21, L1 9.9815e-05, Linf 0.00451335, total time[s] 0.056191 +Converged at iteration 21, L1 4.75267e-05, Linf 0.00231909, total time[s] 0.059259 +Converged at iteration 32, L1 4.89652e-05, Linf 0.0084485, total time[s] 0.096367 +Converged at iteration 22, L1 6.98554e-05, Linf 0.00431955, total time[s] 0.066973 +Converged at iteration 23, L1 9.85718e-05, Linf 0.00876034, total time[s] 0.065827 +Converged at iteration 26, L1 9.86893e-05, Linf 0.00531244, total time[s] 0.077486 +Converged at iteration 24, L1 5.5351e-05, Linf 0.00374237, total time[s] 0.067048 +Converged at iteration 23, L1 8.77965e-05, Linf 0.0043755, total time[s] 0.063453 +Converged at iteration 26, L1 8.21004e-05, Linf 0.00482232, total time[s] 0.067618 +Converged at iteration 27, L1 8.95926e-05, Linf 0.00485992, total time[s] 0.072857 +Converged at iteration 27, L1 8.29302e-05, Linf 0.00648297, total time[s] 0.069937 +Converged at iteration 32, L1 8.49629e-05, Linf 0.00483933, total time[s] 0.08245 +Converged at iteration 27, L1 7.6059e-05, Linf 0.00220142, total time[s] 0.070142 +Converged at iteration 31, L1 7.62648e-05, Linf 0.0102598, total time[s] 0.081451 +Converged at iteration 31, L1 5.64957e-05, Linf 0.00243941, total time[s] 0.088827 +Converged at iteration 33, L1 4.31722e-05, Linf 0.00203545, total time[s] 0.090775 +Converged at iteration 31, L1 4.30364e-05, Linf 0.00660978, total time[s] 0.08325 +Converged at iteration 32, L1 7.96085e-05, Linf 0.0154102, total time[s] 0.086312 +Converged at iteration 29, L1 9.57415e-05, Linf 0.0147616, total time[s] 0.074707 +Converged at iteration 25, L1 6.84783e-05, Linf 0.00316329, total time[s] 0.068748 +Converged at iteration 37, L1 9.43115e-05, Linf 0.0121376, total time[s] 0.103088 +Converged at iteration 35, L1 7.42035e-05, Linf 0.00899503, total time[s] 0.092847 +Converged at iteration 25, L1 7.46442e-05, Linf 0.00320055, total time[s] 0.066156 +Converged at iteration 25, L1 8.10768e-05, Linf 0.0062089, total time[s] 0.065279 +Converged at iteration 25, L1 4.20564e-05, Linf 0.0069116, total time[s] 0.064985 +Converged at iteration 26, L1 6.24713e-05, Linf 0.0151482, total time[s] 0.068258 +Converged at iteration 21, L1 6.51188e-05, Linf 0.0109144, total time[s] 0.0554 +Converged at iteration 20, L1 5.15155e-05, Linf 0.00217487, total time[s] 0.065143 +Converged at iteration 23, L1 8.60507e-05, Linf 0.00298389, total time[s] 0.062047 +Converged at iteration 24, L1 8.10129e-05, Linf 0.0031399, total time[s] 0.063034 +Converged at iteration 22, L1 5.30099e-05, Linf 0.00241822, total time[s] 0.058376 +Converged at iteration 21, L1 4.8379e-05, Linf 0.0023506, total time[s] 0.05652 +Converged at iteration 32, L1 4.94532e-05, Linf 0.00831208, total time[s] 0.082029 +Converged at iteration 22, L1 7.02751e-05, Linf 0.0042699, total time[s] 0.057932 +Converged at iteration 23, L1 9.85138e-05, Linf 0.00956218, total time[s] 0.060994 +Converged at iteration 26, L1 9.88746e-05, Linf 0.00530558, total time[s] 0.067646 +Converged at iteration 24, L1 5.5113e-05, Linf 0.00367798, total time[s] 0.063239 +Converged at iteration 23, L1 8.74074e-05, Linf 0.0043345, total time[s] 0.064172 +Converged at iteration 26, L1 8.41524e-05, Linf 0.00488408, total time[s] 0.07406 +Converged at iteration 27, L1 9.21121e-05, Linf 0.00499038, total time[s] 0.082037 +Converged at iteration 27, L1 8.33933e-05, Linf 0.00649527, total time[s] 0.07067 +Converged at iteration 32, L1 8.62056e-05, Linf 0.004928, total time[s] 0.08188 +Converged at iteration 27, L1 7.74404e-05, Linf 0.00216376, total time[s] 0.070144 +Converged at iteration 31, L1 7.61466e-05, Linf 0.0102632, total time[s] 0.079785 +Converged at iteration 31, L1 5.71065e-05, Linf 0.00244425, total time[s] 0.081881 +Converged at iteration 33, L1 4.28104e-05, Linf 0.0020771, total time[s] 0.084997 +Converged at iteration 31, L1 4.28664e-05, Linf 0.00481815, total time[s] 0.079604 +Converged at iteration 32, L1 8.12392e-05, Linf 0.0157105, total time[s] 0.081766 +Converged at iteration 29, L1 9.31618e-05, Linf 0.0147932, total time[s] 0.074903 +Converged at iteration 25, L1 6.87477e-05, Linf 0.00318221, total time[s] 0.079057 +Converged at iteration 37, L1 9.61362e-05, Linf 0.012477, total time[s] 0.114391 +Converged at iteration 35, L1 7.93482e-05, Linf 0.00965086, total time[s] 0.089181 +Converged at iteration 25, L1 7.42428e-05, Linf 0.00312458, total time[s] 0.065804 +Converged at iteration 25, L1 8.63013e-05, Linf 0.00627471, total time[s] 0.06601 +Converged at iteration 24, L1 9.59784e-05, Linf 0.0151502, total time[s] 0.064537 +Converged at iteration 26, L1 6.67899e-05, Linf 0.0159101, total time[s] 0.067349 +Converged at iteration 21, L1 6.54052e-05, Linf 0.0110034, total time[s] 0.056685 +Converged at iteration 20, L1 5.47758e-05, Linf 0.00225085, total time[s] 0.054638 +Converged at iteration 23, L1 8.42507e-05, Linf 0.00298142, total time[s] 0.062364 +Converged at iteration 24, L1 8.27168e-05, Linf 0.00313659, total time[s] 0.063515 +Converged at iteration 22, L1 5.46446e-05, Linf 0.00241864, total time[s] 0.058249 +Converged at iteration 21, L1 5.12815e-05, Linf 0.00245392, total time[s] 0.056192 +Converged at iteration 32, L1 5.20482e-05, Linf 0.00846675, total time[s] 0.081096 +Converged at iteration 22, L1 7.26752e-05, Linf 0.0045107, total time[s] 0.057374 +Converged at iteration 23, L1 9.98148e-05, Linf 0.00583512, total time[s] 0.060275 +Converged at iteration 26, L1 9.56658e-05, Linf 0.00516368, total time[s] 0.066788 +Converged at iteration 24, L1 5.30444e-05, Linf 0.00372995, total time[s] 0.06207 +Converged at iteration 23, L1 8.62699e-05, Linf 0.00425462, total time[s] 0.059665 +Converged at iteration 26, L1 8.79598e-05, Linf 0.00510123, total time[s] 0.06711 +Converged at iteration 28, L1 5.36788e-05, Linf 0.00315558, total time[s] 0.071488 +Converged at iteration 27, L1 8.51712e-05, Linf 0.00657684, total time[s] 0.06891 +Converged at iteration 32, L1 8.78867e-05, Linf 0.0050551, total time[s] 0.081642 +Converged at iteration 27, L1 8.46666e-05, Linf 0.00226459, total time[s] 0.068874 +Converged at iteration 31, L1 7.91308e-05, Linf 0.0103903, total time[s] 0.078342 +Converged at iteration 31, L1 5.88773e-05, Linf 0.00243817, total time[s] 0.078774 +Converged at iteration 33, L1 5.05061e-05, Linf 0.00570386, total time[s] 0.082579 +Converged at iteration 31, L1 4.6067e-05, Linf 0.00517785, total time[s] 0.078253 +Converged at iteration 32, L1 8.91954e-05, Linf 0.0170114, total time[s] 0.080423 +Converged at iteration 29, L1 9.51543e-05, Linf 0.0149891, total time[s] 0.073291 +Converged at iteration 25, L1 6.91523e-05, Linf 0.00325029, total time[s] 0.065475 +Converged at iteration 37, L1 9.65761e-05, Linf 0.0125541, total time[s] 0.103327 +Converged at iteration 35, L1 8.05241e-05, Linf 0.00980445, total time[s] 0.093664 +Converged at iteration 25, L1 7.37913e-05, Linf 0.00308852, total time[s] 0.064463 +Converged at iteration 25, L1 8.7401e-05, Linf 0.00626699, total time[s] 0.0933 +Converged at iteration 24, L1 9.54582e-05, Linf 0.0148615, total time[s] 0.069001 +Converged at iteration 26, L1 6.7986e-05, Linf 0.0161008, total time[s] 0.066576 +Converged at iteration 21, L1 6.45218e-05, Linf 0.0110397, total time[s] 0.056044 +Converged at iteration 20, L1 5.63293e-05, Linf 0.00226295, total time[s] 0.053295 +Converged at iteration 23, L1 8.41738e-05, Linf 0.00299984, total time[s] 0.06368 +Converged at iteration 24, L1 8.34278e-05, Linf 0.00313294, total time[s] 0.062954 +Converged at iteration 22, L1 5.50417e-05, Linf 0.0024323, total time[s] 0.058237 +Converged at iteration 21, L1 5.13059e-05, Linf 0.00248552, total time[s] 0.055328 +Converged at iteration 32, L1 5.25716e-05, Linf 0.00833341, total time[s] 0.080584 +Converged at iteration 22, L1 7.52361e-05, Linf 0.00712437, total time[s] 0.059211 +Converged at iteration 23, L1 9.99381e-05, Linf 0.00632493, total time[s] 0.066601 +Converged at iteration 26, L1 9.54697e-05, Linf 0.00512393, total time[s] 0.066625 +Converged at iteration 24, L1 5.25101e-05, Linf 0.00370204, total time[s] 0.062448 +Converged at iteration 23, L1 8.60966e-05, Linf 0.00423055, total time[s] 0.059689 +Converged at iteration 26, L1 8.93933e-05, Linf 0.00513244, total time[s] 0.071338 +Converged at iteration 28, L1 5.45141e-05, Linf 0.00329347, total time[s] 0.077324 +Converged at iteration 27, L1 8.54007e-05, Linf 0.0066188, total time[s] 0.072471 +Converged at iteration 32, L1 8.83728e-05, Linf 0.00508377, total time[s] 0.080292 +Converged at iteration 27, L1 8.60245e-05, Linf 0.00225975, total time[s] 0.071368 +Converged at iteration 31, L1 7.65144e-05, Linf 0.0102698, total time[s] 0.078382 +Converged at iteration 31, L1 5.72217e-05, Linf 0.00246283, total time[s] 0.078702 +Converged at iteration 33, L1 4.72639e-05, Linf 0.00229431, total time[s] 0.082623 +Converged at iteration 31, L1 4.71877e-05, Linf 0.00529537, total time[s] 0.078331 +Converged at iteration 32, L1 9.1347e-05, Linf 0.0173351, total time[s] 0.081339 +Converged at iteration 29, L1 9.34062e-05, Linf 0.0150114, total time[s] 0.073483 +Converged at iteration 25, L1 6.88151e-05, Linf 0.00324907, total time[s] 0.064699 +Converged at iteration 37, L1 9.81983e-05, Linf 0.0128731, total time[s] 0.096031 +Converged at iteration 35, L1 8.54319e-05, Linf 0.0104573, total time[s] 0.09296 +Converged at iteration 25, L1 7.27995e-05, Linf 0.0030275, total time[s] 0.064628 +Converged at iteration 25, L1 9.40081e-05, Linf 0.0064156, total time[s] 0.065245 +Converged at iteration 24, L1 9.33522e-05, Linf 0.0137833, total time[s] 0.062137 +Converged at iteration 26, L1 7.33305e-05, Linf 0.0169757, total time[s] 0.066825 +Converged at iteration 21, L1 6.44616e-05, Linf 0.0111275, total time[s] 0.055393 +Converged at iteration 20, L1 5.88786e-05, Linf 0.00238634, total time[s] 0.05265 +Converged at iteration 23, L1 8.20376e-05, Linf 0.0029661, total time[s] 0.060059 +Converged at iteration 24, L1 8.58726e-05, Linf 0.00310872, total time[s] 0.067043 +Converged at iteration 22, L1 5.60984e-05, Linf 0.00245041, total time[s] 0.059268 +Converged at iteration 21, L1 5.3576e-05, Linf 0.00257905, total time[s] 0.056517 +Converged at iteration 32, L1 5.54557e-05, Linf 0.00849648, total time[s] 0.080682 +Converged at iteration 22, L1 7.81327e-05, Linf 0.00741745, total time[s] 0.057676 +Converged at iteration 24, L1 5.35129e-05, Linf 0.0058013, total time[s] 0.062028 +Converged at iteration 26, L1 9.34836e-05, Linf 0.0049928, total time[s] 0.067173 +Converged at iteration 24, L1 5.07537e-05, Linf 0.00354514, total time[s] 0.062327 +Converged at iteration 23, L1 8.53131e-05, Linf 0.00417718, total time[s] 0.059598 +Converged at iteration 26, L1 9.22938e-05, Linf 0.00532938, total time[s] 0.066553 +Converged at iteration 28, L1 6.08397e-05, Linf 0.00353392, total time[s] 0.071745 +Converged at iteration 27, L1 8.77455e-05, Linf 0.00667929, total time[s] 0.069169 +Converged at iteration 32, L1 9.07519e-05, Linf 0.00520726, total time[s] 0.084026 +Converged at iteration 27, L1 9.2966e-05, Linf 0.00236989, total time[s] 0.070058 +Converged at iteration 31, L1 7.72117e-05, Linf 0.0103619, total time[s] 0.078585 +Converged at iteration 31, L1 5.83696e-05, Linf 0.00240728, total time[s] 0.079202 +Converged at iteration 33, L1 5.30869e-05, Linf 0.00247768, total time[s] 0.084777 +Converged at iteration 31, L1 5.1663e-05, Linf 0.00572968, total time[s] 0.078851 +Converged at iteration 33, L1 4.18397e-05, Linf 0.00770137, total time[s] 0.082779 +Converged at iteration 29, L1 9.39706e-05, Linf 0.0151762, total time[s] 0.077042 +Converged at iteration 25, L1 6.94738e-05, Linf 0.00314637, total time[s] 0.068358 +Converged at iteration 37, L1 9.85049e-05, Linf 0.0129566, total time[s] 0.097375 +Converged at iteration 35, L1 8.67218e-05, Linf 0.0106248, total time[s] 0.090907 +Converged at iteration 25, L1 7.24538e-05, Linf 0.00299956, total time[s] 0.064898 +Converged at iteration 25, L1 9.53574e-05, Linf 0.00641722, total time[s] 0.067731 +Converged at iteration 24, L1 9.30498e-05, Linf 0.0135601, total time[s] 0.068085 +Converged at iteration 26, L1 7.47992e-05, Linf 0.017206, total time[s] 0.067344 +Converged at iteration 21, L1 6.46591e-05, Linf 0.0111621, total time[s] 0.055453 +Converged at iteration 20, L1 6.00382e-05, Linf 0.00243969, total time[s] 0.053903 +Converged at iteration 23, L1 8.09077e-05, Linf 0.0029467, total time[s] 0.062233 +Converged at iteration 24, L1 8.6689e-05, Linf 0.00289439, total time[s] 0.063126 +Converged at iteration 22, L1 5.65371e-05, Linf 0.00245673, total time[s] 0.058048 +Converged at iteration 21, L1 5.41539e-05, Linf 0.00260911, total time[s] 0.055414 +Converged at iteration 32, L1 5.62441e-05, Linf 0.00855611, total time[s] 0.081896 +Converged at iteration 22, L1 7.64597e-05, Linf 0.00476428, total time[s] 0.057054 +Converged at iteration 24, L1 5.34368e-05, Linf 0.00515716, total time[s] 0.067176 +Converged at iteration 26, L1 9.36843e-05, Linf 0.00499505, total time[s] 0.070663 +Converged at iteration 24, L1 5.01095e-05, Linf 0.00347249, total time[s] 0.062495 +Converged at iteration 23, L1 8.50961e-05, Linf 0.00413084, total time[s] 0.062397 +Converged at iteration 26, L1 9.309e-05, Linf 0.00539757, total time[s] 0.069943 +Converged at iteration 28, L1 6.18309e-05, Linf 0.0036405, total time[s] 0.07202 +Converged at iteration 27, L1 8.70468e-05, Linf 0.00669331, total time[s] 0.069522 +Converged at iteration 32, L1 9.02633e-05, Linf 0.00523148, total time[s] 0.08036 +Converged at iteration 27, L1 9.42606e-05, Linf 0.00234006, total time[s] 0.06889 +Converged at iteration 31, L1 7.745e-05, Linf 0.0104925, total time[s] 0.07981 +Converged at iteration 31, L1 5.7403e-05, Linf 0.00241756, total time[s] 0.078161 +Converged at iteration 33, L1 5.08587e-05, Linf 0.00250958, total time[s] 0.083268 +Converged at iteration 31, L1 5.27606e-05, Linf 0.00582216, total time[s] 0.078164 +Converged at iteration 33, L1 4.23626e-05, Linf 0.00787243, total time[s] 0.08254 +Converged at iteration 29, L1 9.75534e-05, Linf 0.0151948, total time[s] 0.073712 +Converged at iteration 25, L1 6.96347e-05, Linf 0.00312889, total time[s] 0.097401 +Converged at iteration 38, L1 3.1244e-05, Linf 0.00725126, total time[s] 0.15722 +Converged at iteration 35, L1 9.05794e-05, Linf 0.011141, total time[s] 0.103798 +Converged at iteration 25, L1 7.18243e-05, Linf 0.00298372, total time[s] 0.075207 +Converged at iteration 26, L1 4.47665e-05, Linf 0.00325654, total time[s] 0.076769 +Converged at iteration 24, L1 9.2414e-05, Linf 0.0131572, total time[s] 0.083266 +Converged at iteration 26, L1 7.93805e-05, Linf 0.0180073, total time[s] 0.07143 +Converged at iteration 21, L1 6.51478e-05, Linf 0.0112348, total time[s] 0.055699 +Converged at iteration 20, L1 6.07842e-05, Linf 0.00256542, total time[s] 0.064426 +Converged at iteration 23, L1 7.9215e-05, Linf 0.00276151, total time[s] 0.076148 +Converged at iteration 24, L1 8.88715e-05, Linf 0.00293562, total time[s] 0.066594 +Converged at iteration 22, L1 5.68944e-05, Linf 0.00247433, total time[s] 0.058806 +Converged at iteration 21, L1 5.59472e-05, Linf 0.002654, total time[s] 0.056245 +Converged at iteration 32, L1 5.84794e-05, Linf 0.00849011, total time[s] 0.083149 +Converged at iteration 22, L1 7.83517e-05, Linf 0.00499537, total time[s] 0.058869 +Converged at iteration 24, L1 5.37066e-05, Linf 0.00453142, total time[s] 0.063717 +Converged at iteration 26, L1 9.28261e-05, Linf 0.00494509, total time[s] 0.068727 +Converged at iteration 24, L1 4.85965e-05, Linf 0.00325015, total time[s] 0.065554 +Converged at iteration 23, L1 8.31058e-05, Linf 0.00400349, total time[s] 0.060355 +Converged at iteration 26, L1 9.54846e-05, Linf 0.00553599, total time[s] 0.067914 +Converged at iteration 28, L1 6.52827e-05, Linf 0.00379396, total time[s] 0.072716 +Converged at iteration 27, L1 8.77166e-05, Linf 0.00674785, total time[s] 0.070244 +Converged at iteration 32, L1 9.1147e-05, Linf 0.00530907, total time[s] 0.082756 +Converged at iteration 27, L1 9.92063e-05, Linf 0.00240063, total time[s] 0.069928 +Converged at iteration 31, L1 7.78981e-05, Linf 0.0105228, total time[s] 0.079359 +Converged at iteration 31, L1 5.73921e-05, Linf 0.00245622, total time[s] 0.079616 +Converged at iteration 33, L1 5.4099e-05, Linf 0.00267292, total time[s] 0.084421 +Converged at iteration 31, L1 5.64653e-05, Linf 0.00615512, total time[s] 0.079485 +Converged at iteration 33, L1 4.45445e-05, Linf 0.00844372, total time[s] 0.084253 +Converged at iteration 29, L1 9.44492e-05, Linf 0.0153288, total time[s] 0.075162 +Converged at iteration 25, L1 7.01622e-05, Linf 0.00309891, total time[s] 0.065716 +Converged at iteration 38, L1 3.07633e-05, Linf 0.00722774, total time[s] 0.097439 +Converged at iteration 36, L1 4.54103e-05, Linf 0.00558595, total time[s] 0.094119 +Converged at iteration 25, L1 7.15412e-05, Linf 0.00297291, total time[s] 0.06558 +Converged at iteration 26, L1 4.5705e-05, Linf 0.00329004, total time[s] 0.06824 +Converged at iteration 24, L1 9.21928e-05, Linf 0.0127349, total time[s] 0.063623 +Converged at iteration 26, L1 8.07685e-05, Linf 0.0182604, total time[s] 0.078584 +Converged at iteration 21, L1 6.53136e-05, Linf 0.0112656, total time[s] 0.067004 +Converged at iteration 20, L1 6.17533e-05, Linf 0.00261248, total time[s] 0.061153 +Converged at iteration 23, L1 7.81844e-05, Linf 0.00266536, total time[s] 0.061304 +Converged at iteration 24, L1 8.93798e-05, Linf 0.00294423, total time[s] 0.066878 +Converged at iteration 22, L1 5.73348e-05, Linf 0.00248256, total time[s] 0.063375 +Converged at iteration 21, L1 5.63934e-05, Linf 0.00267085, total time[s] 0.060574 +Converged at iteration 32, L1 5.79965e-05, Linf 0.0083815, total time[s] 0.088801 +Converged at iteration 22, L1 8.29615e-05, Linf 0.00493923, total time[s] 0.059211 +Converged at iteration 24, L1 5.38871e-05, Linf 0.00454567, total time[s] 0.065723 +Converged at iteration 26, L1 9.24208e-05, Linf 0.00494503, total time[s] 0.073433 +Converged at iteration 24, L1 4.81866e-05, Linf 0.003179, total time[s] 0.068412 +Converged at iteration 23, L1 8.21267e-05, Linf 0.00394546, total time[s] 0.06661 +Converged at iteration 26, L1 9.66478e-05, Linf 0.00557822, total time[s] 0.070904 +Converged at iteration 28, L1 6.59006e-05, Linf 0.00390097, total time[s] 0.073283 +Converged at iteration 27, L1 8.83035e-05, Linf 0.00677019, total time[s] 0.070558 +Converged at iteration 32, L1 9.12708e-05, Linf 0.00533402, total time[s] 0.082321 +Converged at iteration 28, L1 5.92807e-05, Linf 0.00180994, total time[s] 0.072775 +Converged at iteration 31, L1 7.82583e-05, Linf 0.0105288, total time[s] 0.099566 +Converged at iteration 31, L1 6.01981e-05, Linf 0.00249173, total time[s] 0.07924 +Converged at iteration 33, L1 5.51511e-05, Linf 0.00270798, total time[s] 0.084872 +Converged at iteration 31, L1 5.77503e-05, Linf 0.0062897, total time[s] 0.078889 +Converged at iteration 33, L1 4.51868e-05, Linf 0.00860128, total time[s] 0.083719 +Converged at iteration 29, L1 9.44128e-05, Linf 0.0153425, total time[s] 0.11255 +Converged at iteration 25, L1 6.99635e-05, Linf 0.00309275, total time[s] 0.069983 +Converged at iteration 38, L1 3.15158e-05, Linf 0.00752784, total time[s] 0.109154 +Converged at iteration 36, L1 6.13492e-05, Linf 0.00601161, total time[s] 0.100582 +Converged at iteration 25, L1 7.13178e-05, Linf 0.00294531, total time[s] 0.064898 +Converged at iteration 26, L1 4.99544e-05, Linf 0.00349024, total time[s] 0.074834 +Converged at iteration 24, L1 9.21998e-05, Linf 0.0119828, total time[s] 0.073923 +Converged at iteration 26, L1 8.84072e-05, Linf 0.0194889, total time[s] 0.079362 +Converged at iteration 21, L1 6.6843e-05, Linf 0.0113509, total time[s] 0.054701 +Converged at iteration 20, L1 6.58691e-05, Linf 0.0027526, total time[s] 0.052835 +Converged at iteration 23, L1 7.57779e-05, Linf 0.00260448, total time[s] 0.064902 +Converged at iteration 24, L1 9.18191e-05, Linf 0.00299191, total time[s] 0.061581 +Converged at iteration 22, L1 5.81518e-05, Linf 0.00249104, total time[s] 0.058631 +Converged at iteration 21, L1 5.87423e-05, Linf 0.00275753, total time[s] 0.054498 +Converged at iteration 32, L1 6.29831e-05, Linf 0.00851605, total time[s] 0.080273 +Converged at iteration 22, L1 8.71238e-05, Linf 0.00521473, total time[s] 0.057171 +Converged at iteration 24, L1 5.5622e-05, Linf 0.00466401, total time[s] 0.061541 +Converged at iteration 26, L1 9.03529e-05, Linf 0.00487354, total time[s] 0.068204 +Converged at iteration 23, L1 9.76836e-05, Linf 0.00445384, total time[s] 0.05954 +Converged at iteration 23, L1 7.76781e-05, Linf 0.00365642, total time[s] 0.059842 +Converged at iteration 27, L1 5.19844e-05, Linf 0.00306977, total time[s] 0.06995 +Converged at iteration 28, L1 6.97122e-05, Linf 0.00423309, total time[s] 0.071072 +Converged at iteration 27, L1 9.07724e-05, Linf 0.00685684, total time[s] 0.070157 +Converged at iteration 32, L1 9.16464e-05, Linf 0.00554912, total time[s] 0.1052 +Converged at iteration 28, L1 6.35432e-05, Linf 0.00192, total time[s] 0.081973 +Converged at iteration 31, L1 7.92719e-05, Linf 0.0107622, total time[s] 0.101523 +Converged at iteration 31, L1 6.4397e-05, Linf 0.00246393, total time[s] 0.086702 +Converged at iteration 33, L1 6.11826e-05, Linf 0.00288616, total time[s] 0.103334 +Converged at iteration 31, L1 6.3635e-05, Linf 0.00671961, total time[s] 0.085718 +Converged at iteration 33, L1 4.86406e-05, Linf 0.00945855, total time[s] 0.107973 +Converged at iteration 29, L1 9.84976e-05, Linf 0.0163008, total time[s] 0.076097 +Converged at iteration 25, L1 7.00777e-05, Linf 0.0030437, total time[s] 0.066017 +Converged at iteration 38, L1 3.164e-05, Linf 0.00752861, total time[s] 0.096884 +Converged at iteration 35, L1 9.88384e-05, Linf 0.0121945, total time[s] 0.089141 +Converged at iteration 25, L1 7.08879e-05, Linf 0.00293445, total time[s] 0.067415 +Converged at iteration 26, L1 5.04509e-05, Linf 0.0035243, total time[s] 0.068272 +Converged at iteration 24, L1 9.10235e-05, Linf 0.0118497, total time[s] 0.063412 +Converged at iteration 26, L1 8.98451e-05, Linf 0.0197862, total time[s] 0.068563 +Converged at iteration 21, L1 6.80496e-05, Linf 0.0117395, total time[s] 0.057753 +Converged at iteration 20, L1 6.70799e-05, Linf 0.00277478, total time[s] 0.098553 +Converged at iteration 23, L1 7.48828e-05, Linf 0.00258917, total time[s] 0.065069 +Converged at iteration 24, L1 9.20947e-05, Linf 0.0030011, total time[s] 0.064765 +Converged at iteration 22, L1 5.85331e-05, Linf 0.00249686, total time[s] 0.061262 +Converged at iteration 21, L1 5.90784e-05, Linf 0.00277213, total time[s] 0.058769 +Converged at iteration 32, L1 6.37969e-05, Linf 0.00852616, total time[s] 0.08876 +Converged at iteration 22, L1 8.34513e-05, Linf 0.00516721, total time[s] 0.062742 +Converged at iteration 24, L1 5.60792e-05, Linf 0.00467179, total time[s] 0.065243 +Converged at iteration 26, L1 9.08958e-05, Linf 0.00487595, total time[s] 0.071689 +Converged at iteration 23, L1 9.71122e-05, Linf 0.00436908, total time[s] 0.066773 +Converged at iteration 23, L1 7.72084e-05, Linf 0.00357294, total time[s] 0.061894 +Converged at iteration 27, L1 5.24114e-05, Linf 0.00308473, total time[s] 0.072264 +Converged at iteration 28, L1 7.12931e-05, Linf 0.00430584, total time[s] 0.079886 +Converged at iteration 27, L1 9.0755e-05, Linf 0.00687755, total time[s] 0.080393 +Converged at iteration 32, L1 9.1654e-05, Linf 0.00561267, total time[s] 0.091664 +Converged at iteration 28, L1 6.44709e-05, Linf 0.00190543, total time[s] 0.072964 +Converged at iteration 31, L1 7.91995e-05, Linf 0.0106272, total time[s] 0.078503 +Converged at iteration 31, L1 5.81702e-05, Linf 0.00246599, total time[s] 0.078687 +Converged at iteration 33, L1 5.89888e-05, Linf 0.00292003, total time[s] 0.083724 +Converged at iteration 31, L1 6.47883e-05, Linf 0.0068313, total time[s] 0.079084 +Converged at iteration 33, L1 5.01684e-05, Linf 0.00965895, total time[s] 0.082959 +Converged at iteration 29, L1 9.48853e-05, Linf 0.0165797, total time[s] 0.074268 +Converged at iteration 25, L1 6.93685e-05, Linf 0.00303715, total time[s] 0.064184 +Converged at iteration 38, L1 3.31031e-05, Linf 0.00769443, total time[s] 0.09697 +Converged at iteration 36, L1 3.56151e-05, Linf 0.00633733, total time[s] 0.089975 +Converged at iteration 25, L1 6.99022e-05, Linf 0.0029193, total time[s] 0.062467 +Converged at iteration 26, L1 5.27742e-05, Linf 0.00364576, total time[s] 0.065706 +Converged at iteration 24, L1 9.69642e-05, Linf 0.0114719, total time[s] 0.059989 +Converged at iteration 26, L1 9.53735e-05, Linf 0.0206083, total time[s] 0.064811 +Converged at iteration 21, L1 6.88369e-05, Linf 0.0114779, total time[s] 0.05323 +Converged at iteration 20, L1 6.89482e-05, Linf 0.00286789, total time[s] 0.050697 +Converged at iteration 23, L1 7.34447e-05, Linf 0.00256085, total time[s] 0.059048 +Converged at iteration 24, L1 9.34063e-05, Linf 0.0030214, total time[s] 0.059088 +Converged at iteration 22, L1 5.93877e-05, Linf 0.00250793, total time[s] 0.056778 +Converged at iteration 21, L1 6.0669e-05, Linf 0.00289342, total time[s] 0.053649 +Converged at iteration 32, L1 6.73146e-05, Linf 0.00840232, total time[s] 0.077563 +Converged at iteration 22, L1 9.47471e-05, Linf 0.0052922, total time[s] 0.057072 +Converged at iteration 24, L1 5.977e-05, Linf 0.0106314, total time[s] 0.059871 +Converged at iteration 26, L1 9.00377e-05, Linf 0.00484552, total time[s] 0.064092 +Converged at iteration 23, L1 9.47682e-05, Linf 0.00416285, total time[s] 0.058947 +Converged at iteration 23, L1 7.85458e-05, Linf 0.00337629, total time[s] 0.059741 +Converged at iteration 27, L1 5.46185e-05, Linf 0.0031587, total time[s] 0.066561 +Converged at iteration 28, L1 7.89779e-05, Linf 0.00456496, total time[s] 0.068565 +Converged at iteration 27, L1 9.27508e-05, Linf 0.00693624, total time[s] 0.066358 +Converged at iteration 32, L1 9.25302e-05, Linf 0.00575258, total time[s] 0.077816 +Converged at iteration 28, L1 6.66766e-05, Linf 0.00192726, total time[s] 0.068651 +Converged at iteration 31, L1 8.29562e-05, Linf 0.0105857, total time[s] 0.076013 +Converged at iteration 31, L1 6.34615e-05, Linf 0.00243169, total time[s] 0.075947 +Converged at iteration 33, L1 6.5027e-05, Linf 0.00428997, total time[s] 0.07999 +Converged at iteration 31, L1 7.00917e-05, Linf 0.0071378, total time[s] 0.075476 +Converged at iteration 33, L1 5.1395e-05, Linf 0.0102454, total time[s] 0.080754 +Converged at iteration 30, L1 3.15934e-05, Linf 0.00590694, total time[s] 0.072979 +Converged at iteration 25, L1 6.95651e-05, Linf 0.00502724, total time[s] 0.062962 +Converged at iteration 38, L1 3.24947e-05, Linf 0.00778355, total time[s] 0.10466 +Converged at iteration 36, L1 3.57312e-05, Linf 0.00643376, total time[s] 0.088804 +Converged at iteration 25, L1 7.02814e-05, Linf 0.00291077, total time[s] 0.062836 +Converged at iteration 26, L1 5.27377e-05, Linf 0.0036795, total time[s] 0.064504 +Converged at iteration 24, L1 9.15696e-05, Linf 0.0113446, total time[s] 0.060071 +Converged at iteration 26, L1 9.62312e-05, Linf 0.0209417, total time[s] 0.067528 +Converged at iteration 21, L1 6.85721e-05, Linf 0.011523, total time[s] 0.053352 +Converged at iteration 20, L1 6.89937e-05, Linf 0.00293193, total time[s] 0.059558 +Converged at iteration 23, L1 7.26125e-05, Linf 0.00253069, total time[s] 0.070864 +Converged at iteration 24, L1 9.4425e-05, Linf 0.00302924, total time[s] 0.059979 +Converged at iteration 22, L1 5.95134e-05, Linf 0.00251074, total time[s] 0.056615 +Converged at iteration 21, L1 6.32581e-05, Linf 0.00293747, total time[s] 0.054908 +Converged at iteration 32, L1 6.84297e-05, Linf 0.00844373, total time[s] 0.077446 +Converged at iteration 22, L1 8.69012e-05, Linf 0.00533657, total time[s] 0.055331 +Converged at iteration 24, L1 5.70143e-05, Linf 0.00474154, total time[s] 0.058869 +Converged at iteration 26, L1 9.07126e-05, Linf 0.00485218, total time[s] 0.066215 +Converged at iteration 23, L1 9.41555e-05, Linf 0.00408683, total time[s] 0.071606 +Converged at iteration 23, L1 7.81331e-05, Linf 0.00329635, total time[s] 0.059006 +Converged at iteration 27, L1 5.40667e-05, Linf 0.00318975, total time[s] 0.066183 +Converged at iteration 28, L1 8.08896e-05, Linf 0.00458069, total time[s] 0.072128 +Converged at iteration 27, L1 9.28414e-05, Linf 0.00696466, total time[s] 0.066564 +Converged at iteration 32, L1 9.30961e-05, Linf 0.00581781, total time[s] 0.078708 +Converged at iteration 28, L1 6.76058e-05, Linf 0.00193224, total time[s] 0.069074 +Converged at iteration 31, L1 8.21862e-05, Linf 0.0108307, total time[s] 0.07599 +Converged at iteration 31, L1 6.26872e-05, Linf 0.00246546, total time[s] 0.077015 +Converged at iteration 33, L1 6.59228e-05, Linf 0.00303957, total time[s] 0.080599 +Converged at iteration 31, L1 7.40626e-05, Linf 0.00726809, total time[s] 0.076012 +Converged at iteration 33, L1 5.28173e-05, Linf 0.0104657, total time[s] 0.079657 +Converged at iteration 29, L1 9.80042e-05, Linf 0.0166488, total time[s] 0.071 +Converged at iteration 25, L1 7.10164e-05, Linf 0.0030145, total time[s] 0.062487 +Converged at iteration 38, L1 3.54823e-05, Linf 0.0080387, total time[s] 0.093243 +Converged at iteration 36, L1 3.81597e-05, Linf 0.00678186, total time[s] 0.092425 +Converged at iteration 25, L1 7.08682e-05, Linf 0.00289655, total time[s] 0.062187 +Converged at iteration 26, L1 5.54431e-05, Linf 0.00386484, total time[s] 0.064355 +Converged at iteration 24, L1 8.98249e-05, Linf 0.0109631, total time[s] 0.059782 +Converged at iteration 27, L1 4.13292e-05, Linf 0.00851514, total time[s] 0.066465 +Converged at iteration 21, L1 7.00606e-05, Linf 0.0116327, total time[s] 0.053443 +Converged at iteration 20, L1 6.98137e-05, Linf 0.00300514, total time[s] 0.0511 +Converged at iteration 23, L1 7.25035e-05, Linf 0.00250061, total time[s] 0.057958 +Converged at iteration 24, L1 9.55975e-05, Linf 0.00306084, total time[s] 0.061729 +Converged at iteration 22, L1 6.01178e-05, Linf 0.00251832, total time[s] 0.05534 +Converged at iteration 21, L1 6.45505e-05, Linf 0.00771652, total time[s] 0.053191 +Converged at iteration 32, L1 7.16911e-05, Linf 0.00845124, total time[s] 0.077896 +Converged at iteration 22, L1 9.84862e-05, Linf 0.00887012, total time[s] 0.055435 +Converged at iteration 24, L1 6.06012e-05, Linf 0.00479702, total time[s] 0.060515 +Converged at iteration 26, L1 8.96802e-05, Linf 0.00481754, total time[s] 0.065361 +Converged at iteration 23, L1 9.14718e-05, Linf 0.00386212, total time[s] 0.057627 +Converged at iteration 23, L1 7.9025e-05, Linf 0.00318012, total time[s] 0.057636 +Converged at iteration 27, L1 5.49081e-05, Linf 0.00328796, total time[s] 0.068077 +Converged at iteration 28, L1 9.04587e-05, Linf 0.00485748, total time[s] 0.068833 +Converged at iteration 27, L1 9.53033e-05, Linf 0.007053, total time[s] 0.06683 +Converged at iteration 32, L1 9.35532e-05, Linf 0.00586231, total time[s] 0.077654 +Converged at iteration 28, L1 7.0677e-05, Linf 0.00195934, total time[s] 0.068764 +Converged at iteration 31, L1 8.26075e-05, Linf 0.0107583, total time[s] 0.076258 +Converged at iteration 31, L1 6.36951e-05, Linf 0.00244152, total time[s] 0.075752 +Converged at iteration 33, L1 6.44548e-05, Linf 0.00313834, total time[s] 0.079727 +Converged at iteration 31, L1 7.80574e-05, Linf 0.00773671, total time[s] 0.076201 +Converged at iteration 33, L1 5.60528e-05, Linf 0.0112467, total time[s] 0.080702 +Converged at iteration 29, L1 9.3944e-05, Linf 0.0160605, total time[s] 0.070717 +Converged at iteration 25, L1 7.0859e-05, Linf 0.00301258, total time[s] 0.062274 +Converged at iteration 38, L1 3.34897e-05, Linf 0.00810847, total time[s] 0.099122 +Converged at iteration 36, L1 6.47568e-05, Linf 0.00688019, total time[s] 0.091885 +Converged at iteration 25, L1 7.02138e-05, Linf 0.00288399, total time[s] 0.062094 +Converged at iteration 26, L1 5.61434e-05, Linf 0.00392567, total time[s] 0.064189 +Converged at iteration 24, L1 8.9765e-05, Linf 0.0108647, total time[s] 0.059934 +Converged at iteration 27, L1 4.24535e-05, Linf 0.00868472, total time[s] 0.066565 +Converged at iteration 21, L1 6.9522e-05, Linf 0.0116723, total time[s] 0.053337 +Converged at iteration 20, L1 7.06168e-05, Linf 0.0030397, total time[s] 0.0538 +Converged at iteration 23, L1 7.2581e-05, Linf 0.00248401, total time[s] 0.058522 +Converged at iteration 24, L1 9.65214e-05, Linf 0.00307043, total time[s] 0.059946 +Converged at iteration 22, L1 6.04636e-05, Linf 0.00252488, total time[s] 0.055338 +Converged at iteration 21, L1 6.35833e-05, Linf 0.00306127, total time[s] 0.053106 +Converged at iteration 32, L1 8.62528e-05, Linf 0.00841196, total time[s] 0.07984 +Converged at iteration 22, L1 9.37591e-05, Linf 0.00554366, total time[s] 0.058068 +Converged at iteration 24, L1 5.89091e-05, Linf 0.00481044, total time[s] 0.06101 +Converged at iteration 26, L1 8.92469e-05, Linf 0.00482376, total time[s] 0.066055 +Converged at iteration 23, L1 9.1258e-05, Linf 0.00381005, total time[s] 0.057881 +Converged at iteration 23, L1 7.93881e-05, Linf 0.00313453, total time[s] 0.058319 +Converged at iteration 27, L1 5.47384e-05, Linf 0.0033147, total time[s] 0.069455 +Converged at iteration 28, L1 9.37502e-05, Linf 0.0049197, total time[s] 0.083614 +Converged at iteration 27, L1 9.5746e-05, Linf 0.00707556, total time[s] 0.079426 +Converged at iteration 32, L1 9.58258e-05, Linf 0.00586339, total time[s] 0.089034 +Converged at iteration 28, L1 7.14113e-05, Linf 0.00196615, total time[s] 0.095623 +Converged at iteration 31, L1 8.2797e-05, Linf 0.0108206, total time[s] 0.091835 +Converged at iteration 31, L1 6.38683e-05, Linf 0.00328224, total time[s] 0.097148 +Converged at iteration 33, L1 6.49385e-05, Linf 0.00318131, total time[s] 0.094736 +Converged at iteration 31, L1 8.09049e-05, Linf 0.00787512, total time[s] 0.079964 +Converged at iteration 33, L1 5.60571e-05, Linf 0.011469, total time[s] 0.083134 +Converged at iteration 29, L1 9.56755e-05, Linf 0.015958, total time[s] 0.073175 +Converged at iteration 25, L1 7.0617e-05, Linf 0.00301883, total time[s] 0.110963 +Converged at iteration 38, L1 3.38962e-05, Linf 0.00839271, total time[s] 0.128634 +Converged at iteration 36, L1 6.98118e-05, Linf 0.00711437, total time[s] 0.110198 +Converged at iteration 25, L1 6.98365e-05, Linf 0.00286545, total time[s] 0.068492 +Converged at iteration 26, L1 5.73441e-05, Linf 0.0040833, total time[s] 0.070915 +Converged at iteration 24, L1 8.79525e-05, Linf 0.0106505, total time[s] 0.071276 +Converged at iteration 27, L1 4.24842e-05, Linf 0.00905653, total time[s] 0.092972 +Converged at iteration 21, L1 7.29033e-05, Linf 0.0117414, total time[s] 0.07232 +Converged at iteration 20, L1 7.03917e-05, Linf 0.00311085, total time[s] 0.089747 +Converged at iteration 23, L1 7.20234e-05, Linf 0.00247348, total time[s] 0.077053 +Converged at iteration 24, L1 9.75352e-05, Linf 0.00308671, total time[s] 0.074031 +Converged at iteration 22, L1 6.06535e-05, Linf 0.00251933, total time[s] 0.069283 +Converged at iteration 21, L1 6.59172e-05, Linf 0.00311784, total time[s] 0.08567 +Converged at iteration 32, L1 7.46577e-05, Linf 0.00863439, total time[s] 0.096708 +Converged at iteration 22, L1 9.39865e-05, Linf 0.00563943, total time[s] 0.069527 +Converged at iteration 24, L1 5.89009e-05, Linf 0.00485485, total time[s] 0.067621 +Converged at iteration 26, L1 9.06335e-05, Linf 0.00481222, total time[s] 0.082634 +Converged at iteration 23, L1 8.99296e-05, Linf 0.00369666, total time[s] 0.073101 +Converged at iteration 23, L1 7.82064e-05, Linf 0.0028876, total time[s] 0.061514 +Converged at iteration 27, L1 5.47145e-05, Linf 0.00337487, total time[s] 0.073017 +Converged at iteration 28, L1 9.56648e-05, Linf 0.00510775, total time[s] 0.073924 +Converged at iteration 27, L1 9.62966e-05, Linf 0.0071389, total time[s] 0.070194 +Converged at iteration 32, L1 9.30495e-05, Linf 0.00585916, total time[s] 0.085087 +Converged at iteration 28, L1 7.36262e-05, Linf 0.00198319, total time[s] 0.078397 +Converged at iteration 31, L1 8.14573e-05, Linf 0.0108116, total time[s] 0.104853 +Converged at iteration 31, L1 6.20548e-05, Linf 0.00249575, total time[s] 0.092995 +Converged at iteration 33, L1 6.64509e-05, Linf 0.00322933, total time[s] 0.094623 +Converged at iteration 31, L1 8.4683e-05, Linf 0.00820216, total time[s] 0.088949 +Converged at iteration 33, L1 5.77642e-05, Linf 0.0120091, total time[s] 0.100751 +Converged at iteration 29, L1 9.33229e-05, Linf 0.0166484, total time[s] 0.089444 +Converged at iteration 25, L1 7.17331e-05, Linf 0.00304072, total time[s] 0.069569 +Converged at iteration 38, L1 3.41431e-05, Linf 0.00830406, total time[s] 0.097496 +Converged at iteration 36, L1 3.87296e-05, Linf 0.0072496, total time[s] 0.112735 +Converged at iteration 25, L1 6.91247e-05, Linf 0.00284536, total time[s] 0.093062 +Converged at iteration 26, L1 5.80249e-05, Linf 0.00414198, total time[s] 0.073491 +Converged at iteration 24, L1 8.79504e-05, Linf 0.0105624, total time[s] 0.062918 +Converged at iteration 27, L1 6.60712e-05, Linf 0.00923073, total time[s] 0.076535 +Converged at iteration 21, L1 7.35377e-05, Linf 0.0117751, total time[s] 0.062039 +Converged at iteration 20, L1 7.1149e-05, Linf 0.0031481, total time[s] 0.065478 +Converged at iteration 23, L1 7.14703e-05, Linf 0.00243353, total time[s] 0.069603 +Converged at iteration 24, L1 9.80743e-05, Linf 0.00309478, total time[s] 0.077871 +Converged at iteration 22, L1 6.04064e-05, Linf 0.00253184, total time[s] 0.079387 +Converged at iteration 21, L1 6.41125e-05, Linf 0.00314968, total time[s] 0.072179 +Converged at iteration 32, L1 7.55542e-05, Linf 0.0084989, total time[s] 0.101204 +Converged at iteration 22, L1 9.09412e-05, Linf 0.00569054, total time[s] 0.069413 +Converged at iteration 24, L1 5.89158e-05, Linf 0.00486633, total time[s] 0.066283 +Converged at iteration 26, L1 8.96852e-05, Linf 0.0048339, total time[s] 0.082941 +Converged at iteration 23, L1 9.03083e-05, Linf 0.00365337, total time[s] 0.067481 +Converged at iteration 23, L1 7.68513e-05, Linf 0.0027913, total time[s] 0.060896 +Converged at iteration 27, L1 5.5482e-05, Linf 0.0034028, total time[s] 0.072454 +Converged at iteration 28, L1 9.7069e-05, Linf 0.00519134, total time[s] 0.074167 +Converged at iteration 27, L1 9.76193e-05, Linf 0.00716777, total time[s] 0.071033 +Converged at iteration 32, L1 9.29176e-05, Linf 0.00587002, total time[s] 0.083283 +Converged at iteration 28, L1 7.46026e-05, Linf 0.00198784, total time[s] 0.073112 +Converged at iteration 31, L1 8.13307e-05, Linf 0.0108124, total time[s] 0.07998 +Converged at iteration 31, L1 6.16255e-05, Linf 0.00248696, total time[s] 0.091468 +Converged at iteration 33, L1 6.52587e-05, Linf 0.00326727, total time[s] 0.084726 +Converged at iteration 31, L1 8.64142e-05, Linf 0.00835549, total time[s] 0.113342 +Converged at iteration 33, L1 5.85053e-05, Linf 0.0122656, total time[s] 0.091779 +Converged at iteration 29, L1 9.5155e-05, Linf 0.0166554, total time[s] 0.076074 +Converged at iteration 25, L1 7.26228e-05, Linf 0.00311074, total time[s] 0.066586 +Converged at iteration 38, L1 4.37642e-05, Linf 0.0117816, total time[s] 0.103127 +Converged at iteration 36, L1 5.32214e-05, Linf 0.01126, total time[s] 0.108271 +Converged at iteration 25, L1 5.89241e-05, Linf 0.0024625, total time[s] 0.073262 +Converged at iteration 26, L1 9.10091e-05, Linf 0.00761208, total time[s] 0.070661 +Converged at iteration 24, L1 8.0358e-05, Linf 0.0090304, total time[s] 0.066648 +Converged at iteration 27, L1 6.72922e-05, Linf 0.0165384, total time[s] 0.070448 +Converged at iteration 21, L1 8.76912e-05, Linf 0.0128047, total time[s] 0.067922 +Converged at iteration 20, L1 8.94727e-05, Linf 0.00375104, total time[s] 0.078972 +Converged at iteration 23, L1 6.14206e-05, Linf 0.00260625, total time[s] 0.077101 +Converged at iteration 25, L1 6.54138e-05, Linf 0.0022415, total time[s] 0.070131 +Converged at iteration 22, L1 6.04671e-05, Linf 0.00251261, total time[s] 0.06367 +Converged at iteration 21, L1 8.45544e-05, Linf 0.00438223, total time[s] 0.060559 +Converged at iteration 33, L1 3.82327e-05, Linf 0.00267602, total time[s] 0.088982 +Converged at iteration 23, L1 6.45939e-05, Linf 0.00410897, total time[s] 0.060453 +Converged at iteration 24, L1 6.99366e-05, Linf 0.00561556, total time[s] 0.062342 +Converged at iteration 26, L1 7.7746e-05, Linf 0.00445069, total time[s] 0.067742 +Converged at iteration 23, L1 8.6853e-05, Linf 0.0031886, total time[s] 0.063129 +Converged at iteration 23, L1 6.93658e-05, Linf 0.00170797, total time[s] 0.063143 +Converged at iteration 27, L1 6.70394e-05, Linf 0.00417927, total time[s] 0.070051 +Converged at iteration 29, L1 8.10466e-05, Linf 0.00477351, total time[s] 0.074988 +Converged at iteration 28, L1 7.01293e-05, Linf 0.00492156, total time[s] 0.075728 +Converged at iteration 32, L1 8.28666e-05, Linf 0.00575289, total time[s] 0.086709 +Converged at iteration 28, L1 9.83544e-05, Linf 0.0023866, total time[s] 0.079501 +Converged at iteration 31, L1 8.70743e-05, Linf 0.0114453, total time[s] 0.083891 +Converged at iteration 31, L1 6.23872e-05, Linf 0.00274819, total time[s] 0.151439 +Converged at iteration 33, L1 7.08129e-05, Linf 0.00350204, total time[s] 0.202765 +Converged at iteration 32, L1 6.04774e-05, Linf 0.00964437, total time[s] 0.107117 +Converged at iteration 37, L1 8.95413e-05, Linf 0.00187774, total time[s] 0.098614 +Converged at iteration 29, L1 8.88945e-05, Linf 0.0171319, total time[s] 0.079262 +Converged at iteration 25, L1 7.29836e-05, Linf 0.00308287, total time[s] 0.070271 +Converged at iteration 38, L1 4.40354e-05, Linf 0.0120713, total time[s] 0.114925 +Converged at iteration 36, L1 5.43841e-05, Linf 0.0115771, total time[s] 0.109358 +Converged at iteration 25, L1 5.76576e-05, Linf 0.00243038, total time[s] 0.072364 +Converged at iteration 26, L1 9.29386e-05, Linf 0.00778775, total time[s] 0.078923 +Converged at iteration 24, L1 8.3674e-05, Linf 0.00902639, total time[s] 0.066326 +Converged at iteration 27, L1 6.95537e-05, Linf 0.0170795, total time[s] 0.111151 +Converged at iteration 21, L1 8.88551e-05, Linf 0.0127346, total time[s] 0.060117 +Converged at iteration 20, L1 9.11934e-05, Linf 0.00382487, total time[s] 0.090082 +Converged at iteration 23, L1 6.01378e-05, Linf 0.00259074, total time[s] 0.096764 +Converged at iteration 25, L1 6.62202e-05, Linf 0.00227048, total time[s] 0.111827 +Converged at iteration 22, L1 6.07249e-05, Linf 0.00252265, total time[s] 0.082116 +Converged at iteration 21, L1 8.60929e-05, Linf 0.00446131, total time[s] 0.067555 +Converged at iteration 33, L1 3.891e-05, Linf 0.00270064, total time[s] 0.101851 +Converged at iteration 23, L1 6.10102e-05, Linf 0.00418067, total time[s] 0.062148 +Converged at iteration 24, L1 7.09219e-05, Linf 0.00546265, total time[s] 0.079445 +Converged at iteration 26, L1 7.8341e-05, Linf 0.00448052, total time[s] 0.082871 +Converged at iteration 23, L1 8.66302e-05, Linf 0.00310839, total time[s] 0.070919 +Converged at iteration 23, L1 6.8706e-05, Linf 0.00171905, total time[s] 0.063085 +Converged at iteration 27, L1 6.96838e-05, Linf 0.0125432, total time[s] 0.083585 +Converged at iteration 29, L1 8.34027e-05, Linf 0.0049113, total time[s] 0.082443 +Converged at iteration 28, L1 7.01744e-05, Linf 0.00495021, total time[s] 0.07858 +Converged at iteration 32, L1 8.23404e-05, Linf 0.00577098, total time[s] 0.099031 +Converged at iteration 28, L1 9.84417e-05, Linf 0.00245865, total time[s] 0.086579 +Converged at iteration 31, L1 8.66841e-05, Linf 0.0114208, total time[s] 0.094405 +Converged at iteration 31, L1 6.24717e-05, Linf 0.00275792, total time[s] 0.098648 +Converged at iteration 33, L1 7.33237e-05, Linf 0.00386058, total time[s] 0.142743 +Converged at iteration 32, L1 6.31432e-05, Linf 0.0102068, total time[s] 0.260005 +Converged at iteration 33, L1 9.53116e-05, Linf 0.0228186, total time[s] 0.137748 +Converged at iteration 29, L1 9.7425e-05, Linf 0.0170378, total time[s] 0.091521 +Converged at iteration 25, L1 7.44379e-05, Linf 0.00311158, total time[s] 0.075191 +Converged at iteration 38, L1 4.51203e-05, Linf 0.0123095, total time[s] 0.174387 +Converged at iteration 36, L1 5.54576e-05, Linf 0.0118814, total time[s] 0.129042 +Converged at iteration 25, L1 5.57645e-05, Linf 0.002381, total time[s] 0.086124 +Converged at iteration 26, L1 9.36451e-05, Linf 0.00781392, total time[s] 0.074294 +Converged at iteration 24, L1 8.10484e-05, Linf 0.0090532, total time[s] 0.073257 +Converged at iteration 27, L1 7.10217e-05, Linf 0.0183718, total time[s] 0.110723 +Converged at iteration 21, L1 9.05977e-05, Linf 0.0135269, total time[s] 0.099148 +Converged at iteration 20, L1 9.3469e-05, Linf 0.00394103, total time[s] 0.088343 +Converged at iteration 23, L1 5.8066e-05, Linf 0.00253922, total time[s] 0.074402 +Converged at iteration 25, L1 6.66475e-05, Linf 0.00230439, total time[s] 0.075196 +Converged at iteration 22, L1 6.13694e-05, Linf 0.00253501, total time[s] 0.075719 +Converged at iteration 21, L1 9.06898e-05, Linf 0.0164781, total time[s] 0.087419 +Converged at iteration 33, L1 3.9417e-05, Linf 0.00270265, total time[s] 0.093852 +Converged at iteration 23, L1 6.21781e-05, Linf 0.00425474, total time[s] 0.064045 +Converged at iteration 24, L1 6.96161e-05, Linf 0.00548524, total time[s] 0.080273 +Converged at iteration 26, L1 8.02963e-05, Linf 0.00456303, total time[s] 0.072682 +Converged at iteration 23, L1 8.64167e-05, Linf 0.00309643, total time[s] 0.067084 +Converged at iteration 23, L1 6.83277e-05, Linf 0.00686154, total time[s] 0.080717 +Converged at iteration 27, L1 6.89621e-05, Linf 0.00429495, total time[s] 0.08607 +Converged at iteration 29, L1 8.58736e-05, Linf 0.00502875, total time[s] 0.090759 +Converged at iteration 28, L1 6.76632e-05, Linf 0.00497426, total time[s] 0.077494 +Converged at iteration 32, L1 8.30689e-05, Linf 0.00581635, total time[s] 0.084332 +Converged at iteration 28, L1 9.90009e-05, Linf 0.00241409, total time[s] 0.076274 +Converged at iteration 31, L1 8.64661e-05, Linf 0.0113479, total time[s] 0.083324 +Converged at iteration 31, L1 6.15605e-05, Linf 0.00275023, total time[s] 0.099518 +Converged at iteration 33, L1 7.32768e-05, Linf 0.00388762, total time[s] 0.088426 +Converged at iteration 32, L1 6.9362e-05, Linf 0.0102411, total time[s] 0.08612 +Converged at iteration 33, L1 9.82196e-05, Linf 0.0235361, total time[s] 0.08901 +Converged at iteration 29, L1 8.79625e-05, Linf 0.017332, total time[s] 0.083721 +Converged at iteration 25, L1 7.58069e-05, Linf 0.00314944, total time[s] 0.070072 +Converged at iteration 38, L1 4.73105e-05, Linf 0.0125946, total time[s] 0.114645 +Converged at iteration 36, L1 8.15123e-05, Linf 0.0123023, total time[s] 0.098415 +Converged at iteration 25, L1 5.36856e-05, Linf 0.00231503, total time[s] 0.066137 +Converged at iteration 26, L1 9.73637e-05, Linf 0.00810386, total time[s] 0.068301 +Converged at iteration 24, L1 7.87882e-05, Linf 0.00898696, total time[s] 0.066401 +Converged at iteration 27, L1 7.38505e-05, Linf 0.0185608, total time[s] 0.07692 +Converged at iteration 21, L1 9.31683e-05, Linf 0.0136517, total time[s] 0.060919 +Converged at iteration 20, L1 9.42847e-05, Linf 0.00400008, total time[s] 0.06238 +Converged at iteration 23, L1 5.685e-05, Linf 0.00256896, total time[s] 0.065395 +Converged at iteration 25, L1 6.88537e-05, Linf 0.00995569, total time[s] 0.066815 +Converged at iteration 22, L1 6.05937e-05, Linf 0.00253233, total time[s] 0.069472 +Converged at iteration 21, L1 9.27466e-05, Linf 0.0046609, total time[s] 0.064933 +Converged at iteration 33, L1 5.52024e-05, Linf 0.00271165, total time[s] 0.089172 +Converged at iteration 23, L1 6.37428e-05, Linf 0.00436118, total time[s] 0.065498 +Converged at iteration 24, L1 7.11824e-05, Linf 0.00553674, total time[s] 0.064609 +Converged at iteration 26, L1 7.90732e-05, Linf 0.00450203, total time[s] 0.067942 +Converged at iteration 23, L1 8.61125e-05, Linf 0.00307339, total time[s] 0.061116 +Converged at iteration 23, L1 6.82834e-05, Linf 0.0017572, total time[s] 0.065363 +Converged at iteration 27, L1 7.15816e-05, Linf 0.00436788, total time[s] 0.070835 +Converged at iteration 29, L1 8.74613e-05, Linf 0.00525823, total time[s] 0.076282 +Converged at iteration 28, L1 6.62645e-05, Linf 0.00502525, total time[s] 0.073159 +Converged at iteration 32, L1 8.30057e-05, Linf 0.00855753, total time[s] 0.088043 +Converged at iteration 29, L1 5.80114e-05, Linf 0.00168467, total time[s] 0.075489 +Converged at iteration 31, L1 8.49808e-05, Linf 0.0114253, total time[s] 0.078137 +Converged at iteration 31, L1 6.22064e-05, Linf 0.00279292, total time[s] 0.079102 +Converged at iteration 33, L1 7.21216e-05, Linf 0.00390718, total time[s] 0.084182 +Converged at iteration 32, L1 7.15122e-05, Linf 0.0106771, total time[s] 0.081477 +Converged at iteration 37, L1 9.21461e-05, Linf 0.00191366, total time[s] 0.092372 +Converged at iteration 29, L1 8.61183e-05, Linf 0.0177456, total time[s] 0.074849 +Converged at iteration 25, L1 7.66963e-05, Linf 0.00318833, total time[s] 0.066546 +Converged at iteration 38, L1 4.84191e-05, Linf 0.012964, total time[s] 0.097643 +Converged at iteration 36, L1 6.22535e-05, Linf 0.0139229, total time[s] 0.094588 +Converged at iteration 25, L1 4.70486e-05, Linf 0.00206707, total time[s] 0.065616 +Converged at iteration 27, L1 4.43739e-05, Linf 0.00473658, total time[s] 0.070161 +Converged at iteration 24, L1 8.02245e-05, Linf 0.0253635, total time[s] 0.062809 +Converged at iteration 29, L1 9.59576e-05, Linf 0.0313672, total time[s] 0.074497 +Converged at iteration 21, L1 9.5998e-05, Linf 0.0136536, total time[s] 0.05876 +Converged at iteration 21, L1 4.72535e-05, Linf 0.00256084, total time[s] 0.077586 +Converged at iteration 23, L1 5.69156e-05, Linf 0.00265343, total time[s] 0.087154 +Converged at iteration 25, L1 7.00915e-05, Linf 0.00243349, total time[s] 0.07189 +Converged at iteration 22, L1 6.2444e-05, Linf 0.00230541, total time[s] 0.078841 +Converged at iteration 21, L1 9.65304e-05, Linf 0.0051164, total time[s] 0.063774 +Converged at iteration 33, L1 6.13461e-05, Linf 0.00277238, total time[s] 0.103691 +Converged at iteration 23, L1 6.86056e-05, Linf 0.00475374, total time[s] 0.071826 +Converged at iteration 24, L1 7.43995e-05, Linf 0.00573231, total time[s] 0.069959 +Converged at iteration 26, L1 7.47164e-05, Linf 0.00428559, total time[s] 0.072821 +Converged at iteration 23, L1 9.01455e-05, Linf 0.00308663, total time[s] 0.06378 +Converged at iteration 23, L1 7.08577e-05, Linf 0.00719059, total time[s] 0.063876 +Converged at iteration 27, L1 9.33468e-05, Linf 0.0291035, total time[s] 0.077604 +Converged at iteration 29, L1 9.36349e-05, Linf 0.00605299, total time[s] 0.077955 +Converged at iteration 28, L1 6.86548e-05, Linf 0.00521929, total time[s] 0.074338 +Converged at iteration 32, L1 7.80638e-05, Linf 0.00578617, total time[s] 0.084496 +Converged at iteration 29, L1 6.68912e-05, Linf 0.00181484, total time[s] 0.081873 +Converged at iteration 31, L1 8.51519e-05, Linf 0.0117196, total time[s] 0.090471 +Converged at iteration 31, L1 6.81894e-05, Linf 0.00292088, total time[s] 0.0859 +Converged at iteration 33, L1 7.06889e-05, Linf 0.00393461, total time[s] 0.095284 +Converged at iteration 32, L1 8.73895e-05, Linf 0.0122897, total time[s] 0.085091 +Converged at iteration 34, L1 9.56305e-05, Linf 0.00865452, total time[s] 0.0941 +Converged at iteration 29, L1 8.35308e-05, Linf 0.0186186, total time[s] 0.088576 +Converged at iteration 25, L1 7.84245e-05, Linf 0.00316627, total time[s] 0.101183 +Converged at iteration 38, L1 4.97513e-05, Linf 0.0127741, total time[s] 0.116587 +Converged at iteration 36, L1 6.46484e-05, Linf 0.015236, total time[s] 0.101606 +Converged at iteration 24, L1 9.55683e-05, Linf 0.00337685, total time[s] 0.073095 +Converged at iteration 27, L1 5.03321e-05, Linf 0.00542686, total time[s] 0.071576 +Converged at iteration 24, L1 7.62639e-05, Linf 0.0125187, total time[s] 0.064363 +Converged at iteration 29, L1 9.98913e-05, Linf 0.0326932, total time[s] 0.081491 +Converged at iteration 22, L1 3.03337e-05, Linf 0.00545383, total time[s] 0.110906 +Converged at iteration 21, L1 4.8759e-05, Linf 0.00262717, total time[s] 0.064659 +Converged at iteration 23, L1 5.38883e-05, Linf 0.00276444, total time[s] 0.073479 +Converged at iteration 25, L1 7.19453e-05, Linf 0.00247289, total time[s] 0.091803 +Converged at iteration 22, L1 6.02604e-05, Linf 0.00218572, total time[s] 0.086429 +Converged at iteration 21, L1 9.87528e-05, Linf 0.00548623, total time[s] 0.082235 +Converged at iteration 33, L1 4.99053e-05, Linf 0.00305918, total time[s] 0.106935 +Converged at iteration 23, L1 7.21384e-05, Linf 0.00504131, total time[s] 0.066231 +Converged at iteration 24, L1 7.73453e-05, Linf 0.00586971, total time[s] 0.067678 +Converged at iteration 26, L1 7.09265e-05, Linf 0.0041009, total time[s] 0.080996 +Converged at iteration 23, L1 9.2864e-05, Linf 0.00301669, total time[s] 0.066595 +Converged at iteration 23, L1 7.24628e-05, Linf 0.00202887, total time[s] 0.086412 +Converged at iteration 27, L1 7.59477e-05, Linf 0.00472442, total time[s] 0.088316 +Converged at iteration 30, L1 5.2276e-05, Linf 0.00344183, total time[s] 0.08601 +Converged at iteration 28, L1 7.05911e-05, Linf 0.00532122, total time[s] 0.084832 +Converged at iteration 32, L1 7.43194e-05, Linf 0.00577546, total time[s] 0.09106 +Converged at iteration 29, L1 6.8462e-05, Linf 0.0019028, total time[s] 0.094999 +Converged at iteration 31, L1 8.54066e-05, Linf 0.0119271, total time[s] 0.085491 +Converged at iteration 31, L1 6.55734e-05, Linf 0.00296247, total time[s] 0.081778 +Converged at iteration 33, L1 7.13809e-05, Linf 0.00398325, total time[s] 0.086684 +Converged at iteration 32, L1 9.64308e-05, Linf 0.0133929, total time[s] 0.087566 +Converged at iteration 34, L1 4.84421e-05, Linf 0.0103513, total time[s] 0.091893 +Converged at iteration 29, L1 8.22114e-05, Linf 0.0186635, total time[s] 0.082664 +Converged at iteration 25, L1 7.80676e-05, Linf 0.00305655, total time[s] 0.067735 +Converged at iteration 38, L1 5.10598e-05, Linf 0.0130722, total time[s] 0.104594 +Converged at iteration 36, L1 6.80118e-05, Linf 0.0169625, total time[s] 0.113378 +Converged at iteration 24, L1 8.98391e-05, Linf 0.00314982, total time[s] 0.076278 +Converged at iteration 27, L1 5.51377e-05, Linf 0.00582809, total time[s] 0.361432 +Converged at iteration 24, L1 6.92805e-05, Linf 0.00810486, total time[s] 0.087226 +Converged at iteration 28, L1 5.12741e-05, Linf 0.0078978, total time[s] 0.105505 +Converged at iteration 22, L1 3.19297e-05, Linf 0.00550107, total time[s] 0.067732 +Converged at iteration 21, L1 4.90801e-05, Linf 0.0026541, total time[s] 0.071712 +Converged at iteration 23, L1 5.48863e-05, Linf 0.00287941, total time[s] 0.084523 +Converged at iteration 25, L1 7.28194e-05, Linf 0.00250667, total time[s] 0.071079 +Converged at iteration 22, L1 5.94713e-05, Linf 0.00216122, total time[s] 0.071694 +Converged at iteration 22, L1 4.9874e-05, Linf 0.00276201, total time[s] 0.077484 +Converged at iteration 33, L1 6.6156e-05, Linf 0.00451623, total time[s] 0.089023 +Converged at iteration 23, L1 7.69993e-05, Linf 0.00529807, total time[s] 0.067918 +Converged at iteration 24, L1 8.22912e-05, Linf 0.00598037, total time[s] 0.068615 +Converged at iteration 26, L1 6.90607e-05, Linf 0.00389308, total time[s] 0.06956 +Converged at iteration 23, L1 9.45138e-05, Linf 0.00594195, total time[s] 0.063254 +Converged at iteration 23, L1 7.7582e-05, Linf 0.00211634, total time[s] 0.062112 +Converged at iteration 27, L1 9.0441e-05, Linf 0.00495724, total time[s] 0.071031 +Converged at iteration 30, L1 5.52689e-05, Linf 0.00376234, total time[s] 0.083571 +Converged at iteration 28, L1 7.24492e-05, Linf 0.00539763, total time[s] 0.087917 +Converged at iteration 32, L1 7.17842e-05, Linf 0.00582373, total time[s] 0.088825 +Converged at iteration 29, L1 7.3659e-05, Linf 0.00236398, total time[s] 0.092501 +Converged at iteration 31, L1 8.52944e-05, Linf 0.0121735, total time[s] 0.085525 +Converged at iteration 31, L1 6.54394e-05, Linf 0.00303247, total time[s] 0.092929 +Converged at iteration 33, L1 7.28167e-05, Linf 0.00407115, total time[s] 0.10086 +Converged at iteration 33, L1 5.81684e-05, Linf 0.00918317, total time[s] 0.090534 +Converged at iteration 34, L1 5.00323e-05, Linf 0.0111192, total time[s] 0.097686 +Converged at iteration 29, L1 8.1019e-05, Linf 0.0197543, total time[s] 0.078863 +Converged at iteration 25, L1 7.77944e-05, Linf 0.00298297, total time[s] 0.068765 +Converged at iteration 38, L1 5.17041e-05, Linf 0.0143952, total time[s] 0.101095 +Converged at iteration 36, L1 6.99652e-05, Linf 0.0178678, total time[s] 0.108419 +Converged at iteration 24, L1 8.49476e-05, Linf 0.00283529, total time[s] 0.075958 +Converged at iteration 27, L1 5.66032e-05, Linf 0.00621135, total time[s] 0.088483 +Converged at iteration 24, L1 6.91534e-05, Linf 0.00780512, total time[s] 0.065692 +Converged at iteration 28, L1 4.71659e-05, Linf 0.00709266, total time[s] 0.077887 +Converged at iteration 22, L1 3.22844e-05, Linf 0.00557346, total time[s] 0.070614 +Converged at iteration 21, L1 4.96826e-05, Linf 0.00269307, total time[s] 0.059116 +Converged at iteration 23, L1 5.48563e-05, Linf 0.00294393, total time[s] 0.069115 +Converged at iteration 25, L1 7.35875e-05, Linf 0.00253973, total time[s] 0.06962 +Converged at iteration 22, L1 5.92148e-05, Linf 0.00223658, total time[s] 0.062898 +Converged at iteration 22, L1 4.86148e-05, Linf 0.00287096, total time[s] 0.098584 +Converged at iteration 33, L1 5.80746e-05, Linf 0.00393809, total time[s] 0.123759 +Converged at iteration 23, L1 8.07273e-05, Linf 0.00546818, total time[s] 0.0995 +Converged at iteration 24, L1 8.28663e-05, Linf 0.00608013, total time[s] 0.073608 +Converged at iteration 26, L1 7.00134e-05, Linf 0.0140774, total time[s] 0.101921 +Converged at iteration 23, L1 9.65046e-05, Linf 0.00300887, total time[s] 0.110107 +Converged at iteration 23, L1 7.81279e-05, Linf 0.00215684, total time[s] 0.079368 +Converged at iteration 27, L1 7.83499e-05, Linf 0.00511681, total time[s] 0.095728 +Converged at iteration 30, L1 6.0983e-05, Linf 0.00401983, total time[s] 0.093567 +Converged at iteration 28, L1 7.36151e-05, Linf 0.00544002, total time[s] 0.074333 +Converged at iteration 32, L1 7.03439e-05, Linf 0.00583181, total time[s] 0.082103 +Converged at iteration 29, L1 7.60281e-05, Linf 0.00202432, total time[s] 0.077168 +Converged at iteration 31, L1 8.61056e-05, Linf 0.0122768, total time[s] 0.082717 +Converged at iteration 31, L1 6.75046e-05, Linf 0.00310049, total time[s] 0.081828 +Converged at iteration 33, L1 7.47677e-05, Linf 0.00411615, total time[s] 0.083236 +Converged at iteration 33, L1 4.07541e-05, Linf 0.0095114, total time[s] 0.09441 +Converged at iteration 34, L1 5.31927e-05, Linf 0.0118829, total time[s] 0.087721 +Converged at iteration 29, L1 7.87368e-05, Linf 0.019792, total time[s] 0.079633 +Converged at iteration 25, L1 8.07789e-05, Linf 0.00426486, total time[s] 0.072837 +Converged at iteration 38, L1 5.25227e-05, Linf 0.0147901, total time[s] 0.098343 +Converged at iteration 36, L1 7.08702e-05, Linf 0.0177399, total time[s] 0.100035 +Converged at iteration 24, L1 8.29805e-05, Linf 0.00275487, total time[s] 0.065531 +Converged at iteration 27, L1 5.89575e-05, Linf 0.00644789, total time[s] 0.06901 +Converged at iteration 24, L1 6.6847e-05, Linf 0.00756806, total time[s] 0.062029 +Converged at iteration 28, L1 4.93243e-05, Linf 0.00697241, total time[s] 0.073503 +Converged at iteration 22, L1 3.29579e-05, Linf 0.00575933, total time[s] 0.061534 +Converged at iteration 21, L1 5.02414e-05, Linf 0.00274509, total time[s] 0.060429 +Converged at iteration 23, L1 5.51073e-05, Linf 0.0029695, total time[s] 0.072393 +Converged at iteration 25, L1 7.46311e-05, Linf 0.00257839, total time[s] 0.068893 +Converged at iteration 22, L1 5.86721e-05, Linf 0.00234567, total time[s] 0.065786 +Converged at iteration 22, L1 4.87439e-05, Linf 0.00293976, total time[s] 0.063765 +Converged at iteration 33, L1 5.96311e-05, Linf 0.00411101, total time[s] 0.089999 +Converged at iteration 23, L1 7.92593e-05, Linf 0.00558901, total time[s] 0.062411 +Converged at iteration 24, L1 8.3239e-05, Linf 0.00611361, total time[s] 0.062807 +Converged at iteration 26, L1 6.91301e-05, Linf 0.00373828, total time[s] 0.068283 +Converged at iteration 23, L1 9.83331e-05, Linf 0.00305113, total time[s] 0.064142 +Converged at iteration 23, L1 7.889e-05, Linf 0.00216761, total time[s] 0.06274 +Converged at iteration 27, L1 8.11631e-05, Linf 0.00521679, total time[s] 0.072313 +Converged at iteration 30, L1 6.36624e-05, Linf 0.00417803, total time[s] 0.083546 +Converged at iteration 28, L1 7.44147e-05, Linf 0.00547976, total time[s] 0.075761 +Converged at iteration 32, L1 7.00336e-05, Linf 0.00579454, total time[s] 0.090196 +Converged at iteration 29, L1 7.62856e-05, Linf 0.00204727, total time[s] 0.078963 +Converged at iteration 31, L1 8.39488e-05, Linf 0.0122562, total time[s] 0.082157 +Converged at iteration 31, L1 6.71101e-05, Linf 0.00311707, total time[s] 0.08258 +Converged at iteration 33, L1 7.33788e-05, Linf 0.00412276, total time[s] 0.089933 +Converged at iteration 33, L1 4.27471e-05, Linf 0.00987211, total time[s] 0.089889 +Converged at iteration 34, L1 5.28328e-05, Linf 0.0122157, total time[s] 0.091276 +Converged at iteration 29, L1 7.75424e-05, Linf 0.0197473, total time[s] 0.073752 +Converged at iteration 25, L1 7.91513e-05, Linf 0.0029827, total time[s] 0.065453 +Converged at iteration 38, L1 5.2698e-05, Linf 0.0147907, total time[s] 0.097197 +Converged at iteration 36, L1 7.08945e-05, Linf 0.0176912, total time[s] 0.094861 +Converged at iteration 24, L1 8.2156e-05, Linf 0.00275417, total time[s] 0.066888 +Converged at iteration 27, L1 5.80595e-05, Linf 0.00639558, total time[s] 0.071059 +Converged at iteration 24, L1 6.796e-05, Linf 0.00762414, total time[s] 0.063334 +Converged at iteration 28, L1 4.89817e-05, Linf 0.00691751, total time[s] 0.073548 +Converged at iteration 22, L1 3.23346e-05, Linf 0.00597315, total time[s] 0.067179 +Converged at iteration 21, L1 5.0559e-05, Linf 0.00276017, total time[s] 0.070275 +Converged at iteration 23, L1 5.51371e-05, Linf 0.0029391, total time[s] 0.088773 +Converged at iteration 25, L1 7.46832e-05, Linf 0.00258596, total time[s] 0.07308 +Converged at iteration 22, L1 5.83752e-05, Linf 0.00233486, total time[s] 0.059986 +Converged at iteration 22, L1 4.87366e-05, Linf 0.00292939, total time[s] 0.06082 +Converged at iteration 33, L1 5.94111e-05, Linf 0.00408231, total time[s] 0.088503 +Converged at iteration 23, L1 7.88969e-05, Linf 0.00556773, total time[s] 0.059911 +Converged at iteration 24, L1 8.30229e-05, Linf 0.00609587, total time[s] 0.062639 +Converged at iteration 26, L1 6.94758e-05, Linf 0.0037781, total time[s] 0.06684 +Converged at iteration 23, L1 9.76658e-05, Linf 0.00303912, total time[s] 0.059425 +Converged at iteration 23, L1 7.82626e-05, Linf 0.00214398, total time[s] 0.060753 +Converged at iteration 27, L1 7.98563e-05, Linf 0.00519353, total time[s] 0.069017 +Converged at iteration 30, L1 6.32447e-05, Linf 0.00414814, total time[s] 0.075429 +Converged at iteration 28, L1 7.4153e-05, Linf 0.00549349, total time[s] 0.071578 +Converged at iteration 32, L1 7.03634e-05, Linf 0.00580574, total time[s] 0.080854 +Converged at iteration 29, L1 7.54623e-05, Linf 0.00203707, total time[s] 0.074502 +Converged at iteration 31, L1 8.38256e-05, Linf 0.0122153, total time[s] 0.078741 +Converged at iteration 31, L1 6.65088e-05, Linf 0.00310613, total time[s] 0.078196 +Converged at iteration 33, L1 7.35095e-05, Linf 0.00413381, total time[s] 0.086206 +Converged at iteration 33, L1 4.18451e-05, Linf 0.00983279, total time[s] 0.082639 +Converged at iteration 34, L1 5.20436e-05, Linf 0.0121632, total time[s] 0.085089 +Converged at iteration 29, L1 7.76302e-05, Linf 0.0197641, total time[s] 0.074499 +Converged at iteration 25, L1 7.94645e-05, Linf 0.00298207, total time[s] 0.06427 +Converged at iteration 38, L1 7.38758e-05, Linf 0.0147744, total time[s] 0.125581 +Converged at iteration 36, L1 7.12918e-05, Linf 0.0178717, total time[s] 0.106389 +Converged at iteration 24, L1 8.20854e-05, Linf 0.00272868, total time[s] 0.063369 +Converged at iteration 27, L1 5.8789e-05, Linf 0.00649488, total time[s] 0.068845 +Converged at iteration 24, L1 6.66646e-05, Linf 0.00750386, total time[s] 0.062058 +Converged at iteration 28, L1 4.82077e-05, Linf 0.00703869, total time[s] 0.078859 +Converged at iteration 22, L1 3.28504e-05, Linf 0.00579389, total time[s] 0.07049 +Converged at iteration 21, L1 5.05492e-05, Linf 0.00273558, total time[s] 0.05613 +Converged at iteration 23, L1 5.52689e-05, Linf 0.00297609, total time[s] 0.068192 +Converged at iteration 25, L1 7.49829e-05, Linf 0.00258445, total time[s] 0.076876 +Converged at iteration 22, L1 5.80198e-05, Linf 0.00236301, total time[s] 0.060453 +Converged at iteration 22, L1 5.01298e-05, Linf 0.00295872, total time[s] 0.061507 +Converged at iteration 33, L1 6.01304e-05, Linf 0.0041631, total time[s] 0.091062 +Converged at iteration 23, L1 7.94642e-05, Linf 0.0056144, total time[s] 0.064356 +Converged at iteration 24, L1 8.39453e-05, Linf 0.00611877, total time[s] 0.067018 +Converged at iteration 26, L1 6.92379e-05, Linf 0.00372782, total time[s] 0.068224 +Converged at iteration 23, L1 9.89658e-05, Linf 0.00304533, total time[s] 0.064599 +Converged at iteration 23, L1 7.84691e-05, Linf 0.00217014, total time[s] 0.061043 +Converged at iteration 27, L1 8.06702e-05, Linf 0.00523942, total time[s] 0.072305 +Converged at iteration 30, L1 6.40998e-05, Linf 0.00421257, total time[s] 0.079537 +Converged at iteration 28, L1 7.44981e-05, Linf 0.00548419, total time[s] 0.074731 +Converged at iteration 32, L1 7.00477e-05, Linf 0.00579774, total time[s] 0.082193 +Converged at iteration 29, L1 7.58479e-05, Linf 0.0020596, total time[s] 0.075124 +Converged at iteration 31, L1 8.38245e-05, Linf 0.0122588, total time[s] 0.083181 +Converged at iteration 31, L1 6.73116e-05, Linf 0.00312543, total time[s] 0.085685 +Converged at iteration 33, L1 7.3196e-05, Linf 0.00412998, total time[s] 0.086252 +Converged at iteration 33, L1 4.22379e-05, Linf 0.00997157, total time[s] 0.084274 +Converged at iteration 34, L1 5.26688e-05, Linf 0.0123081, total time[s] 0.086728 +Converged at iteration 29, L1 7.67095e-05, Linf 0.0197245, total time[s] 0.074784 +Converged at iteration 25, L1 7.92245e-05, Linf 0.00298338, total time[s] 0.065485 +Converged at iteration 38, L1 5.21361e-05, Linf 0.0147846, total time[s] 0.096554 +Converged at iteration 36, L1 7.10475e-05, Linf 0.0175362, total time[s] 0.095963 +Converged at iteration 24, L1 8.20466e-05, Linf 0.0027442, total time[s] 0.064244 +Converged at iteration 27, L1 5.83212e-05, Linf 0.00644486, total time[s] 0.07145 +Converged at iteration 24, L1 6.68819e-05, Linf 0.00756499, total time[s] 0.064674 +Converged at iteration 28, L1 4.91342e-05, Linf 0.00699258, total time[s] 0.074276 +Converged at iteration 22, L1 3.23018e-05, Linf 0.00576779, total time[s] 0.098993 +Converged at iteration 21, L1 5.02975e-05, Linf 0.00275919, total time[s] 0.065322 +Converged at iteration 23, L1 5.53802e-05, Linf 0.00295938, total time[s] 0.072046 +Converged at iteration 25, L1 7.48813e-05, Linf 0.00258593, total time[s] 0.071073 +Converged at iteration 22, L1 5.82175e-05, Linf 0.00235055, total time[s] 0.065183 +Converged at iteration 22, L1 4.82447e-05, Linf 0.00294403, total time[s] 0.058859 +Converged at iteration 33, L1 5.97722e-05, Linf 0.00412242, total time[s] 0.089558 +Converged at iteration 23, L1 7.92529e-05, Linf 0.00559188, total time[s] 0.064834 +Converged at iteration 24, L1 8.32067e-05, Linf 0.00610755, total time[s] 0.063876 +Converged at iteration 26, L1 6.92321e-05, Linf 0.00375332, total time[s] 0.067348 +Converged at iteration 23, L1 9.79425e-05, Linf 0.00304156, total time[s] 0.061736 +Converged at iteration 23, L1 7.90291e-05, Linf 0.0021598, total time[s] 0.059979 +Converged at iteration 27, L1 8.00214e-05, Linf 0.0052148, total time[s] 0.06949 +Converged at iteration 30, L1 6.34123e-05, Linf 0.00418122, total time[s] 0.076994 +Converged at iteration 28, L1 7.43268e-05, Linf 0.00547726, total time[s] 0.071784 +Converged at iteration 32, L1 7.02485e-05, Linf 0.00581895, total time[s] 0.083439 +Converged at iteration 29, L1 7.557e-05, Linf 0.00204343, total time[s] 0.075341 +Converged at iteration 31, L1 8.38155e-05, Linf 0.0122373, total time[s] 0.079622 +Converged at iteration 31, L1 6.6969e-05, Linf 0.00311667, total time[s] 0.079584 +Converged at iteration 33, L1 7.32727e-05, Linf 0.00414091, total time[s] 0.085526 +Converged at iteration 33, L1 4.19442e-05, Linf 0.00990124, total time[s] 0.084334 +Converged at iteration 34, L1 5.22921e-05, Linf 0.0122449, total time[s] 0.086557 +Converged at iteration 29, L1 8.17191e-05, Linf 0.0197442, total time[s] 0.074663 +Converged at iteration 25, L1 7.91484e-05, Linf 0.00298266, total time[s] 0.06678 +Converged at iteration 38, L1 5.21497e-05, Linf 0.0147943, total time[s] 0.096711 +Converged at iteration 36, L1 7.13403e-05, Linf 0.0177441, total time[s] 0.094303 +Converged at iteration 24, L1 8.20895e-05, Linf 0.00275074, total time[s] 0.076267 +Converged at iteration 27, L1 5.80993e-05, Linf 0.00642011, total time[s] 0.085454 +Converged at iteration 24, L1 6.70427e-05, Linf 0.00759534, total time[s] 0.074336 +Converged at iteration 28, L1 4.92243e-05, Linf 0.00695986, total time[s] 0.073526 +Converged at iteration 22, L1 3.28614e-05, Linf 0.00575483, total time[s] 0.072141 +Converged at iteration 21, L1 5.03706e-05, Linf 0.00275996, total time[s] 0.061219 +Converged at iteration 23, L1 5.49987e-05, Linf 0.00295404, total time[s] 0.073679 +Converged at iteration 25, L1 7.4707e-05, Linf 0.00258598, total time[s] 0.071653 +Converged at iteration 22, L1 5.88031e-05, Linf 0.00234306, total time[s] 0.081024 +Converged at iteration 22, L1 4.94858e-05, Linf 0.00293668, total time[s] 0.066973 +Converged at iteration 33, L1 6.00962e-05, Linf 0.00411708, total time[s] 0.114141 +Converged at iteration 23, L1 8.17038e-05, Linf 0.005583, total time[s] 0.062535 +Converged at iteration 24, L1 8.49954e-05, Linf 0.00610172, total time[s] 0.072995 +Converged at iteration 26, L1 6.9262e-05, Linf 0.00376495, total time[s] 0.068982 +Converged at iteration 23, L1 9.78014e-05, Linf 0.00304123, total time[s] 0.067581 +Converged at iteration 23, L1 7.81756e-05, Linf 0.00215052, total time[s] 0.067689 +Converged at iteration 27, L1 7.98555e-05, Linf 0.00520649, total time[s] 0.076734 +Converged at iteration 30, L1 6.30105e-05, Linf 0.00416018, total time[s] 0.083003 +Converged at iteration 28, L1 7.46233e-05, Linf 0.00547264, total time[s] 0.102673 +Converged at iteration 32, L1 7.03214e-05, Linf 0.00580413, total time[s] 0.114147 +Converged at iteration 29, L1 7.53709e-05, Linf 0.00204059, total time[s] 0.259593 +Converged at iteration 31, L1 8.37914e-05, Linf 0.0122263, total time[s] 0.08347 +Converged at iteration 31, L1 6.70928e-05, Linf 0.00311242, total time[s] 0.082003 +Converged at iteration 33, L1 7.43942e-05, Linf 0.0041351, total time[s] 0.087006 +Converged at iteration 33, L1 4.19922e-05, Linf 0.00986196, total time[s] 0.161443 +Converged at iteration 34, L1 5.22289e-05, Linf 0.0121741, total time[s] 0.092844 +Converged at iteration 29, L1 7.75482e-05, Linf 0.0197516, total time[s] 0.075336 +Converged at iteration 25, L1 7.91434e-05, Linf 0.00304934, total time[s] 0.066477 +Converged at iteration 38, L1 5.25757e-05, Linf 0.0147915, total time[s] 0.096287 +Converged at iteration 36, L1 7.08921e-05, Linf 0.0177067, total time[s] 0.096253 +Converged at iteration 24, L1 8.20746e-05, Linf 0.00275283, total time[s] 0.07662 +Converged at iteration 27, L1 5.89514e-05, Linf 0.00640784, total time[s] 0.071365 +Converged at iteration 24, L1 6.7305e-05, Linf 0.00761034, total time[s] 0.063787 +Converged at iteration 28, L1 4.89724e-05, Linf 0.00695868, total time[s] 0.076643 +Converged at iteration 22, L1 3.23024e-05, Linf 0.0057486, total time[s] 0.068992 +Converged at iteration 21, L1 5.03682e-05, Linf 0.00275981, total time[s] 0.057738 +Converged at iteration 23, L1 5.53033e-05, Linf 0.00295125, total time[s] 0.068354 +Converged at iteration 25, L1 7.46066e-05, Linf 0.00258597, total time[s] 0.078116 +Converged at iteration 22, L1 5.85968e-05, Linf 0.00233902, total time[s] 0.062535 +Converged at iteration 22, L1 4.81651e-05, Linf 0.00293304, total time[s] 0.05954 +Converged at iteration 33, L1 5.9454e-05, Linf 0.00409024, total time[s] 0.094794 +Converged at iteration 23, L1 7.90163e-05, Linf 0.00557473, total time[s] 0.074875 +Converged at iteration 24, L1 8.30035e-05, Linf 0.00609879, total time[s] 0.072577 +Converged at iteration 26, L1 6.93739e-05, Linf 0.0037734, total time[s] 0.070311 +Converged at iteration 23, L1 9.77029e-05, Linf 0.00303852, total time[s] 0.059933 +Converged at iteration 23, L1 7.83789e-05, Linf 0.00214726, total time[s] 0.081701 +Converged at iteration 27, L1 7.97154e-05, Linf 0.00520095, total time[s] 0.070371 +Converged at iteration 30, L1 6.33798e-05, Linf 0.00416842, total time[s] 0.076271 +Converged at iteration 28, L1 7.41664e-05, Linf 0.00547217, total time[s] 0.072119 +Converged at iteration 32, L1 7.0374e-05, Linf 0.00580512, total time[s] 0.083113 +Converged at iteration 29, L1 7.52947e-05, Linf 0.00203787, total time[s] 0.07502 +Converged at iteration 31, L1 8.56623e-05, Linf 0.012465, total time[s] 0.082644 +Converged at iteration 31, L1 6.64865e-05, Linf 0.0031096, total time[s] 0.079607 +Converged at iteration 33, L1 7.44194e-05, Linf 0.00413271, total time[s] 0.08392 +Converged at iteration 33, L1 4.19193e-05, Linf 0.0100333, total time[s] 0.084101 +Converged at iteration 34, L1 5.25895e-05, Linf 0.0121792, total time[s] 0.08618 +Converged at iteration 29, L1 7.77016e-05, Linf 0.0197573, total time[s] 0.074839 +Converged at iteration 25, L1 7.91133e-05, Linf 0.00298726, total time[s] 0.064925 +Converged at iteration 38, L1 5.21784e-05, Linf 0.0147896, total time[s] 0.097323 +Converged at iteration 36, L1 7.12959e-05, Linf 0.0176815, total time[s] 0.168572 +Converged at iteration 24, L1 8.21373e-05, Linf 0.00275692, total time[s] 0.064849 +Converged at iteration 27, L1 5.81715e-05, Linf 0.00640171, total time[s] 0.079744 +Converged at iteration 24, L1 6.71768e-05, Linf 0.0076179, total time[s] 0.064279 +Converged at iteration 28, L1 4.82713e-05, Linf 0.00695267, total time[s] 0.079306 +Converged at iteration 22, L1 3.23037e-05, Linf 0.00574452, total time[s] 0.061372 +Converged at iteration 21, L1 5.04525e-05, Linf 0.00273672, total time[s] 0.065269 +Converged at iteration 23, L1 5.51151e-05, Linf 0.00295212, total time[s] 0.067894 +Converged at iteration 25, L1 7.47962e-05, Linf 0.00258599, total time[s] 0.074806 +Converged at iteration 22, L1 5.83776e-05, Linf 0.00233697, total time[s] 0.061392 +Converged at iteration 22, L1 4.80767e-05, Linf 0.00293121, total time[s] 0.060678 +Converged at iteration 33, L1 5.94258e-05, Linf 0.00408486, total time[s] 0.095321 +Converged at iteration 23, L1 7.89512e-05, Linf 0.00557076, total time[s] 0.064768 +Converged at iteration 24, L1 8.30554e-05, Linf 0.00609733, total time[s] 0.067637 +Converged at iteration 26, L1 6.94158e-05, Linf 0.00377646, total time[s] 0.068392 +Converged at iteration 23, L1 9.782e-05, Linf 0.00303929, total time[s] 0.06095 +Converged at iteration 23, L1 7.96956e-05, Linf 0.00718733, total time[s] 0.063564 +Converged at iteration 27, L1 8.01214e-05, Linf 0.00519813, total time[s] 0.070848 +Converged at iteration 30, L1 6.27433e-05, Linf 0.00414981, total time[s] 0.080717 +Converged at iteration 28, L1 7.42105e-05, Linf 0.00546976, total time[s] 0.073063 +Converged at iteration 32, L1 7.03805e-05, Linf 0.00583429, total time[s] 0.082638 +Converged at iteration 29, L1 7.53279e-05, Linf 0.00204022, total time[s] 0.07506 +Converged at iteration 31, L1 8.3979e-05, Linf 0.0122182, total time[s] 0.084455 +Converged at iteration 31, L1 6.63823e-05, Linf 0.00310761, total time[s] 0.079107 +Converged at iteration 33, L1 7.33492e-05, Linf 0.0041347, total time[s] 0.084067 +Converged at iteration 33, L1 4.19416e-05, Linf 0.0098427, total time[s] 0.084147 +Converged at iteration 34, L1 5.21596e-05, Linf 0.0121754, total time[s] 0.086395 +Converged at iteration 29, L1 7.858e-05, Linf 0.019762, total time[s] 0.076759 +Converged at iteration 25, L1 7.89664e-05, Linf 0.00298219, total time[s] 0.065602 +Converged at iteration 38, L1 5.22647e-05, Linf 0.0147917, total time[s] 0.099443 +Converged at iteration 36, L1 7.10554e-05, Linf 0.0176985, total time[s] 0.093996 +Converged at iteration 24, L1 8.21044e-05, Linf 0.00275581, total time[s] 0.077559 +Converged at iteration 27, L1 5.79236e-05, Linf 0.00639879, total time[s] 0.07868 +Converged at iteration 24, L1 6.82686e-05, Linf 0.00762389, total time[s] 0.063495 +Converged at iteration 28, L1 4.82536e-05, Linf 0.00695426, total time[s] 0.083773 +Converged at iteration 22, L1 3.23149e-05, Linf 0.00574507, total time[s] 0.069671 +Converged at iteration 21, L1 5.04828e-05, Linf 0.00275864, total time[s] 0.070302 +Converged at iteration 23, L1 5.50381e-05, Linf 0.0029492, total time[s] 0.069166 +Converged at iteration 25, L1 7.47046e-05, Linf 0.002586, total time[s] 0.072816 +Converged at iteration 22, L1 5.83662e-05, Linf 0.00233592, total time[s] 0.063777 +Converged at iteration 22, L1 4.79593e-05, Linf 0.00293029, total time[s] 0.063156 +Converged at iteration 33, L1 5.93948e-05, Linf 0.00408266, total time[s] 0.090364 +Converged at iteration 23, L1 7.89218e-05, Linf 0.00556973, total time[s] 0.064099 +Converged at iteration 24, L1 8.60156e-05, Linf 0.0060966, total time[s] 0.072278 +Converged at iteration 26, L1 6.94112e-05, Linf 0.00377667, total time[s] 0.068274 +Converged at iteration 23, L1 9.78793e-05, Linf 0.00303846, total time[s] 0.060564 +Converged at iteration 23, L1 7.81008e-05, Linf 0.00214418, total time[s] 0.060886 +Converged at iteration 27, L1 7.94591e-05, Linf 0.00519373, total time[s] 0.069515 +Converged at iteration 30, L1 6.31908e-05, Linf 0.00414915, total time[s] 0.077931 +Converged at iteration 28, L1 7.42048e-05, Linf 0.00547113, total time[s] 0.074221 +Converged at iteration 32, L1 7.05292e-05, Linf 0.00583447, total time[s] 0.08167 +Converged at iteration 29, L1 7.52421e-05, Linf 0.0020365, total time[s] 0.074362 +Converged at iteration 31, L1 8.5821e-05, Linf 0.0120769, total time[s] 0.08798 +Converged at iteration 31, L1 6.76731e-05, Linf 0.0031102, total time[s] 0.080573 +Converged at iteration 33, L1 7.32369e-05, Linf 0.00416445, total time[s] 0.084214 +Converged at iteration 33, L1 4.1731e-05, Linf 0.00983931, total time[s] 0.083876 +Converged at iteration 34, L1 5.20695e-05, Linf 0.0121675, total time[s] 0.087208 +Converged at iteration 29, L1 7.76474e-05, Linf 0.0197638, total time[s] 0.080863 +Converged at iteration 25, L1 7.90569e-05, Linf 0.00298213, total time[s] 0.066842 +Converged at iteration 38, L1 5.3595e-05, Linf 0.0147968, total time[s] 0.102522 +Converged at iteration 36, L1 7.09621e-05, Linf 0.0176933, total time[s] 0.095264 +Converged at iteration 24, L1 8.21692e-05, Linf 0.00275411, total time[s] 0.066009 +Converged at iteration 27, L1 5.79739e-05, Linf 0.00639712, total time[s] 0.073562 +Converged at iteration 24, L1 6.72007e-05, Linf 0.00762362, total time[s] 0.06437 +Converged at iteration 28, L1 4.80061e-05, Linf 0.0069516, total time[s] 0.076387 +Converged at iteration 22, L1 3.35065e-05, Linf 0.005739, total time[s] 0.074377 +Converged at iteration 21, L1 5.04265e-05, Linf 0.00275977, total time[s] 0.056443 +Converged at iteration 23, L1 5.52954e-05, Linf 0.00294449, total time[s] 0.067406 +Converged at iteration 25, L1 7.46979e-05, Linf 0.00258147, total time[s] 0.070205 +Converged at iteration 22, L1 5.8378e-05, Linf 0.00233539, total time[s] 0.067046 +Converged at iteration 22, L1 4.96926e-05, Linf 0.00292984, total time[s] 0.071308 +Converged at iteration 33, L1 5.96386e-05, Linf 0.00408382, total time[s] 0.088077 +Converged at iteration 23, L1 8.45052e-05, Linf 0.00556893, total time[s] 0.062261 +Converged at iteration 24, L1 8.47985e-05, Linf 0.00609651, total time[s] 0.069412 +Converged at iteration 26, L1 6.94741e-05, Linf 0.00377879, total time[s] 0.068456 +Converged at iteration 23, L1 9.76753e-05, Linf 0.00303925, total time[s] 0.06295 +Converged at iteration 23, L1 7.8088e-05, Linf 0.00214388, total time[s] 0.069641 +Converged at iteration 27, L1 7.95868e-05, Linf 0.00519593, total time[s] 0.079474 +Converged at iteration 30, L1 6.29502e-05, Linf 0.00412218, total time[s] 0.079569 +Converged at iteration 28, L1 7.44123e-05, Linf 0.00547076, total time[s] 0.083215 +Converged at iteration 32, L1 7.05149e-05, Linf 0.0058025, total time[s] 0.084653 +Converged at iteration 29, L1 7.52102e-05, Linf 0.00203624, total time[s] 0.076599 +Converged at iteration 31, L1 8.47115e-05, Linf 0.0122149, total time[s] 0.091825 +Converged at iteration 31, L1 6.63752e-05, Linf 0.00310677, total time[s] 0.090203 +Converged at iteration 33, L1 7.45997e-05, Linf 0.00412879, total time[s] 0.088333 +Converged at iteration 33, L1 4.27004e-05, Linf 0.00972451, total time[s] 0.092767 +Converged at iteration 34, L1 5.20754e-05, Linf 0.0121441, total time[s] 0.091322 +Converged at iteration 29, L1 8.02638e-05, Linf 0.0197635, total time[s] 0.079863 +Converged at iteration 25, L1 8.31741e-05, Linf 0.00305155, total time[s] 0.066369 +Converged at iteration 38, L1 5.25915e-05, Linf 0.014804, total time[s] 0.106738 +Converged at iteration 36, L1 7.12095e-05, Linf 0.0176943, total time[s] 0.103778 +Converged at iteration 24, L1 8.21113e-05, Linf 0.00275568, total time[s] 0.076447 +Converged at iteration 27, L1 5.80187e-05, Linf 0.0063964, total time[s] 0.074265 +Converged at iteration 24, L1 6.71956e-05, Linf 0.00762692, total time[s] 0.065446 +Converged at iteration 28, L1 5.13685e-05, Linf 0.00817154, total time[s] 0.309592 +Converged at iteration 23, L1 9.29019e-05, Linf 0.00246767, total time[s] 0.168567 +Converged at iteration 21, L1 5.04966e-05, Linf 0.00275875, total time[s] 0.114116 +Converged at iteration 23, L1 5.49476e-05, Linf 0.00294846, total time[s] 0.085609 +Converged at iteration 25, L1 7.46703e-05, Linf 0.002586, total time[s] 0.087408 +Converged at iteration 22, L1 5.85741e-05, Linf 0.00233507, total time[s] 0.060935 +Converged at iteration 22, L1 5.02163e-05, Linf 0.00292962, total time[s] 0.059999 +Converged at iteration 33, L1 5.9201e-05, Linf 0.00406977, total time[s] 0.094847 +Converged at iteration 23, L1 8.27355e-05, Linf 0.00557048, total time[s] 0.074453 +Converged at iteration 24, L1 8.4975e-05, Linf 0.00609601, total time[s] 0.065636 +Converged at iteration 26, L1 6.95607e-05, Linf 0.0037778, total time[s] 0.070201 +Converged at iteration 23, L1 9.76572e-05, Linf 0.00303933, total time[s] 0.060868 +Converged at iteration 23, L1 7.8345e-05, Linf 0.00214392, total time[s] 0.061653 +Converged at iteration 27, L1 7.96736e-05, Linf 0.00519638, total time[s] 0.06877 +Converged at iteration 30, L1 6.66925e-05, Linf 0.00415752, total time[s] 0.075919 +Converged at iteration 28, L1 7.49369e-05, Linf 0.00546548, total time[s] 0.072169 +Converged at iteration 32, L1 7.04876e-05, Linf 0.00581775, total time[s] 0.086003 +Converged at iteration 29, L1 7.53024e-05, Linf 0.00204494, total time[s] 0.074705 +Converged at iteration 31, L1 8.66859e-05, Linf 0.0123205, total time[s] 0.079421 +Converged at iteration 31, L1 6.78958e-05, Linf 0.00310413, total time[s] 0.079413 +Converged at iteration 33, L1 7.38035e-05, Linf 0.0041302, total time[s] 0.084886 +Converged at iteration 33, L1 4.29112e-05, Linf 0.0100958, total time[s] 0.128194 +Converged at iteration 34, L1 5.20085e-05, Linf 0.0121675, total time[s] 0.103948 +Converged at iteration 29, L1 7.77043e-05, Linf 0.0197646, total time[s] 0.075889 +Converged at iteration 25, L1 7.90383e-05, Linf 0.00298209, total time[s] 0.072464 +Converged at iteration 38, L1 5.21047e-05, Linf 0.0147923, total time[s] 0.105751 +Converged at iteration 36, L1 7.10104e-05, Linf 0.0176864, total time[s] 0.11498 +Converged at iteration 24, L1 8.21148e-05, Linf 0.00275667, total time[s] 0.07385 +Converged at iteration 27, L1 5.83378e-05, Linf 0.00639599, total time[s] 0.071412 +Converged at iteration 24, L1 6.71817e-05, Linf 0.00762389, total time[s] 0.063791 +Converged at iteration 28, L1 4.84805e-05, Linf 0.00695168, total time[s] 0.078221 +Converged at iteration 22, L1 3.23046e-05, Linf 0.00574265, total time[s] 0.061667 +Converged at iteration 21, L1 5.08373e-05, Linf 0.00275951, total time[s] 0.060659 +Converged at iteration 23, L1 5.4942e-05, Linf 0.00294862, total time[s] 0.064021 +Converged at iteration 25, L1 7.45911e-05, Linf 0.00258107, total time[s] 0.066468 +Converged at iteration 22, L1 5.8361e-05, Linf 0.002335, total time[s] 0.058205 +Converged at iteration 22, L1 4.81926e-05, Linf 0.00292972, total time[s] 0.060339 +Converged at iteration 33, L1 5.98407e-05, Linf 0.00409483, total time[s] 0.085947 +Converged at iteration 23, L1 8.58997e-05, Linf 0.00564477, total time[s] 0.062945 +Converged at iteration 24, L1 8.30029e-05, Linf 0.00609595, total time[s] 0.063407 +Converged at iteration 26, L1 6.94055e-05, Linf 0.0037784, total time[s] 0.070759 +Converged at iteration 23, L1 9.76429e-05, Linf 0.00303768, total time[s] 0.084849 +Converged at iteration 23, L1 7.80768e-05, Linf 0.00214373, total time[s] 0.066407 +Converged at iteration 27, L1 7.95699e-05, Linf 0.00519539, total time[s] 0.072875 +Converged at iteration 30, L1 6.27121e-05, Linf 0.00414863, total time[s] 0.079383 +Converged at iteration 28, L1 7.41451e-05, Linf 0.00546946, total time[s] 0.075799 +Converged at iteration 32, L1 7.04105e-05, Linf 0.00580805, total time[s] 0.086833 +Converged at iteration 29, L1 7.51863e-05, Linf 0.00203604, total time[s] 0.077741 +Converged at iteration 31, L1 8.38182e-05, Linf 0.0122155, total time[s] 0.079694 +Converged at iteration 31, L1 6.63359e-05, Linf 0.00310664, total time[s] 0.078708 +Converged at iteration 33, L1 7.37101e-05, Linf 0.00413418, total time[s] 0.086357 +Converged at iteration 33, L1 4.30672e-05, Linf 0.00983711, total time[s] 0.09111 +Converged at iteration 34, L1 5.20877e-05, Linf 0.0121534, total time[s] 0.104789 +Converged at iteration 29, L1 7.75981e-05, Linf 0.0197615, total time[s] 0.079034 +Converged at iteration 25, L1 7.90431e-05, Linf 0.00298211, total time[s] 0.065749 +Converged at iteration 38, L1 5.21264e-05, Linf 0.0147931, total time[s] 0.097643 +Converged at iteration 36, L1 7.0893e-05, Linf 0.0176831, total time[s] 0.095628 +Converged at iteration 24, L1 8.21166e-05, Linf 0.00275672, total time[s] 0.062527 +Converged at iteration 27, L1 5.79366e-05, Linf 0.00639581, total time[s] 0.071707 +Converged at iteration 24, L1 6.84031e-05, Linf 0.00762551, total time[s] 0.064383 +Converged at iteration 28, L1 4.93731e-05, Linf 0.00694594, total time[s] 0.073291 +Converged at iteration 22, L1 3.23036e-05, Linf 0.00574236, total time[s] 0.059436 +Converged at iteration 21, L1 5.03844e-05, Linf 0.00275888, total time[s] 0.057788 +Converged at iteration 23, L1 5.49377e-05, Linf 0.00295083, total time[s] 0.062555 +Converged at iteration 25, L1 7.46057e-05, Linf 0.00259344, total time[s] 0.067297 +Converged at iteration 22, L1 5.8375e-05, Linf 0.00233493, total time[s] 0.064644 +Converged at iteration 22, L1 5.42036e-05, Linf 0.00292944, total time[s] 0.068384 +Converged at iteration 33, L1 5.94118e-05, Linf 0.00408139, total time[s] 0.087853 +Converged at iteration 23, L1 8.01632e-05, Linf 0.00556829, total time[s] 0.061954 +Converged at iteration 24, L1 8.29845e-05, Linf 0.00634393, total time[s] 0.067083 +Converged at iteration 26, L1 7.00009e-05, Linf 0.00377884, total time[s] 0.070986 +Converged at iteration 23, L1 9.77371e-05, Linf 0.00303831, total time[s] 0.073429 +Converged at iteration 23, L1 7.86141e-05, Linf 0.00213585, total time[s] 0.062975 +Converged at iteration 27, L1 8.03149e-05, Linf 0.00519005, total time[s] 0.073211 +Converged at iteration 30, L1 6.32703e-05, Linf 0.00415082, total time[s] 0.075994 +Converged at iteration 28, L1 7.40137e-05, Linf 0.00546141, total time[s] 0.070946 +Converged at iteration 32, L1 7.05736e-05, Linf 0.00580635, total time[s] 0.080187 +Converged at iteration 29, L1 7.54141e-05, Linf 0.00203405, total time[s] 0.073489 +Converged at iteration 31, L1 8.38461e-05, Linf 0.0122157, total time[s] 0.078133 +Converged at iteration 31, L1 6.72094e-05, Linf 0.00310625, total time[s] 0.077491 +Converged at iteration 33, L1 7.36316e-05, Linf 0.00413426, total time[s] 0.082976 +Converged at iteration 33, L1 4.21567e-05, Linf 0.00983585, total time[s] 0.08211 +Converged at iteration 40, L1 9.51566e-05, Linf 0.00263298, total time[s] 0.09932 +Converged at iteration 29, L1 7.75831e-05, Linf 0.0197578, total time[s] 0.071894 +Converged at iteration 25, L1 7.96229e-05, Linf 0.0029824, total time[s] 0.061298 +Converged at iteration 38, L1 5.57345e-05, Linf 0.0146999, total time[s] 0.091471 +Converged at iteration 36, L1 7.19628e-05, Linf 0.0180726, total time[s] 0.088378 +Converged at iteration 24, L1 8.21674e-05, Linf 0.00275655, total time[s] 0.059818 +Converged at iteration 27, L1 5.8591e-05, Linf 0.00639598, total time[s] 0.068336 +Converged at iteration 24, L1 6.91109e-05, Linf 0.00764184, total time[s] 0.063617 +Converged at iteration 28, L1 4.78655e-05, Linf 0.00694572, total time[s] 0.07331 +Converged at iteration 22, L1 3.28684e-05, Linf 0.00574232, total time[s] 0.056816 +Converged at iteration 21, L1 5.04362e-05, Linf 0.00275939, total time[s] 0.055873 +Converged at iteration 23, L1 5.49419e-05, Linf 0.00296484, total time[s] 0.06032 +Converged at iteration 25, L1 7.46131e-05, Linf 0.00258107, total time[s] 0.065291 +Converged at iteration 22, L1 5.83774e-05, Linf 0.0023349, total time[s] 0.060269 +Converged at iteration 22, L1 4.81087e-05, Linf 0.00292937, total time[s] 0.062068 +Converged at iteration 33, L1 5.96276e-05, Linf 0.00408345, total time[s] 0.085811 +Converged at iteration 23, L1 7.92725e-05, Linf 0.00556551, total time[s] 0.060127 +Converged at iteration 24, L1 8.35884e-05, Linf 0.00611367, total time[s] 0.064751 +Converged at iteration 26, L1 6.97029e-05, Linf 0.00377979, total time[s] 0.069898 +Converged at iteration 23, L1 9.78671e-05, Linf 0.00303965, total time[s] 0.063127 +Converged at iteration 23, L1 7.88989e-05, Linf 0.00213942, total time[s] 0.063357 +Converged at iteration 27, L1 7.94934e-05, Linf 0.00519164, total time[s] 0.071523 +Converged at iteration 30, L1 6.34403e-05, Linf 0.00414039, total time[s] 0.07719 +Converged at iteration 28, L1 7.42141e-05, Linf 0.00546868, total time[s] 0.071939 +Converged at iteration 32, L1 7.04755e-05, Linf 0.00580959, total time[s] 0.082294 +Converged at iteration 29, L1 7.55175e-05, Linf 0.00203798, total time[s] 0.0739 +Converged at iteration 31, L1 8.39743e-05, Linf 0.0122154, total time[s] 0.078137 +Converged at iteration 31, L1 6.68784e-05, Linf 0.00310631, total time[s] 0.077817 +Converged at iteration 33, L1 7.36135e-05, Linf 0.00413444, total time[s] 0.082434 +Converged at iteration 33, L1 4.22912e-05, Linf 0.00972026, total time[s] 0.082121 +Converged at iteration 34, L1 5.28577e-05, Linf 0.0121628, total time[s] 0.085474 +Converged at iteration 29, L1 7.76119e-05, Linf 0.0197615, total time[s] 0.074378 +Converged at iteration 25, L1 7.94951e-05, Linf 0.00298218, total time[s] 0.066374 +Converged at iteration 38, L1 5.23757e-05, Linf 0.0147918, total time[s] 0.097644 +Converged at iteration 36, L1 7.12364e-05, Linf 0.0176942, total time[s] 0.09521 +Converged at iteration 24, L1 8.21609e-05, Linf 0.00275435, total time[s] 0.067513 +Converged at iteration 27, L1 5.79184e-05, Linf 0.00639563, total time[s] 0.071166 +Converged at iteration 24, L1 6.71544e-05, Linf 0.0076254, total time[s] 0.062496 +Converged at iteration 28, L1 4.78338e-05, Linf 0.00696773, total time[s] 0.071536 +Converged at iteration 22, L1 3.23098e-05, Linf 0.00574093, total time[s] 0.057172 +Converged at iteration 21, L1 5.03883e-05, Linf 0.00275933, total time[s] 0.056035 +Converged at iteration 23, L1 5.49399e-05, Linf 0.00294944, total time[s] 0.063039 +Converged at iteration 25, L1 7.45952e-05, Linf 0.00258156, total time[s] 0.06432 +Converged at iteration 22, L1 5.83747e-05, Linf 0.00233488, total time[s] 0.058333 +Converged at iteration 22, L1 4.7872e-05, Linf 0.00292976, total time[s] 0.057345 +Converged at iteration 33, L1 5.94976e-05, Linf 0.00408533, total time[s] 0.082519 +Converged at iteration 23, L1 7.89216e-05, Linf 0.0055682, total time[s] 0.059571 +Converged at iteration 24, L1 8.298e-05, Linf 0.00633439, total time[s] 0.062351 +Converged at iteration 26, L1 6.94112e-05, Linf 0.00377978, total time[s] 0.066439 +Converged at iteration 23, L1 9.76987e-05, Linf 0.00304051, total time[s] 0.059401 +Converged at iteration 23, L1 7.8066e-05, Linf 0.00214356, total time[s] 0.059506 +Converged at iteration 27, L1 7.95976e-05, Linf 0.00519512, total time[s] 0.068816 +Converged at iteration 30, L1 6.27526e-05, Linf 0.00414845, total time[s] 0.075501 +Converged at iteration 28, L1 7.41397e-05, Linf 0.00546849, total time[s] 0.071808 +Converged at iteration 32, L1 7.08616e-05, Linf 0.00583802, total time[s] 0.080304 +Converged at iteration 29, L1 7.51894e-05, Linf 0.00203687, total time[s] 0.073851 +Converged at iteration 31, L1 8.38075e-05, Linf 0.0122154, total time[s] 0.078291 +Converged at iteration 31, L1 6.6463e-05, Linf 0.00310647, total time[s] 0.077761 +Converged at iteration 33, L1 7.36413e-05, Linf 0.00413396, total time[s] 0.082583 +Converged at iteration 33, L1 4.17493e-05, Linf 0.0101282, total time[s] 0.083194 +Converged at iteration 34, L1 5.2008e-05, Linf 0.0120833, total time[s] 0.086245 +Converged at iteration 29, L1 7.74932e-05, Linf 0.0201473, total time[s] 0.074359 +Converged at iteration 25, L1 7.978e-05, Linf 0.00298207, total time[s] 0.065943 +Converged at iteration 40, L1 6.85267e-05, Linf 0.00367452, total time[s] 0.175026 +Converged at iteration 35, L1 7.61497e-05, Linf 0.00339722, total time[s] 0.215312 +Converged at iteration 30, L1 9.65708e-05, Linf 0.004327, total time[s] 0.122315 +Converged at iteration 31, L1 6.45215e-05, Linf 0.00502562, total time[s] 0.137035 +Converged at iteration 27, L1 6.28479e-05, Linf 0.00499532, total time[s] 0.083862 +Converged at iteration 22, L1 8.62282e-05, Linf 0.00448819, total time[s] 0.102694 +Converged at iteration 20, L1 9.60301e-05, Linf 0.00397838, total time[s] 0.056865 +Converged at iteration 24, L1 8.84816e-05, Linf 0.00482837, total time[s] 0.068173 +Converged at iteration 28, L1 7.41946e-05, Linf 0.00445914, total time[s] 0.077146 +Converged at iteration 26, L1 8.25968e-05, Linf 0.00537165, total time[s] 0.089212 +Converged at iteration 22, L1 7.40703e-05, Linf 0.00508823, total time[s] 0.070082 +Converged at iteration 19, L1 6.64268e-05, Linf 0.00393184, total time[s] 0.077325 +Converged at iteration 30, L1 7.98845e-05, Linf 0.00329632, total time[s] 0.108184 +Converged at iteration 20, L1 8.44323e-05, Linf 0.00455034, total time[s] 0.066283 +Converged at iteration 24, L1 7.17524e-05, Linf 0.00488217, total time[s] 0.092023 +Converged at iteration 31, L1 8.93172e-05, Linf 0.00558723, total time[s] 0.127804 +Converged at iteration 27, L1 9.91486e-05, Linf 0.00569685, total time[s] 0.111536 +Converged at iteration 24, L1 8.7915e-05, Linf 0.00465018, total time[s] 0.099587 +Converged at iteration 23, L1 9.22206e-05, Linf 0.00410195, total time[s] 0.068247 +Converged at iteration 26, L1 7.22017e-05, Linf 0.00449057, total time[s] 0.080814 +Converged at iteration 29, L1 7.81558e-05, Linf 0.00479609, total time[s] 0.083962 +Converged at iteration 34, L1 7.09381e-05, Linf 0.00422684, total time[s] 0.10269 +Converged at iteration 30, L1 9.39445e-05, Linf 0.00443161, total time[s] 0.090614 +Converged at iteration 28, L1 9.50247e-05, Linf 0.00311068, total time[s] 0.081789 +Converged at iteration 32, L1 9.49386e-05, Linf 0.0037416, total time[s] 0.089088 +Converged at iteration 37, L1 7.33829e-05, Linf 0.00325904, total time[s] 0.102795 +Converged at iteration 33, L1 8.46163e-05, Linf 0.00474382, total time[s] 0.093695 +Converged at iteration 28, L1 9.65523e-05, Linf 0.00430177, total time[s] 0.078772 +Converged at iteration 24, L1 8.83085e-05, Linf 0.0032507, total time[s] 0.078547 +Converged at iteration 26, L1 8.98079e-05, Linf 0.00383964, total time[s] 0.089188 +Converged at iteration 40, L1 6.6943e-05, Linf 0.00383068, total time[s] 0.113383 +Converged at iteration 35, L1 8.2363e-05, Linf 0.00351909, total time[s] 0.155703 +Converged at iteration 30, L1 9.61886e-05, Linf 0.00424518, total time[s] 0.094284 +Converged at iteration 31, L1 6.18405e-05, Linf 0.00506587, total time[s] 0.09486 +Converged at iteration 27, L1 6.01547e-05, Linf 0.00494119, total time[s] 0.074922 +Converged at iteration 22, L1 7.71073e-05, Linf 0.00430662, total time[s] 0.061333 +Converged at iteration 21, L1 6.27915e-05, Linf 0.00334451, total time[s] 0.068879 +Converged at iteration 24, L1 9.04133e-05, Linf 0.00488746, total time[s] 0.077439 +Converged at iteration 28, L1 7.46731e-05, Linf 0.00444375, total time[s] 0.081993 +Converged at iteration 26, L1 8.05054e-05, Linf 0.00549579, total time[s] 0.073212 +Converged at iteration 22, L1 7.24364e-05, Linf 0.00483101, total time[s] 0.062291 +Converged at iteration 19, L1 5.91094e-05, Linf 0.00361616, total time[s] 0.076692 +Converged at iteration 30, L1 8.85367e-05, Linf 0.00330311, total time[s] 0.092956 +Converged at iteration 20, L1 8.51661e-05, Linf 0.00465219, total time[s] 0.06126 +Converged at iteration 24, L1 7.16e-05, Linf 0.00468177, total time[s] 0.06954 +Converged at iteration 31, L1 9.37333e-05, Linf 0.00531464, total time[s] 0.089091 +Converged at iteration 27, L1 9.8896e-05, Linf 0.00537991, total time[s] 0.095992 +Converged at iteration 24, L1 8.68171e-05, Linf 0.00451402, total time[s] 0.083245 +Converged at iteration 23, L1 9.25839e-05, Linf 0.00421975, total time[s] 0.071209 +Converged at iteration 26, L1 7.18805e-05, Linf 0.00456706, total time[s] 0.115134 +Converged at iteration 29, L1 7.63847e-05, Linf 0.00485431, total time[s] 0.079454 +Converged at iteration 34, L1 7.85655e-05, Linf 0.00433157, total time[s] 0.098171 +Converged at iteration 31, L1 6.9261e-05, Linf 0.00361741, total time[s] 0.105456 +Converged at iteration 28, L1 9.87104e-05, Linf 0.00323088, total time[s] 0.11789 +Converged at iteration 32, L1 8.69146e-05, Linf 0.00364558, total time[s] 0.091261 +Converged at iteration 36, L1 9.59036e-05, Linf 0.00369353, total time[s] 0.104302 +Converged at iteration 33, L1 8.40662e-05, Linf 0.0047844, total time[s] 0.095457 +Converged at iteration 28, L1 9.37489e-05, Linf 0.00419617, total time[s] 0.078317 +Converged at iteration 24, L1 8.21772e-05, Linf 0.00302045, total time[s] 0.070581 +Converged at iteration 26, L1 8.69626e-05, Linf 0.00389486, total time[s] 0.071407 +Converged at iteration 40, L1 6.77797e-05, Linf 0.00398769, total time[s] 0.115712 +Converged at iteration 35, L1 8.87172e-05, Linf 0.00365323, total time[s] 0.104666 +Converged at iteration 30, L1 9.0641e-05, Linf 0.00417305, total time[s] 0.094493 +Converged at iteration 31, L1 6.16499e-05, Linf 0.00505109, total time[s] 0.090384 +Converged at iteration 26, L1 9.69524e-05, Linf 0.00576123, total time[s] 0.074108 +Converged at iteration 22, L1 6.89844e-05, Linf 0.00411771, total time[s] 0.06863 +Converged at iteration 21, L1 6.52799e-05, Linf 0.00354793, total time[s] 0.065558 +Converged at iteration 24, L1 8.9063e-05, Linf 0.00498791, total time[s] 0.075983 +Converged at iteration 28, L1 7.21213e-05, Linf 0.00442748, total time[s] 0.076802 +Converged at iteration 26, L1 8.03709e-05, Linf 0.00522616, total time[s] 0.070541 +Converged at iteration 22, L1 6.8063e-05, Linf 0.00410251, total time[s] 0.063957 +Converged at iteration 18, L1 9.77565e-05, Linf 0.00399387, total time[s] 0.051336 +Converged at iteration 30, L1 9.86483e-05, Linf 0.00331269, total time[s] 0.08197 +Converged at iteration 20, L1 8.35022e-05, Linf 0.00476715, total time[s] 0.114131 +Converged at iteration 24, L1 7.09228e-05, Linf 0.00499313, total time[s] 0.07902 +Converged at iteration 31, L1 9.5152e-05, Linf 0.0044377, total time[s] 0.120608 +Converged at iteration 27, L1 8.838e-05, Linf 0.00425249, total time[s] 0.091949 +Converged at iteration 24, L1 8.35634e-05, Linf 0.00411307, total time[s] 0.06944 +Converged at iteration 23, L1 9.22041e-05, Linf 0.00437519, total time[s] 0.075319 +Converged at iteration 26, L1 7.09432e-05, Linf 0.00470765, total time[s] 0.086933 +Converged at iteration 29, L1 7.45114e-05, Linf 0.00490116, total time[s] 0.100914 +Converged at iteration 34, L1 8.16145e-05, Linf 0.00373761, total time[s] 0.125448 +Converged at iteration 31, L1 7.34722e-05, Linf 0.00351069, total time[s] 0.11687 +Converged at iteration 29, L1 7.18477e-05, Linf 0.00276302, total time[s] 0.100455 +Converged at iteration 32, L1 8.04833e-05, Linf 0.00350846, total time[s] 0.118773 +Converged at iteration 36, L1 8.27277e-05, Linf 0.00351905, total time[s] 0.126586 +Converged at iteration 33, L1 8.29424e-05, Linf 0.00487852, total time[s] 0.145987 +Converged at iteration 28, L1 9.02577e-05, Linf 0.0041024, total time[s] 0.082934 +Converged at iteration 24, L1 7.96077e-05, Linf 0.00284472, total time[s] 0.088373 +Converged at iteration 26, L1 8.35115e-05, Linf 0.00395866, total time[s] 0.098333 +Converged at iteration 40, L1 6.53003e-05, Linf 0.00427059, total time[s] 0.210609 +Converged at iteration 35, L1 9.94218e-05, Linf 0.00396732, total time[s] 0.106004 +Converged at iteration 29, L1 8.60348e-05, Linf 0.00505096, total time[s] 0.080703 +Converged at iteration 31, L1 6.12327e-05, Linf 0.00504422, total time[s] 0.086765 +Converged at iteration 26, L1 8.81403e-05, Linf 0.00564781, total time[s] 0.074135 +Converged at iteration 21, L1 9.01667e-05, Linf 0.00446956, total time[s] 0.063372 +Converged at iteration 21, L1 6.51142e-05, Linf 0.0040617, total time[s] 0.062287 +Converged at iteration 24, L1 6.92246e-05, Linf 0.00530296, total time[s] 0.075683 +Converged at iteration 28, L1 6.25506e-05, Linf 0.00441014, total time[s] 0.111403 +Converged at iteration 26, L1 7.20369e-05, Linf 0.00375845, total time[s] 0.076485 +Converged at iteration 21, L1 6.8184e-05, Linf 0.00430504, total time[s] 0.057194 +Converged at iteration 18, L1 6.26621e-05, Linf 0.00288943, total time[s] 0.049925 +Converged at iteration 31, L1 7.89025e-05, Linf 0.00270789, total time[s] 0.092217 +Converged at iteration 20, L1 8.08294e-05, Linf 0.00504156, total time[s] 0.05868 +Converged at iteration 24, L1 6.82853e-05, Linf 0.00512872, total time[s] 0.075506 +Converged at iteration 30, L1 7.10328e-05, Linf 0.00296003, total time[s] 0.086921 +Converged at iteration 25, L1 6.4286e-05, Linf 0.00435484, total time[s] 0.068824 +Converged at iteration 22, L1 9.5415e-05, Linf 0.00438887, total time[s] 0.077561 +Converged at iteration 23, L1 9.36231e-05, Linf 0.0046813, total time[s] 0.085491 +Converged at iteration 26, L1 6.76905e-05, Linf 0.00498214, total time[s] 0.075701 +Converged at iteration 29, L1 6.98237e-05, Linf 0.00486181, total time[s] 0.075409 +Converged at iteration 31, L1 8.70375e-05, Linf 0.00390778, total time[s] 0.084766 +Converged at iteration 30, L1 8.0012e-05, Linf 0.00316897, total time[s] 0.093929 +Converged at iteration 29, L1 7.96668e-05, Linf 0.00300395, total time[s] 0.099293 +Converged at iteration 32, L1 7.20303e-05, Linf 0.00331784, total time[s] 0.084754 +Converged at iteration 35, L1 7.03795e-05, Linf 0.00380885, total time[s] 0.098561 +Converged at iteration 33, L1 7.94749e-05, Linf 0.00506287, total time[s] 0.0865 +Converged at iteration 28, L1 8.16756e-05, Linf 0.00393225, total time[s] 0.077736 +Converged at iteration 24, L1 7.83626e-05, Linf 0.00242208, total time[s] 0.065324 +Converged at iteration 26, L1 7.91067e-05, Linf 0.00410648, total time[s] 0.073568 +Converged at iteration 39, L1 9.17197e-05, Linf 0.0057188, total time[s] 0.099922 +Converged at iteration 36, L1 7.3395e-05, Linf 0.00412595, total time[s] 0.095222 +Converged at iteration 26, L1 5.47401e-05, Linf 0.00577441, total time[s] 0.070675 +Converged at iteration 31, L1 6.00893e-05, Linf 0.00509902, total time[s] 0.08356 +Converged at iteration 26, L1 7.05706e-05, Linf 0.00532219, total time[s] 0.087911 +Converged at iteration 21, L1 6.38803e-05, Linf 0.00341304, total time[s] 0.06302 +Converged at iteration 20, L1 5.51481e-05, Linf 0.00447244, total time[s] 0.058744 +Converged at iteration 22, L1 4.42111e-05, Linf 0.00752113, total time[s] 0.062459 +Converged at iteration 26, L1 6.84648e-05, Linf 0.00592421, total time[s] 0.081679 +Converged at iteration 25, L1 6.24382e-05, Linf 0.00405001, total time[s] 0.068655 +Converged at iteration 20, L1 7.8841e-05, Linf 0.00546691, total time[s] 0.060921 +Converged at iteration 17, L1 7.49187e-05, Linf 0.0035754, total time[s] 0.05586 +Converged at iteration 31, L1 9.72228e-05, Linf 0.00280169, total time[s] 0.088222 +Converged at iteration 20, L1 6.21874e-05, Linf 0.00537667, total time[s] 0.057052 +Converged at iteration 23, L1 9.73162e-05, Linf 0.00644298, total time[s] 0.064014 +Converged at iteration 27, L1 8.57176e-05, Linf 0.00516201, total time[s] 0.070562 +Converged at iteration 23, L1 8.33231e-05, Linf 0.00706966, total time[s] 0.06395 +Converged at iteration 21, L1 8.00065e-05, Linf 0.00485896, total time[s] 0.059744 +Converged at iteration 23, L1 7.322e-05, Linf 0.00375497, total time[s] 0.064684 +Converged at iteration 25, L1 9.63703e-05, Linf 0.006303, total time[s] 0.070348 +Converged at iteration 28, L1 9.42946e-05, Linf 0.00549329, total time[s] 0.083097 +Converged at iteration 30, L1 5.87667e-05, Linf 0.00501573, total time[s] 0.088061 +Converged at iteration 28, L1 6.73847e-05, Linf 0.00331717, total time[s] 0.081328 +Converged at iteration 29, L1 8.61655e-05, Linf 0.00342485, total time[s] 0.082531 +Converged at iteration 30, L1 8.74472e-05, Linf 0.00305766, total time[s] 0.083021 +Converged at iteration 30, L1 8.95259e-05, Linf 0.00326275, total time[s] 0.086905 +Converged at iteration 33, L1 7.14377e-05, Linf 0.00542239, total time[s] 0.094172 +Converged at iteration 28, L1 6.41645e-05, Linf 0.00350394, total time[s] 0.075388 +Converged at iteration 24, L1 8.8326e-05, Linf 0.00175216, total time[s] 0.07238 +Converged at iteration 24, L1 8.94173e-05, Linf 0.00467971, total time[s] 0.073433 +Converged at iteration 39, L1 7.12637e-05, Linf 0.00700084, total time[s] 0.102396 +Converged at iteration 36, L1 7.16226e-05, Linf 0.00581501, total time[s] 0.107634 +Converged at iteration 24, L1 6.16009e-05, Linf 0.00286113, total time[s] 0.071964 +Converged at iteration 31, L1 5.78603e-05, Linf 0.00508743, total time[s] 0.082828 +Converged at iteration 25, L1 7.35753e-05, Linf 0.00540467, total time[s] 0.073852 +Converged at iteration 20, L1 9.88541e-05, Linf 0.00429004, total time[s] 0.061342 +Converged at iteration 19, L1 5.87917e-05, Linf 0.00441466, total time[s] 0.06008 +Converged at iteration 20, L1 7.77022e-05, Linf 0.00669274, total time[s] 0.054491 +Converged at iteration 24, L1 5.60093e-05, Linf 0.00384944, total time[s] 0.066681 +Converged at iteration 24, L1 6.54611e-05, Linf 0.00478766, total time[s] 0.069635 +Converged at iteration 20, L1 5.44114e-05, Linf 0.00521576, total time[s] 0.055536 +Converged at iteration 16, L1 9.22949e-05, Linf 0.00350097, total time[s] 0.047187 +Converged at iteration 32, L1 6.82051e-05, Linf 0.00267629, total time[s] 0.082942 +Converged at iteration 19, L1 9.15708e-05, Linf 0.00666485, total time[s] 0.051457 +Converged at iteration 23, L1 7.25286e-05, Linf 0.00622424, total time[s] 0.065852 +Converged at iteration 26, L1 6.69438e-05, Linf 0.00550825, total time[s] 0.074017 +Converged at iteration 23, L1 5.54579e-05, Linf 0.00703765, total time[s] 0.063994 +Converged at iteration 20, L1 6.98744e-05, Linf 0.00498628, total time[s] 0.057492 +Converged at iteration 22, L1 9.66254e-05, Linf 0.00443884, total time[s] 0.059802 +Converged at iteration 25, L1 8.13753e-05, Linf 0.0037604, total time[s] 0.071106 +Converged at iteration 28, L1 7.17327e-05, Linf 0.00375782, total time[s] 0.080371 +Converged at iteration 29, L1 6.61964e-05, Linf 0.00600447, total time[s] 0.081972 +Converged at iteration 27, L1 6.58448e-05, Linf 0.00385183, total time[s] 0.071157 +Converged at iteration 29, L1 7.48352e-05, Linf 0.00398895, total time[s] 0.082302 +Converged at iteration 29, L1 8.48102e-05, Linf 0.00274488, total time[s] 0.075636 +Converged at iteration 28, L1 6.85264e-05, Linf 0.00227477, total time[s] 0.075945 +Converged at iteration 33, L1 5.79412e-05, Linf 0.00605374, total time[s] 0.08446 +Converged at iteration 26, L1 9.38284e-05, Linf 0.00347729, total time[s] 0.073522 +Converged at iteration 25, L1 7.05689e-05, Linf 0.00197706, total time[s] 0.072004 +Converged at iteration 23, L1 6.10129e-05, Linf 0.00274024, total time[s] 0.069654 +Converged at iteration 39, L1 7.00759e-05, Linf 0.00701063, total time[s] 0.122069 +Converged at iteration 36, L1 7.05908e-05, Linf 0.00585335, total time[s] 0.092412 +Converged at iteration 24, L1 6.19772e-05, Linf 0.00283957, total time[s] 0.063282 +Converged at iteration 31, L1 5.69835e-05, Linf 0.00507789, total time[s] 0.080823 +Converged at iteration 25, L1 7.42229e-05, Linf 0.00547919, total time[s] 0.069911 +Converged at iteration 20, L1 9.93215e-05, Linf 0.00432892, total time[s] 0.06791 +Converged at iteration 19, L1 5.74843e-05, Linf 0.00438078, total time[s] 0.059292 +Converged at iteration 20, L1 7.75922e-05, Linf 0.00653523, total time[s] 0.060111 +Converged at iteration 24, L1 5.52389e-05, Linf 0.00400701, total time[s] 0.074818 +Converged at iteration 24, L1 6.77203e-05, Linf 0.0048271, total time[s] 0.069276 +Converged at iteration 20, L1 5.50276e-05, Linf 0.00527435, total time[s] 0.059849 +Converged at iteration 16, L1 9.1513e-05, Linf 0.0036077, total time[s] 0.056315 +Converged at iteration 32, L1 6.86383e-05, Linf 0.00269916, total time[s] 0.095774 +Converged at iteration 19, L1 9.11153e-05, Linf 0.00663132, total time[s] 0.058427 +Converged at iteration 23, L1 7.2325e-05, Linf 0.00642548, total time[s] 0.067629 +Converged at iteration 26, L1 6.6717e-05, Linf 0.00545519, total time[s] 0.070668 +Converged at iteration 23, L1 5.38945e-05, Linf 0.00517692, total time[s] 0.066017 +Converged at iteration 20, L1 6.95638e-05, Linf 0.00492215, total time[s] 0.062002 +Converged at iteration 22, L1 9.68398e-05, Linf 0.00414133, total time[s] 0.062191 +Converged at iteration 25, L1 8.07036e-05, Linf 0.00368095, total time[s] 0.072357 +Converged at iteration 28, L1 7.11169e-05, Linf 0.00365574, total time[s] 0.136789 +Converged at iteration 29, L1 6.58851e-05, Linf 0.00597283, total time[s] 0.089836 +Converged at iteration 27, L1 6.62554e-05, Linf 0.00384914, total time[s] 0.088675 +Converged at iteration 29, L1 7.55432e-05, Linf 0.00400728, total time[s] 0.088987 +Converged at iteration 29, L1 8.40817e-05, Linf 0.00274452, total time[s] 0.078515 +Converged at iteration 28, L1 6.65782e-05, Linf 0.00225801, total time[s] 0.075945 +Converged at iteration 33, L1 5.66907e-05, Linf 0.00605136, total time[s] 0.088484 +Converged at iteration 26, L1 9.50675e-05, Linf 0.0035379, total time[s] 0.083792 +Converged at iteration 25, L1 7.20187e-05, Linf 0.00200821, total time[s] 0.074977 +Converged at iteration 23, L1 6.08483e-05, Linf 0.00273931, total time[s] 0.063999 +Converged at iteration 39, L1 6.89988e-05, Linf 0.00701297, total time[s] 0.10324 +Converged at iteration 36, L1 6.97648e-05, Linf 0.00589489, total time[s] 0.093888 +Converged at iteration 24, L1 6.17541e-05, Linf 0.0028664, total time[s] 0.068313 +Converged at iteration 31, L1 5.63589e-05, Linf 0.00506019, total time[s] 0.079954 +Converged at iteration 25, L1 7.5564e-05, Linf 0.00557498, total time[s] 0.064842 +Converged at iteration 20, L1 9.90887e-05, Linf 0.00435973, total time[s] 0.058785 +Converged at iteration 19, L1 5.6717e-05, Linf 0.0043629, total time[s] 0.052342 +Converged at iteration 20, L1 7.73295e-05, Linf 0.00633134, total time[s] 0.055945 +Converged at iteration 24, L1 5.45415e-05, Linf 0.00409057, total time[s] 0.068602 +Converged at iteration 24, L1 6.77793e-05, Linf 0.00487695, total time[s] 0.065733 +Converged at iteration 20, L1 5.5582e-05, Linf 0.00529289, total time[s] 0.054208 +Converged at iteration 16, L1 9.05261e-05, Linf 0.00371242, total time[s] 0.044322 +Converged at iteration 32, L1 6.8154e-05, Linf 0.00271736, total time[s] 0.092797 +Converged at iteration 19, L1 9.14746e-05, Linf 0.0066049, total time[s] 0.051457 +Converged at iteration 23, L1 7.22963e-05, Linf 0.0063488, total time[s] 0.063838 +Converged at iteration 26, L1 6.66252e-05, Linf 0.00543856, total time[s] 0.079595 +Converged at iteration 23, L1 5.3652e-05, Linf 0.00516062, total time[s] 0.062931 +Converged at iteration 20, L1 7.00126e-05, Linf 0.00492251, total time[s] 0.05403 +Converged at iteration 22, L1 9.83279e-05, Linf 0.00428446, total time[s] 0.059627 +Converged at iteration 25, L1 8.09891e-05, Linf 0.00362314, total time[s] 0.07103 +Converged at iteration 28, L1 7.12215e-05, Linf 0.00357503, total time[s] 0.07641 +Converged at iteration 29, L1 6.88218e-05, Linf 0.00710738, total time[s] 0.088024 +Converged at iteration 27, L1 6.69708e-05, Linf 0.00386691, total time[s] 0.086925 +Converged at iteration 29, L1 7.71179e-05, Linf 0.00402964, total time[s] 0.087339 +Converged at iteration 29, L1 8.62294e-05, Linf 0.00275136, total time[s] 0.116621 +Converged at iteration 28, L1 6.85758e-05, Linf 0.00223869, total time[s] 0.080337 +Converged at iteration 32, L1 9.89415e-05, Linf 0.00723749, total time[s] 0.088744 +Converged at iteration 26, L1 9.55709e-05, Linf 0.0036089, total time[s] 0.071328 +Converged at iteration 25, L1 7.44782e-05, Linf 0.00206625, total time[s] 0.071257 +Converged at iteration 23, L1 6.07512e-05, Linf 0.00266016, total time[s] 0.063949 +Converged at iteration 39, L1 6.88543e-05, Linf 0.00700626, total time[s] 0.112913 +Converged at iteration 36, L1 6.88075e-05, Linf 0.0059319, total time[s] 0.105954 +Converged at iteration 24, L1 6.20097e-05, Linf 0.00286302, total time[s] 0.066815 +Converged at iteration 30, L1 9.96382e-05, Linf 0.00621053, total time[s] 0.079424 +Converged at iteration 25, L1 7.76019e-05, Linf 0.00574606, total time[s] 0.067477 +Converged at iteration 20, L1 9.96714e-05, Linf 0.00435783, total time[s] 0.066146 +Converged at iteration 19, L1 5.57968e-05, Linf 0.00436391, total time[s] 0.056177 +Converged at iteration 20, L1 7.67337e-05, Linf 0.00635429, total time[s] 0.055314 +Converged at iteration 24, L1 5.38393e-05, Linf 0.00366607, total time[s] 0.077424 +Converged at iteration 24, L1 6.86001e-05, Linf 0.00496803, total time[s] 0.093879 +Converged at iteration 20, L1 5.72593e-05, Linf 0.00534473, total time[s] 0.065813 +Converged at iteration 16, L1 9.03344e-05, Linf 0.0038307, total time[s] 0.053093 +Converged at iteration 32, L1 6.79607e-05, Linf 0.00273783, total time[s] 0.110384 +Converged at iteration 19, L1 9.14973e-05, Linf 0.00655607, total time[s] 0.06972 +Converged at iteration 23, L1 7.23792e-05, Linf 0.00625605, total time[s] 0.071188 +Converged at iteration 26, L1 6.7155e-05, Linf 0.00540667, total time[s] 0.09406 +Converged at iteration 23, L1 5.33109e-05, Linf 0.00513858, total time[s] 0.065929 +Converged at iteration 20, L1 7.05291e-05, Linf 0.00492557, total time[s] 0.058737 +Converged at iteration 23, L1 6.34072e-05, Linf 0.00275443, total time[s] 0.063479 +Converged at iteration 25, L1 8.08623e-05, Linf 0.00356682, total time[s] 0.074235 +Converged at iteration 28, L1 7.13753e-05, Linf 0.00347444, total time[s] 0.095537 +Converged at iteration 29, L1 6.74364e-05, Linf 0.00605606, total time[s] 0.106743 +Converged at iteration 27, L1 6.72632e-05, Linf 0.00388177, total time[s] 0.090231 +Converged at iteration 29, L1 7.82643e-05, Linf 0.00411671, total time[s] 0.10441 +Converged at iteration 29, L1 8.52489e-05, Linf 0.00275748, total time[s] 0.088513 +Converged at iteration 28, L1 6.67742e-05, Linf 0.00221622, total time[s] 0.080807 +Converged at iteration 32, L1 9.73344e-05, Linf 0.00723322, total time[s] 0.088444 +Converged at iteration 26, L1 9.7593e-05, Linf 0.00375463, total time[s] 0.0705 +Converged at iteration 25, L1 7.49289e-05, Linf 0.00212545, total time[s] 0.074323 +Converged at iteration 23, L1 6.14073e-05, Linf 0.00258244, total time[s] 0.084453 +Converged at iteration 39, L1 6.67988e-05, Linf 0.00699089, total time[s] 0.107963 +Converged at iteration 36, L1 6.71122e-05, Linf 0.00596448, total time[s] 0.133454 +Converged at iteration 24, L1 6.23586e-05, Linf 0.00278875, total time[s] 0.065358 +Converged at iteration 30, L1 9.82691e-05, Linf 0.00618087, total time[s] 0.086922 +Converged at iteration 25, L1 8.16441e-05, Linf 0.00599794, total time[s] 0.067793 +Converged at iteration 21, L1 5.90815e-05, Linf 0.00385139, total time[s] 0.079188 +Converged at iteration 19, L1 5.53243e-05, Linf 0.00437795, total time[s] 0.071227 +Converged at iteration 20, L1 7.57652e-05, Linf 0.00675316, total time[s] 0.077276 +Converged at iteration 24, L1 5.27292e-05, Linf 0.00315989, total time[s] 0.078101 +Converged at iteration 24, L1 7.30535e-05, Linf 0.00510515, total time[s] 0.086288 +Converged at iteration 20, L1 5.9938e-05, Linf 0.00542527, total time[s] 0.056463 +Converged at iteration 16, L1 9.0014e-05, Linf 0.0039778, total time[s] 0.045591 +Converged at iteration 32, L1 6.62631e-05, Linf 0.00275711, total time[s] 0.090632 +Converged at iteration 19, L1 9.18154e-05, Linf 0.00648719, total time[s] 0.065714 +Converged at iteration 23, L1 7.21184e-05, Linf 0.00614401, total time[s] 0.084737 +Converged at iteration 26, L1 6.78592e-05, Linf 0.00538715, total time[s] 0.089376 +Converged at iteration 23, L1 5.29145e-05, Linf 0.00512163, total time[s] 0.097829 +Converged at iteration 20, L1 7.13783e-05, Linf 0.00495027, total time[s] 0.070858 +Converged at iteration 23, L1 6.53645e-05, Linf 0.00272085, total time[s] 0.086779 +Converged at iteration 25, L1 8.15075e-05, Linf 0.00351207, total time[s] 0.110791 +Converged at iteration 28, L1 7.23598e-05, Linf 0.00345715, total time[s] 0.090457 +Converged at iteration 29, L1 6.89622e-05, Linf 0.00611732, total time[s] 0.076786 +Converged at iteration 27, L1 6.86446e-05, Linf 0.00390043, total time[s] 0.082914 +Converged at iteration 29, L1 7.88518e-05, Linf 0.00413123, total time[s] 0.091682 +Converged at iteration 29, L1 8.5741e-05, Linf 0.00276381, total time[s] 0.078362 +Converged at iteration 28, L1 6.71562e-05, Linf 0.00218446, total time[s] 0.078921 +Converged at iteration 32, L1 9.56843e-05, Linf 0.00721254, total time[s] 0.088157 +Converged at iteration 27, L1 6.04774e-05, Linf 0.00339485, total time[s] 0.076145 +Converged at iteration 25, L1 7.57304e-05, Linf 0.00219216, total time[s] 0.074989 +Converged at iteration 23, L1 6.17974e-05, Linf 0.00252732, total time[s] 0.074317 +Converged at iteration 39, L1 6.69103e-05, Linf 0.0069864, total time[s] 0.113083 +Converged at iteration 36, L1 6.70826e-05, Linf 0.00596418, total time[s] 0.100166 +Converged at iteration 24, L1 6.23658e-05, Linf 0.0027873, total time[s] 0.065028 +Converged at iteration 30, L1 9.80666e-05, Linf 0.00618089, total time[s] 0.078894 +Converged at iteration 25, L1 8.16389e-05, Linf 0.00599746, total time[s] 0.067761 +Converged at iteration 21, L1 5.91121e-05, Linf 0.00385162, total time[s] 0.074112 +Converged at iteration 19, L1 5.5321e-05, Linf 0.00437798, total time[s] 0.073058 +Converged at iteration 20, L1 7.57194e-05, Linf 0.00675261, total time[s] 0.061567 +Converged at iteration 24, L1 5.27464e-05, Linf 0.0031596, total time[s] 0.080629 +Converged at iteration 24, L1 7.14028e-05, Linf 0.0051049, total time[s] 0.069493 +Converged at iteration 20, L1 5.993e-05, Linf 0.00542515, total time[s] 0.056346 +Converged at iteration 16, L1 8.99964e-05, Linf 0.00397735, total time[s] 0.045055 +Converged at iteration 32, L1 6.62595e-05, Linf 0.00275705, total time[s] 0.095754 +Converged at iteration 19, L1 9.18233e-05, Linf 0.0064876, total time[s] 0.053047 +Converged at iteration 23, L1 7.21227e-05, Linf 0.00614436, total time[s] 0.068855 +Converged at iteration 26, L1 6.78656e-05, Linf 0.00538737, total time[s] 0.072089 +Converged at iteration 23, L1 5.29007e-05, Linf 0.00511939, total time[s] 0.065262 +Converged at iteration 20, L1 7.13903e-05, Linf 0.00495479, total time[s] 0.057763 +Converged at iteration 23, L1 6.55955e-05, Linf 0.00279869, total time[s] 0.070717 +Converged at iteration 25, L1 8.18444e-05, Linf 0.00361391, total time[s] 0.072296 +Converged at iteration 28, L1 7.23612e-05, Linf 0.00346155, total time[s] 0.083064 +Converged at iteration 29, L1 6.89536e-05, Linf 0.00609853, total time[s] 0.079689 +Converged at iteration 27, L1 6.88099e-05, Linf 0.00390112, total time[s] 0.087573 +Converged at iteration 29, L1 7.91433e-05, Linf 0.00413121, total time[s] 0.078111 +Converged at iteration 29, L1 8.57475e-05, Linf 0.00276378, total time[s] 0.075832 +Converged at iteration 28, L1 6.74992e-05, Linf 0.0021845, total time[s] 0.075706 +Converged at iteration 32, L1 9.56722e-05, Linf 0.00721223, total time[s] 0.087321 +Converged at iteration 27, L1 6.05149e-05, Linf 0.00339434, total time[s] 0.083812 +Converged at iteration 25, L1 7.58242e-05, Linf 0.00219109, total time[s] 0.073238 +Converged at iteration 23, L1 6.18256e-05, Linf 0.00253585, total time[s] 0.065675 +Converged at iteration 39, L1 6.68323e-05, Linf 0.00698742, total time[s] 0.138067 +Converged at iteration 36, L1 6.70711e-05, Linf 0.0059643, total time[s] 0.098529 +Converged at iteration 24, L1 6.23598e-05, Linf 0.00278732, total time[s] 0.067017 +Converged at iteration 30, L1 9.79915e-05, Linf 0.00618089, total time[s] 0.079838 +Converged at iteration 25, L1 8.17178e-05, Linf 0.0059977, total time[s] 0.084001 +Converged at iteration 21, L1 5.91067e-05, Linf 0.00385157, total time[s] 0.061066 +Converged at iteration 19, L1 5.53235e-05, Linf 0.00437797, total time[s] 0.055266 +Converged at iteration 20, L1 7.57223e-05, Linf 0.00675296, total time[s] 0.074856 +Converged at iteration 24, L1 5.27493e-05, Linf 0.0031597, total time[s] 0.075722 +Converged at iteration 24, L1 7.14052e-05, Linf 0.00510502, total time[s] 0.080731 +Converged at iteration 20, L1 5.99328e-05, Linf 0.00542521, total time[s] 0.058183 +Converged at iteration 16, L1 8.99977e-05, Linf 0.00397751, total time[s] 0.044232 +Converged at iteration 32, L1 6.6259e-05, Linf 0.00275708, total time[s] 0.085372 +Converged at iteration 19, L1 9.18216e-05, Linf 0.00648755, total time[s] 0.052902 +Converged at iteration 23, L1 7.20206e-05, Linf 0.00616416, total time[s] 0.059414 +Converged at iteration 26, L1 6.78644e-05, Linf 0.00538706, total time[s] 0.074184 +Converged at iteration 23, L1 5.29204e-05, Linf 0.00512212, total time[s] 0.063933 +Converged at iteration 20, L1 7.13902e-05, Linf 0.00495003, total time[s] 0.05691 +Converged at iteration 23, L1 6.53663e-05, Linf 0.00272089, total time[s] 0.073345 +Converged at iteration 25, L1 8.1793e-05, Linf 0.00350973, total time[s] 0.081826 +Converged at iteration 28, L1 7.24239e-05, Linf 0.00345835, total time[s] 0.079429 +Converged at iteration 29, L1 6.89465e-05, Linf 0.00609927, total time[s] 0.079569 +Converged at iteration 27, L1 6.86403e-05, Linf 0.00387068, total time[s] 0.072453 +Converged at iteration 29, L1 7.90515e-05, Linf 0.00412165, total time[s] 0.08574 +Converged at iteration 29, L1 8.5746e-05, Linf 0.00276379, total time[s] 0.079238 +Converged at iteration 28, L1 6.71608e-05, Linf 0.00218448, total time[s] 0.077746 +Converged at iteration 32, L1 9.57349e-05, Linf 0.00721232, total time[s] 0.091555 +Converged at iteration 27, L1 6.00056e-05, Linf 0.00339349, total time[s] 0.073775 +Converged at iteration 25, L1 7.55758e-05, Linf 0.00219258, total time[s] 0.076068 +Converged at iteration 23, L1 6.18761e-05, Linf 0.00248415, total time[s] 0.067346 +Converged at iteration 39, L1 6.68203e-05, Linf 0.00698839, total time[s] 0.102212 +Converged at iteration 36, L1 6.83309e-05, Linf 0.00589978, total time[s] 0.122532 +Converged at iteration 24, L1 6.23636e-05, Linf 0.00278809, total time[s] 0.070358 +Converged at iteration 30, L1 9.80268e-05, Linf 0.00622088, total time[s] 0.083036 +Converged at iteration 25, L1 8.18807e-05, Linf 0.00599776, total time[s] 0.081343 +Converged at iteration 21, L1 5.91072e-05, Linf 0.00385139, total time[s] 0.062904 +Converged at iteration 19, L1 5.53244e-05, Linf 0.00437795, total time[s] 0.054951 +Converged at iteration 20, L1 7.57261e-05, Linf 0.00675294, total time[s] 0.057159 +Converged at iteration 24, L1 5.27316e-05, Linf 0.00315985, total time[s] 0.069152 +Converged at iteration 24, L1 7.14231e-05, Linf 0.00510509, total time[s] 0.069359 +Converged at iteration 20, L1 5.99329e-05, Linf 0.00542524, total time[s] 0.058386 +Converged at iteration 16, L1 8.99921e-05, Linf 0.00397758, total time[s] 0.045732 +Converged at iteration 32, L1 6.62531e-05, Linf 0.0027571, total time[s] 0.099497 +Converged at iteration 19, L1 9.17665e-05, Linf 0.00624411, total time[s] 0.060464 +Converged at iteration 23, L1 7.23933e-05, Linf 0.00619302, total time[s] 0.065281 +Converged at iteration 26, L1 6.78764e-05, Linf 0.00539349, total time[s] 0.082955 +Converged at iteration 23, L1 5.38561e-05, Linf 0.0064397, total time[s] 0.063222 +Converged at iteration 20, L1 7.13586e-05, Linf 0.00495011, total time[s] 0.061641 +Converged at iteration 23, L1 6.53273e-05, Linf 0.00272088, total time[s] 0.063112 +Converged at iteration 25, L1 8.16656e-05, Linf 0.00362362, total time[s] 0.068886 +Converged at iteration 28, L1 7.23917e-05, Linf 0.00345794, total time[s] 0.077241 +Converged at iteration 29, L1 6.89794e-05, Linf 0.00611632, total time[s] 0.082783 +Converged at iteration 27, L1 6.86493e-05, Linf 0.00393763, total time[s] 0.072381 +Converged at iteration 29, L1 7.88606e-05, Linf 0.00413121, total time[s] 0.077941 +Converged at iteration 29, L1 8.57509e-05, Linf 0.0027638, total time[s] 0.07722 +Converged at iteration 28, L1 6.71741e-05, Linf 0.00218446, total time[s] 0.072896 +Converged at iteration 32, L1 9.58815e-05, Linf 0.0072121, total time[s] 0.08441 +Converged at iteration 27, L1 6.08105e-05, Linf 0.00339466, total time[s] 0.078088 +Converged at iteration 25, L1 7.55739e-05, Linf 0.00219232, total time[s] 0.067342 +Converged at iteration 23, L1 6.18022e-05, Linf 0.00253572, total time[s] 0.061462 +Converged at iteration 39, L1 6.68127e-05, Linf 0.00698687, total time[s] 0.107123 +Converged at iteration 36, L1 6.76178e-05, Linf 0.0059643, total time[s] 0.104309 +Converged at iteration 24, L1 6.23766e-05, Linf 0.00278722, total time[s] 0.069765 +Converged at iteration 30, L1 9.79906e-05, Linf 0.00618087, total time[s] 0.083511 +Converged at iteration 25, L1 8.16443e-05, Linf 0.00599775, total time[s] 0.069516 +Converged at iteration 21, L1 5.92816e-05, Linf 0.00385162, total time[s] 0.062291 +Converged at iteration 19, L1 5.58105e-05, Linf 0.00433502, total time[s] 0.054108 +Converged at iteration 20, L1 7.57329e-05, Linf 0.00675316, total time[s] 0.06748 +Converged at iteration 24, L1 5.27638e-05, Linf 0.00315883, total time[s] 0.084681 +Converged at iteration 24, L1 7.15423e-05, Linf 0.00511136, total time[s] 0.080101 +Converged at iteration 20, L1 5.99334e-05, Linf 0.00542525, total time[s] 0.058274 +Converged at iteration 16, L1 8.99953e-05, Linf 0.00397764, total time[s] 0.056396 +Converged at iteration 32, L1 6.62596e-05, Linf 0.00275707, total time[s] 0.111998 +Converged at iteration 19, L1 9.18057e-05, Linf 0.0064871, total time[s] 0.055246 +Converged at iteration 23, L1 7.30729e-05, Linf 0.00597707, total time[s] 0.06558 +Converged at iteration 26, L1 6.79468e-05, Linf 0.00538731, total time[s] 0.074941 +Converged at iteration 23, L1 5.2927e-05, Linf 0.00512233, total time[s] 0.067886 +Converged at iteration 20, L1 7.14209e-05, Linf 0.00495025, total time[s] 0.065838 +Converged at iteration 23, L1 6.53738e-05, Linf 0.00272091, total time[s] 0.079015 +Converged at iteration 25, L1 8.16172e-05, Linf 0.00351023, total time[s] 0.069987 +Converged at iteration 28, L1 7.23592e-05, Linf 0.00345719, total time[s] 0.077692 +Converged at iteration 29, L1 6.8902e-05, Linf 0.00607256, total time[s] 0.079066 +Converged at iteration 27, L1 6.86989e-05, Linf 0.00390034, total time[s] 0.072831 +Converged at iteration 29, L1 7.92831e-05, Linf 0.00413105, total time[s] 0.086084 +Converged at iteration 29, L1 8.61254e-05, Linf 0.0027638, total time[s] 0.084023 +Converged at iteration 28, L1 6.83766e-05, Linf 0.00218446, total time[s] 0.090805 +Converged at iteration 32, L1 9.57263e-05, Linf 0.00712665, total time[s] 0.0881 +Converged at iteration 27, L1 6.04878e-05, Linf 0.00343788, total time[s] 0.075437 +Converged at iteration 25, L1 7.55452e-05, Linf 0.00219336, total time[s] 0.069104 +Converged at iteration 23, L1 6.17788e-05, Linf 0.00249482, total time[s] 0.060974 +Converged at iteration 39, L1 6.69293e-05, Linf 0.00698379, total time[s] 0.100243 +Converged at iteration 36, L1 6.70673e-05, Linf 0.00596447, total time[s] 0.098994 +Converged at iteration 24, L1 6.23689e-05, Linf 0.00278744, total time[s] 0.066066 +Converged at iteration 30, L1 9.79886e-05, Linf 0.00618088, total time[s] 0.07754 +Converged at iteration 25, L1 8.16553e-05, Linf 0.00608178, total time[s] 0.066052 +Converged at iteration 21, L1 5.92701e-05, Linf 0.00385142, total time[s] 0.058265 +Converged at iteration 19, L1 5.53067e-05, Linf 0.00437794, total time[s] 0.059945 +Converged at iteration 20, L1 7.57335e-05, Linf 0.00675304, total time[s] 0.055297 +Converged at iteration 24, L1 5.274e-05, Linf 0.00315911, total time[s] 0.064924 +Converged at iteration 24, L1 7.1406e-05, Linf 0.00509478, total time[s] 0.065933 +Converged at iteration 20, L1 5.99344e-05, Linf 0.00542525, total time[s] 0.058868 +Converged at iteration 16, L1 8.99924e-05, Linf 0.00397766, total time[s] 0.045646 +Converged at iteration 32, L1 6.62888e-05, Linf 0.00275718, total time[s] 0.08398 +Converged at iteration 19, L1 9.18252e-05, Linf 0.0064875, total time[s] 0.051945 +Converged at iteration 23, L1 7.21276e-05, Linf 0.00614427, total time[s] 0.065632 +Converged at iteration 26, L1 6.78525e-05, Linf 0.00538607, total time[s] 0.072554 +Converged at iteration 23, L1 5.29133e-05, Linf 0.00512289, total time[s] 0.065948 +Converged at iteration 20, L1 7.13725e-05, Linf 0.00495019, total time[s] 0.058915 +Converged at iteration 23, L1 6.53599e-05, Linf 0.00270742, total time[s] 0.065444 +Converged at iteration 25, L1 8.16088e-05, Linf 0.00351007, total time[s] 0.083848 +Converged at iteration 28, L1 7.23486e-05, Linf 0.00345714, total time[s] 0.088907 +Converged at iteration 29, L1 6.89621e-05, Linf 0.00609953, total time[s] 0.079104 +Converged at iteration 27, L1 6.86486e-05, Linf 0.00389967, total time[s] 0.076977 +Converged at iteration 29, L1 7.87585e-05, Linf 0.00412329, total time[s] 0.083401 +Converged at iteration 29, L1 8.57645e-05, Linf 0.00276381, total time[s] 0.085327 +Converged at iteration 28, L1 6.72148e-05, Linf 0.00218442, total time[s] 0.074496 +Converged at iteration 32, L1 9.57567e-05, Linf 0.00721415, total time[s] 0.084411 +Converged at iteration 27, L1 6.09055e-05, Linf 0.00339312, total time[s] 0.071405 +Converged at iteration 25, L1 7.58273e-05, Linf 0.00219163, total time[s] 0.068785 +Converged at iteration 23, L1 6.18042e-05, Linf 0.0025359, total time[s] 0.063792 +Converged at iteration 39, L1 6.68114e-05, Linf 0.00698758, total time[s] 0.104807 +Converged at iteration 36, L1 6.70737e-05, Linf 0.00596751, total time[s] 0.104919 +Converged at iteration 24, L1 6.25426e-05, Linf 0.00278754, total time[s] 0.065659 +Converged at iteration 30, L1 9.8267e-05, Linf 0.00618086, total time[s] 0.092034 +Converged at iteration 25, L1 8.1736e-05, Linf 0.00599774, total time[s] 0.075926 +Converged at iteration 21, L1 5.90813e-05, Linf 0.00385085, total time[s] 0.088376 +Converged at iteration 19, L1 5.54682e-05, Linf 0.00437795, total time[s] 0.055598 +Converged at iteration 20, L1 7.57429e-05, Linf 0.00675308, total time[s] 0.054828 +Converged at iteration 24, L1 5.27312e-05, Linf 0.00315992, total time[s] 0.064863 +Converged at iteration 24, L1 7.1417e-05, Linf 0.00510514, total time[s] 0.074451 +Converged at iteration 20, L1 5.99309e-05, Linf 0.00542525, total time[s] 0.059807 +Converged at iteration 16, L1 8.99983e-05, Linf 0.00397767, total time[s] 0.043629 +Converged at iteration 32, L1 6.62581e-05, Linf 0.00275712, total time[s] 0.094239 +Converged at iteration 19, L1 9.18211e-05, Linf 0.00648756, total time[s] 0.051217 +Converged at iteration 23, L1 7.21242e-05, Linf 0.00614414, total time[s] 0.067966 +Converged at iteration 26, L1 6.79716e-05, Linf 0.00538659, total time[s] 0.079718 +Converged at iteration 23, L1 5.29222e-05, Linf 0.00511849, total time[s] 0.075386 +Converged at iteration 20, L1 7.13461e-05, Linf 0.00495006, total time[s] 0.057726 +Converged at iteration 23, L1 6.53571e-05, Linf 0.00272084, total time[s] 0.063711 +Converged at iteration 25, L1 8.17989e-05, Linf 0.00347882, total time[s] 0.073483 +Converged at iteration 28, L1 7.24539e-05, Linf 0.00345891, total time[s] 0.095558 +Converged at iteration 29, L1 6.97201e-05, Linf 0.00609821, total time[s] 0.077885 +Converged at iteration 27, L1 6.87072e-05, Linf 0.00390031, total time[s] 0.071389 +Converged at iteration 29, L1 7.88548e-05, Linf 0.00413123, total time[s] 0.083472 +Converged at iteration 29, L1 8.70267e-05, Linf 0.00276374, total time[s] 0.078536 +Converged at iteration 28, L1 6.7581e-05, Linf 0.00218446, total time[s] 0.077109 +Converged at iteration 32, L1 9.56842e-05, Linf 0.00721266, total time[s] 0.086969 +Converged at iteration 27, L1 6.02714e-05, Linf 0.00339437, total time[s] 0.07056 +Converged at iteration 25, L1 7.55709e-05, Linf 0.00219221, total time[s] 0.066333 +Converged at iteration 23, L1 6.17758e-05, Linf 0.00253479, total time[s] 0.064928 +Converged at iteration 39, L1 6.6812e-05, Linf 0.00698729, total time[s] 0.102642 +Converged at iteration 36, L1 6.7037e-05, Linf 0.00579124, total time[s] 0.141262 +Converged at iteration 24, L1 6.23976e-05, Linf 0.00283537, total time[s] 0.067534 +Converged at iteration 30, L1 9.79904e-05, Linf 0.00618087, total time[s] 0.081972 +Converged at iteration 25, L1 8.16432e-05, Linf 0.00599793, total time[s] 0.067279 +Converged at iteration 21, L1 5.99845e-05, Linf 0.0038513, total time[s] 0.060394 +Converged at iteration 19, L1 5.53199e-05, Linf 0.004378, total time[s] 0.058507 +Converged at iteration 20, L1 7.5727e-05, Linf 0.00675306, total time[s] 0.061525 +Converged at iteration 24, L1 5.27321e-05, Linf 0.00315992, total time[s] 0.067977 +Converged at iteration 24, L1 7.14088e-05, Linf 0.00510514, total time[s] 0.073108 +Converged at iteration 20, L1 5.9937e-05, Linf 0.00542526, total time[s] 0.066492 +Converged at iteration 16, L1 8.99955e-05, Linf 0.00397768, total time[s] 0.049342 +Converged at iteration 32, L1 6.63105e-05, Linf 0.00275728, total time[s] 0.103889 +Converged at iteration 19, L1 9.18651e-05, Linf 0.00648752, total time[s] 0.061873 +Converged at iteration 23, L1 7.21917e-05, Linf 0.00588843, total time[s] 0.096522 +Converged at iteration 26, L1 6.78934e-05, Linf 0.00538796, total time[s] 0.078854 +Converged at iteration 23, L1 5.41377e-05, Linf 0.00512046, total time[s] 0.067332 +Converged at iteration 20, L1 7.13504e-05, Linf 0.00494992, total time[s] 0.073763 +Converged at iteration 23, L1 6.53693e-05, Linf 0.00272085, total time[s] 0.080885 +Converged at iteration 25, L1 8.16148e-05, Linf 0.00350995, total time[s] 0.08652 +Converged at iteration 28, L1 7.23612e-05, Linf 0.00345718, total time[s] 0.085409 +Converged at iteration 29, L1 6.89713e-05, Linf 0.00609953, total time[s] 0.086252 +Converged at iteration 27, L1 6.86451e-05, Linf 0.00390029, total time[s] 0.072317 +Converged at iteration 29, L1 7.93324e-05, Linf 0.00413125, total time[s] 0.076612 +Converged at iteration 29, L1 8.60706e-05, Linf 0.00276381, total time[s] 0.084388 +Converged at iteration 28, L1 6.74307e-05, Linf 0.00218446, total time[s] 0.074335 +Converged at iteration 32, L1 9.57026e-05, Linf 0.00721249, total time[s] 0.087263 +Converged at iteration 27, L1 6.07714e-05, Linf 0.00340432, total time[s] 0.078631 +Converged at iteration 25, L1 7.55765e-05, Linf 0.00219261, total time[s] 0.069125 +Converged at iteration 23, L1 6.17935e-05, Linf 0.00249716, total time[s] 0.061642 +Converged at iteration 39, L1 6.68243e-05, Linf 0.00698765, total time[s] 0.102404 +Converged at iteration 36, L1 6.70728e-05, Linf 0.00596786, total time[s] 0.106401 +Converged at iteration 24, L1 6.23727e-05, Linf 0.00278731, total time[s] 0.071072 +Converged at iteration 30, L1 9.80728e-05, Linf 0.00618089, total time[s] 0.078033 +Converged at iteration 25, L1 8.16353e-05, Linf 0.00592554, total time[s] 0.066244 +Converged at iteration 21, L1 5.9202e-05, Linf 0.00385139, total time[s] 0.056566 +Converged at iteration 19, L1 5.53374e-05, Linf 0.00438067, total time[s] 0.057395 +Converged at iteration 20, L1 7.57244e-05, Linf 0.00675323, total time[s] 0.06245 +Converged at iteration 24, L1 5.27313e-05, Linf 0.00316005, total time[s] 0.076732 +Converged at iteration 24, L1 7.14047e-05, Linf 0.00507957, total time[s] 0.07177 +Converged at iteration 20, L1 5.99455e-05, Linf 0.00542533, total time[s] 0.066946 +Converged at iteration 16, L1 8.99943e-05, Linf 0.00392182, total time[s] 0.046973 +Converged at iteration 32, L1 6.62566e-05, Linf 0.00275702, total time[s] 0.087202 +Converged at iteration 19, L1 9.22086e-05, Linf 0.00648774, total time[s] 0.054161 +Converged at iteration 23, L1 7.20432e-05, Linf 0.00614434, total time[s] 0.064299 +Converged at iteration 26, L1 6.80334e-05, Linf 0.00538645, total time[s] 0.078484 +Converged at iteration 23, L1 5.29664e-05, Linf 0.00512192, total time[s] 0.074531 +Converged at iteration 20, L1 7.13685e-05, Linf 0.00495018, total time[s] 0.054435 +Converged at iteration 23, L1 6.56155e-05, Linf 0.00272083, total time[s] 0.063366 +Converged at iteration 25, L1 8.16343e-05, Linf 0.0036129, total time[s] 0.072844 +Converged at iteration 28, L1 7.23929e-05, Linf 0.00361061, total time[s] 0.077508 +Converged at iteration 29, L1 6.89509e-05, Linf 0.00609913, total time[s] 0.115131 +Converged at iteration 27, L1 6.86464e-05, Linf 0.00390035, total time[s] 0.07328 +Converged at iteration 29, L1 7.88579e-05, Linf 0.00413123, total time[s] 0.087129 +Converged at iteration 29, L1 8.59139e-05, Linf 0.0027638, total time[s] 0.080879 +Converged at iteration 28, L1 6.71588e-05, Linf 0.00218446, total time[s] 0.074581 +Converged at iteration 32, L1 9.56756e-05, Linf 0.00721266, total time[s] 0.083645 +Converged at iteration 27, L1 6.04769e-05, Linf 0.00343772, total time[s] 0.082971 +Converged at iteration 25, L1 7.55604e-05, Linf 0.00219264, total time[s] 0.076265 +Converged at iteration 23, L1 6.18004e-05, Linf 0.00253567, total time[s] 0.066099 +Converged at iteration 39, L1 6.68092e-05, Linf 0.00698767, total time[s] 0.100622 +Converged at iteration 36, L1 6.71132e-05, Linf 0.00596418, total time[s] 0.099595 +Converged at iteration 24, L1 6.23769e-05, Linf 0.00278734, total time[s] 0.065838 +Converged at iteration 30, L1 9.81663e-05, Linf 0.00618087, total time[s] 0.08269 +Converged at iteration 25, L1 8.16454e-05, Linf 0.00599786, total time[s] 0.072137 +Converged at iteration 21, L1 5.93206e-05, Linf 0.00385145, total time[s] 0.065901 +Converged at iteration 19, L1 5.53106e-05, Linf 0.004378, total time[s] 0.062678 +Converged at iteration 20, L1 7.57415e-05, Linf 0.00675305, total time[s] 0.064855 +Converged at iteration 24, L1 5.27355e-05, Linf 0.00316009, total time[s] 0.077631 +Converged at iteration 24, L1 7.20529e-05, Linf 0.00510514, total time[s] 0.069176 +Converged at iteration 20, L1 6.01665e-05, Linf 0.00542526, total time[s] 0.05911 +Converged at iteration 16, L1 9.00652e-05, Linf 0.00397806, total time[s] 0.0435 +Converged at iteration 32, L1 6.62648e-05, Linf 0.0027571, total time[s] 0.086149 +Converged at iteration 19, L1 9.17983e-05, Linf 0.00648742, total time[s] 0.050378 +Converged at iteration 23, L1 7.20372e-05, Linf 0.00614823, total time[s] 0.063791 +Converged at iteration 26, L1 6.80023e-05, Linf 0.00537612, total time[s] 0.073137 +Converged at iteration 23, L1 5.29489e-05, Linf 0.0051193, total time[s] 0.061313 +Converged at iteration 20, L1 7.13871e-05, Linf 0.00495131, total time[s] 0.059119 +Converged at iteration 23, L1 6.53132e-05, Linf 0.00271389, total time[s] 0.059841 +Converged at iteration 25, L1 8.16269e-05, Linf 0.00347283, total time[s] 0.07684 +Converged at iteration 28, L1 7.2395e-05, Linf 0.00345716, total time[s] 0.076764 +Converged at iteration 29, L1 7.02448e-05, Linf 0.00607235, total time[s] 0.08136 +Converged at iteration 27, L1 6.87582e-05, Linf 0.0039004, total time[s] 0.079363 +Converged at iteration 29, L1 7.90552e-05, Linf 0.00413123, total time[s] 0.080546 +Converged at iteration 29, L1 8.58726e-05, Linf 0.00276381, total time[s] 0.081109 +Converged at iteration 28, L1 6.83667e-05, Linf 0.00218446, total time[s] 0.078101 +Converged at iteration 32, L1 9.56822e-05, Linf 0.00721241, total time[s] 0.087461 +Converged at iteration 27, L1 6.04672e-05, Linf 0.00338348, total time[s] 0.07304 +Converged at iteration 25, L1 7.55809e-05, Linf 0.00219234, total time[s] 0.066661 +Converged at iteration 23, L1 6.18382e-05, Linf 0.00253575, total time[s] 0.061667 +Converged at iteration 39, L1 6.6729e-05, Linf 0.00708295, total time[s] 0.103445 +Converged at iteration 36, L1 6.70762e-05, Linf 0.00598122, total time[s] 0.099475 +Converged at iteration 24, L1 6.23723e-05, Linf 0.00278745, total time[s] 0.0643 +Converged at iteration 30, L1 9.82591e-05, Linf 0.00618068, total time[s] 0.083234 +Converged at iteration 25, L1 8.17473e-05, Linf 0.00599796, total time[s] 0.069204 +Converged at iteration 21, L1 5.91559e-05, Linf 0.00385133, total time[s] 0.074516 +Converged at iteration 19, L1 5.53139e-05, Linf 0.00433777, total time[s] 0.059682 +Converged at iteration 20, L1 7.57186e-05, Linf 0.00675221, total time[s] 0.057039 +Converged at iteration 24, L1 5.27598e-05, Linf 0.00315999, total time[s] 0.064429 +Converged at iteration 24, L1 7.14129e-05, Linf 0.00513594, total time[s] 0.088004 +Converged at iteration 20, L1 5.99459e-05, Linf 0.00549245, total time[s] 0.057368 +Converged at iteration 16, L1 8.99929e-05, Linf 0.00397768, total time[s] 0.055283 +Converged at iteration 32, L1 6.62642e-05, Linf 0.00275713, total time[s] 0.094055 +Converged at iteration 19, L1 9.17756e-05, Linf 0.00648771, total time[s] 0.054133 +Converged at iteration 23, L1 7.21249e-05, Linf 0.0061445, total time[s] 0.063926 +Converged at iteration 26, L1 6.7861e-05, Linf 0.00538705, total time[s] 0.083743 +Converged at iteration 23, L1 5.29692e-05, Linf 0.00512352, total time[s] 0.072362 +Converged at iteration 20, L1 7.1366e-05, Linf 0.00495014, total time[s] 0.07421 +Converged at iteration 23, L1 6.53634e-05, Linf 0.00272084, total time[s] 0.071311 +Converged at iteration 25, L1 8.161e-05, Linf 0.00350994, total time[s] 0.069661 +Converged at iteration 28, L1 7.29295e-05, Linf 0.00345736, total time[s] 0.081499 +Converged at iteration 29, L1 6.89564e-05, Linf 0.00609876, total time[s] 0.085692 +Converged at iteration 27, L1 6.8644e-05, Linf 0.00390022, total time[s] 0.075333 +Converged at iteration 29, L1 7.88544e-05, Linf 0.00413123, total time[s] 0.08379 +Converged at iteration 29, L1 8.60039e-05, Linf 0.00276381, total time[s] 0.078625 +Converged at iteration 28, L1 6.73028e-05, Linf 0.00218444, total time[s] 0.092018 +Converged at iteration 32, L1 9.5678e-05, Linf 0.00721232, total time[s] 0.085418 +Converged at iteration 27, L1 6.04813e-05, Linf 0.00339475, total time[s] 0.073406 +Converged at iteration 25, L1 7.55809e-05, Linf 0.00219273, total time[s] 0.070378 +Converged at iteration 23, L1 6.18181e-05, Linf 0.00253587, total time[s] 0.061684 +Converged at iteration 39, L1 6.68074e-05, Linf 0.00698742, total time[s] 0.100517 +Converged at iteration 36, L1 6.70648e-05, Linf 0.00596453, total time[s] 0.097 +Converged at iteration 24, L1 6.23787e-05, Linf 0.00278726, total time[s] 0.064917 +Converged at iteration 30, L1 9.8003e-05, Linf 0.00618088, total time[s] 0.079778 +Converged at iteration 25, L1 8.17034e-05, Linf 0.00599799, total time[s] 0.068789 +Converged at iteration 21, L1 5.97965e-05, Linf 0.00385136, total time[s] 0.061743 +Converged at iteration 19, L1 5.53183e-05, Linf 0.00433495, total time[s] 0.060378 +Converged at iteration 20, L1 7.57169e-05, Linf 0.00675307, total time[s] 0.073201 +Converged at iteration 24, L1 5.27506e-05, Linf 0.00316029, total time[s] 0.063959 +Converged at iteration 24, L1 7.14099e-05, Linf 0.00510514, total time[s] 0.066586 +Converged at iteration 20, L1 5.99615e-05, Linf 0.00536753, total time[s] 0.062764 +Converged at iteration 16, L1 8.99934e-05, Linf 0.00397776, total time[s] 0.045877 +Converged at iteration 32, L1 6.62603e-05, Linf 0.002757, total time[s] 0.090108 +Converged at iteration 19, L1 9.18794e-05, Linf 0.00668285, total time[s] 0.058065 +Converged at iteration 23, L1 7.22401e-05, Linf 0.00661431, total time[s] 0.062697 +Converged at iteration 26, L1 6.78559e-05, Linf 0.00538692, total time[s] 0.088144 +Converged at iteration 23, L1 5.29111e-05, Linf 0.00512184, total time[s] 0.062215 +Converged at iteration 20, L1 7.14283e-05, Linf 0.00494982, total time[s] 0.053832 +Converged at iteration 23, L1 6.53637e-05, Linf 0.00272085, total time[s] 0.110522 +Converged at iteration 25, L1 8.16118e-05, Linf 0.00351001, total time[s] 0.198158 +Converged at iteration 28, L1 7.23518e-05, Linf 0.00345652, total time[s] 0.145338 +Converged at iteration 29, L1 6.89477e-05, Linf 0.00609829, total time[s] 0.124329 +Converged at iteration 27, L1 6.86632e-05, Linf 0.00390136, total time[s] 0.095038 +Converged at iteration 29, L1 7.88574e-05, Linf 0.00416806, total time[s] 0.09171 +Converged at iteration 29, L1 8.72068e-05, Linf 0.00276404, total time[s] 0.093727 +Converged at iteration 28, L1 6.75973e-05, Linf 0.0021843, total time[s] 0.084745 +Converged at iteration 32, L1 9.56779e-05, Linf 0.00721253, total time[s] 0.091692 +Converged at iteration 27, L1 6.05195e-05, Linf 0.00339225, total time[s] 0.07293 +Converged at iteration 25, L1 7.55716e-05, Linf 0.00219219, total time[s] 0.068449 +Converged at iteration 23, L1 6.17989e-05, Linf 0.00249687, total time[s] 0.065675 +Converged at iteration 39, L1 6.68098e-05, Linf 0.00698733, total time[s] 0.107951 +Converged at iteration 36, L1 6.71367e-05, Linf 0.00596341, total time[s] 0.108867 +Converged at iteration 24, L1 6.23609e-05, Linf 0.00278738, total time[s] 0.079569 +Converged at iteration 30, L1 9.82838e-05, Linf 0.00618087, total time[s] 0.084 +Converged at iteration 25, L1 8.17443e-05, Linf 0.00592559, total time[s] 0.068001 +Converged at iteration 21, L1 5.91136e-05, Linf 0.00385145, total time[s] 0.058869 +Converged at iteration 19, L1 5.55548e-05, Linf 0.00443538, total time[s] 0.053698 +Converged at iteration 20, L1 7.57147e-05, Linf 0.00675317, total time[s] 0.056668 +Converged at iteration 24, L1 5.2943e-05, Linf 0.00316005, total time[s] 0.064557 +Converged at iteration 24, L1 7.16738e-05, Linf 0.00510415, total time[s] 0.074567 +Converged at iteration 20, L1 6.07721e-05, Linf 0.00543542, total time[s] 0.057754 +Converged at iteration 16, L1 8.99948e-05, Linf 0.00397768, total time[s] 0.058169 +Converged at iteration 32, L1 6.62599e-05, Linf 0.00275708, total time[s] 0.087566 +Converged at iteration 19, L1 9.18238e-05, Linf 0.00648754, total time[s] 0.0522 +Converged at iteration 23, L1 7.21225e-05, Linf 0.00614426, total time[s] 0.063299 +Converged at iteration 26, L1 6.78562e-05, Linf 0.0053868, total time[s] 0.070238 +Converged at iteration 23, L1 5.29102e-05, Linf 0.00512169, total time[s] 0.061838 +Converged at iteration 20, L1 7.13606e-05, Linf 0.00495014, total time[s] 0.054259 +Converged at iteration 23, L1 6.53718e-05, Linf 0.00272083, total time[s] 0.062806 +Converged at iteration 25, L1 8.16156e-05, Linf 0.00350999, total time[s] 0.06562 +Converged at iteration 28, L1 7.25263e-05, Linf 0.00345748, total time[s] 0.075474 +Converged at iteration 29, L1 6.89558e-05, Linf 0.00609922, total time[s] 0.085087 +Converged at iteration 27, L1 6.86576e-05, Linf 0.00393774, total time[s] 0.073472 +Converged at iteration 29, L1 7.88521e-05, Linf 0.00413123, total time[s] 0.08043 +Converged at iteration 29, L1 8.57419e-05, Linf 0.00276381, total time[s] 0.08321 +Converged at iteration 28, L1 6.71568e-05, Linf 0.00218446, total time[s] 0.075205 +Converged at iteration 32, L1 9.56774e-05, Linf 0.00721235, total time[s] 0.084112 +Converged at iteration 27, L1 6.0511e-05, Linf 0.0033948, total time[s] 0.078551 +Converged at iteration 25, L1 7.57098e-05, Linf 0.00219172, total time[s] 0.074238 +Converged at iteration 23, L1 6.17944e-05, Linf 0.00253552, total time[s] 0.066482 +Converged at iteration 40, L1 6.83835e-05, Linf 0.00366595, total time[s] 0.13229 +Converged at iteration 35, L1 7.61237e-05, Linf 0.00339722, total time[s] 0.114269 +Converged at iteration 30, L1 9.63138e-05, Linf 0.00439311, total time[s] 0.11529 +Converged at iteration 31, L1 6.19859e-05, Linf 0.00502565, total time[s] 0.227611 +Converged at iteration 27, L1 6.29423e-05, Linf 0.00499539, total time[s] 0.159323 +Converged at iteration 22, L1 8.59911e-05, Linf 0.00448728, total time[s] 0.089999 +Converged at iteration 20, L1 9.62516e-05, Linf 0.00397883, total time[s] 0.070992 +Converged at iteration 24, L1 8.8436e-05, Linf 0.00475586, total time[s] 0.102751 +Converged at iteration 28, L1 7.39874e-05, Linf 0.00445898, total time[s] 0.100927 +Converged at iteration 26, L1 8.11655e-05, Linf 0.0054675, total time[s] 0.139131 +Converged at iteration 22, L1 7.39671e-05, Linf 0.00508703, total time[s] 0.11643 +Converged at iteration 19, L1 6.6442e-05, Linf 0.00393103, total time[s] 0.093886 +Converged at iteration 30, L1 7.99975e-05, Linf 0.00330567, total time[s] 0.11365 +Converged at iteration 20, L1 8.43727e-05, Linf 0.00455011, total time[s] 0.06533 +Converged at iteration 24, L1 7.11394e-05, Linf 0.00485098, total time[s] 0.109731 +Converged at iteration 31, L1 8.93572e-05, Linf 0.00569095, total time[s] 0.092121 +Converged at iteration 27, L1 9.91283e-05, Linf 0.00564792, total time[s] 0.078607 +Converged at iteration 24, L1 8.79043e-05, Linf 0.00465025, total time[s] 0.077866 +Converged at iteration 23, L1 9.21767e-05, Linf 0.00410192, total time[s] 0.084072 +Converged at iteration 26, L1 7.22198e-05, Linf 0.00446109, total time[s] 0.075321 +Converged at iteration 29, L1 7.84086e-05, Linf 0.00479607, total time[s] 0.098317 +Converged at iteration 34, L1 7.09408e-05, Linf 0.00422644, total time[s] 0.121931 +Converged at iteration 30, L1 9.39676e-05, Linf 0.00442631, total time[s] 0.121892 +Converged at iteration 28, L1 9.51915e-05, Linf 0.00309344, total time[s] 0.092227 +Converged at iteration 32, L1 9.40194e-05, Linf 0.00374108, total time[s] 0.11319 +Converged at iteration 37, L1 7.37525e-05, Linf 0.00327794, total time[s] 0.219162 +Converged at iteration 33, L1 8.44916e-05, Linf 0.00469253, total time[s] 0.113513 +Converged at iteration 28, L1 9.66183e-05, Linf 0.00426224, total time[s] 0.104914 +Converged at iteration 24, L1 8.82828e-05, Linf 0.00325068, total time[s] 0.08711 +Converged at iteration 26, L1 8.98144e-05, Linf 0.00383966, total time[s] 0.093443 +Converged at iteration 40, L1 6.73239e-05, Linf 0.00383231, total time[s] 0.156066 +Converged at iteration 35, L1 8.2363e-05, Linf 0.00351903, total time[s] 0.119228 +Converged at iteration 30, L1 9.61872e-05, Linf 0.00422153, total time[s] 0.106702 +Converged at iteration 31, L1 6.18383e-05, Linf 0.0050382, total time[s] 0.096521 +Converged at iteration 27, L1 6.00608e-05, Linf 0.00494132, total time[s] 0.087854 +Converged at iteration 22, L1 7.71061e-05, Linf 0.00430661, total time[s] 0.063652 +Converged at iteration 21, L1 6.27874e-05, Linf 0.0033445, total time[s] 0.057464 +Converged at iteration 24, L1 9.0433e-05, Linf 0.00488871, total time[s] 0.063031 +Converged at iteration 28, L1 7.41849e-05, Linf 0.00444385, total time[s] 0.088526 +Converged at iteration 26, L1 8.04479e-05, Linf 0.00549612, total time[s] 0.083131 +Converged at iteration 22, L1 7.22087e-05, Linf 0.00483091, total time[s] 0.063204 +Converged at iteration 19, L1 5.91154e-05, Linf 0.00361616, total time[s] 0.054314 +Converged at iteration 30, L1 8.85318e-05, Linf 0.00330314, total time[s] 0.104135 +Converged at iteration 20, L1 8.54862e-05, Linf 0.00465252, total time[s] 0.065446 +Converged at iteration 24, L1 7.16016e-05, Linf 0.00468004, total time[s] 0.072259 +Converged at iteration 31, L1 9.33256e-05, Linf 0.00531137, total time[s] 0.090796 +Converged at iteration 27, L1 9.88746e-05, Linf 0.00537785, total time[s] 0.116366 +Converged at iteration 24, L1 8.6833e-05, Linf 0.00451259, total time[s] 0.075841 +Converged at iteration 23, L1 9.29152e-05, Linf 0.0042201, total time[s] 0.082754 +Converged at iteration 26, L1 7.20862e-05, Linf 0.00457475, total time[s] 0.101856 +Converged at iteration 29, L1 7.6341e-05, Linf 0.00485482, total time[s] 0.098404 +Converged at iteration 34, L1 7.85723e-05, Linf 0.00433221, total time[s] 0.088493 +Converged at iteration 31, L1 6.9164e-05, Linf 0.00368728, total time[s] 0.134082 +Converged at iteration 28, L1 9.8659e-05, Linf 0.00321421, total time[s] 0.086366 +Converged at iteration 32, L1 8.724e-05, Linf 0.00362575, total time[s] 0.087928 +Converged at iteration 36, L1 9.5917e-05, Linf 0.00367298, total time[s] 0.180643 +Converged at iteration 33, L1 8.42996e-05, Linf 0.0047835, total time[s] 0.171644 +Converged at iteration 28, L1 9.34977e-05, Linf 0.00419549, total time[s] 0.116841 +Converged at iteration 24, L1 8.21831e-05, Linf 0.00304608, total time[s] 0.101025 +Converged at iteration 26, L1 8.7008e-05, Linf 0.00389472, total time[s] 0.126683 +Converged at iteration 40, L1 6.66871e-05, Linf 0.00398568, total time[s] 0.125552 +Converged at iteration 35, L1 8.86995e-05, Linf 0.00365739, total time[s] 0.129545 +Converged at iteration 30, L1 9.00573e-05, Linf 0.00417736, total time[s] 0.087224 +Converged at iteration 31, L1 6.16495e-05, Linf 0.0050511, total time[s] 0.08071 +Converged at iteration 26, L1 9.69159e-05, Linf 0.00570603, total time[s] 0.082678 +Converged at iteration 22, L1 6.92443e-05, Linf 0.00411859, total time[s] 0.061611 +Converged at iteration 21, L1 6.50659e-05, Linf 0.0035631, total time[s] 0.056791 +Converged at iteration 24, L1 8.94676e-05, Linf 0.00497568, total time[s] 0.09913 +Converged at iteration 28, L1 7.2476e-05, Linf 0.00442382, total time[s] 0.13934 +Converged at iteration 26, L1 8.14327e-05, Linf 0.00521188, total time[s] 0.121064 +Converged at iteration 22, L1 6.91235e-05, Linf 0.00410769, total time[s] 0.117302 +Converged at iteration 18, L1 9.77606e-05, Linf 0.00399381, total time[s] 0.056061 +Converged at iteration 30, L1 9.8477e-05, Linf 0.00331013, total time[s] 0.07662 +Converged at iteration 20, L1 8.35005e-05, Linf 0.0047665, total time[s] 0.058211 +Converged at iteration 24, L1 7.05692e-05, Linf 0.00479606, total time[s] 0.079039 +Converged at iteration 31, L1 9.50775e-05, Linf 0.00443736, total time[s] 0.103658 +Converged at iteration 27, L1 8.83626e-05, Linf 0.00424, total time[s] 0.120784 +Converged at iteration 24, L1 8.36501e-05, Linf 0.00411273, total time[s] 0.080912 +Converged at iteration 23, L1 9.21075e-05, Linf 0.0043753, total time[s] 0.099421 +Converged at iteration 26, L1 7.09188e-05, Linf 0.00470734, total time[s] 0.074194 +Converged at iteration 29, L1 7.447e-05, Linf 0.00490168, total time[s] 0.129525 +Converged at iteration 34, L1 8.16116e-05, Linf 0.00370831, total time[s] 0.109137 +Converged at iteration 31, L1 7.34837e-05, Linf 0.00351079, total time[s] 0.085785 +Converged at iteration 29, L1 7.17858e-05, Linf 0.00276079, total time[s] 0.099528 +Converged at iteration 32, L1 8.04245e-05, Linf 0.00350834, total time[s] 0.111255 +Converged at iteration 36, L1 8.23556e-05, Linf 0.00353147, total time[s] 0.126718 +Converged at iteration 33, L1 8.27983e-05, Linf 0.00493385, total time[s] 0.114217 +Converged at iteration 28, L1 9.02709e-05, Linf 0.00405245, total time[s] 0.100947 +Converged at iteration 24, L1 7.95444e-05, Linf 0.00283983, total time[s] 0.087552 +Converged at iteration 26, L1 8.32128e-05, Linf 0.00395525, total time[s] 0.131666 +Converged at iteration 39, L1 9.96356e-05, Linf 0.00501839, total time[s] 0.127699 +Converged at iteration 36, L1 6.78328e-05, Linf 0.00333832, total time[s] 0.100609 +Converged at iteration 29, L1 8.61193e-05, Linf 0.00505069, total time[s] 0.117101 +Converged at iteration 31, L1 6.12313e-05, Linf 0.00506858, total time[s] 0.087611 +Converged at iteration 26, L1 8.82049e-05, Linf 0.00564774, total time[s] 0.101476 +Converged at iteration 21, L1 9.03038e-05, Linf 0.00446943, total time[s] 0.08931 +Converged at iteration 21, L1 6.52795e-05, Linf 0.00405716, total time[s] 0.093633 +Converged at iteration 24, L1 6.92224e-05, Linf 0.00530215, total time[s] 0.097952 +Converged at iteration 28, L1 6.25415e-05, Linf 0.00440984, total time[s] 0.082678 +Converged at iteration 26, L1 7.23158e-05, Linf 0.00380667, total time[s] 0.10102 +Converged at iteration 21, L1 6.87571e-05, Linf 0.00430038, total time[s] 0.077437 +Converged at iteration 18, L1 6.26462e-05, Linf 0.00277066, total time[s] 0.05867 +Converged at iteration 31, L1 7.87482e-05, Linf 0.00272634, total time[s] 0.151845 +Converged at iteration 20, L1 8.08211e-05, Linf 0.00504155, total time[s] 0.074748 +Converged at iteration 24, L1 6.80519e-05, Linf 0.00512176, total time[s] 0.076739 +Converged at iteration 30, L1 7.24886e-05, Linf 0.00296298, total time[s] 0.135594 +Converged at iteration 25, L1 6.41302e-05, Linf 0.00435682, total time[s] 0.076919 +Converged at iteration 22, L1 9.6901e-05, Linf 0.00477936, total time[s] 0.0705 +Converged at iteration 23, L1 9.37782e-05, Linf 0.0045978, total time[s] 0.076344 +Converged at iteration 26, L1 6.76867e-05, Linf 0.00498233, total time[s] 0.077761 +Converged at iteration 29, L1 7.00922e-05, Linf 0.00476796, total time[s] 0.076092 +Converged at iteration 31, L1 8.6954e-05, Linf 0.00390869, total time[s] 0.135716 +Converged at iteration 30, L1 8.00422e-05, Linf 0.00316901, total time[s] 0.11683 +Converged at iteration 29, L1 7.99281e-05, Linf 0.00297229, total time[s] 0.163399 +Converged at iteration 32, L1 7.2459e-05, Linf 0.00332129, total time[s] 0.103385 +Converged at iteration 35, L1 7.07435e-05, Linf 0.00381235, total time[s] 0.117682 +Converged at iteration 33, L1 7.93786e-05, Linf 0.00506326, total time[s] 0.154835 +Converged at iteration 28, L1 8.14463e-05, Linf 0.00393222, total time[s] 0.101529 +Converged at iteration 24, L1 7.83672e-05, Linf 0.00242208, total time[s] 0.108616 +Converged at iteration 26, L1 7.91052e-05, Linf 0.00410533, total time[s] 0.088378 +Converged at iteration 39, L1 9.06497e-05, Linf 0.0057906, total time[s] 0.169295 +Converged at iteration 36, L1 7.42625e-05, Linf 0.00411859, total time[s] 0.135154 +Converged at iteration 26, L1 5.52643e-05, Linf 0.00582285, total time[s] 0.092234 +Converged at iteration 31, L1 6.18698e-05, Linf 0.0050934, total time[s] 0.159403 +Converged at iteration 26, L1 7.04182e-05, Linf 0.00526491, total time[s] 0.079024 +Converged at iteration 21, L1 6.46132e-05, Linf 0.00341156, total time[s] 0.098041 +Converged at iteration 20, L1 5.51795e-05, Linf 0.00439525, total time[s] 0.13685 +Converged at iteration 22, L1 4.42333e-05, Linf 0.00764454, total time[s] 0.060556 +Converged at iteration 26, L1 6.85416e-05, Linf 0.00593031, total time[s] 0.070544 +Converged at iteration 25, L1 6.41401e-05, Linf 0.00407447, total time[s] 0.072628 +Converged at iteration 20, L1 8.04575e-05, Linf 0.00666813, total time[s] 0.055269 +Converged at iteration 17, L1 7.49846e-05, Linf 0.00357539, total time[s] 0.064243 +Converged at iteration 31, L1 9.7142e-05, Linf 0.00282387, total time[s] 0.091511 +Converged at iteration 20, L1 6.25079e-05, Linf 0.00537808, total time[s] 0.094507 +Converged at iteration 23, L1 9.74696e-05, Linf 0.00648475, total time[s] 0.063857 +Converged at iteration 27, L1 8.57523e-05, Linf 0.00515448, total time[s] 0.074798 +Converged at iteration 23, L1 8.41522e-05, Linf 0.00705528, total time[s] 0.07795 +Converged at iteration 21, L1 8.004e-05, Linf 0.00480996, total time[s] 0.06791 +Converged at iteration 23, L1 7.32727e-05, Linf 0.00375497, total time[s] 0.090588 +Converged at iteration 25, L1 9.63712e-05, Linf 0.00630278, total time[s] 0.081545 +Converged at iteration 28, L1 9.417e-05, Linf 0.00549172, total time[s] 0.081333 +Converged at iteration 30, L1 5.8754e-05, Linf 0.00496234, total time[s] 0.100808 +Converged at iteration 28, L1 6.73686e-05, Linf 0.0033168, total time[s] 0.101903 +Converged at iteration 29, L1 8.61714e-05, Linf 0.00343697, total time[s] 0.093999 +Converged at iteration 30, L1 8.67164e-05, Linf 0.00307307, total time[s] 0.132643 +Converged at iteration 30, L1 8.91924e-05, Linf 0.00328457, total time[s] 0.168434 +Converged at iteration 33, L1 7.15682e-05, Linf 0.00542142, total time[s] 0.126804 +Converged at iteration 28, L1 6.41596e-05, Linf 0.00353932, total time[s] 0.134823 +Converged at iteration 24, L1 8.84676e-05, Linf 0.0017723, total time[s] 0.074433 +Converged at iteration 24, L1 8.93975e-05, Linf 0.00467981, total time[s] 0.066969 +Converged at iteration 39, L1 7.1534e-05, Linf 0.00700284, total time[s] 0.125903 +Converged at iteration 36, L1 7.15975e-05, Linf 0.00581257, total time[s] 0.125937 +Converged at iteration 24, L1 6.15863e-05, Linf 0.00286185, total time[s] 0.070251 +Converged at iteration 31, L1 5.71224e-05, Linf 0.00508743, total time[s] 0.095389 +Converged at iteration 25, L1 7.36707e-05, Linf 0.00540458, total time[s] 0.094415 +Converged at iteration 20, L1 9.86918e-05, Linf 0.00429001, total time[s] 0.126733 +Converged at iteration 19, L1 5.89276e-05, Linf 0.00441465, total time[s] 0.081246 +Converged at iteration 20, L1 7.77352e-05, Linf 0.00669279, total time[s] 0.071798 +Converged at iteration 24, L1 5.60652e-05, Linf 0.00384938, total time[s] 0.118051 +Converged at iteration 24, L1 6.53517e-05, Linf 0.00476247, total time[s] 0.112671 +Converged at iteration 20, L1 5.38678e-05, Linf 0.00527062, total time[s] 0.060249 +Converged at iteration 16, L1 9.23306e-05, Linf 0.00367272, total time[s] 0.049328 +Converged at iteration 32, L1 6.82242e-05, Linf 0.00267633, total time[s] 0.094788 +Converged at iteration 19, L1 9.09398e-05, Linf 0.00667012, total time[s] 0.075323 +Converged at iteration 23, L1 7.25006e-05, Linf 0.00651513, total time[s] 0.069217 +Converged at iteration 26, L1 6.71799e-05, Linf 0.00550805, total time[s] 0.109056 +Converged at iteration 23, L1 5.43965e-05, Linf 0.00522006, total time[s] 0.071081 +Converged at iteration 20, L1 6.97274e-05, Linf 0.00498601, total time[s] 0.064998 +Converged at iteration 22, L1 9.65317e-05, Linf 0.00411993, total time[s] 0.068534 +Converged at iteration 25, L1 8.14668e-05, Linf 0.00375208, total time[s] 0.133665 +Converged at iteration 28, L1 7.21057e-05, Linf 0.00398175, total time[s] 0.125403 +Converged at iteration 29, L1 6.60771e-05, Linf 0.00600417, total time[s] 0.15436 +Converged at iteration 27, L1 6.58633e-05, Linf 0.00385339, total time[s] 0.110615 +Converged at iteration 29, L1 7.48193e-05, Linf 0.00398895, total time[s] 0.089733 +Converged at iteration 29, L1 8.51324e-05, Linf 0.00274492, total time[s] 0.168764 +Converged at iteration 28, L1 6.66465e-05, Linf 0.00227464, total time[s] 0.076454 +Converged at iteration 33, L1 5.76795e-05, Linf 0.00605004, total time[s] 0.103144 +Converged at iteration 26, L1 9.40926e-05, Linf 0.0034787, total time[s] 0.08004 +Converged at iteration 25, L1 7.0971e-05, Linf 0.00197682, total time[s] 0.0884 +Converged at iteration 23, L1 6.10234e-05, Linf 0.00276618, total time[s] 0.09183 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.2608 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.41119 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.74193 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.36093 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.30939 +Converged at iteration 40, L1 6.70998e-05, Linf 0.00367442, total time[s] 0.1307 +Converged at iteration 35, L1 7.61261e-05, Linf 0.00339716, total time[s] 0.116632 +Converged at iteration 30, L1 9.65519e-05, Linf 0.00432685, total time[s] 0.108789 +Converged at iteration 31, L1 6.30139e-05, Linf 0.00502563, total time[s] 0.099846 +Converged at iteration 27, L1 6.30864e-05, Linf 0.00504729, total time[s] 0.078349 +Converged at iteration 22, L1 8.64472e-05, Linf 0.00448785, total time[s] 0.057936 +Converged at iteration 20, L1 9.62043e-05, Linf 0.00395674, total time[s] 0.065441 +Converged at iteration 24, L1 8.84159e-05, Linf 0.0048531, total time[s] 0.081747 +Converged at iteration 28, L1 7.38762e-05, Linf 0.00445907, total time[s] 0.106573 +Converged at iteration 26, L1 8.15049e-05, Linf 0.00546752, total time[s] 0.073412 +Converged at iteration 22, L1 7.39272e-05, Linf 0.00508658, total time[s] 0.066045 +Converged at iteration 19, L1 6.63356e-05, Linf 0.00393095, total time[s] 0.073533 +Converged at iteration 30, L1 8.00341e-05, Linf 0.00329634, total time[s] 0.087162 +Converged at iteration 20, L1 8.44298e-05, Linf 0.00455023, total time[s] 0.061491 +Converged at iteration 24, L1 7.10858e-05, Linf 0.00463287, total time[s] 0.06646 +Converged at iteration 31, L1 8.93504e-05, Linf 0.0056924, total time[s] 0.101153 +Converged at iteration 27, L1 9.9143e-05, Linf 0.00569741, total time[s] 0.086665 +Converged at iteration 24, L1 8.78992e-05, Linf 0.00465012, total time[s] 0.065203 +Converged at iteration 23, L1 9.2184e-05, Linf 0.00410191, total time[s] 0.064279 +Converged at iteration 26, L1 7.2217e-05, Linf 0.00446084, total time[s] 0.096794 +Converged at iteration 29, L1 7.81483e-05, Linf 0.00479603, total time[s] 0.100159 +Converged at iteration 34, L1 7.08365e-05, Linf 0.00423155, total time[s] 0.147014 +Converged at iteration 30, L1 9.39315e-05, Linf 0.00442599, total time[s] 0.099813 +Converged at iteration 28, L1 9.49888e-05, Linf 0.00310981, total time[s] 0.097555 +Converged at iteration 32, L1 9.4492e-05, Linf 0.00373987, total time[s] 0.101485 +Converged at iteration 37, L1 7.33661e-05, Linf 0.00325896, total time[s] 0.111307 +Converged at iteration 33, L1 8.46649e-05, Linf 0.0046911, total time[s] 0.095114 +Converged at iteration 28, L1 9.67909e-05, Linf 0.00430197, total time[s] 0.169945 +Converged at iteration 24, L1 8.83002e-05, Linf 0.00325071, total time[s] 0.138785 +Converged at iteration 26, L1 8.98063e-05, Linf 0.00383963, total time[s] 0.078095 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.25111 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.21193 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.26232 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.2196 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.23842 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.23956 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.23214 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.23515 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.25592 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.21261 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.17358 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.32602 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.69494 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.22052 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.32877 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.22666 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.18242 +Converged at iteration 40, L1 6.84828e-05, Linf 0.00366664, total time[s] 0.119843 +Converged at iteration 35, L1 7.60958e-05, Linf 0.00339712, total time[s] 0.115009 +Converged at iteration 30, L1 9.6431e-05, Linf 0.0043252, total time[s] 0.088192 +Converged at iteration 31, L1 6.30923e-05, Linf 0.00502564, total time[s] 0.09098 +Converged at iteration 27, L1 6.26294e-05, Linf 0.00499524, total time[s] 0.101568 +Converged at iteration 22, L1 8.58696e-05, Linf 0.00448843, total time[s] 0.062691 +Converged at iteration 20, L1 9.60128e-05, Linf 0.00392255, total time[s] 0.060285 +Converged at iteration 24, L1 8.84195e-05, Linf 0.00482886, total time[s] 0.073048 +Converged at iteration 28, L1 7.40784e-05, Linf 0.00445904, total time[s] 0.121203 +Converged at iteration 26, L1 8.1862e-05, Linf 0.00537395, total time[s] 0.083195 +Converged at iteration 22, L1 7.40174e-05, Linf 0.00508689, total time[s] 0.070696 +Converged at iteration 19, L1 6.63212e-05, Linf 0.00393099, total time[s] 0.057296 +Converged at iteration 30, L1 7.98722e-05, Linf 0.00329631, total time[s] 0.089172 +Converged at iteration 20, L1 8.44911e-05, Linf 0.00465236, total time[s] 0.056922 +Converged at iteration 24, L1 7.10481e-05, Linf 0.00463288, total time[s] 0.091547 +Converged at iteration 31, L1 8.92897e-05, Linf 0.0056918, total time[s] 0.108395 +Converged at iteration 27, L1 9.91725e-05, Linf 0.00569829, total time[s] 0.152291 +Converged at iteration 24, L1 8.79028e-05, Linf 0.00465021, total time[s] 0.09557 +Converged at iteration 23, L1 9.21806e-05, Linf 0.00410192, total time[s] 0.090705 +Converged at iteration 26, L1 7.22231e-05, Linf 0.00446148, total time[s] 0.08867 +Converged at iteration 29, L1 7.81494e-05, Linf 0.00479584, total time[s] 0.079391 +Converged at iteration 34, L1 7.09309e-05, Linf 0.00422687, total time[s] 0.119205 +Converged at iteration 30, L1 9.3948e-05, Linf 0.00442599, total time[s] 0.091076 +Converged at iteration 28, L1 9.50779e-05, Linf 0.00309363, total time[s] 0.095536 +Converged at iteration 32, L1 9.44129e-05, Linf 0.0037285, total time[s] 0.101796 +Converged at iteration 37, L1 7.37708e-05, Linf 0.00332672, total time[s] 0.119872 +Converged at iteration 33, L1 8.46515e-05, Linf 0.00474355, total time[s] 0.086575 +Converged at iteration 28, L1 9.65511e-05, Linf 0.00430202, total time[s] 0.077121 +Converged at iteration 24, L1 8.82899e-05, Linf 0.00325072, total time[s] 0.0689 +Converged at iteration 26, L1 8.98123e-05, Linf 0.00383982, total time[s] 0.076251 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.22594 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.24763 +Converged at iteration 40, L1 6.72529e-05, Linf 0.00367449, total time[s] 0.106026 +Converged at iteration 35, L1 7.60855e-05, Linf 0.00339713, total time[s] 0.091699 +Converged at iteration 30, L1 9.63704e-05, Linf 0.00432628, total time[s] 0.091653 +Converged at iteration 31, L1 6.19656e-05, Linf 0.00502563, total time[s] 0.088005 +Converged at iteration 27, L1 6.25945e-05, Linf 0.00499538, total time[s] 0.076366 +Converged at iteration 22, L1 8.58776e-05, Linf 0.00448822, total time[s] 0.076606 +Converged at iteration 20, L1 9.60224e-05, Linf 0.00397841, total time[s] 0.068131 +Converged at iteration 24, L1 8.84123e-05, Linf 0.00482782, total time[s] 0.080736 +Converged at iteration 28, L1 7.38355e-05, Linf 0.00445903, total time[s] 0.074105 +Converged at iteration 26, L1 8.11734e-05, Linf 0.00546743, total time[s] 0.074614 +Converged at iteration 22, L1 7.42406e-05, Linf 0.00504777, total time[s] 0.062763 +Converged at iteration 19, L1 6.63362e-05, Linf 0.00397353, total time[s] 0.067414 +Converged at iteration 30, L1 7.98748e-05, Linf 0.00329638, total time[s] 0.100263 +Converged at iteration 20, L1 8.43982e-05, Linf 0.00455001, total time[s] 0.057476 +Converged at iteration 24, L1 7.1017e-05, Linf 0.00463268, total time[s] 0.097419 +Converged at iteration 31, L1 8.93447e-05, Linf 0.00569245, total time[s] 0.086764 +Converged at iteration 27, L1 9.92088e-05, Linf 0.00569842, total time[s] 0.078384 +Converged at iteration 24, L1 8.79004e-05, Linf 0.00465017, total time[s] 0.065862 +Converged at iteration 23, L1 9.30454e-05, Linf 0.00523149, total time[s] 0.066688 +Converged at iteration 26, L1 7.21732e-05, Linf 0.00446072, total time[s] 0.075554 +Converged at iteration 29, L1 7.81542e-05, Linf 0.00479606, total time[s] 0.085342 +Converged at iteration 34, L1 7.09352e-05, Linf 0.00422678, total time[s] 0.117135 +Converged at iteration 30, L1 9.39455e-05, Linf 0.00442596, total time[s] 0.085033 +Converged at iteration 28, L1 9.49874e-05, Linf 0.00309344, total time[s] 0.083183 +Converged at iteration 32, L1 9.43658e-05, Linf 0.00373926, total time[s] 0.10514 +Converged at iteration 37, L1 7.34882e-05, Linf 0.00327691, total time[s] 0.097418 +Converged at iteration 33, L1 8.45133e-05, Linf 0.00469142, total time[s] 0.087442 +Converged at iteration 28, L1 9.6479e-05, Linf 0.00430206, total time[s] 0.097702 +Converged at iteration 24, L1 8.82887e-05, Linf 0.00325072, total time[s] 0.068789 +Converged at iteration 26, L1 9.0087e-05, Linf 0.00384048, total time[s] 0.076824 +Converged at iteration 40, L1 6.77223e-05, Linf 0.00367428, total time[s] 0.10717 +Converged at iteration 35, L1 7.661e-05, Linf 0.0033968, total time[s] 0.08951 +Converged at iteration 30, L1 9.63116e-05, Linf 0.00432887, total time[s] 0.075681 +Converged at iteration 31, L1 6.19902e-05, Linf 0.00502562, total time[s] 0.080053 +Converged at iteration 27, L1 6.28419e-05, Linf 0.00499536, total time[s] 0.073175 +Converged at iteration 22, L1 8.58623e-05, Linf 0.00448841, total time[s] 0.06089 +Converged at iteration 20, L1 9.61345e-05, Linf 0.00397846, total time[s] 0.05456 +Converged at iteration 24, L1 8.84415e-05, Linf 0.00482778, total time[s] 0.065447 +Converged at iteration 28, L1 7.38414e-05, Linf 0.00445904, total time[s] 0.074103 +Converged at iteration 26, L1 8.11727e-05, Linf 0.0054741, total time[s] 0.069422 +Converged at iteration 22, L1 7.39261e-05, Linf 0.00508834, total time[s] 0.058577 +Converged at iteration 19, L1 6.6332e-05, Linf 0.00393112, total time[s] 0.051646 +Converged at iteration 30, L1 7.98747e-05, Linf 0.00329678, total time[s] 0.079716 +Converged at iteration 20, L1 8.52161e-05, Linf 0.0045502, total time[s] 0.055039 +Converged at iteration 24, L1 7.10548e-05, Linf 0.00463309, total time[s] 0.075407 +Converged at iteration 31, L1 8.9317e-05, Linf 0.00558775, total time[s] 0.083049 +Converged at iteration 27, L1 9.91639e-05, Linf 0.0057005, total time[s] 0.068807 +Converged at iteration 24, L1 8.79728e-05, Linf 0.00469001, total time[s] 0.062983 +Converged at iteration 23, L1 9.21966e-05, Linf 0.00410189, total time[s] 0.061639 +Converged at iteration 26, L1 7.22112e-05, Linf 0.0043916, total time[s] 0.073795 +Converged at iteration 29, L1 7.81666e-05, Linf 0.00479558, total time[s] 0.073691 +Converged at iteration 34, L1 7.09314e-05, Linf 0.00422699, total time[s] 0.085551 +Converged at iteration 30, L1 9.39372e-05, Linf 0.00442602, total time[s] 0.078101 +Converged at iteration 28, L1 9.49889e-05, Linf 0.00310979, total time[s] 0.071353 +Converged at iteration 32, L1 9.39345e-05, Linf 0.00374157, total time[s] 0.08124 +Converged at iteration 37, L1 7.34198e-05, Linf 0.00327834, total time[s] 0.093328 +Converged at iteration 33, L1 8.44929e-05, Linf 0.00469111, total time[s] 0.085102 +Converged at iteration 28, L1 9.65612e-05, Linf 0.00430216, total time[s] 0.072786 +Converged at iteration 24, L1 8.82878e-05, Linf 0.00322544, total time[s] 0.062031 +Converged at iteration 26, L1 8.98087e-05, Linf 0.00383971, total time[s] 0.067004 +Converged at iteration 40, L1 6.76656e-05, Linf 0.00367445, total time[s] 0.127429 +Converged at iteration 35, L1 7.62663e-05, Linf 0.00339715, total time[s] 0.100866 +Converged at iteration 30, L1 9.63773e-05, Linf 0.00432542, total time[s] 0.088153 +Converged at iteration 31, L1 6.21711e-05, Linf 0.00502553, total time[s] 0.087455 +Converged at iteration 27, L1 6.28879e-05, Linf 0.00499538, total time[s] 0.073131 +Converged at iteration 22, L1 8.58693e-05, Linf 0.00448817, total time[s] 0.059826 +Converged at iteration 20, L1 9.6105e-05, Linf 0.00397889, total time[s] 0.059037 +Converged at iteration 24, L1 8.84103e-05, Linf 0.00485385, total time[s] 0.068559 +Converged at iteration 28, L1 7.3835e-05, Linf 0.00445904, total time[s] 0.07705 +Converged at iteration 26, L1 8.14336e-05, Linf 0.00537366, total time[s] 0.071917 +Converged at iteration 22, L1 7.40081e-05, Linf 0.00508938, total time[s] 0.061584 +Converged at iteration 19, L1 6.63331e-05, Linf 0.00393099, total time[s] 0.055669 +Converged at iteration 30, L1 7.98743e-05, Linf 0.00329635, total time[s] 0.084061 +Converged at iteration 20, L1 8.43976e-05, Linf 0.00455013, total time[s] 0.057061 +Converged at iteration 24, L1 7.136e-05, Linf 0.00462932, total time[s] 0.067007 +Converged at iteration 31, L1 9.03747e-05, Linf 0.00569244, total time[s] 0.086778 +Converged at iteration 27, L1 9.91894e-05, Linf 0.00571433, total time[s] 0.073925 +Converged at iteration 24, L1 8.78839e-05, Linf 0.00464196, total time[s] 0.071942 +Converged at iteration 23, L1 9.24928e-05, Linf 0.00410194, total time[s] 0.07048 +Converged at iteration 26, L1 7.23731e-05, Linf 0.00446045, total time[s] 0.078732 +Converged at iteration 29, L1 7.81041e-05, Linf 0.00479576, total time[s] 0.080455 +Converged at iteration 34, L1 7.09331e-05, Linf 0.00422692, total time[s] 0.088788 +Converged at iteration 30, L1 9.3948e-05, Linf 0.00442594, total time[s] 0.07924 +Converged at iteration 28, L1 9.49854e-05, Linf 0.00311256, total time[s] 0.076836 +Converged at iteration 32, L1 9.39337e-05, Linf 0.00374395, total time[s] 0.086955 +Converged at iteration 37, L1 7.38438e-05, Linf 0.00326001, total time[s] 0.096602 +Converged at iteration 33, L1 8.45465e-05, Linf 0.00469107, total time[s] 0.090021 +Converged at iteration 28, L1 9.65553e-05, Linf 0.00430184, total time[s] 0.076898 +Converged at iteration 24, L1 8.82942e-05, Linf 0.00325071, total time[s] 0.0676 +Converged at iteration 26, L1 9.00221e-05, Linf 0.00384018, total time[s] 0.073212 +Converged at iteration 40, L1 6.98139e-05, Linf 0.00384565, total time[s] 0.116257 +Converged at iteration 35, L1 8.45282e-05, Linf 0.00351921, total time[s] 0.101364 +Converged at iteration 30, L1 9.59981e-05, Linf 0.00425396, total time[s] 0.080693 +Converged at iteration 31, L1 6.64555e-05, Linf 0.00505304, total time[s] 0.085367 +Converged at iteration 26, L1 9.37157e-05, Linf 0.00536446, total time[s] 0.077964 +Converged at iteration 22, L1 6.4353e-05, Linf 0.00400494, total time[s] 0.062864 +Converged at iteration 21, L1 6.69316e-05, Linf 0.0033666, total time[s] 0.057111 +Converged at iteration 24, L1 9.6163e-05, Linf 0.0051467, total time[s] 0.069102 +Converged at iteration 28, L1 7.47014e-05, Linf 0.00450811, total time[s] 0.082413 +Converged at iteration 26, L1 7.78639e-05, Linf 0.00554643, total time[s] 0.087194 +Converged at iteration 22, L1 6.99099e-05, Linf 0.00485671, total time[s] 0.082341 +Converged at iteration 19, L1 5.99441e-05, Linf 0.00376469, total time[s] 0.123119 +Converged at iteration 30, L1 9.07211e-05, Linf 0.00318507, total time[s] 0.102482 +Converged at iteration 20, L1 8.57734e-05, Linf 0.0047122, total time[s] 0.056793 +Converged at iteration 24, L1 7.35066e-05, Linf 0.00471407, total time[s] 0.098967 +Converged at iteration 31, L1 9.31074e-05, Linf 0.00543411, total time[s] 0.124141 +Converged at iteration 27, L1 9.77927e-05, Linf 0.00551348, total time[s] 0.094729 +Converged at iteration 24, L1 8.40431e-05, Linf 0.00446682, total time[s] 0.096756 +Converged at iteration 23, L1 9.49768e-05, Linf 0.00435579, total time[s] 0.06478 +Converged at iteration 26, L1 7.41518e-05, Linf 0.00454346, total time[s] 0.072909 +Converged at iteration 29, L1 7.6118e-05, Linf 0.00470089, total time[s] 0.085347 +Converged at iteration 34, L1 7.80607e-05, Linf 0.0043916, total time[s] 0.10568 +Converged at iteration 31, L1 6.90787e-05, Linf 0.00364227, total time[s] 0.085436 +Converged at iteration 28, L1 9.73269e-05, Linf 0.00323035, total time[s] 0.074128 +Converged at iteration 32, L1 8.45899e-05, Linf 0.00362979, total time[s] 0.08522 +Converged at iteration 36, L1 9.45453e-05, Linf 0.00367742, total time[s] 0.09651 +Converged at iteration 33, L1 8.81617e-05, Linf 0.00479305, total time[s] 0.087655 +Converged at iteration 28, L1 8.93012e-05, Linf 0.0038792, total time[s] 0.076873 +Converged at iteration 24, L1 7.58084e-05, Linf 0.00260254, total time[s] 0.067237 +Converged at iteration 26, L1 8.94327e-05, Linf 0.00403825, total time[s] 0.077039 +Converged at iteration 40, L1 7.05063e-05, Linf 0.00400789, total time[s] 0.107501 +Converged at iteration 35, L1 9.25945e-05, Linf 0.0037076, total time[s] 0.092328 +Converged at iteration 30, L1 9.16216e-05, Linf 0.0042368, total time[s] 0.083679 +Converged at iteration 31, L1 6.76657e-05, Linf 0.00508542, total time[s] 0.086839 +Converged at iteration 26, L1 8.09574e-05, Linf 0.00485845, total time[s] 0.068753 +Converged at iteration 21, L1 7.42226e-05, Linf 0.00419983, total time[s] 0.056495 +Converged at iteration 21, L1 7.23502e-05, Linf 0.00359568, total time[s] 0.057178 +Converged at iteration 24, L1 9.98766e-05, Linf 0.00527077, total time[s] 0.063282 +Converged at iteration 28, L1 7.34523e-05, Linf 0.00455659, total time[s] 0.074631 +Converged at iteration 26, L1 7.43625e-05, Linf 0.00529094, total time[s] 0.068878 +Converged at iteration 22, L1 6.57688e-05, Linf 0.00433424, total time[s] 0.058234 +Converged at iteration 19, L1 5.51383e-05, Linf 0.00338496, total time[s] 0.053116 +Converged at iteration 31, L1 6.90139e-05, Linf 0.00247333, total time[s] 0.082818 +Converged at iteration 20, L1 8.49888e-05, Linf 0.00487201, total time[s] 0.055119 +Converged at iteration 24, L1 7.13879e-05, Linf 0.00488292, total time[s] 0.074984 +Converged at iteration 31, L1 9.49963e-05, Linf 0.0050022, total time[s] 0.096615 +Converged at iteration 27, L1 9.32796e-05, Linf 0.00465184, total time[s] 0.073998 +Converged at iteration 24, L1 7.94801e-05, Linf 0.00412126, total time[s] 0.063825 +Converged at iteration 23, L1 9.77761e-05, Linf 0.00466499, total time[s] 0.087547 +Converged at iteration 26, L1 7.30126e-05, Linf 0.00466886, total time[s] 0.080204 +Converged at iteration 29, L1 7.2775e-05, Linf 0.00454078, total time[s] 0.111678 +Converged at iteration 34, L1 8.30216e-05, Linf 0.00419593, total time[s] 0.107035 +Converged at iteration 31, L1 7.36997e-05, Linf 0.00359426, total time[s] 0.111307 +Converged at iteration 29, L1 7.06261e-05, Linf 0.0027808, total time[s] 0.10194 +Converged at iteration 32, L1 7.98012e-05, Linf 0.00347853, total time[s] 0.103989 +Converged at iteration 36, L1 8.11517e-05, Linf 0.00348518, total time[s] 0.101715 +Converged at iteration 33, L1 9.04266e-05, Linf 0.00488363, total time[s] 0.0868 +Converged at iteration 28, L1 8.05099e-05, Linf 0.00347244, total time[s] 0.079893 +Converged at iteration 24, L1 6.92652e-05, Linf 0.00197289, total time[s] 0.064859 +Converged at iteration 26, L1 8.99122e-05, Linf 0.00422343, total time[s] 0.069788 +Converged at iteration 40, L1 7.06885e-05, Linf 0.00412009, total time[s] 0.136932 +Converged at iteration 35, L1 9.85079e-05, Linf 0.00386731, total time[s] 0.089467 +Converged at iteration 30, L1 8.75034e-05, Linf 0.00427302, total time[s] 0.079816 +Converged at iteration 31, L1 6.76366e-05, Linf 0.00503352, total time[s] 0.082525 +Converged at iteration 26, L1 6.59546e-05, Linf 0.00432683, total time[s] 0.074362 +Converged at iteration 20, L1 9.61902e-05, Linf 0.00451753, total time[s] 0.054111 +Converged at iteration 21, L1 7.83606e-05, Linf 0.00386528, total time[s] 0.056792 +Converged at iteration 25, L1 6.41774e-05, Linf 0.00455213, total time[s] 0.067068 +Converged at iteration 28, L1 7.06658e-05, Linf 0.00459925, total time[s] 0.074831 +Converged at iteration 26, L1 7.46059e-05, Linf 0.00484575, total time[s] 0.067611 +Converged at iteration 22, L1 6.0183e-05, Linf 0.00327719, total time[s] 0.057759 +Converged at iteration 18, L1 8.93014e-05, Linf 0.00462515, total time[s] 0.057638 +Converged at iteration 31, L1 7.43615e-05, Linf 0.00243807, total time[s] 0.105259 +Converged at iteration 20, L1 8.14023e-05, Linf 0.00504762, total time[s] 0.074713 +Converged at iteration 24, L1 6.85221e-05, Linf 0.00513178, total time[s] 0.076353 +Converged at iteration 31, L1 9.7419e-05, Linf 0.00403987, total time[s] 0.088686 +Converged at iteration 27, L1 7.83998e-05, Linf 0.00343568, total time[s] 0.099984 +Converged at iteration 24, L1 7.02783e-05, Linf 0.00352465, total time[s] 0.0814 +Converged at iteration 24, L1 6.40393e-05, Linf 0.00349219, total time[s] 0.065246 +Converged at iteration 26, L1 7.2718e-05, Linf 0.00481263, total time[s] 0.075824 +Converged at iteration 29, L1 6.97027e-05, Linf 0.00446887, total time[s] 0.075194 +Converged at iteration 34, L1 7.96925e-05, Linf 0.00329198, total time[s] 0.10579 +Converged at iteration 31, L1 7.895e-05, Linf 0.00340211, total time[s] 0.0866 +Converged at iteration 29, L1 7.58851e-05, Linf 0.00291461, total time[s] 0.082718 +Converged at iteration 32, L1 7.56086e-05, Linf 0.00337205, total time[s] 0.09896 +Converged at iteration 36, L1 7.10867e-05, Linf 0.00331726, total time[s] 0.101474 +Converged at iteration 33, L1 9.14927e-05, Linf 0.00501802, total time[s] 0.093548 +Converged at iteration 28, L1 6.99822e-05, Linf 0.00307249, total time[s] 0.076183 +Converged at iteration 24, L1 7.45811e-05, Linf 0.00186487, total time[s] 0.065571 +Converged at iteration 26, L1 9.28177e-05, Linf 0.00442342, total time[s] 0.069994 +Converged at iteration 40, L1 7.00638e-05, Linf 0.00430512, total time[s] 0.105488 +Converged at iteration 36, L1 6.92202e-05, Linf 0.00339766, total time[s] 0.095666 +Converged at iteration 30, L1 8.04804e-05, Linf 0.00433452, total time[s] 0.078286 +Converged at iteration 31, L1 6.71971e-05, Linf 0.00500499, total time[s] 0.080067 +Converged at iteration 25, L1 8.68168e-05, Linf 0.00456872, total time[s] 0.065967 +Converged at iteration 20, L1 7.98179e-05, Linf 0.0039713, total time[s] 0.053755 +Converged at iteration 21, L1 8.21139e-05, Linf 0.00414893, total time[s] 0.056576 +Converged at iteration 25, L1 6.46988e-05, Linf 0.00478862, total time[s] 0.066746 +Converged at iteration 28, L1 6.76894e-05, Linf 0.00464341, total time[s] 0.073028 +Converged at iteration 26, L1 6.82216e-05, Linf 0.00410498, total time[s] 0.071913 +Converged at iteration 21, L1 7.21381e-05, Linf 0.00363583, total time[s] 0.056159 +Converged at iteration 18, L1 6.94808e-05, Linf 0.00519832, total time[s] 0.049621 +Converged at iteration 31, L1 7.85201e-05, Linf 0.00237047, total time[s] 0.080091 +Converged at iteration 20, L1 7.36352e-05, Linf 0.00513801, total time[s] 0.053884 +Converged at iteration 24, L1 6.30068e-05, Linf 0.00533481, total time[s] 0.064117 +Converged at iteration 31, L1 7.80464e-05, Linf 0.003082, total time[s] 0.083991 +Converged at iteration 25, L1 9.44347e-05, Linf 0.00407279, total time[s] 0.111766 +Converged at iteration 23, L1 6.74437e-05, Linf 0.00341986, total time[s] 0.063234 +Converged at iteration 23, L1 9.59183e-05, Linf 0.00498873, total time[s] 0.062164 +Converged at iteration 26, L1 7.02908e-05, Linf 0.00483455, total time[s] 0.067427 +Converged at iteration 28, L1 9.97086e-05, Linf 0.0052922, total time[s] 0.07289 +Converged at iteration 32, L1 9.33115e-05, Linf 0.00337596, total time[s] 0.081245 +Converged at iteration 30, L1 9.43109e-05, Linf 0.00338732, total time[s] 0.076909 +Converged at iteration 29, L1 8.01842e-05, Linf 0.0030348, total time[s] 0.07485 +Converged at iteration 32, L1 7.14181e-05, Linf 0.00328298, total time[s] 0.082035 +Converged at iteration 35, L1 9.16739e-05, Linf 0.00390261, total time[s] 0.089181 +Converged at iteration 33, L1 9.11502e-05, Linf 0.00502133, total time[s] 0.084362 +Converged at iteration 27, L1 8.71845e-05, Linf 0.00311674, total time[s] 0.072033 +Converged at iteration 24, L1 8.44357e-05, Linf 0.00180655, total time[s] 0.070303 +Converged at iteration 26, L1 9.34445e-05, Linf 0.00464979, total time[s] 0.077843 +Converged at iteration 40, L1 6.88054e-05, Linf 0.00443683, total time[s] 0.106968 +Converged at iteration 36, L1 7.11101e-05, Linf 0.00349733, total time[s] 0.101895 +Converged at iteration 29, L1 8.02097e-05, Linf 0.00524434, total time[s] 0.07961 +Converged at iteration 31, L1 6.67091e-05, Linf 0.00497852, total time[s] 0.085248 +Converged at iteration 25, L1 6.80542e-05, Linf 0.003914, total time[s] 0.065117 +Converged at iteration 20, L1 5.61518e-05, Linf 0.0032035, total time[s] 0.054205 +Converged at iteration 21, L1 7.1137e-05, Linf 0.00427203, total time[s] 0.0685 +Converged at iteration 24, L1 8.7501e-05, Linf 0.00612226, total time[s] 0.06491 +Converged at iteration 28, L1 6.20563e-05, Linf 0.0046883, total time[s] 0.079112 +Converged at iteration 25, L1 8.21735e-05, Linf 0.00405846, total time[s] 0.074126 +Converged at iteration 20, L1 9.26761e-05, Linf 0.00496306, total time[s] 0.058764 +Converged at iteration 18, L1 6.07919e-05, Linf 0.00563588, total time[s] 0.053677 +Converged at iteration 31, L1 8.1919e-05, Linf 0.00229314, total time[s] 0.097002 +Converged at iteration 20, L1 6.51714e-05, Linf 0.00543239, total time[s] 0.07531 +Converged at iteration 23, L1 9.43667e-05, Linf 0.00658163, total time[s] 0.070279 +Converged at iteration 30, L1 7.73858e-05, Linf 0.0029843, total time[s] 0.092173 +Converged at iteration 24, L1 9.41577e-05, Linf 0.00470135, total time[s] 0.089132 +Converged at iteration 22, L1 6.79156e-05, Linf 0.00359795, total time[s] 0.091363 +Converged at iteration 23, L1 7.92309e-05, Linf 0.00513474, total time[s] 0.078821 +Converged at iteration 25, L1 9.84674e-05, Linf 0.00601295, total time[s] 0.083888 +Converged at iteration 28, L1 8.95762e-05, Linf 0.00485307, total time[s] 0.135781 +Converged at iteration 31, L1 8.74138e-05, Linf 0.00555748, total time[s] 0.115151 +Converged at iteration 29, L1 9.43034e-05, Linf 0.00343531, total time[s] 0.191036 +Converged at iteration 29, L1 7.61506e-05, Linf 0.00316896, total time[s] 0.097857 +Converged at iteration 31, L1 8.87025e-05, Linf 0.00381255, total time[s] 0.176681 +Converged at iteration 34, L1 8.10528e-05, Linf 0.00430888, total time[s] 0.145822 +Converged at iteration 33, L1 9.01482e-05, Linf 0.00507633, total time[s] 0.111405 +Converged at iteration 27, L1 7.26616e-05, Linf 0.00262579, total time[s] 0.083491 +Converged at iteration 24, L1 8.58613e-05, Linf 0.0017574, total time[s] 0.088281 +Converged at iteration 26, L1 7.86886e-05, Linf 0.00475905, total time[s] 0.109721 +Converged at iteration 40, L1 6.72547e-05, Linf 0.0046097, total time[s] 0.171381 +Converged at iteration 36, L1 7.35757e-05, Linf 0.00364708, total time[s] 0.129951 +Converged at iteration 28, L1 8.26752e-05, Linf 0.00619784, total time[s] 0.080236 +Converged at iteration 31, L1 6.70983e-05, Linf 0.00803426, total time[s] 0.095709 +Converged at iteration 24, L1 8.37896e-05, Linf 0.00397504, total time[s] 0.07209 +Converged at iteration 19, L1 9.24382e-05, Linf 0.00329913, total time[s] 0.053815 +Converged at iteration 21, L1 5.96416e-05, Linf 0.00406746, total time[s] 0.06023 +Converged at iteration 24, L1 6.12188e-05, Linf 0.00638719, total time[s] 0.066228 +Converged at iteration 27, L1 8.62206e-05, Linf 0.00594002, total time[s] 0.078579 +Converged at iteration 24, L1 9.96282e-05, Linf 0.00408422, total time[s] 0.06355 +Converged at iteration 20, L1 6.74872e-05, Linf 0.00471373, total time[s] 0.053958 +Converged at iteration 18, L1 5.80992e-05, Linf 0.00611804, total time[s] 0.049051 +Converged at iteration 31, L1 8.04746e-05, Linf 0.00223777, total time[s] 0.081295 +Converged at iteration 20, L1 5.72955e-05, Linf 0.00559369, total time[s] 0.054587 +Converged at iteration 23, L1 8.55695e-05, Linf 0.00694951, total time[s] 0.068828 +Converged at iteration 29, L1 8.7667e-05, Linf 0.00303737, total time[s] 0.075187 +Converged at iteration 24, L1 6.54943e-05, Linf 0.00451653, total time[s] 0.063675 +Converged at iteration 21, L1 7.35553e-05, Linf 0.00395219, total time[s] 0.056531 +Converged at iteration 23, L1 7.20556e-05, Linf 0.00526429, total time[s] 0.061247 +Converged at iteration 25, L1 8.39508e-05, Linf 0.00620539, total time[s] 0.065268 +Converged at iteration 28, L1 7.51436e-05, Linf 0.00365491, total time[s] 0.072262 +Converged at iteration 30, L1 9.55381e-05, Linf 0.00449337, total time[s] 0.077086 +Converged at iteration 29, L1 7.28689e-05, Linf 0.00310394, total time[s] 0.084939 +Converged at iteration 29, L1 7.41005e-05, Linf 0.00330462, total time[s] 0.07764 +Converged at iteration 31, L1 7.80712e-05, Linf 0.00330491, total time[s] 0.079148 +Converged at iteration 33, L1 6.94689e-05, Linf 0.00420717, total time[s] 0.083484 +Converged at iteration 33, L1 8.97932e-05, Linf 0.00513186, total time[s] 0.08439 +Converged at iteration 26, L1 8.50321e-05, Linf 0.00246739, total time[s] 0.068486 +Converged at iteration 24, L1 9.01821e-05, Linf 0.00173958, total time[s] 0.071917 +Converged at iteration 26, L1 6.48824e-05, Linf 0.00454865, total time[s] 0.07105 +Converged at iteration 40, L1 6.71943e-05, Linf 0.00467528, total time[s] 0.113528 +Converged at iteration 36, L1 7.38384e-05, Linf 0.00379455, total time[s] 0.091433 +Converged at iteration 27, L1 9.42775e-05, Linf 0.00726328, total time[s] 0.070538 +Converged at iteration 31, L1 5.8672e-05, Linf 0.00489965, total time[s] 0.079698 +Converged at iteration 23, L1 9.11029e-05, Linf 0.00387653, total time[s] 0.061965 +Converged at iteration 20, L1 6.31983e-05, Linf 0.00284824, total time[s] 0.054425 +Converged at iteration 20, L1 9.9739e-05, Linf 0.00545581, total time[s] 0.054652 +Converged at iteration 23, L1 8.41481e-05, Linf 0.00793693, total time[s] 0.062622 +Converged at iteration 27, L1 7.09847e-05, Linf 0.00595255, total time[s] 0.070654 +Converged at iteration 24, L1 7.95714e-05, Linf 0.00383084, total time[s] 0.063489 +Converged at iteration 20, L1 5.11673e-05, Linf 0.00441839, total time[s] 0.054503 +Converged at iteration 18, L1 6.34832e-05, Linf 0.00659896, total time[s] 0.049767 +Converged at iteration 31, L1 6.71396e-05, Linf 0.00208852, total time[s] 0.081846 +Converged at iteration 19, L1 9.34868e-05, Linf 0.00724603, total time[s] 0.052165 +Converged at iteration 23, L1 8.04561e-05, Linf 0.00730387, total time[s] 0.065063 +Converged at iteration 29, L1 7.18872e-05, Linf 0.00271823, total time[s] 0.076512 +Converged at iteration 23, L1 9.43934e-05, Linf 0.00570566, total time[s] 0.066076 +Converged at iteration 20, L1 9.05822e-05, Linf 0.00443408, total time[s] 0.059825 +Converged at iteration 23, L1 6.78365e-05, Linf 0.00535446, total time[s] 0.063999 +Converged at iteration 25, L1 7.63149e-05, Linf 0.00633744, total time[s] 0.067453 +Converged at iteration 27, L1 9.53896e-05, Linf 0.00562494, total time[s] 0.072305 +Converged at iteration 30, L1 7.93679e-05, Linf 0.00438345, total time[s] 0.080767 +Converged at iteration 28, L1 9.29319e-05, Linf 0.00349528, total time[s] 0.072094 +Converged at iteration 29, L1 7.52386e-05, Linf 0.00341558, total time[s] 0.073926 +Converged at iteration 31, L1 7.02227e-05, Linf 0.00287172, total time[s] 0.078415 +Converged at iteration 32, L1 6.95612e-05, Linf 0.00399342, total time[s] 0.079392 +Converged at iteration 33, L1 8.97449e-05, Linf 0.00518974, total time[s] 0.083019 +Converged at iteration 25, L1 9.16752e-05, Linf 0.00224615, total time[s] 0.065074 +Converged at iteration 24, L1 9.62715e-05, Linf 0.00205758, total time[s] 0.064716 +Converged at iteration 25, L1 8.73069e-05, Linf 0.00556982, total time[s] 0.065454 +Converged at iteration 40, L1 6.47539e-05, Linf 0.00478365, total time[s] 0.112227 +Converged at iteration 36, L1 7.41701e-05, Linf 0.00394604, total time[s] 0.106645 +Converged at iteration 27, L1 5.84812e-05, Linf 0.00660212, total time[s] 0.070394 +Converged at iteration 30, L1 8.82379e-05, Linf 0.0057559, total time[s] 0.075563 +Converged at iteration 23, L1 6.22377e-05, Linf 0.00276538, total time[s] 0.0681 +Converged at iteration 20, L1 6.79421e-05, Linf 0.00315161, total time[s] 0.054241 +Converged at iteration 20, L1 9.21755e-05, Linf 0.00515187, total time[s] 0.053924 +Converged at iteration 23, L1 5.97191e-05, Linf 0.00795742, total time[s] 0.060024 +Converged at iteration 27, L1 5.7168e-05, Linf 0.00579275, total time[s] 0.068484 +Converged at iteration 24, L1 6.59376e-05, Linf 0.00366096, total time[s] 0.062279 +Converged at iteration 19, L1 8.79806e-05, Linf 0.00620037, total time[s] 0.051376 +Converged at iteration 18, L1 6.96349e-05, Linf 0.00713573, total time[s] 0.047921 +Converged at iteration 30, L1 9.11209e-05, Linf 0.00236085, total time[s] 0.07788 +Converged at iteration 19, L1 8.87574e-05, Linf 0.00740085, total time[s] 0.053552 +Converged at iteration 23, L1 7.60109e-05, Linf 0.00764064, total time[s] 0.059195 +Converged at iteration 28, L1 9.25068e-05, Linf 0.00321601, total time[s] 0.072143 +Converged at iteration 23, L1 8.75911e-05, Linf 0.00556834, total time[s] 0.060074 +Converged at iteration 20, L1 7.61042e-05, Linf 0.00407049, total time[s] 0.059186 +Converged at iteration 23, L1 6.5126e-05, Linf 0.00539986, total time[s] 0.060461 +Converged at iteration 25, L1 7.28543e-05, Linf 0.00640401, total time[s] 0.064534 +Converged at iteration 27, L1 8.40023e-05, Linf 0.00479711, total time[s] 0.068289 +Converged at iteration 30, L1 7.21934e-05, Linf 0.00436896, total time[s] 0.080783 +Converged at iteration 28, L1 8.35044e-05, Linf 0.00332189, total time[s] 0.076595 +Converged at iteration 29, L1 7.75267e-05, Linf 0.00349664, total time[s] 0.075474 +Converged at iteration 30, L1 9.50534e-05, Linf 0.00315479, total time[s] 0.075677 +Converged at iteration 31, L1 7.62603e-05, Linf 0.00335589, total time[s] 0.078777 +Converged at iteration 33, L1 8.7435e-05, Linf 0.00523829, total time[s] 0.088187 +Converged at iteration 25, L1 7.03773e-05, Linf 0.00171681, total time[s] 0.065756 +Converged at iteration 25, L1 6.52373e-05, Linf 0.00181066, total time[s] 0.065986 +Converged at iteration 25, L1 7.46618e-05, Linf 0.00517838, total time[s] 0.064991 +Converged at iteration 40, L1 6.32013e-05, Linf 0.00488426, total time[s] 0.104388 +Converged at iteration 36, L1 7.27664e-05, Linf 0.00409712, total time[s] 0.091072 +Converged at iteration 26, L1 8.12301e-05, Linf 0.007746, total time[s] 0.067824 +Converged at iteration 30, L1 7.36319e-05, Linf 0.00566273, total time[s] 0.077302 +Converged at iteration 22, L1 6.74209e-05, Linf 0.00274807, total time[s] 0.058794 +Converged at iteration 20, L1 7.3441e-05, Linf 0.00345817, total time[s] 0.053023 +Converged at iteration 20, L1 8.67835e-05, Linf 0.00556797, total time[s] 0.053744 +Converged at iteration 22, L1 9.97755e-05, Linf 0.0101425, total time[s] 0.058847 +Converged at iteration 26, L1 8.44244e-05, Linf 0.00713913, total time[s] 0.067177 +Converged at iteration 23, L1 9.37697e-05, Linf 0.00394458, total time[s] 0.063567 +Converged at iteration 19, L1 7.35542e-05, Linf 0.00597664, total time[s] 0.056158 +Converged at iteration 18, L1 7.62551e-05, Linf 0.00756306, total time[s] 0.050059 +Converged at iteration 30, L1 8.67497e-05, Linf 0.00248699, total time[s] 0.076068 +Converged at iteration 19, L1 8.72487e-05, Linf 0.00745429, total time[s] 0.051021 +Converged at iteration 23, L1 7.24553e-05, Linf 0.00795392, total time[s] 0.060902 +Converged at iteration 28, L1 8.09038e-05, Linf 0.00304865, total time[s] 0.07118 +Converged at iteration 23, L1 8.32843e-05, Linf 0.00538711, total time[s] 0.060659 +Converged at iteration 20, L1 6.72265e-05, Linf 0.00366823, total time[s] 0.053638 +Converged at iteration 23, L1 6.34961e-05, Linf 0.00543377, total time[s] 0.060663 +Converged at iteration 25, L1 7.11643e-05, Linf 0.00639467, total time[s] 0.068361 +Converged at iteration 27, L1 7.76876e-05, Linf 0.00408991, total time[s] 0.069954 +Converged at iteration 30, L1 6.885e-05, Linf 0.00439648, total time[s] 0.078409 +Converged at iteration 28, L1 7.84562e-05, Linf 0.00318607, total time[s] 0.072972 +Converged at iteration 29, L1 7.90593e-05, Linf 0.0035445, total time[s] 0.076011 +Converged at iteration 30, L1 8.82833e-05, Linf 0.0027569, total time[s] 0.077677 +Converged at iteration 30, L1 9.12832e-05, Linf 0.0030619, total time[s] 0.086438 +Converged at iteration 33, L1 8.5811e-05, Linf 0.0052227, total time[s] 0.083026 +Converged at iteration 24, L1 8.73371e-05, Linf 0.00165581, total time[s] 0.064597 +Converged at iteration 25, L1 6.80527e-05, Linf 0.0020764, total time[s] 0.065937 +Converged at iteration 25, L1 6.5704e-05, Linf 0.00444399, total time[s] 0.065698 +Converged at iteration 40, L1 6.2154e-05, Linf 0.00500463, total time[s] 0.104691 +Converged at iteration 36, L1 6.63376e-05, Linf 0.00424223, total time[s] 0.119464 +Converged at iteration 26, L1 5.74514e-05, Linf 0.00624303, total time[s] 0.068549 +Converged at iteration 30, L1 6.1177e-05, Linf 0.00552387, total time[s] 0.078522 +Converged at iteration 21, L1 7.99387e-05, Linf 0.00323082, total time[s] 0.05676 +Converged at iteration 20, L1 8.02548e-05, Linf 0.00376536, total time[s] 0.060605 +Converged at iteration 20, L1 8.39633e-05, Linf 0.00593282, total time[s] 0.057376 +Converged at iteration 22, L1 7.92247e-05, Linf 0.00979006, total time[s] 0.060186 +Converged at iteration 26, L1 6.93172e-05, Linf 0.00679914, total time[s] 0.06913 +Converged at iteration 23, L1 8.02752e-05, Linf 0.00405562, total time[s] 0.060439 +Converged at iteration 19, L1 6.28239e-05, Linf 0.00569336, total time[s] 0.053193 +Converged at iteration 18, L1 8.39553e-05, Linf 0.00804405, total time[s] 0.050048 +Converged at iteration 30, L1 8.46337e-05, Linf 0.00271142, total time[s] 0.07725 +Converged at iteration 19, L1 8.71523e-05, Linf 0.00776992, total time[s] 0.052481 +Converged at iteration 23, L1 6.91723e-05, Linf 0.00822271, total time[s] 0.059299 +Converged at iteration 28, L1 7.27197e-05, Linf 0.00289774, total time[s] 0.072253 +Converged at iteration 23, L1 8.23898e-05, Linf 0.0051277, total time[s] 0.0623 +Converged at iteration 20, L1 6.2471e-05, Linf 0.00330798, total time[s] 0.062049 +Converged at iteration 23, L1 6.28479e-05, Linf 0.00544038, total time[s] 0.063052 +Converged at iteration 25, L1 7.0034e-05, Linf 0.00630143, total time[s] 0.069166 +Converged at iteration 27, L1 7.30274e-05, Linf 0.00362648, total time[s] 0.071458 +Converged at iteration 30, L1 6.64286e-05, Linf 0.00444267, total time[s] 0.077059 +Converged at iteration 28, L1 7.46406e-05, Linf 0.00305795, total time[s] 0.076583 +Converged at iteration 29, L1 8.05776e-05, Linf 0.00364666, total time[s] 0.075921 +Converged at iteration 30, L1 8.29243e-05, Linf 0.00250307, total time[s] 0.075799 +Converged at iteration 30, L1 7.45379e-05, Linf 0.00260183, total time[s] 0.076202 +Converged at iteration 33, L1 7.8656e-05, Linf 0.00532578, total time[s] 0.084263 +Converged at iteration 24, L1 7.77324e-05, Linf 0.00179092, total time[s] 0.063266 +Converged at iteration 25, L1 7.06654e-05, Linf 0.00235559, total time[s] 0.067359 +Converged at iteration 24, L1 9.93824e-05, Linf 0.00590913, total time[s] 0.063532 +Converged at iteration 39, L1 9.80081e-05, Linf 0.00608211, total time[s] 0.098677 +Converged at iteration 35, L1 9.35277e-05, Linf 0.00511125, total time[s] 0.090956 +Converged at iteration 25, L1 9.46228e-05, Linf 0.0078677, total time[s] 0.065044 +Converged at iteration 29, L1 9.7402e-05, Linf 0.0063257, total time[s] 0.074266 +Converged at iteration 21, L1 6.54634e-05, Linf 0.00310045, total time[s] 0.05607 +Converged at iteration 20, L1 8.74703e-05, Linf 0.00406824, total time[s] 0.05475 +Converged at iteration 20, L1 8.2778e-05, Linf 0.00642829, total time[s] 0.056116 +Converged at iteration 22, L1 6.37888e-05, Linf 0.0102092, total time[s] 0.06028 +Converged at iteration 26, L1 5.63688e-05, Linf 0.00620481, total time[s] 0.092665 +Converged at iteration 23, L1 6.95684e-05, Linf 0.00424295, total time[s] 0.065669 +Converged at iteration 19, L1 5.53157e-05, Linf 0.00534115, total time[s] 0.074135 +Converged at iteration 18, L1 9.12408e-05, Linf 0.00853026, total time[s] 0.053818 +Converged at iteration 30, L1 8.39823e-05, Linf 0.0029231, total time[s] 0.088467 +Converged at iteration 19, L1 8.79917e-05, Linf 0.00796013, total time[s] 0.06817 +Converged at iteration 23, L1 6.62768e-05, Linf 0.00840626, total time[s] 0.092434 +Converged at iteration 28, L1 6.55682e-05, Linf 0.00276659, total time[s] 0.073113 +Converged at iteration 23, L1 8.36658e-05, Linf 0.00480706, total time[s] 0.065069 +Converged at iteration 20, L1 6.11843e-05, Linf 0.00284757, total time[s] 0.058432 +Converged at iteration 23, L1 6.3427e-05, Linf 0.00545605, total time[s] 0.071981 +Converged at iteration 25, L1 6.89963e-05, Linf 0.00614634, total time[s] 0.067215 +Converged at iteration 27, L1 6.9133e-05, Linf 0.00347502, total time[s] 0.077891 +Converged at iteration 30, L1 6.50116e-05, Linf 0.00448495, total time[s] 0.079341 +Converged at iteration 28, L1 7.28455e-05, Linf 0.0029832, total time[s] 0.074898 +Converged at iteration 29, L1 8.19124e-05, Linf 0.00374946, total time[s] 0.073356 +Converged at iteration 30, L1 7.85101e-05, Linf 0.00227085, total time[s] 0.075275 +Converged at iteration 29, L1 9.80751e-05, Linf 0.00301, total time[s] 0.073899 +Converged at iteration 33, L1 6.98243e-05, Linf 0.00536333, total time[s] 0.085398 +Converged at iteration 24, L1 7.25879e-05, Linf 0.00189549, total time[s] 0.062536 +Converged at iteration 25, L1 7.34887e-05, Linf 0.00262209, total time[s] 0.064735 +Converged at iteration 24, L1 9.39699e-05, Linf 0.0054441, total time[s] 0.062491 +Converged at iteration 39, L1 9.55491e-05, Linf 0.00621083, total time[s] 0.11041 +Converged at iteration 35, L1 8.65316e-05, Linf 0.0052514, total time[s] 0.088326 +Converged at iteration 25, L1 7.67808e-05, Linf 0.00632823, total time[s] 0.064651 +Converged at iteration 29, L1 8.75083e-05, Linf 0.0061485, total time[s] 0.073252 +Converged at iteration 21, L1 6.43739e-05, Linf 0.0028769, total time[s] 0.055217 +Converged at iteration 20, L1 9.50215e-05, Linf 0.00448084, total time[s] 0.05283 +Converged at iteration 20, L1 8.26714e-05, Linf 0.00687214, total time[s] 0.052326 +Converged at iteration 22, L1 5.09551e-05, Linf 0.00867514, total time[s] 0.057557 +Converged at iteration 25, L1 9.45058e-05, Linf 0.00785465, total time[s] 0.065857 +Converged at iteration 23, L1 6.05157e-05, Linf 0.00441838, total time[s] 0.063031 +Converged at iteration 19, L1 5.06241e-05, Linf 0.00490324, total time[s] 0.049698 +Converged at iteration 18, L1 9.93368e-05, Linf 0.0090136, total time[s] 0.049063 +Converged at iteration 30, L1 8.37307e-05, Linf 0.0031369, total time[s] 0.075488 +Converged at iteration 19, L1 8.97477e-05, Linf 0.00812703, total time[s] 0.050097 +Converged at iteration 23, L1 6.52991e-05, Linf 0.0085252, total time[s] 0.060593 +Converged at iteration 27, L1 9.67643e-05, Linf 0.00375374, total time[s] 0.069295 +Converged at iteration 23, L1 8.63656e-05, Linf 0.00450502, total time[s] 0.0604 +Converged at iteration 20, L1 6.3233e-05, Linf 0.00533877, total time[s] 0.052388 +Converged at iteration 23, L1 6.38206e-05, Linf 0.00545723, total time[s] 0.061333 +Converged at iteration 25, L1 6.84462e-05, Linf 0.0059972, total time[s] 0.064273 +Converged at iteration 27, L1 6.58146e-05, Linf 0.00342033, total time[s] 0.069966 +Converged at iteration 30, L1 6.45911e-05, Linf 0.00453844, total time[s] 0.085954 +Converged at iteration 28, L1 7.14973e-05, Linf 0.00286119, total time[s] 0.078821 +Converged at iteration 29, L1 8.31118e-05, Linf 0.00379388, total time[s] 0.078667 +Converged at iteration 30, L1 7.48844e-05, Linf 0.00212468, total time[s] 0.088842 +Converged at iteration 29, L1 8.59738e-05, Linf 0.00282599, total time[s] 0.080103 +Converged at iteration 33, L1 6.3009e-05, Linf 0.00533319, total time[s] 0.101163 +Converged at iteration 24, L1 7.30304e-05, Linf 0.00195087, total time[s] 0.096106 +Converged at iteration 25, L1 7.5966e-05, Linf 0.00286385, total time[s] 0.120101 +Converged at iteration 24, L1 8.97217e-05, Linf 0.00508479, total time[s] 0.081918 +Converged at iteration 39, L1 8.84403e-05, Linf 0.00633528, total time[s] 0.17026 +Converged at iteration 35, L1 7.97105e-05, Linf 0.00539101, total time[s] 0.104936 +Converged at iteration 25, L1 6.52644e-05, Linf 0.0049746, total time[s] 0.071428 +Converged at iteration 29, L1 8.03221e-05, Linf 0.00603157, total time[s] 0.08515 +Converged at iteration 21, L1 6.68136e-05, Linf 0.00275205, total time[s] 0.068652 +Converged at iteration 21, L1 5.74741e-05, Linf 0.00392399, total time[s] 0.066153 +Converged at iteration 20, L1 8.31613e-05, Linf 0.00733093, total time[s] 0.062951 +Converged at iteration 22, L1 4.2268e-05, Linf 0.00691018, total time[s] 0.06399 +Converged at iteration 25, L1 8.17539e-05, Linf 0.00725319, total time[s] 0.069357 +Converged at iteration 22, L1 8.98422e-05, Linf 0.00382558, total time[s] 0.064887 +Converged at iteration 19, L1 4.81393e-05, Linf 0.00435545, total time[s] 0.057301 +Converged at iteration 19, L1 4.73002e-05, Linf 0.00698788, total time[s] 0.052511 +Converged at iteration 30, L1 8.42222e-05, Linf 0.00334644, total time[s] 0.082588 +Converged at iteration 19, L1 9.15006e-05, Linf 0.00828478, total time[s] 0.05122 +Converged at iteration 23, L1 6.24338e-05, Linf 0.00856652, total time[s] 0.062187 +Converged at iteration 27, L1 8.95644e-05, Linf 0.00366544, total time[s] 0.076775 +Converged at iteration 23, L1 8.9451e-05, Linf 0.00419459, total time[s] 0.062822 +Converged at iteration 20, L1 6.53881e-05, Linf 0.00206427, total time[s] 0.056956 +Converged at iteration 23, L1 6.45636e-05, Linf 0.00544198, total time[s] 0.060314 +Converged at iteration 25, L1 6.75786e-05, Linf 0.00582655, total time[s] 0.065207 +Converged at iteration 26, L1 9.69745e-05, Linf 0.00497339, total time[s] 0.071771 +Converged at iteration 30, L1 6.46414e-05, Linf 0.0046119, total time[s] 0.075551 +Converged at iteration 28, L1 7.08045e-05, Linf 0.00280872, total time[s] 0.071313 +Converged at iteration 29, L1 8.44809e-05, Linf 0.00385904, total time[s] 0.073716 +Converged at iteration 30, L1 7.21962e-05, Linf 0.00210939, total time[s] 0.077134 +Converged at iteration 29, L1 7.6329e-05, Linf 0.00254444, total time[s] 0.073923 +Converged at iteration 32, L1 9.65959e-05, Linf 0.0062881, total time[s] 0.082761 +Converged at iteration 24, L1 7.65291e-05, Linf 0.00204462, total time[s] 0.062989 +Converged at iteration 25, L1 7.85452e-05, Linf 0.00333249, total time[s] 0.064989 +Converged at iteration 24, L1 8.68803e-05, Linf 0.00471578, total time[s] 0.063117 +Converged at iteration 39, L1 8.24342e-05, Linf 0.00645079, total time[s] 0.111863 +Converged at iteration 35, L1 7.47444e-05, Linf 0.00551805, total time[s] 0.096463 +Converged at iteration 25, L1 5.81492e-05, Linf 0.00387006, total time[s] 0.06577 +Converged at iteration 29, L1 7.46014e-05, Linf 0.0059411, total time[s] 0.075735 +Converged at iteration 21, L1 7.10019e-05, Linf 0.00261124, total time[s] 0.055917 +Converged at iteration 21, L1 6.1795e-05, Linf 0.0042561, total time[s] 0.057118 +Converged at iteration 20, L1 8.47119e-05, Linf 0.00787934, total time[s] 0.053556 +Converged at iteration 22, L1 3.70948e-05, Linf 0.0053263, total time[s] 0.058438 +Converged at iteration 25, L1 7.1792e-05, Linf 0.00644049, total time[s] 0.0663 +Converged at iteration 22, L1 8.35438e-05, Linf 0.00385437, total time[s] 0.058637 +Converged at iteration 19, L1 4.84236e-05, Linf 0.00373198, total time[s] 0.051715 +Converged at iteration 19, L1 5.06133e-05, Linf 0.00720684, total time[s] 0.052359 +Converged at iteration 30, L1 8.59977e-05, Linf 0.00357604, total time[s] 0.082163 +Converged at iteration 19, L1 9.27735e-05, Linf 0.00841045, total time[s] 0.051076 +Converged at iteration 23, L1 6.12752e-05, Linf 0.00824198, total time[s] 0.061009 +Converged at iteration 27, L1 8.53576e-05, Linf 0.00356953, total time[s] 0.072044 +Converged at iteration 23, L1 9.26886e-05, Linf 0.00386489, total time[s] 0.060568 +Converged at iteration 20, L1 7.10566e-05, Linf 0.00197903, total time[s] 0.053931 +Converged at iteration 23, L1 6.54389e-05, Linf 0.00564228, total time[s] 0.067262 +Converged at iteration 25, L1 6.79788e-05, Linf 0.00588283, total time[s] 0.073994 +Converged at iteration 26, L1 9.30676e-05, Linf 0.00483049, total time[s] 0.069263 +Converged at iteration 30, L1 6.44138e-05, Linf 0.00465363, total time[s] 0.076737 +Converged at iteration 28, L1 7.06654e-05, Linf 0.00277249, total time[s] 0.072026 +Converged at iteration 29, L1 8.54513e-05, Linf 0.00389335, total time[s] 0.075179 +Converged at iteration 30, L1 6.92446e-05, Linf 0.0020899, total time[s] 0.07761 +Converged at iteration 29, L1 6.90107e-05, Linf 0.00232993, total time[s] 0.074666 +Converged at iteration 32, L1 8.95734e-05, Linf 0.00635506, total time[s] 0.081879 +Converged at iteration 24, L1 8.13303e-05, Linf 0.00203811, total time[s] 0.063037 +Converged at iteration 25, L1 8.11882e-05, Linf 0.00396939, total time[s] 0.066226 +Converged at iteration 24, L1 8.48979e-05, Linf 0.0045865, total time[s] 0.064539 +Converged at iteration 39, L1 7.50481e-05, Linf 0.00655397, total time[s] 0.119558 +Converged at iteration 35, L1 6.95092e-05, Linf 0.00565899, total time[s] 0.09315 +Converged at iteration 25, L1 5.29425e-05, Linf 0.00250012, total time[s] 0.06564 +Converged at iteration 29, L1 7.0367e-05, Linf 0.00585729, total time[s] 0.078981 +Converged at iteration 21, L1 7.69573e-05, Linf 0.00249507, total time[s] 0.056016 +Converged at iteration 21, L1 6.6248e-05, Linf 0.00499555, total time[s] 0.063498 +Converged at iteration 20, L1 8.70851e-05, Linf 0.00826047, total time[s] 0.068206 +Converged at iteration 21, L1 9.5944e-05, Linf 0.0105047, total time[s] 0.062617 +Converged at iteration 25, L1 6.30358e-05, Linf 0.00551253, total time[s] 0.134359 +Converged at iteration 22, L1 7.74062e-05, Linf 0.00381024, total time[s] 0.06626 +Converged at iteration 19, L1 4.94136e-05, Linf 0.00303242, total time[s] 0.053461 +Converged at iteration 19, L1 5.41098e-05, Linf 0.00761373, total time[s] 0.055336 +Converged at iteration 30, L1 8.77582e-05, Linf 0.00380112, total time[s] 0.084058 +Converged at iteration 19, L1 9.41246e-05, Linf 0.00846549, total time[s] 0.05535 +Converged at iteration 23, L1 6.17294e-05, Linf 0.0085134, total time[s] 0.062907 +Converged at iteration 27, L1 7.97044e-05, Linf 0.00346132, total time[s] 0.075972 +Converged at iteration 23, L1 9.58247e-05, Linf 0.00354159, total time[s] 0.06145 +Converged at iteration 20, L1 7.97046e-05, Linf 0.00239872, total time[s] 0.055969 +Converged at iteration 23, L1 6.64534e-05, Linf 0.00541028, total time[s] 0.059968 +Converged at iteration 25, L1 6.70404e-05, Linf 0.00540653, total time[s] 0.06504 +Converged at iteration 26, L1 9.04051e-05, Linf 0.00452533, total time[s] 0.068192 +Converged at iteration 30, L1 6.53508e-05, Linf 0.00464828, total time[s] 0.076458 +Converged at iteration 28, L1 7.12611e-05, Linf 0.00271673, total time[s] 0.074535 +Converged at iteration 29, L1 8.62623e-05, Linf 0.0039726, total time[s] 0.075209 +Converged at iteration 30, L1 6.74114e-05, Linf 0.00204733, total time[s] 0.075817 +Converged at iteration 29, L1 6.38898e-05, Linf 0.00219789, total time[s] 0.073556 +Converged at iteration 32, L1 8.36981e-05, Linf 0.00643867, total time[s] 0.082141 +Converged at iteration 24, L1 8.65599e-05, Linf 0.00223744, total time[s] 0.062329 +Converged at iteration 25, L1 8.39706e-05, Linf 0.00456359, total time[s] 0.064773 +Converged at iteration 24, L1 8.38411e-05, Linf 0.00439137, total time[s] 0.063457 +Converged at iteration 39, L1 6.93324e-05, Linf 0.00665378, total time[s] 0.099196 +Converged at iteration 35, L1 6.67031e-05, Linf 0.0058255, total time[s] 0.103316 +Converged at iteration 25, L1 4.99438e-05, Linf 0.0021731, total time[s] 0.066733 +Converged at iteration 29, L1 6.75704e-05, Linf 0.00578657, total time[s] 0.073505 +Converged at iteration 21, L1 8.29977e-05, Linf 0.0025122, total time[s] 0.055133 +Converged at iteration 21, L1 7.01885e-05, Linf 0.00555122, total time[s] 0.054109 +Converged at iteration 20, L1 9.01468e-05, Linf 0.00872806, total time[s] 0.061467 +Converged at iteration 21, L1 8.9689e-05, Linf 0.00966655, total time[s] 0.076384 +Converged at iteration 25, L1 5.70445e-05, Linf 0.00467786, total time[s] 0.071231 +Converged at iteration 22, L1 7.21263e-05, Linf 0.00370486, total time[s] 0.070615 +Converged at iteration 19, L1 5.19345e-05, Linf 0.00229852, total time[s] 0.057944 +Converged at iteration 19, L1 5.74194e-05, Linf 0.0079589, total time[s] 0.080858 +Converged at iteration 30, L1 9.06071e-05, Linf 0.00403014, total time[s] 0.093743 +Converged at iteration 19, L1 9.60071e-05, Linf 0.00848943, total time[s] 0.059544 +Converged at iteration 23, L1 6.07635e-05, Linf 0.00843176, total time[s] 0.089152 +Converged at iteration 27, L1 7.57007e-05, Linf 0.00340221, total time[s] 0.084024 +Converged at iteration 23, L1 9.94666e-05, Linf 0.00320444, total time[s] 0.073507 +Converged at iteration 20, L1 9.05977e-05, Linf 0.00281766, total time[s] 0.071315 +Converged at iteration 23, L1 6.78004e-05, Linf 0.0053953, total time[s] 0.094446 +Converged at iteration 25, L1 6.74584e-05, Linf 0.00537249, total time[s] 0.138606 +Converged at iteration 26, L1 8.64733e-05, Linf 0.00425658, total time[s] 0.099276 +Converged at iteration 30, L1 6.51936e-05, Linf 0.00475121, total time[s] 0.108683 +Converged at iteration 28, L1 7.20577e-05, Linf 0.00260224, total time[s] 0.090762 +Converged at iteration 29, L1 8.72873e-05, Linf 0.00399139, total time[s] 0.082458 +Converged at iteration 30, L1 6.57046e-05, Linf 0.00202213, total time[s] 0.077324 +Converged at iteration 28, L1 9.42527e-05, Linf 0.00270469, total time[s] 0.071948 +Converged at iteration 32, L1 7.89121e-05, Linf 0.00651714, total time[s] 0.081193 +Converged at iteration 24, L1 9.2584e-05, Linf 0.00250214, total time[s] 0.064102 +Converged at iteration 25, L1 8.67214e-05, Linf 0.00507698, total time[s] 0.06544 +Converged at iteration 24, L1 8.31099e-05, Linf 0.00429802, total time[s] 0.064032 +Converged at iteration 39, L1 6.55326e-05, Linf 0.00674987, total time[s] 0.100351 +Converged at iteration 35, L1 6.48185e-05, Linf 0.00604119, total time[s] 0.093049 +Converged at iteration 24, L1 9.84818e-05, Linf 0.00369381, total time[s] 0.064135 +Converged at iteration 29, L1 6.31353e-05, Linf 0.00575507, total time[s] 0.0767 +Converged at iteration 21, L1 8.91512e-05, Linf 0.0029993, total time[s] 0.0572 +Converged at iteration 21, L1 7.39592e-05, Linf 0.00584994, total time[s] 0.057539 +Converged at iteration 20, L1 9.31986e-05, Linf 0.00919565, total time[s] 0.05587 +Converged at iteration 21, L1 8.57005e-05, Linf 0.00846678, total time[s] 0.056305 +Converged at iteration 25, L1 5.14856e-05, Linf 0.00402941, total time[s] 0.066475 +Converged at iteration 22, L1 6.71205e-05, Linf 0.0036451, total time[s] 0.060622 +Converged at iteration 19, L1 5.57326e-05, Linf 0.00175355, total time[s] 0.052558 +Converged at iteration 19, L1 6.08013e-05, Linf 0.00830356, total time[s] 0.05596 +Converged at iteration 30, L1 9.32785e-05, Linf 0.00427303, total time[s] 0.078893 +Converged at iteration 19, L1 9.76912e-05, Linf 0.00846217, total time[s] 0.052774 +Converged at iteration 23, L1 6.02293e-05, Linf 0.00831934, total time[s] 0.062877 +Converged at iteration 27, L1 7.22028e-05, Linf 0.00346942, total time[s] 0.072136 +Converged at iteration 24, L1 5.6338e-05, Linf 0.00177765, total time[s] 0.071279 +Converged at iteration 21, L1 5.94391e-05, Linf 0.00213501, total time[s] 0.056421 +Converged at iteration 23, L1 6.87863e-05, Linf 0.00538269, total time[s] 0.061449 +Converged at iteration 25, L1 6.72689e-05, Linf 0.00525729, total time[s] 0.066785 +Converged at iteration 26, L1 8.29605e-05, Linf 0.00427218, total time[s] 0.069447 +Converged at iteration 30, L1 6.597e-05, Linf 0.00471423, total time[s] 0.079226 +Converged at iteration 28, L1 7.21646e-05, Linf 0.00231709, total time[s] 0.073574 +Converged at iteration 29, L1 8.90015e-05, Linf 0.00396762, total time[s] 0.076592 +Converged at iteration 30, L1 6.41757e-05, Linf 0.00195496, total time[s] 0.079 +Converged at iteration 28, L1 8.99831e-05, Linf 0.00246142, total time[s] 0.076174 +Converged at iteration 32, L1 7.5337e-05, Linf 0.00660917, total time[s] 0.083216 +Converged at iteration 24, L1 9.83808e-05, Linf 0.00275837, total time[s] 0.064776 +Converged at iteration 25, L1 8.91597e-05, Linf 0.00518466, total time[s] 0.067809 +Converged at iteration 24, L1 8.25126e-05, Linf 0.00423293, total time[s] 0.067306 +Converged at iteration 39, L1 6.1154e-05, Linf 0.00684091, total time[s] 0.121114 +Converged at iteration 35, L1 6.35145e-05, Linf 0.00629387, total time[s] 0.089747 +Converged at iteration 24, L1 9.42292e-05, Linf 0.00386416, total time[s] 0.065399 +Converged at iteration 29, L1 5.98769e-05, Linf 0.00576265, total time[s] 0.076706 +Converged at iteration 21, L1 9.58896e-05, Linf 0.00353973, total time[s] 0.05899 +Converged at iteration 21, L1 7.77246e-05, Linf 0.00634854, total time[s] 0.059448 +Converged at iteration 20, L1 9.67034e-05, Linf 0.009664, total time[s] 0.059117 +Converged at iteration 21, L1 8.32191e-05, Linf 0.0078417, total time[s] 0.080593 +Converged at iteration 25, L1 4.72722e-05, Linf 0.0034714, total time[s] 0.080875 +Converged at iteration 22, L1 6.26449e-05, Linf 0.00351758, total time[s] 0.067837 +Converged at iteration 19, L1 5.94979e-05, Linf 0.0015213, total time[s] 0.055839 +Converged at iteration 19, L1 6.42809e-05, Linf 0.00864723, total time[s] 0.056197 +Converged at iteration 30, L1 9.66011e-05, Linf 0.00448041, total time[s] 0.085219 +Converged at iteration 19, L1 9.95704e-05, Linf 0.00839247, total time[s] 0.056118 +Converged at iteration 23, L1 6.0868e-05, Linf 0.00818884, total time[s] 0.068237 +Converged at iteration 27, L1 6.96771e-05, Linf 0.00347965, total time[s] 0.070706 +Converged at iteration 24, L1 5.86391e-05, Linf 0.00189022, total time[s] 0.073994 +Converged at iteration 21, L1 6.71878e-05, Linf 0.00241842, total time[s] 0.065927 +Converged at iteration 23, L1 7.04013e-05, Linf 0.00536448, total time[s] 0.060781 +Converged at iteration 25, L1 6.7711e-05, Linf 0.00517121, total time[s] 0.066339 +Converged at iteration 26, L1 8.06003e-05, Linf 0.00398487, total time[s] 0.069553 +Converged at iteration 30, L1 6.6797e-05, Linf 0.00465455, total time[s] 0.077144 +Converged at iteration 28, L1 7.30046e-05, Linf 0.00258366, total time[s] 0.072221 +Converged at iteration 29, L1 9.07088e-05, Linf 0.00405552, total time[s] 0.074126 +Converged at iteration 30, L1 6.29196e-05, Linf 0.00190918, total time[s] 0.082851 +Converged at iteration 28, L1 8.8208e-05, Linf 0.00230178, total time[s] 0.136948 +Converged at iteration 32, L1 7.28113e-05, Linf 0.00671726, total time[s] 0.121737 +Converged at iteration 25, L1 5.97151e-05, Linf 0.0019114, total time[s] 0.067432 +Converged at iteration 25, L1 9.12029e-05, Linf 0.00479087, total time[s] 0.064739 +Converged at iteration 24, L1 8.20374e-05, Linf 0.00414747, total time[s] 0.061879 +Converged at iteration 39, L1 5.80865e-05, Linf 0.00693633, total time[s] 0.097975 +Converged at iteration 35, L1 6.33774e-05, Linf 0.00647665, total time[s] 0.139968 +Converged at iteration 24, L1 9.09092e-05, Linf 0.00397694, total time[s] 0.08443 +Converged at iteration 29, L1 5.76575e-05, Linf 0.00578751, total time[s] 0.078506 +Converged at iteration 22, L1 5.51866e-05, Linf 0.00244962, total time[s] 0.059411 +Converged at iteration 21, L1 8.13873e-05, Linf 0.00656321, total time[s] 0.057247 +Converged at iteration 21, L1 4.40303e-05, Linf 0.00740426, total time[s] 0.0618 +Converged at iteration 21, L1 8.1962e-05, Linf 0.00752084, total time[s] 0.056509 +Converged at iteration 24, L1 9.56931e-05, Linf 0.00602945, total time[s] 0.064562 +Converged at iteration 22, L1 5.73038e-05, Linf 0.003204, total time[s] 0.059563 +Converged at iteration 19, L1 6.3447e-05, Linf 0.00165007, total time[s] 0.051535 +Converged at iteration 19, L1 6.7772e-05, Linf 0.00907362, total time[s] 0.093959 +Converged at iteration 30, L1 9.89686e-05, Linf 0.00471558, total time[s] 0.134183 +Converged at iteration 20, L1 5.875e-05, Linf 0.00442354, total time[s] 0.05448 +Converged at iteration 23, L1 6.17301e-05, Linf 0.0080461, total time[s] 0.06047 +Converged at iteration 27, L1 6.39177e-05, Linf 0.0032623, total time[s] 0.091899 +Converged at iteration 24, L1 6.10662e-05, Linf 0.00200259, total time[s] 0.09758 +Converged at iteration 21, L1 7.40831e-05, Linf 0.00269675, total time[s] 0.058845 +Converged at iteration 23, L1 7.15359e-05, Linf 0.00534546, total time[s] 0.058256 +Converged at iteration 25, L1 6.82431e-05, Linf 0.0050649, total time[s] 0.106208 +Converged at iteration 26, L1 7.70404e-05, Linf 0.00383435, total time[s] 0.147583 +Converged at iteration 30, L1 6.7964e-05, Linf 0.00449797, total time[s] 0.091066 +Converged at iteration 28, L1 7.46077e-05, Linf 0.00385034, total time[s] 0.081919 +Converged at iteration 29, L1 9.01048e-05, Linf 0.00424189, total time[s] 0.090513 +Converged at iteration 30, L1 6.13689e-05, Linf 0.00184438, total time[s] 0.082116 +Converged at iteration 28, L1 8.84343e-05, Linf 0.00207446, total time[s] 0.070545 +Converged at iteration 32, L1 7.0425e-05, Linf 0.00686073, total time[s] 0.081627 +Converged at iteration 25, L1 6.19461e-05, Linf 0.00205888, total time[s] 0.066228 +Converged at iteration 25, L1 9.301e-05, Linf 0.00499766, total time[s] 0.072889 +Converged at iteration 24, L1 8.23088e-05, Linf 0.00403153, total time[s] 0.063215 +Converged at iteration 39, L1 5.29548e-05, Linf 0.0071323, total time[s] 0.101902 +Converged at iteration 35, L1 6.35539e-05, Linf 0.00680121, total time[s] 0.087602 +Converged at iteration 24, L1 8.81923e-05, Linf 0.00393319, total time[s] 0.061555 +Converged at iteration 29, L1 5.54604e-05, Linf 0.00584118, total time[s] 0.073464 +Converged at iteration 22, L1 5.86004e-05, Linf 0.00280103, total time[s] 0.057484 +Converged at iteration 21, L1 8.49352e-05, Linf 0.00681621, total time[s] 0.054936 +Converged at iteration 21, L1 4.53429e-05, Linf 0.00772183, total time[s] 0.055124 +Converged at iteration 21, L1 8.15935e-05, Linf 0.00710316, total time[s] 0.055998 +Converged at iteration 24, L1 9.0289e-05, Linf 0.00541999, total time[s] 0.062305 +Converged at iteration 21, L1 9.95065e-05, Linf 0.00397213, total time[s] 0.054321 +Converged at iteration 19, L1 6.80285e-05, Linf 0.00177867, total time[s] 0.050038 +Converged at iteration 19, L1 7.12304e-05, Linf 0.00932773, total time[s] 0.050473 +Converged at iteration 31, L1 5.49231e-05, Linf 0.00369764, total time[s] 0.078472 +Converged at iteration 20, L1 5.99321e-05, Linf 0.00440935, total time[s] 0.052437 +Converged at iteration 23, L1 5.97707e-05, Linf 0.00788723, total time[s] 0.077195 +Converged at iteration 27, L1 6.14676e-05, Linf 0.00304811, total time[s] 0.096189 +Converged at iteration 24, L1 6.3556e-05, Linf 0.00212344, total time[s] 0.092288 +Converged at iteration 21, L1 7.94309e-05, Linf 0.00298184, total time[s] 0.057779 +Converged at iteration 23, L1 7.26371e-05, Linf 0.00531816, total time[s] 0.066575 +Converged at iteration 25, L1 6.83167e-05, Linf 0.00500792, total time[s] 0.067418 +Converged at iteration 26, L1 7.37305e-05, Linf 0.00377629, total time[s] 0.06876 +Converged at iteration 30, L1 6.91817e-05, Linf 0.00447656, total time[s] 0.078387 +Converged at iteration 28, L1 7.67802e-05, Linf 0.00387536, total time[s] 0.075418 +Converged at iteration 29, L1 9.075e-05, Linf 0.00427079, total time[s] 0.074266 +Converged at iteration 30, L1 6.03284e-05, Linf 0.00176978, total time[s] 0.077198 +Converged at iteration 28, L1 9.15987e-05, Linf 0.00184858, total time[s] 0.07287 +Converged at iteration 32, L1 6.88852e-05, Linf 0.00701819, total time[s] 0.082258 +Converged at iteration 25, L1 6.38028e-05, Linf 0.00225785, total time[s] 0.076549 +Converged at iteration 25, L1 9.50851e-05, Linf 0.00511585, total time[s] 0.297261 +Converged at iteration 24, L1 8.27575e-05, Linf 0.00395824, total time[s] 0.122837 +Converged at iteration 38, L1 9.7295e-05, Linf 0.0087131, total time[s] 0.098825 +Converged at iteration 35, L1 6.38586e-05, Linf 0.00705616, total time[s] 0.099374 +Converged at iteration 24, L1 8.58931e-05, Linf 0.00391366, total time[s] 0.06435 +Converged at iteration 29, L1 5.34444e-05, Linf 0.00588658, total time[s] 0.074725 +Converged at iteration 22, L1 6.1873e-05, Linf 0.00321278, total time[s] 0.05702 +Converged at iteration 21, L1 8.83846e-05, Linf 0.00703996, total time[s] 0.054997 +Converged at iteration 21, L1 4.67901e-05, Linf 0.00804011, total time[s] 0.054787 +Converged at iteration 21, L1 8.17809e-05, Linf 0.00675671, total time[s] 0.054764 +Converged at iteration 24, L1 8.60922e-05, Linf 0.00491206, total time[s] 0.062162 +Converged at iteration 21, L1 9.17721e-05, Linf 0.00380545, total time[s] 0.054429 +Converged at iteration 19, L1 7.21459e-05, Linf 0.00191028, total time[s] 0.050414 +Converged at iteration 19, L1 7.4529e-05, Linf 0.00966182, total time[s] 0.05008 +Converged at iteration 31, L1 5.71652e-05, Linf 0.00381461, total time[s] 0.078376 +Converged at iteration 20, L1 6.03629e-05, Linf 0.00434367, total time[s] 0.05252 +Converged at iteration 23, L1 6.03416e-05, Linf 0.00780309, total time[s] 0.0606 +Converged at iteration 27, L1 6.02675e-05, Linf 0.00297102, total time[s] 0.068705 +Converged at iteration 24, L1 6.63577e-05, Linf 0.00223156, total time[s] 0.061484 +Converged at iteration 21, L1 8.48565e-05, Linf 0.0032438, total time[s] 0.054528 +Converged at iteration 23, L1 7.393e-05, Linf 0.00560916, total time[s] 0.061201 +Converged at iteration 25, L1 6.84244e-05, Linf 0.00496958, total time[s] 0.064328 +Converged at iteration 26, L1 7.10564e-05, Linf 0.00373333, total time[s] 0.06646 +Converged at iteration 30, L1 7.06043e-05, Linf 0.00448782, total time[s] 0.075635 +Converged at iteration 28, L1 7.80272e-05, Linf 0.00365625, total time[s] 0.071517 +Converged at iteration 29, L1 9.21183e-05, Linf 0.00426545, total time[s] 0.073097 +Converged at iteration 30, L1 5.96976e-05, Linf 0.0017603, total time[s] 0.075378 +Converged at iteration 28, L1 9.60633e-05, Linf 0.00167373, total time[s] 0.07095 +Converged at iteration 32, L1 6.79578e-05, Linf 0.00718528, total time[s] 0.084174 +Converged at iteration 25, L1 6.5379e-05, Linf 0.00245862, total time[s] 0.066 +Converged at iteration 25, L1 9.65142e-05, Linf 0.00542574, total time[s] 0.064765 +Converged at iteration 24, L1 8.36335e-05, Linf 0.00392576, total time[s] 0.062442 +Converged at iteration 38, L1 9.46619e-05, Linf 0.0088738, total time[s] 0.107855 +Converged at iteration 35, L1 6.39408e-05, Linf 0.00731462, total time[s] 0.088875 +Converged at iteration 24, L1 8.41147e-05, Linf 0.00391329, total time[s] 0.062392 +Converged at iteration 29, L1 5.14776e-05, Linf 0.0059017, total time[s] 0.073054 +Converged at iteration 22, L1 6.53082e-05, Linf 0.00368466, total time[s] 0.057422 +Converged at iteration 21, L1 9.18684e-05, Linf 0.00724009, total time[s] 0.056553 +Converged at iteration 21, L1 4.81034e-05, Linf 0.00835964, total time[s] 0.069824 +Converged at iteration 21, L1 8.21297e-05, Linf 0.00682536, total time[s] 0.054822 +Converged at iteration 24, L1 8.19186e-05, Linf 0.00460855, total time[s] 0.063142 +Converged at iteration 21, L1 8.4563e-05, Linf 0.00356711, total time[s] 0.054823 +Converged at iteration 19, L1 7.71288e-05, Linf 0.00203849, total time[s] 0.050352 +Converged at iteration 19, L1 7.7798e-05, Linf 0.00999175, total time[s] 0.050183 +Converged at iteration 31, L1 5.74254e-05, Linf 0.00392919, total time[s] 0.078323 +Converged at iteration 20, L1 6.18703e-05, Linf 0.00438989, total time[s] 0.054263 +Converged at iteration 23, L1 6.0826e-05, Linf 0.00740165, total time[s] 0.060503 +Converged at iteration 27, L1 5.89048e-05, Linf 0.00294614, total time[s] 0.078524 +Converged at iteration 24, L1 6.93361e-05, Linf 0.00232866, total time[s] 0.061738 +Converged at iteration 21, L1 9.09435e-05, Linf 0.00349087, total time[s] 0.060826 +Converged at iteration 23, L1 7.50941e-05, Linf 0.00551506, total time[s] 0.063675 +Converged at iteration 25, L1 6.841e-05, Linf 0.00489759, total time[s] 0.063916 +Converged at iteration 26, L1 6.81963e-05, Linf 0.00371766, total time[s] 0.066295 +Converged at iteration 30, L1 7.25044e-05, Linf 0.00457536, total time[s] 0.077881 +Converged at iteration 28, L1 7.93645e-05, Linf 0.00342829, total time[s] 0.070924 +Converged at iteration 29, L1 9.30937e-05, Linf 0.00435662, total time[s] 0.073181 +Converged at iteration 30, L1 5.94146e-05, Linf 0.00181943, total time[s] 0.076735 +Converged at iteration 29, L1 5.32054e-05, Linf 0.00109358, total time[s] 0.073451 +Converged at iteration 32, L1 6.73393e-05, Linf 0.00746534, total time[s] 0.080364 +Converged at iteration 25, L1 6.61023e-05, Linf 0.0026682, total time[s] 0.06419 +Converged at iteration 25, L1 9.8145e-05, Linf 0.00574971, total time[s] 0.064292 +Converged at iteration 24, L1 8.41273e-05, Linf 0.00390381, total time[s] 0.061792 +Converged at iteration 38, L1 9.25508e-05, Linf 0.00905942, total time[s] 0.102722 +Converged at iteration 35, L1 6.43368e-05, Linf 0.00758163, total time[s] 0.141163 +Converged at iteration 24, L1 8.26171e-05, Linf 0.00391272, total time[s] 0.067153 +Converged at iteration 28, L1 9.85039e-05, Linf 0.00723683, total time[s] 0.071697 +Converged at iteration 22, L1 6.87284e-05, Linf 0.00421111, total time[s] 0.057299 +Converged at iteration 21, L1 9.51038e-05, Linf 0.00725419, total time[s] 0.054868 +Converged at iteration 21, L1 4.96961e-05, Linf 0.00867955, total time[s] 0.054903 +Converged at iteration 21, L1 8.28955e-05, Linf 0.00681758, total time[s] 0.055331 +Converged at iteration 24, L1 7.92349e-05, Linf 0.00446199, total time[s] 0.061674 +Converged at iteration 21, L1 7.75132e-05, Linf 0.00334815, total time[s] 0.054968 +Converged at iteration 19, L1 8.26972e-05, Linf 0.00216238, total time[s] 0.050435 +Converged at iteration 19, L1 8.0972e-05, Linf 0.0103164, total time[s] 0.050582 +Converged at iteration 31, L1 5.86169e-05, Linf 0.00407234, total time[s] 0.079816 +Converged at iteration 20, L1 6.24468e-05, Linf 0.00439241, total time[s] 0.056132 +Converged at iteration 23, L1 6.10503e-05, Linf 0.00739389, total time[s] 0.05943 +Converged at iteration 27, L1 5.83253e-05, Linf 0.00294321, total time[s] 0.069026 +Converged at iteration 24, L1 7.24098e-05, Linf 0.0024498, total time[s] 0.063125 +Converged at iteration 21, L1 9.73041e-05, Linf 0.00378996, total time[s] 0.054998 +Converged at iteration 23, L1 7.60982e-05, Linf 0.00521447, total time[s] 0.060287 +Converged at iteration 25, L1 6.85501e-05, Linf 0.00494115, total time[s] 0.064353 +Converged at iteration 26, L1 6.52516e-05, Linf 0.00367623, total time[s] 0.066311 +Converged at iteration 30, L1 7.40104e-05, Linf 0.00474128, total time[s] 0.075564 +Converged at iteration 28, L1 8.11548e-05, Linf 0.00361262, total time[s] 0.071122 +Converged at iteration 29, L1 9.50918e-05, Linf 0.00446357, total time[s] 0.078402 +Converged at iteration 30, L1 5.88945e-05, Linf 0.00187369, total time[s] 0.078631 +Converged at iteration 29, L1 5.61697e-05, Linf 0.00121414, total time[s] 0.073668 +Converged at iteration 32, L1 6.80659e-05, Linf 0.00753498, total time[s] 0.088889 +Converged at iteration 25, L1 6.71682e-05, Linf 0.00286341, total time[s] 0.06466 +Converged at iteration 25, L1 9.96003e-05, Linf 0.00609636, total time[s] 0.064788 +Converged at iteration 24, L1 8.53052e-05, Linf 0.00388189, total time[s] 0.061944 +Converged at iteration 38, L1 9.15875e-05, Linf 0.00925773, total time[s] 0.135134 +Converged at iteration 35, L1 6.48359e-05, Linf 0.00785629, total time[s] 0.097418 +Converged at iteration 24, L1 8.14233e-05, Linf 0.0039372, total time[s] 0.062379 +Converged at iteration 28, L1 9.61741e-05, Linf 0.00727273, total time[s] 0.071519 +Converged at iteration 22, L1 7.23866e-05, Linf 0.00451688, total time[s] 0.057712 +Converged at iteration 21, L1 9.80905e-05, Linf 0.00725717, total time[s] 0.055634 +Converged at iteration 21, L1 5.09726e-05, Linf 0.00900094, total time[s] 0.056037 +Converged at iteration 21, L1 8.40471e-05, Linf 0.00678852, total time[s] 0.056799 +Converged at iteration 24, L1 7.63768e-05, Linf 0.00442334, total time[s] 0.062393 +Converged at iteration 21, L1 7.13309e-05, Linf 0.00310054, total time[s] 0.056985 +Converged at iteration 19, L1 8.8012e-05, Linf 0.00228293, total time[s] 0.051237 +Converged at iteration 19, L1 8.37352e-05, Linf 0.0106364, total time[s] 0.051097 +Converged at iteration 31, L1 5.95134e-05, Linf 0.00413358, total time[s] 0.078664 +Converged at iteration 20, L1 6.28856e-05, Linf 0.00440919, total time[s] 0.053327 +Converged at iteration 23, L1 6.11633e-05, Linf 0.0072431, total time[s] 0.05975 +Converged at iteration 27, L1 5.63189e-05, Linf 0.00298785, total time[s] 0.069334 +Converged at iteration 24, L1 7.5689e-05, Linf 0.00255633, total time[s] 0.06207 +Converged at iteration 22, L1 5.50995e-05, Linf 0.00253567, total time[s] 0.058042 +Converged at iteration 23, L1 7.72035e-05, Linf 0.0051739, total time[s] 0.059424 +Converged at iteration 25, L1 6.88086e-05, Linf 0.00491675, total time[s] 0.064617 +Converged at iteration 25, L1 9.93741e-05, Linf 0.00479266, total time[s] 0.070431 +Converged at iteration 30, L1 7.52198e-05, Linf 0.00491507, total time[s] 0.099343 +Converged at iteration 28, L1 8.27135e-05, Linf 0.00359355, total time[s] 0.110592 +Converged at iteration 29, L1 9.53355e-05, Linf 0.00460243, total time[s] 0.074633 +Converged at iteration 30, L1 5.86989e-05, Linf 0.00189891, total time[s] 0.085413 +Converged at iteration 29, L1 5.93412e-05, Linf 0.00155832, total time[s] 0.096524 +Converged at iteration 32, L1 6.85112e-05, Linf 0.0077244, total time[s] 0.080117 +Converged at iteration 25, L1 6.74056e-05, Linf 0.00303708, total time[s] 0.066186 +Converged at iteration 26, L1 5.11675e-05, Linf 0.00341841, total time[s] 0.074759 +Converged at iteration 24, L1 8.61169e-05, Linf 0.00388646, total time[s] 0.062863 +Converged at iteration 38, L1 9.00658e-05, Linf 0.00934147, total time[s] 0.098871 +Converged at iteration 35, L1 6.62026e-05, Linf 0.0081386, total time[s] 0.087626 +Converged at iteration 24, L1 8.05656e-05, Linf 0.00410317, total time[s] 0.062258 +Converged at iteration 28, L1 9.40224e-05, Linf 0.00732768, total time[s] 0.071196 +Converged at iteration 22, L1 7.59138e-05, Linf 0.00506568, total time[s] 0.058178 +Converged at iteration 22, L1 4.97983e-05, Linf 0.00576206, total time[s] 0.058013 +Converged at iteration 21, L1 5.23453e-05, Linf 0.00932936, total time[s] 0.056157 +Converged at iteration 21, L1 8.55455e-05, Linf 0.00678073, total time[s] 0.056256 +Converged at iteration 24, L1 7.4603e-05, Linf 0.00436667, total time[s] 0.062809 +Converged at iteration 21, L1 6.63916e-05, Linf 0.00285135, total time[s] 0.0556 +Converged at iteration 19, L1 9.15617e-05, Linf 0.00240089, total time[s] 0.051246 +Converged at iteration 19, L1 8.68816e-05, Linf 0.0109483, total time[s] 0.052233 +Converged at iteration 31, L1 6.12432e-05, Linf 0.00419961, total time[s] 0.078398 +Converged at iteration 20, L1 6.33644e-05, Linf 0.00444257, total time[s] 0.052913 +Converged at iteration 23, L1 6.13817e-05, Linf 0.00713363, total time[s] 0.060099 +Converged at iteration 27, L1 5.42707e-05, Linf 0.00302996, total time[s] 0.069814 +Converged at iteration 24, L1 7.87749e-05, Linf 0.00266111, total time[s] 0.063503 +Converged at iteration 22, L1 5.82498e-05, Linf 0.00269618, total time[s] 0.057518 +Converged at iteration 23, L1 7.82138e-05, Linf 0.00513402, total time[s] 0.070482 +Converged at iteration 25, L1 6.90967e-05, Linf 0.00487254, total time[s] 0.066109 +Converged at iteration 25, L1 9.46709e-05, Linf 0.00465763, total time[s] 0.065503 +Converged at iteration 30, L1 7.66376e-05, Linf 0.005056, total time[s] 0.07867 +Converged at iteration 28, L1 8.43602e-05, Linf 0.00321111, total time[s] 0.077516 +Converged at iteration 29, L1 9.67353e-05, Linf 0.00472106, total time[s] 0.084569 +Converged at iteration 30, L1 5.86335e-05, Linf 0.00198187, total time[s] 0.102643 +Converged at iteration 29, L1 6.29943e-05, Linf 0.00189262, total time[s] 0.088287 +Converged at iteration 32, L1 6.77485e-05, Linf 0.00791842, total time[s] 0.082007 +Converged at iteration 25, L1 6.75141e-05, Linf 0.00319117, total time[s] 0.065878 +Converged at iteration 26, L1 5.13793e-05, Linf 0.00353625, total time[s] 0.06802 +Converged at iteration 24, L1 8.75163e-05, Linf 0.003902, total time[s] 0.063267 +Converged at iteration 38, L1 8.87582e-05, Linf 0.00965202, total time[s] 0.103402 +Converged at iteration 35, L1 6.6766e-05, Linf 0.00842789, total time[s] 0.089539 +Converged at iteration 24, L1 7.98331e-05, Linf 0.00429613, total time[s] 0.064269 +Converged at iteration 28, L1 9.18205e-05, Linf 0.00734218, total time[s] 0.074045 +Converged at iteration 22, L1 7.96011e-05, Linf 0.00563288, total time[s] 0.058777 +Converged at iteration 22, L1 5.1027e-05, Linf 0.00589191, total time[s] 0.058715 +Converged at iteration 21, L1 5.36515e-05, Linf 0.00965244, total time[s] 0.055867 +Converged at iteration 21, L1 8.72838e-05, Linf 0.00677257, total time[s] 0.057465 +Converged at iteration 24, L1 7.35043e-05, Linf 0.00431661, total time[s] 0.063853 +Converged at iteration 21, L1 6.2898e-05, Linf 0.00256261, total time[s] 0.07486 +Converged at iteration 19, L1 9.60308e-05, Linf 0.00251623, total time[s] 0.059852 +Converged at iteration 19, L1 9.00934e-05, Linf 0.0113718, total time[s] 0.059799 +Converged at iteration 31, L1 6.21337e-05, Linf 0.00436364, total time[s] 0.078239 +Converged at iteration 20, L1 6.31034e-05, Linf 0.00448856, total time[s] 0.052479 +Converged at iteration 23, L1 6.13539e-05, Linf 0.00699523, total time[s] 0.059648 +Converged at iteration 27, L1 5.35712e-05, Linf 0.00306934, total time[s] 0.069242 +Converged at iteration 24, L1 8.20371e-05, Linf 0.00276423, total time[s] 0.062153 +Converged at iteration 22, L1 6.13701e-05, Linf 0.00285324, total time[s] 0.057082 +Converged at iteration 23, L1 7.89263e-05, Linf 0.00509793, total time[s] 0.05942 +Converged at iteration 25, L1 6.91519e-05, Linf 0.00478967, total time[s] 0.064201 +Converged at iteration 25, L1 9.04865e-05, Linf 0.00452282, total time[s] 0.064306 +Converged at iteration 30, L1 7.85399e-05, Linf 0.00522252, total time[s] 0.077399 +Converged at iteration 28, L1 8.62268e-05, Linf 0.00308947, total time[s] 0.071054 +Converged at iteration 29, L1 9.67127e-05, Linf 0.00481311, total time[s] 0.074311 +Converged at iteration 30, L1 5.86088e-05, Linf 0.00203453, total time[s] 0.076824 +Converged at iteration 29, L1 6.73766e-05, Linf 0.00226867, total time[s] 0.07413 +Converged at iteration 32, L1 6.7826e-05, Linf 0.00801873, total time[s] 0.079123 +Converged at iteration 25, L1 6.60483e-05, Linf 0.00332979, total time[s] 0.063429 +Converged at iteration 26, L1 5.08889e-05, Linf 0.00359872, total time[s] 0.080539 +Converged at iteration 24, L1 8.83781e-05, Linf 0.00392098, total time[s] 0.069454 +Converged at iteration 38, L1 8.58693e-05, Linf 0.00975166, total time[s] 0.098616 +Converged at iteration 35, L1 6.79311e-05, Linf 0.00877059, total time[s] 0.092281 +Converged at iteration 24, L1 7.96113e-05, Linf 0.00447292, total time[s] 0.061675 +Converged at iteration 28, L1 8.97334e-05, Linf 0.00733897, total time[s] 0.072195 +Converged at iteration 22, L1 8.31132e-05, Linf 0.00616923, total time[s] 0.057445 +Converged at iteration 22, L1 5.26244e-05, Linf 0.00607557, total time[s] 0.057299 +Converged at iteration 21, L1 5.49429e-05, Linf 0.0100207, total time[s] 0.055677 +Converged at iteration 21, L1 8.93936e-05, Linf 0.00678901, total time[s] 0.055046 +Converged at iteration 24, L1 7.24114e-05, Linf 0.00426697, total time[s] 0.062593 +Converged at iteration 21, L1 6.06224e-05, Linf 0.00225661, total time[s] 0.055205 +Converged at iteration 19, L1 9.95249e-05, Linf 0.00262887, total time[s] 0.04972 +Converged at iteration 19, L1 9.30394e-05, Linf 0.0116778, total time[s] 0.057525 +Converged at iteration 31, L1 6.34556e-05, Linf 0.00437376, total time[s] 0.112468 +Converged at iteration 20, L1 6.40701e-05, Linf 0.00449858, total time[s] 0.058337 +Converged at iteration 23, L1 6.17174e-05, Linf 0.00762723, total time[s] 0.070863 +Converged at iteration 27, L1 5.25472e-05, Linf 0.00310683, total time[s] 0.075155 +Converged at iteration 24, L1 8.54858e-05, Linf 0.00286548, total time[s] 0.066221 +Converged at iteration 22, L1 6.4097e-05, Linf 0.00301002, total time[s] 0.062716 +Converged at iteration 23, L1 8.01719e-05, Linf 0.00506286, total time[s] 0.062647 +Converged at iteration 25, L1 6.90167e-05, Linf 0.00474474, total time[s] 0.066883 +Converged at iteration 25, L1 8.63707e-05, Linf 0.00439489, total time[s] 0.066886 +Converged at iteration 30, L1 8.03724e-05, Linf 0.0054031, total time[s] 0.079187 +Converged at iteration 28, L1 8.84562e-05, Linf 0.00298458, total time[s] 0.076003 +Converged at iteration 29, L1 9.74583e-05, Linf 0.00490926, total time[s] 0.108917 +Converged at iteration 30, L1 5.85848e-05, Linf 0.00208201, total time[s] 0.086025 +Converged at iteration 29, L1 7.20055e-05, Linf 0.00263161, total time[s] 0.081692 +Converged at iteration 32, L1 6.845e-05, Linf 0.00846005, total time[s] 0.087413 +Converged at iteration 25, L1 6.6212e-05, Linf 0.00345019, total time[s] 0.071737 +Converged at iteration 26, L1 5.07296e-05, Linf 0.00366584, total time[s] 0.067388 +Converged at iteration 24, L1 8.96474e-05, Linf 0.00391827, total time[s] 0.068901 +Converged at iteration 38, L1 8.48326e-05, Linf 0.0100804, total time[s] 0.099605 +Converged at iteration 35, L1 6.82631e-05, Linf 0.00902585, total time[s] 0.11466 +Converged at iteration 24, L1 7.93903e-05, Linf 0.00469996, total time[s] 0.142747 +Converged at iteration 28, L1 8.75329e-05, Linf 0.00737414, total time[s] 0.0811 +Converged at iteration 22, L1 8.75942e-05, Linf 0.00668333, total time[s] 0.067977 +Converged at iteration 22, L1 5.40943e-05, Linf 0.00617092, total time[s] 0.070221 +Converged at iteration 21, L1 5.62941e-05, Linf 0.0103168, total time[s] 0.087257 +Converged at iteration 21, L1 9.15893e-05, Linf 0.00683703, total time[s] 0.085778 +Converged at iteration 24, L1 6.98671e-05, Linf 0.00417362, total time[s] 0.107583 +Converged at iteration 21, L1 5.95774e-05, Linf 0.0020312, total time[s] 0.074397 +Converged at iteration 20, L1 5.66022e-05, Linf 0.00185833, total time[s] 0.08837 +Converged at iteration 19, L1 9.59728e-05, Linf 0.0117575, total time[s] 0.052096 +Converged at iteration 31, L1 6.47167e-05, Linf 0.00449341, total time[s] 0.081233 +Converged at iteration 20, L1 6.4388e-05, Linf 0.00455926, total time[s] 0.052326 +Converged at iteration 23, L1 6.14586e-05, Linf 0.00671607, total time[s] 0.065367 +Converged at iteration 27, L1 5.16758e-05, Linf 0.00313696, total time[s] 0.075192 +Converged at iteration 24, L1 8.93202e-05, Linf 0.00297569, total time[s] 0.076814 +Converged at iteration 22, L1 6.6625e-05, Linf 0.00316304, total time[s] 0.065514 +Converged at iteration 23, L1 8.05553e-05, Linf 0.00503657, total time[s] 0.061346 +Converged at iteration 25, L1 6.87242e-05, Linf 0.00483799, total time[s] 0.067622 +Converged at iteration 25, L1 8.17886e-05, Linf 0.0044223, total time[s] 0.065716 +Converged at iteration 30, L1 8.22076e-05, Linf 0.00554999, total time[s] 0.078772 +Converged at iteration 28, L1 9.03947e-05, Linf 0.00296243, total time[s] 0.07439 +Converged at iteration 29, L1 9.76495e-05, Linf 0.00501261, total time[s] 0.080815 +Converged at iteration 30, L1 5.85494e-05, Linf 0.002129, total time[s] 0.08047 +Converged at iteration 29, L1 7.70696e-05, Linf 0.00273637, total time[s] 0.075328 +Converged at iteration 32, L1 6.92477e-05, Linf 0.00854495, total time[s] 0.081989 +Converged at iteration 25, L1 6.40598e-05, Linf 0.00354723, total time[s] 0.068973 +Converged at iteration 26, L1 5.05182e-05, Linf 0.00357674, total time[s] 0.068978 +Converged at iteration 24, L1 9.09145e-05, Linf 0.00402097, total time[s] 0.063135 +Converged at iteration 38, L1 8.37487e-05, Linf 0.0102956, total time[s] 0.099825 +Converged at iteration 35, L1 6.94783e-05, Linf 0.0093437, total time[s] 0.096128 +Converged at iteration 24, L1 7.94666e-05, Linf 0.0049063, total time[s] 0.067099 +Converged at iteration 28, L1 8.55058e-05, Linf 0.00741696, total time[s] 0.07344 +Converged at iteration 22, L1 8.97464e-05, Linf 0.00717364, total time[s] 0.059029 +Converged at iteration 22, L1 5.48581e-05, Linf 0.00617227, total time[s] 0.059016 +Converged at iteration 21, L1 5.75053e-05, Linf 0.0106528, total time[s] 0.06119 +Converged at iteration 21, L1 9.35686e-05, Linf 0.00688643, total time[s] 0.055487 +Converged at iteration 24, L1 6.91615e-05, Linf 0.00416475, total time[s] 0.064789 +Converged at iteration 21, L1 5.99759e-05, Linf 0.0021884, total time[s] 0.060268 +Converged at iteration 20, L1 6.05972e-05, Linf 0.00192907, total time[s] 0.053002 +Converged at iteration 19, L1 9.91697e-05, Linf 0.0121484, total time[s] 0.053731 +Converged at iteration 31, L1 6.6147e-05, Linf 0.00454518, total time[s] 0.082674 +Converged at iteration 20, L1 6.57771e-05, Linf 0.00457177, total time[s] 0.055176 +Converged at iteration 23, L1 6.21696e-05, Linf 0.00740236, total time[s] 0.066016 +Converged at iteration 27, L1 5.21098e-05, Linf 0.00316092, total time[s] 0.070594 +Converged at iteration 24, L1 9.41479e-05, Linf 0.00309707, total time[s] 0.062313 +Converged at iteration 22, L1 6.94694e-05, Linf 0.00330271, total time[s] 0.057395 +Converged at iteration 23, L1 8.16842e-05, Linf 0.00501685, total time[s] 0.060477 +Converged at iteration 25, L1 6.90484e-05, Linf 0.00464502, total time[s] 0.06524 +Converged at iteration 25, L1 7.77645e-05, Linf 0.00456911, total time[s] 0.064281 +Converged at iteration 30, L1 8.3666e-05, Linf 0.00568133, total time[s] 0.079606 +Converged at iteration 28, L1 9.21199e-05, Linf 0.00293596, total time[s] 0.075363 +Converged at iteration 29, L1 9.85202e-05, Linf 0.00508287, total time[s] 0.079865 +Converged at iteration 30, L1 5.85821e-05, Linf 0.00217467, total time[s] 0.077003 +Converged at iteration 29, L1 8.24642e-05, Linf 0.00302088, total time[s] 0.075449 +Converged at iteration 32, L1 7.01821e-05, Linf 0.0087695, total time[s] 0.083541 +Converged at iteration 25, L1 6.25126e-05, Linf 0.00362344, total time[s] 0.06596 +Converged at iteration 26, L1 5.03845e-05, Linf 0.00356164, total time[s] 0.06817 +Converged at iteration 24, L1 9.23729e-05, Linf 0.00403245, total time[s] 0.063074 +Converged at iteration 38, L1 8.28546e-05, Linf 0.0103825, total time[s] 0.103791 +Converged at iteration 35, L1 7.08033e-05, Linf 0.00980167, total time[s] 0.101558 +Converged at iteration 24, L1 7.98244e-05, Linf 0.00512489, total time[s] 0.063538 +Converged at iteration 28, L1 8.34579e-05, Linf 0.00772121, total time[s] 0.073192 +Converged at iteration 22, L1 9.27991e-05, Linf 0.0075726, total time[s] 0.058775 +Converged at iteration 22, L1 5.57499e-05, Linf 0.00616753, total time[s] 0.062105 +Converged at iteration 21, L1 5.86422e-05, Linf 0.0109915, total time[s] 0.114271 +Converged at iteration 21, L1 9.58324e-05, Linf 0.00720181, total time[s] 0.079733 +Converged at iteration 24, L1 6.9816e-05, Linf 0.00414484, total time[s] 0.071553 +Converged at iteration 21, L1 6.15168e-05, Linf 0.00235885, total time[s] 0.084318 +Converged at iteration 20, L1 6.39598e-05, Linf 0.00199874, total time[s] 0.07585 +Converged at iteration 20, L1 3.78352e-05, Linf 0.00603452, total time[s] 0.067684 +Converged at iteration 31, L1 6.72076e-05, Linf 0.00465152, total time[s] 0.087256 +Converged at iteration 20, L1 6.48995e-05, Linf 0.00458004, total time[s] 0.074221 +Converged at iteration 23, L1 6.23274e-05, Linf 0.00727286, total time[s] 0.079518 +Converged at iteration 27, L1 5.14423e-05, Linf 0.00317669, total time[s] 0.068034 +Converged at iteration 24, L1 9.80237e-05, Linf 0.00322177, total time[s] 0.061622 +Converged at iteration 22, L1 7.1192e-05, Linf 0.00346036, total time[s] 0.058174 +Converged at iteration 23, L1 8.31155e-05, Linf 0.00523443, total time[s] 0.060324 +Converged at iteration 25, L1 6.86876e-05, Linf 0.00471731, total time[s] 0.066182 +Converged at iteration 25, L1 7.31055e-05, Linf 0.00471587, total time[s] 0.064552 +Converged at iteration 30, L1 8.55169e-05, Linf 0.00575389, total time[s] 0.078834 +Converged at iteration 28, L1 9.40089e-05, Linf 0.00295761, total time[s] 0.071785 +Converged at iteration 29, L1 9.96361e-05, Linf 0.00519393, total time[s] 0.076562 +Converged at iteration 30, L1 5.90598e-05, Linf 0.00218952, total time[s] 0.078285 +Converged at iteration 29, L1 8.84843e-05, Linf 0.00362915, total time[s] 0.074519 +Converged at iteration 32, L1 7.16688e-05, Linf 0.00903138, total time[s] 0.082148 +Converged at iteration 25, L1 6.25937e-05, Linf 0.00365048, total time[s] 0.065243 +Converged at iteration 26, L1 5.02862e-05, Linf 0.00350807, total time[s] 0.067907 +Converged at iteration 24, L1 9.38952e-05, Linf 0.00405929, total time[s] 0.062308 +Converged at iteration 38, L1 8.40173e-05, Linf 0.0107651, total time[s] 0.097631 +Converged at iteration 35, L1 7.21999e-05, Linf 0.0100368, total time[s] 0.140464 +Converged at iteration 24, L1 8.03351e-05, Linf 0.00533197, total time[s] 0.075181 +Converged at iteration 28, L1 8.132e-05, Linf 0.00766416, total time[s] 0.075984 +Converged at iteration 22, L1 9.58949e-05, Linf 0.00797142, total time[s] 0.057343 +Converged at iteration 22, L1 5.66352e-05, Linf 0.00616639, total time[s] 0.05932 +Converged at iteration 21, L1 5.98553e-05, Linf 0.0113324, total time[s] 0.057617 +Converged at iteration 21, L1 9.83964e-05, Linf 0.00755284, total time[s] 0.066486 +Converged at iteration 24, L1 6.89366e-05, Linf 0.00414177, total time[s] 0.075833 +Converged at iteration 21, L1 6.45811e-05, Linf 0.00255301, total time[s] 0.058309 +Converged at iteration 20, L1 6.67967e-05, Linf 0.00206762, total time[s] 0.057233 +Converged at iteration 20, L1 3.85932e-05, Linf 0.00610902, total time[s] 0.059353 +Converged at iteration 31, L1 6.83988e-05, Linf 0.00469896, total time[s] 0.083292 +Converged at iteration 20, L1 6.52123e-05, Linf 0.00459464, total time[s] 0.055006 +Converged at iteration 23, L1 6.21431e-05, Linf 0.00673983, total time[s] 0.060476 +Converged at iteration 27, L1 5.05593e-05, Linf 0.00317824, total time[s] 0.07044 +Converged at iteration 25, L1 5.61166e-05, Linf 0.00230575, total time[s] 0.069595 +Converged at iteration 22, L1 7.31121e-05, Linf 0.00360523, total time[s] 0.067768 +Converged at iteration 23, L1 8.34724e-05, Linf 0.004995, total time[s] 0.06374 +Converged at iteration 25, L1 6.83077e-05, Linf 0.00456675, total time[s] 0.066706 +Converged at iteration 25, L1 6.91556e-05, Linf 0.00451149, total time[s] 0.067528 +Converged at iteration 30, L1 8.76892e-05, Linf 0.005889, total time[s] 0.078001 +Converged at iteration 28, L1 9.56675e-05, Linf 0.00297341, total time[s] 0.072588 +Converged at iteration 29, L1 9.98355e-05, Linf 0.0053269, total time[s] 0.075636 +Converged at iteration 30, L1 5.87272e-05, Linf 0.0022616, total time[s] 0.078029 +Converged at iteration 29, L1 9.44717e-05, Linf 0.004236, total time[s] 0.075859 +Converged at iteration 32, L1 7.25429e-05, Linf 0.00912365, total time[s] 0.082645 +Converged at iteration 25, L1 5.87979e-05, Linf 0.00370806, total time[s] 0.066402 +Converged at iteration 26, L1 4.99587e-05, Linf 0.00347315, total time[s] 0.068138 +Converged at iteration 24, L1 9.55005e-05, Linf 0.0042571, total time[s] 0.064361 +Converged at iteration 38, L1 8.35589e-05, Linf 0.0109427, total time[s] 0.103757 +Converged at iteration 35, L1 7.34163e-05, Linf 0.0103145, total time[s] 0.104756 +Converged at iteration 24, L1 8.05647e-05, Linf 0.00559462, total time[s] 0.069195 +Converged at iteration 28, L1 7.91661e-05, Linf 0.00781171, total time[s] 0.078937 +Converged at iteration 22, L1 9.85591e-05, Linf 0.00837906, total time[s] 0.059748 +Converged at iteration 22, L1 5.72803e-05, Linf 0.0061772, total time[s] 0.059596 +Converged at iteration 21, L1 6.07855e-05, Linf 0.0116767, total time[s] 0.056589 +Converged at iteration 22, L1 3.11532e-05, Linf 0.00316822, total time[s] 0.063821 +Converged at iteration 24, L1 6.85571e-05, Linf 0.00412185, total time[s] 0.0679 +Converged at iteration 21, L1 6.87012e-05, Linf 0.0027536, total time[s] 0.055604 +Converged at iteration 20, L1 6.80206e-05, Linf 0.00213539, total time[s] 0.06119 +Converged at iteration 20, L1 3.97573e-05, Linf 0.00617298, total time[s] 0.058124 +Converged at iteration 31, L1 6.94243e-05, Linf 0.00479537, total time[s] 0.08758 +Converged at iteration 20, L1 6.57219e-05, Linf 0.00459466, total time[s] 0.053579 +Converged at iteration 23, L1 6.22507e-05, Linf 0.00675731, total time[s] 0.061181 +Converged at iteration 26, L1 9.9091e-05, Linf 0.00552221, total time[s] 0.069266 +Converged at iteration 25, L1 5.7907e-05, Linf 0.00238243, total time[s] 0.064701 +Converged at iteration 22, L1 7.51449e-05, Linf 0.00374721, total time[s] 0.0579 +Converged at iteration 23, L1 8.41293e-05, Linf 0.00499174, total time[s] 0.06273 +Converged at iteration 25, L1 6.80901e-05, Linf 0.00454017, total time[s] 0.068537 +Converged at iteration 25, L1 6.41242e-05, Linf 0.00438451, total time[s] 0.066518 +Converged at iteration 30, L1 8.88349e-05, Linf 0.0060377, total time[s] 0.078791 +Converged at iteration 28, L1 9.75041e-05, Linf 0.00301063, total time[s] 0.07439 +Converged at iteration 30, L1 4.98125e-05, Linf 0.00386431, total time[s] 0.077161 +Converged at iteration 30, L1 5.94482e-05, Linf 0.00230053, total time[s] 0.078385 +Converged at iteration 30, L1 4.19417e-05, Linf 0.00221312, total time[s] 0.077794 +Converged at iteration 32, L1 7.37954e-05, Linf 0.00963443, total time[s] 0.081934 +Converged at iteration 25, L1 5.66089e-05, Linf 0.00372298, total time[s] 0.065386 +Converged at iteration 26, L1 4.9824e-05, Linf 0.00347606, total time[s] 0.067987 +Converged at iteration 24, L1 9.70425e-05, Linf 0.00445819, total time[s] 0.065908 +Converged at iteration 38, L1 8.03124e-05, Linf 0.0111623, total time[s] 0.098606 +Converged at iteration 35, L1 7.48464e-05, Linf 0.0105293, total time[s] 0.097856 +Converged at iteration 24, L1 8.11751e-05, Linf 0.00584803, total time[s] 0.063522 +Converged at iteration 28, L1 7.72818e-05, Linf 0.00785756, total time[s] 0.073824 +Converged at iteration 23, L1 5.06719e-05, Linf 0.005294, total time[s] 0.062978 +Converged at iteration 22, L1 5.80259e-05, Linf 0.00622877, total time[s] 0.059069 +Converged at iteration 21, L1 6.17407e-05, Linf 0.0119048, total time[s] 0.062231 +Converged at iteration 22, L1 3.1413e-05, Linf 0.00327432, total time[s] 0.065774 +Converged at iteration 24, L1 6.79556e-05, Linf 0.00411572, total time[s] 0.067063 +Converged at iteration 21, L1 7.56065e-05, Linf 0.00296697, total time[s] 0.072205 +Converged at iteration 20, L1 6.95305e-05, Linf 0.00220226, total time[s] 0.059701 +Converged at iteration 20, L1 4.00445e-05, Linf 0.00623263, total time[s] 0.057652 +Converged at iteration 31, L1 7.20269e-05, Linf 0.00487686, total time[s] 0.088861 +Converged at iteration 20, L1 6.65941e-05, Linf 0.00460876, total time[s] 0.056636 +Converged at iteration 23, L1 6.2343e-05, Linf 0.00674879, total time[s] 0.061982 +Converged at iteration 26, L1 9.76958e-05, Linf 0.00560965, total time[s] 0.068811 +Converged at iteration 25, L1 5.95613e-05, Linf 0.00245646, total time[s] 0.065064 +Converged at iteration 22, L1 7.73022e-05, Linf 0.00388703, total time[s] 0.058088 +Converged at iteration 23, L1 8.49162e-05, Linf 0.00499303, total time[s] 0.062071 +Converged at iteration 25, L1 6.78201e-05, Linf 0.00451385, total time[s] 0.065658 +Converged at iteration 24, L1 9.82259e-05, Linf 0.00578021, total time[s] 0.064565 +Converged at iteration 30, L1 9.0449e-05, Linf 0.0061055, total time[s] 0.079067 +Converged at iteration 28, L1 9.93598e-05, Linf 0.00303211, total time[s] 0.073541 +Converged at iteration 30, L1 4.99697e-05, Linf 0.00386879, total time[s] 0.079552 +Converged at iteration 30, L1 5.86137e-05, Linf 0.00234185, total time[s] 0.080429 +Converged at iteration 30, L1 4.48282e-05, Linf 0.00262511, total time[s] 0.080857 +Converged at iteration 32, L1 7.49246e-05, Linf 0.00972782, total time[s] 0.082993 +Converged at iteration 25, L1 5.42863e-05, Linf 0.00372349, total time[s] 0.066814 +Converged at iteration 26, L1 4.97346e-05, Linf 0.0032877, total time[s] 0.069835 +Converged at iteration 24, L1 9.84537e-05, Linf 0.0046025, total time[s] 0.07977 +Converged at iteration 38, L1 7.92277e-05, Linf 0.0113819, total time[s] 0.114595 +Converged at iteration 35, L1 7.65303e-05, Linf 0.0109918, total time[s] 0.100496 +Converged at iteration 24, L1 8.21636e-05, Linf 0.00611448, total time[s] 0.068231 +Converged at iteration 28, L1 7.54788e-05, Linf 0.00790247, total time[s] 0.072248 +Converged at iteration 23, L1 5.19162e-05, Linf 0.0055837, total time[s] 0.062139 +Converged at iteration 22, L1 5.86672e-05, Linf 0.00624175, total time[s] 0.058929 +Converged at iteration 21, L1 6.28022e-05, Linf 0.0123748, total time[s] 0.063982 +Converged at iteration 22, L1 3.1909e-05, Linf 0.00334159, total time[s] 0.06743 +Converged at iteration 24, L1 6.75976e-05, Linf 0.00406597, total time[s] 0.068063 +Converged at iteration 21, L1 8.25506e-05, Linf 0.00319392, total time[s] 0.058183 +Converged at iteration 20, L1 7.14374e-05, Linf 0.0022688, total time[s] 0.061682 +Converged at iteration 20, L1 4.09508e-05, Linf 0.00629381, total time[s] 0.056553 +Converged at iteration 31, L1 7.11024e-05, Linf 0.00495323, total time[s] 0.085086 +Converged at iteration 20, L1 6.82213e-05, Linf 0.00462896, total time[s] 0.063119 +Converged at iteration 23, L1 6.23814e-05, Linf 0.00674626, total time[s] 0.066235 +Converged at iteration 26, L1 9.64822e-05, Linf 0.00570176, total time[s] 0.068749 +Converged at iteration 25, L1 6.11621e-05, Linf 0.00252764, total time[s] 0.072095 +Converged at iteration 22, L1 7.95132e-05, Linf 0.00402461, total time[s] 0.061539 +Converged at iteration 23, L1 8.55748e-05, Linf 0.00499696, total time[s] 0.062004 +Converged at iteration 25, L1 6.76395e-05, Linf 0.00448381, total time[s] 0.067068 +Converged at iteration 24, L1 9.16612e-05, Linf 0.00564048, total time[s] 0.065212 +Converged at iteration 30, L1 9.26539e-05, Linf 0.00636125, total time[s] 0.0795 +Converged at iteration 29, L1 5.81587e-05, Linf 0.00208472, total time[s] 0.0831 +Converged at iteration 30, L1 5.00331e-05, Linf 0.00384793, total time[s] 0.081731 +Converged at iteration 30, L1 5.85501e-05, Linf 0.00234913, total time[s] 0.079294 +Converged at iteration 30, L1 4.80879e-05, Linf 0.00308868, total time[s] 0.081549 +Converged at iteration 32, L1 7.6258e-05, Linf 0.0099814, total time[s] 0.084139 +Converged at iteration 25, L1 5.18802e-05, Linf 0.00371585, total time[s] 0.070027 +Converged at iteration 26, L1 4.96147e-05, Linf 0.00337497, total time[s] 0.069583 +Converged at iteration 24, L1 9.97921e-05, Linf 0.00469402, total time[s] 0.064658 +Converged at iteration 38, L1 7.81216e-05, Linf 0.0116042, total time[s] 0.103226 +Converged at iteration 35, L1 7.81854e-05, Linf 0.0113366, total time[s] 0.107202 +Converged at iteration 24, L1 8.32597e-05, Linf 0.00639594, total time[s] 0.065401 +Converged at iteration 28, L1 7.36975e-05, Linf 0.00794762, total time[s] 0.074146 +Converged at iteration 23, L1 5.29753e-05, Linf 0.00535845, total time[s] 0.06375 +Converged at iteration 22, L1 5.92902e-05, Linf 0.00632303, total time[s] 0.063045 +Converged at iteration 21, L1 6.38102e-05, Linf 0.0127286, total time[s] 0.063421 +Converged at iteration 22, L1 3.24895e-05, Linf 0.00345112, total time[s] 0.065872 +Converged at iteration 24, L1 6.7276e-05, Linf 0.00405211, total time[s] 0.073159 +Converged at iteration 21, L1 9.14354e-05, Linf 0.00343241, total time[s] 0.06137 +Converged at iteration 20, L1 7.31045e-05, Linf 0.00233514, total time[s] 0.059534 +Converged at iteration 20, L1 4.16182e-05, Linf 0.00635232, total time[s] 0.066161 +Converged at iteration 31, L1 7.1924e-05, Linf 0.00505118, total time[s] 0.091119 +Converged at iteration 20, L1 6.82577e-05, Linf 0.00465942, total time[s] 0.062346 +Converged at iteration 23, L1 6.21749e-05, Linf 0.00664993, total time[s] 0.10054 +Converged at iteration 26, L1 9.54049e-05, Linf 0.00576692, total time[s] 0.072678 +Converged at iteration 25, L1 6.27269e-05, Linf 0.00259562, total time[s] 0.088936 +Converged at iteration 22, L1 8.1658e-05, Linf 0.00415999, total time[s] 0.062561 +Converged at iteration 23, L1 8.63627e-05, Linf 0.00500383, total time[s] 0.063604 +Converged at iteration 25, L1 6.76633e-05, Linf 0.00445185, total time[s] 0.068374 +Converged at iteration 24, L1 8.5432e-05, Linf 0.00552246, total time[s] 0.065119 +Converged at iteration 30, L1 9.45932e-05, Linf 0.0065245, total time[s] 0.078982 +Converged at iteration 29, L1 5.94238e-05, Linf 0.00213321, total time[s] 0.081836 +Converged at iteration 30, L1 5.00439e-05, Linf 0.0038767, total time[s] 0.083708 +Converged at iteration 30, L1 5.84363e-05, Linf 0.00241656, total time[s] 0.284219 +Converged at iteration 30, L1 5.10849e-05, Linf 0.00353597, total time[s] 0.092535 +Converged at iteration 32, L1 7.7451e-05, Linf 0.0102396, total time[s] 0.09043 +Converged at iteration 24, L1 9.77406e-05, Linf 0.00859617, total time[s] 0.064439 +Converged at iteration 26, L1 4.95004e-05, Linf 0.00331251, total time[s] 0.070778 +Converged at iteration 25, L1 5.30528e-05, Linf 0.00252368, total time[s] 0.06668 +Converged at iteration 38, L1 7.69045e-05, Linf 0.0118328, total time[s] 0.106644 +Converged at iteration 35, L1 8.00167e-05, Linf 0.011685, total time[s] 0.113731 +Converged at iteration 24, L1 8.44578e-05, Linf 0.006687, total time[s] 0.07234 +Converged at iteration 28, L1 7.20682e-05, Linf 0.0079921, total time[s] 0.072023 +Converged at iteration 23, L1 5.41547e-05, Linf 0.00615997, total time[s] 0.060812 +Converged at iteration 22, L1 5.96809e-05, Linf 0.00634002, total time[s] 0.059091 +Converged at iteration 21, L1 6.4845e-05, Linf 0.0130833, total time[s] 0.072724 +Converged at iteration 22, L1 3.27073e-05, Linf 0.00350423, total time[s] 0.061092 +Converged at iteration 24, L1 6.71066e-05, Linf 0.00401027, total time[s] 0.065582 +Converged at iteration 21, L1 9.85173e-05, Linf 0.00366946, total time[s] 0.060289 +Converged at iteration 20, L1 7.4734e-05, Linf 0.00240063, total time[s] 0.054259 +Converged at iteration 20, L1 4.23061e-05, Linf 0.00641076, total time[s] 0.0605 +Converged at iteration 31, L1 7.31521e-05, Linf 0.00516191, total time[s] 0.098366 +Converged at iteration 20, L1 6.89823e-05, Linf 0.00468705, total time[s] 0.059982 +Converged at iteration 23, L1 6.22098e-05, Linf 0.00657531, total time[s] 0.060855 +Converged at iteration 26, L1 9.45478e-05, Linf 0.00583735, total time[s] 0.06786 +Converged at iteration 25, L1 6.42527e-05, Linf 0.00266012, total time[s] 0.065396 +Converged at iteration 22, L1 8.35901e-05, Linf 0.00430851, total time[s] 0.057569 +Converged at iteration 23, L1 8.69391e-05, Linf 0.00501138, total time[s] 0.060547 +Converged at iteration 25, L1 6.76907e-05, Linf 0.004416, total time[s] 0.065541 +Converged at iteration 24, L1 7.96403e-05, Linf 0.0053983, total time[s] 0.063404 +Converged at iteration 30, L1 9.57384e-05, Linf 0.00649939, total time[s] 0.077044 +Converged at iteration 29, L1 6.07393e-05, Linf 0.00216539, total time[s] 0.074635 +Converged at iteration 30, L1 5.03201e-05, Linf 0.00397469, total time[s] 0.077955 +Converged at iteration 30, L1 5.98084e-05, Linf 0.00245285, total time[s] 0.076371 +Converged at iteration 30, L1 5.53707e-05, Linf 0.00393546, total time[s] 0.078987 +Converged at iteration 32, L1 7.88797e-05, Linf 0.0105027, total time[s] 0.082774 +Converged at iteration 24, L1 9.53125e-05, Linf 0.00855035, total time[s] 0.063692 +Converged at iteration 26, L1 4.98226e-05, Linf 0.00325414, total time[s] 0.06871 +Converged at iteration 25, L1 5.38737e-05, Linf 0.00235108, total time[s] 0.064685 +Converged at iteration 38, L1 7.66732e-05, Linf 0.0120422, total time[s] 0.096116 +Converged at iteration 35, L1 8.33112e-05, Linf 0.0120256, total time[s] 0.092493 +Converged at iteration 24, L1 8.57815e-05, Linf 0.00703685, total time[s] 0.067183 +Converged at iteration 28, L1 7.04728e-05, Linf 0.00803538, total time[s] 0.078254 +Converged at iteration 23, L1 5.53887e-05, Linf 0.00642601, total time[s] 0.061275 +Converged at iteration 22, L1 5.995e-05, Linf 0.00636384, total time[s] 0.061058 +Converged at iteration 21, L1 6.5708e-05, Linf 0.0134378, total time[s] 0.059631 +Converged at iteration 22, L1 3.31616e-05, Linf 0.00359511, total time[s] 0.060298 +Converged at iteration 24, L1 6.71985e-05, Linf 0.00399442, total time[s] 0.067133 +Converged at iteration 22, L1 6.28203e-05, Linf 0.00205582, total time[s] 0.063737 +Converged at iteration 20, L1 7.66412e-05, Linf 0.00246465, total time[s] 0.053957 +Converged at iteration 20, L1 4.30573e-05, Linf 0.00646638, total time[s] 0.067744 +Converged at iteration 31, L1 7.36954e-05, Linf 0.00515973, total time[s] 0.113417 +Converged at iteration 20, L1 6.9654e-05, Linf 0.00476005, total time[s] 0.058598 +Converged at iteration 23, L1 6.25703e-05, Linf 0.00658703, total time[s] 0.068497 +Converged at iteration 26, L1 9.36056e-05, Linf 0.00589829, total time[s] 0.067961 +Converged at iteration 25, L1 6.58197e-05, Linf 0.00272163, total time[s] 0.065067 +Converged at iteration 22, L1 8.56923e-05, Linf 0.00443778, total time[s] 0.058207 +Converged at iteration 23, L1 8.75991e-05, Linf 0.00512449, total time[s] 0.060667 +Converged at iteration 25, L1 6.76847e-05, Linf 0.00442418, total time[s] 0.064143 +Converged at iteration 24, L1 7.43149e-05, Linf 0.00529773, total time[s] 0.062489 +Converged at iteration 30, L1 9.7298e-05, Linf 0.00653793, total time[s] 0.075821 +Converged at iteration 29, L1 6.17717e-05, Linf 0.00216408, total time[s] 0.074758 +Converged at iteration 30, L1 5.06345e-05, Linf 0.00401113, total time[s] 0.075736 +Converged at iteration 30, L1 5.82499e-05, Linf 0.00248823, total time[s] 0.076814 +Converged at iteration 30, L1 5.78476e-05, Linf 0.00427118, total time[s] 0.076336 +Converged at iteration 32, L1 8.10999e-05, Linf 0.0107719, total time[s] 0.080584 +Converged at iteration 24, L1 8.88461e-05, Linf 0.00851855, total time[s] 0.062207 +Converged at iteration 26, L1 4.95138e-05, Linf 0.00320094, total time[s] 0.066892 +Converged at iteration 25, L1 5.47811e-05, Linf 0.00223011, total time[s] 0.066148 +Converged at iteration 38, L1 7.53224e-05, Linf 0.0122607, total time[s] 0.103554 +Converged at iteration 35, L1 8.3402e-05, Linf 0.0123969, total time[s] 0.097839 +Converged at iteration 24, L1 8.75127e-05, Linf 0.00727787, total time[s] 0.065796 +Converged at iteration 28, L1 6.89335e-05, Linf 0.00807699, total time[s] 0.113763 +Converged at iteration 23, L1 5.64751e-05, Linf 0.00665971, total time[s] 0.068469 +Converged at iteration 22, L1 6.03594e-05, Linf 0.00642043, total time[s] 0.060887 +Converged at iteration 21, L1 6.66137e-05, Linf 0.0137926, total time[s] 0.059342 +Converged at iteration 22, L1 3.33702e-05, Linf 0.00352972, total time[s] 0.064389 +Converged at iteration 24, L1 6.67849e-05, Linf 0.00395326, total time[s] 0.07067 +Converged at iteration 22, L1 6.9899e-05, Linf 0.00214918, total time[s] 0.065756 +Converged at iteration 20, L1 7.87972e-05, Linf 0.00252691, total time[s] 0.078052 +Converged at iteration 20, L1 4.37572e-05, Linf 0.00651959, total time[s] 0.060477 +Converged at iteration 31, L1 7.44963e-05, Linf 0.00524561, total time[s] 0.081126 +Converged at iteration 20, L1 7.01354e-05, Linf 0.00472786, total time[s] 0.05503 +Converged at iteration 23, L1 6.26464e-05, Linf 0.00643121, total time[s] 0.060155 +Converged at iteration 26, L1 9.29239e-05, Linf 0.00595346, total time[s] 0.068168 +Converged at iteration 25, L1 6.7379e-05, Linf 0.00278039, total time[s] 0.064723 +Converged at iteration 22, L1 8.78426e-05, Linf 0.00455391, total time[s] 0.058341 +Converged at iteration 23, L1 8.8149e-05, Linf 0.00502808, total time[s] 0.060897 +Converged at iteration 25, L1 6.75117e-05, Linf 0.00434799, total time[s] 0.065037 +Converged at iteration 24, L1 6.93116e-05, Linf 0.0050727, total time[s] 0.062404 +Converged at iteration 30, L1 9.92188e-05, Linf 0.00673069, total time[s] 0.076869 +Converged at iteration 29, L1 6.2987e-05, Linf 0.00221061, total time[s] 0.076955 +Converged at iteration 30, L1 5.03932e-05, Linf 0.00403472, total time[s] 0.08773 +Converged at iteration 30, L1 5.82713e-05, Linf 0.00252246, total time[s] 0.079876 +Converged at iteration 30, L1 6.10851e-05, Linf 0.00455024, total time[s] 0.097801 +Converged at iteration 32, L1 8.33083e-05, Linf 0.0110439, total time[s] 0.101667 +Converged at iteration 24, L1 8.55629e-05, Linf 0.00849218, total time[s] 0.075639 +Converged at iteration 26, L1 5.06439e-05, Linf 0.00314551, total time[s] 0.081119 +Converged at iteration 25, L1 5.55592e-05, Linf 0.00212013, total time[s] 0.081335 +Converged at iteration 38, L1 7.5431e-05, Linf 0.012492, total time[s] 0.131236 +Converged at iteration 35, L1 8.52447e-05, Linf 0.012755, total time[s] 0.101956 +Converged at iteration 24, L1 8.88307e-05, Linf 0.0076137, total time[s] 0.064889 +Converged at iteration 28, L1 6.75249e-05, Linf 0.00811718, total time[s] 0.07371 +Converged at iteration 23, L1 5.72174e-05, Linf 0.00612959, total time[s] 0.062679 +Converged at iteration 22, L1 6.01817e-05, Linf 0.00649076, total time[s] 0.07993 +Converged at iteration 21, L1 6.72785e-05, Linf 0.0141476, total time[s] 0.057053 +Converged at iteration 22, L1 3.42148e-05, Linf 0.00376882, total time[s] 0.060653 +Converged at iteration 24, L1 6.63712e-05, Linf 0.00393673, total time[s] 0.064377 +Converged at iteration 22, L1 7.49071e-05, Linf 0.00222487, total time[s] 0.059319 +Converged at iteration 20, L1 8.0815e-05, Linf 0.00258767, total time[s] 0.055757 +Converged at iteration 20, L1 4.43957e-05, Linf 0.00657001, total time[s] 0.054253 +Converged at iteration 31, L1 7.54802e-05, Linf 0.00527752, total time[s] 0.084122 +Converged at iteration 20, L1 7.06487e-05, Linf 0.00474888, total time[s] 0.057829 +Converged at iteration 23, L1 6.30485e-05, Linf 0.00637729, total time[s] 0.063846 +Converged at iteration 26, L1 9.18969e-05, Linf 0.00600014, total time[s] 0.069197 +Converged at iteration 25, L1 6.89037e-05, Linf 0.00283675, total time[s] 0.069623 +Converged at iteration 22, L1 8.99232e-05, Linf 0.00468149, total time[s] 0.06066 +Converged at iteration 23, L1 8.87182e-05, Linf 0.00503618, total time[s] 0.064665 +Converged at iteration 25, L1 6.73069e-05, Linf 0.00432627, total time[s] 0.068626 +Converged at iteration 24, L1 6.47876e-05, Linf 0.0048694, total time[s] 0.065994 +Converged at iteration 31, L1 4.90434e-05, Linf 0.00376689, total time[s] 0.080759 +Converged at iteration 29, L1 6.42169e-05, Linf 0.00224673, total time[s] 0.077326 +Converged at iteration 30, L1 5.07317e-05, Linf 0.00420188, total time[s] 0.079204 +Converged at iteration 30, L1 5.86847e-05, Linf 0.00255555, total time[s] 0.079 +Converged at iteration 30, L1 6.48386e-05, Linf 0.00477655, total time[s] 0.07772 +Converged at iteration 32, L1 8.33165e-05, Linf 0.0113268, total time[s] 0.084085 +Converged at iteration 24, L1 7.89266e-05, Linf 0.0084748, total time[s] 0.063365 +Converged at iteration 26, L1 4.9131e-05, Linf 0.00310619, total time[s] 0.069043 +Converged at iteration 25, L1 5.58852e-05, Linf 0.00218174, total time[s] 0.067868 +Converged at iteration 38, L1 7.2594e-05, Linf 0.0127045, total time[s] 0.099704 +Converged at iteration 35, L1 8.70353e-05, Linf 0.0131251, total time[s] 0.100207 +Converged at iteration 24, L1 9.06573e-05, Linf 0.00787677, total time[s] 0.064895 +Converged at iteration 28, L1 6.60262e-05, Linf 0.00815538, total time[s] 0.073837 +Converged at iteration 23, L1 5.7916e-05, Linf 0.00701751, total time[s] 0.061916 +Converged at iteration 22, L1 6.04366e-05, Linf 0.00643385, total time[s] 0.065188 +Converged at iteration 21, L1 6.80511e-05, Linf 0.014503, total time[s] 0.057682 +Converged at iteration 22, L1 3.4898e-05, Linf 0.00393629, total time[s] 0.060194 +Converged at iteration 24, L1 6.63752e-05, Linf 0.00390396, total time[s] 0.063972 +Converged at iteration 22, L1 7.87267e-05, Linf 0.00233445, total time[s] 0.06073 +Converged at iteration 20, L1 8.29259e-05, Linf 0.00264694, total time[s] 0.061675 +Converged at iteration 20, L1 4.50561e-05, Linf 0.00664039, total time[s] 0.063172 +Converged at iteration 31, L1 7.78158e-05, Linf 0.0053311, total time[s] 0.08372 +Converged at iteration 20, L1 7.1092e-05, Linf 0.00476765, total time[s] 0.056121 +Converged at iteration 23, L1 6.29066e-05, Linf 0.00633838, total time[s] 0.0619 +Converged at iteration 26, L1 9.10026e-05, Linf 0.00603515, total time[s] 0.074052 +Converged at iteration 25, L1 7.04018e-05, Linf 0.00289002, total time[s] 0.070891 +Converged at iteration 22, L1 9.19079e-05, Linf 0.00480727, total time[s] 0.061253 +Converged at iteration 23, L1 8.9191e-05, Linf 0.00504286, total time[s] 0.060997 +Converged at iteration 25, L1 6.69926e-05, Linf 0.00429369, total time[s] 0.093746 +Converged at iteration 24, L1 6.07254e-05, Linf 0.00466244, total time[s] 0.082541 +Converged at iteration 31, L1 4.99391e-05, Linf 0.0040074, total time[s] 0.080564 +Converged at iteration 29, L1 6.55603e-05, Linf 0.00230065, total time[s] 0.076445 +Converged at iteration 30, L1 5.09539e-05, Linf 0.00436809, total time[s] 0.079876 +Converged at iteration 30, L1 5.83496e-05, Linf 0.00258758, total time[s] 0.080676 +Converged at iteration 30, L1 6.87694e-05, Linf 0.0049735, total time[s] 0.078452 +Converged at iteration 32, L1 8.34958e-05, Linf 0.0116106, total time[s] 0.084176 +Converged at iteration 24, L1 7.46425e-05, Linf 0.00843444, total time[s] 0.065145 +Converged at iteration 26, L1 4.90151e-05, Linf 0.00306257, total time[s] 0.112711 +Converged at iteration 25, L1 5.60003e-05, Linf 0.00225606, total time[s] 0.065042 +Converged at iteration 38, L1 7.09681e-05, Linf 0.0129278, total time[s] 0.100652 +Converged at iteration 35, L1 8.87475e-05, Linf 0.0134971, total time[s] 0.100673 +Converged at iteration 24, L1 9.23505e-05, Linf 0.00823134, total time[s] 0.069929 +Converged at iteration 28, L1 6.45959e-05, Linf 0.00819174, total time[s] 0.07263 +Converged at iteration 23, L1 5.84436e-05, Linf 0.00714383, total time[s] 0.061281 +Converged at iteration 22, L1 6.01913e-05, Linf 0.00629052, total time[s] 0.058417 +Converged at iteration 21, L1 6.88788e-05, Linf 0.0148589, total time[s] 0.056369 +Converged at iteration 22, L1 3.54854e-05, Linf 0.00400253, total time[s] 0.05815 +Converged at iteration 24, L1 6.61816e-05, Linf 0.00388275, total time[s] 0.063421 +Converged at iteration 22, L1 8.29227e-05, Linf 0.00242695, total time[s] 0.058319 +Converged at iteration 20, L1 8.48804e-05, Linf 0.00270446, total time[s] 0.053502 +Converged at iteration 20, L1 4.56755e-05, Linf 0.00666772, total time[s] 0.055433 +Converged at iteration 31, L1 7.77519e-05, Linf 0.0053506, total time[s] 0.080048 +Converged at iteration 20, L1 7.15574e-05, Linf 0.00478901, total time[s] 0.053101 +Converged at iteration 23, L1 6.26167e-05, Linf 0.00631269, total time[s] 0.060674 +Converged at iteration 26, L1 9.0248e-05, Linf 0.00605689, total time[s] 0.068215 +Converged at iteration 25, L1 7.17409e-05, Linf 0.00294642, total time[s] 0.067601 +Converged at iteration 22, L1 9.3738e-05, Linf 0.00493122, total time[s] 0.058587 +Converged at iteration 23, L1 8.96848e-05, Linf 0.00504937, total time[s] 0.061054 +Converged at iteration 25, L1 6.67765e-05, Linf 0.00428057, total time[s] 0.066918 +Converged at iteration 24, L1 5.72881e-05, Linf 0.00447619, total time[s] 0.069834 +Converged at iteration 31, L1 5.10591e-05, Linf 0.00447909, total time[s] 0.079932 +Converged at iteration 29, L1 6.68452e-05, Linf 0.00236594, total time[s] 0.075173 +Converged at iteration 30, L1 5.12232e-05, Linf 0.00440022, total time[s] 0.078001 +Converged at iteration 30, L1 5.8437e-05, Linf 0.00261866, total time[s] 0.080496 +Converged at iteration 30, L1 7.29157e-05, Linf 0.00514876, total time[s] 0.077836 +Converged at iteration 32, L1 8.44347e-05, Linf 0.011903, total time[s] 0.083656 +Converged at iteration 24, L1 7.17848e-05, Linf 0.00818326, total time[s] 0.063185 +Converged at iteration 26, L1 4.89417e-05, Linf 0.00302348, total time[s] 0.067817 +Converged at iteration 25, L1 5.68372e-05, Linf 0.0022779, total time[s] 0.065289 +Converged at iteration 38, L1 7.15488e-05, Linf 0.0131441, total time[s] 0.108945 +Converged at iteration 35, L1 9.09959e-05, Linf 0.0138561, total time[s] 0.090568 +Converged at iteration 24, L1 9.26549e-05, Linf 0.00855338, total time[s] 0.064108 +Converged at iteration 28, L1 6.33726e-05, Linf 0.00822583, total time[s] 0.072499 +Converged at iteration 23, L1 5.86127e-05, Linf 0.00723535, total time[s] 0.060938 +Converged at iteration 22, L1 5.99319e-05, Linf 0.00614044, total time[s] 0.058259 +Converged at iteration 21, L1 6.96914e-05, Linf 0.0152146, total time[s] 0.056394 +Converged at iteration 22, L1 3.59145e-05, Linf 0.00405057, total time[s] 0.058866 +Converged at iteration 24, L1 6.6054e-05, Linf 0.00385984, total time[s] 0.0635 +Converged at iteration 22, L1 8.69994e-05, Linf 0.00254036, total time[s] 0.059021 +Converged at iteration 20, L1 8.68001e-05, Linf 0.00275928, total time[s] 0.054228 +Converged at iteration 20, L1 4.63383e-05, Linf 0.00671737, total time[s] 0.053524 +Converged at iteration 31, L1 7.94586e-05, Linf 0.00537824, total time[s] 0.080795 +Converged at iteration 20, L1 7.168e-05, Linf 0.00481509, total time[s] 0.053823 +Converged at iteration 23, L1 6.25217e-05, Linf 0.00629712, total time[s] 0.069448 +Converged at iteration 26, L1 8.96047e-05, Linf 0.00606808, total time[s] 0.067956 +Converged at iteration 25, L1 7.31382e-05, Linf 0.00300408, total time[s] 0.066918 +Converged at iteration 22, L1 9.57182e-05, Linf 0.00505365, total time[s] 0.058495 +Converged at iteration 23, L1 9.01871e-05, Linf 0.00505436, total time[s] 0.061687 +Converged at iteration 25, L1 6.67869e-05, Linf 0.00426946, total time[s] 0.065321 +Converged at iteration 23, L1 9.92926e-05, Linf 0.00647006, total time[s] 0.063251 +Converged at iteration 31, L1 5.13416e-05, Linf 0.00450445, total time[s] 0.081009 +Converged at iteration 29, L1 6.7927e-05, Linf 0.00241717, total time[s] 0.075636 +Converged at iteration 30, L1 5.13793e-05, Linf 0.00433577, total time[s] 0.077076 +Converged at iteration 30, L1 5.88405e-05, Linf 0.00264864, total time[s] 0.07841 +Converged at iteration 30, L1 7.74625e-05, Linf 0.00531358, total time[s] 0.077338 +Converged at iteration 32, L1 8.61576e-05, Linf 0.012196, total time[s] 0.081881 +Converged at iteration 24, L1 6.81839e-05, Linf 0.00703297, total time[s] 0.064333 +Converged at iteration 26, L1 4.93663e-05, Linf 0.00298911, total time[s] 0.067817 +Converged at iteration 25, L1 5.75293e-05, Linf 0.00228728, total time[s] 0.066021 +Converged at iteration 38, L1 6.85542e-05, Linf 0.0133552, total time[s] 0.101617 +Converged at iteration 35, L1 9.15691e-05, Linf 0.0142522, total time[s] 0.092692 +Converged at iteration 24, L1 9.3962e-05, Linf 0.00886547, total time[s] 0.063593 +Converged at iteration 28, L1 6.21267e-05, Linf 0.0082586, total time[s] 0.073625 +Converged at iteration 23, L1 5.87192e-05, Linf 0.00729321, total time[s] 0.059104 +Converged at iteration 22, L1 5.93804e-05, Linf 0.0061242, total time[s] 0.060941 +Converged at iteration 21, L1 7.04776e-05, Linf 0.0155706, total time[s] 0.062021 +Converged at iteration 22, L1 3.68478e-05, Linf 0.00414227, total time[s] 0.058964 +Converged at iteration 24, L1 6.5825e-05, Linf 0.00384003, total time[s] 0.062801 +Converged at iteration 22, L1 9.27995e-05, Linf 0.00628406, total time[s] 0.061897 +Converged at iteration 20, L1 8.86448e-05, Linf 0.00281376, total time[s] 0.055322 +Converged at iteration 20, L1 4.69742e-05, Linf 0.00676688, total time[s] 0.059925 +Converged at iteration 31, L1 8.07963e-05, Linf 0.00539705, total time[s] 0.088922 +Converged at iteration 20, L1 7.19673e-05, Linf 0.00483696, total time[s] 0.05551 +Converged at iteration 23, L1 6.24451e-05, Linf 0.00628567, total time[s] 0.06823 +Converged at iteration 26, L1 8.92153e-05, Linf 0.00606074, total time[s] 0.074635 +Converged at iteration 25, L1 7.45167e-05, Linf 0.00305955, total time[s] 0.076118 +Converged at iteration 22, L1 9.77824e-05, Linf 0.00517445, total time[s] 0.090748 +Converged at iteration 23, L1 9.07762e-05, Linf 0.00512281, total time[s] 0.072392 +Converged at iteration 25, L1 6.7213e-05, Linf 0.00426247, total time[s] 0.066514 +Converged at iteration 23, L1 9.42113e-05, Linf 0.00622033, total time[s] 0.063679 +Converged at iteration 31, L1 5.17989e-05, Linf 0.00420108, total time[s] 0.08085 +Converged at iteration 29, L1 6.94516e-05, Linf 0.0024679, total time[s] 0.076517 +Converged at iteration 30, L1 5.14298e-05, Linf 0.00424483, total time[s] 0.079736 +Converged at iteration 30, L1 5.8542e-05, Linf 0.00267761, total time[s] 0.078745 +Converged at iteration 30, L1 8.14144e-05, Linf 0.00546788, total time[s] 0.077918 +Converged at iteration 32, L1 8.6828e-05, Linf 0.012498, total time[s] 0.082666 +Converged at iteration 24, L1 6.6064e-05, Linf 0.00751219, total time[s] 0.06369 +Converged at iteration 26, L1 4.89813e-05, Linf 0.0029587, total time[s] 0.067958 +Converged at iteration 25, L1 5.80645e-05, Linf 0.00229611, total time[s] 0.065501 +Converged at iteration 38, L1 6.77887e-05, Linf 0.0135453, total time[s] 0.098062 +Converged at iteration 35, L1 9.37191e-05, Linf 0.0146348, total time[s] 0.091518 +Converged at iteration 24, L1 9.51685e-05, Linf 0.00918911, total time[s] 0.06255 +Converged at iteration 28, L1 6.09384e-05, Linf 0.00829008, total time[s] 0.074911 +Converged at iteration 23, L1 5.8944e-05, Linf 0.00732082, total time[s] 0.06203 +Converged at iteration 22, L1 5.92551e-05, Linf 0.00621583, total time[s] 0.059734 +Converged at iteration 21, L1 7.13411e-05, Linf 0.015924, total time[s] 0.056996 +Converged at iteration 22, L1 3.69536e-05, Linf 0.00417054, total time[s] 0.066014 +Converged at iteration 24, L1 6.61857e-05, Linf 0.00381977, total time[s] 0.064029 +Converged at iteration 22, L1 9.69304e-05, Linf 0.00285084, total time[s] 0.060243 +Converged at iteration 20, L1 9.05112e-05, Linf 0.00287308, total time[s] 0.054616 +Converged at iteration 20, L1 4.7558e-05, Linf 0.00681427, total time[s] 0.055647 +Converged at iteration 31, L1 8.16386e-05, Linf 0.00545835, total time[s] 0.082216 +Converged at iteration 20, L1 7.20685e-05, Linf 0.0048574, total time[s] 0.05423 +Converged at iteration 23, L1 6.22585e-05, Linf 0.00627428, total time[s] 0.061325 +Converged at iteration 26, L1 8.84067e-05, Linf 0.00604092, total time[s] 0.068384 +Converged at iteration 25, L1 7.59889e-05, Linf 0.00311475, total time[s] 0.066149 +Converged at iteration 22, L1 9.99872e-05, Linf 0.00529383, total time[s] 0.059202 +Converged at iteration 23, L1 9.13301e-05, Linf 0.00506189, total time[s] 0.062051 +Converged at iteration 25, L1 6.71144e-05, Linf 0.00425855, total time[s] 0.070957 +Converged at iteration 23, L1 9.17741e-05, Linf 0.00599214, total time[s] 0.063489 +Converged at iteration 31, L1 5.26123e-05, Linf 0.00392114, total time[s] 0.080809 +Converged at iteration 29, L1 7.03654e-05, Linf 0.00251094, total time[s] 0.075786 +Converged at iteration 30, L1 5.17027e-05, Linf 0.0043042, total time[s] 0.077357 +Converged at iteration 30, L1 5.85935e-05, Linf 0.00270575, total time[s] 0.078608 +Converged at iteration 30, L1 8.56633e-05, Linf 0.00563959, total time[s] 0.07782 +Converged at iteration 32, L1 8.85445e-05, Linf 0.0128018, total time[s] 0.082636 +Converged at iteration 24, L1 6.43431e-05, Linf 0.00715132, total time[s] 0.065342 +Converged at iteration 26, L1 4.96845e-05, Linf 0.00293267, total time[s] 0.068848 +Converged at iteration 25, L1 5.87309e-05, Linf 0.00231596, total time[s] 0.06557 +Converged at iteration 38, L1 6.61122e-05, Linf 0.0137727, total time[s] 0.099123 +Converged at iteration 35, L1 9.45082e-05, Linf 0.0150199, total time[s] 0.096582 +Converged at iteration 24, L1 9.67748e-05, Linf 0.00952997, total time[s] 0.064917 +Converged at iteration 28, L1 5.96987e-05, Linf 0.00832134, total time[s] 0.073008 +Converged at iteration 23, L1 5.96946e-05, Linf 0.00732075, total time[s] 0.062296 +Converged at iteration 22, L1 5.9151e-05, Linf 0.00631376, total time[s] 0.059704 +Converged at iteration 21, L1 7.21525e-05, Linf 0.0162783, total time[s] 0.056645 +Converged at iteration 22, L1 3.86079e-05, Linf 0.00433445, total time[s] 0.060212 +Converged at iteration 24, L1 6.59528e-05, Linf 0.00381061, total time[s] 0.063644 +Converged at iteration 23, L1 5.57932e-05, Linf 0.00181787, total time[s] 0.063394 +Converged at iteration 20, L1 9.24005e-05, Linf 0.00293255, total time[s] 0.054725 +Converged at iteration 20, L1 4.81531e-05, Linf 0.00686042, total time[s] 0.054698 +Converged at iteration 31, L1 8.30364e-05, Linf 0.00556459, total time[s] 0.080742 +Converged at iteration 20, L1 7.22798e-05, Linf 0.00486327, total time[s] 0.054384 +Converged at iteration 23, L1 6.23669e-05, Linf 0.00625494, total time[s] 0.064711 +Converged at iteration 26, L1 8.72524e-05, Linf 0.00603247, total time[s] 0.074406 +Converged at iteration 25, L1 7.75266e-05, Linf 0.00317029, total time[s] 0.072798 +Converged at iteration 23, L1 4.9336e-05, Linf 0.00304368, total time[s] 0.064289 +Converged at iteration 23, L1 9.16842e-05, Linf 0.00507424, total time[s] 0.064702 +Converged at iteration 25, L1 6.6777e-05, Linf 0.00426029, total time[s] 0.066546 +Converged at iteration 23, L1 9.07209e-05, Linf 0.00588444, total time[s] 0.062577 +Converged at iteration 31, L1 5.35796e-05, Linf 0.00369761, total time[s] 0.08454 +Converged at iteration 29, L1 7.14507e-05, Linf 0.00254764, total time[s] 0.073413 +Converged at iteration 30, L1 5.20659e-05, Linf 0.00425062, total time[s] 0.078544 +Converged at iteration 30, L1 5.87013e-05, Linf 0.00273224, total time[s] 0.077895 +Converged at iteration 30, L1 8.97039e-05, Linf 0.00600122, total time[s] 0.078517 +Converged at iteration 32, L1 8.96976e-05, Linf 0.0131142, total time[s] 0.084105 +Converged at iteration 24, L1 6.31453e-05, Linf 0.00683188, total time[s] 0.064447 +Converged at iteration 26, L1 4.89201e-05, Linf 0.00290737, total time[s] 0.069714 +Converged at iteration 25, L1 5.93554e-05, Linf 0.00234346, total time[s] 0.066684 +Converged at iteration 38, L1 6.49893e-05, Linf 0.0139785, total time[s] 0.111901 +Converged at iteration 35, L1 9.60176e-05, Linf 0.0154142, total time[s] 0.090477 +Converged at iteration 24, L1 9.79427e-05, Linf 0.00997133, total time[s] 0.064613 +Converged at iteration 28, L1 5.84043e-05, Linf 0.00835272, total time[s] 0.077665 +Converged at iteration 23, L1 5.9752e-05, Linf 0.00729638, total time[s] 0.062074 +Converged at iteration 22, L1 5.859e-05, Linf 0.0064129, total time[s] 0.060662 +Converged at iteration 21, L1 7.30062e-05, Linf 0.016631, total time[s] 0.057117 +Converged at iteration 22, L1 3.94e-05, Linf 0.00436407, total time[s] 0.059176 +Converged at iteration 24, L1 6.59597e-05, Linf 0.00380132, total time[s] 0.064917 +Converged at iteration 23, L1 5.86433e-05, Linf 0.00190674, total time[s] 0.062116 +Converged at iteration 20, L1 9.4278e-05, Linf 0.00299119, total time[s] 0.053391 +Converged at iteration 20, L1 4.8637e-05, Linf 0.00690341, total time[s] 0.102039 +Converged at iteration 31, L1 8.43355e-05, Linf 0.00567003, total time[s] 0.093696 +Converged at iteration 20, L1 7.2717e-05, Linf 0.0048764, total time[s] 0.054436 +Converged at iteration 23, L1 6.1915e-05, Linf 0.00633104, total time[s] 0.064768 +Converged at iteration 26, L1 8.6555e-05, Linf 0.00601059, total time[s] 0.071891 +Converged at iteration 25, L1 7.88506e-05, Linf 0.00322443, total time[s] 0.065982 +Converged at iteration 23, L1 5.04108e-05, Linf 0.00309016, total time[s] 0.060602 +Converged at iteration 23, L1 9.24702e-05, Linf 0.00506846, total time[s] 0.06043 +Converged at iteration 25, L1 6.59971e-05, Linf 0.00426585, total time[s] 0.064701 +Converged at iteration 23, L1 9.07004e-05, Linf 0.00561447, total time[s] 0.061742 +Converged at iteration 31, L1 5.41864e-05, Linf 0.00356719, total time[s] 0.080838 +Converged at iteration 29, L1 7.23165e-05, Linf 0.00258287, total time[s] 0.076188 +Converged at iteration 30, L1 5.22803e-05, Linf 0.0041731, total time[s] 0.081666 +Converged at iteration 30, L1 5.89255e-05, Linf 0.00275657, total time[s] 0.078366 +Converged at iteration 30, L1 9.37336e-05, Linf 0.00633619, total time[s] 0.078858 +Converged at iteration 32, L1 9.19209e-05, Linf 0.0134272, total time[s] 0.08527 +Converged at iteration 24, L1 6.3048e-05, Linf 0.00655606, total time[s] 0.063038 +Converged at iteration 26, L1 4.92966e-05, Linf 0.0028818, total time[s] 0.069212 +Converged at iteration 25, L1 6.00782e-05, Linf 0.00237956, total time[s] 0.066377 +Converged at iteration 38, L1 6.86212e-05, Linf 0.014183, total time[s] 0.100033 +Converged at iteration 35, L1 9.74904e-05, Linf 0.0158032, total time[s] 0.094464 +Converged at iteration 24, L1 9.95483e-05, Linf 0.0107995, total time[s] 0.062365 +Converged at iteration 28, L1 5.73118e-05, Linf 0.00838381, total time[s] 0.071901 +Converged at iteration 23, L1 6.05816e-05, Linf 0.00724262, total time[s] 0.06077 +Converged at iteration 22, L1 5.82944e-05, Linf 0.00651124, total time[s] 0.058047 +Converged at iteration 21, L1 7.38414e-05, Linf 0.0169831, total time[s] 0.056285 +Converged at iteration 22, L1 4.00441e-05, Linf 0.00442221, total time[s] 0.061464 +Converged at iteration 24, L1 6.65927e-05, Linf 0.00379924, total time[s] 0.068936 +Converged at iteration 23, L1 6.13325e-05, Linf 0.00199348, total time[s] 0.060297 +Converged at iteration 20, L1 9.62198e-05, Linf 0.00304832, total time[s] 0.052446 +Converged at iteration 20, L1 4.91073e-05, Linf 0.00694486, total time[s] 0.052741 +Converged at iteration 31, L1 8.56695e-05, Linf 0.00572988, total time[s] 0.107308 +Converged at iteration 20, L1 7.28758e-05, Linf 0.00487812, total time[s] 0.060556 +Converged at iteration 23, L1 6.15186e-05, Linf 0.00619807, total time[s] 0.066181 +Converged at iteration 26, L1 8.56773e-05, Linf 0.00598974, total time[s] 0.06828 +Converged at iteration 25, L1 8.0397e-05, Linf 0.00327553, total time[s] 0.068933 +Converged at iteration 23, L1 5.13691e-05, Linf 0.00315937, total time[s] 0.063114 +Converged at iteration 23, L1 9.31427e-05, Linf 0.0050721, total time[s] 0.063059 +Converged at iteration 25, L1 6.62595e-05, Linf 0.00426668, total time[s] 0.070197 +Converged at iteration 23, L1 9.14075e-05, Linf 0.00540221, total time[s] 0.064503 +Converged at iteration 31, L1 5.4884e-05, Linf 0.00360294, total time[s] 0.081101 +Converged at iteration 29, L1 7.33823e-05, Linf 0.00261598, total time[s] 0.078191 +Converged at iteration 30, L1 5.25603e-05, Linf 0.0040327, total time[s] 0.085281 +Converged at iteration 30, L1 5.90261e-05, Linf 0.00277105, total time[s] 0.079775 +Converged at iteration 30, L1 9.84664e-05, Linf 0.0066602, total time[s] 0.079785 +Converged at iteration 32, L1 9.30694e-05, Linf 0.0137499, total time[s] 0.083297 +Converged at iteration 24, L1 6.21991e-05, Linf 0.0062699, total time[s] 0.064507 +Converged at iteration 26, L1 4.88866e-05, Linf 0.00284821, total time[s] 0.069299 +Converged at iteration 25, L1 6.08371e-05, Linf 0.00242282, total time[s] 0.067719 +Converged at iteration 38, L1 6.30618e-05, Linf 0.014384, total time[s] 0.097652 +Converged at iteration 35, L1 9.90268e-05, Linf 0.0162028, total time[s] 0.090685 +Converged at iteration 25, L1 3.48784e-05, Linf 0.00479822, total time[s] 0.067455 +Converged at iteration 28, L1 5.6196e-05, Linf 0.00841606, total time[s] 0.075618 +Converged at iteration 23, L1 6.12664e-05, Linf 0.00717073, total time[s] 0.061181 +Converged at iteration 22, L1 5.76379e-05, Linf 0.00585153, total time[s] 0.059526 +Converged at iteration 21, L1 7.48164e-05, Linf 0.0173336, total time[s] 0.057097 +Converged at iteration 22, L1 4.1594e-05, Linf 0.00458011, total time[s] 0.059494 +Converged at iteration 24, L1 6.69905e-05, Linf 0.0038003, total time[s] 0.063706 +Converged at iteration 23, L1 6.55398e-05, Linf 0.00208182, total time[s] 0.061418 +Converged at iteration 20, L1 9.84724e-05, Linf 0.00310511, total time[s] 0.054363 +Converged at iteration 20, L1 4.96829e-05, Linf 0.00698722, total time[s] 0.054171 +Converged at iteration 31, L1 8.69233e-05, Linf 0.00570415, total time[s] 0.08125 +Converged at iteration 20, L1 7.31392e-05, Linf 0.00488598, total time[s] 0.05447 +Converged at iteration 23, L1 6.1725e-05, Linf 0.00616354, total time[s] 0.062488 +Converged at iteration 26, L1 8.50714e-05, Linf 0.0059629, total time[s] 0.068582 +Converged at iteration 25, L1 8.22342e-05, Linf 0.00332446, total time[s] 0.06722 +Converged at iteration 23, L1 5.24464e-05, Linf 0.00321615, total time[s] 0.063247 +Converged at iteration 23, L1 9.37064e-05, Linf 0.00507511, total time[s] 0.06232 +Converged at iteration 25, L1 6.65311e-05, Linf 0.00427136, total time[s] 0.066645 +Converged at iteration 23, L1 9.36096e-05, Linf 0.00519456, total time[s] 0.062322 +Converged at iteration 31, L1 5.54102e-05, Linf 0.00344441, total time[s] 0.081767 +Converged at iteration 29, L1 7.48325e-05, Linf 0.00264689, total time[s] 0.078946 +Converged at iteration 30, L1 5.2794e-05, Linf 0.00391339, total time[s] 0.080145 +Converged at iteration 30, L1 5.90983e-05, Linf 0.00279721, total time[s] 0.076362 +Converged at iteration 31, L1 3.74217e-05, Linf 0.0039051, total time[s] 0.082245 +Converged at iteration 32, L1 9.46798e-05, Linf 0.0140744, total time[s] 0.085102 +Converged at iteration 24, L1 6.24836e-05, Linf 0.00578973, total time[s] 0.070861 +Converged at iteration 26, L1 4.88628e-05, Linf 0.0028334, total time[s] 0.066436 +Converged at iteration 25, L1 6.16114e-05, Linf 0.00246678, total time[s] 0.064162 +Converged at iteration 38, L1 6.20396e-05, Linf 0.014583, total time[s] 0.098631 +Converged at iteration 36, L1 3.373e-05, Linf 0.011238, total time[s] 0.100131 +Converged at iteration 25, L1 3.4709e-05, Linf 0.00492, total time[s] 0.065269 +Converged at iteration 28, L1 5.54899e-05, Linf 0.00861258, total time[s] 0.148006 +Converged at iteration 23, L1 6.07223e-05, Linf 0.0070789, total time[s] 0.065273 +Converged at iteration 22, L1 5.76188e-05, Linf 0.00615683, total time[s] 0.08167 +Converged at iteration 21, L1 7.56739e-05, Linf 0.0176813, total time[s] 0.06396 +Converged at iteration 22, L1 4.20992e-05, Linf 0.00464697, total time[s] 0.077093 +Converged at iteration 24, L1 6.78932e-05, Linf 0.00380207, total time[s] 0.328931 +Converged at iteration 23, L1 6.5783e-05, Linf 0.00216779, total time[s] 0.118575 +Converged at iteration 21, L1 5.14246e-05, Linf 0.00184939, total time[s] 0.064789 +Converged at iteration 20, L1 5.00835e-05, Linf 0.0070288, total time[s] 0.058861 +Converged at iteration 31, L1 8.82487e-05, Linf 0.00593243, total time[s] 0.082458 +Converged at iteration 20, L1 7.36122e-05, Linf 0.00489595, total time[s] 0.057791 +Converged at iteration 23, L1 6.26514e-05, Linf 0.00612934, total time[s] 0.072512 +Converged at iteration 26, L1 8.44857e-05, Linf 0.00593771, total time[s] 0.073583 +Converged at iteration 25, L1 8.4391e-05, Linf 0.00336802, total time[s] 0.066704 +Converged at iteration 23, L1 5.39371e-05, Linf 0.00488942, total time[s] 0.068324 +Converged at iteration 23, L1 9.39315e-05, Linf 0.00507656, total time[s] 0.064413 +Converged at iteration 25, L1 6.73198e-05, Linf 0.0042735, total time[s] 0.067695 +Converged at iteration 23, L1 9.589e-05, Linf 0.00499449, total time[s] 0.064643 +Converged at iteration 31, L1 5.60834e-05, Linf 0.00344695, total time[s] 0.084634 +Converged at iteration 29, L1 7.55298e-05, Linf 0.00267757, total time[s] 0.075596 +Converged at iteration 30, L1 5.30254e-05, Linf 0.00374245, total time[s] 0.079221 +Converged at iteration 30, L1 5.91615e-05, Linf 0.00281174, total time[s] 0.078485 +Converged at iteration 31, L1 3.8834e-05, Linf 0.0040389, total time[s] 0.081304 +Converged at iteration 32, L1 9.64178e-05, Linf 0.0144006, total time[s] 0.084208 +Converged at iteration 24, L1 6.35816e-05, Linf 0.00564879, total time[s] 0.066384 +Converged at iteration 26, L1 4.87124e-05, Linf 0.00281093, total time[s] 0.070076 +Converged at iteration 25, L1 6.24662e-05, Linf 0.00251648, total time[s] 0.068572 +Converged at iteration 38, L1 6.10624e-05, Linf 0.0147763, total time[s] 0.104157 +Converged at iteration 36, L1 3.65914e-05, Linf 0.0114444, total time[s] 0.131519 +Converged at iteration 25, L1 3.44999e-05, Linf 0.0050909, total time[s] 0.112076 +Converged at iteration 28, L1 5.43373e-05, Linf 0.0084813, total time[s] 0.077647 +Converged at iteration 23, L1 6.10985e-05, Linf 0.00646628, total time[s] 0.074435 +Converged at iteration 22, L1 5.68943e-05, Linf 0.00600417, total time[s] 0.074464 +Converged at iteration 21, L1 7.66437e-05, Linf 0.0180237, total time[s] 0.061819 +Converged at iteration 22, L1 4.3258e-05, Linf 0.00469331, total time[s] 0.064386 +Converged at iteration 24, L1 6.81313e-05, Linf 0.0038039, total time[s] 0.065202 +Converged at iteration 23, L1 6.83354e-05, Linf 0.00225771, total time[s] 0.066216 +Converged at iteration 21, L1 5.2353e-05, Linf 0.00187494, total time[s] 0.062088 +Converged at iteration 20, L1 5.07044e-05, Linf 0.00756638, total time[s] 0.059136 +Converged at iteration 31, L1 9.02735e-05, Linf 0.00606206, total time[s] 0.081677 +Converged at iteration 20, L1 7.3743e-05, Linf 0.00489601, total time[s] 0.054862 +Converged at iteration 23, L1 6.06515e-05, Linf 0.00609444, total time[s] 0.062252 +Converged at iteration 26, L1 8.35439e-05, Linf 0.00590921, total time[s] 0.071572 +Converged at iteration 25, L1 8.47858e-05, Linf 0.00340344, total time[s] 0.067061 +Converged at iteration 23, L1 5.42746e-05, Linf 0.00332728, total time[s] 0.063174 +Converged at iteration 23, L1 9.46085e-05, Linf 0.00508107, total time[s] 0.062381 +Converged at iteration 25, L1 6.68213e-05, Linf 0.00427782, total time[s] 0.077493 +Converged at iteration 24, L1 6.34742e-05, Linf 0.00268861, total time[s] 0.085025 +Converged at iteration 31, L1 5.66072e-05, Linf 0.00332592, total time[s] 0.095294 +Converged at iteration 29, L1 7.63404e-05, Linf 0.00272168, total time[s] 0.078536 +Converged at iteration 30, L1 5.32101e-05, Linf 0.00361981, total time[s] 0.078648 +Converged at iteration 30, L1 5.98448e-05, Linf 0.00282163, total time[s] 0.079038 +Converged at iteration 31, L1 4.02268e-05, Linf 0.00415982, total time[s] 0.080611 +Converged at iteration 32, L1 9.80074e-05, Linf 0.0147328, total time[s] 0.083909 +Converged at iteration 24, L1 6.50867e-05, Linf 0.00575841, total time[s] 0.063361 +Converged at iteration 26, L1 4.98636e-05, Linf 0.00279009, total time[s] 0.071566 +Converged at iteration 25, L1 6.32467e-05, Linf 0.00258335, total time[s] 0.06713 +Converged at iteration 38, L1 6.01145e-05, Linf 0.0149662, total time[s] 0.105601 +Converged at iteration 36, L1 3.40767e-05, Linf 0.0116695, total time[s] 0.091366 +Converged at iteration 25, L1 3.46803e-05, Linf 0.0053773, total time[s] 0.06599 +Converged at iteration 28, L1 5.34263e-05, Linf 0.00851484, total time[s] 0.073408 +Converged at iteration 23, L1 6.14825e-05, Linf 0.00687476, total time[s] 0.061252 +Converged at iteration 22, L1 5.66209e-05, Linf 0.0058609, total time[s] 0.058426 +Converged at iteration 21, L1 7.75725e-05, Linf 0.0183605, total time[s] 0.056032 +Converged at iteration 22, L1 4.37578e-05, Linf 0.00474252, total time[s] 0.058528 +Converged at iteration 24, L1 6.83143e-05, Linf 0.00380629, total time[s] 0.064533 +Converged at iteration 23, L1 7.09861e-05, Linf 0.00234559, total time[s] 0.060809 +Converged at iteration 21, L1 5.32748e-05, Linf 0.00190072, total time[s] 0.055583 +Converged at iteration 20, L1 5.1105e-05, Linf 0.00710623, total time[s] 0.053436 +Converged at iteration 31, L1 9.04315e-05, Linf 0.00611903, total time[s] 0.079458 +Converged at iteration 20, L1 7.4021e-05, Linf 0.00491066, total time[s] 0.054516 +Converged at iteration 23, L1 6.01541e-05, Linf 0.00606611, total time[s] 0.060662 +Converged at iteration 26, L1 8.2682e-05, Linf 0.00586452, total time[s] 0.067994 +Converged at iteration 25, L1 8.61444e-05, Linf 0.00343821, total time[s] 0.06578 +Converged at iteration 23, L1 5.52452e-05, Linf 0.00338162, total time[s] 0.060797 +Converged at iteration 23, L1 9.51026e-05, Linf 0.00508403, total time[s] 0.061226 +Converged at iteration 25, L1 6.70058e-05, Linf 0.00427786, total time[s] 0.066035 +Converged at iteration 24, L1 6.79284e-05, Linf 0.00246057, total time[s] 0.063053 +Converged at iteration 31, L1 5.73178e-05, Linf 0.00328618, total time[s] 0.079745 +Converged at iteration 29, L1 7.7356e-05, Linf 0.00281083, total time[s] 0.074897 +Converged at iteration 30, L1 5.33772e-05, Linf 0.00363813, total time[s] 0.077537 +Converged at iteration 30, L1 5.92997e-05, Linf 0.00282656, total time[s] 0.077132 +Converged at iteration 31, L1 4.20233e-05, Linf 0.0042775, total time[s] 0.080094 +Converged at iteration 32, L1 9.92783e-05, Linf 0.0150707, total time[s] 0.081939 +Converged at iteration 24, L1 6.83506e-05, Linf 0.00559067, total time[s] 0.063121 +Converged at iteration 26, L1 4.84283e-05, Linf 0.00277037, total time[s] 0.069188 +Converged at iteration 25, L1 6.40441e-05, Linf 0.00261504, total time[s] 0.067437 +Converged at iteration 38, L1 5.89996e-05, Linf 0.0151582, total time[s] 0.09874 +Converged at iteration 36, L1 3.4935e-05, Linf 0.0118952, total time[s] 0.093701 +Converged at iteration 25, L1 3.49192e-05, Linf 0.00566067, total time[s] 0.065327 +Converged at iteration 28, L1 5.26394e-05, Linf 0.00855016, total time[s] 0.073244 +Converged at iteration 23, L1 6.23856e-05, Linf 0.0067666, total time[s] 0.061222 +Converged at iteration 22, L1 5.63368e-05, Linf 0.00571278, total time[s] 0.062204 +Converged at iteration 21, L1 7.84044e-05, Linf 0.0186918, total time[s] 0.056585 +Converged at iteration 22, L1 4.57283e-05, Linf 0.00488069, total time[s] 0.058376 +Converged at iteration 24, L1 6.90268e-05, Linf 0.00381007, total time[s] 0.064693 +Converged at iteration 23, L1 7.39132e-05, Linf 0.00243528, total time[s] 0.062796 +Converged at iteration 21, L1 5.40843e-05, Linf 0.00192765, total time[s] 0.056098 +Converged at iteration 20, L1 5.16386e-05, Linf 0.00714613, total time[s] 0.054968 +Converged at iteration 31, L1 9.14175e-05, Linf 0.00613162, total time[s] 0.084236 +Converged at iteration 20, L1 7.44816e-05, Linf 0.00494349, total time[s] 0.053407 +Converged at iteration 23, L1 6.05157e-05, Linf 0.00604401, total time[s] 0.063232 +Converged at iteration 26, L1 8.18198e-05, Linf 0.00582281, total time[s] 0.068322 +Converged at iteration 25, L1 8.75087e-05, Linf 0.00347658, total time[s] 0.067396 +Converged at iteration 23, L1 5.61424e-05, Linf 0.0034352, total time[s] 0.062183 +Converged at iteration 23, L1 9.52531e-05, Linf 0.0050875, total time[s] 0.061281 +Converged at iteration 25, L1 6.75586e-05, Linf 0.00427751, total time[s] 0.065396 +Converged at iteration 24, L1 7.2915e-05, Linf 0.00222717, total time[s] 0.063098 +Converged at iteration 31, L1 5.8154e-05, Linf 0.00330658, total time[s] 0.079734 +Converged at iteration 29, L1 7.85528e-05, Linf 0.00280131, total time[s] 0.075466 +Converged at iteration 30, L1 5.36225e-05, Linf 0.00368092, total time[s] 0.077573 +Converged at iteration 30, L1 5.91669e-05, Linf 0.00282671, total time[s] 0.077185 +Converged at iteration 31, L1 4.33246e-05, Linf 0.00438609, total time[s] 0.079018 +Converged at iteration 33, L1 3.67965e-05, Linf 0.0116779, total time[s] 0.084447 +Converged at iteration 24, L1 7.16763e-05, Linf 0.00544401, total time[s] 0.063157 +Converged at iteration 26, L1 4.86942e-05, Linf 0.002753, total time[s] 0.067793 +Converged at iteration 25, L1 6.49419e-05, Linf 0.0026655, total time[s] 0.065855 +Converged at iteration 38, L1 6.34694e-05, Linf 0.0151798, total time[s] 0.099483 +Converged at iteration 36, L1 3.43718e-05, Linf 0.0121197, total time[s] 0.094813 +Converged at iteration 25, L1 3.48029e-05, Linf 0.00593637, total time[s] 0.066581 +Converged at iteration 28, L1 5.17421e-05, Linf 0.00858681, total time[s] 0.072225 +Converged at iteration 23, L1 6.2175e-05, Linf 0.00665016, total time[s] 0.06235 +Converged at iteration 22, L1 5.60997e-05, Linf 0.00558181, total time[s] 0.060674 +Converged at iteration 21, L1 7.93395e-05, Linf 0.0190171, total time[s] 0.056388 +Converged at iteration 22, L1 4.71369e-05, Linf 0.0049777, total time[s] 0.059458 +Converged at iteration 24, L1 6.95871e-05, Linf 0.00381493, total time[s] 0.063558 +Converged at iteration 23, L1 7.64548e-05, Linf 0.00252244, total time[s] 0.061808 +Converged at iteration 21, L1 5.49128e-05, Linf 0.00195604, total time[s] 0.055972 +Converged at iteration 20, L1 5.22484e-05, Linf 0.00718547, total time[s] 0.054623 +Converged at iteration 31, L1 9.24214e-05, Linf 0.00613957, total time[s] 0.084729 +Converged at iteration 20, L1 7.51592e-05, Linf 0.00496671, total time[s] 0.054839 +Converged at iteration 23, L1 6.05478e-05, Linf 0.00588395, total time[s] 0.063651 +Converged at iteration 26, L1 8.10077e-05, Linf 0.00577673, total time[s] 0.06861 +Converged at iteration 25, L1 8.9023e-05, Linf 0.00351798, total time[s] 0.067477 +Converged at iteration 23, L1 5.7057e-05, Linf 0.00348817, total time[s] 0.061452 +Converged at iteration 23, L1 9.61393e-05, Linf 0.00509151, total time[s] 0.061055 +Converged at iteration 25, L1 6.80692e-05, Linf 0.00427526, total time[s] 0.065809 +Converged at iteration 24, L1 7.98873e-05, Linf 0.00199006, total time[s] 0.063309 +Converged at iteration 31, L1 5.8828e-05, Linf 0.00332225, total time[s] 0.080132 +Converged at iteration 29, L1 7.97494e-05, Linf 0.00281099, total time[s] 0.076477 +Converged at iteration 30, L1 5.36218e-05, Linf 0.00372919, total time[s] 0.077083 +Converged at iteration 30, L1 5.91068e-05, Linf 0.00282188, total time[s] 0.077198 +Converged at iteration 31, L1 4.60381e-05, Linf 0.00449331, total time[s] 0.079755 +Converged at iteration 33, L1 3.65324e-05, Linf 0.0119398, total time[s] 0.084219 +Converged at iteration 24, L1 7.40842e-05, Linf 0.0053176, total time[s] 0.06372 +Converged at iteration 26, L1 4.81993e-05, Linf 0.00273755, total time[s] 0.072371 +Converged at iteration 25, L1 6.68267e-05, Linf 0.00268435, total time[s] 0.067096 +Converged at iteration 38, L1 6.28864e-05, Linf 0.0155117, total time[s] 0.113679 +Converged at iteration 36, L1 3.68377e-05, Linf 0.0123624, total time[s] 0.137341 +Converged at iteration 25, L1 3.46264e-05, Linf 0.00648209, total time[s] 0.065536 +Converged at iteration 28, L1 5.16782e-05, Linf 0.00862466, total time[s] 0.072938 +Converged at iteration 23, L1 6.30202e-05, Linf 0.00653452, total time[s] 0.072713 +Converged at iteration 22, L1 5.70128e-05, Linf 0.0054632, total time[s] 0.061645 +Converged at iteration 21, L1 8.03568e-05, Linf 0.0193365, total time[s] 0.064404 +Converged at iteration 22, L1 4.82059e-05, Linf 0.005033, total time[s] 0.063074 +Converged at iteration 24, L1 6.99658e-05, Linf 0.00382362, total time[s] 0.072536 +Converged at iteration 23, L1 7.94888e-05, Linf 0.00261266, total time[s] 0.062681 +Converged at iteration 21, L1 5.58059e-05, Linf 0.00198533, total time[s] 0.070729 +Converged at iteration 20, L1 5.27573e-05, Linf 0.00722323, total time[s] 0.05625 +Converged at iteration 31, L1 9.3582e-05, Linf 0.00636141, total time[s] 0.086193 +Converged at iteration 20, L1 7.55079e-05, Linf 0.00500196, total time[s] 0.058948 +Converged at iteration 23, L1 6.01722e-05, Linf 0.00547798, total time[s] 0.062136 +Converged at iteration 26, L1 8.10095e-05, Linf 0.00572948, total time[s] 0.071686 +Converged at iteration 25, L1 9.04468e-05, Linf 0.00355978, total time[s] 0.072754 +Converged at iteration 23, L1 5.83933e-05, Linf 0.00354063, total time[s] 0.061156 +Converged at iteration 23, L1 9.64944e-05, Linf 0.00509602, total time[s] 0.06568 +Converged at iteration 25, L1 6.80178e-05, Linf 0.00427389, total time[s] 0.068846 +Converged at iteration 24, L1 8.69185e-05, Linf 0.00174968, total time[s] 0.063856 +Converged at iteration 31, L1 5.91748e-05, Linf 0.00334007, total time[s] 0.089293 +Converged at iteration 29, L1 8.15974e-05, Linf 0.00284252, total time[s] 0.078388 +Converged at iteration 30, L1 5.83374e-05, Linf 0.00369872, total time[s] 0.08554 +Converged at iteration 30, L1 5.91087e-05, Linf 0.00279225, total time[s] 0.095387 +Converged at iteration 31, L1 4.68963e-05, Linf 0.00459061, total time[s] 0.103711 +Converged at iteration 33, L1 3.73339e-05, Linf 0.0121878, total time[s] 0.090331 +Converged at iteration 24, L1 7.60716e-05, Linf 0.00520532, total time[s] 0.063767 +Converged at iteration 26, L1 5.03349e-05, Linf 0.00272414, total time[s] 0.110604 +Converged at iteration 25, L1 6.65327e-05, Linf 0.00276589, total time[s] 0.079017 +Converged at iteration 38, L1 5.63791e-05, Linf 0.0156858, total time[s] 0.115366 +Converged at iteration 36, L1 3.45483e-05, Linf 0.0126142, total time[s] 0.114516 +Converged at iteration 25, L1 3.49677e-05, Linf 0.00707048, total time[s] 0.070022 +Converged at iteration 28, L1 5.14969e-05, Linf 0.00866362, total time[s] 0.077006 +Converged at iteration 23, L1 6.30475e-05, Linf 0.00642411, total time[s] 0.06417 +Converged at iteration 22, L1 5.55741e-05, Linf 0.0051979, total time[s] 0.061475 +Converged at iteration 21, L1 8.12592e-05, Linf 0.019651, total time[s] 0.069747 +Converged at iteration 22, L1 4.94816e-05, Linf 0.00509001, total time[s] 0.06903 +Converged at iteration 24, L1 7.05764e-05, Linf 0.00383438, total time[s] 0.09149 +Converged at iteration 23, L1 8.29935e-05, Linf 0.00654997, total time[s] 0.092915 +Converged at iteration 21, L1 5.6665e-05, Linf 0.00201319, total time[s] 0.073519 +Converged at iteration 20, L1 5.33619e-05, Linf 0.00725942, total time[s] 0.066417 +Converged at iteration 31, L1 9.48185e-05, Linf 0.00655385, total time[s] 0.096498 +Converged at iteration 20, L1 7.59257e-05, Linf 0.00505627, total time[s] 0.053753 +Converged at iteration 23, L1 6.00317e-05, Linf 0.00546556, total time[s] 0.06848 +Converged at iteration 26, L1 7.95874e-05, Linf 0.00567485, total time[s] 0.070255 +Converged at iteration 25, L1 9.16202e-05, Linf 0.00360049, total time[s] 0.067299 +Converged at iteration 23, L1 5.94792e-05, Linf 0.00359258, total time[s] 0.059351 +Converged at iteration 23, L1 9.6633e-05, Linf 0.0051012, total time[s] 0.059285 +Converged at iteration 25, L1 6.80849e-05, Linf 0.00427322, total time[s] 0.064207 +Converged at iteration 24, L1 9.65912e-05, Linf 0.00186239, total time[s] 0.062158 +Converged at iteration 31, L1 6.00267e-05, Linf 0.00338812, total time[s] 0.078865 +Converged at iteration 29, L1 8.18396e-05, Linf 0.00287154, total time[s] 0.07388 +Converged at iteration 30, L1 5.39667e-05, Linf 0.00375224, total time[s] 0.076268 +Converged at iteration 30, L1 5.98851e-05, Linf 0.00280168, total time[s] 0.076445 +Converged at iteration 40, L1 6.71766e-05, Linf 0.00367721, total time[s] 0.142214 +Converged at iteration 35, L1 7.62849e-05, Linf 0.00339712, total time[s] 0.108202 +Converged at iteration 30, L1 9.62444e-05, Linf 0.00432602, total time[s] 0.102037 +Converged at iteration 31, L1 6.19647e-05, Linf 0.00502564, total time[s] 0.093848 +Converged at iteration 27, L1 6.25992e-05, Linf 0.00499555, total time[s] 0.079621 +Converged at iteration 22, L1 8.59206e-05, Linf 0.00448847, total time[s] 0.063102 +Converged at iteration 20, L1 9.60127e-05, Linf 0.00397839, total time[s] 0.073048 +Converged at iteration 24, L1 8.84023e-05, Linf 0.00482793, total time[s] 0.062984 +Converged at iteration 28, L1 7.38362e-05, Linf 0.00445909, total time[s] 0.071553 +Converged at iteration 26, L1 8.11684e-05, Linf 0.0054674, total time[s] 0.067055 +Converged at iteration 22, L1 7.39254e-05, Linf 0.00508701, total time[s] 0.065578 +Converged at iteration 19, L1 6.6341e-05, Linf 0.00393102, total time[s] 0.050723 +Converged at iteration 30, L1 7.98735e-05, Linf 0.00329888, total time[s] 0.080787 +Converged at iteration 20, L1 8.44164e-05, Linf 0.00448508, total time[s] 0.061149 +Converged at iteration 24, L1 7.10861e-05, Linf 0.00463288, total time[s] 0.063793 +Converged at iteration 31, L1 8.93613e-05, Linf 0.00569148, total time[s] 0.080604 +Converged at iteration 27, L1 9.91606e-05, Linf 0.00569816, total time[s] 0.073614 +Converged at iteration 24, L1 8.79113e-05, Linf 0.00465012, total time[s] 0.068732 +Converged at iteration 23, L1 9.21822e-05, Linf 0.00410189, total time[s] 0.073108 +Converged at iteration 26, L1 7.22104e-05, Linf 0.00446106, total time[s] 0.079139 +Converged at iteration 29, L1 7.81569e-05, Linf 0.00479615, total time[s] 0.080281 +Converged at iteration 34, L1 7.09316e-05, Linf 0.00422892, total time[s] 0.093589 +Converged at iteration 30, L1 9.3951e-05, Linf 0.00442604, total time[s] 0.084588 +Converged at iteration 28, L1 9.49888e-05, Linf 0.00310979, total time[s] 0.072673 +Converged at iteration 32, L1 9.39349e-05, Linf 0.0037408, total time[s] 0.08269 +Converged at iteration 37, L1 7.33871e-05, Linf 0.00327813, total time[s] 0.093361 +Converged at iteration 33, L1 8.45238e-05, Linf 0.00464521, total time[s] 0.091536 +Converged at iteration 28, L1 9.65535e-05, Linf 0.00430209, total time[s] 0.075164 +Converged at iteration 24, L1 8.82852e-05, Linf 0.00325071, total time[s] 0.063518 +Converged at iteration 26, L1 8.99467e-05, Linf 0.0038626, total time[s] 0.072662 +Converged at iteration 40, L1 6.86092e-05, Linf 0.00397209, total time[s] 0.114026 +Converged at iteration 35, L1 8.66815e-05, Linf 0.00357306, total time[s] 0.091653 +Converged at iteration 30, L1 9.18536e-05, Linf 0.00417854, total time[s] 0.077319 +Converged at iteration 31, L1 6.17852e-05, Linf 0.00507477, total time[s] 0.079721 +Converged at iteration 26, L1 9.83417e-05, Linf 0.0055826, total time[s] 0.068065 +Converged at iteration 22, L1 7.18528e-05, Linf 0.00418138, total time[s] 0.063853 +Converged at iteration 21, L1 6.40609e-05, Linf 0.00346889, total time[s] 0.0604 +Converged at iteration 24, L1 8.93958e-05, Linf 0.00496536, total time[s] 0.065053 +Converged at iteration 28, L1 7.32144e-05, Linf 0.00442612, total time[s] 0.092873 +Converged at iteration 26, L1 8.05148e-05, Linf 0.00537059, total time[s] 0.08794 +Converged at iteration 22, L1 7.05148e-05, Linf 0.00441322, total time[s] 0.094455 +Converged at iteration 19, L1 5.493e-05, Linf 0.00332057, total time[s] 0.056034 +Converged at iteration 30, L1 9.52989e-05, Linf 0.00330735, total time[s] 0.086415 +Converged at iteration 20, L1 8.42626e-05, Linf 0.00472689, total time[s] 0.067423 +Converged at iteration 24, L1 7.14929e-05, Linf 0.00475228, total time[s] 0.06577 +Converged at iteration 31, L1 9.52156e-05, Linf 0.00481928, total time[s] 0.101168 +Converged at iteration 27, L1 9.41016e-05, Linf 0.00468417, total time[s] 0.071351 +Converged at iteration 24, L1 8.51945e-05, Linf 0.00429569, total time[s] 0.063375 +Converged at iteration 23, L1 9.24018e-05, Linf 0.00432074, total time[s] 0.067242 +Converged at iteration 26, L1 7.12987e-05, Linf 0.0046612, total time[s] 0.130738 +Converged at iteration 29, L1 7.54364e-05, Linf 0.00488663, total time[s] 0.099924 +Converged at iteration 34, L1 8.13561e-05, Linf 0.00406055, total time[s] 0.140696 +Converged at iteration 31, L1 7.34643e-05, Linf 0.00355182, total time[s] 0.102262 +Converged at iteration 29, L1 7.03221e-05, Linf 0.00273394, total time[s] 0.088161 +Converged at iteration 32, L1 8.21953e-05, Linf 0.00356565, total time[s] 0.107654 +Converged at iteration 36, L1 8.76669e-05, Linf 0.00357397, total time[s] 0.120568 +Converged at iteration 33, L1 8.3533e-05, Linf 0.00484786, total time[s] 0.105006 +Converged at iteration 28, L1 9.13976e-05, Linf 0.00413122, total time[s] 0.079692 +Converged at iteration 24, L1 8.03473e-05, Linf 0.00290884, total time[s] 0.076551 +Converged at iteration 26, L1 8.45833e-05, Linf 0.00394139, total time[s] 0.092725 +Converged at iteration 39, L1 9.98306e-05, Linf 0.00489243, total time[s] 0.10672 +Converged at iteration 35, L1 9.62855e-05, Linf 0.00385664, total time[s] 0.092502 +Converged at iteration 30, L1 7.47502e-05, Linf 0.00418691, total time[s] 0.08191 +Converged at iteration 31, L1 6.12918e-05, Linf 0.00506286, total time[s] 0.0847 +Converged at iteration 26, L1 9.09281e-05, Linf 0.00568947, total time[s] 0.067371 +Converged at iteration 21, L1 9.60289e-05, Linf 0.00461333, total time[s] 0.059161 +Converged at iteration 21, L1 6.86211e-05, Linf 0.00393916, total time[s] 0.063971 +Converged at iteration 24, L1 8.15602e-05, Linf 0.00519881, total time[s] 0.064194 +Converged at iteration 28, L1 6.79763e-05, Linf 0.0044035, total time[s] 0.075873 +Converged at iteration 26, L1 8.17551e-05, Linf 0.00431545, total time[s] 0.0692 +Converged at iteration 21, L1 8.59561e-05, Linf 0.00433732, total time[s] 0.056784 +Converged at iteration 18, L1 7.46871e-05, Linf 0.00477141, total time[s] 0.048477 +Converged at iteration 31, L1 7.49286e-05, Linf 0.00268051, total time[s] 0.081559 +Converged at iteration 20, L1 8.20499e-05, Linf 0.00494686, total time[s] 0.058857 +Converged at iteration 24, L1 6.8998e-05, Linf 0.00500052, total time[s] 0.068308 +Converged at iteration 30, L1 9.52694e-05, Linf 0.00346414, total time[s] 0.086636 +Converged at iteration 25, L1 9.30693e-05, Linf 0.00465843, total time[s] 0.076206 +Converged at iteration 23, L1 8.57158e-05, Linf 0.00397513, total time[s] 0.061439 +Converged at iteration 23, L1 9.42148e-05, Linf 0.00456457, total time[s] 0.06196 +Converged at iteration 26, L1 6.91549e-05, Linf 0.00492575, total time[s] 0.071531 +Converged at iteration 29, L1 7.16051e-05, Linf 0.00490385, total time[s] 0.085589 +Converged at iteration 32, L1 8.79868e-05, Linf 0.00351698, total time[s] 0.082985 +Converged at iteration 31, L1 7.31973e-05, Linf 0.0030573, total time[s] 0.082536 +Converged at iteration 29, L1 7.74671e-05, Linf 0.00291149, total time[s] 0.077848 +Converged at iteration 32, L1 7.649e-05, Linf 0.00335195, total time[s] 0.082928 +Converged at iteration 35, L1 9.60825e-05, Linf 0.00405628, total time[s] 0.115971 +Converged at iteration 33, L1 8.05498e-05, Linf 0.00500204, total time[s] 0.119333 +Converged at iteration 28, L1 8.49988e-05, Linf 0.00398734, total time[s] 0.111659 +Converged at iteration 24, L1 7.83621e-05, Linf 0.0025552, total time[s] 0.080932 +Converged at iteration 26, L1 8.324e-05, Linf 0.00405175, total time[s] 0.089963 +Converged at iteration 39, L1 9.68631e-05, Linf 0.0051974, total time[s] 0.123437 +Converged at iteration 36, L1 6.96335e-05, Linf 0.0035242, total time[s] 0.11284 +Converged at iteration 28, L1 7.68424e-05, Linf 0.00570174, total time[s] 0.074103 +Converged at iteration 31, L1 6.08073e-05, Linf 0.00506971, total time[s] 0.080262 +Converged at iteration 26, L1 8.33958e-05, Linf 0.00557622, total time[s] 0.067749 +Converged at iteration 21, L1 8.33506e-05, Linf 0.00424261, total time[s] 0.076504 +Converged at iteration 20, L1 9.30963e-05, Linf 0.00537687, total time[s] 0.068058 +Converged at iteration 23, L1 7.59038e-05, Linf 0.00634906, total time[s] 0.136627 +Converged at iteration 27, L1 8.33104e-05, Linf 0.00548458, total time[s] 0.113285 +Converged at iteration 25, L1 9.85179e-05, Linf 0.00421606, total time[s] 0.074534 +Converged at iteration 21, L1 5.54951e-05, Linf 0.00423399, total time[s] 0.06157 +Converged at iteration 40, L1 6.86753e-05, Linf 0.00367388, total time[s] 0.107168 +Converged at iteration 35, L1 7.64911e-05, Linf 0.00340454, total time[s] 0.120922 +Converged at iteration 30, L1 9.63659e-05, Linf 0.00432793, total time[s] 0.09814 +Converged at iteration 31, L1 6.19678e-05, Linf 0.00502565, total time[s] 0.081757 +Converged at iteration 27, L1 6.25964e-05, Linf 0.00504591, total time[s] 0.075723 +Converged at iteration 22, L1 8.58837e-05, Linf 0.00457632, total time[s] 0.073098 +Converged at iteration 20, L1 9.60241e-05, Linf 0.00397847, total time[s] 0.055331 +Converged at iteration 24, L1 8.84235e-05, Linf 0.00482842, total time[s] 0.071659 +Converged at iteration 28, L1 7.38734e-05, Linf 0.00445904, total time[s] 0.078321 +Converged at iteration 26, L1 8.11755e-05, Linf 0.00546756, total time[s] 0.068394 +Converged at iteration 22, L1 7.40352e-05, Linf 0.00508771, total time[s] 0.072316 +Converged at iteration 19, L1 6.63295e-05, Linf 0.00393098, total time[s] 0.072374 +Converged at iteration 30, L1 7.99034e-05, Linf 0.003308, total time[s] 0.087735 +Converged at iteration 20, L1 8.44265e-05, Linf 0.0045502, total time[s] 0.053398 +Converged at iteration 24, L1 7.10853e-05, Linf 0.00463288, total time[s] 0.06314 +Converged at iteration 31, L1 8.93552e-05, Linf 0.00569168, total time[s] 0.083285 +Converged at iteration 27, L1 9.91961e-05, Linf 0.00569833, total time[s] 0.077061 +Converged at iteration 24, L1 8.78928e-05, Linf 0.00460798, total time[s] 0.100434 +Converged at iteration 23, L1 9.21828e-05, Linf 0.00410195, total time[s] 0.066826 +Converged at iteration 26, L1 7.22135e-05, Linf 0.0044612, total time[s] 0.083913 +Converged at iteration 29, L1 7.81297e-05, Linf 0.00479601, total time[s] 0.076623 +Converged at iteration 34, L1 7.09437e-05, Linf 0.00422688, total time[s] 0.087703 +Converged at iteration 30, L1 9.39646e-05, Linf 0.00442604, total time[s] 0.077573 +Converged at iteration 28, L1 9.50795e-05, Linf 0.00309348, total time[s] 0.077465 +Converged at iteration 32, L1 9.46292e-05, Linf 0.00376412, total time[s] 0.084084 +Converged at iteration 37, L1 7.34674e-05, Linf 0.0032772, total time[s] 0.098405 +Converged at iteration 33, L1 8.44833e-05, Linf 0.00469569, total time[s] 0.085397 +Converged at iteration 28, L1 9.66194e-05, Linf 0.00430122, total time[s] 0.072822 +Converged at iteration 24, L1 8.82993e-05, Linf 0.0032229, total time[s] 0.063387 +Converged at iteration 26, L1 8.98492e-05, Linf 0.0038397, total time[s] 0.069192 +Converged at iteration 40, L1 6.72877e-05, Linf 0.00397987, total time[s] 0.101926 +Converged at iteration 35, L1 8.67008e-05, Linf 0.00364955, total time[s] 0.089844 +Converged at iteration 30, L1 9.18337e-05, Linf 0.00418063, total time[s] 0.078492 +Converged at iteration 31, L1 6.17505e-05, Linf 0.00502316, total time[s] 0.079809 +Converged at iteration 26, L1 9.83503e-05, Linf 0.00577795, total time[s] 0.068918 +Converged at iteration 22, L1 7.16977e-05, Linf 0.00422944, total time[s] 0.058928 +Converged at iteration 21, L1 6.42464e-05, Linf 0.00348499, total time[s] 0.056379 +Converged at iteration 24, L1 8.94219e-05, Linf 0.0049503, total time[s] 0.063444 +Converged at iteration 28, L1 7.32365e-05, Linf 0.00443344, total time[s] 0.07304 +Converged at iteration 26, L1 8.01677e-05, Linf 0.00534712, total time[s] 0.06831 +Converged at iteration 22, L1 7.01794e-05, Linf 0.0044149, total time[s] 0.060548 +Converged at iteration 19, L1 5.49369e-05, Linf 0.00332055, total time[s] 0.052116 +Converged at iteration 30, L1 9.54026e-05, Linf 0.0033078, total time[s] 0.082992 +Converged at iteration 20, L1 8.43233e-05, Linf 0.00472685, total time[s] 0.057834 +Converged at iteration 24, L1 7.12286e-05, Linf 0.00475227, total time[s] 0.082451 +Converged at iteration 31, L1 9.44345e-05, Linf 0.00481984, total time[s] 0.114717 +Converged at iteration 27, L1 9.41091e-05, Linf 0.0046704, total time[s] 0.094687 +Converged at iteration 24, L1 8.5192e-05, Linf 0.00428325, total time[s] 0.074667 +Converged at iteration 23, L1 9.23975e-05, Linf 0.00432074, total time[s] 0.065729 +Converged at iteration 26, L1 7.13221e-05, Linf 0.00465347, total time[s] 0.083796 +Converged at iteration 29, L1 7.51934e-05, Linf 0.00480047, total time[s] 0.087717 +Converged at iteration 34, L1 8.13789e-05, Linf 0.00406157, total time[s] 0.087627 +Converged at iteration 31, L1 7.18832e-05, Linf 0.00355193, total time[s] 0.08525 +Converged at iteration 29, L1 7.02731e-05, Linf 0.00272399, total time[s] 0.076811 +Converged at iteration 32, L1 8.21632e-05, Linf 0.00354569, total time[s] 0.082015 +Converged at iteration 36, L1 8.71614e-05, Linf 0.00357612, total time[s] 0.093859 +Converged at iteration 33, L1 8.32322e-05, Linf 0.00484767, total time[s] 0.091988 +Converged at iteration 28, L1 9.10463e-05, Linf 0.00413182, total time[s] 0.075458 +Converged at iteration 24, L1 8.02489e-05, Linf 0.00290884, total time[s] 0.064257 +Converged at iteration 26, L1 8.39861e-05, Linf 0.00392371, total time[s] 0.070557 +Converged at iteration 39, L1 9.99271e-05, Linf 0.0048916, total time[s] 0.105791 +Converged at iteration 35, L1 9.62995e-05, Linf 0.0038559, total time[s] 0.100588 +Converged at iteration 30, L1 7.6537e-05, Linf 0.00420928, total time[s] 0.078304 +Converged at iteration 31, L1 6.27632e-05, Linf 0.00506464, total time[s] 0.086325 +Converged at iteration 26, L1 9.10942e-05, Linf 0.00568982, total time[s] 0.082475 +Converged at iteration 21, L1 9.60187e-05, Linf 0.00461204, total time[s] 0.064753 +Converged at iteration 21, L1 6.92264e-05, Linf 0.00393125, total time[s] 0.05697 +Converged at iteration 24, L1 8.29655e-05, Linf 0.0051998, total time[s] 0.062851 +Converged at iteration 28, L1 6.79863e-05, Linf 0.00440906, total time[s] 0.07351 +Converged at iteration 26, L1 8.12454e-05, Linf 0.0043002, total time[s] 0.068225 +Converged at iteration 21, L1 8.50957e-05, Linf 0.00433737, total time[s] 0.057339 +Converged at iteration 18, L1 7.3573e-05, Linf 0.00298987, total time[s] 0.051623 +Converged at iteration 31, L1 7.49756e-05, Linf 0.00271081, total time[s] 0.083702 +Converged at iteration 20, L1 8.18505e-05, Linf 0.00494547, total time[s] 0.055276 +Converged at iteration 24, L1 6.88445e-05, Linf 0.00499746, total time[s] 0.06471 +Converged at iteration 30, L1 9.41734e-05, Linf 0.00345572, total time[s] 0.107346 +Converged at iteration 25, L1 9.00947e-05, Linf 0.00466874, total time[s] 0.074249 +Converged at iteration 23, L1 8.35937e-05, Linf 0.0039455, total time[s] 0.073266 +Converged at iteration 23, L1 9.3241e-05, Linf 0.00455942, total time[s] 0.0718 +Converged at iteration 26, L1 6.88785e-05, Linf 0.00492348, total time[s] 0.076846 +Converged at iteration 29, L1 7.12691e-05, Linf 0.00490033, total time[s] 0.078182 +Converged at iteration 32, L1 8.57502e-05, Linf 0.00350849, total time[s] 0.084833 +Converged at iteration 31, L1 7.25365e-05, Linf 0.00305982, total time[s] 0.080393 +Converged at iteration 29, L1 7.7355e-05, Linf 0.00291229, total time[s] 0.075057 +Converged at iteration 32, L1 7.58441e-05, Linf 0.00336137, total time[s] 0.085045 +Converged at iteration 35, L1 9.7474e-05, Linf 0.00406289, total time[s] 0.096116 +Converged at iteration 33, L1 8.08029e-05, Linf 0.00500439, total time[s] 0.103908 +Converged at iteration 28, L1 8.44573e-05, Linf 0.00398783, total time[s] 0.1044 +Converged at iteration 24, L1 7.80398e-05, Linf 0.00256146, total time[s] 0.068858 +Converged at iteration 26, L1 8.42278e-05, Linf 0.0040618, total time[s] 0.105387 +Converged at iteration 39, L1 9.36008e-05, Linf 0.00543013, total time[s] 0.125936 +Converged at iteration 36, L1 7.26808e-05, Linf 0.00384088, total time[s] 0.12022 +Converged at iteration 27, L1 5.17302e-05, Linf 0.00565868, total time[s] 0.087699 +Converged at iteration 31, L1 6.14128e-05, Linf 0.00508913, total time[s] 0.086076 +Converged at iteration 26, L1 7.63358e-05, Linf 0.00544341, total time[s] 0.079736 +Converged at iteration 21, L1 7.17082e-05, Linf 0.00380746, total time[s] 0.070494 +Converged at iteration 20, L1 6.89198e-05, Linf 0.0049912, total time[s] 0.058381 +Converged at iteration 22, L1 7.55991e-05, Linf 0.00751911, total time[s] 0.320729 +Converged at iteration 26, L1 9.72456e-05, Linf 0.0064958, total time[s] 0.192652 +Converged at iteration 25, L1 7.44587e-05, Linf 0.00413094, total time[s] 0.069921 +Converged at iteration 20, L1 8.85011e-05, Linf 0.00556214, total time[s] 0.063588 +Converged at iteration 17, L1 8.52481e-05, Linf 0.00400213, total time[s] 0.067027 +Converged at iteration 31, L1 9.15303e-05, Linf 0.00277909, total time[s] 0.093555 +Converged at iteration 20, L1 6.64196e-05, Linf 0.00539287, total time[s] 0.067556 +Converged at iteration 24, L1 6.22517e-05, Linf 0.00552684, total time[s] 0.079393 +Converged at iteration 28, L1 7.07491e-05, Linf 0.00373874, total time[s] 0.079686 +Converged at iteration 23, L1 9.57e-05, Linf 0.00710106, total time[s] 0.062397 +Converged at iteration 21, L1 9.30109e-05, Linf 0.00485133, total time[s] 0.058372 +Converged at iteration 23, L1 7.89784e-05, Linf 0.00414977, total time[s] 0.060871 +Converged at iteration 25, L1 9.94556e-05, Linf 0.00625627, total time[s] 0.065217 +Converged at iteration 28, L1 9.82526e-05, Linf 0.00586845, total time[s] 0.073085 +Converged at iteration 30, L1 6.86363e-05, Linf 0.00488204, total time[s] 0.076871 +Converged at iteration 28, L1 8.30219e-05, Linf 0.00350203, total time[s] 0.073664 +Converged at iteration 29, L1 8.83244e-05, Linf 0.00329485, total time[s] 0.077168 +Converged at iteration 31, L1 7.01166e-05, Linf 0.00290671, total time[s] 0.083194 +Converged at iteration 31, L1 9.118e-05, Linf 0.0046024, total time[s] 0.082894 +Converged at iteration 33, L1 7.41502e-05, Linf 0.00530518, total time[s] 0.085492 +Converged at iteration 28, L1 7.01613e-05, Linf 0.00373351, total time[s] 0.072917 +Converged at iteration 24, L1 8.80476e-05, Linf 0.00188802, total time[s] 0.065374 +Converged at iteration 25, L1 6.96123e-05, Linf 0.0042715, total time[s] 0.066918 +Converged at iteration 39, L1 7.75113e-05, Linf 0.00652722, total time[s] 0.097439 +Converged at iteration 36, L1 7.33552e-05, Linf 0.00527733, total time[s] 0.10579 +Converged at iteration 24, L1 7.50622e-05, Linf 0.00410726, total time[s] 0.072155 +Converged at iteration 31, L1 5.85749e-05, Linf 0.00509838, total time[s] 0.102039 +Converged at iteration 25, L1 8.69003e-05, Linf 0.0057275, total time[s] 0.11675 +Converged at iteration 20, L1 9.25955e-05, Linf 0.00380232, total time[s] 0.109064 +Converged at iteration 19, L1 6.60579e-05, Linf 0.00441398, total time[s] 0.077113 +Converged at iteration 20, L1 9.17212e-05, Linf 0.00663639, total time[s] 0.068126 +Converged at iteration 24, L1 7.93991e-05, Linf 0.00490455, total time[s] 0.203349 +Converged at iteration 24, L1 7.58382e-05, Linf 0.00492114, total time[s] 0.083185 +Converged at iteration 20, L1 6.05441e-05, Linf 0.00519213, total time[s] 0.063736 +Converged at iteration 17, L1 5.19207e-05, Linf 0.00242835, total time[s] 0.070797 +Converged at iteration 32, L1 6.88609e-05, Linf 0.00253738, total time[s] 0.13147 +Converged at iteration 19, L1 9.3294e-05, Linf 0.00706804, total time[s] 0.096587 +Converged at iteration 23, L1 7.84849e-05, Linf 0.00720181, total time[s] 0.089641 +Converged at iteration 26, L1 8.15346e-05, Linf 0.00603207, total time[s] 0.090988 +Converged at iteration 23, L1 5.79376e-05, Linf 0.00603868, total time[s] 0.115513 +Converged at iteration 20, L1 8.30794e-05, Linf 0.00554045, total time[s] 0.059976 +Converged at iteration 22, L1 9.94592e-05, Linf 0.00479362, total time[s] 0.080063 +Converged at iteration 25, L1 8.48099e-05, Linf 0.0043997, total time[s] 0.070883 +Converged at iteration 28, L1 7.81869e-05, Linf 0.00358718, total time[s] 0.077169 +Converged at iteration 29, L1 7.48355e-05, Linf 0.00612046, total time[s] 0.075884 +Converged at iteration 27, L1 7.34902e-05, Linf 0.0040198, total time[s] 0.072777 +Converged at iteration 29, L1 7.65669e-05, Linf 0.00380597, total time[s] 0.077872 +Converged at iteration 29, L1 9.1792e-05, Linf 0.00277217, total time[s] 0.078078 +Converged at iteration 28, L1 8.43071e-05, Linf 0.00273873, total time[s] 0.079129 +Converged at iteration 33, L1 6.18241e-05, Linf 0.00584957, total time[s] 0.086129 +Converged at iteration 27, L1 6.87738e-05, Linf 0.00331216, total time[s] 0.076256 +Converged at iteration 24, L1 9.66964e-05, Linf 0.00239103, total time[s] 0.073013 +Converged at iteration 23, L1 7.56557e-05, Linf 0.00336643, total time[s] 0.064159 +Converged at iteration 39, L1 7.48593e-05, Linf 0.00661514, total time[s] 0.103141 +Converged at iteration 36, L1 7.23496e-05, Linf 0.0053342, total time[s] 0.117884 +Converged at iteration 24, L1 7.4646e-05, Linf 0.00388, total time[s] 0.067187 +Converged at iteration 31, L1 5.72319e-05, Linf 0.00507393, total time[s] 0.079885 +Converged at iteration 25, L1 8.74873e-05, Linf 0.00584025, total time[s] 0.066468 +Converged at iteration 20, L1 9.54299e-05, Linf 0.00386658, total time[s] 0.054619 +Converged at iteration 19, L1 6.48777e-05, Linf 0.00434046, total time[s] 0.09111 +Converged at iteration 20, L1 9.02239e-05, Linf 0.00655214, total time[s] 0.079437 +Converged at iteration 24, L1 7.68082e-05, Linf 0.00459197, total time[s] 0.106821 +Converged at iteration 24, L1 7.95421e-05, Linf 0.00890005, total time[s] 0.068968 +Converged at iteration 20, L1 6.16823e-05, Linf 0.00515336, total time[s] 0.063386 +Converged at iteration 16, L1 9.93383e-05, Linf 0.00457314, total time[s] 0.055785 +Converged at iteration 32, L1 6.88795e-05, Linf 0.00257304, total time[s] 0.120026 +Converged at iteration 19, L1 9.34937e-05, Linf 0.00697182, total time[s] 0.052538 +Converged at iteration 23, L1 7.78832e-05, Linf 0.00702782, total time[s] 0.069835 +Converged at iteration 26, L1 7.99061e-05, Linf 0.00595813, total time[s] 0.070221 +Converged at iteration 23, L1 5.78975e-05, Linf 0.00597926, total time[s] 0.063172 +Converged at iteration 20, L1 8.28252e-05, Linf 0.00551202, total time[s] 0.055255 +Converged at iteration 23, L1 6.37346e-05, Linf 0.00287818, total time[s] 0.060816 +Converged at iteration 25, L1 8.38946e-05, Linf 0.00420101, total time[s] 0.066163 +Converged at iteration 28, L1 7.72598e-05, Linf 0.00351835, total time[s] 0.07482 +Converged at iteration 29, L1 7.49784e-05, Linf 0.00611728, total time[s] 0.075344 +Converged at iteration 27, L1 7.40131e-05, Linf 0.00398462, total time[s] 0.073716 +Converged at iteration 29, L1 7.77642e-05, Linf 0.00382132, total time[s] 0.080497 +Converged at iteration 29, L1 9.26001e-05, Linf 0.00277465, total time[s] 0.079861 +Converged at iteration 28, L1 8.19854e-05, Linf 0.00266476, total time[s] 0.081765 +Converged at iteration 33, L1 6.02396e-05, Linf 0.00585337, total time[s] 0.125459 +Converged at iteration 27, L1 6.95721e-05, Linf 0.00343141, total time[s] 0.078458 +Converged at iteration 24, L1 9.99898e-05, Linf 0.00243524, total time[s] 0.071565 +Converged at iteration 23, L1 7.55067e-05, Linf 0.00324361, total time[s] 0.062439 +Converged at iteration 39, L1 7.25903e-05, Linf 0.00662255, total time[s] 0.112333 +Converged at iteration 36, L1 7.0073e-05, Linf 0.00539842, total time[s] 0.096288 +Converged at iteration 24, L1 7.37654e-05, Linf 0.00367853, total time[s] 0.06524 +Converged at iteration 31, L1 5.73743e-05, Linf 0.0050447, total time[s] 0.086174 +Converged at iteration 25, L1 8.88016e-05, Linf 0.00599535, total time[s] 0.070805 +Converged at iteration 20, L1 9.83753e-05, Linf 0.00391926, total time[s] 0.057212 +Converged at iteration 19, L1 6.15791e-05, Linf 0.00426967, total time[s] 0.060073 +Converged at iteration 20, L1 8.83097e-05, Linf 0.00608499, total time[s] 0.063545 +Converged at iteration 24, L1 7.42849e-05, Linf 0.00422538, total time[s] 0.07098 +Converged at iteration 24, L1 7.79495e-05, Linf 0.00506508, total time[s] 0.078536 +Converged at iteration 20, L1 6.23627e-05, Linf 0.005174, total time[s] 0.08929 +Converged at iteration 16, L1 9.79358e-05, Linf 0.00481223, total time[s] 0.084247 +Converged at iteration 32, L1 6.8595e-05, Linf 0.00259849, total time[s] 0.101062 +Converged at iteration 19, L1 9.38025e-05, Linf 0.00687712, total time[s] 0.053377 +Converged at iteration 23, L1 7.70288e-05, Linf 0.00694588, total time[s] 0.067543 +Converged at iteration 26, L1 7.96986e-05, Linf 0.00592945, total time[s] 0.075927 +Converged at iteration 23, L1 5.69079e-05, Linf 0.00600132, total time[s] 0.06391 +Converged at iteration 20, L1 8.36593e-05, Linf 0.0055135, total time[s] 0.054705 +Converged at iteration 23, L1 6.5132e-05, Linf 0.00283392, total time[s] 0.063567 +Converged at iteration 25, L1 8.33853e-05, Linf 0.00403669, total time[s] 0.069376 +Converged at iteration 28, L1 7.71167e-05, Linf 0.00361912, total time[s] 0.075047 +Converged at iteration 29, L1 7.58752e-05, Linf 0.00618406, total time[s] 0.077273 +Converged at iteration 27, L1 7.52103e-05, Linf 0.00397697, total time[s] 0.079205 +Converged at iteration 29, L1 7.91617e-05, Linf 0.00386721, total time[s] 0.076123 +Converged at iteration 29, L1 9.23325e-05, Linf 0.00278043, total time[s] 0.075618 +Converged at iteration 28, L1 8.43261e-05, Linf 0.00260606, total time[s] 0.077846 +Converged at iteration 33, L1 5.83916e-05, Linf 0.005852, total time[s] 0.085527 +Converged at iteration 27, L1 7.00142e-05, Linf 0.00353874, total time[s] 0.076597 +Converged at iteration 25, L1 7.13957e-05, Linf 0.00193522, total time[s] 0.070614 +Converged at iteration 23, L1 7.43705e-05, Linf 0.00321786, total time[s] 0.065894 +Converged at iteration 39, L1 7.10521e-05, Linf 0.00661557, total time[s] 0.111927 +Converged at iteration 36, L1 6.83244e-05, Linf 0.00545743, total time[s] 0.097711 +Converged at iteration 24, L1 7.31327e-05, Linf 0.00336448, total time[s] 0.071548 +Converged at iteration 31, L1 5.67068e-05, Linf 0.00499766, total time[s] 0.096746 +Converged at iteration 25, L1 9.26066e-05, Linf 0.00625669, total time[s] 0.085138 +Converged at iteration 21, L1 5.86336e-05, Linf 0.00343222, total time[s] 0.05779 +Converged at iteration 19, L1 5.99371e-05, Linf 0.0040967, total time[s] 0.054363 +Converged at iteration 20, L1 8.60242e-05, Linf 0.00645559, total time[s] 0.07216 +Converged at iteration 24, L1 7.17646e-05, Linf 0.00445208, total time[s] 0.067579 +Converged at iteration 24, L1 8.08215e-05, Linf 0.00520117, total time[s] 0.064305 +Converged at iteration 20, L1 6.49337e-05, Linf 0.00543411, total time[s] 0.063526 +Converged at iteration 16, L1 9.72953e-05, Linf 0.0050694, total time[s] 0.045056 +Converged at iteration 32, L1 6.77953e-05, Linf 0.00262254, total time[s] 0.084214 +Converged at iteration 19, L1 9.43456e-05, Linf 0.00674388, total time[s] 0.054847 +Converged at iteration 23, L1 7.69089e-05, Linf 0.00682941, total time[s] 0.061631 +Converged at iteration 26, L1 8.02143e-05, Linf 0.00589214, total time[s] 0.069431 +Converged at iteration 23, L1 5.6384e-05, Linf 0.00596983, total time[s] 0.061935 +Converged at iteration 20, L1 8.53086e-05, Linf 0.0055157, total time[s] 0.054569 +Converged at iteration 23, L1 6.78391e-05, Linf 0.0027843, total time[s] 0.060833 +Converged at iteration 25, L1 8.40188e-05, Linf 0.00390326, total time[s] 0.067014 +Converged at iteration 28, L1 7.77674e-05, Linf 0.00378822, total time[s] 0.077473 +Converged at iteration 29, L1 7.74686e-05, Linf 0.00623793, total time[s] 0.075481 +Converged at iteration 27, L1 7.70237e-05, Linf 0.00395751, total time[s] 0.070093 +Converged at iteration 29, L1 8.09815e-05, Linf 0.0038804, total time[s] 0.077542 +Converged at iteration 29, L1 9.27521e-05, Linf 0.00278265, total time[s] 0.079982 +Converged at iteration 28, L1 8.05939e-05, Linf 0.00253967, total time[s] 0.074688 +Converged at iteration 32, L1 9.89661e-05, Linf 0.0069628, total time[s] 0.086199 +Converged at iteration 27, L1 7.25303e-05, Linf 0.00375308, total time[s] 0.071858 +Converged at iteration 25, L1 7.20554e-05, Linf 0.00198891, total time[s] 0.066623 +Converged at iteration 23, L1 7.49401e-05, Linf 0.00309926, total time[s] 0.063206 +Converged at iteration 39, L1 6.97252e-05, Linf 0.00658595, total time[s] 0.10147 +Converged at iteration 36, L1 6.636e-05, Linf 0.00550519, total time[s] 0.096113 +Converged at iteration 24, L1 7.2595e-05, Linf 0.00310408, total time[s] 0.064073 +Converged at iteration 30, L1 9.68898e-05, Linf 0.00610828, total time[s] 0.07881 +Converged at iteration 25, L1 9.83684e-05, Linf 0.00663265, total time[s] 0.06749 +Converged at iteration 21, L1 6.44351e-05, Linf 0.0033362, total time[s] 0.059811 +Converged at iteration 19, L1 5.85685e-05, Linf 0.00392803, total time[s] 0.051373 +Converged at iteration 20, L1 8.29017e-05, Linf 0.00614834, total time[s] 0.055364 +Converged at iteration 24, L1 6.87619e-05, Linf 0.00350185, total time[s] 0.065067 +Converged at iteration 24, L1 8.50447e-05, Linf 0.00539644, total time[s] 0.06448 +Converged at iteration 20, L1 6.93193e-05, Linf 0.00568782, total time[s] 0.054821 +Converged at iteration 16, L1 9.70602e-05, Linf 0.00538018, total time[s] 0.045591 +Converged at iteration 32, L1 6.56337e-05, Linf 0.00264257, total time[s] 0.083341 +Converged at iteration 19, L1 9.55244e-05, Linf 0.00657879, total time[s] 0.052748 +Converged at iteration 23, L1 7.66965e-05, Linf 0.00667127, total time[s] 0.061817 +Converged at iteration 26, L1 8.0645e-05, Linf 0.00586075, total time[s] 0.072827 +Converged at iteration 23, L1 5.59682e-05, Linf 0.00597221, total time[s] 0.063239 +Converged at iteration 20, L1 8.83428e-05, Linf 0.00552712, total time[s] 0.055317 +Converged at iteration 23, L1 6.94781e-05, Linf 0.00272159, total time[s] 0.06232 +Converged at iteration 25, L1 8.46334e-05, Linf 0.00378586, total time[s] 0.069995 +Converged at iteration 28, L1 7.92622e-05, Linf 0.00400954, total time[s] 0.082319 +Converged at iteration 29, L1 7.97808e-05, Linf 0.00631196, total time[s] 0.076642 +Converged at iteration 27, L1 7.95318e-05, Linf 0.00392682, total time[s] 0.076562 +Converged at iteration 29, L1 8.26955e-05, Linf 0.00402099, total time[s] 0.090043 +Converged at iteration 29, L1 9.33815e-05, Linf 0.00277529, total time[s] 0.08031 +Converged at iteration 28, L1 8.01643e-05, Linf 0.00247615, total time[s] 0.077132 +Converged at iteration 32, L1 9.61238e-05, Linf 0.00693281, total time[s] 0.087428 +Converged at iteration 27, L1 7.58123e-05, Linf 0.0040726, total time[s] 0.072764 +Converged at iteration 25, L1 6.94005e-05, Linf 0.00201749, total time[s] 0.071771 +Converged at iteration 23, L1 7.49419e-05, Linf 0.00299971, total time[s] 0.062833 +Converged at iteration 39, L1 6.92546e-05, Linf 0.00654745, total time[s] 0.130652 +Converged at iteration 36, L1 6.32461e-05, Linf 0.00555572, total time[s] 0.105478 +Converged at iteration 24, L1 7.26441e-05, Linf 0.00308086, total time[s] 0.064929 +Converged at iteration 30, L1 9.5176e-05, Linf 0.00605403, total time[s] 0.078577 +Converged at iteration 26, L1 5.9489e-05, Linf 0.00588357, total time[s] 0.069293 +Converged at iteration 21, L1 7.51085e-05, Linf 0.00336586, total time[s] 0.068392 +Converged at iteration 19, L1 5.76845e-05, Linf 0.00394751, total time[s] 0.070621 +Converged at iteration 20, L1 7.96215e-05, Linf 0.00641117, total time[s] 0.05696 +Converged at iteration 24, L1 6.54766e-05, Linf 0.00398206, total time[s] 0.065897 +Converged at iteration 24, L1 8.91381e-05, Linf 0.00563873, total time[s] 0.106582 +Converged at iteration 20, L1 7.45792e-05, Linf 0.00581748, total time[s] 0.05637 +Converged at iteration 16, L1 9.67883e-05, Linf 0.00575045, total time[s] 0.046464 +Converged at iteration 32, L1 6.26733e-05, Linf 0.00266323, total time[s] 0.08957 +Converged at iteration 19, L1 9.39356e-05, Linf 0.00640274, total time[s] 0.057527 +Converged at iteration 23, L1 7.60008e-05, Linf 0.00645794, total time[s] 0.063156 +Converged at iteration 26, L1 8.21898e-05, Linf 0.00585349, total time[s] 0.076318 +Converged at iteration 23, L1 5.51454e-05, Linf 0.00599427, total time[s] 0.062413 +Converged at iteration 20, L1 9.32429e-05, Linf 0.00550914, total time[s] 0.061875 +Converged at iteration 23, L1 7.17747e-05, Linf 0.00264771, total time[s] 0.067021 +Converged at iteration 25, L1 8.62405e-05, Linf 0.0036755, total time[s] 0.069839 +Converged at iteration 28, L1 8.08962e-05, Linf 0.00429525, total time[s] 0.073039 +Converged at iteration 29, L1 8.27403e-05, Linf 0.00638515, total time[s] 0.075156 +Converged at iteration 27, L1 8.30847e-05, Linf 0.00389598, total time[s] 0.070969 +Converged at iteration 29, L1 8.54002e-05, Linf 0.00404498, total time[s] 0.077861 +Converged at iteration 29, L1 9.44345e-05, Linf 0.00276547, total time[s] 0.07563 +Converged at iteration 28, L1 7.97446e-05, Linf 0.00241717, total time[s] 0.073459 +Converged at iteration 32, L1 9.30949e-05, Linf 0.00687976, total time[s] 0.08209 +Converged at iteration 27, L1 8.22951e-05, Linf 0.00449363, total time[s] 0.071776 +Converged at iteration 24, L1 9.88565e-05, Linf 0.00260701, total time[s] 0.065196 +Converged at iteration 23, L1 7.70058e-05, Linf 0.00283005, total time[s] 0.062008 +Converged at iteration 39, L1 6.71002e-05, Linf 0.00649926, total time[s] 0.103979 +Converged at iteration 36, L1 6.06166e-05, Linf 0.00555483, total time[s] 0.095102 +Converged at iteration 24, L1 7.42764e-05, Linf 0.00293692, total time[s] 0.063364 +Converged at iteration 30, L1 9.1377e-05, Linf 0.00598937, total time[s] 0.078331 +Converged at iteration 26, L1 6.48418e-05, Linf 0.00632795, total time[s] 0.068518 +Converged at iteration 21, L1 9.11427e-05, Linf 0.00434776, total time[s] 0.05716 +Converged at iteration 19, L1 5.74537e-05, Linf 0.00397505, total time[s] 0.055029 +Converged at iteration 20, L1 7.62365e-05, Linf 0.00595761, total time[s] 0.055177 +Converged at iteration 24, L1 6.19281e-05, Linf 0.00327199, total time[s] 0.080127 +Converged at iteration 24, L1 9.39804e-05, Linf 0.00590062, total time[s] 0.068877 +Converged at iteration 20, L1 8.11911e-05, Linf 0.00602651, total time[s] 0.057989 +Converged at iteration 16, L1 9.65792e-05, Linf 0.00611399, total time[s] 0.0456 +Converged at iteration 32, L1 5.80078e-05, Linf 0.00267472, total time[s] 0.082371 +Converged at iteration 19, L1 9.29635e-05, Linf 0.00622655, total time[s] 0.054417 +Converged at iteration 23, L1 7.5048e-05, Linf 0.00622672, total time[s] 0.062693 +Converged at iteration 26, L1 8.36334e-05, Linf 0.00582404, total time[s] 0.067975 +Converged at iteration 23, L1 5.48213e-05, Linf 0.00601761, total time[s] 0.063282 +Converged at iteration 20, L1 9.93861e-05, Linf 0.00559422, total time[s] 0.054098 +Converged at iteration 23, L1 7.3638e-05, Linf 0.00256234, total time[s] 0.060795 +Converged at iteration 25, L1 8.73121e-05, Linf 0.0035825, total time[s] 0.067762 +Converged at iteration 28, L1 8.29849e-05, Linf 0.0044769, total time[s] 0.072787 +Converged at iteration 29, L1 8.58667e-05, Linf 0.00647895, total time[s] 0.07554 +Converged at iteration 27, L1 8.6086e-05, Linf 0.00387795, total time[s] 0.071338 +Converged at iteration 29, L1 8.80263e-05, Linf 0.00414083, total time[s] 0.076082 +Converged at iteration 29, L1 9.43393e-05, Linf 0.00277904, total time[s] 0.079297 +Converged at iteration 28, L1 8.12407e-05, Linf 0.00236579, total time[s] 0.075182 +Converged at iteration 32, L1 8.90314e-05, Linf 0.00680238, total time[s] 0.089076 +Converged at iteration 27, L1 8.8044e-05, Linf 0.00499296, total time[s] 0.072029 +Converged at iteration 25, L1 6.39722e-05, Linf 0.00198667, total time[s] 0.066015 +Converged at iteration 23, L1 7.97842e-05, Linf 0.0026939, total time[s] 0.062239 +Converged at iteration 39, L1 6.5304e-05, Linf 0.00642923, total time[s] 0.100271 +Converged at iteration 36, L1 5.46101e-05, Linf 0.00550442, total time[s] 0.094344 +Converged at iteration 24, L1 7.67219e-05, Linf 0.00285119, total time[s] 0.063324 +Converged at iteration 30, L1 8.84132e-05, Linf 0.00588242, total time[s] 0.077652 +Converged at iteration 26, L1 6.98042e-05, Linf 0.00684286, total time[s] 0.069139 +Converged at iteration 22, L1 5.97712e-05, Linf 0.00432296, total time[s] 0.058957 +Converged at iteration 19, L1 5.76313e-05, Linf 0.00406191, total time[s] 0.051857 +Converged at iteration 20, L1 7.30462e-05, Linf 0.00563158, total time[s] 0.05524 +Converged at iteration 24, L1 5.87449e-05, Linf 0.00322706, total time[s] 0.063548 +Converged at iteration 24, L1 9.97893e-05, Linf 0.00617965, total time[s] 0.063225 +Converged at iteration 20, L1 8.82776e-05, Linf 0.00610862, total time[s] 0.054353 +Converged at iteration 16, L1 9.63606e-05, Linf 0.00643576, total time[s] 0.045206 +Converged at iteration 31, L1 9.37991e-05, Linf 0.00325833, total time[s] 0.079503 +Converged at iteration 19, L1 9.07165e-05, Linf 0.00603156, total time[s] 0.052263 +Converged at iteration 23, L1 7.31706e-05, Linf 0.00595926, total time[s] 0.061421 +Converged at iteration 26, L1 8.47799e-05, Linf 0.00579116, total time[s] 0.068492 +Converged at iteration 23, L1 5.54952e-05, Linf 0.00605979, total time[s] 0.060744 +Converged at iteration 21, L1 5.70248e-05, Linf 0.00472407, total time[s] 0.056146 +Converged at iteration 23, L1 7.40415e-05, Linf 0.00245284, total time[s] 0.061952 +Converged at iteration 25, L1 8.78029e-05, Linf 0.00348763, total time[s] 0.065861 +Converged at iteration 28, L1 8.56756e-05, Linf 0.00465366, total time[s] 0.072547 +Converged at iteration 29, L1 8.97178e-05, Linf 0.00656972, total time[s] 0.076842 +Converged at iteration 27, L1 8.95828e-05, Linf 0.00387022, total time[s] 0.074389 +Converged at iteration 29, L1 9.02981e-05, Linf 0.00419803, total time[s] 0.079911 +Converged at iteration 29, L1 9.53777e-05, Linf 0.00282453, total time[s] 0.133531 +Converged at iteration 28, L1 8.18828e-05, Linf 0.00232851, total time[s] 0.100466 +Converged at iteration 32, L1 8.38328e-05, Linf 0.00670319, total time[s] 0.089848 +Converged at iteration 27, L1 9.63198e-05, Linf 0.00555525, total time[s] 0.094615 +Converged at iteration 25, L1 6.54006e-05, Linf 0.0020293, total time[s] 0.109194 +Converged at iteration 23, L1 8.29384e-05, Linf 0.00260817, total time[s] 0.074017 +Converged at iteration 39, L1 6.17741e-05, Linf 0.00631272, total time[s] 0.127243 +Converged at iteration 35, L1 8.87578e-05, Linf 0.00645668, total time[s] 0.129975 +Converged at iteration 24, L1 7.96637e-05, Linf 0.00293197, total time[s] 0.087901 +Converged at iteration 30, L1 8.35067e-05, Linf 0.00582306, total time[s] 0.109131 +Converged at iteration 26, L1 7.6256e-05, Linf 0.00737178, total time[s] 0.081597 +Converged at iteration 22, L1 7.69621e-05, Linf 0.00539501, total time[s] 0.063267 +Converged at iteration 19, L1 5.82787e-05, Linf 0.00407585, total time[s] 0.049813 +Converged at iteration 20, L1 6.97846e-05, Linf 0.0053738, total time[s] 0.066978 +Converged at iteration 24, L1 5.5797e-05, Linf 0.00313787, total time[s] 0.065211 +Converged at iteration 25, L1 5.65324e-05, Linf 0.00523367, total time[s] 0.120412 +Converged at iteration 20, L1 9.6539e-05, Linf 0.00626067, total time[s] 0.064212 +Converged at iteration 16, L1 9.71989e-05, Linf 0.00666173, total time[s] 0.043423 +Converged at iteration 31, L1 8.88666e-05, Linf 0.00328759, total time[s] 0.085856 +Converged at iteration 19, L1 8.67184e-05, Linf 0.00596103, total time[s] 0.05017 +Converged at iteration 23, L1 7.1347e-05, Linf 0.00565803, total time[s] 0.059733 +Converged at iteration 26, L1 8.57935e-05, Linf 0.00571999, total time[s] 0.066016 +Converged at iteration 23, L1 5.65626e-05, Linf 0.00609794, total time[s] 0.06037 +Converged at iteration 21, L1 6.20051e-05, Linf 0.00470516, total time[s] 0.055144 +Converged at iteration 23, L1 7.36761e-05, Linf 0.00231204, total time[s] 0.067976 +Converged at iteration 25, L1 8.73734e-05, Linf 0.00340964, total time[s] 0.075077 +Converged at iteration 28, L1 8.90129e-05, Linf 0.00489107, total time[s] 0.07406 +Converged at iteration 29, L1 9.37291e-05, Linf 0.00665575, total time[s] 0.086787 +Converged at iteration 27, L1 9.27966e-05, Linf 0.00386546, total time[s] 0.071071 +Converged at iteration 29, L1 9.04788e-05, Linf 0.00433587, total time[s] 0.086378 +Converged at iteration 29, L1 9.6011e-05, Linf 0.00286522, total time[s] 0.075415 +Converged at iteration 28, L1 8.13355e-05, Linf 0.00228485, total time[s] 0.071669 +Converged at iteration 32, L1 7.77877e-05, Linf 0.00668442, total time[s] 0.080963 +Converged at iteration 28, L1 6.07635e-05, Linf 0.0051835, total time[s] 0.072452 +Converged at iteration 25, L1 6.91343e-05, Linf 0.00272389, total time[s] 0.064692 +Converged at iteration 23, L1 8.62481e-05, Linf 0.00256694, total time[s] 0.059952 +Converged at iteration 39, L1 5.62259e-05, Linf 0.00619857, total time[s] 0.097343 +Converged at iteration 35, L1 8.16842e-05, Linf 0.00651656, total time[s] 0.089635 +Converged at iteration 24, L1 8.38297e-05, Linf 0.00299021, total time[s] 0.06445 +Converged at iteration 30, L1 7.77857e-05, Linf 0.00572403, total time[s] 0.076233 +Converged at iteration 26, L1 8.04121e-05, Linf 0.00796383, total time[s] 0.066483 +Converged at iteration 22, L1 9.96157e-05, Linf 0.00651593, total time[s] 0.061195 +Converged at iteration 19, L1 6.07509e-05, Linf 0.00418835, total time[s] 0.054721 +Converged at iteration 20, L1 6.69796e-05, Linf 0.00485722, total time[s] 0.055447 +Converged at iteration 24, L1 5.3652e-05, Linf 0.00309805, total time[s] 0.065486 +Converged at iteration 25, L1 6.05593e-05, Linf 0.00553507, total time[s] 0.067057 +Converged at iteration 21, L1 5.31137e-05, Linf 0.00536335, total time[s] 0.057626 +Converged at iteration 16, L1 9.83825e-05, Linf 0.00678747, total time[s] 0.046164 +Converged at iteration 31, L1 8.46683e-05, Linf 0.00331445, total time[s] 0.08829 +Converged at iteration 19, L1 8.01578e-05, Linf 0.00554096, total time[s] 0.0565 +Converged at iteration 23, L1 6.84945e-05, Linf 0.00530244, total time[s] 0.061664 +Converged at iteration 26, L1 8.77208e-05, Linf 0.00561741, total time[s] 0.069965 +Converged at iteration 23, L1 5.75297e-05, Linf 0.00613373, total time[s] 0.061169 +Converged at iteration 21, L1 6.85274e-05, Linf 0.00464676, total time[s] 0.058682 +Converged at iteration 23, L1 7.18801e-05, Linf 0.0021375, total time[s] 0.060297 +Converged at iteration 25, L1 8.82064e-05, Linf 0.00334119, total time[s] 0.067555 +Converged at iteration 28, L1 9.2366e-05, Linf 0.0050412, total time[s] 0.070232 +Converged at iteration 29, L1 9.90025e-05, Linf 0.00676141, total time[s] 0.073107 +Converged at iteration 27, L1 9.63012e-05, Linf 0.00367839, total time[s] 0.06928 +Converged at iteration 29, L1 9.37747e-05, Linf 0.00447163, total time[s] 0.087962 +Converged at iteration 29, L1 9.82729e-05, Linf 0.00291284, total time[s] 0.083694 +Converged at iteration 28, L1 8.34011e-05, Linf 0.00224267, total time[s] 0.073453 +Converged at iteration 32, L1 7.1746e-05, Linf 0.00647696, total time[s] 0.091415 +Converged at iteration 28, L1 6.26027e-05, Linf 0.00567066, total time[s] 0.072764 +Converged at iteration 25, L1 7.61523e-05, Linf 0.00341975, total time[s] 0.084797 +Converged at iteration 23, L1 9.0371e-05, Linf 0.00252793, total time[s] 0.075479 +Converged at iteration 38, L1 9.92229e-05, Linf 0.00734123, total time[s] 0.111382 +Converged at iteration 35, L1 6.81743e-05, Linf 0.00642423, total time[s] 0.093212 +Converged at iteration 24, L1 8.79999e-05, Linf 0.00314446, total time[s] 0.062844 +Converged at iteration 30, L1 7.21146e-05, Linf 0.00562877, total time[s] 0.076175 +Converged at iteration 26, L1 8.61526e-05, Linf 0.0088833, total time[s] 0.068554 +Converged at iteration 23, L1 6.99492e-05, Linf 0.00646847, total time[s] 0.061882 +Converged at iteration 19, L1 6.44249e-05, Linf 0.00434348, total time[s] 0.068246 +Converged at iteration 20, L1 6.44335e-05, Linf 0.0042538, total time[s] 0.059869 +Converged at iteration 23, L1 9.8887e-05, Linf 0.00450796, total time[s] 0.077164 +Converged at iteration 25, L1 6.47015e-05, Linf 0.00581445, total time[s] 0.074599 +Converged at iteration 21, L1 5.85996e-05, Linf 0.00542626, total time[s] 0.059271 +Converged at iteration 16, L1 9.93712e-05, Linf 0.00684099, total time[s] 0.044723 +Converged at iteration 31, L1 8.06914e-05, Linf 0.0033041, total time[s] 0.080561 +Converged at iteration 19, L1 7.21699e-05, Linf 0.00497695, total time[s] 0.05153 +Converged at iteration 23, L1 6.50303e-05, Linf 0.00491907, total time[s] 0.062697 +Converged at iteration 26, L1 8.92676e-05, Linf 0.00550647, total time[s] 0.069801 +Converged at iteration 23, L1 5.89846e-05, Linf 0.00618233, total time[s] 0.058753 +Converged at iteration 21, L1 7.45724e-05, Linf 0.00449116, total time[s] 0.054074 +Converged at iteration 23, L1 7.00691e-05, Linf 0.00194953, total time[s] 0.058585 +Converged at iteration 25, L1 8.83206e-05, Linf 0.0032619, total time[s] 0.064784 +Converged at iteration 28, L1 9.55514e-05, Linf 0.00556923, total time[s] 0.071925 +Converged at iteration 30, L1 5.14154e-05, Linf 0.00431791, total time[s] 0.077386 +Converged at iteration 27, L1 9.83953e-05, Linf 0.00363273, total time[s] 0.069058 +Converged at iteration 29, L1 9.8293e-05, Linf 0.00461389, total time[s] 0.073023 +Converged at iteration 29, L1 9.73986e-05, Linf 0.002914, total time[s] 0.07295 +Converged at iteration 28, L1 8.45892e-05, Linf 0.00221193, total time[s] 0.070175 +Converged at iteration 32, L1 6.21489e-05, Linf 0.00625314, total time[s] 0.079297 +Converged at iteration 28, L1 7.0109e-05, Linf 0.00639588, total time[s] 0.069858 +Converged at iteration 25, L1 8.39377e-05, Linf 0.00416555, total time[s] 0.063861 +Converged at iteration 23, L1 9.56487e-05, Linf 0.00266523, total time[s] 0.070019 +Converged at iteration 38, L1 9.00011e-05, Linf 0.00709253, total time[s] 0.148649 +Converged at iteration 35, L1 5.51028e-05, Linf 0.00581669, total time[s] 0.110533 +Converged at iteration 24, L1 9.11398e-05, Linf 0.00326111, total time[s] 0.084757 +Converged at iteration 30, L1 6.65264e-05, Linf 0.0055425, total time[s] 0.082219 +Converged at iteration 26, L1 9.20748e-05, Linf 0.00911679, total time[s] 0.071638 +Converged at iteration 23, L1 8.56672e-05, Linf 0.00737165, total time[s] 0.067502 +Converged at iteration 19, L1 6.85308e-05, Linf 0.00448977, total time[s] 0.076564 +Converged at iteration 20, L1 6.15288e-05, Linf 0.00407864, total time[s] 0.066437 +Converged at iteration 23, L1 9.39451e-05, Linf 0.0045285, total time[s] 0.079609 +Converged at iteration 25, L1 6.9681e-05, Linf 0.00606625, total time[s] 0.081531 +Converged at iteration 21, L1 6.35632e-05, Linf 0.00569105, total time[s] 0.060522 +Converged at iteration 17, L1 5.47583e-05, Linf 0.00482846, total time[s] 0.063163 +Converged at iteration 31, L1 7.78088e-05, Linf 0.00336199, total time[s] 0.103149 +Converged at iteration 19, L1 6.30037e-05, Linf 0.00485093, total time[s] 0.05471 +Converged at iteration 22, L1 9.4187e-05, Linf 0.00527817, total time[s] 0.084147 +Converged at iteration 26, L1 9.11957e-05, Linf 0.00540646, total time[s] 0.101744 +Converged at iteration 23, L1 6.06636e-05, Linf 0.00626498, total time[s] 0.064368 +Converged at iteration 21, L1 8.03395e-05, Linf 0.00443581, total time[s] 0.060509 +Converged at iteration 23, L1 6.76443e-05, Linf 0.00172156, total time[s] 0.108876 +Converged at iteration 25, L1 8.72966e-05, Linf 0.00313186, total time[s] 0.110646 +Converged at iteration 28, L1 9.9019e-05, Linf 0.00563105, total time[s] 0.07637 +Converged at iteration 30, L1 5.41363e-05, Linf 0.00424167, total time[s] 0.079124 +Converged at iteration 28, L1 6.06755e-05, Linf 0.00425254, total time[s] 0.078981 +Converged at iteration 30, L1 6.33576e-05, Linf 0.00389629, total time[s] 0.087931 +Converged at iteration 29, L1 9.84061e-05, Linf 0.00290315, total time[s] 0.078543 +Converged at iteration 28, L1 8.77234e-05, Linf 0.00221275, total time[s] 0.091353 +Converged at iteration 31, L1 9.50745e-05, Linf 0.0075316, total time[s] 0.082179 +Converged at iteration 28, L1 7.86544e-05, Linf 0.00695241, total time[s] 0.075097 +Converged at iteration 25, L1 9.53991e-05, Linf 0.00498425, total time[s] 0.06544 +Converged at iteration 24, L1 5.65208e-05, Linf 0.00200292, total time[s] 0.061832 +Converged at iteration 38, L1 7.89468e-05, Linf 0.0068485, total time[s] 0.105506 +Converged at iteration 34, L1 9.09708e-05, Linf 0.00702514, total time[s] 0.087914 +Converged at iteration 24, L1 9.30488e-05, Linf 0.00335786, total time[s] 0.062159 +Converged at iteration 30, L1 6.21557e-05, Linf 0.00545392, total time[s] 0.080168 +Converged at iteration 26, L1 9.87985e-05, Linf 0.00968641, total time[s] 0.0739 +Converged at iteration 24, L1 5.41192e-05, Linf 0.00683699, total time[s] 0.070117 +Converged at iteration 19, L1 7.43202e-05, Linf 0.00497134, total time[s] 0.05208 +Converged at iteration 20, L1 5.80661e-05, Linf 0.00391199, total time[s] 0.0576 +Converged at iteration 23, L1 9.17012e-05, Linf 0.00455534, total time[s] 0.083974 +Converged at iteration 25, L1 7.12055e-05, Linf 0.00629613, total time[s] 0.068859 +Converged at iteration 21, L1 6.81458e-05, Linf 0.00582572, total time[s] 0.102761 +Converged at iteration 17, L1 5.59826e-05, Linf 0.00497622, total time[s] 0.076011 +Converged at iteration 31, L1 7.5696e-05, Linf 0.00347753, total time[s] 0.20007 +Converged at iteration 18, L1 9.05672e-05, Linf 0.00570638, total time[s] 0.05472 +Converged at iteration 22, L1 8.37295e-05, Linf 0.0048234, total time[s] 0.063683 +Converged at iteration 26, L1 9.48915e-05, Linf 0.00530992, total time[s] 0.084618 +Converged at iteration 23, L1 6.2952e-05, Linf 0.00637375, total time[s] 0.062258 +Converged at iteration 21, L1 8.67145e-05, Linf 0.00430964, total time[s] 0.057672 +Converged at iteration 23, L1 6.43808e-05, Linf 0.00173526, total time[s] 0.063092 +Converged at iteration 25, L1 8.42653e-05, Linf 0.00293007, total time[s] 0.06576 +Converged at iteration 29, L1 6.66638e-05, Linf 0.00408573, total time[s] 0.077521 +Converged at iteration 30, L1 5.70975e-05, Linf 0.00428648, total time[s] 0.080292 +Converged at iteration 28, L1 6.31395e-05, Linf 0.00414016, total time[s] 0.074718 +Converged at iteration 30, L1 6.51834e-05, Linf 0.00401916, total time[s] 0.078118 +Converged at iteration 29, L1 9.77726e-05, Linf 0.0029027, total time[s] 0.075977 +Converged at iteration 28, L1 9.21424e-05, Linf 0.00216109, total time[s] 0.078225 +Converged at iteration 31, L1 8.5782e-05, Linf 0.00741851, total time[s] 0.081732 +Converged at iteration 28, L1 8.72257e-05, Linf 0.00766946, total time[s] 0.07696 +Converged at iteration 26, L1 6.2112e-05, Linf 0.00449619, total time[s] 0.06964 +Converged at iteration 24, L1 5.95893e-05, Linf 0.00213333, total time[s] 0.06525 +Converged at iteration 38, L1 6.86693e-05, Linf 0.0066289, total time[s] 0.112516 +Converged at iteration 34, L1 8.19833e-05, Linf 0.00684888, total time[s] 0.1128 +Converged at iteration 24, L1 9.5483e-05, Linf 0.00343681, total time[s] 0.066294 +Converged at iteration 30, L1 5.78826e-05, Linf 0.00536477, total time[s] 0.080682 +Converged at iteration 27, L1 5.23358e-05, Linf 0.00796778, total time[s] 0.07158 +Converged at iteration 24, L1 6.27564e-05, Linf 0.00768879, total time[s] 0.066012 +Converged at iteration 19, L1 8.00448e-05, Linf 0.00550325, total time[s] 0.094326 +Converged at iteration 20, L1 5.44001e-05, Linf 0.0037677, total time[s] 0.080379 +Converged at iteration 23, L1 9.14529e-05, Linf 0.00460911, total time[s] 0.09745 +Converged at iteration 25, L1 7.52042e-05, Linf 0.00650348, total time[s] 0.0674 +Converged at iteration 21, L1 7.24458e-05, Linf 0.00594038, total time[s] 0.058753 +Converged at iteration 17, L1 5.63337e-05, Linf 0.0050392, total time[s] 0.04975 +Converged at iteration 31, L1 7.41457e-05, Linf 0.00358108, total time[s] 0.087825 +Converged at iteration 18, L1 7.50706e-05, Linf 0.00520968, total time[s] 0.05019 +Converged at iteration 22, L1 7.38909e-05, Linf 0.00432958, total time[s] 0.076274 +Converged at iteration 26, L1 9.87637e-05, Linf 0.00525006, total time[s] 0.111854 +Converged at iteration 23, L1 6.6158e-05, Linf 0.00648969, total time[s] 0.10232 +Converged at iteration 21, L1 9.32909e-05, Linf 0.00412212, total time[s] 0.11004 +Converged at iteration 22, L1 9.75549e-05, Linf 0.00269141, total time[s] 0.055688 +Converged at iteration 25, L1 8.03849e-05, Linf 0.00278215, total time[s] 0.062616 +Converged at iteration 29, L1 6.8963e-05, Linf 0.00492245, total time[s] 0.073757 +Converged at iteration 30, L1 6.0552e-05, Linf 0.00434865, total time[s] 0.074775 +Converged at iteration 28, L1 6.47651e-05, Linf 0.00419618, total time[s] 0.070944 +Converged at iteration 30, L1 6.64319e-05, Linf 0.00414563, total time[s] 0.077397 +Converged at iteration 29, L1 9.99323e-05, Linf 0.0029361, total time[s] 0.093254 +Converged at iteration 28, L1 9.97794e-05, Linf 0.00208185, total time[s] 0.085949 +Converged at iteration 31, L1 8.08267e-05, Linf 0.00728394, total time[s] 0.080709 +Converged at iteration 28, L1 9.51622e-05, Linf 0.00829518, total time[s] 0.07099 +Converged at iteration 26, L1 7.0988e-05, Linf 0.00516264, total time[s] 0.069736 +Converged at iteration 24, L1 6.29027e-05, Linf 0.00226057, total time[s] 0.064136 +Converged at iteration 38, L1 6.19048e-05, Linf 0.00638781, total time[s] 0.100108 +Converged at iteration 34, L1 7.759e-05, Linf 0.00697227, total time[s] 0.092444 +Converged at iteration 24, L1 9.75995e-05, Linf 0.00348812, total time[s] 0.066229 +Converged at iteration 30, L1 5.50972e-05, Linf 0.00527407, total time[s] 0.078569 +Converged at iteration 27, L1 5.49979e-05, Linf 0.00848961, total time[s] 0.073443 +Converged at iteration 24, L1 7.24036e-05, Linf 0.00852745, total time[s] 0.066442 +Converged at iteration 19, L1 8.64273e-05, Linf 0.00497153, total time[s] 0.065274 +Converged at iteration 20, L1 5.15064e-05, Linf 0.00346278, total time[s] 0.055225 +Converged at iteration 23, L1 9.05076e-05, Linf 0.00465877, total time[s] 0.062022 +Converged at iteration 25, L1 7.73346e-05, Linf 0.00668818, total time[s] 0.075017 +Converged at iteration 21, L1 7.76659e-05, Linf 0.00603895, total time[s] 0.077326 +Converged at iteration 17, L1 5.65279e-05, Linf 0.0050508, total time[s] 0.066171 +Converged at iteration 31, L1 7.25247e-05, Linf 0.00369008, total time[s] 0.116775 +Converged at iteration 17, L1 9.97733e-05, Linf 0.00659729, total time[s] 0.055997 +Converged at iteration 21, L1 9.56712e-05, Linf 0.00450893, total time[s] 0.069015 +Converged at iteration 27, L1 5.339e-05, Linf 0.00246061, total time[s] 0.078964 +Converged at iteration 23, L1 6.98728e-05, Linf 0.00660128, total time[s] 0.095408 +Converged at iteration 21, L1 9.99233e-05, Linf 0.00415072, total time[s] 0.072733 +Converged at iteration 22, L1 9.05107e-05, Linf 0.00279977, total time[s] 0.063613 +Converged at iteration 25, L1 7.77157e-05, Linf 0.002482, total time[s] 0.06923 +Converged at iteration 29, L1 7.03976e-05, Linf 0.00470602, total time[s] 0.082462 +Converged at iteration 30, L1 6.74874e-05, Linf 0.00770691, total time[s] 0.103701 +Converged at iteration 28, L1 6.83045e-05, Linf 0.00357456, total time[s] 0.088115 +Converged at iteration 30, L1 6.89389e-05, Linf 0.00429629, total time[s] 0.112445 +Converged at iteration 29, L1 9.85705e-05, Linf 0.00294301, total time[s] 0.10661 +Converged at iteration 29, L1 6.15111e-05, Linf 0.00136369, total time[s] 0.119836 +Converged at iteration 31, L1 7.27964e-05, Linf 0.00710151, total time[s] 0.118336 +Converged at iteration 29, L1 5.18327e-05, Linf 0.00724095, total time[s] 0.089208 +Converged at iteration 26, L1 7.9294e-05, Linf 0.00584849, total time[s] 0.070308 +Converged at iteration 24, L1 6.65027e-05, Linf 0.00236449, total time[s] 0.069783 +Converged at iteration 38, L1 5.7422e-05, Linf 0.00615349, total time[s] 0.112176 +Converged at iteration 34, L1 7.40351e-05, Linf 0.00639731, total time[s] 0.104432 +Converged at iteration 24, L1 9.79949e-05, Linf 0.00352933, total time[s] 0.070643 +Converged at iteration 29, L1 9.67217e-05, Linf 0.00681683, total time[s] 0.095224 +Converged at iteration 27, L1 5.9083e-05, Linf 0.00894767, total time[s] 0.085114 +Converged at iteration 24, L1 8.30697e-05, Linf 0.00939698, total time[s] 0.075396 +Converged at iteration 19, L1 9.05717e-05, Linf 0.0048062, total time[s] 0.061518 +Converged at iteration 20, L1 4.90188e-05, Linf 0.00336377, total time[s] 0.058763 +Converged at iteration 23, L1 8.96315e-05, Linf 0.00471728, total time[s] 0.067906 +Converged at iteration 25, L1 8.21844e-05, Linf 0.00686048, total time[s] 0.074192 +Converged at iteration 21, L1 8.09136e-05, Linf 0.00612482, total time[s] 0.086 +Converged at iteration 17, L1 5.6834e-05, Linf 0.00512216, total time[s] 0.04807 +Converged at iteration 31, L1 7.16298e-05, Linf 0.00381479, total time[s] 0.079742 +Converged at iteration 17, L1 7.46941e-05, Linf 0.00604641, total time[s] 0.052333 +Converged at iteration 21, L1 7.88147e-05, Linf 0.00357237, total time[s] 0.056458 +Converged at iteration 27, L1 5.55926e-05, Linf 0.00243022, total time[s] 0.100321 +Converged at iteration 23, L1 7.45084e-05, Linf 0.0067731, total time[s] 0.067587 +Converged at iteration 22, L1 5.7884e-05, Linf 0.00325842, total time[s] 0.060194 +Converged at iteration 22, L1 8.21934e-05, Linf 0.00285269, total time[s] 0.061629 +Converged at iteration 25, L1 7.45023e-05, Linf 0.00229841, total time[s] 0.079965 +Converged at iteration 29, L1 7.09263e-05, Linf 0.00491621, total time[s] 0.140595 +Converged at iteration 30, L1 6.85465e-05, Linf 0.0046127, total time[s] 0.082491 +Converged at iteration 28, L1 6.75547e-05, Linf 0.00363553, total time[s] 0.074298 +Converged at iteration 30, L1 7.14789e-05, Linf 0.00444757, total time[s] 0.076256 +Converged at iteration 29, L1 9.89218e-05, Linf 0.00293656, total time[s] 0.073521 +Converged at iteration 29, L1 6.441e-05, Linf 0.00132421, total time[s] 0.073588 +Converged at iteration 31, L1 6.48288e-05, Linf 0.00690899, total time[s] 0.078245 +Converged at iteration 29, L1 5.5751e-05, Linf 0.00768908, total time[s] 0.077164 +Converged at iteration 26, L1 8.93538e-05, Linf 0.00658699, total time[s] 0.067452 +Converged at iteration 24, L1 7.10827e-05, Linf 0.00247558, total time[s] 0.065831 +Converged at iteration 38, L1 5.40065e-05, Linf 0.00595047, total time[s] 0.097337 +Converged at iteration 34, L1 7.02228e-05, Linf 0.00604858, total time[s] 0.087813 +Converged at iteration 24, L1 9.89166e-05, Linf 0.00357181, total time[s] 0.062903 +Converged at iteration 29, L1 9.41358e-05, Linf 0.00668338, total time[s] 0.074682 +Converged at iteration 27, L1 6.0312e-05, Linf 0.00939577, total time[s] 0.070163 +Converged at iteration 24, L1 9.13114e-05, Linf 0.0103664, total time[s] 0.063184 +Converged at iteration 19, L1 9.71498e-05, Linf 0.00521002, total time[s] 0.062419 +Converged at iteration 20, L1 4.72351e-05, Linf 0.00336588, total time[s] 0.064566 +Converged at iteration 23, L1 9.05015e-05, Linf 0.00476, total time[s] 0.067061 +Converged at iteration 25, L1 8.47518e-05, Linf 0.00702757, total time[s] 0.070739 +Converged at iteration 21, L1 8.38725e-05, Linf 0.00593695, total time[s] 0.058831 +Converged at iteration 17, L1 5.67411e-05, Linf 0.00491112, total time[s] 0.044615 +Converged at iteration 31, L1 7.00574e-05, Linf 0.00396046, total time[s] 0.077759 +Converged at iteration 17, L1 5.58064e-05, Linf 0.00523588, total time[s] 0.044711 +Converged at iteration 20, L1 9.3815e-05, Linf 0.00379308, total time[s] 0.054091 +Converged at iteration 27, L1 5.82171e-05, Linf 0.00248514, total time[s] 0.069273 +Converged at iteration 23, L1 7.74852e-05, Linf 0.00687259, total time[s] 0.061165 +Converged at iteration 22, L1 6.17366e-05, Linf 0.00351352, total time[s] 0.059049 +Converged at iteration 22, L1 7.74913e-05, Linf 0.00297062, total time[s] 0.06612 +Converged at iteration 25, L1 7.13693e-05, Linf 0.00196265, total time[s] 0.066646 +Converged at iteration 29, L1 7.07955e-05, Linf 0.00502035, total time[s] 0.083441 +Converged at iteration 30, L1 7.2509e-05, Linf 0.00482581, total time[s] 0.081855 +Converged at iteration 28, L1 6.84337e-05, Linf 0.00363461, total time[s] 0.07891 +Converged at iteration 30, L1 7.46057e-05, Linf 0.00460608, total time[s] 0.079236 +Converged at iteration 29, L1 9.87986e-05, Linf 0.00296574, total time[s] 0.078415 +Converged at iteration 29, L1 6.77331e-05, Linf 0.00127884, total time[s] 0.079897 +Converged at iteration 31, L1 5.72391e-05, Linf 0.00670648, total time[s] 0.112595 +Converged at iteration 29, L1 5.98581e-05, Linf 0.00833665, total time[s] 0.080037 +Converged at iteration 27, L1 5.35228e-05, Linf 0.00582414, total time[s] 0.084219 +Converged at iteration 24, L1 7.50441e-05, Linf 0.00261665, total time[s] 0.06669 +Converged at iteration 37, L1 9.59392e-05, Linf 0.0070532, total time[s] 0.168459 +Converged at iteration 34, L1 6.62663e-05, Linf 0.00581969, total time[s] 0.09469 +Converged at iteration 24, L1 9.99485e-05, Linf 0.00363652, total time[s] 0.064534 +Converged at iteration 29, L1 8.85411e-05, Linf 0.00661272, total time[s] 0.080426 +Converged at iteration 27, L1 6.41062e-05, Linf 0.00985286, total time[s] 0.083353 +Converged at iteration 25, L1 4.42384e-05, Linf 0.00882085, total time[s] 0.067506 +Converged at iteration 20, L1 4.14104e-05, Linf 0.00377554, total time[s] 0.055556 +Converged at iteration 20, L1 4.51487e-05, Linf 0.00336552, total time[s] 0.067904 +Converged at iteration 23, L1 9.16547e-05, Linf 0.00479528, total time[s] 0.069678 +Converged at iteration 25, L1 8.75033e-05, Linf 0.00719394, total time[s] 0.066785 +Converged at iteration 21, L1 8.55331e-05, Linf 0.00600104, total time[s] 0.063131 +Converged at iteration 17, L1 5.74807e-05, Linf 0.00476805, total time[s] 0.048901 +Converged at iteration 31, L1 6.80155e-05, Linf 0.00413221, total time[s] 0.081747 +Converged at iteration 16, L1 9.33039e-05, Linf 0.00768297, total time[s] 0.048039 +Converged at iteration 20, L1 6.63693e-05, Linf 0.00282277, total time[s] 0.062993 +Converged at iteration 27, L1 5.9476e-05, Linf 0.00264192, total time[s] 0.074612 +Converged at iteration 23, L1 8.1295e-05, Linf 0.00700445, total time[s] 0.061337 +Converged at iteration 22, L1 6.61077e-05, Linf 0.00324928, total time[s] 0.060901 +Converged at iteration 22, L1 8.21784e-05, Linf 0.00312745, total time[s] 0.058826 +Converged at iteration 25, L1 6.85743e-05, Linf 0.00205234, total time[s] 0.066134 +Converged at iteration 29, L1 7.13523e-05, Linf 0.00466465, total time[s] 0.079127 +Converged at iteration 30, L1 7.5995e-05, Linf 0.00503521, total time[s] 0.078091 +Converged at iteration 28, L1 6.88395e-05, Linf 0.00372838, total time[s] 0.075531 +Converged at iteration 30, L1 7.74917e-05, Linf 0.00478011, total time[s] 0.079052 +Converged at iteration 30, L1 6.32331e-05, Linf 0.00227815, total time[s] 0.078424 +Converged at iteration 29, L1 7.15661e-05, Linf 0.00127206, total time[s] 0.075629 +Converged at iteration 30, L1 9.50642e-05, Linf 0.0084987, total time[s] 0.080132 +Converged at iteration 29, L1 6.46197e-05, Linf 0.00895719, total time[s] 0.075317 +Converged at iteration 27, L1 6.03524e-05, Linf 0.00635559, total time[s] 0.070958 +Converged at iteration 24, L1 7.9141e-05, Linf 0.00272369, total time[s] 0.064534 +Converged at iteration 37, L1 9.02882e-05, Linf 0.00674878, total time[s] 0.096948 +Converged at iteration 34, L1 6.14291e-05, Linf 0.00555998, total time[s] 0.091094 +Converged at iteration 25, L1 4.34849e-05, Linf 0.00209129, total time[s] 0.068834 +Converged at iteration 29, L1 8.44692e-05, Linf 0.00647115, total time[s] 0.075817 +Converged at iteration 27, L1 6.48825e-05, Linf 0.0103488, total time[s] 0.071197 +Converged at iteration 25, L1 4.91362e-05, Linf 0.00976605, total time[s] 0.067028 +Converged at iteration 20, L1 4.50799e-05, Linf 0.00405208, total time[s] 0.066577 +Converged at iteration 20, L1 4.3338e-05, Linf 0.00338301, total time[s] 0.076581 +Converged at iteration 23, L1 9.24793e-05, Linf 0.00486327, total time[s] 0.062242 +Converged at iteration 25, L1 8.89518e-05, Linf 0.00735222, total time[s] 0.064641 +Converged at iteration 21, L1 8.66272e-05, Linf 0.00598921, total time[s] 0.054947 +Converged at iteration 17, L1 5.87092e-05, Linf 0.00466688, total time[s] 0.046615 +Converged at iteration 31, L1 6.6184e-05, Linf 0.0043323, total time[s] 0.085474 +Converged at iteration 16, L1 9.89312e-05, Linf 0.00664617, total time[s] 0.044665 +Converged at iteration 18, L1 9.96131e-05, Linf 0.00390697, total time[s] 0.049164 +Converged at iteration 27, L1 6.3834e-05, Linf 0.00282064, total time[s] 0.071279 +Converged at iteration 23, L1 8.57871e-05, Linf 0.00713817, total time[s] 0.060784 +Converged at iteration 22, L1 7.09433e-05, Linf 0.00357733, total time[s] 0.058473 +Converged at iteration 22, L1 8.93302e-05, Linf 0.00323141, total time[s] 0.059602 +Converged at iteration 24, L1 9.78844e-05, Linf 0.00196325, total time[s] 0.063211 +Converged at iteration 29, L1 7.20347e-05, Linf 0.00469548, total time[s] 0.0747 +Converged at iteration 30, L1 7.9796e-05, Linf 0.00529366, total time[s] 0.079343 +Converged at iteration 28, L1 6.9791e-05, Linf 0.00370627, total time[s] 0.080035 +Converged at iteration 30, L1 8.12853e-05, Linf 0.00496314, total time[s] 0.081343 +Converged at iteration 30, L1 6.4929e-05, Linf 0.00232053, total time[s] 0.080354 +Converged at iteration 29, L1 7.74131e-05, Linf 0.00133695, total time[s] 0.078147 +Converged at iteration 30, L1 8.6751e-05, Linf 0.00835523, total time[s] 0.090062 +Converged at iteration 29, L1 7.19389e-05, Linf 0.00962926, total time[s] 0.095799 +Converged at iteration 27, L1 6.97219e-05, Linf 0.00715585, total time[s] 0.077779 +Converged at iteration 24, L1 8.31658e-05, Linf 0.00284525, total time[s] 0.063578 +Converged at iteration 37, L1 8.44226e-05, Linf 0.00646125, total time[s] 0.094877 +Converged at iteration 34, L1 5.63513e-05, Linf 0.00535106, total time[s] 0.090096 +Converged at iteration 25, L1 4.54516e-05, Linf 0.00209972, total time[s] 0.072156 +Converged at iteration 29, L1 7.53633e-05, Linf 0.00635186, total time[s] 0.080489 +Converged at iteration 27, L1 6.71933e-05, Linf 0.0108639, total time[s] 0.070988 +Converged at iteration 25, L1 5.4879e-05, Linf 0.0106626, total time[s] 0.066482 +Converged at iteration 20, L1 4.91758e-05, Linf 0.0042446, total time[s] 0.061112 +Converged at iteration 20, L1 4.13923e-05, Linf 0.00337588, total time[s] 0.070294 +Converged at iteration 23, L1 9.48418e-05, Linf 0.00488822, total time[s] 0.075008 +Converged at iteration 25, L1 8.92477e-05, Linf 0.0075074, total time[s] 0.075531 +Converged at iteration 21, L1 8.58415e-05, Linf 0.00610597, total time[s] 0.066001 +Converged at iteration 17, L1 6.07386e-05, Linf 0.00434584, total time[s] 0.048546 +Converged at iteration 31, L1 6.35714e-05, Linf 0.00455266, total time[s] 0.091594 +Converged at iteration 17, L1 7.82682e-05, Linf 0.0029994, total time[s] 0.047383 +Converged at iteration 18, L1 8.11707e-05, Linf 0.00265011, total time[s] 0.051367 +Converged at iteration 27, L1 6.62151e-05, Linf 0.0029756, total time[s] 0.070847 +Converged at iteration 23, L1 9.16577e-05, Linf 0.00743731, total time[s] 0.063686 +Converged at iteration 22, L1 7.52597e-05, Linf 0.00385809, total time[s] 0.06073 +Converged at iteration 22, L1 9.84573e-05, Linf 0.00358351, total time[s] 0.059283 +Converged at iteration 24, L1 9.14848e-05, Linf 0.00161216, total time[s] 0.064606 +Converged at iteration 29, L1 7.26196e-05, Linf 0.00505113, total time[s] 0.080142 +Converged at iteration 30, L1 8.44668e-05, Linf 0.0055686, total time[s] 0.081094 +Converged at iteration 28, L1 6.92629e-05, Linf 0.00335293, total time[s] 0.078758 +Converged at iteration 30, L1 8.45454e-05, Linf 0.00515695, total time[s] 0.081948 +Converged at iteration 30, L1 6.7096e-05, Linf 0.00235964, total time[s] 0.082562 +Converged at iteration 29, L1 8.41577e-05, Linf 0.00154558, total time[s] 0.078759 +Converged at iteration 30, L1 8.00326e-05, Linf 0.00833727, total time[s] 0.079572 +Converged at iteration 29, L1 7.83951e-05, Linf 0.0102219, total time[s] 0.080104 +Converged at iteration 27, L1 7.92513e-05, Linf 0.00802559, total time[s] 0.071632 +Converged at iteration 24, L1 8.7781e-05, Linf 0.00299815, total time[s] 0.066296 +Converged at iteration 37, L1 7.8577e-05, Linf 0.00621185, total time[s] 0.098725 +Converged at iteration 34, L1 5.16045e-05, Linf 0.00516509, total time[s] 0.091426 +Converged at iteration 25, L1 4.67852e-05, Linf 0.00205836, total time[s] 0.067394 +Converged at iteration 29, L1 6.91774e-05, Linf 0.00619087, total time[s] 0.076357 +Converged at iteration 27, L1 7.09683e-05, Linf 0.011383, total time[s] 0.07286 +Converged at iteration 25, L1 6.11903e-05, Linf 0.0115832, total time[s] 0.067558 +Converged at iteration 20, L1 5.25594e-05, Linf 0.00443876, total time[s] 0.055211 +Converged at iteration 19, L1 9.54917e-05, Linf 0.00510325, total time[s] 0.054174 +Converged at iteration 23, L1 9.59125e-05, Linf 0.00488282, total time[s] 0.063021 +Converged at iteration 25, L1 8.23009e-05, Linf 0.00766216, total time[s] 0.071075 +Converged at iteration 21, L1 8.64135e-05, Linf 0.00598071, total time[s] 0.059113 +Converged at iteration 17, L1 6.27061e-05, Linf 0.00407961, total time[s] 0.060179 +Converged at iteration 31, L1 6.09348e-05, Linf 0.0047895, total time[s] 0.08639 +Converged at iteration 18, L1 7.18842e-05, Linf 0.00155692, total time[s] 0.056146 +Converged at iteration 19, L1 7.04016e-05, Linf 0.00157086, total time[s] 0.0592 +Converged at iteration 27, L1 7.03008e-05, Linf 0.00311617, total time[s] 0.138842 +Converged at iteration 23, L1 9.74955e-05, Linf 0.00784083, total time[s] 0.13834 +Converged at iteration 22, L1 7.97841e-05, Linf 0.00426133, total time[s] 0.098089 +Converged at iteration 23, L1 6.5271e-05, Linf 0.00279809, total time[s] 0.067868 +Converged at iteration 24, L1 8.50589e-05, Linf 0.00163108, total time[s] 0.074408 +Converged at iteration 29, L1 7.33573e-05, Linf 0.00505093, total time[s] 0.10935 +Converged at iteration 30, L1 8.90143e-05, Linf 0.00579207, total time[s] 0.092819 +Converged at iteration 28, L1 6.9292e-05, Linf 0.00317971, total time[s] 0.11185 +Converged at iteration 30, L1 8.82778e-05, Linf 0.00536452, total time[s] 0.084364 +Converged at iteration 30, L1 6.963e-05, Linf 0.00240046, total time[s] 0.078584 +Converged at iteration 29, L1 9.11201e-05, Linf 0.00173008, total time[s] 0.076607 +Converged at iteration 30, L1 7.46545e-05, Linf 0.00819172, total time[s] 0.078252 +Converged at iteration 29, L1 8.59495e-05, Linf 0.0109712, total time[s] 0.077354 +Converged at iteration 27, L1 9.021e-05, Linf 0.00858872, total time[s] 0.078335 +Converged at iteration 24, L1 9.1164e-05, Linf 0.00308766, total time[s] 0.077576 +Converged at iteration 37, L1 7.27567e-05, Linf 0.00599375, total time[s] 0.109012 +Converged at iteration 33, L1 9.75857e-05, Linf 0.00626836, total time[s] 0.164921 +Converged at iteration 25, L1 4.7442e-05, Linf 0.00202902, total time[s] 0.085026 +Converged at iteration 29, L1 6.27474e-05, Linf 0.00599089, total time[s] 0.085309 +Converged at iteration 27, L1 7.51396e-05, Linf 0.0118907, total time[s] 0.070779 +Converged at iteration 25, L1 6.76998e-05, Linf 0.0124466, total time[s] 0.070619 +Converged at iteration 20, L1 5.58802e-05, Linf 0.00464608, total time[s] 0.055322 +Converged at iteration 19, L1 8.77638e-05, Linf 0.00512256, total time[s] 0.052555 +Converged at iteration 23, L1 9.95993e-05, Linf 0.00490101, total time[s] 0.06236 +Converged at iteration 25, L1 7.01599e-05, Linf 0.00778479, total time[s] 0.065929 +Converged at iteration 21, L1 8.48492e-05, Linf 0.00592194, total time[s] 0.060117 +Converged at iteration 17, L1 6.63575e-05, Linf 0.00376092, total time[s] 0.051027 +Converged at iteration 31, L1 5.84066e-05, Linf 0.00502592, total time[s] 0.092889 +Converged at iteration 18, L1 9.16269e-05, Linf 0.00212573, total time[s] 0.053593 +Converged at iteration 20, L1 6.67304e-05, Linf 0.0020858, total time[s] 0.055702 +Converged at iteration 27, L1 7.46009e-05, Linf 0.00329868, total time[s] 0.077012 +Converged at iteration 24, L1 4.78544e-05, Linf 0.00379632, total time[s] 0.065256 +Converged at iteration 22, L1 8.38915e-05, Linf 0.00466203, total time[s] 0.061317 +Converged at iteration 23, L1 7.26848e-05, Linf 0.00277207, total time[s] 0.064334 +Converged at iteration 24, L1 7.81885e-05, Linf 0.00163595, total time[s] 0.071434 +Converged at iteration 29, L1 7.36497e-05, Linf 0.00512173, total time[s] 0.086746 +Converged at iteration 30, L1 9.43713e-05, Linf 0.00609409, total time[s] 0.083262 +Converged at iteration 28, L1 6.89136e-05, Linf 0.00291091, total time[s] 0.075105 +Converged at iteration 30, L1 9.21807e-05, Linf 0.0055932, total time[s] 0.087714 +Converged at iteration 30, L1 7.18748e-05, Linf 0.00245126, total time[s] 0.080254 +Converged at iteration 29, L1 9.91842e-05, Linf 0.00191417, total time[s] 0.077813 +Converged at iteration 30, L1 6.97214e-05, Linf 0.0078354, total time[s] 0.081582 +Converged at iteration 29, L1 9.37213e-05, Linf 0.0119085, total time[s] 0.105277 +Converged at iteration 28, L1 4.74724e-05, Linf 0.00745668, total time[s] 0.083352 +Converged at iteration 24, L1 9.63341e-05, Linf 0.00323478, total time[s] 0.066241 +Converged at iteration 37, L1 6.66533e-05, Linf 0.00589175, total time[s] 0.099138 +Converged at iteration 33, L1 9.15271e-05, Linf 0.00599651, total time[s] 0.093726 +Converged at iteration 25, L1 4.97245e-05, Linf 0.00200542, total time[s] 0.068734 +Converged at iteration 29, L1 5.64304e-05, Linf 0.00580382, total time[s] 0.077152 +Converged at iteration 27, L1 7.71213e-05, Linf 0.0123075, total time[s] 0.071597 +Converged at iteration 25, L1 7.45444e-05, Linf 0.0132683, total time[s] 0.070152 +Converged at iteration 20, L1 5.97223e-05, Linf 0.00503839, total time[s] 0.054777 +Converged at iteration 19, L1 7.98363e-05, Linf 0.00513638, total time[s] 0.056804 +Converged at iteration 24, L1 5.36275e-05, Linf 0.00302707, total time[s] 0.070433 +Converged at iteration 25, L1 5.91971e-05, Linf 0.00785096, total time[s] 0.080507 +Converged at iteration 21, L1 8.33979e-05, Linf 0.00591682, total time[s] 0.067037 +Converged at iteration 17, L1 7.0779e-05, Linf 0.00338728, total time[s] 0.069453 +Converged at iteration 31, L1 5.70573e-05, Linf 0.00533752, total time[s] 0.088398 +Converged at iteration 19, L1 7.00144e-05, Linf 0.00274379, total time[s] 0.064139 +Converged at iteration 20, L1 9.26275e-05, Linf 0.00297054, total time[s] 0.065944 +Converged at iteration 27, L1 8.29377e-05, Linf 0.00349569, total time[s] 0.082296 +Converged at iteration 24, L1 5.60526e-05, Linf 0.00401344, total time[s] 0.07359 +Converged at iteration 22, L1 8.89142e-05, Linf 0.00491125, total time[s] 0.059835 +Converged at iteration 23, L1 8.19057e-05, Linf 0.0030068, total time[s] 0.086601 +Converged at iteration 24, L1 7.07572e-05, Linf 0.00164943, total time[s] 0.073982 +Converged at iteration 29, L1 7.22264e-05, Linf 0.0051687, total time[s] 0.079332 +Converged at iteration 31, L1 5.2414e-05, Linf 0.00344923, total time[s] 0.085061 +Converged at iteration 28, L1 6.82076e-05, Linf 0.0030322, total time[s] 0.078856 +Converged at iteration 30, L1 9.58801e-05, Linf 0.00575511, total time[s] 0.089896 +Converged at iteration 30, L1 7.46224e-05, Linf 0.00252221, total time[s] 0.092425 +Converged at iteration 30, L1 5.77179e-05, Linf 0.00121907, total time[s] 0.091343 +Converged at iteration 30, L1 6.56342e-05, Linf 0.00773877, total time[s] 0.083192 +Converged at iteration 30, L1 4.01679e-05, Linf 0.00944392, total time[s] 0.083336 +Converged at iteration 28, L1 5.42266e-05, Linf 0.00819027, total time[s] 0.074569 +Converged at iteration 25, L1 5.33051e-05, Linf 0.00204288, total time[s] 0.074273 +Converged at iteration 37, L1 6.07948e-05, Linf 0.00564752, total time[s] 0.098545 +Converged at iteration 33, L1 8.65749e-05, Linf 0.00572873, total time[s] 0.089967 +Converged at iteration 25, L1 5.0215e-05, Linf 0.00205688, total time[s] 0.071178 +Converged at iteration 28, L1 9.67193e-05, Linf 0.0077035, total time[s] 0.073864 +Converged at iteration 27, L1 7.99781e-05, Linf 0.0126671, total time[s] 0.071493 +Converged at iteration 25, L1 8.10747e-05, Linf 0.0142514, total time[s] 0.066509 +Converged at iteration 20, L1 6.41027e-05, Linf 0.00539627, total time[s] 0.062628 +Converged at iteration 19, L1 7.45556e-05, Linf 0.00515856, total time[s] 0.063447 +Converged at iteration 24, L1 5.37256e-05, Linf 0.00299974, total time[s] 0.085884 +Converged at iteration 25, L1 4.92989e-05, Linf 0.00784118, total time[s] 0.092886 +Converged at iteration 21, L1 8.12871e-05, Linf 0.00587689, total time[s] 0.10374 +Converged at iteration 17, L1 7.67603e-05, Linf 0.00297359, total time[s] 0.054387 +Converged at iteration 31, L1 5.65391e-05, Linf 0.00561007, total time[s] 0.093822 +Converged at iteration 19, L1 8.42015e-05, Linf 0.00335226, total time[s] 0.055437 +Converged at iteration 21, L1 7.70885e-05, Linf 0.00354091, total time[s] 0.064557 +Converged at iteration 27, L1 7.72435e-05, Linf 0.00361728, total time[s] 0.076612 +Converged at iteration 24, L1 5.69626e-05, Linf 0.00422086, total time[s] 0.063667 +Converged at iteration 22, L1 9.3257e-05, Linf 0.00507467, total time[s] 0.05949 +Converged at iteration 23, L1 9.2242e-05, Linf 0.00354749, total time[s] 0.061205 +Converged at iteration 23, L1 9.05072e-05, Linf 0.00243254, total time[s] 0.062616 +Converged at iteration 29, L1 7.14563e-05, Linf 0.00522656, total time[s] 0.0806 +Converged at iteration 31, L1 5.60511e-05, Linf 0.0037769, total time[s] 0.088967 +Converged at iteration 28, L1 6.66702e-05, Linf 0.00279471, total time[s] 0.084366 +Converged at iteration 30, L1 9.9892e-05, Linf 0.00611508, total time[s] 0.078639 +Converged at iteration 30, L1 7.79075e-05, Linf 0.00264121, total time[s] 0.078271 +Converged at iteration 30, L1 6.04638e-05, Linf 0.00131333, total time[s] 0.080713 +Converged at iteration 30, L1 6.22214e-05, Linf 0.00753191, total time[s] 0.078528 +Converged at iteration 30, L1 4.36913e-05, Linf 0.0100738, total time[s] 0.078568 +Converged at iteration 28, L1 6.16518e-05, Linf 0.00892886, total time[s] 0.073676 +Converged at iteration 25, L1 5.47856e-05, Linf 0.00207746, total time[s] 0.066025 +Converged at iteration 37, L1 5.54403e-05, Linf 0.00550223, total time[s] 0.098085 +Converged at iteration 33, L1 8.29026e-05, Linf 0.00543141, total time[s] 0.095398 +Converged at iteration 25, L1 5.17348e-05, Linf 0.00212571, total time[s] 0.068365 +Converged at iteration 28, L1 9.35362e-05, Linf 0.00763972, total time[s] 0.073561 +Converged at iteration 27, L1 8.32647e-05, Linf 0.0129757, total time[s] 0.072709 +Converged at iteration 25, L1 8.75595e-05, Linf 0.014897, total time[s] 0.072732 +Converged at iteration 20, L1 6.86352e-05, Linf 0.00582199, total time[s] 0.055477 +Converged at iteration 19, L1 7.08401e-05, Linf 0.0051679, total time[s] 0.052117 +Converged at iteration 24, L1 5.52756e-05, Linf 0.00296081, total time[s] 0.074146 +Converged at iteration 24, L1 9.41768e-05, Linf 0.0105396, total time[s] 0.067537 +Converged at iteration 21, L1 7.82169e-05, Linf 0.00588164, total time[s] 0.064734 +Converged at iteration 17, L1 8.40212e-05, Linf 0.00250575, total time[s] 0.047139 +Converged at iteration 31, L1 5.72568e-05, Linf 0.00592649, total time[s] 0.083323 +Converged at iteration 20, L1 6.09725e-05, Linf 0.00361761, total time[s] 0.061889 +Converged at iteration 21, L1 9.28121e-05, Linf 0.00455134, total time[s] 0.056439 +Converged at iteration 27, L1 7.85205e-05, Linf 0.0036866, total time[s] 0.071462 +Converged at iteration 24, L1 6.10293e-05, Linf 0.00438656, total time[s] 0.063521 +Converged at iteration 22, L1 9.89592e-05, Linf 0.00530109, total time[s] 0.059492 +Converged at iteration 24, L1 5.84432e-05, Linf 0.00296104, total time[s] 0.065169 +Converged at iteration 23, L1 8.15247e-05, Linf 0.00242972, total time[s] 0.06248 +Converged at iteration 29, L1 7.00301e-05, Linf 0.00512158, total time[s] 0.079993 +Converged at iteration 31, L1 5.93709e-05, Linf 0.00392639, total time[s] 0.08051 +Converged at iteration 28, L1 6.48613e-05, Linf 0.00274656, total time[s] 0.074271 +Converged at iteration 31, L1 5.52595e-05, Linf 0.00492589, total time[s] 0.091639 +Converged at iteration 30, L1 8.09894e-05, Linf 0.0027617, total time[s] 0.081756 +Converged at iteration 30, L1 6.41791e-05, Linf 0.00142186, total time[s] 0.081911 +Converged at iteration 30, L1 5.91456e-05, Linf 0.0073021, total time[s] 0.080889 +Converged at iteration 30, L1 4.78196e-05, Linf 0.0107869, total time[s] 0.080376 +Converged at iteration 28, L1 6.97528e-05, Linf 0.00969065, total time[s] 0.075123 +Converged at iteration 25, L1 5.62165e-05, Linf 0.00213308, total time[s] 0.071999 +Converged at iteration 36, L1 9.55035e-05, Linf 0.00670243, total time[s] 0.09634 +Converged at iteration 33, L1 8.08903e-05, Linf 0.00512421, total time[s] 0.091275 +Converged at iteration 25, L1 5.34999e-05, Linf 0.00221098, total time[s] 0.067764 +Converged at iteration 28, L1 8.38046e-05, Linf 0.00761121, total time[s] 0.075752 +Converged at iteration 27, L1 8.22919e-05, Linf 0.0125025, total time[s] 0.074092 +Converged at iteration 25, L1 9.59243e-05, Linf 0.0158166, total time[s] 0.068135 +Converged at iteration 20, L1 7.36915e-05, Linf 0.00671074, total time[s] 0.057258 +Converged at iteration 19, L1 6.91512e-05, Linf 0.00518828, total time[s] 0.053885 +Converged at iteration 24, L1 5.51749e-05, Linf 0.00292048, total time[s] 0.066129 +Converged at iteration 24, L1 8.04233e-05, Linf 0.0104803, total time[s] 0.066161 +Converged at iteration 21, L1 7.39202e-05, Linf 0.00589439, total time[s] 0.058011 +Converged at iteration 17, L1 9.42464e-05, Linf 0.00215786, total time[s] 0.048418 +Converged at iteration 31, L1 5.96599e-05, Linf 0.00623991, total time[s] 0.080944 +Converged at iteration 20, L1 7.18898e-05, Linf 0.00452766, total time[s] 0.055874 +Converged at iteration 22, L1 6.3565e-05, Linf 0.00431217, total time[s] 0.060433 +Converged at iteration 27, L1 8.24871e-05, Linf 0.00777629, total time[s] 0.072576 +Converged at iteration 24, L1 6.94161e-05, Linf 0.00451321, total time[s] 0.06652 +Converged at iteration 23, L1 5.64084e-05, Linf 0.00347568, total time[s] 0.062362 +Converged at iteration 24, L1 6.6423e-05, Linf 0.00341366, total time[s] 0.070089 +Converged at iteration 23, L1 7.58407e-05, Linf 0.0028721, total time[s] 0.06388 +Converged at iteration 29, L1 6.76914e-05, Linf 0.0052648, total time[s] 0.075103 +Converged at iteration 31, L1 6.4842e-05, Linf 0.00417509, total time[s] 0.07993 +Converged at iteration 28, L1 6.34216e-05, Linf 0.00272392, total time[s] 0.077835 +Converged at iteration 31, L1 5.66252e-05, Linf 0.00516536, total time[s] 0.080828 +Converged at iteration 30, L1 8.44672e-05, Linf 0.00283862, total time[s] 0.077252 +Converged at iteration 30, L1 6.73503e-05, Linf 0.00164011, total time[s] 0.07803 +Converged at iteration 30, L1 5.77706e-05, Linf 0.00698798, total time[s] 0.079161 +Converged at iteration 30, L1 5.2789e-05, Linf 0.0115219, total time[s] 0.077418 +Converged at iteration 28, L1 7.89434e-05, Linf 0.0105212, total time[s] 0.079964 +Converged at iteration 25, L1 5.67147e-05, Linf 0.00219388, total time[s] 0.066177 +Converged at iteration 36, L1 8.9021e-05, Linf 0.00664593, total time[s] 0.09343 +Converged at iteration 33, L1 8.03247e-05, Linf 0.00488261, total time[s] 0.088588 +Converged at iteration 25, L1 5.33037e-05, Linf 0.00229947, total time[s] 0.073388 +Converged at iteration 28, L1 7.3978e-05, Linf 0.00759085, total time[s] 0.083895 +Converged at iteration 27, L1 8.18704e-05, Linf 0.0120333, total time[s] 0.071103 +Converged at iteration 26, L1 2.90145e-05, Linf 0.0100008, total time[s] 0.069024 +Converged at iteration 20, L1 7.89689e-05, Linf 0.00706098, total time[s] 0.056769 +Converged at iteration 19, L1 6.94534e-05, Linf 0.00515032, total time[s] 0.055695 +Converged at iteration 24, L1 5.70954e-05, Linf 0.00288534, total time[s] 0.065998 +Converged at iteration 24, L1 6.74004e-05, Linf 0.0102951, total time[s] 0.064146 +Converged at iteration 21, L1 6.47056e-05, Linf 0.00586061, total time[s] 0.057362 +Converged at iteration 18, L1 5.43769e-05, Linf 0.00165175, total time[s] 0.105697 +Converged at iteration 31, L1 6.22403e-05, Linf 0.00656335, total time[s] 0.080913 +Converged at iteration 20, L1 9.01904e-05, Linf 0.00495341, total time[s] 0.054796 +Converged at iteration 22, L1 7.16937e-05, Linf 0.00499456, total time[s] 0.06049 +Converged at iteration 27, L1 8.49416e-05, Linf 0.0039837, total time[s] 0.076817 +Converged at iteration 24, L1 6.71998e-05, Linf 0.00468782, total time[s] 0.064986 +Converged at iteration 23, L1 5.94583e-05, Linf 0.00357154, total time[s] 0.066775 +Converged at iteration 24, L1 7.29381e-05, Linf 0.00397052, total time[s] 0.066762 +Converged at iteration 23, L1 7.46633e-05, Linf 0.00369106, total time[s] 0.06426 +Converged at iteration 28, L1 9.988e-05, Linf 0.00636751, total time[s] 0.072922 +Converged at iteration 31, L1 6.81131e-05, Linf 0.00434197, total time[s] 0.07894 +Converged at iteration 28, L1 6.14982e-05, Linf 0.0027257, total time[s] 0.073242 +Converged at iteration 31, L1 5.83228e-05, Linf 0.00532362, total time[s] 0.079181 +Converged at iteration 30, L1 8.86031e-05, Linf 0.00295363, total time[s] 0.077313 +Converged at iteration 30, L1 7.18248e-05, Linf 0.00185652, total time[s] 0.077067 +Converged at iteration 30, L1 5.66762e-05, Linf 0.00657552, total time[s] 0.07672 +Converged at iteration 30, L1 5.78094e-05, Linf 0.0125723, total time[s] 0.078233 +Converged at iteration 28, L1 8.89466e-05, Linf 0.0113929, total time[s] 0.072953 +Converged at iteration 25, L1 5.68877e-05, Linf 0.00225564, total time[s] 0.067844 +Converged at iteration 36, L1 8.3209e-05, Linf 0.00664891, total time[s] 0.102911 +Converged at iteration 33, L1 8.11073e-05, Linf 0.0047278, total time[s] 0.089769 +Converged at iteration 25, L1 5.46255e-05, Linf 0.00237892, total time[s] 0.064913 +Converged at iteration 28, L1 5.04364e-05, Linf 0.00750541, total time[s] 0.072115 +Converged at iteration 27, L1 7.75345e-05, Linf 0.0119471, total time[s] 0.069805 +Converged at iteration 26, L1 3.1514e-05, Linf 0.0112431, total time[s] 0.067616 +Converged at iteration 20, L1 8.59917e-05, Linf 0.00736678, total time[s] 0.057177 +Converged at iteration 19, L1 7.13387e-05, Linf 0.00508315, total time[s] 0.051197 +Converged at iteration 24, L1 5.97278e-05, Linf 0.00284971, total time[s] 0.063072 +Converged at iteration 24, L1 5.4596e-05, Linf 0.00997606, total time[s] 0.06309 +Converged at iteration 21, L1 5.32954e-05, Linf 0.0056156, total time[s] 0.05598 +Converged at iteration 18, L1 6.3583e-05, Linf 0.00195617, total time[s] 0.053043 +Converged at iteration 31, L1 6.49995e-05, Linf 0.00695551, total time[s] 0.085493 +Converged at iteration 21, L1 6.30185e-05, Linf 0.00336863, total time[s] 0.055754 +Converged at iteration 22, L1 7.65907e-05, Linf 0.00569488, total time[s] 0.057831 +Converged at iteration 27, L1 8.66797e-05, Linf 0.00414551, total time[s] 0.072249 +Converged at iteration 24, L1 6.96887e-05, Linf 0.00486999, total time[s] 0.06806 +Converged at iteration 23, L1 6.16234e-05, Linf 0.00375836, total time[s] 0.06233 +Converged at iteration 24, L1 8.30768e-05, Linf 0.0056076, total time[s] 0.062551 +Converged at iteration 23, L1 7.81209e-05, Linf 0.00467634, total time[s] 0.060851 +Converged at iteration 28, L1 9.56066e-05, Linf 0.00618673, total time[s] 0.072506 +Converged at iteration 31, L1 7.50549e-05, Linf 0.00503062, total time[s] 0.079451 +Converged at iteration 27, L1 9.96631e-05, Linf 0.00364103, total time[s] 0.077024 +Converged at iteration 31, L1 5.89262e-05, Linf 0.00561032, total time[s] 0.079033 +Converged at iteration 30, L1 9.18425e-05, Linf 0.00300097, total time[s] 0.077226 +Converged at iteration 30, L1 8.18231e-05, Linf 0.00221172, total time[s] 0.076742 +Converged at iteration 30, L1 5.55289e-05, Linf 0.00605745, total time[s] 0.077101 +Converged at iteration 30, L1 6.42497e-05, Linf 0.0137872, total time[s] 0.077038 +Converged at iteration 29, L1 4.11925e-05, Linf 0.00902601, total time[s] 0.074507 +Converged at iteration 25, L1 5.70642e-05, Linf 0.00233741, total time[s] 0.06522 +Converged at iteration 36, L1 7.95432e-05, Linf 0.00641045, total time[s] 0.097044 +Converged at iteration 33, L1 8.291e-05, Linf 0.00473404, total time[s] 0.089476 +Converged at iteration 25, L1 5.4141e-05, Linf 0.00243888, total time[s] 0.077111 +Converged at iteration 27, L1 7.25486e-05, Linf 0.00956535, total time[s] 0.087006 +Converged at iteration 27, L1 7.89151e-05, Linf 0.0114326, total time[s] 0.069597 +Converged at iteration 26, L1 3.37141e-05, Linf 0.0110204, total time[s] 0.067695 +Converged at iteration 20, L1 9.22895e-05, Linf 0.0078117, total time[s] 0.057066 +Converged at iteration 19, L1 7.60953e-05, Linf 0.00502794, total time[s] 0.058273 +Converged at iteration 24, L1 5.96035e-05, Linf 0.00281108, total time[s] 0.073567 +Converged at iteration 24, L1 4.51215e-05, Linf 0.0094481, total time[s] 0.071336 +Converged at iteration 21, L1 4.432e-05, Linf 0.00509547, total time[s] 0.057544 +Converged at iteration 18, L1 7.38109e-05, Linf 0.0022106, total time[s] 0.050378 +Converged at iteration 31, L1 6.73577e-05, Linf 0.00732387, total time[s] 0.083409 +Converged at iteration 21, L1 6.56433e-05, Linf 0.00379944, total time[s] 0.057225 +Converged at iteration 22, L1 8.7069e-05, Linf 0.00622987, total time[s] 0.061142 +Converged at iteration 27, L1 8.37927e-05, Linf 0.00420167, total time[s] 0.071198 +Converged at iteration 24, L1 7.18402e-05, Linf 0.00507781, total time[s] 0.064487 +Converged at iteration 23, L1 6.41758e-05, Linf 0.00389402, total time[s] 0.061614 +Converged at iteration 24, L1 9.14399e-05, Linf 0.00709672, total time[s] 0.064431 +Converged at iteration 23, L1 8.5749e-05, Linf 0.00556479, total time[s] 0.061108 +Converged at iteration 28, L1 9.0038e-05, Linf 0.00588969, total time[s] 0.07379 +Converged at iteration 31, L1 7.94904e-05, Linf 0.00523691, total time[s] 0.083302 +Converged at iteration 27, L1 9.7036e-05, Linf 0.00354548, total time[s] 0.071164 +Converged at iteration 31, L1 5.97537e-05, Linf 0.00595942, total time[s] 0.080411 +Converged at iteration 30, L1 9.81893e-05, Linf 0.00326988, total time[s] 0.078276 +Converged at iteration 30, L1 9.21689e-05, Linf 0.00254844, total time[s] 0.081642 +Converged at iteration 29, L1 9.8446e-05, Linf 0.00912377, total time[s] 0.076281 +Converged at iteration 30, L1 7.3054e-05, Linf 0.015185, total time[s] 0.085573 +Converged at iteration 29, L1 4.75234e-05, Linf 0.00970959, total time[s] 0.09225 +Converged at iteration 25, L1 5.55465e-05, Linf 0.00237923, total time[s] 0.095901 +Converged at iteration 36, L1 7.70206e-05, Linf 0.00628143, total time[s] 0.151609 +Converged at iteration 33, L1 8.63001e-05, Linf 0.00488812, total time[s] 0.091874 +Converged at iteration 25, L1 5.44548e-05, Linf 0.00252741, total time[s] 0.071263 +Converged at iteration 27, L1 4.7857e-05, Linf 0.00923768, total time[s] 0.072357 +Converged at iteration 27, L1 8.05841e-05, Linf 0.011485, total time[s] 0.070546 +Converged at iteration 26, L1 3.47735e-05, Linf 0.0125042, total time[s] 0.077935 +Converged at iteration 20, L1 9.90306e-05, Linf 0.00821893, total time[s] 0.064387 +Converged at iteration 19, L1 7.93004e-05, Linf 0.00493488, total time[s] 0.133885 +Converged at iteration 24, L1 5.98404e-05, Linf 0.00277542, total time[s] 0.116963 +Converged at iteration 23, L1 9.89028e-05, Linf 0.013986, total time[s] 0.07934 +Converged at iteration 20, L1 9.6945e-05, Linf 0.00687232, total time[s] 0.085291 +Converged at iteration 18, L1 8.07904e-05, Linf 0.00252575, total time[s] 0.066533 +Converged at iteration 31, L1 6.98862e-05, Linf 0.0077563, total time[s] 0.115903 +Converged at iteration 21, L1 6.37223e-05, Linf 0.00416976, total time[s] 0.059194 +Converged at iteration 22, L1 9.23882e-05, Linf 0.00685507, total time[s] 0.068063 +Converged at iteration 27, L1 7.97226e-05, Linf 0.00412479, total time[s] 0.077904 +Converged at iteration 24, L1 7.46509e-05, Linf 0.00535026, total time[s] 0.07101 +Converged at iteration 23, L1 6.76224e-05, Linf 0.00398464, total time[s] 0.06483 +Converged at iteration 25, L1 5.51699e-05, Linf 0.00361459, total time[s] 0.072787 +Converged at iteration 23, L1 9.75993e-05, Linf 0.00656669, total time[s] 0.071002 +Converged at iteration 28, L1 8.09192e-05, Linf 0.00551123, total time[s] 0.087362 +Converged at iteration 31, L1 8.60086e-05, Linf 0.00570477, total time[s] 0.09556 +Converged at iteration 27, L1 9.40038e-05, Linf 0.0034676, total time[s] 0.074466 +Converged at iteration 31, L1 6.03762e-05, Linf 0.00624194, total time[s] 0.082661 +Converged at iteration 30, L1 9.70518e-05, Linf 0.00328597, total time[s] 0.078615 +Converged at iteration 31, L1 4.945e-05, Linf 0.00179449, total time[s] 0.080997 +Converged at iteration 29, L1 9.62266e-05, Linf 0.0086258, total time[s] 0.077383 +Converged at iteration 30, L1 8.33458e-05, Linf 0.0161293, total time[s] 0.08177 +Converged at iteration 29, L1 5.24321e-05, Linf 0.0104718, total time[s] 0.076115 +Converged at iteration 25, L1 5.39154e-05, Linf 0.00236254, total time[s] 0.068457 +Converged at iteration 36, L1 7.66616e-05, Linf 0.00631527, total time[s] 0.096136 +Converged at iteration 33, L1 8.98823e-05, Linf 0.00506616, total time[s] 0.097063 +Converged at iteration 25, L1 5.41807e-05, Linf 0.00262416, total time[s] 0.073537 +Converged at iteration 26, L1 8.19532e-05, Linf 0.0114959, total time[s] 0.078159 +Converged at iteration 27, L1 8.04097e-05, Linf 0.0120388, total time[s] 0.074494 +Converged at iteration 26, L1 3.58536e-05, Linf 0.012897, total time[s] 0.077629 +Converged at iteration 21, L1 3.51142e-05, Linf 0.00584344, total time[s] 0.067852 +Converged at iteration 19, L1 8.34806e-05, Linf 0.00482479, total time[s] 0.078567 +Converged at iteration 24, L1 6.03271e-05, Linf 0.00274162, total time[s] 0.095006 +Converged at iteration 23, L1 8.85261e-05, Linf 0.0140473, total time[s] 0.114414 +Converged at iteration 20, L1 9.1467e-05, Linf 0.00628291, total time[s] 0.074345 +Converged at iteration 18, L1 8.74103e-05, Linf 0.00275621, total time[s] 0.077402 +Converged at iteration 31, L1 7.2034e-05, Linf 0.00812349, total time[s] 0.084842 +Converged at iteration 21, L1 8.14827e-05, Linf 0.00442148, total time[s] 0.058161 +Converged at iteration 22, L1 9.68182e-05, Linf 0.00741676, total time[s] 0.064872 +Converged at iteration 27, L1 7.68207e-05, Linf 0.00403972, total time[s] 0.074271 +Converged at iteration 24, L1 7.55851e-05, Linf 0.00555124, total time[s] 0.066388 +Converged at iteration 23, L1 6.91551e-05, Linf 0.00398964, total time[s] 0.063791 +Converged at iteration 25, L1 5.88892e-05, Linf 0.00385539, total time[s] 0.068865 +Converged at iteration 24, L1 6.29621e-05, Linf 0.00533244, total time[s] 0.067222 +Converged at iteration 28, L1 7.29295e-05, Linf 0.00526728, total time[s] 0.075556 +Converged at iteration 31, L1 8.89373e-05, Linf 0.00579866, total time[s] 0.083716 +Converged at iteration 27, L1 9.15625e-05, Linf 0.00338185, total time[s] 0.073345 +Converged at iteration 31, L1 6.11375e-05, Linf 0.00642925, total time[s] 0.088707 +Converged at iteration 30, L1 9.83776e-05, Linf 0.00334504, total time[s] 0.089974 +Converged at iteration 31, L1 5.38841e-05, Linf 0.00198238, total time[s] 0.083955 +Converged at iteration 29, L1 9.49953e-05, Linf 0.00817285, total time[s] 0.08323 +Converged at iteration 30, L1 9.23919e-05, Linf 0.0170438, total time[s] 0.084642 +Converged at iteration 29, L1 5.69249e-05, Linf 0.0110964, total time[s] 0.085197 +Converged at iteration 25, L1 5.32128e-05, Linf 0.00234069, total time[s] 0.071547 +Converged at iteration 36, L1 7.81811e-05, Linf 0.00655873, total time[s] 0.095386 +Converged at iteration 33, L1 9.59891e-05, Linf 0.00535697, total time[s] 0.100157 +Converged at iteration 25, L1 5.83828e-05, Linf 0.00275587, total time[s] 0.068564 +Converged at iteration 26, L1 5.72909e-05, Linf 0.0110906, total time[s] 0.072968 +Converged at iteration 27, L1 8.51192e-05, Linf 0.0124996, total time[s] 0.07322 +Converged at iteration 26, L1 3.74012e-05, Linf 0.0134637, total time[s] 0.076821 +Converged at iteration 21, L1 3.71359e-05, Linf 0.00619201, total time[s] 0.063179 +Converged at iteration 19, L1 8.76701e-05, Linf 0.00465159, total time[s] 0.06119 +Converged at iteration 24, L1 6.30467e-05, Linf 0.00270168, total time[s] 0.076954 +Converged at iteration 23, L1 8.07476e-05, Linf 0.0137115, total time[s] 0.074789 +Converged at iteration 20, L1 8.67928e-05, Linf 0.00538947, total time[s] 0.075416 +Converged at iteration 18, L1 9.71226e-05, Linf 0.00309273, total time[s] 0.06493 +Converged at iteration 31, L1 7.44975e-05, Linf 0.00862178, total time[s] 0.095242 +Converged at iteration 21, L1 9.61414e-05, Linf 0.00453866, total time[s] 0.057486 +Converged at iteration 23, L1 5.74517e-05, Linf 0.00532198, total time[s] 0.079097 +Converged at iteration 27, L1 7.4638e-05, Linf 0.00390115, total time[s] 0.072282 +Converged at iteration 24, L1 7.72096e-05, Linf 0.00567038, total time[s] 0.068035 +Converged at iteration 23, L1 7.18491e-05, Linf 0.00424659, total time[s] 0.062486 +Converged at iteration 25, L1 6.37808e-05, Linf 0.00414133, total time[s] 0.067922 +Converged at iteration 24, L1 7.54185e-05, Linf 0.00616364, total time[s] 0.065837 +Converged at iteration 28, L1 6.23914e-05, Linf 0.00512604, total time[s] 0.093282 +Converged at iteration 31, L1 9.32751e-05, Linf 0.00527955, total time[s] 0.082922 +Converged at iteration 27, L1 8.67084e-05, Linf 0.00321013, total time[s] 0.076261 +Converged at iteration 31, L1 6.2343e-05, Linf 0.00687905, total time[s] 0.083154 +Converged at iteration 31, L1 6.18448e-05, Linf 0.00220291, total time[s] 0.084246 +Converged at iteration 31, L1 6.38297e-05, Linf 0.00230413, total time[s] 0.084515 +Converged at iteration 29, L1 9.46019e-05, Linf 0.00750859, total time[s] 0.07795 +Converged at iteration 31, L1 3.23816e-05, Linf 0.00893994, total time[s] 0.082725 +Converged at iteration 29, L1 6.36681e-05, Linf 0.0118863, total time[s] 0.078281 +Converged at iteration 25, L1 5.2323e-05, Linf 0.00228247, total time[s] 0.068045 +Converged at iteration 36, L1 8.04389e-05, Linf 0.00683944, total time[s] 0.098694 +Converged at iteration 34, L1 4.49668e-05, Linf 0.00430564, total time[s] 0.09916 +Converged at iteration 25, L1 5.98849e-05, Linf 0.00289512, total time[s] 0.07372 +Converged at iteration 26, L1 4.22899e-05, Linf 0.01066, total time[s] 0.071169 +Converged at iteration 27, L1 8.25807e-05, Linf 0.013472, total time[s] 0.07881 +Converged at iteration 26, L1 3.8981e-05, Linf 0.0139359, total time[s] 0.091313 +Converged at iteration 21, L1 4.91198e-05, Linf 0.0063639, total time[s] 0.099861 +Converged at iteration 19, L1 8.97795e-05, Linf 0.00455483, total time[s] 0.064001 +Converged at iteration 24, L1 6.21248e-05, Linf 0.00265307, total time[s] 0.087883 +Converged at iteration 23, L1 7.70446e-05, Linf 0.0132197, total time[s] 0.084387 +Converged at iteration 20, L1 8.43324e-05, Linf 0.0049579, total time[s] 0.059326 +Converged at iteration 19, L1 4.9628e-05, Linf 0.00174794, total time[s] 0.058188 +Converged at iteration 31, L1 7.64121e-05, Linf 0.00899134, total time[s] 0.106764 +Converged at iteration 21, L1 9.83173e-05, Linf 0.00452686, total time[s] 0.06279 +Converged at iteration 23, L1 5.92182e-05, Linf 0.00554314, total time[s] 0.062046 +Converged at iteration 27, L1 7.28276e-05, Linf 0.00383979, total time[s] 0.07562 +Converged at iteration 24, L1 7.66059e-05, Linf 0.00566007, total time[s] 0.065291 +Converged at iteration 23, L1 7.41413e-05, Linf 0.00428711, total time[s] 0.062223 +Converged at iteration 25, L1 6.53261e-05, Linf 0.00428956, total time[s] 0.067397 +Converged at iteration 24, L1 8.67457e-05, Linf 0.00675951, total time[s] 0.067635 +Converged at iteration 27, L1 9.56677e-05, Linf 0.00662883, total time[s] 0.071878 +Converged at iteration 31, L1 9.67896e-05, Linf 0.00543839, total time[s] 0.082325 +Converged at iteration 27, L1 8.24894e-05, Linf 0.00309153, total time[s] 0.075004 +Converged at iteration 31, L1 6.54885e-05, Linf 0.00706296, total time[s] 0.092548 +Converged at iteration 31, L1 6.23554e-05, Linf 0.00228271, total time[s] 0.080544 +Converged at iteration 31, L1 7.00933e-05, Linf 0.00248189, total time[s] 0.083892 +Converged at iteration 29, L1 9.35314e-05, Linf 0.00710572, total time[s] 0.080263 +Converged at iteration 31, L1 3.54074e-05, Linf 0.00922038, total time[s] 0.080892 +Converged at iteration 29, L1 6.94946e-05, Linf 0.0123334, total time[s] 0.075376 +Converged at iteration 25, L1 5.29629e-05, Linf 0.00228294, total time[s] 0.073132 +Converged at iteration 36, L1 8.74139e-05, Linf 0.00767714, total time[s] 0.101045 +Converged at iteration 34, L1 5.25602e-05, Linf 0.00477055, total time[s] 0.124815 +Converged at iteration 25, L1 6.1477e-05, Linf 0.00310664, total time[s] 0.085121 +Converged at iteration 25, L1 6.99861e-05, Linf 0.0128859, total time[s] 0.068526 +Converged at iteration 27, L1 8.22032e-05, Linf 0.0136962, total time[s] 0.072276 +Converged at iteration 26, L1 4.54779e-05, Linf 0.0152769, total time[s] 0.086486 +Converged at iteration 21, L1 3.87804e-05, Linf 0.00685909, total time[s] 0.067873 +Converged at iteration 19, L1 9.33159e-05, Linf 0.00411404, total time[s] 0.08434 +Converged at iteration 24, L1 6.29097e-05, Linf 0.00257226, total time[s] 0.131075 +Converged at iteration 23, L1 7.42839e-05, Linf 0.0108336, total time[s] 0.094179 +Converged at iteration 20, L1 8.97726e-05, Linf 0.00516083, total time[s] 0.071187 +Converged at iteration 19, L1 5.85642e-05, Linf 0.00204464, total time[s] 0.052776 +Converged at iteration 31, L1 8.23402e-05, Linf 0.010128, total time[s] 0.089681 +Converged at iteration 22, L1 7.28654e-05, Linf 0.00279945, total time[s] 0.064376 +Converged at iteration 23, L1 6.85255e-05, Linf 0.00642185, total time[s] 0.059655 +Converged at iteration 27, L1 6.89316e-05, Linf 0.00359768, total time[s] 0.072699 +Converged at iteration 24, L1 7.40558e-05, Linf 0.00551112, total time[s] 0.069146 +Converged at iteration 23, L1 8.11537e-05, Linf 0.00438804, total time[s] 0.060628 +Converged at iteration 25, L1 6.76936e-05, Linf 0.00452911, total time[s] 0.086713 +Converged at iteration 25, L1 6.88122e-05, Linf 0.00595012, total time[s] 0.070279 +Converged at iteration 27, L1 9.08508e-05, Linf 0.00671824, total time[s] 0.088614 +Converged at iteration 32, L1 5.48452e-05, Linf 0.00321046, total time[s] 0.09368 +Converged at iteration 27, L1 7.35513e-05, Linf 0.00278185, total time[s] 0.077063 +Converged at iteration 31, L1 6.79894e-05, Linf 0.0078213, total time[s] 0.084097 +Converged at iteration 31, L1 6.34812e-05, Linf 0.00236285, total time[s] 0.082488 +Converged at iteration 31, L1 8.78075e-05, Linf 0.00328655, total time[s] 0.081256 +Converged at iteration 29, L1 9.4642e-05, Linf 0.00608077, total time[s] 0.077112 +Converged at iteration 31, L1 4.55549e-05, Linf 0.0099406, total time[s] 0.085413 +Converged at iteration 29, L1 7.93863e-05, Linf 0.0139992, total time[s] 0.081051 +Converged at iteration 25, L1 5.19211e-05, Linf 0.00248286, total time[s] 0.074846 +Converged at iteration 36, L1 9.00488e-05, Linf 0.0079301, total time[s] 0.094009 +Converged at iteration 34, L1 5.57689e-05, Linf 0.00451629, total time[s] 0.093803 +Converged at iteration 25, L1 6.04377e-05, Linf 0.00312644, total time[s] 0.074365 +Converged at iteration 25, L1 6.51474e-05, Linf 0.0126189, total time[s] 0.066519 +Converged at iteration 27, L1 8.87731e-05, Linf 0.0137132, total time[s] 0.070243 +Converged at iteration 26, L1 5.14323e-05, Linf 0.0156011, total time[s] 0.071282 +Converged at iteration 21, L1 3.84247e-05, Linf 0.00692084, total time[s] 0.0781 +Converged at iteration 19, L1 9.25307e-05, Linf 0.00407817, total time[s] 0.05579 +Converged at iteration 24, L1 6.25921e-05, Linf 0.00248525, total time[s] 0.071514 +Converged at iteration 23, L1 7.74448e-05, Linf 0.0104241, total time[s] 0.067327 +Converged at iteration 20, L1 9.22018e-05, Linf 0.00512896, total time[s] 0.062429 +Converged at iteration 19, L1 7.01258e-05, Linf 0.00347323, total time[s] 0.076953 +Converged at iteration 31, L1 8.40528e-05, Linf 0.0104565, total time[s] 0.089026 +Converged at iteration 22, L1 7.0523e-05, Linf 0.00281548, total time[s] 0.075938 +Converged at iteration 23, L1 7.273e-05, Linf 0.00631748, total time[s] 0.066654 +Converged at iteration 27, L1 7.13273e-05, Linf 0.0035969, total time[s] 0.07902 +Converged at iteration 24, L1 7.23323e-05, Linf 0.00536231, total time[s] 0.06701 +Converged at iteration 23, L1 8.26937e-05, Linf 0.00444826, total time[s] 0.06423 +Converged at iteration 25, L1 6.96699e-05, Linf 0.00460465, total time[s] 0.06822 +Converged at iteration 25, L1 7.43257e-05, Linf 0.0061953, total time[s] 0.069991 +Converged at iteration 27, L1 8.868e-05, Linf 0.0067456, total time[s] 0.07339 +Converged at iteration 32, L1 5.61326e-05, Linf 0.00320653, total time[s] 0.085618 +Converged at iteration 27, L1 7.04536e-05, Linf 0.00266448, total time[s] 0.075821 +Converged at iteration 31, L1 6.9708e-05, Linf 0.00804051, total time[s] 0.083095 +Converged at iteration 31, L1 6.37455e-05, Linf 0.00234947, total time[s] 0.083232 +Converged at iteration 31, L1 9.49468e-05, Linf 0.0036109, total time[s] 0.082622 +Converged at iteration 29, L1 9.5562e-05, Linf 0.00579583, total time[s] 0.077458 +Converged at iteration 31, L1 4.83021e-05, Linf 0.009963, total time[s] 0.082922 +Converged at iteration 29, L1 8.1622e-05, Linf 0.0144518, total time[s] 0.079759 +Converged at iteration 25, L1 5.24759e-05, Linf 0.00258848, total time[s] 0.072 +Converged at iteration 36, L1 9.33362e-05, Linf 0.00827989, total time[s] 0.126757 +Converged at iteration 34, L1 5.78105e-05, Linf 0.00466262, total time[s] 0.124645 +Converged at iteration 25, L1 5.9355e-05, Linf 0.00318447, total time[s] 0.072626 +Converged at iteration 25, L1 5.70871e-05, Linf 0.0123467, total time[s] 0.07312 +Converged at iteration 27, L1 7.03884e-05, Linf 0.0136715, total time[s] 0.080836 +Converged at iteration 26, L1 4.85894e-05, Linf 0.0158663, total time[s] 0.116114 +Converged at iteration 21, L1 3.80934e-05, Linf 0.0069661, total time[s] 0.077011 +Converged at iteration 19, L1 9.22476e-05, Linf 0.00404736, total time[s] 0.088278 +Converged at iteration 24, L1 6.26019e-05, Linf 0.00249087, total time[s] 0.088848 +Converged at iteration 23, L1 7.61994e-05, Linf 0.00998761, total time[s] 0.077412 +Converged at iteration 20, L1 9.17101e-05, Linf 0.00509499, total time[s] 0.070162 +Converged at iteration 19, L1 6.41586e-05, Linf 0.00216114, total time[s] 0.065293 +Converged at iteration 31, L1 8.38363e-05, Linf 0.0107101, total time[s] 0.086458 +Converged at iteration 22, L1 7.15912e-05, Linf 0.00292243, total time[s] 0.062946 +Converged at iteration 23, L1 7.24191e-05, Linf 0.00643568, total time[s] 0.088267 +Converged at iteration 27, L1 7.16171e-05, Linf 0.00359388, total time[s] 0.080727 +Converged at iteration 24, L1 7.0781e-05, Linf 0.00526085, total time[s] 0.067516 +Converged at iteration 23, L1 8.36115e-05, Linf 0.00449645, total time[s] 0.061061 +Converged at iteration 25, L1 6.9395e-05, Linf 0.00462318, total time[s] 0.069524 +Converged at iteration 25, L1 7.67257e-05, Linf 0.00634291, total time[s] 0.069168 +Converged at iteration 27, L1 8.80264e-05, Linf 0.00676525, total time[s] 0.075345 +Converged at iteration 32, L1 5.71769e-05, Linf 0.00319829, total time[s] 0.089196 +Converged at iteration 27, L1 6.80353e-05, Linf 0.00254927, total time[s] 0.077075 +Converged at iteration 31, L1 6.97912e-05, Linf 0.00816186, total time[s] 0.082763 +Converged at iteration 31, L1 6.30798e-05, Linf 0.00236992, total time[s] 0.080805 +Converged at iteration 32, L1 4.72677e-05, Linf 0.00213105, total time[s] 0.083827 +Converged at iteration 29, L1 9.73484e-05, Linf 0.0055982, total time[s] 0.0764 +Converged at iteration 31, L1 5.05928e-05, Linf 0.0111302, total time[s] 0.082702 +Converged at iteration 29, L1 8.31349e-05, Linf 0.0147268, total time[s] 0.122785 +Converged at iteration 25, L1 5.25188e-05, Linf 0.00259204, total time[s] 0.115191 +Converged at iteration 36, L1 9.81458e-05, Linf 0.00853335, total time[s] 0.110591 +Converged at iteration 34, L1 6.31902e-05, Linf 0.00546045, total time[s] 0.09248 +Converged at iteration 25, L1 5.80245e-05, Linf 0.00325426, total time[s] 0.06575 +Converged at iteration 25, L1 5.17256e-05, Linf 0.0118945, total time[s] 0.065667 +Converged at iteration 27, L1 5.85608e-05, Linf 0.0133619, total time[s] 0.072171 +Converged at iteration 26, L1 5.18772e-05, Linf 0.0163156, total time[s] 0.073387 +Converged at iteration 21, L1 3.83456e-05, Linf 0.00702303, total time[s] 0.093856 +Converged at iteration 19, L1 9.26349e-05, Linf 0.0038695, total time[s] 0.075619 +Converged at iteration 24, L1 6.33433e-05, Linf 0.00255504, total time[s] 0.06895 +Converged at iteration 23, L1 8.00898e-05, Linf 0.00919572, total time[s] 0.066064 +Converged at iteration 20, L1 9.55377e-05, Linf 0.00509043, total time[s] 0.055822 +Converged at iteration 19, L1 6.90723e-05, Linf 0.00229123, total time[s] 0.053329 +Converged at iteration 31, L1 8.52973e-05, Linf 0.0112129, total time[s] 0.082059 +Converged at iteration 22, L1 7.18743e-05, Linf 0.00304567, total time[s] 0.060359 +Converged at iteration 23, L1 7.38452e-05, Linf 0.00673896, total time[s] 0.066788 +Converged at iteration 27, L1 7.06452e-05, Linf 0.00361152, total time[s] 0.073085 +Converged at iteration 24, L1 6.84805e-05, Linf 0.00499476, total time[s] 0.065949 +Converged at iteration 23, L1 8.56886e-05, Linf 0.00459566, total time[s] 0.073927 +Converged at iteration 25, L1 7.16065e-05, Linf 0.00474943, total time[s] 0.086062 +Converged at iteration 25, L1 7.9315e-05, Linf 0.0068446, total time[s] 0.067222 +Converged at iteration 27, L1 8.5306e-05, Linf 0.00695446, total time[s] 0.080132 +Converged at iteration 32, L1 5.88732e-05, Linf 0.00322633, total time[s] 0.101922 +Converged at iteration 27, L1 6.46689e-05, Linf 0.00236244, total time[s] 0.080898 +Converged at iteration 31, L1 7.29115e-05, Linf 0.00846854, total time[s] 0.090907 +Converged at iteration 31, L1 6.40496e-05, Linf 0.00240104, total time[s] 0.089218 +Converged at iteration 32, L1 5.31786e-05, Linf 0.00240409, total time[s] 0.091547 +Converged at iteration 30, L1 6.58316e-05, Linf 0.00309572, total time[s] 0.083929 +Converged at iteration 31, L1 5.50118e-05, Linf 0.0124043, total time[s] 0.080521 +Converged at iteration 29, L1 8.34645e-05, Linf 0.015327, total time[s] 0.077683 +Converged at iteration 25, L1 5.32263e-05, Linf 0.00259818, total time[s] 0.066599 +Converged at iteration 37, L1 4.93254e-05, Linf 0.00676827, total time[s] 0.100983 +Converged at iteration 34, L1 6.62865e-05, Linf 0.00545079, total time[s] 0.089355 +Converged at iteration 25, L1 5.6308e-05, Linf 0.00333556, total time[s] 0.066034 +Converged at iteration 25, L1 4.84952e-05, Linf 0.0116058, total time[s] 0.065077 +Converged at iteration 27, L1 5.59303e-05, Linf 0.0130904, total time[s] 0.06978 +Converged at iteration 26, L1 5.41828e-05, Linf 0.0165458, total time[s] 0.068392 +Converged at iteration 21, L1 3.83269e-05, Linf 0.00708103, total time[s] 0.055724 +Converged at iteration 19, L1 9.25113e-05, Linf 0.00383637, total time[s] 0.051384 +Converged at iteration 24, L1 6.27553e-05, Linf 0.00258403, total time[s] 0.063228 +Converged at iteration 23, L1 8.03721e-05, Linf 0.00881926, total time[s] 0.060338 +Converged at iteration 20, L1 9.64446e-05, Linf 0.0050181, total time[s] 0.057076 +Converged at iteration 19, L1 7.10554e-05, Linf 0.00234156, total time[s] 0.063482 +Converged at iteration 31, L1 8.51937e-05, Linf 0.0114346, total time[s] 0.106484 +Converged at iteration 22, L1 7.13664e-05, Linf 0.00310453, total time[s] 0.059846 +Converged at iteration 23, L1 7.46709e-05, Linf 0.00718473, total time[s] 0.060833 +Converged at iteration 27, L1 6.99352e-05, Linf 0.00360696, total time[s] 0.07155 +Converged at iteration 24, L1 6.72813e-05, Linf 0.00487847, total time[s] 0.063757 +Converged at iteration 23, L1 8.66788e-05, Linf 0.00463261, total time[s] 0.07954 +Converged at iteration 25, L1 7.43674e-05, Linf 0.00479386, total time[s] 0.075921 +Converged at iteration 25, L1 7.98143e-05, Linf 0.00717629, total time[s] 0.071329 +Converged at iteration 27, L1 8.41985e-05, Linf 0.00692183, total time[s] 0.077468 +Converged at iteration 32, L1 6.03027e-05, Linf 0.0032259, total time[s] 0.099229 +Converged at iteration 27, L1 6.39894e-05, Linf 0.00225329, total time[s] 0.078488 +Converged at iteration 31, L1 7.16701e-05, Linf 0.00856415, total time[s] 0.100914 +Converged at iteration 31, L1 6.57394e-05, Linf 0.00250859, total time[s] 0.089695 +Converged at iteration 32, L1 5.40462e-05, Linf 0.00250967, total time[s] 0.082658 +Converged at iteration 30, L1 6.63822e-05, Linf 0.00291144, total time[s] 0.077634 +Converged at iteration 31, L1 5.7263e-05, Linf 0.0128165, total time[s] 0.080486 +Converged at iteration 29, L1 8.34581e-05, Linf 0.0155833, total time[s] 0.077935 +Converged at iteration 25, L1 5.41333e-05, Linf 0.00262763, total time[s] 0.066231 +Converged at iteration 37, L1 5.15778e-05, Linf 0.0070874, total time[s] 0.124376 +Converged at iteration 34, L1 7.19823e-05, Linf 0.00527572, total time[s] 0.153778 +Converged at iteration 25, L1 5.81355e-05, Linf 0.00344582, total time[s] 0.252322 +Converged at iteration 25, L1 4.88649e-05, Linf 0.0111229, total time[s] 0.145644 +Converged at iteration 27, L1 5.65542e-05, Linf 0.0123504, total time[s] 0.093444 +Converged at iteration 26, L1 5.53064e-05, Linf 0.0168195, total time[s] 0.083139 +Converged at iteration 21, L1 3.83382e-05, Linf 0.007126, total time[s] 0.093311 +Converged at iteration 19, L1 9.31018e-05, Linf 0.00380706, total time[s] 0.070374 +Converged at iteration 24, L1 6.27901e-05, Linf 0.00248864, total time[s] 0.088505 +Converged at iteration 23, L1 8.45124e-05, Linf 0.00795567, total time[s] 0.09473 +Converged at iteration 20, L1 9.94634e-05, Linf 0.00495154, total time[s] 0.056052 +Converged at iteration 19, L1 7.64777e-05, Linf 0.00247171, total time[s] 0.064532 +Converged at iteration 31, L1 8.65718e-05, Linf 0.0120003, total time[s] 0.090231 +Converged at iteration 22, L1 6.97271e-05, Linf 0.00319827, total time[s] 0.072741 +Converged at iteration 23, L1 7.94489e-05, Linf 0.00709798, total time[s] 0.06877 +Converged at iteration 27, L1 6.58847e-05, Linf 0.00356484, total time[s] 0.076507 +Converged at iteration 24, L1 6.3781e-05, Linf 0.00460895, total time[s] 0.069703 +Converged at iteration 23, L1 8.67475e-05, Linf 0.00471845, total time[s] 0.063418 +Converged at iteration 25, L1 7.83816e-05, Linf 0.00492688, total time[s] 0.08279 +Converged at iteration 25, L1 8.2545e-05, Linf 0.00826939, total time[s] 0.070828 +Converged at iteration 27, L1 8.34829e-05, Linf 0.00684312, total time[s] 0.072031 +Converged at iteration 32, L1 6.15474e-05, Linf 0.00328342, total time[s] 0.085187 +Converged at iteration 26, L1 9.93166e-05, Linf 0.0030577, total time[s] 0.070734 +Converged at iteration 31, L1 7.31699e-05, Linf 0.00880577, total time[s] 0.082231 +Converged at iteration 31, L1 6.21265e-05, Linf 0.00241206, total time[s] 0.081536 +Converged at iteration 32, L1 5.89037e-05, Linf 0.00273461, total time[s] 0.084232 +Converged at iteration 30, L1 6.93388e-05, Linf 0.00293543, total time[s] 0.079099 +Converged at iteration 31, L1 6.28577e-05, Linf 0.0136167, total time[s] 0.091984 +Converged at iteration 29, L1 8.414e-05, Linf 0.0160861, total time[s] 0.078874 +Converged at iteration 25, L1 5.45666e-05, Linf 0.00255282, total time[s] 0.067732 +Converged at iteration 37, L1 5.31798e-05, Linf 0.00729005, total time[s] 0.097371 +Converged at iteration 34, L1 7.50757e-05, Linf 0.00583345, total time[s] 0.094358 +Converged at iteration 25, L1 5.79826e-05, Linf 0.00350148, total time[s] 0.072817 +Converged at iteration 25, L1 4.54209e-05, Linf 0.0107596, total time[s] 0.067327 +Converged at iteration 26, L1 9.96876e-05, Linf 0.0189712, total time[s] 0.069965 +Converged at iteration 26, L1 5.48627e-05, Linf 0.0168912, total time[s] 0.073058 +Converged at iteration 21, L1 3.86043e-05, Linf 0.00715475, total time[s] 0.060475 +Converged at iteration 19, L1 9.23271e-05, Linf 0.0037584, total time[s] 0.067225 +Converged at iteration 24, L1 6.2013e-05, Linf 0.00246343, total time[s] 0.07513 +Converged at iteration 23, L1 8.76417e-05, Linf 0.00761055, total time[s] 0.088837 +Converged at iteration 21, L1 4.52938e-05, Linf 0.00228255, total time[s] 0.070334 +Converged at iteration 19, L1 7.93828e-05, Linf 0.00254623, total time[s] 0.059052 +Converged at iteration 31, L1 8.62769e-05, Linf 0.0121425, total time[s] 0.103687 +Converged at iteration 22, L1 7.06218e-05, Linf 0.00324557, total time[s] 0.061942 +Converged at iteration 23, L1 8.0196e-05, Linf 0.00719082, total time[s] 0.062511 +Converged at iteration 27, L1 6.3279e-05, Linf 0.00353298, total time[s] 0.09673 +Converged at iteration 24, L1 6.249e-05, Linf 0.00450827, total time[s] 0.087925 +Converged at iteration 23, L1 8.81977e-05, Linf 0.0047595, total time[s] 0.062363 +Converged at iteration 25, L1 7.81814e-05, Linf 0.00499179, total time[s] 0.067345 +Converged at iteration 25, L1 8.46141e-05, Linf 0.00706119, total time[s] 0.068125 +Converged at iteration 27, L1 8.34587e-05, Linf 0.00689112, total time[s] 0.071735 +Converged at iteration 32, L1 6.22678e-05, Linf 0.00332338, total time[s] 0.083037 +Converged at iteration 26, L1 9.6374e-05, Linf 0.00292513, total time[s] 0.068113 +Converged at iteration 31, L1 7.27667e-05, Linf 0.00886149, total time[s] 0.081593 +Converged at iteration 31, L1 6.18079e-05, Linf 0.00238631, total time[s] 0.082744 +Converged at iteration 32, L1 6.15843e-05, Linf 0.0028429, total time[s] 0.084405 +Converged at iteration 30, L1 7.08864e-05, Linf 0.00296344, total time[s] 0.078217 +Converged at iteration 31, L1 6.60837e-05, Linf 0.0144189, total time[s] 0.079898 +Converged at iteration 29, L1 8.42189e-05, Linf 0.0163177, total time[s] 0.091534 +Converged at iteration 25, L1 5.46739e-05, Linf 0.00253008, total time[s] 0.074834 +Converged at iteration 37, L1 5.63881e-05, Linf 0.00779745, total time[s] 0.124671 +Converged at iteration 34, L1 8.25022e-05, Linf 0.00651339, total time[s] 0.125908 +Converged at iteration 25, L1 5.84799e-05, Linf 0.00362463, total time[s] 0.089801 +Converged at iteration 25, L1 4.51424e-05, Linf 0.0101888, total time[s] 0.070724 +Converged at iteration 26, L1 8.33499e-05, Linf 0.0183076, total time[s] 0.068276 +Converged at iteration 26, L1 5.28095e-05, Linf 0.0168628, total time[s] 0.085993 +Converged at iteration 21, L1 3.94018e-05, Linf 0.00717253, total time[s] 0.075438 +Converged at iteration 19, L1 9.32532e-05, Linf 0.00374577, total time[s] 0.08413 +Converged at iteration 24, L1 6.22213e-05, Linf 0.00263366, total time[s] 0.118841 +Converged at iteration 23, L1 9.20024e-05, Linf 0.00668608, total time[s] 0.118316 +Converged at iteration 21, L1 4.78468e-05, Linf 0.00242431, total time[s] 0.098069 +Converged at iteration 19, L1 8.49685e-05, Linf 0.00278486, total time[s] 0.064423 +Converged at iteration 31, L1 8.67711e-05, Linf 0.0125545, total time[s] 0.099507 +Converged at iteration 22, L1 6.70095e-05, Linf 0.00333464, total time[s] 0.074225 +Converged at iteration 23, L1 8.97782e-05, Linf 0.00743396, total time[s] 0.079546 +Converged at iteration 27, L1 6.10295e-05, Linf 0.00343101, total time[s] 0.076727 +Converged at iteration 24, L1 6.33685e-05, Linf 0.00431767, total time[s] 0.077634 +Converged at iteration 23, L1 8.91793e-05, Linf 0.00486707, total time[s] 0.069951 +Converged at iteration 25, L1 8.23049e-05, Linf 0.00516047, total time[s] 0.066463 +Converged at iteration 25, L1 9.20387e-05, Linf 0.00597925, total time[s] 0.067826 +Converged at iteration 27, L1 8.32009e-05, Linf 0.00737599, total time[s] 0.089397 +Converged at iteration 32, L1 6.36823e-05, Linf 0.00335928, total time[s] 0.14148 +Converged at iteration 26, L1 9.18966e-05, Linf 0.00265804, total time[s] 0.147209 +Converged at iteration 31, L1 7.70824e-05, Linf 0.00908118, total time[s] 0.171846 +Converged at iteration 31, L1 5.99857e-05, Linf 0.00245257, total time[s] 0.145527 +Converged at iteration 32, L1 6.63631e-05, Linf 0.0030135, total time[s] 0.124132 +Converged at iteration 30, L1 7.62922e-05, Linf 0.00312142, total time[s] 0.150495 +Converged at iteration 31, L1 7.84347e-05, Linf 0.0151573, total time[s] 0.095562 +Converged at iteration 29, L1 8.51522e-05, Linf 0.0168391, total time[s] 0.089784 +Converged at iteration 25, L1 5.54792e-05, Linf 0.00246554, total time[s] 0.074783 +Converged at iteration 37, L1 5.82091e-05, Linf 0.00786678, total time[s] 0.111849 +Converged at iteration 34, L1 8.63011e-05, Linf 0.00665599, total time[s] 0.106614 +Converged at iteration 25, L1 5.89448e-05, Linf 0.00365017, total time[s] 0.095407 +Converged at iteration 25, L1 4.40201e-05, Linf 0.00982, total time[s] 0.072924 +Converged at iteration 26, L1 7.56486e-05, Linf 0.0178207, total time[s] 0.07142 +Converged at iteration 26, L1 5.13968e-05, Linf 0.0167175, total time[s] 0.082378 +Converged at iteration 21, L1 3.99993e-05, Linf 0.00719142, total time[s] 0.086416 +Converged at iteration 19, L1 9.1204e-05, Linf 0.00368047, total time[s] 0.088562 +Converged at iteration 24, L1 6.11496e-05, Linf 0.00249984, total time[s] 0.10907 +Converged at iteration 23, L1 9.35143e-05, Linf 0.00645055, total time[s] 0.146865 +Converged at iteration 21, L1 4.90272e-05, Linf 0.00249905, total time[s] 0.082703 +Converged at iteration 19, L1 8.80303e-05, Linf 0.00295929, total time[s] 0.059779 +Converged at iteration 31, L1 8.67907e-05, Linf 0.0126519, total time[s] 0.084261 +Converged at iteration 22, L1 7.02316e-05, Linf 0.00337614, total time[s] 0.060687 +Converged at iteration 23, L1 9.38578e-05, Linf 0.00750039, total time[s] 0.081516 +Converged at iteration 27, L1 6.08374e-05, Linf 0.00340767, total time[s] 0.086684 +Converged at iteration 24, L1 6.0079e-05, Linf 0.00430522, total time[s] 0.065445 +Converged at iteration 23, L1 9.00057e-05, Linf 0.00488035, total time[s] 0.072825 +Converged at iteration 25, L1 8.57831e-05, Linf 0.00523048, total time[s] 0.069791 +Converged at iteration 25, L1 9.55288e-05, Linf 0.00606897, total time[s] 0.068524 +Converged at iteration 27, L1 8.1136e-05, Linf 0.00733937, total time[s] 0.07226 +Converged at iteration 32, L1 6.50216e-05, Linf 0.00338252, total time[s] 0.084558 +Converged at iteration 26, L1 8.92342e-05, Linf 0.00252528, total time[s] 0.070534 +Converged at iteration 31, L1 7.42789e-05, Linf 0.00912272, total time[s] 0.083656 +Converged at iteration 31, L1 5.97523e-05, Linf 0.00243157, total time[s] 0.093912 +Converged at iteration 32, L1 6.68575e-05, Linf 0.0030942, total time[s] 0.099494 +Converged at iteration 30, L1 7.86756e-05, Linf 0.00322293, total time[s] 0.089988 +Converged at iteration 31, L1 7.64079e-05, Linf 0.0157094, total time[s] 0.083236 +Converged at iteration 29, L1 8.48742e-05, Linf 0.0170269, total time[s] 0.078535 +Converged at iteration 25, L1 5.54217e-05, Linf 0.0024178, total time[s] 0.06791 +Converged at iteration 37, L1 6.1694e-05, Linf 0.00830542, total time[s] 0.099311 +Converged at iteration 34, L1 9.49742e-05, Linf 0.00695221, total time[s] 0.103252 +Converged at iteration 25, L1 6.17967e-05, Linf 0.00372593, total time[s] 0.069524 +Converged at iteration 25, L1 4.49515e-05, Linf 0.00929025, total time[s] 0.068271 +Converged at iteration 26, L1 6.23608e-05, Linf 0.0166211, total time[s] 0.072299 +Converged at iteration 26, L1 4.91008e-05, Linf 0.0164028, total time[s] 0.075012 +Converged at iteration 21, L1 4.03542e-05, Linf 0.00720645, total time[s] 0.067061 +Converged at iteration 19, L1 8.95704e-05, Linf 0.00363367, total time[s] 0.055334 +Converged at iteration 24, L1 5.96205e-05, Linf 0.00244101, total time[s] 0.09026 +Converged at iteration 23, L1 9.68883e-05, Linf 0.00553058, total time[s] 0.089996 +Converged at iteration 21, L1 5.21764e-05, Linf 0.00265124, total time[s] 0.088582 +Converged at iteration 19, L1 9.66921e-05, Linf 0.00319098, total time[s] 0.066342 +Converged at iteration 31, L1 8.93453e-05, Linf 0.0132313, total time[s] 0.104369 +Converged at iteration 22, L1 6.49962e-05, Linf 0.00356337, total time[s] 0.058952 +Converged at iteration 24, L1 5.7244e-05, Linf 0.00430234, total time[s] 0.064961 +Converged at iteration 27, L1 5.94552e-05, Linf 0.00329812, total time[s] 0.071443 +Converged at iteration 24, L1 6.01909e-05, Linf 0.00431443, total time[s] 0.064769 +Converged at iteration 23, L1 9.2762e-05, Linf 0.00495665, total time[s] 0.063185 +Converged at iteration 25, L1 8.90868e-05, Linf 0.00545241, total time[s] 0.07067 +Converged at iteration 26, L1 5.63739e-05, Linf 0.00402904, total time[s] 0.070336 +Converged at iteration 27, L1 8.04452e-05, Linf 0.00687725, total time[s] 0.074852 +Converged at iteration 32, L1 6.59765e-05, Linf 0.00353673, total time[s] 0.083344 +Converged at iteration 26, L1 8.39015e-05, Linf 0.00223554, total time[s] 0.069202 +Converged at iteration 31, L1 7.599e-05, Linf 0.0093896, total time[s] 0.081323 +Converged at iteration 31, L1 5.909e-05, Linf 0.00239146, total time[s] 0.081758 +Converged at iteration 32, L1 7.11028e-05, Linf 0.00323601, total time[s] 0.086079 +Converged at iteration 30, L1 8.54422e-05, Linf 0.0034106, total time[s] 0.079186 +Converged at iteration 31, L1 8.47976e-05, Linf 0.0168878, total time[s] 0.080356 +Converged at iteration 29, L1 8.64767e-05, Linf 0.0175759, total time[s] 0.08032 +Converged at iteration 25, L1 5.73081e-05, Linf 0.00241267, total time[s] 0.066151 +Converged at iteration 37, L1 6.35558e-05, Linf 0.00850525, total time[s] 0.105447 +Converged at iteration 35, L1 4.06734e-05, Linf 0.00404131, total time[s] 0.10819 +Converged at iteration 25, L1 6.27783e-05, Linf 0.00373124, total time[s] 0.070689 +Converged at iteration 25, L1 4.47615e-05, Linf 0.00899094, total time[s] 0.066587 +Converged at iteration 26, L1 5.73014e-05, Linf 0.0160199, total time[s] 0.068789 +Converged at iteration 26, L1 4.78677e-05, Linf 0.0161906, total time[s] 0.071788 +Converged at iteration 21, L1 4.11226e-05, Linf 0.0072269, total time[s] 0.068085 +Converged at iteration 19, L1 8.82662e-05, Linf 0.00355378, total time[s] 0.062642 +Converged at iteration 24, L1 5.90135e-05, Linf 0.00283272, total time[s] 0.073647 +Converged at iteration 23, L1 9.91498e-05, Linf 0.00523512, total time[s] 0.081419 +Converged at iteration 21, L1 5.38696e-05, Linf 0.00272289, total time[s] 0.088813 +Converged at iteration 19, L1 9.98129e-05, Linf 0.00331444, total time[s] 0.071711 +Converged at iteration 31, L1 8.97774e-05, Linf 0.0133972, total time[s] 0.119808 +Converged at iteration 22, L1 6.45425e-05, Linf 0.00350287, total time[s] 0.069771 +Converged at iteration 24, L1 5.57172e-05, Linf 0.00472548, total time[s] 0.070428 +Converged at iteration 27, L1 5.86996e-05, Linf 0.00326767, total time[s] 0.073905 +Converged at iteration 24, L1 5.99669e-05, Linf 0.00447143, total time[s] 0.100048 +Converged at iteration 23, L1 9.36519e-05, Linf 0.00497474, total time[s] 0.084831 +Converged at iteration 25, L1 9.18898e-05, Linf 0.00553659, total time[s] 0.084268 +Converged at iteration 26, L1 5.96817e-05, Linf 0.00410951, total time[s] 0.083895 +Converged at iteration 27, L1 8.03647e-05, Linf 0.00636896, total time[s] 0.127833 +Converged at iteration 32, L1 6.58895e-05, Linf 0.00363441, total time[s] 0.153873 +Converged at iteration 26, L1 8.17695e-05, Linf 0.00229207, total time[s] 0.103833 +Converged at iteration 31, L1 7.75369e-05, Linf 0.00934082, total time[s] 0.095814 +Converged at iteration 31, L1 6.02642e-05, Linf 0.00240306, total time[s] 0.112726 +Converged at iteration 32, L1 7.1833e-05, Linf 0.00329741, total time[s] 0.14856 +Converged at iteration 30, L1 8.73567e-05, Linf 0.00350445, total time[s] 0.09511 +Converged at iteration 31, L1 8.93202e-05, Linf 0.0174214, total time[s] 0.119426 +Converged at iteration 29, L1 8.66058e-05, Linf 0.0175506, total time[s] 0.090831 +Converged at iteration 25, L1 5.84539e-05, Linf 0.00243256, total time[s] 0.091173 +Converged at iteration 34, L1 8.33651e-05, Linf 0.00198938, total time[s] 0.099216 +Converged at iteration 35, L1 3.75892e-05, Linf 0.00444874, total time[s] 0.100258 +Converged at iteration 25, L1 6.53316e-05, Linf 0.00374927, total time[s] 0.07406 +Converged at iteration 25, L1 4.82251e-05, Linf 0.0086047, total time[s] 0.122484 +Converged at iteration 26, L1 5.12829e-05, Linf 0.0145757, total time[s] 0.076904 +Converged at iteration 26, L1 4.63023e-05, Linf 0.0156712, total time[s] 0.075779 +Converged at iteration 21, L1 4.20941e-05, Linf 0.00722393, total time[s] 0.075348 +Converged at iteration 19, L1 8.75455e-05, Linf 0.00345738, total time[s] 0.077589 +Converged at iteration 24, L1 5.70189e-05, Linf 0.0023602, total time[s] 0.084077 +Converged at iteration 24, L1 6.04346e-05, Linf 0.00747264, total time[s] 0.07159 +Converged at iteration 21, L1 5.70278e-05, Linf 0.00289401, total time[s] 0.06969 +Converged at iteration 20, L1 4.80344e-05, Linf 0.00193943, total time[s] 0.065422 +Converged at iteration 31, L1 9.18875e-05, Linf 0.0138615, total time[s] 0.083648 +Converged at iteration 22, L1 6.43369e-05, Linf 0.00358746, total time[s] 0.064081 +Converged at iteration 24, L1 5.77997e-05, Linf 0.00447088, total time[s] 0.066128 +Converged at iteration 27, L1 5.57908e-05, Linf 0.00314175, total time[s] 0.078417 +Converged at iteration 24, L1 6.23259e-05, Linf 0.00481269, total time[s] 0.06699 +Converged at iteration 23, L1 9.67198e-05, Linf 0.00504646, total time[s] 0.062104 +Converged at iteration 25, L1 9.86494e-05, Linf 0.00579712, total time[s] 0.068388 +Converged at iteration 26, L1 6.63603e-05, Linf 0.00436686, total time[s] 0.068567 +Converged at iteration 27, L1 7.96295e-05, Linf 0.00586972, total time[s] 0.073277 +Converged at iteration 32, L1 6.60848e-05, Linf 0.00380485, total time[s] 0.082852 +Converged at iteration 26, L1 7.64553e-05, Linf 0.00244246, total time[s] 0.070065 +Converged at iteration 31, L1 7.89301e-05, Linf 0.00952878, total time[s] 0.088365 +Converged at iteration 31, L1 6.05367e-05, Linf 0.00238933, total time[s] 0.086857 +Converged at iteration 32, L1 7.84311e-05, Linf 0.00341549, total time[s] 0.089346 +Converged at iteration 30, L1 8.6889e-05, Linf 0.00386696, total time[s] 0.091106 +Converged at iteration 32, L1 3.64368e-05, Linf 0.00852307, total time[s] 0.083546 +Converged at iteration 29, L1 8.87367e-05, Linf 0.0182848, total time[s] 0.075456 +Converged at iteration 25, L1 5.86796e-05, Linf 0.0023599, total time[s] 0.067139 +Converged at iteration 37, L1 6.22843e-05, Linf 0.0080598, total time[s] 0.095621 +Converged at iteration 35, L1 3.90173e-05, Linf 0.00392262, total time[s] 0.100835 +Converged at iteration 25, L1 6.11477e-05, Linf 0.00370108, total time[s] 0.067003 +Converged at iteration 25, L1 4.36521e-05, Linf 0.00927015, total time[s] 0.064444 +Converged at iteration 26, L1 6.40044e-05, Linf 0.0168478, total time[s] 0.066756 +Converged at iteration 26, L1 5.10797e-05, Linf 0.0165122, total time[s] 0.067455 +Converged at iteration 21, L1 4.03342e-05, Linf 0.00741787, total time[s] 0.07047 +Converged at iteration 19, L1 8.76199e-05, Linf 0.00352203, total time[s] 0.065974 +Converged at iteration 24, L1 6.05148e-05, Linf 0.0024662, total time[s] 0.08724 +Converged at iteration 23, L1 9.76748e-05, Linf 0.00555408, total time[s] 0.098983 +Converged at iteration 21, L1 5.20734e-05, Linf 0.00264747, total time[s] 0.061999 +Converged at iteration 19, L1 9.52133e-05, Linf 0.00319389, total time[s] 0.053223 +Converged at iteration 31, L1 8.94687e-05, Linf 0.0131313, total time[s] 0.095123 +Converged at iteration 22, L1 6.84358e-05, Linf 0.00349917, total time[s] 0.058667 +Converged at iteration 24, L1 5.86402e-05, Linf 0.00431929, total time[s] 0.06304 +Converged at iteration 27, L1 5.98146e-05, Linf 0.00333955, total time[s] 0.069011 +Converged at iteration 24, L1 6.01237e-05, Linf 0.00439583, total time[s] 0.062927 +Converged at iteration 23, L1 9.22316e-05, Linf 0.00493427, total time[s] 0.061661 +Converged at iteration 25, L1 8.93657e-05, Linf 0.00545473, total time[s] 0.067884 +Converged at iteration 26, L1 5.68524e-05, Linf 0.00403707, total time[s] 0.068269 +Converged at iteration 27, L1 7.97986e-05, Linf 0.00674337, total time[s] 0.070926 +Converged at iteration 32, L1 6.63614e-05, Linf 0.00355051, total time[s] 0.083619 +Converged at iteration 26, L1 8.41758e-05, Linf 0.00222385, total time[s] 0.069402 +Converged at iteration 31, L1 7.54765e-05, Linf 0.00916867, total time[s] 0.081719 +Converged at iteration 31, L1 6.20407e-05, Linf 0.00245974, total time[s] 0.083625 +Converged at iteration 32, L1 7.02172e-05, Linf 0.00326445, total time[s] 0.085342 +Converged at iteration 30, L1 8.26441e-05, Linf 0.00329421, total time[s] 0.078351 +Converged at iteration 31, L1 8.4932e-05, Linf 0.0169193, total time[s] 0.082128 +Converged at iteration 29, L1 8.67593e-05, Linf 0.0176165, total time[s] 0.076772 +Converged at iteration 25, L1 5.8278e-05, Linf 0.00242923, total time[s] 0.066607 +Converged at iteration 37, L1 6.49484e-05, Linf 0.00882825, total time[s] 0.112096 +Converged at iteration 35, L1 3.54097e-05, Linf 0.0041514, total time[s] 0.116042 +Converged at iteration 25, L1 6.4152e-05, Linf 0.00373466, total time[s] 0.069968 +Converged at iteration 25, L1 4.76189e-05, Linf 0.00930262, total time[s] 0.062905 +Converged at iteration 26, L1 6.41143e-05, Linf 0.0158253, total time[s] 0.065412 +Converged at iteration 26, L1 6.07653e-05, Linf 0.0160658, total time[s] 0.068591 +Converged at iteration 21, L1 4.15889e-05, Linf 0.00724107, total time[s] 0.056028 +Converged at iteration 19, L1 8.73193e-05, Linf 0.00349958, total time[s] 0.066372 +Converged at iteration 24, L1 5.87671e-05, Linf 0.00239432, total time[s] 0.102282 +Converged at iteration 23, L1 9.98455e-05, Linf 0.00508508, total time[s] 0.0824 +Converged at iteration 21, L1 5.5015e-05, Linf 0.00276786, total time[s] 0.074167 +Converged at iteration 20, L1 4.65017e-05, Linf 0.00182834, total time[s] 0.06376 +Converged at iteration 31, L1 9.32257e-05, Linf 0.0134592, total time[s] 0.089507 +Converged at iteration 22, L1 7.02191e-05, Linf 0.00353314, total time[s] 0.066178 +Converged at iteration 24, L1 5.78348e-05, Linf 0.00479284, total time[s] 0.066174 +Converged at iteration 27, L1 5.78446e-05, Linf 0.00323679, total time[s] 0.069183 +Converged at iteration 24, L1 6.04404e-05, Linf 0.00455708, total time[s] 0.062146 +Converged at iteration 23, L1 9.47709e-05, Linf 0.00498566, total time[s] 0.063422 +Converged at iteration 25, L1 9.43238e-05, Linf 0.00562234, total time[s] 0.064794 +Converged at iteration 26, L1 6.24058e-05, Linf 0.00419309, total time[s] 0.065877 +Converged at iteration 27, L1 8.02895e-05, Linf 0.00602705, total time[s] 0.067952 +Converged at iteration 32, L1 6.66561e-05, Linf 0.00366574, total time[s] 0.079891 +Converged at iteration 26, L1 8.02832e-05, Linf 0.00232938, total time[s] 0.068191 +Converged at iteration 31, L1 7.81935e-05, Linf 0.00937377, total time[s] 0.079354 +Converged at iteration 31, L1 6.03936e-05, Linf 0.00243539, total time[s] 0.080563 +Converged at iteration 32, L1 7.28831e-05, Linf 0.00334441, total time[s] 0.084917 +Converged at iteration 30, L1 8.89767e-05, Linf 0.00360422, total time[s] 0.077692 +Converged at iteration 31, L1 9.23214e-05, Linf 0.0178107, total time[s] 0.07963 +Converged at iteration 29, L1 8.7625e-05, Linf 0.017939, total time[s] 0.074919 +Converged at iteration 25, L1 5.74069e-05, Linf 0.00239042, total time[s] 0.065892 +Converged at iteration 37, L1 6.60906e-05, Linf 0.0088273, total time[s] 0.094419 +Converged at iteration 35, L1 3.7867e-05, Linf 0.00428651, total time[s] 0.089365 +Converged at iteration 25, L1 6.50267e-05, Linf 0.00374153, total time[s] 0.087451 +Converged at iteration 25, L1 4.67536e-05, Linf 0.00870525, total time[s] 0.074077 +Converged at iteration 26, L1 5.13175e-05, Linf 0.0151368, total time[s] 0.07127 +Converged at iteration 26, L1 4.69577e-05, Linf 0.0158985, total time[s] 0.074594 +Converged at iteration 21, L1 4.28764e-05, Linf 0.00716973, total time[s] 0.066003 +Converged at iteration 19, L1 8.73307e-05, Linf 0.00347937, total time[s] 0.056008 +Converged at iteration 24, L1 5.85201e-05, Linf 0.00334527, total time[s] 0.089726 +Converged at iteration 24, L1 5.83851e-05, Linf 0.00191512, total time[s] 0.087707 +Converged at iteration 21, L1 5.56627e-05, Linf 0.00282884, total time[s] 0.07306 +Converged at iteration 20, L1 4.67733e-05, Linf 0.00188289, total time[s] 0.079565 +Converged at iteration 31, L1 9.07781e-05, Linf 0.0136767, total time[s] 0.104602 +Converged at iteration 22, L1 6.47494e-05, Linf 0.00356659, total time[s] 0.075968 +Converged at iteration 24, L1 5.77671e-05, Linf 0.00443602, total time[s] 0.075516 +Converged at iteration 27, L1 5.65577e-05, Linf 0.00319594, total time[s] 0.084595 +Converged at iteration 24, L1 6.19553e-05, Linf 0.00468832, total time[s] 0.071379 +Converged at iteration 23, L1 9.54531e-05, Linf 0.00500852, total time[s] 0.065747 +Converged at iteration 25, L1 9.64927e-05, Linf 0.00570699, total time[s] 0.070865 +Converged at iteration 26, L1 6.40143e-05, Linf 0.00427961, total time[s] 0.071644 +Converged at iteration 27, L1 7.93079e-05, Linf 0.00587892, total time[s] 0.073384 +Converged at iteration 32, L1 6.56654e-05, Linf 0.00374061, total time[s] 0.086818 +Converged at iteration 26, L1 7.78978e-05, Linf 0.00239084, total time[s] 0.070311 +Converged at iteration 31, L1 7.68254e-05, Linf 0.00950264, total time[s] 0.083033 +Converged at iteration 31, L1 5.85081e-05, Linf 0.00243174, total time[s] 0.082542 +Converged at iteration 32, L1 7.3798e-05, Linf 0.00338877, total time[s] 0.084665 +Converged at iteration 30, L1 8.82911e-05, Linf 0.00378437, total time[s] 0.081909 +Converged at iteration 31, L1 9.60004e-05, Linf 0.0182536, total time[s] 0.090494 +Converged at iteration 29, L1 8.83575e-05, Linf 0.0181095, total time[s] 0.084373 +Converged at iteration 25, L1 5.75255e-05, Linf 0.00231375, total time[s] 0.077671 +Converged at iteration 37, L1 6.53197e-05, Linf 0.00890857, total time[s] 0.102379 +Converged at iteration 35, L1 3.55468e-05, Linf 0.00423343, total time[s] 0.092285 +Converged at iteration 25, L1 6.45524e-05, Linf 0.00373668, total time[s] 0.068045 +Converged at iteration 25, L1 4.60546e-05, Linf 0.00882103, total time[s] 0.067407 +Converged at iteration 26, L1 5.47391e-05, Linf 0.0154224, total time[s] 0.070978 +Converged at iteration 26, L1 4.7465e-05, Linf 0.0163747, total time[s] 0.070577 +Converged at iteration 21, L1 4.19481e-05, Linf 0.00724159, total time[s] 0.060674 +Converged at iteration 19, L1 8.72668e-05, Linf 0.00349241, total time[s] 0.05643 +Converged at iteration 24, L1 5.77686e-05, Linf 0.00239841, total time[s] 0.077075 +Converged at iteration 23, L1 9.93028e-05, Linf 0.00496057, total time[s] 0.096879 +Converged at iteration 21, L1 5.4814e-05, Linf 0.00279973, total time[s] 0.07664 +Converged at iteration 20, L1 4.6307e-05, Linf 0.00185544, total time[s] 0.055237 +Converged at iteration 31, L1 9.02487e-05, Linf 0.013585, total time[s] 0.085334 +Converged at iteration 22, L1 6.49006e-05, Linf 0.0035526, total time[s] 0.070196 +Converged at iteration 24, L1 5.59215e-05, Linf 0.0044098, total time[s] 0.065283 +Converged at iteration 27, L1 5.7561e-05, Linf 0.0032224, total time[s] 0.082301 +Converged at iteration 24, L1 6.08151e-05, Linf 0.00462701, total time[s] 0.064348 +Converged at iteration 23, L1 9.48812e-05, Linf 0.00499649, total time[s] 0.062261 +Converged at iteration 25, L1 9.5664e-05, Linf 0.00566467, total time[s] 0.067068 +Converged at iteration 26, L1 6.29384e-05, Linf 0.00423555, total time[s] 0.070927 +Converged at iteration 27, L1 7.94172e-05, Linf 0.0059398, total time[s] 0.073565 +Converged at iteration 32, L1 6.57725e-05, Linf 0.00370919, total time[s] 0.09176 +Converged at iteration 26, L1 7.88762e-05, Linf 0.00236413, total time[s] 0.070658 +Converged at iteration 31, L1 7.66653e-05, Linf 0.00940661, total time[s] 0.103039 +Converged at iteration 31, L1 5.83498e-05, Linf 0.00242445, total time[s] 0.083117 +Converged at iteration 32, L1 7.34286e-05, Linf 0.00336675, total time[s] 0.084923 +Converged at iteration 30, L1 8.85889e-05, Linf 0.00373271, total time[s] 0.081266 +Converged at iteration 31, L1 9.40142e-05, Linf 0.0180322, total time[s] 0.082332 +Converged at iteration 29, L1 8.79303e-05, Linf 0.018024, total time[s] 0.077641 +Converged at iteration 25, L1 5.7485e-05, Linf 0.00233983, total time[s] 0.06795 +Converged at iteration 37, L1 6.49933e-05, Linf 0.00870642, total time[s] 0.096332 +Converged at iteration 35, L1 3.54285e-05, Linf 0.00420113, total time[s] 0.095902 +Converged at iteration 25, L1 6.41723e-05, Linf 0.00373461, total time[s] 0.067318 +Converged at iteration 25, L1 4.64063e-05, Linf 0.00885793, total time[s] 0.06807 +Converged at iteration 26, L1 6.09999e-05, Linf 0.015565, total time[s] 0.069879 +Converged at iteration 26, L1 4.74499e-05, Linf 0.0164416, total time[s] 0.070205 +Converged at iteration 21, L1 4.16716e-05, Linf 0.00724463, total time[s] 0.056752 +Converged at iteration 19, L1 8.70751e-05, Linf 0.00349485, total time[s] 0.054101 +Converged at iteration 24, L1 5.84667e-05, Linf 0.00239789, total time[s] 0.068442 +Converged at iteration 23, L1 9.88503e-05, Linf 0.00502206, total time[s] 0.067163 +Converged at iteration 21, L1 5.47535e-05, Linf 0.00278386, total time[s] 0.070408 +Converged at iteration 20, L1 4.59015e-05, Linf 0.00184173, total time[s] 0.058957 +Converged at iteration 31, L1 9.01078e-05, Linf 0.0135395, total time[s] 0.086878 +Converged at iteration 22, L1 6.48093e-05, Linf 0.00354666, total time[s] 0.065998 +Converged at iteration 24, L1 5.56965e-05, Linf 0.00440289, total time[s] 0.06906 +Converged at iteration 27, L1 5.7584e-05, Linf 0.00323547, total time[s] 0.073402 +Converged at iteration 24, L1 6.06591e-05, Linf 0.0045957, total time[s] 0.067538 +Converged at iteration 23, L1 9.47481e-05, Linf 0.00498804, total time[s] 0.067166 +Converged at iteration 25, L1 9.51363e-05, Linf 0.00564329, total time[s] 0.067257 +Converged at iteration 26, L1 6.22115e-05, Linf 0.00421426, total time[s] 0.069622 +Converged at iteration 27, L1 7.94718e-05, Linf 0.00597943, total time[s] 0.072908 +Converged at iteration 32, L1 6.58074e-05, Linf 0.00369314, total time[s] 0.086514 +Converged at iteration 26, L1 7.92243e-05, Linf 0.00235055, total time[s] 0.070085 +Converged at iteration 31, L1 7.62785e-05, Linf 0.0093894, total time[s] 0.08564 +Converged at iteration 31, L1 5.8598e-05, Linf 0.00238555, total time[s] 0.086523 +Converged at iteration 32, L1 7.31933e-05, Linf 0.0033555, total time[s] 0.096229 +Converged at iteration 30, L1 8.83249e-05, Linf 0.0036885, total time[s] 0.097709 +Converged at iteration 31, L1 9.29686e-05, Linf 0.0179226, total time[s] 0.081375 +Converged at iteration 29, L1 8.79996e-05, Linf 0.0179813, total time[s] 0.083743 +Converged at iteration 25, L1 5.75057e-05, Linf 0.00235585, total time[s] 0.074187 +Converged at iteration 37, L1 6.47899e-05, Linf 0.00868818, total time[s] 0.096851 +Converged at iteration 35, L1 3.51312e-05, Linf 0.00418617, total time[s] 0.095013 +Converged at iteration 25, L1 6.39629e-05, Linf 0.00373359, total time[s] 0.069158 +Converged at iteration 25, L1 4.57497e-05, Linf 0.00887831, total time[s] 0.072008 +Converged at iteration 26, L1 5.44374e-05, Linf 0.0156373, total time[s] 0.076157 +Converged at iteration 26, L1 4.76572e-05, Linf 0.0162312, total time[s] 0.084656 +Converged at iteration 21, L1 4.16351e-05, Linf 0.00733689, total time[s] 0.06434 +Converged at iteration 19, L1 8.73316e-05, Linf 0.00349817, total time[s] 0.053384 +Converged at iteration 24, L1 5.91955e-05, Linf 0.00239651, total time[s] 0.066361 +Converged at iteration 23, L1 9.86932e-05, Linf 0.00500196, total time[s] 0.065526 +Converged at iteration 21, L1 5.44273e-05, Linf 0.00277579, total time[s] 0.06328 +Converged at iteration 20, L1 4.58375e-05, Linf 0.00183819, total time[s] 0.055793 +Converged at iteration 31, L1 9.00646e-05, Linf 0.0135167, total time[s] 0.08388 +Converged at iteration 22, L1 6.66978e-05, Linf 0.00457106, total time[s] 0.060428 +Converged at iteration 24, L1 5.57423e-05, Linf 0.00479832, total time[s] 0.064611 +Converged at iteration 27, L1 5.75138e-05, Linf 0.00324147, total time[s] 0.071342 +Converged at iteration 24, L1 6.04314e-05, Linf 0.00458149, total time[s] 0.064437 +Converged at iteration 23, L1 9.44931e-05, Linf 0.00498764, total time[s] 0.06208 +Converged at iteration 25, L1 9.46239e-05, Linf 0.00563253, total time[s] 0.067145 +Converged at iteration 26, L1 6.2015e-05, Linf 0.00415276, total time[s] 0.070226 +Converged at iteration 27, L1 7.95058e-05, Linf 0.0060082, total time[s] 0.07279 +Converged at iteration 32, L1 6.58537e-05, Linf 0.00368491, total time[s] 0.084086 +Converged at iteration 26, L1 7.94846e-05, Linf 0.00234504, total time[s] 0.068388 +Converged at iteration 31, L1 7.60358e-05, Linf 0.00938, total time[s] 0.081809 +Converged at iteration 31, L1 5.86266e-05, Linf 0.00242387, total time[s] 0.081817 +Converged at iteration 32, L1 7.30151e-05, Linf 0.00335141, total time[s] 0.083591 +Converged at iteration 30, L1 8.82494e-05, Linf 0.00365086, total time[s] 0.078681 +Converged at iteration 31, L1 9.25305e-05, Linf 0.0178667, total time[s] 0.086808 +Converged at iteration 29, L1 8.72601e-05, Linf 0.0179607, total time[s] 0.086827 +Converged at iteration 25, L1 5.85477e-05, Linf 0.00237208, total time[s] 0.068261 +Converged at iteration 37, L1 6.47334e-05, Linf 0.00867733, total time[s] 0.11688 +Converged at iteration 35, L1 3.50332e-05, Linf 0.00418036, total time[s] 0.105756 +Converged at iteration 25, L1 6.3815e-05, Linf 0.00373309, total time[s] 0.068649 +Converged at iteration 25, L1 4.55806e-05, Linf 0.00888637, total time[s] 0.080695 +Converged at iteration 26, L1 5.46725e-05, Linf 0.015676, total time[s] 0.071403 +Converged at iteration 26, L1 4.7493e-05, Linf 0.0160704, total time[s] 0.092244 +Converged at iteration 21, L1 4.15592e-05, Linf 0.00724687, total time[s] 0.08761 +Converged at iteration 19, L1 8.71537e-05, Linf 0.00350177, total time[s] 0.054509 +Converged at iteration 24, L1 5.80073e-05, Linf 0.00239486, total time[s] 0.075067 +Converged at iteration 23, L1 9.90598e-05, Linf 0.00506921, total time[s] 0.065523 +Converged at iteration 21, L1 5.45114e-05, Linf 0.00277211, total time[s] 0.058048 +Converged at iteration 20, L1 4.57296e-05, Linf 0.00183198, total time[s] 0.077286 +Converged at iteration 31, L1 9.00469e-05, Linf 0.0134669, total time[s] 0.109043 +Converged at iteration 22, L1 6.539e-05, Linf 0.00353739, total time[s] 0.085919 +Converged at iteration 24, L1 5.56934e-05, Linf 0.00439409, total time[s] 0.077107 +Converged at iteration 27, L1 5.76237e-05, Linf 0.00324503, total time[s] 0.083631 +Converged at iteration 24, L1 6.04916e-05, Linf 0.00457465, total time[s] 0.076781 +Converged at iteration 23, L1 9.44609e-05, Linf 0.00498596, total time[s] 0.085579 +Converged at iteration 25, L1 9.44613e-05, Linf 0.00562725, total time[s] 0.074931 +Converged at iteration 26, L1 6.29289e-05, Linf 0.00420027, total time[s] 0.092792 +Converged at iteration 27, L1 8.05832e-05, Linf 0.0060126, total time[s] 0.073438 +Converged at iteration 32, L1 6.58702e-05, Linf 0.00368233, total time[s] 0.083311 +Converged at iteration 26, L1 7.96215e-05, Linf 0.00231777, total time[s] 0.069892 +Converged at iteration 31, L1 7.60415e-05, Linf 0.0093753, total time[s] 0.081995 +Converged at iteration 31, L1 5.86423e-05, Linf 0.00242421, total time[s] 0.081739 +Converged at iteration 32, L1 7.29355e-05, Linf 0.00334809, total time[s] 0.082692 +Converged at iteration 30, L1 8.81642e-05, Linf 0.00362808, total time[s] 0.082698 +Converged at iteration 31, L1 9.22522e-05, Linf 0.017837, total time[s] 0.085134 +Converged at iteration 29, L1 8.8801e-05, Linf 0.01795, total time[s] 0.083522 +Converged at iteration 25, L1 5.74501e-05, Linf 0.00237067, total time[s] 0.114943 +Converged at iteration 37, L1 6.50683e-05, Linf 0.00868355, total time[s] 0.140072 +Converged at iteration 35, L1 3.5074e-05, Linf 0.00418243, total time[s] 0.112908 +Converged at iteration 25, L1 6.40824e-05, Linf 0.00373343, total time[s] 0.076732 +Converged at iteration 25, L1 4.56071e-05, Linf 0.0088816, total time[s] 0.069462 +Converged at iteration 26, L1 5.5494e-05, Linf 0.0156541, total time[s] 0.097325 +Converged at iteration 26, L1 4.75824e-05, Linf 0.0160638, total time[s] 0.081871 +Converged at iteration 21, L1 4.15947e-05, Linf 0.00724601, total time[s] 0.097704 +Converged at iteration 19, L1 8.76109e-05, Linf 0.00350081, total time[s] 0.082528 +Converged at iteration 24, L1 5.80069e-05, Linf 0.00239599, total time[s] 0.083507 +Converged at iteration 23, L1 9.98373e-05, Linf 0.00505483, total time[s] 0.074269 +Converged at iteration 21, L1 5.45925e-05, Linf 0.00277391, total time[s] 0.078993 +Converged at iteration 20, L1 4.66067e-05, Linf 0.00183342, total time[s] 0.069784 +Converged at iteration 31, L1 9.01353e-05, Linf 0.0135111, total time[s] 0.095277 +Converged at iteration 22, L1 6.66592e-05, Linf 0.00354532, total time[s] 0.082331 +Converged at iteration 24, L1 5.6673e-05, Linf 0.00439224, total time[s] 0.086387 +Converged at iteration 27, L1 5.78776e-05, Linf 0.0032436, total time[s] 0.103631 +Converged at iteration 24, L1 6.13224e-05, Linf 0.00457516, total time[s] 0.086256 +Converged at iteration 23, L1 9.50945e-05, Linf 0.00498864, total time[s] 0.079258 +Converged at iteration 25, L1 9.43763e-05, Linf 0.00562947, total time[s] 0.079882 +Converged at iteration 26, L1 6.19507e-05, Linf 0.0042001, total time[s] 0.075677 +Converged at iteration 27, L1 7.95177e-05, Linf 0.00599078, total time[s] 0.079232 +Converged at iteration 32, L1 6.5866e-05, Linf 0.00368264, total time[s] 0.09301 +Converged at iteration 26, L1 7.97497e-05, Linf 0.00234204, total time[s] 0.085696 +Converged at iteration 31, L1 7.79327e-05, Linf 0.00938078, total time[s] 0.095788 +Converged at iteration 31, L1 6.41458e-05, Linf 0.00242075, total time[s] 0.081089 +Converged at iteration 32, L1 7.54071e-05, Linf 0.00407949, total time[s] 0.086268 +Converged at iteration 30, L1 8.8392e-05, Linf 0.00363994, total time[s] 0.080388 +Converged at iteration 32, L1 4.37844e-05, Linf 0.00782546, total time[s] 0.083298 +Converged at iteration 29, L1 8.71089e-05, Linf 0.0179562, total time[s] 0.076406 +Converged at iteration 25, L1 5.99914e-05, Linf 0.0025705, total time[s] 0.06655 +Converged at iteration 37, L1 6.51215e-05, Linf 0.00868106, total time[s] 0.095797 +Converged at iteration 35, L1 3.50402e-05, Linf 0.00417955, total time[s] 0.095382 +Converged at iteration 25, L1 6.45706e-05, Linf 0.00373329, total time[s] 0.066153 +Converged at iteration 25, L1 4.5764e-05, Linf 0.00888424, total time[s] 0.066356 +Converged at iteration 26, L1 5.47972e-05, Linf 0.0157805, total time[s] 0.067699 +Converged at iteration 26, L1 4.76693e-05, Linf 0.0163856, total time[s] 0.072013 +Converged at iteration 21, L1 4.24026e-05, Linf 0.00733925, total time[s] 0.060422 +Converged at iteration 19, L1 8.7983e-05, Linf 0.00349879, total time[s] 0.052608 +Converged at iteration 24, L1 5.98462e-05, Linf 0.00280972, total time[s] 0.068987 +Converged at iteration 23, L1 9.86558e-05, Linf 0.00506524, total time[s] 0.064098 +Converged at iteration 21, L1 5.47852e-05, Linf 0.002773, total time[s] 0.061542 +Converged at iteration 20, L1 4.55676e-05, Linf 0.00183251, total time[s] 0.063535 +Converged at iteration 31, L1 9.01445e-05, Linf 0.0135816, total time[s] 0.080521 +Converged at iteration 22, L1 6.86029e-05, Linf 0.00354755, total time[s] 0.059424 +Converged at iteration 24, L1 5.92255e-05, Linf 0.00540137, total time[s] 0.064585 +Converged at iteration 27, L1 5.83268e-05, Linf 0.00324381, total time[s] 0.078305 +Converged at iteration 24, L1 6.06057e-05, Linf 0.00457676, total time[s] 0.066427 +Converged at iteration 23, L1 9.43882e-05, Linf 0.00498562, total time[s] 0.060645 +Converged at iteration 25, L1 9.38682e-05, Linf 0.0056262, total time[s] 0.064591 +Converged at iteration 26, L1 6.20248e-05, Linf 0.00419712, total time[s] 0.069319 +Converged at iteration 27, L1 8.00477e-05, Linf 0.00586822, total time[s] 0.072165 +Converged at iteration 32, L1 6.59855e-05, Linf 0.00367998, total time[s] 0.091098 +Converged at iteration 26, L1 7.97182e-05, Linf 0.00234227, total time[s] 0.068864 +Converged at iteration 31, L1 7.66495e-05, Linf 0.0093768, total time[s] 0.078631 +Converged at iteration 31, L1 6.02514e-05, Linf 0.00243277, total time[s] 0.084808 +Converged at iteration 32, L1 7.30293e-05, Linf 0.00334758, total time[s] 0.093056 +Converged at iteration 30, L1 8.8327e-05, Linf 0.00363387, total time[s] 0.078759 +Converged at iteration 31, L1 9.27445e-05, Linf 0.0178476, total time[s] 0.082216 +Converged at iteration 29, L1 8.76588e-05, Linf 0.0179523, total time[s] 0.080733 +Converged at iteration 25, L1 5.74599e-05, Linf 0.00237924, total time[s] 0.069906 +Converged at iteration 37, L1 6.48051e-05, Linf 0.0086783, total time[s] 0.09505 +Converged at iteration 35, L1 3.51844e-05, Linf 0.00418118, total time[s] 0.095318 +Converged at iteration 25, L1 6.38738e-05, Linf 0.00373328, total time[s] 0.070513 +Converged at iteration 25, L1 4.60416e-05, Linf 0.00888523, total time[s] 0.084411 +Converged at iteration 26, L1 5.68255e-05, Linf 0.015668, total time[s] 0.07493 +Converged at iteration 26, L1 5.03573e-05, Linf 0.0159375, total time[s] 0.079976 +Converged at iteration 21, L1 4.16084e-05, Linf 0.00724669, total time[s] 0.062127 +Converged at iteration 19, L1 8.72368e-05, Linf 0.00349755, total time[s] 0.077475 +Converged at iteration 24, L1 5.87114e-05, Linf 0.00239586, total time[s] 0.070135 +Converged at iteration 23, L1 9.90469e-05, Linf 0.00506064, total time[s] 0.068592 +Converged at iteration 21, L1 5.50733e-05, Linf 0.00277256, total time[s] 0.065746 +Converged at iteration 20, L1 4.70707e-05, Linf 0.00183238, total time[s] 0.068503 +Converged at iteration 31, L1 9.01785e-05, Linf 0.0133908, total time[s] 0.084926 +Converged at iteration 22, L1 6.98564e-05, Linf 0.00353778, total time[s] 0.059137 +Converged at iteration 24, L1 5.90583e-05, Linf 0.00439577, total time[s] 0.063208 +Converged at iteration 27, L1 5.83534e-05, Linf 0.00324482, total time[s] 0.069513 +Converged at iteration 24, L1 6.05385e-05, Linf 0.00458121, total time[s] 0.062413 +Converged at iteration 23, L1 9.50978e-05, Linf 0.00498659, total time[s] 0.064905 +Converged at iteration 25, L1 9.46144e-05, Linf 0.00562361, total time[s] 0.098585 +Converged at iteration 26, L1 6.24102e-05, Linf 0.00419447, total time[s] 0.072059 +Converged at iteration 27, L1 7.96147e-05, Linf 0.00601476, total time[s] 0.07301 +Converged at iteration 32, L1 6.62779e-05, Linf 0.00368111, total time[s] 0.08264 +Converged at iteration 26, L1 7.9608e-05, Linf 0.00234063, total time[s] 0.069171 +Converged at iteration 31, L1 7.70843e-05, Linf 0.00937582, total time[s] 0.080935 +Converged at iteration 31, L1 5.93234e-05, Linf 0.00242333, total time[s] 0.08136 +Converged at iteration 32, L1 7.26795e-05, Linf 0.00334105, total time[s] 0.082361 +Converged at iteration 30, L1 8.86025e-05, Linf 0.00363266, total time[s] 0.077684 +Converged at iteration 31, L1 9.24737e-05, Linf 0.017845, total time[s] 0.079384 +Converged at iteration 29, L1 8.76439e-05, Linf 0.017951, total time[s] 0.074661 +Converged at iteration 25, L1 5.74114e-05, Linf 0.00238033, total time[s] 0.065512 +Converged at iteration 37, L1 6.485e-05, Linf 0.00867879, total time[s] 0.096011 +Converged at iteration 35, L1 3.51399e-05, Linf 0.00418034, total time[s] 0.095173 +Converged at iteration 25, L1 6.38584e-05, Linf 0.00373312, total time[s] 0.072356 +Converged at iteration 25, L1 4.58767e-05, Linf 0.00888471, total time[s] 0.065536 +Converged at iteration 26, L1 5.76158e-05, Linf 0.0156663, total time[s] 0.068731 +Converged at iteration 26, L1 4.78881e-05, Linf 0.0159134, total time[s] 0.069531 +Converged at iteration 21, L1 4.16665e-05, Linf 0.00723962, total time[s] 0.064131 +Converged at iteration 19, L1 8.71532e-05, Linf 0.0035029, total time[s] 0.063387 +Converged at iteration 24, L1 5.80086e-05, Linf 0.00239499, total time[s] 0.07847 +Converged at iteration 24, L1 5.89458e-05, Linf 0.00514522, total time[s] 0.075354 +Converged at iteration 21, L1 5.47656e-05, Linf 0.00277279, total time[s] 0.066566 +Converged at iteration 20, L1 4.60557e-05, Linf 0.00183325, total time[s] 0.059994 +Converged at iteration 31, L1 9.01747e-05, Linf 0.0135076, total time[s] 0.096384 +Converged at iteration 22, L1 7.02681e-05, Linf 0.00353718, total time[s] 0.063252 +Converged at iteration 24, L1 5.67028e-05, Linf 0.00438348, total time[s] 0.061533 +Converged at iteration 27, L1 5.75291e-05, Linf 0.00324586, total time[s] 0.072786 +Converged at iteration 24, L1 6.04871e-05, Linf 0.00457625, total time[s] 0.065808 +Converged at iteration 23, L1 9.45498e-05, Linf 0.00498623, total time[s] 0.061552 +Converged at iteration 25, L1 9.45135e-05, Linf 0.00562846, total time[s] 0.068562 +Converged at iteration 26, L1 6.23099e-05, Linf 0.00419983, total time[s] 0.069353 +Converged at iteration 27, L1 7.89828e-05, Linf 0.00596525, total time[s] 0.071285 +Converged at iteration 32, L1 6.59125e-05, Linf 0.00368047, total time[s] 0.08234 +Converged at iteration 26, L1 7.95893e-05, Linf 0.002341, total time[s] 0.06777 +Converged at iteration 31, L1 7.59768e-05, Linf 0.00937618, total time[s] 0.08667 +Converged at iteration 31, L1 5.86854e-05, Linf 0.00241837, total time[s] 0.080883 +Converged at iteration 32, L1 7.29102e-05, Linf 0.00334925, total time[s] 0.083844 +Converged at iteration 30, L1 8.9056e-05, Linf 0.00363038, total time[s] 0.078102 +Converged at iteration 31, L1 9.22415e-05, Linf 0.0176161, total time[s] 0.084384 +Converged at iteration 29, L1 8.80242e-05, Linf 0.0177649, total time[s] 0.079292 +Converged at iteration 25, L1 5.78704e-05, Linf 0.00236809, total time[s] 0.066426 +Converged at iteration 37, L1 6.52532e-05, Linf 0.00873582, total time[s] 0.094997 +Converged at iteration 35, L1 3.55086e-05, Linf 0.004177, total time[s] 0.096817 +Converged at iteration 25, L1 6.39794e-05, Linf 0.00373404, total time[s] 0.074554 +Converged at iteration 25, L1 4.64825e-05, Linf 0.00888486, total time[s] 0.071134 +Converged at iteration 26, L1 5.52144e-05, Linf 0.0156664, total time[s] 0.068765 +Converged at iteration 26, L1 4.78498e-05, Linf 0.0160595, total time[s] 0.069298 +Converged at iteration 21, L1 4.15831e-05, Linf 0.00724626, total time[s] 0.062702 +Converged at iteration 19, L1 8.75539e-05, Linf 0.00350119, total time[s] 0.081845 +Converged at iteration 24, L1 5.95417e-05, Linf 0.00526932, total time[s] 0.091908 +Converged at iteration 23, L1 9.99555e-05, Linf 0.00505987, total time[s] 0.070875 +Converged at iteration 21, L1 5.50364e-05, Linf 0.0027727, total time[s] 0.074946 +Converged at iteration 20, L1 5.10637e-05, Linf 0.0035699, total time[s] 0.061795 +Converged at iteration 31, L1 9.00238e-05, Linf 0.0135074, total time[s] 0.092199 +Converged at iteration 22, L1 6.50014e-05, Linf 0.00354125, total time[s] 0.072172 +Converged at iteration 24, L1 5.55872e-05, Linf 0.00439413, total time[s] 0.067981 +Converged at iteration 27, L1 5.76906e-05, Linf 0.00324669, total time[s] 0.071295 +Converged at iteration 24, L1 6.03638e-05, Linf 0.00457289, total time[s] 0.067258 +Converged at iteration 23, L1 9.45179e-05, Linf 0.00498506, total time[s] 0.066126 +Converged at iteration 25, L1 9.51568e-05, Linf 0.00562816, total time[s] 0.066489 +Converged at iteration 26, L1 6.19709e-05, Linf 0.00419883, total time[s] 0.071087 +Converged at iteration 27, L1 7.95739e-05, Linf 0.00601494, total time[s] 0.096549 +Converged at iteration 32, L1 6.64415e-05, Linf 0.00367928, total time[s] 0.095203 +Converged at iteration 26, L1 7.95559e-05, Linf 0.00234087, total time[s] 0.067955 +Converged at iteration 31, L1 7.66224e-05, Linf 0.00938123, total time[s] 0.082203 +Converged at iteration 31, L1 6.06404e-05, Linf 0.00241251, total time[s] 0.081033 +Converged at iteration 32, L1 7.2935e-05, Linf 0.00334631, total time[s] 0.082991 +Converged at iteration 30, L1 8.83382e-05, Linf 0.00363189, total time[s] 0.07837 +Converged at iteration 31, L1 9.22669e-05, Linf 0.0178432, total time[s] 0.086664 +Converged at iteration 29, L1 8.77312e-05, Linf 0.0179514, total time[s] 0.077707 +Converged at iteration 25, L1 5.74085e-05, Linf 0.00238005, total time[s] 0.066489 +Converged at iteration 40, L1 6.90734e-05, Linf 0.00367354, total time[s] 0.111626 +Converged at iteration 35, L1 7.69121e-05, Linf 0.00343337, total time[s] 0.106288 +Converged at iteration 30, L1 9.79878e-05, Linf 0.00624616, total time[s] 0.083096 +Converged at iteration 31, L1 6.23561e-05, Linf 0.00502552, total time[s] 0.082184 +Converged at iteration 27, L1 6.27661e-05, Linf 0.00500049, total time[s] 0.067058 +Converged at iteration 22, L1 8.60373e-05, Linf 0.00444358, total time[s] 0.056428 +Converged at iteration 20, L1 9.62518e-05, Linf 0.00397905, total time[s] 0.058041 +Converged at iteration 24, L1 8.84048e-05, Linf 0.00483077, total time[s] 0.074309 +Converged at iteration 28, L1 7.39714e-05, Linf 0.00446736, total time[s] 0.08075 +Converged at iteration 26, L1 8.11815e-05, Linf 0.00546855, total time[s] 0.078132 +Converged at iteration 22, L1 7.51076e-05, Linf 0.00508952, total time[s] 0.082822 +Converged at iteration 19, L1 6.68293e-05, Linf 0.00393102, total time[s] 0.071375 +Converged at iteration 30, L1 8.01032e-05, Linf 0.0032964, total time[s] 0.097189 +Converged at iteration 20, L1 8.44165e-05, Linf 0.0044843, total time[s] 0.056495 +Converged at iteration 24, L1 7.10836e-05, Linf 0.00463287, total time[s] 0.06164 +Converged at iteration 31, L1 8.93618e-05, Linf 0.00569235, total time[s] 0.085509 +Converged at iteration 27, L1 9.91877e-05, Linf 0.00569821, total time[s] 0.071035 +Converged at iteration 24, L1 8.79013e-05, Linf 0.00465012, total time[s] 0.064041 +Converged at iteration 23, L1 9.21763e-05, Linf 0.0041019, total time[s] 0.062347 +Converged at iteration 26, L1 7.22292e-05, Linf 0.00446111, total time[s] 0.068224 +Converged at iteration 29, L1 7.81597e-05, Linf 0.00479604, total time[s] 0.075093 +Converged at iteration 34, L1 7.07676e-05, Linf 0.0042288, total time[s] 0.087908 +Converged at iteration 30, L1 9.39562e-05, Linf 0.00442608, total time[s] 0.076675 +Converged at iteration 28, L1 9.51075e-05, Linf 0.00310979, total time[s] 0.071685 +Converged at iteration 32, L1 9.47198e-05, Linf 0.00374163, total time[s] 0.082119 +Converged at iteration 37, L1 7.38904e-05, Linf 0.00327672, total time[s] 0.095302 +Converged at iteration 33, L1 8.45083e-05, Linf 0.00469787, total time[s] 0.084151 +Converged at iteration 28, L1 9.63386e-05, Linf 0.00430897, total time[s] 0.07247 +Converged at iteration 24, L1 8.83033e-05, Linf 0.00328779, total time[s] 0.067973 +Converged at iteration 26, L1 9.00117e-05, Linf 0.00383862, total time[s] 0.066001 +Converged at iteration 40, L1 6.65741e-05, Linf 0.00389676, total time[s] 0.098106 +Converged at iteration 35, L1 8.66348e-05, Linf 0.00357478, total time[s] 0.086266 +Converged at iteration 30, L1 9.17623e-05, Linf 0.0041839, total time[s] 0.075065 +Converged at iteration 31, L1 6.17908e-05, Linf 0.00507486, total time[s] 0.077987 +Converged at iteration 26, L1 9.84147e-05, Linf 0.00577974, total time[s] 0.077674 +Converged at iteration 22, L1 7.18906e-05, Linf 0.00418798, total time[s] 0.059803 +Converged at iteration 21, L1 6.40814e-05, Linf 0.00350059, total time[s] 0.059698 +Converged at iteration 24, L1 8.945e-05, Linf 0.00496532, total time[s] 0.066882 +Converged at iteration 28, L1 7.3411e-05, Linf 0.00443193, total time[s] 0.074028 +Converged at iteration 26, L1 8.01668e-05, Linf 0.00535941, total time[s] 0.066881 +Converged at iteration 22, L1 7.02174e-05, Linf 0.0044143, total time[s] 0.057322 +Converged at iteration 19, L1 5.49422e-05, Linf 0.00332055, total time[s] 0.051753 +Converged at iteration 30, L1 9.5278e-05, Linf 0.0033414, total time[s] 0.077492 +Converged at iteration 20, L1 8.42661e-05, Linf 0.00472689, total time[s] 0.054062 +Converged at iteration 24, L1 7.12285e-05, Linf 0.00475228, total time[s] 0.066087 +Converged at iteration 31, L1 9.41907e-05, Linf 0.00482002, total time[s] 0.084574 +Converged at iteration 27, L1 9.41208e-05, Linf 0.00468405, total time[s] 0.079743 +Converged at iteration 24, L1 8.51872e-05, Linf 0.00428111, total time[s] 0.065013 +Converged at iteration 23, L1 9.23827e-05, Linf 0.00423617, total time[s] 0.062435 +Converged at iteration 26, L1 7.1328e-05, Linf 0.00475323, total time[s] 0.069531 +Converged at iteration 29, L1 7.52326e-05, Linf 0.00488637, total time[s] 0.078228 +Converged at iteration 34, L1 8.13657e-05, Linf 0.00406108, total time[s] 0.087824 +Converged at iteration 31, L1 7.17596e-05, Linf 0.00355196, total time[s] 0.078671 +Converged at iteration 29, L1 7.02725e-05, Linf 0.00272401, total time[s] 0.074226 +Converged at iteration 32, L1 8.21629e-05, Linf 0.00354568, total time[s] 0.081683 +Converged at iteration 36, L1 8.71689e-05, Linf 0.00357618, total time[s] 0.091955 +Converged at iteration 33, L1 8.32361e-05, Linf 0.00484757, total time[s] 0.0838 +Converged at iteration 28, L1 9.10466e-05, Linf 0.0041318, total time[s] 0.071827 +Converged at iteration 24, L1 8.02465e-05, Linf 0.00290887, total time[s] 0.063202 +Converged at iteration 26, L1 8.39861e-05, Linf 0.00392365, total time[s] 0.067445 +Converged at iteration 39, L1 9.99303e-05, Linf 0.00489198, total time[s] 0.097532 +Converged at iteration 35, L1 9.68612e-05, Linf 0.00385801, total time[s] 0.099204 +Converged at iteration 30, L1 7.64784e-05, Linf 0.00421028, total time[s] 0.088437 +Converged at iteration 31, L1 6.13567e-05, Linf 0.00506464, total time[s] 0.082095 +Converged at iteration 26, L1 9.10572e-05, Linf 0.00568979, total time[s] 0.069848 +Converged at iteration 21, L1 9.60183e-05, Linf 0.00461198, total time[s] 0.057459 +Converged at iteration 21, L1 6.92239e-05, Linf 0.00393129, total time[s] 0.075146 +Converged at iteration 24, L1 8.29699e-05, Linf 0.00519974, total time[s] 0.102007 +Converged at iteration 28, L1 6.80431e-05, Linf 0.00441196, total time[s] 0.091527 +Converged at iteration 26, L1 8.12491e-05, Linf 0.00428441, total time[s] 0.07659 +Converged at iteration 21, L1 8.51923e-05, Linf 0.00433737, total time[s] 0.079234 +Converged at iteration 18, L1 7.35833e-05, Linf 0.00298989, total time[s] 0.0648 +Converged at iteration 31, L1 7.49347e-05, Linf 0.00271661, total time[s] 0.092576 +Converged at iteration 20, L1 8.22642e-05, Linf 0.00495039, total time[s] 0.054499 +Converged at iteration 24, L1 6.88771e-05, Linf 0.00500085, total time[s] 0.065489 +Converged at iteration 30, L1 9.41654e-05, Linf 0.00345512, total time[s] 0.106675 +Converged at iteration 25, L1 9.0176e-05, Linf 0.00466613, total time[s] 0.080216 +Converged at iteration 23, L1 8.36357e-05, Linf 0.00393109, total time[s] 0.079027 +Converged at iteration 23, L1 9.32743e-05, Linf 0.00455949, total time[s] 0.079781 +Converged at iteration 26, L1 6.88605e-05, Linf 0.00480744, total time[s] 0.086352 +Converged at iteration 29, L1 7.12201e-05, Linf 0.00490146, total time[s] 0.084644 +Converged at iteration 32, L1 8.57779e-05, Linf 0.00350129, total time[s] 0.084817 +Converged at iteration 31, L1 7.25441e-05, Linf 0.00301991, total time[s] 0.08076 +Converged at iteration 29, L1 7.74419e-05, Linf 0.00289809, total time[s] 0.075698 +Converged at iteration 32, L1 7.5553e-05, Linf 0.00336115, total time[s] 0.083251 +Converged at iteration 35, L1 9.72359e-05, Linf 0.00405369, total time[s] 0.092521 +Converged at iteration 33, L1 8.06693e-05, Linf 0.00500151, total time[s] 0.083717 +Converged at iteration 28, L1 8.44712e-05, Linf 0.00398759, total time[s] 0.073287 +Converged at iteration 24, L1 7.80826e-05, Linf 0.00256146, total time[s] 0.065579 +Converged at iteration 26, L1 8.36335e-05, Linf 0.00405332, total time[s] 0.073094 +Converged at iteration 39, L1 9.34301e-05, Linf 0.00549167, total time[s] 0.10572 +Converged at iteration 36, L1 7.23671e-05, Linf 0.0038447, total time[s] 0.093162 +Converged at iteration 27, L1 5.17454e-05, Linf 0.0056564, total time[s] 0.071217 +Converged at iteration 31, L1 6.04554e-05, Linf 0.00508915, total time[s] 0.081371 +Converged at iteration 26, L1 7.63504e-05, Linf 0.00544341, total time[s] 0.068054 +Converged at iteration 21, L1 7.17758e-05, Linf 0.00380748, total time[s] 0.056749 +Converged at iteration 20, L1 6.89296e-05, Linf 0.00502944, total time[s] 0.054096 +Converged at iteration 22, L1 7.53335e-05, Linf 0.00751888, total time[s] 0.059725 +Converged at iteration 26, L1 9.72761e-05, Linf 0.00651811, total time[s] 0.072929 +Converged at iteration 25, L1 7.44646e-05, Linf 0.00412523, total time[s] 0.069548 +Converged at iteration 20, L1 8.84163e-05, Linf 0.00555823, total time[s] 0.056072 +Converged at iteration 17, L1 8.52464e-05, Linf 0.00400214, total time[s] 0.047855 +Converged at iteration 31, L1 9.13862e-05, Linf 0.00277119, total time[s] 0.079468 +Converged at iteration 20, L1 6.64016e-05, Linf 0.00539278, total time[s] 0.05395 +Converged at iteration 24, L1 6.21107e-05, Linf 0.00553354, total time[s] 0.075788 +Converged at iteration 28, L1 7.07418e-05, Linf 0.00374043, total time[s] 0.087662 +Converged at iteration 23, L1 9.56656e-05, Linf 0.00710132, total time[s] 0.066771 +Converged at iteration 21, L1 9.30001e-05, Linf 0.00485113, total time[s] 0.065957 +Converged at iteration 23, L1 7.86332e-05, Linf 0.00414949, total time[s] 0.069318 +Converged at iteration 25, L1 9.9431e-05, Linf 0.00625579, total time[s] 0.074748 +Converged at iteration 28, L1 9.827e-05, Linf 0.00586754, total time[s] 0.093252 +Converged at iteration 30, L1 6.86185e-05, Linf 0.00488135, total time[s] 0.076896 +Converged at iteration 28, L1 8.30341e-05, Linf 0.00350207, total time[s] 0.072558 +Converged at iteration 29, L1 8.81952e-05, Linf 0.00329485, total time[s] 0.077721 +Converged at iteration 31, L1 6.93424e-05, Linf 0.00290627, total time[s] 0.080492 +Converged at iteration 31, L1 9.11114e-05, Linf 0.00460268, total time[s] 0.079197 +Converged at iteration 33, L1 7.40794e-05, Linf 0.00530568, total time[s] 0.083431 +Converged at iteration 28, L1 7.08634e-05, Linf 0.00369755, total time[s] 0.098916 +Converged at iteration 24, L1 8.79868e-05, Linf 0.0018755, total time[s] 0.107167 +Converged at iteration 25, L1 6.99829e-05, Linf 0.00423563, total time[s] 0.069247 +Converged at iteration 39, L1 7.6387e-05, Linf 0.006599, total time[s] 0.17256 +Converged at iteration 36, L1 7.32714e-05, Linf 0.00527052, total time[s] 0.11306 +Converged at iteration 24, L1 7.48287e-05, Linf 0.00411565, total time[s] 0.07257 +Converged at iteration 31, L1 5.83667e-05, Linf 0.00509163, total time[s] 0.093052 +Converged at iteration 25, L1 8.6709e-05, Linf 0.00571595, total time[s] 0.069249 +Converged at iteration 20, L1 9.2051e-05, Linf 0.00380205, total time[s] 0.077537 +Converged at iteration 19, L1 6.64217e-05, Linf 0.00437211, total time[s] 0.057827 +Converged at iteration 20, L1 9.17257e-05, Linf 0.00663672, total time[s] 0.062235 +Converged at iteration 24, L1 7.93847e-05, Linf 0.00495819, total time[s] 0.06617 +Converged at iteration 24, L1 7.58681e-05, Linf 0.00492112, total time[s] 0.066206 +Converged at iteration 20, L1 6.05372e-05, Linf 0.00519213, total time[s] 0.054952 +Converged at iteration 17, L1 5.19415e-05, Linf 0.00241318, total time[s] 0.047679 +Converged at iteration 32, L1 6.88531e-05, Linf 0.0025374, total time[s] 0.083918 +Converged at iteration 19, L1 9.32676e-05, Linf 0.00707778, total time[s] 0.05768 +Converged at iteration 23, L1 7.80375e-05, Linf 0.00710084, total time[s] 0.061 +Converged at iteration 26, L1 8.14194e-05, Linf 0.00603237, total time[s] 0.067649 +Converged at iteration 23, L1 5.79122e-05, Linf 0.00605259, total time[s] 0.060265 +Converged at iteration 20, L1 8.31669e-05, Linf 0.0055273, total time[s] 0.053227 +Converged at iteration 22, L1 9.95031e-05, Linf 0.00498688, total time[s] 0.058512 +Converged at iteration 25, L1 8.48196e-05, Linf 0.00440073, total time[s] 0.070175 +Converged at iteration 28, L1 7.81827e-05, Linf 0.00358713, total time[s] 0.118848 +Converged at iteration 29, L1 7.48394e-05, Linf 0.00610555, total time[s] 0.077086 +Converged at iteration 27, L1 7.34873e-05, Linf 0.00399273, total time[s] 0.069752 +Converged at iteration 29, L1 7.65677e-05, Linf 0.00381658, total time[s] 0.074928 +Converged at iteration 29, L1 9.19963e-05, Linf 0.00277218, total time[s] 0.073884 +Converged at iteration 28, L1 8.39375e-05, Linf 0.00273852, total time[s] 0.070554 +Converged at iteration 33, L1 6.18066e-05, Linf 0.00584927, total time[s] 0.082357 +Converged at iteration 27, L1 6.87698e-05, Linf 0.00334628, total time[s] 0.06881 +Converged at iteration 24, L1 9.65627e-05, Linf 0.00239087, total time[s] 0.061617 +Converged at iteration 23, L1 7.61751e-05, Linf 0.00331366, total time[s] 0.065514 +Converged at iteration 39, L1 7.44233e-05, Linf 0.00661502, total time[s] 0.127022 +Converged at iteration 36, L1 7.20483e-05, Linf 0.00533692, total time[s] 0.106367 +Converged at iteration 24, L1 7.4338e-05, Linf 0.00388457, total time[s] 0.064971 +Converged at iteration 31, L1 5.69578e-05, Linf 0.00507395, total time[s] 0.081309 +Converged at iteration 25, L1 8.73875e-05, Linf 0.00584042, total time[s] 0.06827 +Converged at iteration 20, L1 9.41579e-05, Linf 0.00386639, total time[s] 0.055043 +Converged at iteration 19, L1 6.40768e-05, Linf 0.00430461, total time[s] 0.056074 +Converged at iteration 20, L1 9.02364e-05, Linf 0.00655215, total time[s] 0.055508 +Converged at iteration 24, L1 7.6905e-05, Linf 0.00456306, total time[s] 0.062764 +Converged at iteration 24, L1 7.67964e-05, Linf 0.00498617, total time[s] 0.062189 +Converged at iteration 20, L1 6.20572e-05, Linf 0.00515347, total time[s] 0.058071 +Converged at iteration 16, L1 9.93192e-05, Linf 0.00457313, total time[s] 0.048898 +Converged at iteration 32, L1 6.88359e-05, Linf 0.0025777, total time[s] 0.089526 +Converged at iteration 19, L1 9.35289e-05, Linf 0.0069792, total time[s] 0.052562 +Converged at iteration 23, L1 7.75673e-05, Linf 0.00702834, total time[s] 0.058392 +Converged at iteration 26, L1 7.99009e-05, Linf 0.0059661, total time[s] 0.068099 +Converged at iteration 23, L1 5.70703e-05, Linf 0.00596292, total time[s] 0.06885 +Converged at iteration 20, L1 8.25383e-05, Linf 0.00551297, total time[s] 0.055799 +Converged at iteration 23, L1 6.37061e-05, Linf 0.0028781, total time[s] 0.060471 +Converged at iteration 25, L1 8.37728e-05, Linf 0.00419909, total time[s] 0.067724 +Converged at iteration 28, L1 7.81532e-05, Linf 0.0055446, total time[s] 0.075121 +Converged at iteration 29, L1 7.46015e-05, Linf 0.00612424, total time[s] 0.095016 +Converged at iteration 27, L1 7.43928e-05, Linf 0.00396161, total time[s] 0.073836 +Converged at iteration 29, L1 7.78362e-05, Linf 0.00382388, total time[s] 0.081876 +Converged at iteration 29, L1 9.29212e-05, Linf 0.00277462, total time[s] 0.081512 +Converged at iteration 28, L1 8.35294e-05, Linf 0.00266473, total time[s] 0.07973 +Converged at iteration 33, L1 6.00178e-05, Linf 0.00579181, total time[s] 0.095201 +Converged at iteration 27, L1 6.98967e-05, Linf 0.00342725, total time[s] 0.071596 +Converged at iteration 24, L1 9.92331e-05, Linf 0.00243518, total time[s] 0.063861 +Converged at iteration 23, L1 7.52472e-05, Linf 0.00324601, total time[s] 0.061124 +Converged at iteration 39, L1 7.26742e-05, Linf 0.00672644, total time[s] 0.100073 +Converged at iteration 36, L1 7.00656e-05, Linf 0.00534624, total time[s] 0.095928 +Converged at iteration 24, L1 7.37232e-05, Linf 0.00367861, total time[s] 0.0624 +Converged at iteration 31, L1 5.58713e-05, Linf 0.005019, total time[s] 0.079018 +Converged at iteration 25, L1 8.87005e-05, Linf 0.00592485, total time[s] 0.065718 +Converged at iteration 20, L1 9.83877e-05, Linf 0.00391921, total time[s] 0.054779 +Converged at iteration 19, L1 6.15815e-05, Linf 0.00426952, total time[s] 0.052469 +Converged at iteration 20, L1 8.83095e-05, Linf 0.00608464, total time[s] 0.054435 +Converged at iteration 24, L1 7.42868e-05, Linf 0.00422487, total time[s] 0.065234 +Converged at iteration 24, L1 7.79665e-05, Linf 0.00506612, total time[s] 0.063969 +Converged at iteration 20, L1 6.22935e-05, Linf 0.00517397, total time[s] 0.054866 +Converged at iteration 16, L1 9.79322e-05, Linf 0.00481171, total time[s] 0.046099 +Converged at iteration 32, L1 6.84922e-05, Linf 0.00262463, total time[s] 0.089156 +Converged at iteration 19, L1 9.47421e-05, Linf 0.00687709, total time[s] 0.05935 +Converged at iteration 23, L1 7.69659e-05, Linf 0.00694577, total time[s] 0.063547 +Converged at iteration 26, L1 7.97087e-05, Linf 0.00593079, total time[s] 0.067983 +Converged at iteration 23, L1 5.69074e-05, Linf 0.00598982, total time[s] 0.063005 +Converged at iteration 20, L1 8.3655e-05, Linf 0.00551343, total time[s] 0.05471 +Converged at iteration 23, L1 6.51202e-05, Linf 0.00284104, total time[s] 0.075474 +Converged at iteration 25, L1 8.33977e-05, Linf 0.00403677, total time[s] 0.066947 +Converged at iteration 28, L1 7.71098e-05, Linf 0.00362179, total time[s] 0.076506 +Converged at iteration 29, L1 7.58769e-05, Linf 0.00618429, total time[s] 0.076027 +Converged at iteration 27, L1 7.52055e-05, Linf 0.0039772, total time[s] 0.074585 +Converged at iteration 29, L1 7.93118e-05, Linf 0.00389066, total time[s] 0.075047 +Converged at iteration 29, L1 9.42441e-05, Linf 0.00278023, total time[s] 0.075489 +Converged at iteration 28, L1 8.12823e-05, Linf 0.00260628, total time[s] 0.073254 +Converged at iteration 33, L1 5.84514e-05, Linf 0.00585253, total time[s] 0.090705 +Converged at iteration 27, L1 6.93254e-05, Linf 0.00353688, total time[s] 0.070765 +Converged at iteration 25, L1 7.12105e-05, Linf 0.0019353, total time[s] 0.072933 +Converged at iteration 23, L1 7.43267e-05, Linf 0.00318758, total time[s] 0.066413 +Converged at iteration 39, L1 7.10495e-05, Linf 0.00661583, total time[s] 0.114977 +Converged at iteration 36, L1 6.83169e-05, Linf 0.00546025, total time[s] 0.089155 +Converged at iteration 24, L1 7.30865e-05, Linf 0.00336418, total time[s] 0.062455 +Converged at iteration 30, L1 9.89303e-05, Linf 0.00615479, total time[s] 0.081588 +Converged at iteration 25, L1 9.24504e-05, Linf 0.00625687, total time[s] 0.071674 +Converged at iteration 21, L1 5.85866e-05, Linf 0.0034323, total time[s] 0.057424 +Converged at iteration 19, L1 5.99444e-05, Linf 0.00410072, total time[s] 0.050747 +Converged at iteration 20, L1 8.60055e-05, Linf 0.00645531, total time[s] 0.053782 +Converged at iteration 24, L1 7.17781e-05, Linf 0.00445213, total time[s] 0.063749 +Converged at iteration 24, L1 8.10153e-05, Linf 0.00523279, total time[s] 0.098095 +Converged at iteration 20, L1 6.49085e-05, Linf 0.00543472, total time[s] 0.068115 +Converged at iteration 16, L1 9.73214e-05, Linf 0.005069, total time[s] 0.050432 +Converged at iteration 32, L1 6.78432e-05, Linf 0.00271921, total time[s] 0.15964 +Converged at iteration 19, L1 9.45429e-05, Linf 0.00674427, total time[s] 0.05627 +Converged at iteration 23, L1 7.6891e-05, Linf 0.00688093, total time[s] 0.06918 +Converged at iteration 26, L1 8.0248e-05, Linf 0.00589274, total time[s] 0.07599 +Converged at iteration 23, L1 5.64244e-05, Linf 0.00595858, total time[s] 0.06083 +Converged at iteration 20, L1 8.53136e-05, Linf 0.00551674, total time[s] 0.053602 +Converged at iteration 23, L1 6.73932e-05, Linf 0.00285336, total time[s] 0.062528 +Converged at iteration 25, L1 8.39151e-05, Linf 0.00390449, total time[s] 0.069335 +Converged at iteration 28, L1 7.78227e-05, Linf 0.00378924, total time[s] 0.099714 +Converged at iteration 29, L1 7.75381e-05, Linf 0.00624139, total time[s] 0.098512 +Converged at iteration 27, L1 7.70201e-05, Linf 0.00395289, total time[s] 0.080033 +Converged at iteration 29, L1 8.09947e-05, Linf 0.00392803, total time[s] 0.082906 +Converged at iteration 29, L1 9.28378e-05, Linf 0.00278275, total time[s] 0.08557 +Converged at iteration 28, L1 8.05548e-05, Linf 0.00253966, total time[s] 0.086266 +Converged at iteration 32, L1 9.89846e-05, Linf 0.00696301, total time[s] 0.082723 +Converged at iteration 27, L1 7.16919e-05, Linf 0.00371331, total time[s] 0.070939 +Converged at iteration 25, L1 7.18212e-05, Linf 0.00198896, total time[s] 0.078267 +Converged at iteration 23, L1 7.42703e-05, Linf 0.00310043, total time[s] 0.074485 +Converged at iteration 39, L1 6.95651e-05, Linf 0.00658816, total time[s] 0.101119 +Converged at iteration 36, L1 6.66441e-05, Linf 0.00550811, total time[s] 0.101711 +Converged at iteration 24, L1 7.25446e-05, Linf 0.00309886, total time[s] 0.078639 +Converged at iteration 30, L1 9.65784e-05, Linf 0.00610828, total time[s] 0.078896 +Converged at iteration 25, L1 9.83832e-05, Linf 0.00655462, total time[s] 0.066854 +Converged at iteration 21, L1 6.49394e-05, Linf 0.00333568, total time[s] 0.068367 +Converged at iteration 19, L1 5.87454e-05, Linf 0.00392582, total time[s] 0.05626 +Converged at iteration 20, L1 8.2895e-05, Linf 0.00614809, total time[s] 0.07163 +Converged at iteration 24, L1 6.87613e-05, Linf 0.0035019, total time[s] 0.087377 +Converged at iteration 24, L1 8.48486e-05, Linf 0.00539649, total time[s] 0.082628 +Converged at iteration 20, L1 6.94713e-05, Linf 0.00568772, total time[s] 0.065028 +Converged at iteration 16, L1 9.70664e-05, Linf 0.00537972, total time[s] 0.071883 +Converged at iteration 32, L1 6.57027e-05, Linf 0.00264274, total time[s] 0.115232 +Converged at iteration 19, L1 9.44599e-05, Linf 0.00657894, total time[s] 0.05171 +Converged at iteration 23, L1 7.68259e-05, Linf 0.00666741, total time[s] 0.061121 +Converged at iteration 26, L1 8.13512e-05, Linf 0.00586155, total time[s] 0.068757 +Converged at iteration 23, L1 5.60111e-05, Linf 0.00597805, total time[s] 0.06365 +Converged at iteration 20, L1 8.86819e-05, Linf 0.00552439, total time[s] 0.054601 +Converged at iteration 23, L1 6.95978e-05, Linf 0.00280976, total time[s] 0.07117 +Converged at iteration 25, L1 8.48198e-05, Linf 0.00378668, total time[s] 0.07334 +Converged at iteration 28, L1 7.92614e-05, Linf 0.00400952, total time[s] 0.07633 +Converged at iteration 29, L1 7.96821e-05, Linf 0.00631224, total time[s] 0.08482 +Converged at iteration 27, L1 7.95352e-05, Linf 0.00392753, total time[s] 0.101273 +Converged at iteration 29, L1 8.28353e-05, Linf 0.00402089, total time[s] 0.092975 +Converged at iteration 29, L1 9.36891e-05, Linf 0.00277519, total time[s] 0.098055 +Converged at iteration 28, L1 8.25426e-05, Linf 0.00247734, total time[s] 0.079226 +Converged at iteration 32, L1 9.61801e-05, Linf 0.00693263, total time[s] 0.150471 +Converged at iteration 27, L1 7.58109e-05, Linf 0.00407291, total time[s] 0.075847 +Converged at iteration 25, L1 6.93965e-05, Linf 0.00201742, total time[s] 0.065935 +Converged at iteration 23, L1 7.51773e-05, Linf 0.00299987, total time[s] 0.061513 +Converged at iteration 39, L1 6.85024e-05, Linf 0.00654898, total time[s] 0.100517 +Converged at iteration 36, L1 6.37861e-05, Linf 0.00555047, total time[s] 0.109107 +Converged at iteration 24, L1 7.26953e-05, Linf 0.0030808, total time[s] 0.066082 +Converged at iteration 30, L1 9.41388e-05, Linf 0.00605407, total time[s] 0.076469 +Converged at iteration 26, L1 5.93297e-05, Linf 0.00588344, total time[s] 0.068158 +Converged at iteration 21, L1 7.50929e-05, Linf 0.00339937, total time[s] 0.056844 +Converged at iteration 19, L1 5.76873e-05, Linf 0.00390945, total time[s] 0.051288 +Converged at iteration 20, L1 7.96247e-05, Linf 0.00641004, total time[s] 0.053877 +Converged at iteration 24, L1 6.54766e-05, Linf 0.00398219, total time[s] 0.06565 +Converged at iteration 24, L1 8.91795e-05, Linf 0.00563871, total time[s] 0.066366 +Converged at iteration 20, L1 7.45592e-05, Linf 0.00581735, total time[s] 0.053423 +Converged at iteration 16, L1 9.67945e-05, Linf 0.00574869, total time[s] 0.043475 +Converged at iteration 32, L1 6.26261e-05, Linf 0.00266325, total time[s] 0.0893 +Converged at iteration 19, L1 9.38669e-05, Linf 0.00640282, total time[s] 0.058906 +Converged at iteration 23, L1 7.59767e-05, Linf 0.00645806, total time[s] 0.06044 +Converged at iteration 26, L1 8.20842e-05, Linf 0.00584248, total time[s] 0.071602 +Converged at iteration 23, L1 5.51917e-05, Linf 0.00599702, total time[s] 0.067079 +Converged at iteration 20, L1 9.3146e-05, Linf 0.00550894, total time[s] 0.05805 +Converged at iteration 23, L1 7.1741e-05, Linf 0.00264767, total time[s] 0.061253 +Converged at iteration 25, L1 8.59697e-05, Linf 0.00367474, total time[s] 0.065556 +Converged at iteration 28, L1 8.08848e-05, Linf 0.00429683, total time[s] 0.078573 +Converged at iteration 29, L1 8.25983e-05, Linf 0.0063916, total time[s] 0.078421 +Converged at iteration 27, L1 8.2806e-05, Linf 0.00390239, total time[s] 0.070411 +Converged at iteration 29, L1 8.53446e-05, Linf 0.00406244, total time[s] 0.074055 +Converged at iteration 29, L1 9.3697e-05, Linf 0.00276547, total time[s] 0.080754 +Converged at iteration 28, L1 8.0884e-05, Linf 0.00241702, total time[s] 0.078896 +Converged at iteration 32, L1 9.30233e-05, Linf 0.00687844, total time[s] 0.102175 +Converged at iteration 27, L1 8.12411e-05, Linf 0.00449411, total time[s] 0.07692 +Converged at iteration 24, L1 9.91025e-05, Linf 0.00261596, total time[s] 0.077365 +Converged at iteration 23, L1 7.71568e-05, Linf 0.00286106, total time[s] 0.077456 +Converged at iteration 39, L1 6.6578e-05, Linf 0.00649362, total time[s] 0.107603 +Converged at iteration 36, L1 5.98898e-05, Linf 0.00555943, total time[s] 0.100577 +Converged at iteration 24, L1 7.46106e-05, Linf 0.00293867, total time[s] 0.064711 +Converged at iteration 30, L1 9.12567e-05, Linf 0.00598938, total time[s] 0.076609 +Converged at iteration 26, L1 6.46219e-05, Linf 0.00632783, total time[s] 0.066758 +Converged at iteration 21, L1 8.99441e-05, Linf 0.0043486, total time[s] 0.061985 +Converged at iteration 19, L1 5.71468e-05, Linf 0.00397544, total time[s] 0.06214 +Converged at iteration 20, L1 7.62116e-05, Linf 0.00595789, total time[s] 0.069566 +Converged at iteration 24, L1 6.20275e-05, Linf 0.00327183, total time[s] 0.094184 +Converged at iteration 24, L1 9.5133e-05, Linf 0.00589979, total time[s] 0.101884 +Converged at iteration 20, L1 8.10648e-05, Linf 0.00595911, total time[s] 0.065914 +Converged at iteration 16, L1 9.6595e-05, Linf 0.00611285, total time[s] 0.065328 +Converged at iteration 32, L1 5.78921e-05, Linf 0.00267461, total time[s] 0.096925 +Converged at iteration 19, L1 9.28052e-05, Linf 0.00637196, total time[s] 0.054276 +Converged at iteration 23, L1 7.48165e-05, Linf 0.0062309, total time[s] 0.062162 +Converged at iteration 26, L1 8.35837e-05, Linf 0.00582588, total time[s] 0.076813 +Converged at iteration 23, L1 5.4822e-05, Linf 0.00600528, total time[s] 0.061406 +Converged at iteration 20, L1 9.90155e-05, Linf 0.00560825, total time[s] 0.054467 +Converged at iteration 23, L1 7.35765e-05, Linf 0.00256223, total time[s] 0.062825 +Converged at iteration 25, L1 8.7252e-05, Linf 0.00358423, total time[s] 0.066237 +Converged at iteration 28, L1 8.30081e-05, Linf 0.0044748, total time[s] 0.072005 +Converged at iteration 29, L1 8.58515e-05, Linf 0.00645102, total time[s] 0.074812 +Converged at iteration 27, L1 8.60962e-05, Linf 0.00391839, total time[s] 0.070654 +Converged at iteration 29, L1 8.74469e-05, Linf 0.0041477, total time[s] 0.075734 +Converged at iteration 29, L1 9.4109e-05, Linf 0.00277906, total time[s] 0.078157 +Converged at iteration 28, L1 8.05738e-05, Linf 0.0023661, total time[s] 0.073177 +Converged at iteration 32, L1 8.89823e-05, Linf 0.00680199, total time[s] 0.083759 +Converged at iteration 27, L1 8.7254e-05, Linf 0.00499544, total time[s] 0.071534 +Converged at iteration 24, L1 9.96195e-05, Linf 0.00261427, total time[s] 0.062881 +Converged at iteration 23, L1 7.92492e-05, Linf 0.00273948, total time[s] 0.060411 +Converged at iteration 39, L1 6.49362e-05, Linf 0.00642255, total time[s] 0.099754 +Converged at iteration 35, L1 9.98719e-05, Linf 0.00647777, total time[s] 0.0951 +Converged at iteration 24, L1 7.65472e-05, Linf 0.0028382, total time[s] 0.064217 +Converged at iteration 30, L1 8.78221e-05, Linf 0.0059133, total time[s] 0.080906 +Converged at iteration 26, L1 6.97576e-05, Linf 0.00682679, total time[s] 0.067024 +Converged at iteration 22, L1 5.90196e-05, Linf 0.00433291, total time[s] 0.068356 +Converged at iteration 19, L1 5.73048e-05, Linf 0.00400996, total time[s] 0.06799 +Converged at iteration 20, L1 7.30849e-05, Linf 0.0056326, total time[s] 0.067123 +Converged at iteration 24, L1 5.87581e-05, Linf 0.00322772, total time[s] 0.088548 +Converged at iteration 24, L1 9.98562e-05, Linf 0.00617945, total time[s] 0.074181 +Converged at iteration 20, L1 8.82642e-05, Linf 0.00610839, total time[s] 0.056673 +Converged at iteration 16, L1 9.63913e-05, Linf 0.00644237, total time[s] 0.062531 +Converged at iteration 31, L1 9.37873e-05, Linf 0.003258, total time[s] 0.107332 +Converged at iteration 19, L1 9.07526e-05, Linf 0.00604136, total time[s] 0.051152 +Converged at iteration 23, L1 7.31727e-05, Linf 0.00596067, total time[s] 0.059977 +Converged at iteration 26, L1 8.47703e-05, Linf 0.0057915, total time[s] 0.066864 +Converged at iteration 23, L1 5.54827e-05, Linf 0.00605889, total time[s] 0.068438 +Converged at iteration 21, L1 5.74454e-05, Linf 0.00472432, total time[s] 0.081097 +Converged at iteration 23, L1 7.37003e-05, Linf 0.00245317, total time[s] 0.077444 +Converged at iteration 25, L1 8.7772e-05, Linf 0.00348774, total time[s] 0.091215 +Converged at iteration 28, L1 8.56653e-05, Linf 0.00465281, total time[s] 0.088717 +Converged at iteration 29, L1 8.98809e-05, Linf 0.00656395, total time[s] 0.086253 +Converged at iteration 27, L1 8.95645e-05, Linf 0.00387178, total time[s] 0.08289 +Converged at iteration 29, L1 8.86553e-05, Linf 0.00423249, total time[s] 0.080509 +Converged at iteration 29, L1 9.51753e-05, Linf 0.00282454, total time[s] 0.078157 +Converged at iteration 28, L1 8.04374e-05, Linf 0.00232846, total time[s] 0.072719 +Converged at iteration 32, L1 8.36439e-05, Linf 0.00670157, total time[s] 0.083525 +Converged at iteration 27, L1 9.54813e-05, Linf 0.00555361, total time[s] 0.070269 +Converged at iteration 25, L1 6.47034e-05, Linf 0.00206509, total time[s] 0.065544 +Converged at iteration 23, L1 8.23584e-05, Linf 0.00264941, total time[s] 0.06028 +Converged at iteration 39, L1 6.1736e-05, Linf 0.00631311, total time[s] 0.102114 +Converged at iteration 35, L1 8.85316e-05, Linf 0.0064575, total time[s] 0.102462 +Converged at iteration 24, L1 7.92033e-05, Linf 0.00287568, total time[s] 0.063798 +Converged at iteration 30, L1 8.34346e-05, Linf 0.00582313, total time[s] 0.078896 +Converged at iteration 26, L1 7.53615e-05, Linf 0.00737129, total time[s] 0.068007 +Converged at iteration 22, L1 7.69574e-05, Linf 0.00547104, total time[s] 0.062015 +Converged at iteration 19, L1 5.82492e-05, Linf 0.0040764, total time[s] 0.059597 +Converged at iteration 20, L1 6.97783e-05, Linf 0.00537294, total time[s] 0.070672 +Converged at iteration 24, L1 5.59111e-05, Linf 0.0031377, total time[s] 0.09636 +Converged at iteration 25, L1 5.68205e-05, Linf 0.00523381, total time[s] 0.079521 +Converged at iteration 20, L1 9.65008e-05, Linf 0.00626045, total time[s] 0.062565 +Converged at iteration 16, L1 9.72044e-05, Linf 0.0066607, total time[s] 0.056111 +Converged at iteration 31, L1 8.85798e-05, Linf 0.00331537, total time[s] 0.110563 +Converged at iteration 19, L1 8.64335e-05, Linf 0.00572206, total time[s] 0.052351 +Converged at iteration 23, L1 7.11851e-05, Linf 0.00569135, total time[s] 0.061227 +Converged at iteration 26, L1 8.57666e-05, Linf 0.00572002, total time[s] 0.067388 +Converged at iteration 23, L1 5.64735e-05, Linf 0.00609609, total time[s] 0.059828 +Converged at iteration 21, L1 6.26558e-05, Linf 0.00472648, total time[s] 0.055311 +Converged at iteration 23, L1 7.34573e-05, Linf 0.0023124, total time[s] 0.059944 +Converged at iteration 25, L1 8.73505e-05, Linf 0.00340779, total time[s] 0.066745 +Converged at iteration 28, L1 8.90313e-05, Linf 0.00495028, total time[s] 0.074368 +Converged at iteration 29, L1 9.36615e-05, Linf 0.00665563, total time[s] 0.07647 +Converged at iteration 27, L1 9.28236e-05, Linf 0.00390119, total time[s] 0.069564 +Converged at iteration 29, L1 9.04743e-05, Linf 0.00433602, total time[s] 0.074232 +Converged at iteration 29, L1 9.6021e-05, Linf 0.00286511, total time[s] 0.07662 +Converged at iteration 28, L1 8.11534e-05, Linf 0.00228532, total time[s] 0.071522 +Converged at iteration 32, L1 7.77516e-05, Linf 0.00668129, total time[s] 0.080642 +Converged at iteration 28, L1 6.07772e-05, Linf 0.00516732, total time[s] 0.071299 +Converged at iteration 25, L1 6.86571e-05, Linf 0.00270174, total time[s] 0.064833 +Converged at iteration 23, L1 8.61945e-05, Linf 0.00256696, total time[s] 0.060401 +Converged at iteration 39, L1 5.6192e-05, Linf 0.00617789, total time[s] 0.102439 +Converged at iteration 35, L1 8.0972e-05, Linf 0.00643712, total time[s] 0.09362 +Converged at iteration 24, L1 8.3584e-05, Linf 0.00299218, total time[s] 0.067182 +Converged at iteration 30, L1 7.8767e-05, Linf 0.00572407, total time[s] 0.076324 +Converged at iteration 26, L1 8.05243e-05, Linf 0.00796314, total time[s] 0.068676 +Converged at iteration 22, L1 9.92004e-05, Linf 0.00651766, total time[s] 0.058344 +Converged at iteration 19, L1 6.07744e-05, Linf 0.00414077, total time[s] 0.06045 +Converged at iteration 20, L1 6.70001e-05, Linf 0.00485998, total time[s] 0.072393 +Converged at iteration 24, L1 5.41642e-05, Linf 0.00450483, total time[s] 0.08343 +Converged at iteration 25, L1 6.0102e-05, Linf 0.00550666, total time[s] 0.103589 +Converged at iteration 21, L1 5.42437e-05, Linf 0.00535547, total time[s] 0.146369 +Converged at iteration 16, L1 9.83552e-05, Linf 0.00661074, total time[s] 0.071667 +Converged at iteration 31, L1 8.44706e-05, Linf 0.00331271, total time[s] 0.083783 +Converged at iteration 19, L1 8.01686e-05, Linf 0.00554092, total time[s] 0.052741 +Converged at iteration 23, L1 6.85337e-05, Linf 0.00530289, total time[s] 0.062968 +Converged at iteration 26, L1 8.7701e-05, Linf 0.00562273, total time[s] 0.070361 +Converged at iteration 23, L1 5.75988e-05, Linf 0.00613279, total time[s] 0.069034 +Converged at iteration 21, L1 6.82083e-05, Linf 0.0046471, total time[s] 0.066484 +Converged at iteration 23, L1 7.19483e-05, Linf 0.0021377, total time[s] 0.071635 +Converged at iteration 25, L1 8.8109e-05, Linf 0.00333997, total time[s] 0.078064 +Converged at iteration 28, L1 9.23677e-05, Linf 0.00522278, total time[s] 0.078404 +Converged at iteration 29, L1 9.83184e-05, Linf 0.00676772, total time[s] 0.080874 +Converged at iteration 27, L1 9.63252e-05, Linf 0.00368104, total time[s] 0.070601 +Converged at iteration 29, L1 9.39593e-05, Linf 0.00447161, total time[s] 0.075323 +Converged at iteration 29, L1 9.71351e-05, Linf 0.0029127, total time[s] 0.075595 +Converged at iteration 28, L1 8.25327e-05, Linf 0.0022429, total time[s] 0.073615 +Converged at iteration 32, L1 7.17899e-05, Linf 0.00645591, total time[s] 0.081567 +Converged at iteration 28, L1 6.24418e-05, Linf 0.00573775, total time[s] 0.074388 +Converged at iteration 25, L1 7.54083e-05, Linf 0.00348922, total time[s] 0.065864 +Converged at iteration 23, L1 9.02971e-05, Linf 0.00252166, total time[s] 0.061021 +Converged at iteration 38, L1 9.97054e-05, Linf 0.00725171, total time[s] 0.097668 +Converged at iteration 35, L1 6.93056e-05, Linf 0.00632439, total time[s] 0.095977 +Converged at iteration 24, L1 8.76181e-05, Linf 0.00312639, total time[s] 0.064506 +Converged at iteration 30, L1 7.26668e-05, Linf 0.00563845, total time[s] 0.077025 +Converged at iteration 26, L1 8.54784e-05, Linf 0.00847274, total time[s] 0.068891 +Converged at iteration 23, L1 6.73225e-05, Linf 0.00626867, total time[s] 0.060886 +Converged at iteration 19, L1 6.39041e-05, Linf 0.00426994, total time[s] 0.059073 +Converged at iteration 20, L1 6.46793e-05, Linf 0.00434298, total time[s] 0.067496 +Converged at iteration 23, L1 9.94788e-05, Linf 0.00450477, total time[s] 0.072407 +Converged at iteration 25, L1 6.46106e-05, Linf 0.00578149, total time[s] 0.075099 +Converged at iteration 21, L1 5.7778e-05, Linf 0.00551287, total time[s] 0.066979 +Converged at iteration 16, L1 9.91904e-05, Linf 0.00683524, total time[s] 0.054788 +Converged at iteration 31, L1 8.11629e-05, Linf 0.00327434, total time[s] 0.100102 +Converged at iteration 19, L1 7.30301e-05, Linf 0.00525772, total time[s] 0.068424 +Converged at iteration 23, L1 6.55454e-05, Linf 0.00499384, total time[s] 0.079663 +Converged at iteration 26, L1 8.8686e-05, Linf 0.00551648, total time[s] 0.08795 +Converged at iteration 23, L1 5.88088e-05, Linf 0.00615811, total time[s] 0.092586 +Converged at iteration 21, L1 7.38045e-05, Linf 0.0045175, total time[s] 0.059651 +Converged at iteration 23, L1 7.0379e-05, Linf 0.00195901, total time[s] 0.069748 +Converged at iteration 25, L1 8.8335e-05, Linf 0.00326277, total time[s] 0.074425 +Converged at iteration 28, L1 9.50535e-05, Linf 0.00555238, total time[s] 0.074327 +Converged at iteration 30, L1 5.13049e-05, Linf 0.00433416, total time[s] 0.078063 +Converged at iteration 27, L1 9.85077e-05, Linf 0.00360547, total time[s] 0.072305 +Converged at iteration 29, L1 9.86806e-05, Linf 0.00464428, total time[s] 0.075682 +Converged at iteration 29, L1 9.77831e-05, Linf 0.00291961, total time[s] 0.082198 +Converged at iteration 28, L1 8.42709e-05, Linf 0.00221777, total time[s] 0.324947 +Converged at iteration 32, L1 6.33005e-05, Linf 0.00628334, total time[s] 0.108938 +Converged at iteration 28, L1 6.80384e-05, Linf 0.00631057, total time[s] 0.072975 +Converged at iteration 25, L1 8.29417e-05, Linf 0.00412101, total time[s] 0.068147 +Converged at iteration 23, L1 9.53659e-05, Linf 0.00263562, total time[s] 0.067666 +Converged at iteration 38, L1 8.9295e-05, Linf 0.00707587, total time[s] 0.095232 +Converged at iteration 35, L1 5.4162e-05, Linf 0.00565095, total time[s] 0.091492 +Converged at iteration 24, L1 9.15917e-05, Linf 0.00327055, total time[s] 0.075204 +Converged at iteration 30, L1 6.70904e-05, Linf 0.00557153, total time[s] 0.079362 +Converged at iteration 26, L1 9.24061e-05, Linf 0.0091505, total time[s] 0.068295 +Converged at iteration 23, L1 8.73155e-05, Linf 0.00735435, total time[s] 0.061912 +Converged at iteration 19, L1 6.8904e-05, Linf 0.00451989, total time[s] 0.068231 +Converged at iteration 20, L1 6.12847e-05, Linf 0.00406175, total time[s] 0.058874 +Converged at iteration 23, L1 9.36874e-05, Linf 0.0045313, total time[s] 0.077346 +Converged at iteration 25, L1 6.86479e-05, Linf 0.00608491, total time[s] 0.071227 +Converged at iteration 21, L1 6.51212e-05, Linf 0.0057086, total time[s] 0.077245 +Converged at iteration 17, L1 5.49055e-05, Linf 0.0048446, total time[s] 0.051015 +Converged at iteration 31, L1 7.76308e-05, Linf 0.00336828, total time[s] 0.090127 +Converged at iteration 19, L1 6.22907e-05, Linf 0.00496341, total time[s] 0.063509 +Converged at iteration 22, L1 9.26242e-05, Linf 0.00523103, total time[s] 0.068385 +Converged at iteration 26, L1 9.11932e-05, Linf 0.0054002, total time[s] 0.069976 +Converged at iteration 23, L1 6.05909e-05, Linf 0.00627075, total time[s] 0.065787 +Converged at iteration 21, L1 8.07046e-05, Linf 0.00442284, total time[s] 0.059914 +Converged at iteration 23, L1 6.71339e-05, Linf 0.0016733, total time[s] 0.062054 +Converged at iteration 25, L1 8.71032e-05, Linf 0.00311729, total time[s] 0.067141 +Converged at iteration 28, L1 9.95442e-05, Linf 0.00600107, total time[s] 0.073804 +Converged at iteration 30, L1 5.41846e-05, Linf 0.00422456, total time[s] 0.078229 +Converged at iteration 28, L1 6.06707e-05, Linf 0.00434217, total time[s] 0.073497 +Converged at iteration 30, L1 6.3061e-05, Linf 0.00390716, total time[s] 0.078765 +Converged at iteration 29, L1 9.73178e-05, Linf 0.00290526, total time[s] 0.076268 +Converged at iteration 28, L1 8.79515e-05, Linf 0.00221575, total time[s] 0.074623 +Converged at iteration 31, L1 9.41234e-05, Linf 0.00751648, total time[s] 0.081619 +Converged at iteration 28, L1 7.89518e-05, Linf 0.00707481, total time[s] 0.074206 +Converged at iteration 25, L1 9.59724e-05, Linf 0.00504292, total time[s] 0.066762 +Converged at iteration 24, L1 5.63818e-05, Linf 0.00201465, total time[s] 0.094688 +Converged at iteration 38, L1 7.82951e-05, Linf 0.00683369, total time[s] 0.121711 +Converged at iteration 34, L1 9.01942e-05, Linf 0.0070114, total time[s] 0.108195 +Converged at iteration 24, L1 9.32744e-05, Linf 0.00336611, total time[s] 0.067158 +Converged at iteration 30, L1 6.15226e-05, Linf 0.00544962, total time[s] 0.078993 +Converged at iteration 26, L1 9.89215e-05, Linf 0.00971899, total time[s] 0.070942 +Converged at iteration 24, L1 5.40047e-05, Linf 0.00689106, total time[s] 0.065795 +Converged at iteration 19, L1 7.46006e-05, Linf 0.00503998, total time[s] 0.065421 +Converged at iteration 20, L1 5.77911e-05, Linf 0.00391061, total time[s] 0.08756 +Converged at iteration 23, L1 9.20084e-05, Linf 0.00455976, total time[s] 0.098279 +Converged at iteration 25, L1 7.57336e-05, Linf 0.00882594, total time[s] 0.104925 +Converged at iteration 21, L1 6.85375e-05, Linf 0.00583732, total time[s] 0.061885 +Converged at iteration 17, L1 5.60493e-05, Linf 0.00499169, total time[s] 0.073787 +Converged at iteration 31, L1 7.56139e-05, Linf 0.00349895, total time[s] 0.131736 +Converged at iteration 18, L1 9.05577e-05, Linf 0.00567873, total time[s] 0.058426 +Converged at iteration 22, L1 8.28271e-05, Linf 0.00445473, total time[s] 0.057497 +Converged at iteration 26, L1 9.52372e-05, Linf 0.00530572, total time[s] 0.075811 +Converged at iteration 23, L1 6.32416e-05, Linf 0.00638684, total time[s] 0.067047 +Converged at iteration 21, L1 8.74093e-05, Linf 0.00429972, total time[s] 0.061227 +Converged at iteration 23, L1 6.45542e-05, Linf 0.00174443, total time[s] 0.064614 +Converged at iteration 25, L1 8.39312e-05, Linf 0.0029126, total time[s] 0.066436 +Converged at iteration 29, L1 6.67649e-05, Linf 0.00410591, total time[s] 0.114167 +Converged at iteration 30, L1 5.77496e-05, Linf 0.00429165, total time[s] 0.087729 +Converged at iteration 28, L1 6.32491e-05, Linf 0.00420271, total time[s] 0.077638 +Converged at iteration 30, L1 6.51325e-05, Linf 0.00403039, total time[s] 0.098385 +Converged at iteration 29, L1 9.78775e-05, Linf 0.00290702, total time[s] 0.088359 +Converged at iteration 28, L1 9.26092e-05, Linf 0.00215917, total time[s] 0.090173 +Converged at iteration 31, L1 8.52813e-05, Linf 0.00740743, total time[s] 0.088391 +Converged at iteration 28, L1 8.72337e-05, Linf 0.00770664, total time[s] 0.079515 +Converged at iteration 26, L1 6.265e-05, Linf 0.00459609, total time[s] 0.072149 +Converged at iteration 24, L1 5.95816e-05, Linf 0.00214201, total time[s] 0.066545 +Converged at iteration 38, L1 6.83537e-05, Linf 0.00662084, total time[s] 0.098587 +Converged at iteration 34, L1 8.1672e-05, Linf 0.00684017, total time[s] 0.102978 +Converged at iteration 24, L1 9.56582e-05, Linf 0.00343968, total time[s] 0.082148 +Converged at iteration 30, L1 5.77699e-05, Linf 0.00539469, total time[s] 0.087902 +Converged at iteration 27, L1 5.24934e-05, Linf 0.00808365, total time[s] 0.069407 +Converged at iteration 24, L1 6.35471e-05, Linf 0.00763391, total time[s] 0.064346 +Converged at iteration 19, L1 8.03664e-05, Linf 0.00555653, total time[s] 0.059829 +Converged at iteration 20, L1 5.42192e-05, Linf 0.00375388, total time[s] 0.072879 +Converged at iteration 23, L1 9.11961e-05, Linf 0.00461109, total time[s] 0.092604 +Converged at iteration 25, L1 7.60718e-05, Linf 0.00651609, total time[s] 0.0823 +Converged at iteration 21, L1 7.36676e-05, Linf 0.00595255, total time[s] 0.080041 +Converged at iteration 17, L1 5.63167e-05, Linf 0.00504939, total time[s] 0.058757 +Converged at iteration 31, L1 7.41573e-05, Linf 0.00358572, total time[s] 0.105306 +Converged at iteration 18, L1 7.45288e-05, Linf 0.00519408, total time[s] 0.048752 +Converged at iteration 22, L1 7.26386e-05, Linf 0.00430543, total time[s] 0.055793 +Converged at iteration 26, L1 9.87495e-05, Linf 0.0052384, total time[s] 0.068748 +Converged at iteration 23, L1 6.63474e-05, Linf 0.00648699, total time[s] 0.078429 +Converged at iteration 21, L1 9.34669e-05, Linf 0.0041137, total time[s] 0.059645 +Converged at iteration 22, L1 9.70176e-05, Linf 0.00264601, total time[s] 0.061664 +Converged at iteration 25, L1 8.03579e-05, Linf 0.00278866, total time[s] 0.065662 +Converged at iteration 29, L1 6.90991e-05, Linf 0.00493128, total time[s] 0.076658 +Converged at iteration 30, L1 6.04957e-05, Linf 0.00433392, total time[s] 0.075834 +Converged at iteration 28, L1 6.46902e-05, Linf 0.00421831, total time[s] 0.073936 +Converged at iteration 30, L1 6.66754e-05, Linf 0.00419642, total time[s] 0.07903 +Converged at iteration 29, L1 9.85088e-05, Linf 0.0029379, total time[s] 0.073523 +Converged at iteration 28, L1 9.83885e-05, Linf 0.00207818, total time[s] 0.075765 +Converged at iteration 31, L1 8.04049e-05, Linf 0.00719475, total time[s] 0.082772 +Converged at iteration 28, L1 9.55663e-05, Linf 0.00832346, total time[s] 0.070929 +Converged at iteration 26, L1 7.13225e-05, Linf 0.00513798, total time[s] 0.069005 +Converged at iteration 24, L1 6.29502e-05, Linf 0.0022779, total time[s] 0.061819 +Converged at iteration 38, L1 6.16557e-05, Linf 0.00644436, total time[s] 0.108078 +Converged at iteration 34, L1 7.71073e-05, Linf 0.00664252, total time[s] 0.103939 +Converged at iteration 24, L1 9.73453e-05, Linf 0.00349264, total time[s] 0.063148 +Converged at iteration 29, L1 9.99803e-05, Linf 0.00686151, total time[s] 0.074788 +Converged at iteration 27, L1 5.53419e-05, Linf 0.00850356, total time[s] 0.078672 +Converged at iteration 24, L1 7.24169e-05, Linf 0.00856348, total time[s] 0.099008 +Converged at iteration 19, L1 8.66566e-05, Linf 0.00495138, total time[s] 0.067252 +Converged at iteration 20, L1 5.12499e-05, Linf 0.00344745, total time[s] 0.092043 +Converged at iteration 23, L1 9.05211e-05, Linf 0.00465868, total time[s] 0.087095 +Converged at iteration 25, L1 8.1197e-05, Linf 0.00670012, total time[s] 0.080356 +Converged at iteration 21, L1 7.82267e-05, Linf 0.00605005, total time[s] 0.065235 +Converged at iteration 17, L1 5.6853e-05, Linf 0.00518282, total time[s] 0.054548 +Converged at iteration 31, L1 7.24914e-05, Linf 0.00370216, total time[s] 0.08217 +Converged at iteration 17, L1 9.96807e-05, Linf 0.00658148, total time[s] 0.046093 +Converged at iteration 21, L1 9.50213e-05, Linf 0.00447474, total time[s] 0.055749 +Converged at iteration 27, L1 5.53058e-05, Linf 0.00244741, total time[s] 0.069358 +Converged at iteration 23, L1 8.03976e-05, Linf 0.0066044, total time[s] 0.060591 +Converged at iteration 22, L1 5.40812e-05, Linf 0.00307579, total time[s] 0.059594 +Converged at iteration 22, L1 9.03317e-05, Linf 0.00280292, total time[s] 0.059068 +Converged at iteration 25, L1 7.75807e-05, Linf 0.00246991, total time[s] 0.07429 +Converged at iteration 29, L1 7.03674e-05, Linf 0.00471988, total time[s] 0.081973 +Converged at iteration 30, L1 6.45169e-05, Linf 0.00444849, total time[s] 0.084983 +Converged at iteration 28, L1 6.64545e-05, Linf 0.00364662, total time[s] 0.073714 +Converged at iteration 30, L1 6.90256e-05, Linf 0.00425756, total time[s] 0.075782 +Converged at iteration 29, L1 9.86342e-05, Linf 0.00294675, total time[s] 0.07756 +Converged at iteration 29, L1 6.16352e-05, Linf 0.0013638, total time[s] 0.074277 +Converged at iteration 31, L1 7.23916e-05, Linf 0.00708948, total time[s] 0.078411 +Converged at iteration 29, L1 5.18522e-05, Linf 0.00725126, total time[s] 0.074374 +Converged at iteration 26, L1 8.01653e-05, Linf 0.00587472, total time[s] 0.071345 +Converged at iteration 24, L1 6.71862e-05, Linf 0.002385, total time[s] 0.063736 +Converged at iteration 38, L1 5.73134e-05, Linf 0.00620984, total time[s] 0.097792 +Converged at iteration 34, L1 7.39108e-05, Linf 0.00638827, total time[s] 0.101546 +Converged at iteration 24, L1 9.80557e-05, Linf 0.00353025, total time[s] 0.06562 +Converged at iteration 29, L1 9.6575e-05, Linf 0.00677417, total time[s] 0.075921 +Converged at iteration 27, L1 5.75617e-05, Linf 0.00893514, total time[s] 0.072065 +Converged at iteration 24, L1 8.20308e-05, Linf 0.00939823, total time[s] 0.086646 +Converged at iteration 19, L1 9.0576e-05, Linf 0.00482352, total time[s] 0.067714 +Converged at iteration 20, L1 4.87986e-05, Linf 0.00336242, total time[s] 0.081617 +Converged at iteration 23, L1 8.95525e-05, Linf 0.00471689, total time[s] 0.07992 +Converged at iteration 25, L1 8.0937e-05, Linf 0.00686954, total time[s] 0.141067 +Converged at iteration 21, L1 8.21212e-05, Linf 0.00619357, total time[s] 0.082711 +Converged at iteration 17, L1 5.68839e-05, Linf 0.00501372, total time[s] 0.06904 +Converged at iteration 31, L1 7.15956e-05, Linf 0.00382024, total time[s] 0.086881 +Converged at iteration 17, L1 7.42213e-05, Linf 0.00592708, total time[s] 0.048599 +Converged at iteration 21, L1 7.82592e-05, Linf 0.003778, total time[s] 0.05953 +Converged at iteration 27, L1 5.49888e-05, Linf 0.00242869, total time[s] 0.072281 +Converged at iteration 23, L1 7.43108e-05, Linf 0.00673702, total time[s] 0.062831 +Converged at iteration 22, L1 5.78988e-05, Linf 0.00328394, total time[s] 0.060701 +Converged at iteration 22, L1 8.18556e-05, Linf 0.00284815, total time[s] 0.060006 +Converged at iteration 25, L1 7.4379e-05, Linf 0.00229121, total time[s] 0.067984 +Converged at iteration 29, L1 7.09374e-05, Linf 0.00492247, total time[s] 0.077584 +Converged at iteration 30, L1 6.85184e-05, Linf 0.00461659, total time[s] 0.091816 +Converged at iteration 28, L1 6.73927e-05, Linf 0.00370193, total time[s] 0.086155 +Converged at iteration 30, L1 7.2322e-05, Linf 0.00445168, total time[s] 0.110198 +Converged at iteration 29, L1 9.86644e-05, Linf 0.00294016, total time[s] 0.085228 +Converged at iteration 29, L1 6.42081e-05, Linf 0.00131975, total time[s] 0.087269 +Converged at iteration 31, L1 6.4491e-05, Linf 0.00682513, total time[s] 0.084974 +Converged at iteration 29, L1 5.55509e-05, Linf 0.00777436, total time[s] 0.081205 +Converged at iteration 26, L1 8.94169e-05, Linf 0.00658126, total time[s] 0.079014 +Converged at iteration 24, L1 7.06028e-05, Linf 0.00249824, total time[s] 0.063949 +Converged at iteration 38, L1 5.38475e-05, Linf 0.00592072, total time[s] 0.106025 +Converged at iteration 34, L1 7.00225e-05, Linf 0.00609333, total time[s] 0.096256 +Converged at iteration 24, L1 9.88492e-05, Linf 0.00357373, total time[s] 0.062337 +Converged at iteration 29, L1 9.38374e-05, Linf 0.006678, total time[s] 0.085578 +Converged at iteration 27, L1 6.04587e-05, Linf 0.00938763, total time[s] 0.073734 +Converged at iteration 24, L1 9.186e-05, Linf 0.0102643, total time[s] 0.071642 +Converged at iteration 19, L1 9.74935e-05, Linf 0.00515232, total time[s] 0.070629 +Converged at iteration 20, L1 4.70129e-05, Linf 0.00336226, total time[s] 0.098474 +Converged at iteration 23, L1 9.03207e-05, Linf 0.0047597, total time[s] 0.075013 +Converged at iteration 25, L1 8.41628e-05, Linf 0.00703856, total time[s] 0.095951 +Converged at iteration 21, L1 8.40501e-05, Linf 0.00595542, total time[s] 0.080217 +Converged at iteration 17, L1 5.68466e-05, Linf 0.00491758, total time[s] 0.061521 +Converged at iteration 31, L1 6.99457e-05, Linf 0.00396784, total time[s] 0.087584 +Converged at iteration 17, L1 5.5457e-05, Linf 0.00522416, total time[s] 0.048045 +Converged at iteration 20, L1 9.27661e-05, Linf 0.00374935, total time[s] 0.054858 +Converged at iteration 27, L1 6.73362e-05, Linf 0.00248837, total time[s] 0.100179 +Converged at iteration 23, L1 7.77039e-05, Linf 0.00690177, total time[s] 0.068484 +Converged at iteration 22, L1 6.20199e-05, Linf 0.00345674, total time[s] 0.064049 +Converged at iteration 22, L1 7.76831e-05, Linf 0.00297579, total time[s] 0.069078 +Converged at iteration 25, L1 7.11676e-05, Linf 0.00195204, total time[s] 0.072531 +Converged at iteration 29, L1 7.11073e-05, Linf 0.00502213, total time[s] 0.148661 +Converged at iteration 30, L1 7.24412e-05, Linf 0.00483387, total time[s] 0.088842 +Converged at iteration 28, L1 6.84794e-05, Linf 0.00362907, total time[s] 0.076418 +Converged at iteration 30, L1 7.47862e-05, Linf 0.00461838, total time[s] 0.079195 +Converged at iteration 29, L1 9.89475e-05, Linf 0.00297192, total time[s] 0.077188 +Converged at iteration 29, L1 6.77863e-05, Linf 0.00128002, total time[s] 0.078235 +Converged at iteration 31, L1 5.6761e-05, Linf 0.00669417, total time[s] 0.082577 +Converged at iteration 29, L1 5.95975e-05, Linf 0.00834725, total time[s] 0.082439 +Converged at iteration 27, L1 5.33494e-05, Linf 0.00575705, total time[s] 0.08084 +Converged at iteration 24, L1 7.5207e-05, Linf 0.0026107, total time[s] 0.065866 +Converged at iteration 37, L1 9.58941e-05, Linf 0.0071461, total time[s] 0.107742 +Converged at iteration 34, L1 6.61633e-05, Linf 0.00588378, total time[s] 0.097826 +Converged at iteration 25, L1 4.22704e-05, Linf 0.00209636, total time[s] 0.08113 +Converged at iteration 29, L1 9.15718e-05, Linf 0.0065695, total time[s] 0.073427 +Converged at iteration 27, L1 6.36203e-05, Linf 0.0098546, total time[s] 0.069757 +Converged at iteration 25, L1 4.44094e-05, Linf 0.00893429, total time[s] 0.063239 +Converged at iteration 20, L1 4.14862e-05, Linf 0.00378887, total time[s] 0.055739 +Converged at iteration 20, L1 4.54924e-05, Linf 0.00336352, total time[s] 0.0608 +Converged at iteration 23, L1 9.2323e-05, Linf 0.00479261, total time[s] 0.073736 +Converged at iteration 25, L1 8.73868e-05, Linf 0.00721234, total time[s] 0.099239 +Converged at iteration 21, L1 8.74056e-05, Linf 0.00601279, total time[s] 0.085825 +Converged at iteration 17, L1 5.79506e-05, Linf 0.00476828, total time[s] 0.064307 +Converged at iteration 31, L1 6.80527e-05, Linf 0.00413814, total time[s] 0.096712 +Converged at iteration 16, L1 9.45953e-05, Linf 0.00753999, total time[s] 0.05381 +Converged at iteration 20, L1 6.64142e-05, Linf 0.00279837, total time[s] 0.056178 +Converged at iteration 27, L1 6.05109e-05, Linf 0.0076563, total time[s] 0.07102 +Converged at iteration 23, L1 8.12671e-05, Linf 0.00698618, total time[s] 0.060737 +Converged at iteration 22, L1 6.60894e-05, Linf 0.00327266, total time[s] 0.065311 +Converged at iteration 22, L1 8.24771e-05, Linf 0.00309659, total time[s] 0.06144 +Converged at iteration 25, L1 6.79866e-05, Linf 0.00189055, total time[s] 0.067492 +Converged at iteration 29, L1 7.17465e-05, Linf 0.00505689, total time[s] 0.088838 +Converged at iteration 30, L1 7.59116e-05, Linf 0.00505261, total time[s] 0.078697 +Converged at iteration 28, L1 6.86041e-05, Linf 0.00366974, total time[s] 0.072785 +Converged at iteration 30, L1 7.78544e-05, Linf 0.00478382, total time[s] 0.078384 +Converged at iteration 30, L1 6.32109e-05, Linf 0.00227855, total time[s] 0.086217 +Converged at iteration 29, L1 7.24394e-05, Linf 0.00127222, total time[s] 0.085765 +Converged at iteration 30, L1 9.4709e-05, Linf 0.00848677, total time[s] 0.086934 +Converged at iteration 29, L1 6.45894e-05, Linf 0.00896262, total time[s] 0.074956 +Converged at iteration 27, L1 6.11551e-05, Linf 0.00652575, total time[s] 0.092142 +Converged at iteration 24, L1 7.95414e-05, Linf 0.0027402, total time[s] 0.096408 +Converged at iteration 37, L1 9.00818e-05, Linf 0.00683328, total time[s] 0.112259 +Converged at iteration 34, L1 6.12394e-05, Linf 0.00555681, total time[s] 0.13353 +Converged at iteration 25, L1 4.35976e-05, Linf 0.00210019, total time[s] 0.099541 +Converged at iteration 29, L1 8.16107e-05, Linf 0.00647054, total time[s] 0.080192 +Converged at iteration 27, L1 6.48033e-05, Linf 0.0103603, total time[s] 0.075262 +Converged at iteration 25, L1 4.95129e-05, Linf 0.00993399, total time[s] 0.094668 +Converged at iteration 20, L1 4.52296e-05, Linf 0.00403994, total time[s] 0.085564 +Converged at iteration 20, L1 4.32453e-05, Linf 0.00337998, total time[s] 0.066501 +Converged at iteration 23, L1 9.26747e-05, Linf 0.00486134, total time[s] 0.088311 +Converged at iteration 25, L1 8.87563e-05, Linf 0.00736397, total time[s] 0.092202 +Converged at iteration 21, L1 8.63038e-05, Linf 0.00599906, total time[s] 0.06821 +Converged at iteration 17, L1 5.8841e-05, Linf 0.00457875, total time[s] 0.048131 +Converged at iteration 31, L1 6.60487e-05, Linf 0.00434174, total time[s] 0.082241 +Converged at iteration 16, L1 9.93822e-05, Linf 0.00653931, total time[s] 0.045933 +Converged at iteration 18, L1 9.86715e-05, Linf 0.00384923, total time[s] 0.051917 +Converged at iteration 27, L1 6.37436e-05, Linf 0.00282272, total time[s] 0.072112 +Converged at iteration 23, L1 8.60608e-05, Linf 0.00717114, total time[s] 0.060992 +Converged at iteration 22, L1 7.13128e-05, Linf 0.00359605, total time[s] 0.0704 +Converged at iteration 22, L1 8.98105e-05, Linf 0.00329854, total time[s] 0.064658 +Converged at iteration 24, L1 9.8003e-05, Linf 0.00203427, total time[s] 0.064873 +Converged at iteration 29, L1 7.21023e-05, Linf 0.0050681, total time[s] 0.076862 +Converged at iteration 30, L1 8.00378e-05, Linf 0.00530331, total time[s] 0.082592 +Converged at iteration 28, L1 6.89716e-05, Linf 0.00369537, total time[s] 0.07777 +Converged at iteration 30, L1 8.15052e-05, Linf 0.0049094, total time[s] 0.081683 +Converged at iteration 30, L1 6.53824e-05, Linf 0.00232535, total time[s] 0.082622 +Converged at iteration 29, L1 7.88983e-05, Linf 0.001346, total time[s] 0.077217 +Converged at iteration 30, L1 8.63795e-05, Linf 0.00834273, total time[s] 0.08079 +Converged at iteration 29, L1 7.17763e-05, Linf 0.00964154, total time[s] 0.07679 +Converged at iteration 27, L1 6.95467e-05, Linf 0.00717662, total time[s] 0.072283 +Converged at iteration 24, L1 8.34079e-05, Linf 0.00284737, total time[s] 0.064475 +Converged at iteration 37, L1 8.43234e-05, Linf 0.00645583, total time[s] 0.101248 +Converged at iteration 34, L1 5.62566e-05, Linf 0.00529612, total time[s] 0.094248 +Converged at iteration 25, L1 4.53524e-05, Linf 0.00208051, total time[s] 0.06632 +Converged at iteration 29, L1 7.60951e-05, Linf 0.00634519, total time[s] 0.074264 +Converged at iteration 27, L1 6.76387e-05, Linf 0.0108647, total time[s] 0.070153 +Converged at iteration 25, L1 5.50161e-05, Linf 0.0106725, total time[s] 0.074388 +Converged at iteration 20, L1 4.92781e-05, Linf 0.0042496, total time[s] 0.068034 +Converged at iteration 20, L1 4.16463e-05, Linf 0.00337345, total time[s] 0.056542 +Converged at iteration 23, L1 9.46722e-05, Linf 0.00488419, total time[s] 0.071201 +Converged at iteration 25, L1 9.14835e-05, Linf 0.0075172, total time[s] 0.094945 +Converged at iteration 21, L1 8.78531e-05, Linf 0.00611741, total time[s] 0.080947 +Converged at iteration 17, L1 6.12594e-05, Linf 0.00434843, total time[s] 0.064712 +Converged at iteration 31, L1 6.35706e-05, Linf 0.00455795, total time[s] 0.108517 +Converged at iteration 17, L1 7.84718e-05, Linf 0.00299262, total time[s] 0.050121 +Converged at iteration 18, L1 8.14002e-05, Linf 0.00249881, total time[s] 0.062411 +Converged at iteration 27, L1 6.62006e-05, Linf 0.00298066, total time[s] 0.077984 +Converged at iteration 23, L1 9.18618e-05, Linf 0.00743997, total time[s] 0.067781 +Converged at iteration 22, L1 7.52644e-05, Linf 0.00390283, total time[s] 0.059157 +Converged at iteration 22, L1 9.86758e-05, Linf 0.00363079, total time[s] 0.058055 +Converged at iteration 24, L1 9.17173e-05, Linf 0.00161605, total time[s] 0.062107 +Converged at iteration 29, L1 7.26035e-05, Linf 0.00506554, total time[s] 0.074093 +Converged at iteration 30, L1 8.44416e-05, Linf 0.00560807, total time[s] 0.079352 +Converged at iteration 28, L1 6.87899e-05, Linf 0.00331699, total time[s] 0.070994 +Converged at iteration 30, L1 8.45894e-05, Linf 0.00516224, total time[s] 0.07665 +Converged at iteration 30, L1 6.70465e-05, Linf 0.00236229, total time[s] 0.077326 +Converged at iteration 29, L1 8.39801e-05, Linf 0.00153993, total time[s] 0.073569 +Converged at iteration 30, L1 7.97041e-05, Linf 0.00820402, total time[s] 0.076169 +Converged at iteration 29, L1 7.82621e-05, Linf 0.010337, total time[s] 0.073763 +Converged at iteration 27, L1 7.9759e-05, Linf 0.00791971, total time[s] 0.069441 +Converged at iteration 24, L1 8.77945e-05, Linf 0.00296378, total time[s] 0.061967 +Converged at iteration 37, L1 7.85286e-05, Linf 0.0061991, total time[s] 0.093658 +Converged at iteration 34, L1 5.14217e-05, Linf 0.00515854, total time[s] 0.092316 +Converged at iteration 25, L1 4.70316e-05, Linf 0.00205784, total time[s] 0.065652 +Converged at iteration 29, L1 6.63856e-05, Linf 0.00617997, total time[s] 0.073389 +Converged at iteration 27, L1 7.01264e-05, Linf 0.0113974, total time[s] 0.069895 +Converged at iteration 25, L1 6.13239e-05, Linf 0.0116186, total time[s] 0.064404 +Converged at iteration 20, L1 5.32618e-05, Linf 0.00444637, total time[s] 0.061184 +Converged at iteration 19, L1 9.49386e-05, Linf 0.00510012, total time[s] 0.073904 +Converged at iteration 23, L1 9.69583e-05, Linf 0.00488282, total time[s] 0.085819 +Converged at iteration 25, L1 8.2095e-05, Linf 0.00767563, total time[s] 0.09765 +Converged at iteration 21, L1 8.59498e-05, Linf 0.00596654, total time[s] 0.074916 +Converged at iteration 17, L1 6.29596e-05, Linf 0.00408011, total time[s] 0.06115 +Converged at iteration 31, L1 6.10398e-05, Linf 0.00480115, total time[s] 0.147952 +Converged at iteration 18, L1 7.23803e-05, Linf 0.00157175, total time[s] 0.048247 +Converged at iteration 19, L1 7.19843e-05, Linf 0.00161068, total time[s] 0.058434 +Converged at iteration 27, L1 7.08791e-05, Linf 0.00312719, total time[s] 0.07463 +Converged at iteration 23, L1 9.80127e-05, Linf 0.00778459, total time[s] 0.060376 +Converged at iteration 22, L1 7.93079e-05, Linf 0.00428086, total time[s] 0.056552 +Converged at iteration 23, L1 6.60125e-05, Linf 0.00281897, total time[s] 0.062156 +Converged at iteration 24, L1 8.45801e-05, Linf 0.00167225, total time[s] 0.067708 +Converged at iteration 29, L1 7.2873e-05, Linf 0.00505301, total time[s] 0.074282 +Converged at iteration 30, L1 8.9385e-05, Linf 0.0057705, total time[s] 0.078817 +Converged at iteration 28, L1 6.93752e-05, Linf 0.00313303, total time[s] 0.071957 +Converged at iteration 30, L1 8.85391e-05, Linf 0.00538122, total time[s] 0.077022 +Converged at iteration 30, L1 6.97661e-05, Linf 0.00240681, total time[s] 0.075889 +Converged at iteration 29, L1 9.18506e-05, Linf 0.00174621, total time[s] 0.077252 +Converged at iteration 30, L1 7.42933e-05, Linf 0.00805551, total time[s] 0.07761 +Converged at iteration 29, L1 8.59954e-05, Linf 0.0111156, total time[s] 0.074623 +Converged at iteration 27, L1 9.05256e-05, Linf 0.00871668, total time[s] 0.072846 +Converged at iteration 24, L1 9.1406e-05, Linf 0.00309326, total time[s] 0.065832 +Converged at iteration 37, L1 7.2565e-05, Linf 0.00599084, total time[s] 0.141862 +Converged at iteration 33, L1 9.74427e-05, Linf 0.00623399, total time[s] 0.09807 +Converged at iteration 25, L1 4.76146e-05, Linf 0.00203007, total time[s] 0.06724 +Converged at iteration 29, L1 6.11244e-05, Linf 0.00597841, total time[s] 0.075751 +Converged at iteration 27, L1 7.4129e-05, Linf 0.0118789, total time[s] 0.068654 +Converged at iteration 25, L1 6.76778e-05, Linf 0.0124581, total time[s] 0.070453 +Converged at iteration 20, L1 5.60784e-05, Linf 0.00465091, total time[s] 0.074997 +Converged at iteration 19, L1 8.74358e-05, Linf 0.00512174, total time[s] 0.066934 +Converged at iteration 23, L1 9.96356e-05, Linf 0.00490197, total time[s] 0.086228 +Converged at iteration 25, L1 7.0272e-05, Linf 0.00779411, total time[s] 0.070028 +Converged at iteration 21, L1 8.5184e-05, Linf 0.00593513, total time[s] 0.06178 +Converged at iteration 17, L1 6.64122e-05, Linf 0.00376219, total time[s] 0.050396 +Converged at iteration 31, L1 5.82137e-05, Linf 0.0050503, total time[s] 0.085656 +Converged at iteration 18, L1 9.19275e-05, Linf 0.0021289, total time[s] 0.059876 +Converged at iteration 20, L1 6.7282e-05, Linf 0.00210478, total time[s] 0.062759 +Converged at iteration 27, L1 7.44307e-05, Linf 0.00330152, total time[s] 0.069823 +Converged at iteration 24, L1 4.77723e-05, Linf 0.0037987, total time[s] 0.062693 +Converged at iteration 22, L1 8.37083e-05, Linf 0.00463521, total time[s] 0.058 +Converged at iteration 23, L1 7.26017e-05, Linf 0.00275365, total time[s] 0.060123 +Converged at iteration 24, L1 7.80029e-05, Linf 0.00163671, total time[s] 0.064694 +Converged at iteration 29, L1 7.26847e-05, Linf 0.00512387, total time[s] 0.0753 +Converged at iteration 30, L1 9.41551e-05, Linf 0.00609493, total time[s] 0.076429 +Converged at iteration 28, L1 6.85583e-05, Linf 0.00290717, total time[s] 0.071825 +Converged at iteration 30, L1 9.21697e-05, Linf 0.00568695, total time[s] 0.076619 +Converged at iteration 30, L1 7.18477e-05, Linf 0.00245428, total time[s] 0.075322 +Converged at iteration 29, L1 9.87438e-05, Linf 0.00190463, total time[s] 0.075869 +Converged at iteration 30, L1 6.94438e-05, Linf 0.00790351, total time[s] 0.075642 +Converged at iteration 29, L1 9.35286e-05, Linf 0.0119056, total time[s] 0.075475 +Converged at iteration 28, L1 4.745e-05, Linf 0.00738851, total time[s] 0.091741 +Converged at iteration 24, L1 9.64024e-05, Linf 0.00323863, total time[s] 0.073467 +Converged at iteration 37, L1 6.63146e-05, Linf 0.00580081, total time[s] 0.102179 +Converged at iteration 33, L1 9.11492e-05, Linf 0.00599353, total time[s] 0.089966 +Converged at iteration 25, L1 4.92998e-05, Linf 0.00200677, total time[s] 0.06589 +Converged at iteration 29, L1 5.59592e-05, Linf 0.00578948, total time[s] 0.074047 +Converged at iteration 27, L1 7.71473e-05, Linf 0.0123284, total time[s] 0.069246 +Converged at iteration 25, L1 7.47894e-05, Linf 0.0133195, total time[s] 0.06695 +Converged at iteration 20, L1 5.99549e-05, Linf 0.00506733, total time[s] 0.065841 +Converged at iteration 19, L1 7.93184e-05, Linf 0.00512905, total time[s] 0.063431 +Converged at iteration 24, L1 5.37947e-05, Linf 0.00302882, total time[s] 0.069174 +Converged at iteration 25, L1 5.85756e-05, Linf 0.00786284, total time[s] 0.068596 +Converged at iteration 21, L1 8.35213e-05, Linf 0.00587856, total time[s] 0.061793 +Converged at iteration 17, L1 7.11137e-05, Linf 0.00328904, total time[s] 0.050318 +Converged at iteration 31, L1 5.69969e-05, Linf 0.00533903, total time[s] 0.100604 +Converged at iteration 19, L1 7.04402e-05, Linf 0.00271252, total time[s] 0.062609 +Converged at iteration 20, L1 9.4355e-05, Linf 0.00304486, total time[s] 0.053287 +Converged at iteration 27, L1 7.72476e-05, Linf 0.00350842, total time[s] 0.070666 +Converged at iteration 24, L1 5.28606e-05, Linf 0.00402841, total time[s] 0.067486 +Converged at iteration 22, L1 8.91218e-05, Linf 0.00493186, total time[s] 0.058295 +Converged at iteration 23, L1 8.23909e-05, Linf 0.00304647, total time[s] 0.060311 +Converged at iteration 24, L1 7.02917e-05, Linf 0.00164614, total time[s] 0.062499 +Converged at iteration 29, L1 7.20857e-05, Linf 0.00517161, total time[s] 0.074447 +Converged at iteration 31, L1 5.27484e-05, Linf 0.00346979, total time[s] 0.081103 +Converged at iteration 28, L1 6.82162e-05, Linf 0.00301167, total time[s] 0.074512 +Converged at iteration 30, L1 9.60493e-05, Linf 0.00586815, total time[s] 0.079827 +Converged at iteration 30, L1 7.49796e-05, Linf 0.00253227, total time[s] 0.076874 +Converged at iteration 30, L1 5.6482e-05, Linf 0.00123249, total time[s] 0.079383 +Converged at iteration 30, L1 6.50956e-05, Linf 0.00771372, total time[s] 0.079515 +Converged at iteration 30, L1 3.9776e-05, Linf 0.00946526, total time[s] 0.078876 +Converged at iteration 28, L1 5.46198e-05, Linf 0.00822143, total time[s] 0.075524 +Converged at iteration 25, L1 5.34709e-05, Linf 0.00204579, total time[s] 0.064759 +Converged at iteration 37, L1 6.07106e-05, Linf 0.00564501, total time[s] 0.096883 +Converged at iteration 33, L1 8.64392e-05, Linf 0.00572207, total time[s] 0.089906 +Converged at iteration 25, L1 5.021e-05, Linf 0.00206728, total time[s] 0.082123 +Converged at iteration 28, L1 9.73581e-05, Linf 0.00769525, total time[s] 0.124624 +Converged at iteration 27, L1 7.99525e-05, Linf 0.0126695, total time[s] 0.073088 +Converged at iteration 25, L1 8.0908e-05, Linf 0.014102, total time[s] 0.06731 +Converged at iteration 20, L1 6.41942e-05, Linf 0.00544831, total time[s] 0.065428 +Converged at iteration 19, L1 7.41532e-05, Linf 0.0051577, total time[s] 0.076308 +Converged at iteration 24, L1 5.35273e-05, Linf 0.00299399, total time[s] 0.073194 +Converged at iteration 25, L1 4.92653e-05, Linf 0.00785047, total time[s] 0.07589 +Converged at iteration 21, L1 8.1237e-05, Linf 0.00588908, total time[s] 0.062107 +Converged at iteration 17, L1 7.67357e-05, Linf 0.00297171, total time[s] 0.048844 +Converged at iteration 31, L1 5.63761e-05, Linf 0.00561612, total time[s] 0.091737 +Converged at iteration 19, L1 8.43016e-05, Linf 0.00335249, total time[s] 0.058294 +Converged at iteration 21, L1 7.79686e-05, Linf 0.00356844, total time[s] 0.074642 +Converged at iteration 27, L1 7.70715e-05, Linf 0.00362186, total time[s] 0.079299 +Converged at iteration 24, L1 5.69201e-05, Linf 0.00422329, total time[s] 0.062014 +Converged at iteration 22, L1 9.28503e-05, Linf 0.00510523, total time[s] 0.06337 +Converged at iteration 23, L1 9.26502e-05, Linf 0.00355571, total time[s] 0.060735 +Converged at iteration 23, L1 9.04413e-05, Linf 0.00243254, total time[s] 0.060904 +Converged at iteration 29, L1 7.19237e-05, Linf 0.0052324, total time[s] 0.092918 +Converged at iteration 31, L1 5.58704e-05, Linf 0.00377687, total time[s] 0.079666 +Converged at iteration 28, L1 6.62673e-05, Linf 0.00278292, total time[s] 0.072488 +Converged at iteration 31, L1 5.48862e-05, Linf 0.00468765, total time[s] 0.122402 +Converged at iteration 30, L1 7.92921e-05, Linf 0.00265235, total time[s] 0.081198 +Converged at iteration 30, L1 6.20076e-05, Linf 0.00129579, total time[s] 0.076245 +Converged at iteration 30, L1 6.19485e-05, Linf 0.00751241, total time[s] 0.075952 +Converged at iteration 30, L1 4.38991e-05, Linf 0.0100687, total time[s] 0.084589 +Converged at iteration 28, L1 6.21356e-05, Linf 0.00893367, total time[s] 0.075014 +Converged at iteration 25, L1 5.47371e-05, Linf 0.0020819, total time[s] 0.072735 +Converged at iteration 37, L1 5.49353e-05, Linf 0.0055103, total time[s] 0.103929 +Converged at iteration 33, L1 8.24405e-05, Linf 0.00539378, total time[s] 0.109534 +Converged at iteration 25, L1 5.06584e-05, Linf 0.0021218, total time[s] 0.361934 +Converged at iteration 28, L1 9.29822e-05, Linf 0.00762664, total time[s] 0.135172 +Converged at iteration 27, L1 8.36163e-05, Linf 0.0129122, total time[s] 0.081618 +Converged at iteration 25, L1 8.82971e-05, Linf 0.015153, total time[s] 0.080913 +Converged at iteration 20, L1 6.92539e-05, Linf 0.00606795, total time[s] 0.084946 +Converged at iteration 19, L1 7.06609e-05, Linf 0.00516193, total time[s] 0.055952 +Converged at iteration 24, L1 5.46548e-05, Linf 0.00295235, total time[s] 0.079318 +Converged at iteration 24, L1 9.1862e-05, Linf 0.0105933, total time[s] 0.073457 +Converged at iteration 21, L1 7.77482e-05, Linf 0.00588715, total time[s] 0.060314 +Converged at iteration 17, L1 8.69023e-05, Linf 0.00644776, total time[s] 0.052038 +Converged at iteration 31, L1 5.76471e-05, Linf 0.00592824, total time[s] 0.0846 +Converged at iteration 20, L1 6.16109e-05, Linf 0.00367042, total time[s] 0.055123 +Converged at iteration 21, L1 9.54043e-05, Linf 0.00467976, total time[s] 0.066193 +Converged at iteration 27, L1 7.89278e-05, Linf 0.00369798, total time[s] 0.072791 +Converged at iteration 24, L1 6.18415e-05, Linf 0.00440537, total time[s] 0.065353 +Converged at iteration 22, L1 9.99922e-05, Linf 0.00533498, total time[s] 0.059829 +Converged at iteration 24, L1 5.92234e-05, Linf 0.0029939, total time[s] 0.068679 +Converged at iteration 23, L1 8.11493e-05, Linf 0.00243155, total time[s] 0.064486 +Converged at iteration 29, L1 7.04464e-05, Linf 0.0052395, total time[s] 0.087051 +Converged at iteration 31, L1 5.99594e-05, Linf 0.00394426, total time[s] 0.078976 +Converged at iteration 28, L1 6.49435e-05, Linf 0.00274184, total time[s] 0.074304 +Converged at iteration 31, L1 5.81622e-05, Linf 0.00493273, total time[s] 0.088474 +Converged at iteration 30, L1 8.18807e-05, Linf 0.0027813, total time[s] 0.075667 +Converged at iteration 30, L1 6.60187e-05, Linf 0.00145325, total time[s] 0.079803 +Converged at iteration 30, L1 5.84909e-05, Linf 0.00725428, total time[s] 0.075509 +Converged at iteration 30, L1 4.84506e-05, Linf 0.0108546, total time[s] 0.076235 +Converged at iteration 28, L1 7.0892e-05, Linf 0.00976624, total time[s] 0.075389 +Converged at iteration 25, L1 5.72557e-05, Linf 0.0021376, total time[s] 0.065631 +Converged at iteration 36, L1 9.55254e-05, Linf 0.00669919, total time[s] 0.094622 +Converged at iteration 33, L1 8.10414e-05, Linf 0.00510814, total time[s] 0.092777 +Converged at iteration 25, L1 5.38647e-05, Linf 0.00222325, total time[s] 0.070765 +Converged at iteration 28, L1 8.6518e-05, Linf 0.00760094, total time[s] 0.075112 +Converged at iteration 27, L1 8.22586e-05, Linf 0.0125053, total time[s] 0.076111 +Converged at iteration 25, L1 9.59536e-05, Linf 0.0158449, total time[s] 0.064784 +Converged at iteration 20, L1 7.42216e-05, Linf 0.00671727, total time[s] 0.061927 +Converged at iteration 19, L1 6.87704e-05, Linf 0.0051857, total time[s] 0.05924 +Converged at iteration 24, L1 5.52792e-05, Linf 0.00291699, total time[s] 0.125421 +Converged at iteration 24, L1 7.95087e-05, Linf 0.0104966, total time[s] 0.091738 +Converged at iteration 21, L1 7.3191e-05, Linf 0.00590642, total time[s] 0.074013 +Converged at iteration 17, L1 9.35857e-05, Linf 0.002143, total time[s] 0.061998 +Converged at iteration 31, L1 5.95653e-05, Linf 0.006251, total time[s] 0.103766 +Converged at iteration 20, L1 7.19969e-05, Linf 0.00455666, total time[s] 0.060995 +Converged at iteration 22, L1 6.37203e-05, Linf 0.00432322, total time[s] 0.058233 +Converged at iteration 27, L1 8.09116e-05, Linf 0.00382498, total time[s] 0.07377 +Converged at iteration 24, L1 6.44386e-05, Linf 0.00454779, total time[s] 0.063465 +Converged at iteration 23, L1 5.5683e-05, Linf 0.00345996, total time[s] 0.064521 +Converged at iteration 24, L1 6.54086e-05, Linf 0.00342518, total time[s] 0.103487 +Converged at iteration 23, L1 7.55917e-05, Linf 0.00284027, total time[s] 0.129978 +Converged at iteration 29, L1 6.73867e-05, Linf 0.00526629, total time[s] 0.151628 +Converged at iteration 31, L1 6.5001e-05, Linf 0.00413063, total time[s] 0.17495 +Converged at iteration 28, L1 6.27978e-05, Linf 0.00271987, total time[s] 0.120519 +Converged at iteration 31, L1 5.63787e-05, Linf 0.00516796, total time[s] 0.231645 +Converged at iteration 30, L1 8.4722e-05, Linf 0.00282884, total time[s] 0.134992 +Converged at iteration 30, L1 6.61173e-05, Linf 0.00160261, total time[s] 0.107186 +Converged at iteration 30, L1 5.73338e-05, Linf 0.00689744, total time[s] 0.078785 +Converged at iteration 30, L1 5.25119e-05, Linf 0.0116183, total time[s] 0.082705 +Converged at iteration 28, L1 7.93114e-05, Linf 0.0105326, total time[s] 0.096554 +Converged at iteration 25, L1 5.66775e-05, Linf 0.00219484, total time[s] 0.084959 +Converged at iteration 36, L1 8.78759e-05, Linf 0.00663297, total time[s] 0.157077 +Converged at iteration 33, L1 8.03343e-05, Linf 0.0048423, total time[s] 0.119132 +Converged at iteration 25, L1 5.3424e-05, Linf 0.00230954, total time[s] 0.074021 +Converged at iteration 28, L1 6.95162e-05, Linf 0.00757365, total time[s] 0.077165 +Converged at iteration 27, L1 7.96708e-05, Linf 0.012056, total time[s] 0.074866 +Converged at iteration 26, L1 2.92278e-05, Linf 0.0102907, total time[s] 0.088307 +Converged at iteration 20, L1 8.00888e-05, Linf 0.00712808, total time[s] 0.073307 +Converged at iteration 19, L1 7.00042e-05, Linf 0.00511953, total time[s] 0.089275 +Converged at iteration 24, L1 5.76856e-05, Linf 0.00287373, total time[s] 0.086596 +Converged at iteration 24, L1 6.36471e-05, Linf 0.0103198, total time[s] 0.069508 +Converged at iteration 21, L1 6.27678e-05, Linf 0.00583662, total time[s] 0.089325 +Converged at iteration 18, L1 5.60142e-05, Linf 0.00172587, total time[s] 0.052026 +Converged at iteration 31, L1 6.29696e-05, Linf 0.00665614, total time[s] 0.087742 +Converged at iteration 20, L1 9.30002e-05, Linf 0.00512933, total time[s] 0.058837 +Converged at iteration 22, L1 7.11497e-05, Linf 0.0053341, total time[s] 0.059086 +Converged at iteration 27, L1 8.57169e-05, Linf 0.00401661, total time[s] 0.070878 +Converged at iteration 24, L1 7.10009e-05, Linf 0.00472595, total time[s] 0.063393 +Converged at iteration 23, L1 5.97585e-05, Linf 0.00360705, total time[s] 0.066027 +Converged at iteration 24, L1 7.49239e-05, Linf 0.00412865, total time[s] 0.091513 +Converged at iteration 23, L1 7.53384e-05, Linf 0.00391952, total time[s] 0.063112 +Converged at iteration 28, L1 9.86015e-05, Linf 0.00633932, total time[s] 0.075511 +Converged at iteration 31, L1 6.96184e-05, Linf 0.00442796, total time[s] 0.08205 +Converged at iteration 28, L1 6.15148e-05, Linf 0.00272837, total time[s] 0.077619 +Converged at iteration 31, L1 5.92034e-05, Linf 0.00549085, total time[s] 0.081889 +Converged at iteration 30, L1 9.08384e-05, Linf 0.00294342, total time[s] 0.079558 +Converged at iteration 30, L1 7.40312e-05, Linf 0.00193135, total time[s] 0.08346 +Converged at iteration 30, L1 5.56511e-05, Linf 0.00639702, total time[s] 0.079597 +Converged at iteration 30, L1 5.86757e-05, Linf 0.0127669, total time[s] 0.083597 +Converged at iteration 28, L1 9.07322e-05, Linf 0.0115755, total time[s] 0.07881 +Converged at iteration 25, L1 5.71028e-05, Linf 0.00227094, total time[s] 0.06587 +Converged at iteration 36, L1 8.31098e-05, Linf 0.00655026, total time[s] 0.103231 +Converged at iteration 33, L1 8.09486e-05, Linf 0.00472531, total time[s] 0.099991 +Converged at iteration 25, L1 5.51489e-05, Linf 0.00241353, total time[s] 0.067686 +Converged at iteration 28, L1 5.14361e-05, Linf 0.00748869, total time[s] 0.089534 +Converged at iteration 27, L1 8.20249e-05, Linf 0.0119911, total time[s] 0.182926 +Converged at iteration 26, L1 3.21462e-05, Linf 0.0112339, total time[s] 0.18291 +Converged at iteration 20, L1 8.59214e-05, Linf 0.00757065, total time[s] 0.145329 +Converged at iteration 19, L1 7.20629e-05, Linf 0.00507493, total time[s] 0.128453 +Converged at iteration 24, L1 6.04278e-05, Linf 0.00284445, total time[s] 0.121543 +Converged at iteration 24, L1 5.44228e-05, Linf 0.00999266, total time[s] 0.106925 +Converged at iteration 21, L1 5.28232e-05, Linf 0.00561647, total time[s] 0.085965 +Converged at iteration 18, L1 6.35894e-05, Linf 0.00194417, total time[s] 0.070358 +Converged at iteration 31, L1 6.49335e-05, Linf 0.00698217, total time[s] 0.097413 +Converged at iteration 21, L1 6.28583e-05, Linf 0.00343166, total time[s] 0.061463 +Converged at iteration 22, L1 7.70453e-05, Linf 0.00573353, total time[s] 0.084126 +Converged at iteration 27, L1 8.585e-05, Linf 0.00415287, total time[s] 0.085691 +Converged at iteration 24, L1 6.94522e-05, Linf 0.00489038, total time[s] 0.076168 +Converged at iteration 23, L1 6.12381e-05, Linf 0.00374482, total time[s] 0.067154 +Converged at iteration 24, L1 8.3363e-05, Linf 0.00577612, total time[s] 0.066463 +Converged at iteration 23, L1 7.85218e-05, Linf 0.00472049, total time[s] 0.070213 +Converged at iteration 28, L1 9.57048e-05, Linf 0.00620611, total time[s] 0.080178 +Converged at iteration 31, L1 7.49312e-05, Linf 0.00513027, total time[s] 0.083458 +Converged at iteration 27, L1 9.94479e-05, Linf 0.00363096, total time[s] 0.097537 +Converged at iteration 31, L1 5.95059e-05, Linf 0.00570549, total time[s] 0.108524 +Converged at iteration 30, L1 9.31755e-05, Linf 0.00308326, total time[s] 0.092199 +Converged at iteration 30, L1 8.04286e-05, Linf 0.00214629, total time[s] 0.083157 +Converged at iteration 30, L1 5.51051e-05, Linf 0.00599981, total time[s] 0.087338 +Converged at iteration 30, L1 6.41315e-05, Linf 0.013805, total time[s] 0.086494 +Converged at iteration 29, L1 4.09377e-05, Linf 0.00904685, total time[s] 0.074101 +Converged at iteration 25, L1 5.75678e-05, Linf 0.00234219, total time[s] 0.066943 +Converged at iteration 36, L1 7.84721e-05, Linf 0.0063089, total time[s] 0.091834 +Converged at iteration 33, L1 8.34793e-05, Linf 0.00477101, total time[s] 0.088662 +Converged at iteration 25, L1 5.37671e-05, Linf 0.0024577, total time[s] 0.068856 +Converged at iteration 27, L1 6.66103e-05, Linf 0.00950892, total time[s] 0.070587 +Converged at iteration 27, L1 7.71964e-05, Linf 0.0114006, total time[s] 0.068984 +Converged at iteration 26, L1 3.39321e-05, Linf 0.0107693, total time[s] 0.070508 +Converged at iteration 20, L1 9.44527e-05, Linf 0.00790278, total time[s] 0.071195 +Converged at iteration 19, L1 7.73302e-05, Linf 0.00498329, total time[s] 0.070155 +Converged at iteration 24, L1 5.96109e-05, Linf 0.00279836, total time[s] 0.084866 +Converged at iteration 24, L1 4.32939e-05, Linf 0.00943489, total time[s] 0.074235 +Converged at iteration 21, L1 4.26345e-05, Linf 0.00492329, total time[s] 0.06866 +Converged at iteration 18, L1 7.55464e-05, Linf 0.00229933, total time[s] 0.050745 +Converged at iteration 31, L1 6.83286e-05, Linf 0.00745086, total time[s] 0.091279 +Converged at iteration 21, L1 6.41281e-05, Linf 0.00388245, total time[s] 0.066213 +Converged at iteration 22, L1 8.80749e-05, Linf 0.00641776, total time[s] 0.070056 +Converged at iteration 27, L1 8.28821e-05, Linf 0.00418345, total time[s] 0.072578 +Converged at iteration 24, L1 7.26091e-05, Linf 0.00515075, total time[s] 0.063696 +Converged at iteration 23, L1 6.50618e-05, Linf 0.00392826, total time[s] 0.061296 +Converged at iteration 24, L1 9.36602e-05, Linf 0.00746448, total time[s] 0.063525 +Converged at iteration 23, L1 8.82868e-05, Linf 0.00582533, total time[s] 0.060717 +Converged at iteration 28, L1 8.87169e-05, Linf 0.00583105, total time[s] 0.073863 +Converged at iteration 31, L1 8.14462e-05, Linf 0.00510956, total time[s] 0.079703 +Converged at iteration 27, L1 9.67155e-05, Linf 0.00353365, total time[s] 0.072593 +Converged at iteration 31, L1 6.21768e-05, Linf 0.00606207, total time[s] 0.084413 +Converged at iteration 30, L1 9.57078e-05, Linf 0.00336334, total time[s] 0.082759 +Converged at iteration 30, L1 9.5418e-05, Linf 0.00267839, total time[s] 0.104044 +Converged at iteration 29, L1 9.67891e-05, Linf 0.00896301, total time[s] 0.074379 +Converged at iteration 30, L1 7.46927e-05, Linf 0.0152314, total time[s] 0.079607 +Converged at iteration 29, L1 4.72566e-05, Linf 0.00986391, total time[s] 0.077247 +Converged at iteration 25, L1 5.58625e-05, Linf 0.00236917, total time[s] 0.067567 +Converged at iteration 36, L1 7.65144e-05, Linf 0.00627983, total time[s] 0.094111 +Converged at iteration 33, L1 8.61809e-05, Linf 0.00489691, total time[s] 0.090711 +Converged at iteration 25, L1 5.43507e-05, Linf 0.00255309, total time[s] 0.0725 +Converged at iteration 27, L1 4.71215e-05, Linf 0.00921882, total time[s] 0.07797 +Converged at iteration 27, L1 7.85791e-05, Linf 0.011502, total time[s] 0.073298 +Converged at iteration 26, L1 3.45701e-05, Linf 0.012533, total time[s] 0.06943 +Converged at iteration 20, L1 9.88029e-05, Linf 0.00823687, total time[s] 0.069612 +Converged at iteration 19, L1 7.95107e-05, Linf 0.00491514, total time[s] 0.072655 +Converged at iteration 24, L1 5.96693e-05, Linf 0.00276551, total time[s] 0.099114 +Converged at iteration 24, L1 4.12425e-05, Linf 0.00886147, total time[s] 0.087194 +Converged at iteration 20, L1 9.64751e-05, Linf 0.00687317, total time[s] 0.071196 +Converged at iteration 18, L1 8.06849e-05, Linf 0.0025186, total time[s] 0.058356 +Converged at iteration 31, L1 7.00262e-05, Linf 0.00779852, total time[s] 0.09838 +Converged at iteration 21, L1 6.37033e-05, Linf 0.00418186, total time[s] 0.060939 +Converged at iteration 22, L1 9.34366e-05, Linf 0.0069654, total time[s] 0.059029 +Converged at iteration 27, L1 7.88433e-05, Linf 0.00413001, total time[s] 0.071591 +Converged at iteration 24, L1 7.40309e-05, Linf 0.00539284, total time[s] 0.062611 +Converged at iteration 23, L1 6.66912e-05, Linf 0.00394376, total time[s] 0.05986 +Converged at iteration 25, L1 5.5317e-05, Linf 0.00363179, total time[s] 0.064397 +Converged at iteration 23, L1 9.82238e-05, Linf 0.00662816, total time[s] 0.060177 +Converged at iteration 28, L1 8.08775e-05, Linf 0.00552278, total time[s] 0.071537 +Converged at iteration 31, L1 8.56425e-05, Linf 0.00581682, total time[s] 0.078672 +Converged at iteration 27, L1 9.36793e-05, Linf 0.00346533, total time[s] 0.06928 +Converged at iteration 31, L1 5.97214e-05, Linf 0.00629659, total time[s] 0.078663 +Converged at iteration 30, L1 9.68265e-05, Linf 0.00327705, total time[s] 0.076297 +Converged at iteration 31, L1 4.82638e-05, Linf 0.00173449, total time[s] 0.081753 +Converged at iteration 29, L1 9.47591e-05, Linf 0.00853659, total time[s] 0.078093 +Converged at iteration 30, L1 8.30831e-05, Linf 0.0161486, total time[s] 0.077979 +Converged at iteration 29, L1 5.24044e-05, Linf 0.010503, total time[s] 0.074772 +Converged at iteration 25, L1 5.38674e-05, Linf 0.00236352, total time[s] 0.065759 +Converged at iteration 36, L1 7.62326e-05, Linf 0.0063448, total time[s] 0.10554 +Converged at iteration 33, L1 9.0827e-05, Linf 0.00514704, total time[s] 0.10033 +Converged at iteration 25, L1 5.56094e-05, Linf 0.00267771, total time[s] 0.065705 +Converged at iteration 26, L1 7.66878e-05, Linf 0.0114261, total time[s] 0.07332 +Converged at iteration 27, L1 8.12377e-05, Linf 0.0119261, total time[s] 0.075734 +Converged at iteration 26, L1 3.79415e-05, Linf 0.0130233, total time[s] 0.077242 +Converged at iteration 21, L1 3.58136e-05, Linf 0.00594807, total time[s] 0.076435 +Converged at iteration 19, L1 8.47351e-05, Linf 0.00474567, total time[s] 0.071141 +Converged at iteration 24, L1 6.1434e-05, Linf 0.00273195, total time[s] 0.081385 +Converged at iteration 23, L1 8.77202e-05, Linf 0.0139929, total time[s] 0.09096 +Converged at iteration 20, L1 9.01016e-05, Linf 0.00611832, total time[s] 0.084446 +Converged at iteration 18, L1 8.99499e-05, Linf 0.00285038, total time[s] 0.058221 +Converged at iteration 31, L1 7.3028e-05, Linf 0.00827187, total time[s] 0.094349 +Converged at iteration 21, L1 8.88608e-05, Linf 0.00449196, total time[s] 0.060042 +Converged at iteration 22, L1 9.98335e-05, Linf 0.00761847, total time[s] 0.061916 +Converged at iteration 27, L1 7.6308e-05, Linf 0.00399468, total time[s] 0.070119 +Converged at iteration 24, L1 7.66284e-05, Linf 0.00560383, total time[s] 0.063183 +Converged at iteration 23, L1 7.05203e-05, Linf 0.00400141, total time[s] 0.059808 +Converged at iteration 25, L1 6.03412e-05, Linf 0.00393585, total time[s] 0.068433 +Converged at iteration 24, L1 6.56367e-05, Linf 0.00548022, total time[s] 0.075193 +Converged at iteration 28, L1 7.16601e-05, Linf 0.00521349, total time[s] 0.07516 +Converged at iteration 31, L1 9.02964e-05, Linf 0.0056229, total time[s] 0.079838 +Converged at iteration 27, L1 9.0729e-05, Linf 0.00334506, total time[s] 0.070199 +Converged at iteration 31, L1 6.22051e-05, Linf 0.0066394, total time[s] 0.08047 +Converged at iteration 30, L1 9.95839e-05, Linf 0.00344893, total time[s] 0.09244 +Converged at iteration 31, L1 5.61964e-05, Linf 0.00205837, total time[s] 0.106977 +Converged at iteration 29, L1 9.30739e-05, Linf 0.0079659, total time[s] 0.08666 +Converged at iteration 30, L1 9.38941e-05, Linf 0.0169425, total time[s] 0.077729 +Converged at iteration 29, L1 5.80863e-05, Linf 0.0112822, total time[s] 0.074717 +Converged at iteration 25, L1 5.31773e-05, Linf 0.00233573, total time[s] 0.067396 +Converged at iteration 36, L1 7.77401e-05, Linf 0.00653712, total time[s] 0.094081 +Converged at iteration 33, L1 9.51769e-05, Linf 0.00535185, total time[s] 0.14272 +Converged at iteration 25, L1 5.79789e-05, Linf 0.00275547, total time[s] 0.078718 +Converged at iteration 26, L1 5.74615e-05, Linf 0.011104, total time[s] 0.078354 +Converged at iteration 27, L1 8.32904e-05, Linf 0.0123389, total time[s] 0.075507 +Converged at iteration 26, L1 3.71519e-05, Linf 0.0134576, total time[s] 0.068826 +Converged at iteration 21, L1 3.71905e-05, Linf 0.00617713, total time[s] 0.063221 +Converged at iteration 19, L1 8.76474e-05, Linf 0.00465584, total time[s] 0.077225 +Converged at iteration 24, L1 6.26956e-05, Linf 0.00268687, total time[s] 0.070239 +Converged at iteration 23, L1 8.15661e-05, Linf 0.0138383, total time[s] 0.072153 +Converged at iteration 20, L1 8.6661e-05, Linf 0.00545128, total time[s] 0.057435 +Converged at iteration 18, L1 9.66646e-05, Linf 0.00307139, total time[s] 0.059663 +Converged at iteration 31, L1 7.42679e-05, Linf 0.00863627, total time[s] 0.106679 +Converged at iteration 21, L1 9.6097e-05, Linf 0.00456775, total time[s] 0.081268 +Converged at iteration 23, L1 5.75917e-05, Linf 0.0053526, total time[s] 0.062162 +Converged at iteration 27, L1 7.39006e-05, Linf 0.00390842, total time[s] 0.07612 +Converged at iteration 24, L1 7.70623e-05, Linf 0.00568591, total time[s] 0.068207 +Converged at iteration 23, L1 7.22272e-05, Linf 0.00427371, total time[s] 0.069716 +Converged at iteration 25, L1 6.33995e-05, Linf 0.00414856, total time[s] 0.079462 +Converged at iteration 24, L1 7.51582e-05, Linf 0.00615326, total time[s] 0.077076 +Converged at iteration 28, L1 6.36023e-05, Linf 0.00515006, total time[s] 0.080478 +Converged at iteration 31, L1 9.3304e-05, Linf 0.00520941, total time[s] 0.095257 +Converged at iteration 27, L1 8.66142e-05, Linf 0.00320011, total time[s] 0.084876 +Converged at iteration 31, L1 6.17397e-05, Linf 0.00686527, total time[s] 0.103684 +Converged at iteration 31, L1 6.25357e-05, Linf 0.00223955, total time[s] 0.080126 +Converged at iteration 31, L1 6.15846e-05, Linf 0.00222837, total time[s] 0.08006 +Converged at iteration 29, L1 9.29256e-05, Linf 0.00748436, total time[s] 0.076213 +Converged at iteration 31, L1 3.25613e-05, Linf 0.00894573, total time[s] 0.087745 +Converged at iteration 29, L1 6.31898e-05, Linf 0.0118715, total time[s] 0.084027 +Converged at iteration 25, L1 5.24293e-05, Linf 0.00230226, total time[s] 0.067046 +Converged at iteration 36, L1 7.99483e-05, Linf 0.00699843, total time[s] 0.117012 +Converged at iteration 34, L1 4.53918e-05, Linf 0.00443111, total time[s] 0.107849 +Converged at iteration 25, L1 6.04463e-05, Linf 0.00292879, total time[s] 0.098347 +Converged at iteration 26, L1 3.97527e-05, Linf 0.0105315, total time[s] 0.069664 +Converged at iteration 27, L1 8.37954e-05, Linf 0.0132559, total time[s] 0.071043 +Converged at iteration 26, L1 3.92805e-05, Linf 0.0140984, total time[s] 0.074015 +Converged at iteration 21, L1 3.7555e-05, Linf 0.00652303, total time[s] 0.088117 +Converged at iteration 19, L1 9.16901e-05, Linf 0.00447657, total time[s] 0.088383 +Converged at iteration 24, L1 6.21359e-05, Linf 0.00263601, total time[s] 0.10677 +Converged at iteration 23, L1 7.8914e-05, Linf 0.0128016, total time[s] 0.085639 +Converged at iteration 20, L1 8.43137e-05, Linf 0.00498015, total time[s] 0.067726 +Converged at iteration 19, L1 5.09739e-05, Linf 0.00179158, total time[s] 0.063207 +Converged at iteration 31, L1 7.73293e-05, Linf 0.0091624, total time[s] 0.092738 +Converged at iteration 21, L1 9.89656e-05, Linf 0.00468684, total time[s] 0.061802 +Converged at iteration 23, L1 6.06585e-05, Linf 0.00568602, total time[s] 0.06295 +Converged at iteration 27, L1 7.22303e-05, Linf 0.00379888, total time[s] 0.071179 +Converged at iteration 24, L1 7.63305e-05, Linf 0.00565155, total time[s] 0.089358 +Converged at iteration 23, L1 7.50812e-05, Linf 0.00446345, total time[s] 0.08192 +Converged at iteration 25, L1 6.6341e-05, Linf 0.00435642, total time[s] 0.079861 +Converged at iteration 24, L1 8.97639e-05, Linf 0.00698338, total time[s] 0.064166 +Converged at iteration 27, L1 9.54827e-05, Linf 0.00666412, total time[s] 0.076448 +Converged at iteration 31, L1 9.8073e-05, Linf 0.00542262, total time[s] 0.08597 +Converged at iteration 27, L1 8.12243e-05, Linf 0.00306511, total time[s] 0.075916 +Converged at iteration 31, L1 6.4902e-05, Linf 0.00722604, total time[s] 0.096891 +Converged at iteration 31, L1 6.28771e-05, Linf 0.00234083, total time[s] 0.08633 +Converged at iteration 31, L1 6.87298e-05, Linf 0.00257179, total time[s] 0.090344 +Converged at iteration 29, L1 9.16026e-05, Linf 0.00686612, total time[s] 0.083236 +Converged at iteration 31, L1 3.57366e-05, Linf 0.00918565, total time[s] 0.103304 +Converged at iteration 29, L1 7.03599e-05, Linf 0.0126663, total time[s] 0.080219 +Converged at iteration 25, L1 5.23354e-05, Linf 0.00231795, total time[s] 0.071869 +Converged at iteration 36, L1 8.28238e-05, Linf 0.0071985, total time[s] 0.122421 +Converged at iteration 34, L1 4.79996e-05, Linf 0.00426054, total time[s] 0.109331 +Converged at iteration 25, L1 6.21675e-05, Linf 0.00301996, total time[s] 0.066785 +Converged at iteration 25, L1 9.20281e-05, Linf 0.0134698, total time[s] 0.06866 +Converged at iteration 27, L1 8.10528e-05, Linf 0.0135141, total time[s] 0.071717 +Converged at iteration 26, L1 4.11036e-05, Linf 0.0145536, total time[s] 0.111639 +Converged at iteration 21, L1 3.78414e-05, Linf 0.0065821, total time[s] 0.110737 +Converged at iteration 19, L1 9.16057e-05, Linf 0.00436818, total time[s] 0.068698 +Converged at iteration 24, L1 6.26755e-05, Linf 0.00271509, total time[s] 0.101439 +Converged at iteration 23, L1 7.76766e-05, Linf 0.0121859, total time[s] 0.134188 +Converged at iteration 20, L1 8.60992e-05, Linf 0.00500443, total time[s] 0.068581 +Converged at iteration 19, L1 5.62938e-05, Linf 0.00187552, total time[s] 0.063643 +Converged at iteration 31, L1 7.8765e-05, Linf 0.00951903, total time[s] 0.086105 +Converged at iteration 22, L1 6.7214e-05, Linf 0.00284858, total time[s] 0.05883 +Converged at iteration 23, L1 6.18513e-05, Linf 0.00588967, total time[s] 0.061739 +Converged at iteration 27, L1 6.95456e-05, Linf 0.00372549, total time[s] 0.073887 +Converged at iteration 24, L1 7.54739e-05, Linf 0.00561325, total time[s] 0.064783 +Converged at iteration 23, L1 7.71145e-05, Linf 0.00436972, total time[s] 0.063976 +Converged at iteration 25, L1 6.72042e-05, Linf 0.00445736, total time[s] 0.068757 +Converged at iteration 25, L1 5.74654e-05, Linf 0.00534009, total time[s] 0.081072 +Converged at iteration 27, L1 9.45405e-05, Linf 0.0066316, total time[s] 0.071544 +Converged at iteration 32, L1 5.31359e-05, Linf 0.00319167, total time[s] 0.084077 +Converged at iteration 27, L1 7.83043e-05, Linf 0.00294842, total time[s] 0.069926 +Converged at iteration 31, L1 6.58478e-05, Linf 0.00743034, total time[s] 0.081157 +Converged at iteration 31, L1 6.28945e-05, Linf 0.00229662, total time[s] 0.083994 +Converged at iteration 31, L1 7.5351e-05, Linf 0.00278201, total time[s] 0.083669 +Converged at iteration 29, L1 9.13834e-05, Linf 0.00643374, total time[s] 0.073858 +Converged at iteration 31, L1 3.92682e-05, Linf 0.00919253, total time[s] 0.082238 +Converged at iteration 29, L1 7.47521e-05, Linf 0.013214, total time[s] 0.080604 +Converged at iteration 25, L1 5.22799e-05, Linf 0.00237481, total time[s] 0.065709 +Converged at iteration 36, L1 8.56069e-05, Linf 0.00761867, total time[s] 0.101546 +Converged at iteration 34, L1 5.23699e-05, Linf 0.00486452, total time[s] 0.092788 +Converged at iteration 25, L1 6.12146e-05, Linf 0.00309032, total time[s] 0.071675 +Converged at iteration 25, L1 7.31357e-05, Linf 0.0130331, total time[s] 0.066813 +Converged at iteration 27, L1 8.10186e-05, Linf 0.0136168, total time[s] 0.07044 +Converged at iteration 26, L1 4.39774e-05, Linf 0.0151436, total time[s] 0.073141 +Converged at iteration 21, L1 3.81031e-05, Linf 0.00673923, total time[s] 0.082644 +Converged at iteration 19, L1 9.01754e-05, Linf 0.00424257, total time[s] 0.075805 +Converged at iteration 24, L1 6.20147e-05, Linf 0.00257927, total time[s] 0.081728 +Converged at iteration 23, L1 7.48363e-05, Linf 0.0112839, total time[s] 0.076007 +Converged at iteration 20, L1 8.87225e-05, Linf 0.0050093, total time[s] 0.060556 +Converged at iteration 19, L1 5.83725e-05, Linf 0.00199169, total time[s] 0.067678 +Converged at iteration 31, L1 8.16502e-05, Linf 0.0100294, total time[s] 0.088549 +Converged at iteration 22, L1 6.88229e-05, Linf 0.00286929, total time[s] 0.061372 +Converged at iteration 23, L1 6.84187e-05, Linf 0.00618494, total time[s] 0.066195 +Converged at iteration 27, L1 6.89736e-05, Linf 0.00362594, total time[s] 0.074345 +Converged at iteration 24, L1 7.39866e-05, Linf 0.00546792, total time[s] 0.065221 +Converged at iteration 23, L1 8.05403e-05, Linf 0.00434745, total time[s] 0.061554 +Converged at iteration 25, L1 6.82632e-05, Linf 0.00455513, total time[s] 0.06775 +Converged at iteration 25, L1 6.72341e-05, Linf 0.00585415, total time[s] 0.066881 +Converged at iteration 27, L1 9.29468e-05, Linf 0.0066935, total time[s] 0.072839 +Converged at iteration 32, L1 5.4528e-05, Linf 0.00322642, total time[s] 0.085068 +Converged at iteration 27, L1 7.37834e-05, Linf 0.00278521, total time[s] 0.072348 +Converged at iteration 31, L1 6.81542e-05, Linf 0.00775866, total time[s] 0.091133 +Converged at iteration 31, L1 6.39474e-05, Linf 0.00235084, total time[s] 0.100801 +Converged at iteration 31, L1 8.46644e-05, Linf 0.00324083, total time[s] 0.084724 +Converged at iteration 29, L1 9.29512e-05, Linf 0.00594469, total time[s] 0.08033 +Converged at iteration 31, L1 4.39232e-05, Linf 0.00988816, total time[s] 0.085418 +Converged at iteration 29, L1 8.24139e-05, Linf 0.0141649, total time[s] 0.086629 +Converged at iteration 25, L1 5.32916e-05, Linf 0.00246557, total time[s] 0.069148 +Converged at iteration 36, L1 8.93584e-05, Linf 0.00792113, total time[s] 0.125811 +Converged at iteration 34, L1 5.56391e-05, Linf 0.00467626, total time[s] 0.145335 +Converged at iteration 25, L1 6.09986e-05, Linf 0.00313218, total time[s] 0.088672 +Converged at iteration 25, L1 6.48168e-05, Linf 0.0126882, total time[s] 0.074927 +Converged at iteration 27, L1 7.98807e-05, Linf 0.0136245, total time[s] 0.104156 +Converged at iteration 26, L1 4.62092e-05, Linf 0.0155293, total time[s] 0.12882 +Converged at iteration 21, L1 3.77712e-05, Linf 0.0068294, total time[s] 0.07203 +Converged at iteration 19, L1 8.90738e-05, Linf 0.004203, total time[s] 0.064076 +Converged at iteration 24, L1 6.25174e-05, Linf 0.00251596, total time[s] 0.100183 +Converged at iteration 23, L1 7.40339e-05, Linf 0.010586, total time[s] 0.083074 +Converged at iteration 20, L1 8.95296e-05, Linf 0.00496885, total time[s] 0.066451 +Converged at iteration 19, L1 6.14865e-05, Linf 0.00206228, total time[s] 0.074901 +Converged at iteration 31, L1 8.2328e-05, Linf 0.0103412, total time[s] 0.08191 +Converged at iteration 22, L1 7.00961e-05, Linf 0.00284818, total time[s] 0.061035 +Converged at iteration 23, L1 7.40054e-05, Linf 0.00667557, total time[s] 0.065885 +Converged at iteration 27, L1 6.98153e-05, Linf 0.003599, total time[s] 0.074068 +Converged at iteration 24, L1 7.16538e-05, Linf 0.00533909, total time[s] 0.064828 +Converged at iteration 23, L1 8.17141e-05, Linf 0.00442314, total time[s] 0.063102 +Converged at iteration 25, L1 6.97812e-05, Linf 0.00460657, total time[s] 0.066007 +Converged at iteration 25, L1 7.35099e-05, Linf 0.00608529, total time[s] 0.06818 +Converged at iteration 27, L1 9.05293e-05, Linf 0.00684585, total time[s] 0.073103 +Converged at iteration 32, L1 5.56998e-05, Linf 0.00321586, total time[s] 0.088754 +Converged at iteration 27, L1 7.00459e-05, Linf 0.00264325, total time[s] 0.070654 +Converged at iteration 31, L1 6.94898e-05, Linf 0.00794827, total time[s] 0.08032 +Converged at iteration 31, L1 6.40869e-05, Linf 0.0023774, total time[s] 0.080038 +Converged at iteration 31, L1 9.18357e-05, Linf 0.00350026, total time[s] 0.079928 +Converged at iteration 29, L1 9.40525e-05, Linf 0.00563769, total time[s] 0.075056 +Converged at iteration 31, L1 4.73419e-05, Linf 0.00996362, total time[s] 0.079392 +Converged at iteration 29, L1 8.20227e-05, Linf 0.0144119, total time[s] 0.075101 +Converged at iteration 25, L1 5.27046e-05, Linf 0.00255846, total time[s] 0.06561 +Converged at iteration 36, L1 9.484e-05, Linf 0.00834194, total time[s] 0.093357 +Converged at iteration 34, L1 6.07223e-05, Linf 0.00511158, total time[s] 0.091979 +Converged at iteration 25, L1 5.80713e-05, Linf 0.00322831, total time[s] 0.081162 +Converged at iteration 25, L1 5.68467e-05, Linf 0.0122015, total time[s] 0.067712 +Converged at iteration 27, L1 6.60731e-05, Linf 0.0134479, total time[s] 0.070441 +Converged at iteration 26, L1 4.93335e-05, Linf 0.0162713, total time[s] 0.074267 +Converged at iteration 21, L1 3.84782e-05, Linf 0.00693357, total time[s] 0.080071 +Converged at iteration 19, L1 8.889e-05, Linf 0.00403825, total time[s] 0.070541 +Converged at iteration 24, L1 6.31888e-05, Linf 0.00246343, total time[s] 0.104407 +Converged at iteration 23, L1 7.82242e-05, Linf 0.0096717, total time[s] 0.097735 +Converged at iteration 20, L1 9.31181e-05, Linf 0.00495029, total time[s] 0.065102 +Converged at iteration 19, L1 6.67021e-05, Linf 0.00218581, total time[s] 0.077751 +Converged at iteration 31, L1 8.42498e-05, Linf 0.0108732, total time[s] 0.091459 +Converged at iteration 22, L1 7.39903e-05, Linf 0.00302874, total time[s] 0.058511 +Converged at iteration 23, L1 7.30926e-05, Linf 0.00662801, total time[s] 0.061573 +Converged at iteration 27, L1 7.21396e-05, Linf 0.00364096, total time[s] 0.073319 +Converged at iteration 24, L1 6.9153e-05, Linf 0.00506626, total time[s] 0.063211 +Converged at iteration 23, L1 8.45284e-05, Linf 0.0045207, total time[s] 0.060066 +Converged at iteration 25, L1 7.27273e-05, Linf 0.00472002, total time[s] 0.064244 +Converged at iteration 25, L1 8.0535e-05, Linf 0.00659967, total time[s] 0.074775 +Converged at iteration 27, L1 8.81431e-05, Linf 0.0069462, total time[s] 0.099394 +Converged at iteration 32, L1 5.81918e-05, Linf 0.00322416, total time[s] 0.086299 +Converged at iteration 27, L1 6.60629e-05, Linf 0.00244846, total time[s] 0.06906 +Converged at iteration 31, L1 7.09927e-05, Linf 0.00826343, total time[s] 0.078384 +Converged at iteration 31, L1 6.29492e-05, Linf 0.002407, total time[s] 0.083189 +Converged at iteration 32, L1 4.8863e-05, Linf 0.00224754, total time[s] 0.082412 +Converged at iteration 29, L1 9.83124e-05, Linf 0.00516344, total time[s] 0.076519 +Converged at iteration 31, L1 5.18138e-05, Linf 0.0120162, total time[s] 0.081176 +Converged at iteration 29, L1 8.3988e-05, Linf 0.0150705, total time[s] 0.0762 +Converged at iteration 25, L1 5.27423e-05, Linf 0.00258257, total time[s] 0.067089 +Converged at iteration 36, L1 9.85669e-05, Linf 0.0086126, total time[s] 0.103573 +Converged at iteration 34, L1 6.39872e-05, Linf 0.00551684, total time[s] 0.100695 +Converged at iteration 25, L1 5.77989e-05, Linf 0.00327767, total time[s] 0.070408 +Converged at iteration 25, L1 5.21609e-05, Linf 0.0118742, total time[s] 0.064557 +Converged at iteration 27, L1 6.42201e-05, Linf 0.0132337, total time[s] 0.070116 +Converged at iteration 26, L1 5.51769e-05, Linf 0.0163385, total time[s] 0.069304 +Converged at iteration 21, L1 3.80478e-05, Linf 0.00700445, total time[s] 0.065993 +Converged at iteration 19, L1 8.86173e-05, Linf 0.00396555, total time[s] 0.060123 +Converged at iteration 24, L1 6.38378e-05, Linf 0.0025509, total time[s] 0.091614 +Converged at iteration 23, L1 7.85982e-05, Linf 0.00901426, total time[s] 0.069088 +Converged at iteration 20, L1 9.4961e-05, Linf 0.00488976, total time[s] 0.073576 +Converged at iteration 19, L1 6.98217e-05, Linf 0.00225985, total time[s] 0.078737 +Converged at iteration 31, L1 8.4706e-05, Linf 0.0111073, total time[s] 0.101354 +Converged at iteration 22, L1 7.6525e-05, Linf 0.00308901, total time[s] 0.059808 +Converged at iteration 23, L1 7.70698e-05, Linf 0.0067695, total time[s] 0.061177 +Converged at iteration 27, L1 7.08579e-05, Linf 0.00364414, total time[s] 0.070486 +Converged at iteration 24, L1 6.73191e-05, Linf 0.0049131, total time[s] 0.062604 +Converged at iteration 23, L1 8.51367e-05, Linf 0.00459277, total time[s] 0.060204 +Converged at iteration 25, L1 7.24591e-05, Linf 0.00478512, total time[s] 0.065225 +Converged at iteration 25, L1 8.10423e-05, Linf 0.00694749, total time[s] 0.067307 +Converged at iteration 27, L1 8.56838e-05, Linf 0.00693424, total time[s] 0.080345 +Converged at iteration 32, L1 5.89392e-05, Linf 0.00321644, total time[s] 0.08198 +Converged at iteration 27, L1 6.31315e-05, Linf 0.00231177, total time[s] 0.06995 +Converged at iteration 31, L1 7.1884e-05, Linf 0.00839875, total time[s] 0.078901 +Converged at iteration 31, L1 6.48189e-05, Linf 0.00241001, total time[s] 0.080741 +Converged at iteration 32, L1 5.04992e-05, Linf 0.00236222, total time[s] 0.08354 +Converged at iteration 29, L1 9.99872e-05, Linf 0.00477717, total time[s] 0.073733 +Converged at iteration 31, L1 5.51571e-05, Linf 0.0124946, total time[s] 0.084474 +Converged at iteration 29, L1 8.54162e-05, Linf 0.0154305, total time[s] 0.074461 +Converged at iteration 25, L1 5.49877e-05, Linf 0.0025849, total time[s] 0.065995 +Converged at iteration 37, L1 5.04321e-05, Linf 0.00700218, total time[s] 0.097168 +Converged at iteration 34, L1 7.06563e-05, Linf 0.00534963, total time[s] 0.093897 +Converged at iteration 25, L1 5.78654e-05, Linf 0.00343046, total time[s] 0.065132 +Converged at iteration 25, L1 4.91057e-05, Linf 0.0113612, total time[s] 0.065525 +Converged at iteration 27, L1 4.55596e-05, Linf 0.0125143, total time[s] 0.072453 +Converged at iteration 26, L1 5.49249e-05, Linf 0.0167542, total time[s] 0.067557 +Converged at iteration 21, L1 3.79237e-05, Linf 0.00710415, total time[s] 0.069412 +Converged at iteration 19, L1 8.855e-05, Linf 0.00379904, total time[s] 0.05743 +Converged at iteration 24, L1 6.22924e-05, Linf 0.00247628, total time[s] 0.074681 +Converged at iteration 23, L1 8.27963e-05, Linf 0.00836383, total time[s] 0.086114 +Converged at iteration 20, L1 9.84887e-05, Linf 0.00481911, total time[s] 0.087497 +Converged at iteration 19, L1 7.56372e-05, Linf 0.0023989, total time[s] 0.059321 +Converged at iteration 31, L1 8.53765e-05, Linf 0.0116604, total time[s] 0.097687 +Converged at iteration 22, L1 7.07211e-05, Linf 0.00320363, total time[s] 0.090166 +Converged at iteration 23, L1 7.70017e-05, Linf 0.00703347, total time[s] 0.061433 +Converged at iteration 27, L1 6.73055e-05, Linf 0.00362814, total time[s] 0.074803 +Converged at iteration 24, L1 6.38991e-05, Linf 0.00459982, total time[s] 0.066291 +Converged at iteration 23, L1 8.59472e-05, Linf 0.00467264, total time[s] 0.075534 +Converged at iteration 25, L1 7.76686e-05, Linf 0.00491605, total time[s] 0.072663 +Converged at iteration 25, L1 8.40892e-05, Linf 0.00792921, total time[s] 0.092155 +Converged at iteration 27, L1 8.45686e-05, Linf 0.00684984, total time[s] 0.073194 +Converged at iteration 32, L1 6.07493e-05, Linf 0.00323372, total time[s] 0.082162 +Converged at iteration 26, L1 9.99819e-05, Linf 0.00308354, total time[s] 0.068068 +Converged at iteration 31, L1 7.26066e-05, Linf 0.00867516, total time[s] 0.080218 +Converged at iteration 31, L1 6.22453e-05, Linf 0.00239186, total time[s] 0.079666 +Converged at iteration 32, L1 5.67727e-05, Linf 0.00262972, total time[s] 0.082936 +Converged at iteration 30, L1 6.78633e-05, Linf 0.0028737, total time[s] 0.077474 +Converged at iteration 31, L1 6.12105e-05, Linf 0.0133709, total time[s] 0.085898 +Converged at iteration 29, L1 8.53055e-05, Linf 0.0160312, total time[s] 0.076507 +Converged at iteration 25, L1 5.5471e-05, Linf 0.00263277, total time[s] 0.07226 +Converged at iteration 37, L1 5.20248e-05, Linf 0.00721563, total time[s] 0.109172 +Converged at iteration 34, L1 7.38396e-05, Linf 0.00556955, total time[s] 0.103544 +Converged at iteration 25, L1 5.8349e-05, Linf 0.00347914, total time[s] 0.066442 +Converged at iteration 25, L1 4.78274e-05, Linf 0.0110032, total time[s] 0.066517 +Converged at iteration 27, L1 3.6468e-05, Linf 0.0119616, total time[s] 0.082524 +Converged at iteration 26, L1 5.53934e-05, Linf 0.0168953, total time[s] 0.093471 +Converged at iteration 21, L1 3.8246e-05, Linf 0.00715757, total time[s] 0.07951 +Converged at iteration 19, L1 8.82722e-05, Linf 0.00378987, total time[s] 0.061558 +Converged at iteration 24, L1 6.14962e-05, Linf 0.0024844, total time[s] 0.070806 +Converged at iteration 23, L1 8.58844e-05, Linf 0.00784471, total time[s] 0.078625 +Converged at iteration 20, L1 9.99184e-05, Linf 0.00472529, total time[s] 0.06927 +Converged at iteration 19, L1 7.89408e-05, Linf 0.00254888, total time[s] 0.067076 +Converged at iteration 31, L1 8.57949e-05, Linf 0.0119025, total time[s] 0.090247 +Converged at iteration 22, L1 6.87449e-05, Linf 0.00325782, total time[s] 0.070248 +Converged at iteration 23, L1 7.92813e-05, Linf 0.0071354, total time[s] 0.070397 +Converged at iteration 27, L1 6.49808e-05, Linf 0.00358847, total time[s] 0.084981 +Converged at iteration 24, L1 6.2145e-05, Linf 0.00447693, total time[s] 0.065286 +Converged at iteration 23, L1 8.62685e-05, Linf 0.00472305, total time[s] 0.062897 +Converged at iteration 25, L1 7.82537e-05, Linf 0.00498681, total time[s] 0.067395 +Converged at iteration 25, L1 8.43823e-05, Linf 0.00734884, total time[s] 0.066871 +Converged at iteration 27, L1 8.39904e-05, Linf 0.00689562, total time[s] 0.071063 +Converged at iteration 32, L1 6.21693e-05, Linf 0.00328036, total time[s] 0.084695 +Converged at iteration 26, L1 9.6548e-05, Linf 0.00293727, total time[s] 0.071361 +Converged at iteration 31, L1 7.22323e-05, Linf 0.00873937, total time[s] 0.082772 +Converged at iteration 31, L1 6.11231e-05, Linf 0.00238576, total time[s] 0.080961 +Converged at iteration 32, L1 5.87859e-05, Linf 0.00272677, total time[s] 0.083989 +Converged at iteration 30, L1 6.94754e-05, Linf 0.00289303, total time[s] 0.078932 +Converged at iteration 31, L1 6.42587e-05, Linf 0.013925, total time[s] 0.081202 +Converged at iteration 29, L1 8.54376e-05, Linf 0.0163015, total time[s] 0.07662 +Converged at iteration 25, L1 5.47257e-05, Linf 0.00252274, total time[s] 0.06705 +Converged at iteration 37, L1 5.47508e-05, Linf 0.007603, total time[s] 0.097212 +Converged at iteration 34, L1 8.1245e-05, Linf 0.0064574, total time[s] 0.096497 +Converged at iteration 25, L1 5.79756e-05, Linf 0.0036025, total time[s] 0.070362 +Converged at iteration 25, L1 4.61144e-05, Linf 0.0104211, total time[s] 0.067486 +Converged at iteration 26, L1 8.91696e-05, Linf 0.0184064, total time[s] 0.069896 +Converged at iteration 26, L1 5.39943e-05, Linf 0.016975, total time[s] 0.074352 +Converged at iteration 21, L1 3.87645e-05, Linf 0.00736057, total time[s] 0.076682 +Converged at iteration 19, L1 8.84392e-05, Linf 0.003661, total time[s] 0.064792 +Converged at iteration 24, L1 6.12472e-05, Linf 0.00249004, total time[s] 0.101374 +Converged at iteration 23, L1 8.91994e-05, Linf 0.00690364, total time[s] 0.063255 +Converged at iteration 21, L1 4.71608e-05, Linf 0.00240622, total time[s] 0.091473 +Converged at iteration 19, L1 8.47126e-05, Linf 0.00279093, total time[s] 0.054295 +Converged at iteration 31, L1 8.62419e-05, Linf 0.0123957, total time[s] 0.086819 +Converged at iteration 22, L1 6.6431e-05, Linf 0.00326845, total time[s] 0.078547 +Converged at iteration 23, L1 8.81675e-05, Linf 0.00738212, total time[s] 0.069681 +Converged at iteration 27, L1 6.18323e-05, Linf 0.00347719, total time[s] 0.070319 +Converged at iteration 24, L1 6.05384e-05, Linf 0.00423239, total time[s] 0.062862 +Converged at iteration 23, L1 8.84275e-05, Linf 0.00482646, total time[s] 0.060939 +Converged at iteration 25, L1 8.22725e-05, Linf 0.00516048, total time[s] 0.071718 +Converged at iteration 25, L1 9.14901e-05, Linf 0.00598089, total time[s] 0.064685 +Converged at iteration 27, L1 8.30668e-05, Linf 0.0073899, total time[s] 0.070738 +Converged at iteration 32, L1 6.27935e-05, Linf 0.00332463, total time[s] 0.08954 +Converged at iteration 26, L1 9.15391e-05, Linf 0.00266573, total time[s] 0.071808 +Converged at iteration 31, L1 7.50068e-05, Linf 0.00903457, total time[s] 0.090967 +Converged at iteration 31, L1 5.98465e-05, Linf 0.00240333, total time[s] 0.080388 +Converged at iteration 32, L1 6.27311e-05, Linf 0.00292791, total time[s] 0.086107 +Converged at iteration 30, L1 7.42628e-05, Linf 0.00304675, total time[s] 0.077372 +Converged at iteration 31, L1 7.71879e-05, Linf 0.0149939, total time[s] 0.085307 +Converged at iteration 29, L1 8.66979e-05, Linf 0.0168837, total time[s] 0.082156 +Converged at iteration 25, L1 5.52989e-05, Linf 0.0025037, total time[s] 0.065124 +Converged at iteration 37, L1 5.66094e-05, Linf 0.00780452, total time[s] 0.101846 +Converged at iteration 34, L1 8.49141e-05, Linf 0.00663217, total time[s] 0.093304 +Converged at iteration 25, L1 5.8501e-05, Linf 0.00363779, total time[s] 0.065885 +Converged at iteration 25, L1 4.50506e-05, Linf 0.0100629, total time[s] 0.065727 +Converged at iteration 26, L1 7.82345e-05, Linf 0.0179581, total time[s] 0.07107 +Converged at iteration 26, L1 5.29259e-05, Linf 0.0167323, total time[s] 0.074638 +Converged at iteration 21, L1 3.95651e-05, Linf 0.00724691, total time[s] 0.058922 +Converged at iteration 19, L1 8.67169e-05, Linf 0.00366498, total time[s] 0.055251 +Converged at iteration 24, L1 6.13325e-05, Linf 0.00249837, total time[s] 0.061489 +Converged at iteration 23, L1 9.1324e-05, Linf 0.00642464, total time[s] 0.058801 +Converged at iteration 21, L1 4.84808e-05, Linf 0.0024817, total time[s] 0.058004 +Converged at iteration 19, L1 8.75193e-05, Linf 0.00292184, total time[s] 0.093374 +Converged at iteration 31, L1 8.62354e-05, Linf 0.0125976, total time[s] 0.089963 +Converged at iteration 22, L1 6.57044e-05, Linf 0.00340022, total time[s] 0.058835 +Converged at iteration 23, L1 9.00122e-05, Linf 0.00745012, total time[s] 0.063291 +Converged at iteration 27, L1 6.16206e-05, Linf 0.00345642, total time[s] 0.077693 +Converged at iteration 24, L1 5.92574e-05, Linf 0.00420034, total time[s] 0.070021 +Converged at iteration 23, L1 8.89911e-05, Linf 0.0048539, total time[s] 0.070258 +Converged at iteration 25, L1 8.37854e-05, Linf 0.00522767, total time[s] 0.066235 +Converged at iteration 25, L1 9.54476e-05, Linf 0.00605811, total time[s] 0.068503 +Converged at iteration 27, L1 8.23524e-05, Linf 0.00743279, total time[s] 0.074966 +Converged at iteration 32, L1 6.377e-05, Linf 0.00334899, total time[s] 0.09707 +Converged at iteration 26, L1 8.90286e-05, Linf 0.00253422, total time[s] 0.071632 +Converged at iteration 31, L1 7.37827e-05, Linf 0.00901963, total time[s] 0.085155 +Converged at iteration 31, L1 5.96093e-05, Linf 0.00240814, total time[s] 0.079343 +Converged at iteration 32, L1 6.44005e-05, Linf 0.00300323, total time[s] 0.087517 +Converged at iteration 30, L1 7.71134e-05, Linf 0.00313157, total time[s] 0.079095 +Converged at iteration 31, L1 7.47141e-05, Linf 0.0155563, total time[s] 0.078795 +Converged at iteration 29, L1 8.64998e-05, Linf 0.0170984, total time[s] 0.074811 +Converged at iteration 25, L1 5.55153e-05, Linf 0.00244659, total time[s] 0.070293 +Converged at iteration 37, L1 5.96901e-05, Linf 0.00823224, total time[s] 0.107774 +Converged at iteration 34, L1 9.39397e-05, Linf 0.00695347, total time[s] 0.086175 +Converged at iteration 25, L1 6.14755e-05, Linf 0.00372256, total time[s] 0.071153 +Converged at iteration 25, L1 4.62258e-05, Linf 0.00954325, total time[s] 0.066615 +Converged at iteration 26, L1 6.45606e-05, Linf 0.0166886, total time[s] 0.067622 +Converged at iteration 26, L1 5.05452e-05, Linf 0.0169832, total time[s] 0.066949 +Converged at iteration 21, L1 4.00928e-05, Linf 0.00730049, total time[s] 0.055213 +Converged at iteration 19, L1 8.47514e-05, Linf 0.00350534, total time[s] 0.051596 +Converged at iteration 24, L1 5.9862e-05, Linf 0.00248458, total time[s] 0.06274 +Converged at iteration 23, L1 9.51834e-05, Linf 0.00564691, total time[s] 0.059995 +Converged at iteration 21, L1 5.16113e-05, Linf 0.00263384, total time[s] 0.057079 +Converged at iteration 19, L1 9.54706e-05, Linf 0.00320143, total time[s] 0.051146 +Converged at iteration 31, L1 8.87934e-05, Linf 0.0130959, total time[s] 0.082285 +Converged at iteration 22, L1 6.50322e-05, Linf 0.0034902, total time[s] 0.058842 +Converged at iteration 24, L1 5.72353e-05, Linf 0.00428714, total time[s] 0.068051 +Converged at iteration 27, L1 6.00896e-05, Linf 0.00334945, total time[s] 0.071414 +Converged at iteration 24, L1 5.91609e-05, Linf 0.00417418, total time[s] 0.062685 +Converged at iteration 23, L1 9.19349e-05, Linf 0.00493058, total time[s] 0.061547 +Converged at iteration 25, L1 8.88387e-05, Linf 0.00544221, total time[s] 0.067427 +Converged at iteration 26, L1 5.58564e-05, Linf 0.00401921, total time[s] 0.068001 +Converged at iteration 27, L1 8.16131e-05, Linf 0.00692447, total time[s] 0.070812 +Converged at iteration 32, L1 6.54892e-05, Linf 0.00342757, total time[s] 0.085596 +Converged at iteration 26, L1 8.39676e-05, Linf 0.00222178, total time[s] 0.069047 +Converged at iteration 31, L1 7.53584e-05, Linf 0.00923991, total time[s] 0.083686 +Converged at iteration 31, L1 5.87703e-05, Linf 0.00241564, total time[s] 0.080458 +Converged at iteration 32, L1 6.71806e-05, Linf 0.00314146, total time[s] 0.082522 +Converged at iteration 30, L1 8.37254e-05, Linf 0.00333979, total time[s] 0.077956 +Converged at iteration 31, L1 8.30525e-05, Linf 0.0167343, total time[s] 0.080672 +Converged at iteration 29, L1 8.82217e-05, Linf 0.0176811, total time[s] 0.075697 +Converged at iteration 25, L1 5.68769e-05, Linf 0.00239724, total time[s] 0.067034 +Converged at iteration 37, L1 6.14912e-05, Linf 0.00842723, total time[s] 0.098683 +Converged at iteration 34, L1 9.74822e-05, Linf 0.00706917, total time[s] 0.090645 +Converged at iteration 25, L1 6.21606e-05, Linf 0.0037236, total time[s] 0.071026 +Converged at iteration 25, L1 4.57626e-05, Linf 0.009244, total time[s] 0.066126 +Converged at iteration 26, L1 5.93432e-05, Linf 0.0162086, total time[s] 0.085526 +Converged at iteration 26, L1 4.94889e-05, Linf 0.0163543, total time[s] 0.093651 +Converged at iteration 21, L1 4.05856e-05, Linf 0.00733781, total time[s] 0.056679 +Converged at iteration 19, L1 8.33623e-05, Linf 0.00351107, total time[s] 0.05363 +Converged at iteration 24, L1 5.94956e-05, Linf 0.00242015, total time[s] 0.072537 +Converged at iteration 23, L1 9.68661e-05, Linf 0.00534255, total time[s] 0.062046 +Converged at iteration 21, L1 5.29361e-05, Linf 0.00270466, total time[s] 0.056653 +Converged at iteration 19, L1 9.81088e-05, Linf 0.00332952, total time[s] 0.053291 +Converged at iteration 31, L1 8.91149e-05, Linf 0.0132604, total time[s] 0.085235 +Converged at iteration 22, L1 6.7532e-05, Linf 0.00351929, total time[s] 0.058364 +Converged at iteration 24, L1 5.65276e-05, Linf 0.00430551, total time[s] 0.063594 +Converged at iteration 27, L1 5.97013e-05, Linf 0.00332253, total time[s] 0.071392 +Converged at iteration 24, L1 5.9136e-05, Linf 0.00428382, total time[s] 0.064484 +Converged at iteration 23, L1 9.29539e-05, Linf 0.00494041, total time[s] 0.061653 +Converged at iteration 25, L1 9.13683e-05, Linf 0.00552281, total time[s] 0.066129 +Converged at iteration 26, L1 5.86277e-05, Linf 0.00410097, total time[s] 0.067767 +Converged at iteration 27, L1 8.06061e-05, Linf 0.00643247, total time[s] 0.089912 +Converged at iteration 32, L1 6.55781e-05, Linf 0.00351675, total time[s] 0.088463 +Converged at iteration 26, L1 8.17595e-05, Linf 0.00226774, total time[s] 0.067293 +Converged at iteration 31, L1 7.52434e-05, Linf 0.00924244, total time[s] 0.078651 +Converged at iteration 31, L1 5.8724e-05, Linf 0.00241586, total time[s] 0.080659 +Converged at iteration 32, L1 6.88306e-05, Linf 0.00320773, total time[s] 0.082687 +Converged at iteration 30, L1 8.59846e-05, Linf 0.00342303, total time[s] 0.077439 +Converged at iteration 31, L1 8.69697e-05, Linf 0.0172539, total time[s] 0.07992 +Converged at iteration 29, L1 8.83216e-05, Linf 0.0178603, total time[s] 0.077418 +Converged at iteration 25, L1 5.71676e-05, Linf 0.00241716, total time[s] 0.066494 +Converged at iteration 37, L1 6.49398e-05, Linf 0.00889287, total time[s] 0.102975 +Converged at iteration 35, L1 3.69008e-05, Linf 0.00439208, total time[s] 0.144648 +Converged at iteration 25, L1 6.49583e-05, Linf 0.00375337, total time[s] 0.068994 +Converged at iteration 25, L1 4.88193e-05, Linf 0.00886072, total time[s] 0.067984 +Converged at iteration 26, L1 4.96518e-05, Linf 0.0147968, total time[s] 0.068972 +Converged at iteration 26, L1 4.79773e-05, Linf 0.0161031, total time[s] 0.068684 +Converged at iteration 21, L1 4.22046e-05, Linf 0.00736382, total time[s] 0.056518 +Converged at iteration 19, L1 8.21094e-05, Linf 0.00332987, total time[s] 0.052192 +Converged at iteration 24, L1 5.78834e-05, Linf 0.00352114, total time[s] 0.06473 +Converged at iteration 24, L1 5.82793e-05, Linf 0.00197766, total time[s] 0.064311 +Converged at iteration 21, L1 5.65911e-05, Linf 0.00287047, total time[s] 0.057018 +Converged at iteration 20, L1 4.80679e-05, Linf 0.0019522, total time[s] 0.054487 +Converged at iteration 31, L1 9.13656e-05, Linf 0.0137312, total time[s] 0.08096 +Converged at iteration 22, L1 6.79438e-05, Linf 0.003598, total time[s] 0.059329 +Converged at iteration 24, L1 5.78231e-05, Linf 0.00443859, total time[s] 0.066876 +Converged at iteration 27, L1 5.62015e-05, Linf 0.00319513, total time[s] 0.071416 +Converged at iteration 24, L1 6.09203e-05, Linf 0.00458972, total time[s] 0.06411 +Converged at iteration 23, L1 9.59275e-05, Linf 0.00499182, total time[s] 0.063477 +Converged at iteration 25, L1 9.80863e-05, Linf 0.0057703, total time[s] 0.072801 +Converged at iteration 26, L1 6.58974e-05, Linf 0.00434787, total time[s] 0.0678 +Converged at iteration 27, L1 8.01194e-05, Linf 0.00588651, total time[s] 0.07291 +Converged at iteration 32, L1 6.52186e-05, Linf 0.00367541, total time[s] 0.081904 +Converged at iteration 26, L1 7.60961e-05, Linf 0.00241168, total time[s] 0.067827 +Converged at iteration 31, L1 7.60883e-05, Linf 0.00942556, total time[s] 0.079925 +Converged at iteration 31, L1 5.81061e-05, Linf 0.00241658, total time[s] 0.079607 +Converged at iteration 32, L1 7.25693e-05, Linf 0.00332822, total time[s] 0.08206 +Converged at iteration 30, L1 9.08284e-05, Linf 0.00373493, total time[s] 0.087398 +Converged at iteration 31, L1 9.78513e-05, Linf 0.0185357, total time[s] 0.080655 +Converged at iteration 29, L1 9.06118e-05, Linf 0.0184267, total time[s] 0.076558 +Converged at iteration 25, L1 5.78722e-05, Linf 0.00231109, total time[s] 0.069039 +Converged at iteration 37, L1 6.65826e-05, Linf 0.00908786, total time[s] 0.105522 +Converged at iteration 35, L1 3.81343e-05, Linf 0.00447796, total time[s] 0.096724 +Converged at iteration 25, L1 6.43616e-05, Linf 0.00373753, total time[s] 0.079037 +Converged at iteration 25, L1 4.90786e-05, Linf 0.00863496, total time[s] 0.069795 +Converged at iteration 26, L1 4.61333e-05, Linf 0.0142007, total time[s] 0.068172 +Converged at iteration 26, L1 4.71817e-05, Linf 0.0159143, total time[s] 0.082221 +Converged at iteration 21, L1 4.24936e-05, Linf 0.00739214, total time[s] 0.058382 +Converged at iteration 19, L1 7.93989e-05, Linf 0.0033359, total time[s] 0.055304 +Converged at iteration 24, L1 5.73481e-05, Linf 0.00235031, total time[s] 0.068771 +Converged at iteration 24, L1 5.96898e-05, Linf 0.00207087, total time[s] 0.063489 +Converged at iteration 21, L1 5.81379e-05, Linf 0.00293908, total time[s] 0.059957 +Converged at iteration 20, L1 4.94634e-05, Linf 0.00202216, total time[s] 0.056355 +Converged at iteration 31, L1 9.23501e-05, Linf 0.013872, total time[s] 0.086011 +Converged at iteration 22, L1 6.40245e-05, Linf 0.00362704, total time[s] 0.059708 +Converged at iteration 24, L1 5.82202e-05, Linf 0.00445961, total time[s] 0.064576 +Converged at iteration 27, L1 5.61324e-05, Linf 0.0031736, total time[s] 0.07141 +Converged at iteration 24, L1 6.17062e-05, Linf 0.00477471, total time[s] 0.068635 +Converged at iteration 23, L1 9.69203e-05, Linf 0.00499906, total time[s] 0.069782 +Converged at iteration 25, L1 9.96978e-05, Linf 0.00585831, total time[s] 0.066734 +Converged at iteration 26, L1 6.85909e-05, Linf 0.00443967, total time[s] 0.08016 +Converged at iteration 27, L1 8.0233e-05, Linf 0.00610666, total time[s] 0.072018 +Converged at iteration 32, L1 6.53518e-05, Linf 0.00376978, total time[s] 0.083862 +Converged at iteration 26, L1 7.43251e-05, Linf 0.00245148, total time[s] 0.069646 +Converged at iteration 31, L1 7.70745e-05, Linf 0.00942593, total time[s] 0.086043 +Converged at iteration 31, L1 5.95329e-05, Linf 0.00239855, total time[s] 0.086929 +Converged at iteration 32, L1 7.4204e-05, Linf 0.00339766, total time[s] 0.093001 +Converged at iteration 30, L1 8.87703e-05, Linf 0.00389381, total time[s] 0.079616 +Converged at iteration 32, L1 3.65412e-05, Linf 0.0083649, total time[s] 0.081057 +Converged at iteration 29, L1 9.08874e-05, Linf 0.0185743, total time[s] 0.073173 +Converged at iteration 25, L1 5.76656e-05, Linf 0.00237026, total time[s] 0.066779 +Converged at iteration 37, L1 7.02251e-05, Linf 0.00958262, total time[s] 0.095774 +Converged at iteration 35, L1 4.20887e-05, Linf 0.00492132, total time[s] 0.094382 +Converged at iteration 25, L1 6.43323e-05, Linf 0.00375358, total time[s] 0.064699 +Converged at iteration 25, L1 5.34797e-05, Linf 0.00836825, total time[s] 0.0674 +Converged at iteration 26, L1 4.56637e-05, Linf 0.0127474, total time[s] 0.066317 +Converged at iteration 26, L1 4.62199e-05, Linf 0.0154832, total time[s] 0.067476 +Converged at iteration 21, L1 4.35108e-05, Linf 0.00740563, total time[s] 0.058144 +Converged at iteration 19, L1 7.51567e-05, Linf 0.00313118, total time[s] 0.050493 +Converged at iteration 24, L1 5.64807e-05, Linf 0.00222774, total time[s] 0.065285 +Converged at iteration 24, L1 6.37192e-05, Linf 0.00350666, total time[s] 0.072281 +Converged at iteration 21, L1 6.1642e-05, Linf 0.00308646, total time[s] 0.069259 +Converged at iteration 20, L1 5.31221e-05, Linf 0.00220395, total time[s] 0.088704 +Converged at iteration 31, L1 9.61247e-05, Linf 0.0142969, total time[s] 0.08394 +Converged at iteration 22, L1 6.41411e-05, Linf 0.00370354, total time[s] 0.070265 +Converged at iteration 24, L1 5.89186e-05, Linf 0.00457312, total time[s] 0.065081 +Converged at iteration 27, L1 5.33198e-05, Linf 0.00304553, total time[s] 0.078192 +Converged at iteration 24, L1 6.28077e-05, Linf 0.00505745, total time[s] 0.071833 +Converged at iteration 23, L1 9.87662e-05, Linf 0.00504396, total time[s] 0.065131 +Converged at iteration 26, L1 4.95279e-05, Linf 0.00345645, total time[s] 0.069419 +Converged at iteration 26, L1 7.67311e-05, Linf 0.00473963, total time[s] 0.066289 +Converged at iteration 27, L1 8.19788e-05, Linf 0.0068297, total time[s] 0.073701 +Converged at iteration 32, L1 6.59972e-05, Linf 0.00389801, total time[s] 0.088789 +Converged at iteration 26, L1 7.10896e-05, Linf 0.00257162, total time[s] 0.08667 +Converged at iteration 31, L1 7.72503e-05, Linf 0.00952739, total time[s] 0.092568 +Converged at iteration 31, L1 5.85945e-05, Linf 0.00245952, total time[s] 0.093985 +Converged at iteration 32, L1 7.73953e-05, Linf 0.00349744, total time[s] 0.082414 +Converged at iteration 30, L1 8.50573e-05, Linf 0.00409518, total time[s] 0.076193 +Converged at iteration 32, L1 3.94474e-05, Linf 0.00911246, total time[s] 0.08186 +Converged at iteration 29, L1 9.54782e-05, Linf 0.0191046, total time[s] 0.075168 +Converged at iteration 25, L1 5.86905e-05, Linf 0.00293727, total time[s] 0.065514 +Converged at iteration 37, L1 7.15558e-05, Linf 0.00978298, total time[s] 0.098468 +Converged at iteration 35, L1 4.33497e-05, Linf 0.0050916, total time[s] 0.092269 +Converged at iteration 25, L1 6.46351e-05, Linf 0.00375592, total time[s] 0.0658 +Converged at iteration 25, L1 5.39027e-05, Linf 0.00817801, total time[s] 0.065192 +Converged at iteration 26, L1 3.73793e-05, Linf 0.0120745, total time[s] 0.068291 +Converged at iteration 26, L1 4.56095e-05, Linf 0.015168, total time[s] 0.067683 +Converged at iteration 21, L1 4.38792e-05, Linf 0.00742763, total time[s] 0.056173 +Converged at iteration 19, L1 7.30836e-05, Linf 0.00312581, total time[s] 0.051526 +Converged at iteration 24, L1 5.60128e-05, Linf 0.00222592, total time[s] 0.072488 +Converged at iteration 24, L1 6.25113e-05, Linf 0.00225051, total time[s] 0.071971 +Converged at iteration 21, L1 6.2954e-05, Linf 0.00316774, total time[s] 0.072501 +Converged at iteration 20, L1 5.45164e-05, Linf 0.00227993, total time[s] 0.053069 +Converged at iteration 31, L1 9.68678e-05, Linf 0.0144153, total time[s] 0.079777 +Converged at iteration 22, L1 6.48959e-05, Linf 0.00372432, total time[s] 0.058286 +Converged at iteration 24, L1 5.87809e-05, Linf 0.00506638, total time[s] 0.063173 +Converged at iteration 27, L1 5.33739e-05, Linf 0.00302539, total time[s] 0.070098 +Converged at iteration 24, L1 6.27107e-05, Linf 0.00510819, total time[s] 0.063664 +Converged at iteration 23, L1 9.89373e-05, Linf 0.00504339, total time[s] 0.060624 +Converged at iteration 26, L1 5.03229e-05, Linf 0.00349666, total time[s] 0.068899 +Converged at iteration 26, L1 7.97405e-05, Linf 0.00484906, total time[s] 0.067602 +Converged at iteration 27, L1 8.27836e-05, Linf 0.00641996, total time[s] 0.075494 +Converged at iteration 32, L1 6.66736e-05, Linf 0.00396507, total time[s] 0.088926 +Converged at iteration 26, L1 7.0439e-05, Linf 0.00262712, total time[s] 0.067493 +Converged at iteration 31, L1 7.72932e-05, Linf 0.00959327, total time[s] 0.087607 +Converged at iteration 31, L1 5.87436e-05, Linf 0.00243585, total time[s] 0.086229 +Converged at iteration 32, L1 7.85715e-05, Linf 0.00354658, total time[s] 0.089421 +Converged at iteration 30, L1 8.42196e-05, Linf 0.00430058, total time[s] 0.092948 +Converged at iteration 32, L1 4.08623e-05, Linf 0.00940747, total time[s] 0.082169 +Converged at iteration 29, L1 9.33754e-05, Linf 0.0192236, total time[s] 0.081292 +Converged at iteration 25, L1 5.86336e-05, Linf 0.00282155, total time[s] 0.066757 +Converged at iteration 37, L1 7.53493e-05, Linf 0.0103196, total time[s] 0.096622 +Converged at iteration 35, L1 4.74046e-05, Linf 0.00561095, total time[s] 0.09045 +Converged at iteration 25, L1 6.66149e-05, Linf 0.0037729, total time[s] 0.082851 +Converged at iteration 25, L1 5.89586e-05, Linf 0.0079422, total time[s] 0.078863 +Converged at iteration 25, L1 9.90479e-05, Linf 0.0214703, total time[s] 0.074651 +Converged at iteration 26, L1 4.50431e-05, Linf 0.0149643, total time[s] 0.069235 +Converged at iteration 21, L1 4.6342e-05, Linf 0.00744114, total time[s] 0.056343 +Converged at iteration 19, L1 6.88615e-05, Linf 0.00294437, total time[s] 0.051551 +Converged at iteration 24, L1 5.71872e-05, Linf 0.00286342, total time[s] 0.06244 +Converged at iteration 24, L1 6.55752e-05, Linf 0.00241637, total time[s] 0.069337 +Converged at iteration 21, L1 6.70591e-05, Linf 0.00332436, total time[s] 0.065251 +Converged at iteration 20, L1 5.83461e-05, Linf 0.00248724, total time[s] 0.052712 +Converged at iteration 32, L1 3.90143e-05, Linf 0.00861708, total time[s] 0.090356 +Converged at iteration 22, L1 6.57863e-05, Linf 0.00373266, total time[s] 0.058398 +Converged at iteration 24, L1 5.77602e-05, Linf 0.00472455, total time[s] 0.063014 +Converged at iteration 27, L1 5.3804e-05, Linf 0.0029459, total time[s] 0.070126 +Converged at iteration 24, L1 6.21741e-05, Linf 0.00498607, total time[s] 0.067129 +Converged at iteration 24, L1 5.50872e-05, Linf 0.00321177, total time[s] 0.070848 +Converged at iteration 26, L1 5.46479e-05, Linf 0.00365737, total time[s] 0.069066 +Converged at iteration 26, L1 8.90249e-05, Linf 0.00528073, total time[s] 0.068543 +Converged at iteration 27, L1 8.33837e-05, Linf 0.00645375, total time[s] 0.083787 +Converged at iteration 32, L1 6.839e-05, Linf 0.00403661, total time[s] 0.104552 +Converged at iteration 26, L1 7.12647e-05, Linf 0.00270432, total time[s] 0.075632 +Converged at iteration 31, L1 7.6295e-05, Linf 0.00984624, total time[s] 0.093956 +Converged at iteration 31, L1 5.9319e-05, Linf 0.00244031, total time[s] 0.092048 +Converged at iteration 32, L1 8.49905e-05, Linf 0.00438153, total time[s] 0.123644 +Converged at iteration 30, L1 8.6394e-05, Linf 0.00442681, total time[s] 0.090841 +Converged at iteration 32, L1 4.55547e-05, Linf 0.0102413, total time[s] 0.103999 +Converged at iteration 30, L1 3.58655e-05, Linf 0.00578074, total time[s] 0.094299 +Converged at iteration 25, L1 6.17057e-05, Linf 0.00343579, total time[s] 0.074289 +Converged at iteration 37, L1 7.67107e-05, Linf 0.0102206, total time[s] 0.107554 +Converged at iteration 35, L1 4.86605e-05, Linf 0.00578479, total time[s] 0.137875 +Converged at iteration 25, L1 6.70115e-05, Linf 0.00375797, total time[s] 0.074944 +Converged at iteration 25, L1 5.98176e-05, Linf 0.00776999, total time[s] 0.07253 +Converged at iteration 25, L1 9.44983e-05, Linf 0.0208647, total time[s] 0.070146 +Converged at iteration 26, L1 4.54591e-05, Linf 0.0151695, total time[s] 0.082921 +Converged at iteration 21, L1 4.6723e-05, Linf 0.00746164, total time[s] 0.075222 +Converged at iteration 19, L1 6.60207e-05, Linf 0.00295304, total time[s] 0.07184 +Converged at iteration 24, L1 5.56751e-05, Linf 0.00278094, total time[s] 0.081234 +Converged at iteration 24, L1 6.76271e-05, Linf 0.00250549, total time[s] 0.072261 +Converged at iteration 21, L1 6.83943e-05, Linf 0.0033839, total time[s] 0.058222 +Converged at iteration 20, L1 5.9755e-05, Linf 0.00256616, total time[s] 0.062884 +Converged at iteration 32, L1 3.95233e-05, Linf 0.00861709, total time[s] 0.087683 +Converged at iteration 22, L1 6.66606e-05, Linf 0.00386698, total time[s] 0.08058 +Converged at iteration 24, L1 5.75047e-05, Linf 0.00469806, total time[s] 0.068199 +Converged at iteration 27, L1 5.34325e-05, Linf 0.002926, total time[s] 0.072103 +Converged at iteration 24, L1 6.15892e-05, Linf 0.0048673, total time[s] 0.064454 +Converged at iteration 24, L1 5.51665e-05, Linf 0.00319964, total time[s] 0.06426 +Converged at iteration 26, L1 5.48129e-05, Linf 0.00370984, total time[s] 0.068522 +Converged at iteration 26, L1 9.22105e-05, Linf 0.00534272, total time[s] 0.071114 +Converged at iteration 27, L1 8.25591e-05, Linf 0.00647073, total time[s] 0.074949 +Converged at iteration 32, L1 6.89312e-05, Linf 0.00425303, total time[s] 0.086135 +Converged at iteration 26, L1 7.19453e-05, Linf 0.00272474, total time[s] 0.076196 +Converged at iteration 31, L1 7.77833e-05, Linf 0.00977793, total time[s] 0.089556 +Converged at iteration 31, L1 5.92712e-05, Linf 0.00245056, total time[s] 0.088198 +Converged at iteration 32, L1 8.31205e-05, Linf 0.00369727, total time[s] 0.100931 +Converged at iteration 30, L1 8.74935e-05, Linf 0.00468646, total time[s] 0.089632 +Converged at iteration 32, L1 4.76769e-05, Linf 0.0107666, total time[s] 0.090462 +Converged at iteration 29, L1 9.57449e-05, Linf 0.0202059, total time[s] 0.095659 +Converged at iteration 25, L1 5.98737e-05, Linf 0.0028614, total time[s] 0.06716 +Converged at iteration 37, L1 7.98629e-05, Linf 0.0104819, total time[s] 0.096993 +Converged at iteration 35, L1 5.28859e-05, Linf 0.00633295, total time[s] 0.1009 +Converged at iteration 25, L1 7.02084e-05, Linf 0.00367732, total time[s] 0.068786 +Converged at iteration 25, L1 6.45755e-05, Linf 0.00750962, total time[s] 0.065652 +Converged at iteration 25, L1 8.40025e-05, Linf 0.0193332, total time[s] 0.067816 +Converged at iteration 26, L1 4.52224e-05, Linf 0.0145164, total time[s] 0.074397 +Converged at iteration 21, L1 4.8498e-05, Linf 0.00741122, total time[s] 0.06097 +Converged at iteration 19, L1 6.14408e-05, Linf 0.00340667, total time[s] 0.071414 +Converged at iteration 24, L1 5.47477e-05, Linf 0.00241373, total time[s] 0.072557 +Converged at iteration 24, L1 6.86207e-05, Linf 0.00270775, total time[s] 0.066232 +Converged at iteration 21, L1 7.21085e-05, Linf 0.00353268, total time[s] 0.05739 +Converged at iteration 20, L1 6.42314e-05, Linf 0.00277855, total time[s] 0.059417 +Converged at iteration 32, L1 4.04874e-05, Linf 0.00866196, total time[s] 0.082371 +Converged at iteration 22, L1 7.08809e-05, Linf 0.00396742, total time[s] 0.059212 +Converged at iteration 24, L1 5.99979e-05, Linf 0.00481677, total time[s] 0.065422 +Converged at iteration 27, L1 5.11408e-05, Linf 0.00281116, total time[s] 0.069116 +Converged at iteration 24, L1 6.12811e-05, Linf 0.00460456, total time[s] 0.064461 +Converged at iteration 24, L1 5.62853e-05, Linf 0.00321469, total time[s] 0.067389 +Converged at iteration 26, L1 5.72678e-05, Linf 0.00388499, total time[s] 0.080762 +Converged at iteration 27, L1 5.46711e-05, Linf 0.00352611, total time[s] 0.080255 +Converged at iteration 27, L1 8.51138e-05, Linf 0.00649779, total time[s] 0.086746 +Converged at iteration 32, L1 7.0691e-05, Linf 0.00428036, total time[s] 0.081156 +Converged at iteration 26, L1 7.72881e-05, Linf 0.00283171, total time[s] 0.065667 +Converged at iteration 31, L1 7.86424e-05, Linf 0.00995529, total time[s] 0.097764 +Converged at iteration 31, L1 5.84847e-05, Linf 0.00246299, total time[s] 0.090502 +Converged at iteration 32, L1 8.56997e-05, Linf 0.00380464, total time[s] 0.082728 +Converged at iteration 30, L1 9.23016e-05, Linf 0.0048154, total time[s] 0.074483 +Converged at iteration 32, L1 5.17771e-05, Linf 0.0117344, total time[s] 0.078183 +Converged at iteration 29, L1 9.68053e-05, Linf 0.0188623, total time[s] 0.071353 +Converged at iteration 25, L1 6.09313e-05, Linf 0.00287745, total time[s] 0.062571 +Converged at iteration 37, L1 8.15141e-05, Linf 0.0106647, total time[s] 0.090866 +Converged at iteration 35, L1 5.40047e-05, Linf 0.00651456, total time[s] 0.08746 +Converged at iteration 25, L1 7.06082e-05, Linf 0.00364413, total time[s] 0.061722 +Converged at iteration 25, L1 6.65428e-05, Linf 0.00741199, total time[s] 0.069623 +Converged at iteration 25, L1 8.52579e-05, Linf 0.0185568, total time[s] 0.087771 +Converged at iteration 26, L1 4.67796e-05, Linf 0.015021, total time[s] 0.071969 +Converged at iteration 21, L1 4.86966e-05, Linf 0.00743494, total time[s] 0.060495 +Converged at iteration 19, L1 5.7271e-05, Linf 0.00291455, total time[s] 0.065215 +Converged at iteration 24, L1 5.42238e-05, Linf 0.00223997, total time[s] 0.065471 +Converged at iteration 24, L1 7.07476e-05, Linf 0.00278139, total time[s] 0.064152 +Converged at iteration 21, L1 7.40267e-05, Linf 0.00357689, total time[s] 0.060233 +Converged at iteration 20, L1 6.63236e-05, Linf 0.00291279, total time[s] 0.056318 +Converged at iteration 32, L1 4.0723e-05, Linf 0.0086462, total time[s] 0.088259 +Converged at iteration 22, L1 7.23185e-05, Linf 0.00400587, total time[s] 0.073417 +Converged at iteration 24, L1 5.847e-05, Linf 0.00490448, total time[s] 0.071111 +Converged at iteration 27, L1 4.96107e-05, Linf 0.00279173, total time[s] 0.077988 +Converged at iteration 24, L1 6.10087e-05, Linf 0.00448883, total time[s] 0.103775 +Converged at iteration 24, L1 5.5443e-05, Linf 0.00318955, total time[s] 0.073626 +Converged at iteration 26, L1 5.79741e-05, Linf 0.00394035, total time[s] 0.065402 +Converged at iteration 27, L1 5.59538e-05, Linf 0.0036094, total time[s] 0.06726 +Converged at iteration 27, L1 8.47283e-05, Linf 0.00651296, total time[s] 0.069167 +Converged at iteration 32, L1 7.1707e-05, Linf 0.00446132, total time[s] 0.07915 +Converged at iteration 26, L1 7.94932e-05, Linf 0.00279843, total time[s] 0.066513 +Converged at iteration 31, L1 7.89278e-05, Linf 0.00996231, total time[s] 0.091244 +Converged at iteration 31, L1 5.68322e-05, Linf 0.00245613, total time[s] 0.086734 +Converged at iteration 32, L1 8.67589e-05, Linf 0.00385886, total time[s] 0.08996 +Converged at iteration 30, L1 9.38143e-05, Linf 0.00496967, total time[s] 0.08161 +Converged at iteration 32, L1 5.36468e-05, Linf 0.0118524, total time[s] 0.080334 +Converged at iteration 29, L1 9.64318e-05, Linf 0.0186044, total time[s] 0.073821 +Converged at iteration 25, L1 6.25275e-05, Linf 0.00322657, total time[s] 0.064737 +Converged at iteration 37, L1 8.38651e-05, Linf 0.0112134, total time[s] 0.096855 +Converged at iteration 35, L1 5.90596e-05, Linf 0.00711494, total time[s] 0.091688 +Converged at iteration 25, L1 7.40296e-05, Linf 0.0037044, total time[s] 0.064604 +Converged at iteration 25, L1 7.1414e-05, Linf 0.00721144, total time[s] 0.064253 +Converged at iteration 25, L1 7.12333e-05, Linf 0.0167817, total time[s] 0.064898 +Converged at iteration 26, L1 4.7251e-05, Linf 0.0146027, total time[s] 0.066949 +Converged at iteration 21, L1 4.84066e-05, Linf 0.00767199, total time[s] 0.056582 +Converged at iteration 19, L1 4.97112e-05, Linf 0.00314846, total time[s] 0.073469 +Converged at iteration 24, L1 5.27602e-05, Linf 0.00216541, total time[s] 0.071285 +Converged at iteration 24, L1 7.27378e-05, Linf 0.00292681, total time[s] 0.067136 +Converged at iteration 21, L1 7.80049e-05, Linf 0.00371758, total time[s] 0.057414 +Converged at iteration 20, L1 7.04924e-05, Linf 0.00306499, total time[s] 0.058876 +Converged at iteration 32, L1 4.21874e-05, Linf 0.00856184, total time[s] 0.113318 +Converged at iteration 22, L1 7.27736e-05, Linf 0.00411076, total time[s] 0.070609 +Converged at iteration 24, L1 5.90956e-05, Linf 0.00553615, total time[s] 0.08661 +Converged at iteration 27, L1 4.87128e-05, Linf 0.00266501, total time[s] 0.080398 +Converged at iteration 24, L1 6.08617e-05, Linf 0.00427893, total time[s] 0.072334 +Converged at iteration 24, L1 5.5492e-05, Linf 0.00317996, total time[s] 0.07497 +Converged at iteration 26, L1 6.29912e-05, Linf 0.00412451, total time[s] 0.082833 +Converged at iteration 27, L1 6.38133e-05, Linf 0.00387501, total time[s] 0.070374 +Converged at iteration 27, L1 8.44003e-05, Linf 0.00654704, total time[s] 0.070226 +Converged at iteration 32, L1 7.2658e-05, Linf 0.00466469, total time[s] 0.082167 +Converged at iteration 26, L1 8.99241e-05, Linf 0.00290884, total time[s] 0.06657 +Converged at iteration 31, L1 7.64479e-05, Linf 0.00991009, total time[s] 0.078035 +Converged at iteration 31, L1 5.59068e-05, Linf 0.00241448, total time[s] 0.078046 +Converged at iteration 32, L1 9.17865e-05, Linf 0.00399071, total time[s] 0.080724 +Converged at iteration 30, L1 9.89751e-05, Linf 0.00557255, total time[s] 0.076525 +Converged at iteration 32, L1 5.97602e-05, Linf 0.0131322, total time[s] 0.080751 +Converged at iteration 29, L1 9.83602e-05, Linf 0.0169714, total time[s] 0.075171 +Converged at iteration 25, L1 6.39233e-05, Linf 0.00310577, total time[s] 0.066948 +Converged at iteration 37, L1 8.50315e-05, Linf 0.0114151, total time[s] 0.096627 +Converged at iteration 35, L1 6.06389e-05, Linf 0.00730012, total time[s] 0.100365 +Converged at iteration 25, L1 7.48802e-05, Linf 0.00368207, total time[s] 0.067728 +Converged at iteration 25, L1 7.23518e-05, Linf 0.00705908, total time[s] 0.074375 +Converged at iteration 25, L1 6.87637e-05, Linf 0.0161783, total time[s] 0.085336 +Converged at iteration 26, L1 4.77792e-05, Linf 0.0146102, total time[s] 0.115445 +Converged at iteration 21, L1 4.8417e-05, Linf 0.00778376, total time[s] 0.086208 +Converged at iteration 19, L1 4.63124e-05, Linf 0.00322047, total time[s] 0.073726 +Converged at iteration 23, L1 9.95467e-05, Linf 0.00302952, total time[s] 0.092444 +Converged at iteration 24, L1 7.53271e-05, Linf 0.00335051, total time[s] 0.091401 +Converged at iteration 21, L1 7.86452e-05, Linf 0.00374967, total time[s] 0.070644 +Converged at iteration 20, L1 7.07238e-05, Linf 0.00313962, total time[s] 0.088379 +Converged at iteration 32, L1 4.23684e-05, Linf 0.00864805, total time[s] 0.100034 +Converged at iteration 22, L1 6.9345e-05, Linf 0.00414139, total time[s] 0.067145 +Converged at iteration 24, L1 5.73205e-05, Linf 0.00499516, total time[s] 0.063997 +Converged at iteration 27, L1 4.76352e-05, Linf 0.00263635, total time[s] 0.070961 +Converged at iteration 24, L1 6.03876e-05, Linf 0.0041834, total time[s] 0.063905 +Converged at iteration 24, L1 5.39404e-05, Linf 0.00315847, total time[s] 0.065967 +Converged at iteration 26, L1 6.3869e-05, Linf 0.00419742, total time[s] 0.073074 +Converged at iteration 27, L1 6.48543e-05, Linf 0.00392033, total time[s] 0.074683 +Converged at iteration 27, L1 8.41199e-05, Linf 0.00655812, total time[s] 0.070288 +Converged at iteration 32, L1 7.32493e-05, Linf 0.00468379, total time[s] 0.085446 +Converged at iteration 26, L1 9.3449e-05, Linf 0.00298254, total time[s] 0.067359 +Converged at iteration 31, L1 7.60014e-05, Linf 0.00997704, total time[s] 0.079753 +Converged at iteration 31, L1 5.53309e-05, Linf 0.00245012, total time[s] 0.082043 +Converged at iteration 32, L1 9.37177e-05, Linf 0.00405192, total time[s] 0.081998 +Converged at iteration 31, L1 4.4671e-05, Linf 0.00411271, total time[s] 0.079232 +Converged at iteration 32, L1 6.1917e-05, Linf 0.0132506, total time[s] 0.082061 +Converged at iteration 29, L1 9.61828e-05, Linf 0.0158822, total time[s] 0.074987 +Converged at iteration 25, L1 6.34935e-05, Linf 0.00307032, total time[s] 0.066076 +Converged at iteration 37, L1 8.80668e-05, Linf 0.0111783, total time[s] 0.094591 +Converged at iteration 35, L1 6.52691e-05, Linf 0.00787646, total time[s] 0.123512 +Converged at iteration 25, L1 7.69943e-05, Linf 0.00364195, total time[s] 0.075646 +Converged at iteration 25, L1 7.51303e-05, Linf 0.00681218, total time[s] 0.070241 +Converged at iteration 25, L1 6.29526e-05, Linf 0.0145667, total time[s] 0.099241 +Converged at iteration 26, L1 4.99947e-05, Linf 0.0147948, total time[s] 0.075472 +Converged at iteration 21, L1 4.9322e-05, Linf 0.00761287, total time[s] 0.062043 +Converged at iteration 18, L1 9.75068e-05, Linf 0.00611063, total time[s] 0.062209 +Converged at iteration 23, L1 9.8847e-05, Linf 0.00304856, total time[s] 0.066034 +Converged at iteration 24, L1 7.6752e-05, Linf 0.00302192, total time[s] 0.068465 +Converged at iteration 21, L1 8.16941e-05, Linf 0.00387301, total time[s] 0.08096 +Converged at iteration 20, L1 7.49535e-05, Linf 0.00333166, total time[s] 0.072362 +Converged at iteration 32, L1 4.38737e-05, Linf 0.00867008, total time[s] 0.090395 +Converged at iteration 22, L1 7.06298e-05, Linf 0.00425501, total time[s] 0.069169 +Converged at iteration 24, L1 5.80173e-05, Linf 0.00510468, total time[s] 0.064235 +Converged at iteration 27, L1 4.44428e-05, Linf 0.00248906, total time[s] 0.070682 +Converged at iteration 24, L1 5.8571e-05, Linf 0.00394444, total time[s] 0.064216 +Converged at iteration 23, L1 9.84154e-05, Linf 0.00504563, total time[s] 0.062005 +Converged at iteration 26, L1 6.84044e-05, Linf 0.00436356, total time[s] 0.067812 +Converged at iteration 27, L1 7.20102e-05, Linf 0.00423647, total time[s] 0.07192 +Converged at iteration 27, L1 8.44878e-05, Linf 0.00657424, total time[s] 0.071859 +Converged at iteration 32, L1 7.68508e-05, Linf 0.00477973, total time[s] 0.082407 +Converged at iteration 27, L1 6.64062e-05, Linf 0.00197387, total time[s] 0.070874 +Converged at iteration 31, L1 8.05541e-05, Linf 0.00999543, total time[s] 0.084296 +Converged at iteration 31, L1 5.78295e-05, Linf 0.00245702, total time[s] 0.093669 +Converged at iteration 32, L1 9.81563e-05, Linf 0.004207, total time[s] 0.082856 +Converged at iteration 31, L1 4.58023e-05, Linf 0.00439318, total time[s] 0.082999 +Converged at iteration 32, L1 6.80923e-05, Linf 0.0143305, total time[s] 0.083531 +Converged at iteration 29, L1 9.63867e-05, Linf 0.0156958, total time[s] 0.078725 +Converged at iteration 25, L1 6.39853e-05, Linf 0.0031562, total time[s] 0.071246 +Converged at iteration 37, L1 8.92491e-05, Linf 0.0113682, total time[s] 0.099631 +Converged at iteration 35, L1 6.69039e-05, Linf 0.00807586, total time[s] 0.09779 +Converged at iteration 25, L1 7.71972e-05, Linf 0.0036276, total time[s] 0.068016 +Converged at iteration 25, L1 7.54615e-05, Linf 0.00666957, total time[s] 0.067073 +Converged at iteration 25, L1 6.15665e-05, Linf 0.0140265, total time[s] 0.067376 +Converged at iteration 26, L1 5.07395e-05, Linf 0.0147144, total time[s] 0.071185 +Converged at iteration 21, L1 4.90952e-05, Linf 0.00763331, total time[s] 0.070861 +Converged at iteration 18, L1 9.48071e-05, Linf 0.00611702, total time[s] 0.05446 +Converged at iteration 23, L1 9.83897e-05, Linf 0.00307318, total time[s] 0.078002 +Converged at iteration 24, L1 7.62255e-05, Linf 0.00305278, total time[s] 0.072407 +Converged at iteration 21, L1 8.29947e-05, Linf 0.0039405, total time[s] 0.070448 +Converged at iteration 20, L1 7.6423e-05, Linf 0.00340941, total time[s] 0.063203 +Converged at iteration 32, L1 4.46628e-05, Linf 0.00866599, total time[s] 0.124146 +Converged at iteration 22, L1 7.28468e-05, Linf 0.00429134, total time[s] 0.062325 +Converged at iteration 24, L1 5.77732e-05, Linf 0.00501887, total time[s] 0.065924 +Converged at iteration 27, L1 4.51741e-05, Linf 0.00245237, total time[s] 0.075828 +Converged at iteration 24, L1 5.77165e-05, Linf 0.00389323, total time[s] 0.071593 +Converged at iteration 23, L1 9.72903e-05, Linf 0.00499489, total time[s] 0.077009 +Converged at iteration 26, L1 6.94257e-05, Linf 0.00442161, total time[s] 0.071152 +Converged at iteration 27, L1 7.46993e-05, Linf 0.00433054, total time[s] 0.077105 +Converged at iteration 27, L1 8.47108e-05, Linf 0.006581, total time[s] 0.072552 +Converged at iteration 32, L1 7.90842e-05, Linf 0.00481784, total time[s] 0.083285 +Converged at iteration 27, L1 6.83636e-05, Linf 0.00199564, total time[s] 0.070668 +Converged at iteration 31, L1 7.74761e-05, Linf 0.0100666, total time[s] 0.08051 +Converged at iteration 31, L1 5.9527e-05, Linf 0.00244988, total time[s] 0.101864 +Converged at iteration 32, L1 9.98099e-05, Linf 0.00427066, total time[s] 0.104367 +Converged at iteration 31, L1 4.64282e-05, Linf 0.00449127, total time[s] 0.101277 +Converged at iteration 32, L1 7.04351e-05, Linf 0.0145491, total time[s] 0.086287 +Converged at iteration 29, L1 9.62316e-05, Linf 0.0154468, total time[s] 0.077248 +Converged at iteration 25, L1 6.42419e-05, Linf 0.00319369, total time[s] 0.067004 +Converged at iteration 37, L1 9.22114e-05, Linf 0.011885, total time[s] 0.096243 +Converged at iteration 35, L1 7.1604e-05, Linf 0.00866909, total time[s] 0.089953 +Converged at iteration 25, L1 7.83053e-05, Linf 0.00359425, total time[s] 0.065488 +Converged at iteration 25, L1 7.80936e-05, Linf 0.00652664, total time[s] 0.068756 +Converged at iteration 25, L1 5.80774e-05, Linf 0.0126545, total time[s] 0.065332 +Converged at iteration 26, L1 5.35171e-05, Linf 0.0152104, total time[s] 0.06818 +Converged at iteration 21, L1 4.9527e-05, Linf 0.00766937, total time[s] 0.057539 +Converged at iteration 18, L1 9.02564e-05, Linf 0.00646958, total time[s] 0.049117 +Converged at iteration 23, L1 9.78609e-05, Linf 0.0031828, total time[s] 0.067349 +Converged at iteration 24, L1 7.83132e-05, Linf 0.00309883, total time[s] 0.065502 +Converged at iteration 21, L1 8.55543e-05, Linf 0.00397028, total time[s] 0.056026 +Converged at iteration 20, L1 8.01879e-05, Linf 0.00358929, total time[s] 0.059296 +Converged at iteration 32, L1 4.64381e-05, Linf 0.00861343, total time[s] 0.109682 +Converged at iteration 22, L1 7.34664e-05, Linf 0.00442329, total time[s] 0.064009 +Converged at iteration 24, L1 5.81206e-05, Linf 0.00538065, total time[s] 0.063465 +Converged at iteration 26, L1 9.54289e-05, Linf 0.00516721, total time[s] 0.070596 +Converged at iteration 24, L1 5.56602e-05, Linf 0.0039048, total time[s] 0.062517 +Converged at iteration 23, L1 9.51033e-05, Linf 0.00490783, total time[s] 0.060674 +Converged at iteration 26, L1 7.29327e-05, Linf 0.00460643, total time[s] 0.076228 +Converged at iteration 27, L1 7.83224e-05, Linf 0.00462633, total time[s] 0.072002 +Converged at iteration 27, L1 8.57452e-05, Linf 0.00658305, total time[s] 0.07712 +Converged at iteration 32, L1 8.12776e-05, Linf 0.00496075, total time[s] 0.101611 +Converged at iteration 27, L1 7.58512e-05, Linf 0.00207294, total time[s] 0.080492 +Converged at iteration 31, L1 7.76962e-05, Linf 0.0101578, total time[s] 0.127422 +Converged at iteration 31, L1 5.64627e-05, Linf 0.00242685, total time[s] 0.091619 +Converged at iteration 33, L1 4.83746e-05, Linf 0.00221173, total time[s] 0.10914 +Converged at iteration 31, L1 4.82747e-05, Linf 0.00478228, total time[s] 0.107805 +Converged at iteration 32, L1 7.77034e-05, Linf 0.0161565, total time[s] 0.092532 +Converged at iteration 29, L1 9.76262e-05, Linf 0.0158307, total time[s] 0.083241 +Converged at iteration 25, L1 6.54505e-05, Linf 0.00323465, total time[s] 0.070663 +Converged at iteration 37, L1 9.36621e-05, Linf 0.0118424, total time[s] 0.119346 +Converged at iteration 35, L1 7.33692e-05, Linf 0.00886804, total time[s] 0.100263 +Converged at iteration 25, L1 7.82375e-05, Linf 0.00356996, total time[s] 0.065542 +Converged at iteration 25, L1 7.8797e-05, Linf 0.00643531, total time[s] 0.065361 +Converged at iteration 25, L1 5.73301e-05, Linf 0.0122039, total time[s] 0.064148 +Converged at iteration 26, L1 5.53031e-05, Linf 0.0151648, total time[s] 0.075623 +Converged at iteration 21, L1 4.91761e-05, Linf 0.00768787, total time[s] 0.06052 +Converged at iteration 18, L1 9.20094e-05, Linf 0.00656486, total time[s] 0.056758 +Converged at iteration 23, L1 9.59434e-05, Linf 0.00313755, total time[s] 0.067502 +Converged at iteration 24, L1 7.92052e-05, Linf 0.00311822, total time[s] 0.069628 +Converged at iteration 21, L1 8.65758e-05, Linf 0.00402585, total time[s] 0.059794 +Converged at iteration 20, L1 8.15164e-05, Linf 0.00365283, total time[s] 0.05587 +Converged at iteration 32, L1 4.67755e-05, Linf 0.00867878, total time[s] 0.084894 +Converged at iteration 22, L1 7.33648e-05, Linf 0.0043886, total time[s] 0.059998 +Converged at iteration 24, L1 5.81152e-05, Linf 0.00594331, total time[s] 0.065265 +Converged at iteration 26, L1 9.48449e-05, Linf 0.00510954, total time[s] 0.07038 +Converged at iteration 24, L1 5.55024e-05, Linf 0.00387559, total time[s] 0.071729 +Converged at iteration 23, L1 9.4333e-05, Linf 0.00485064, total time[s] 0.067417 +Converged at iteration 26, L1 7.47798e-05, Linf 0.0046663, total time[s] 0.071483 +Converged at iteration 27, L1 8.13722e-05, Linf 0.0047314, total time[s] 0.072696 +Converged at iteration 27, L1 8.60086e-05, Linf 0.00658571, total time[s] 0.071798 +Converged at iteration 32, L1 8.13924e-05, Linf 0.00500838, total time[s] 0.083985 +Converged at iteration 27, L1 7.77438e-05, Linf 0.00214515, total time[s] 0.071842 +Converged at iteration 31, L1 7.66921e-05, Linf 0.0101573, total time[s] 0.081158 +Converged at iteration 31, L1 5.60704e-05, Linf 0.00241626, total time[s] 0.08049 +Converged at iteration 33, L1 4.54541e-05, Linf 0.00225738, total time[s] 0.085426 +Converged at iteration 31, L1 4.88315e-05, Linf 0.00488104, total time[s] 0.083946 +Converged at iteration 32, L1 7.93111e-05, Linf 0.0162625, total time[s] 0.083413 +Converged at iteration 29, L1 9.8341e-05, Linf 0.0160481, total time[s] 0.077145 +Converged at iteration 25, L1 6.56036e-05, Linf 0.00321138, total time[s] 0.070514 +Converged at iteration 37, L1 9.67715e-05, Linf 0.0123068, total time[s] 0.104288 +Converged at iteration 35, L1 7.80822e-05, Linf 0.00949835, total time[s] 0.095211 +Converged at iteration 25, L1 7.8598e-05, Linf 0.00349559, total time[s] 0.068379 +Converged at iteration 25, L1 8.07895e-05, Linf 0.00633095, total time[s] 0.068398 +Converged at iteration 25, L1 5.47006e-05, Linf 0.0110622, total time[s] 0.068295 +Converged at iteration 26, L1 5.83983e-05, Linf 0.0158268, total time[s] 0.32212 +Converged at iteration 21, L1 4.9264e-05, Linf 0.00771188, total time[s] 0.102698 +Converged at iteration 19, L1 4.35121e-05, Linf 0.00395225, total time[s] 0.060346 +Converged at iteration 23, L1 9.48263e-05, Linf 0.00322435, total time[s] 0.064317 +Converged at iteration 24, L1 8.11765e-05, Linf 0.00320303, total time[s] 0.097098 +Converged at iteration 21, L1 8.93547e-05, Linf 0.00415916, total time[s] 0.095237 +Converged at iteration 20, L1 8.55376e-05, Linf 0.00380368, total time[s] 0.091529 +Converged at iteration 32, L1 4.865e-05, Linf 0.00868157, total time[s] 0.093998 +Converged at iteration 22, L1 7.53709e-05, Linf 0.00462827, total time[s] 0.063236 +Converged at iteration 24, L1 5.89029e-05, Linf 0.00490854, total time[s] 0.069753 +Converged at iteration 26, L1 9.33864e-05, Linf 0.00486502, total time[s] 0.080771 +Converged at iteration 24, L1 5.31523e-05, Linf 0.0036963, total time[s] 0.06822 +Converged at iteration 23, L1 9.34058e-05, Linf 0.00476901, total time[s] 0.071165 +Converged at iteration 26, L1 7.86887e-05, Linf 0.00486248, total time[s] 0.06843 +Converged at iteration 27, L1 9.12707e-05, Linf 0.00509086, total time[s] 0.070832 +Converged at iteration 27, L1 8.75555e-05, Linf 0.00659119, total time[s] 0.072537 +Converged at iteration 32, L1 8.34307e-05, Linf 0.00514989, total time[s] 0.081247 +Converged at iteration 27, L1 8.34438e-05, Linf 0.00214686, total time[s] 0.069061 +Converged at iteration 31, L1 7.74002e-05, Linf 0.010256, total time[s] 0.078357 +Converged at iteration 31, L1 5.69674e-05, Linf 0.00243212, total time[s] 0.078441 +Converged at iteration 33, L1 4.88509e-05, Linf 0.00242741, total time[s] 0.082709 +Converged at iteration 31, L1 5.13356e-05, Linf 0.00520552, total time[s] 0.078379 +Converged at iteration 32, L1 8.64126e-05, Linf 0.0175239, total time[s] 0.081748 +Converged at iteration 29, L1 9.7149e-05, Linf 0.0165077, total time[s] 0.074599 +Converged at iteration 25, L1 6.57344e-05, Linf 0.00311389, total time[s] 0.064518 +Converged at iteration 37, L1 9.81232e-05, Linf 0.0125902, total time[s] 0.094474 +Converged at iteration 35, L1 7.96099e-05, Linf 0.00970034, total time[s] 0.090462 +Converged at iteration 25, L1 7.83266e-05, Linf 0.00346154, total time[s] 0.064564 +Converged at iteration 25, L1 8.08479e-05, Linf 0.00626376, total time[s] 0.064109 +Converged at iteration 25, L1 5.39621e-05, Linf 0.0107246, total time[s] 0.066755 +Converged at iteration 26, L1 5.9549e-05, Linf 0.0160136, total time[s] 0.068568 +Converged at iteration 21, L1 4.82195e-05, Linf 0.00768275, total time[s] 0.058372 +Converged at iteration 19, L1 4.69908e-05, Linf 0.00399132, total time[s] 0.05275 +Converged at iteration 23, L1 9.36282e-05, Linf 0.00322444, total time[s] 0.07215 +Converged at iteration 24, L1 8.29463e-05, Linf 0.00323663, total time[s] 0.091289 +Converged at iteration 21, L1 9.05382e-05, Linf 0.00417813, total time[s] 0.062632 +Converged at iteration 20, L1 8.69852e-05, Linf 0.00385407, total time[s] 0.076312 +Converged at iteration 32, L1 4.91958e-05, Linf 0.00871639, total time[s] 0.104771 +Converged at iteration 22, L1 7.58465e-05, Linf 0.00460513, total time[s] 0.058333 +Converged at iteration 24, L1 5.88255e-05, Linf 0.00406922, total time[s] 0.062408 +Converged at iteration 26, L1 9.32828e-05, Linf 0.00479894, total time[s] 0.071112 +Converged at iteration 24, L1 5.26429e-05, Linf 0.00357928, total time[s] 0.066181 +Converged at iteration 23, L1 9.27927e-05, Linf 0.0047163, total time[s] 0.06135 +Converged at iteration 26, L1 8.07725e-05, Linf 0.0049456, total time[s] 0.068011 +Converged at iteration 27, L1 9.38789e-05, Linf 0.00515738, total time[s] 0.069889 +Converged at iteration 27, L1 8.77532e-05, Linf 0.00659823, total time[s] 0.07387 +Converged at iteration 32, L1 8.39217e-05, Linf 0.00519308, total time[s] 0.098514 +Converged at iteration 27, L1 8.51957e-05, Linf 0.00225505, total time[s] 0.07132 +Converged at iteration 31, L1 7.70996e-05, Linf 0.0102547, total time[s] 0.08247 +Converged at iteration 31, L1 5.89369e-05, Linf 0.00243362, total time[s] 0.081932 +Converged at iteration 33, L1 5.04956e-05, Linf 0.00248583, total time[s] 0.084106 +Converged at iteration 31, L1 5.2249e-05, Linf 0.00531511, total time[s] 0.078992 +Converged at iteration 32, L1 8.90716e-05, Linf 0.01797, total time[s] 0.081682 +Converged at iteration 29, L1 9.6867e-05, Linf 0.0166153, total time[s] 0.075866 +Converged at iteration 25, L1 6.61104e-05, Linf 0.00310719, total time[s] 0.065309 +Converged at iteration 38, L1 3.20075e-05, Linf 0.00705835, total time[s] 0.099891 +Converged at iteration 35, L1 8.44887e-05, Linf 0.0103088, total time[s] 0.094652 +Converged at iteration 25, L1 7.84985e-05, Linf 0.00338801, total time[s] 0.06542 +Converged at iteration 25, L1 8.42287e-05, Linf 0.00619854, total time[s] 0.066198 +Converged at iteration 25, L1 5.26091e-05, Linf 0.00989684, total time[s] 0.066887 +Converged at iteration 26, L1 6.3309e-05, Linf 0.0166317, total time[s] 0.067525 +Converged at iteration 21, L1 4.6594e-05, Linf 0.00772091, total time[s] 0.055924 +Converged at iteration 19, L1 5.30428e-05, Linf 0.00418728, total time[s] 0.051566 +Converged at iteration 23, L1 9.25819e-05, Linf 0.00314798, total time[s] 0.072313 +Converged at iteration 24, L1 8.52807e-05, Linf 0.00328757, total time[s] 0.083694 +Converged at iteration 21, L1 9.33339e-05, Linf 0.0042798, total time[s] 0.05903 +Converged at iteration 20, L1 9.13578e-05, Linf 0.00403175, total time[s] 0.0659 +Converged at iteration 32, L1 5.21138e-05, Linf 0.00873889, total time[s] 0.098652 +Converged at iteration 22, L1 8.0452e-05, Linf 0.00483491, total time[s] 0.072236 +Converged at iteration 24, L1 5.97132e-05, Linf 0.00485408, total time[s] 0.066243 +Converged at iteration 26, L1 9.17973e-05, Linf 0.00466451, total time[s] 0.069528 +Converged at iteration 24, L1 5.13884e-05, Linf 0.00328761, total time[s] 0.063904 +Converged at iteration 23, L1 9.26583e-05, Linf 0.00464584, total time[s] 0.062816 +Converged at iteration 26, L1 8.47345e-05, Linf 0.00511624, total time[s] 0.072103 +Converged at iteration 28, L1 5.44261e-05, Linf 0.00327991, total time[s] 0.07536 +Converged at iteration 27, L1 8.94059e-05, Linf 0.00656632, total time[s] 0.069972 +Converged at iteration 32, L1 8.72122e-05, Linf 0.00531767, total time[s] 0.088607 +Converged at iteration 27, L1 9.12928e-05, Linf 0.00230471, total time[s] 0.077526 +Converged at iteration 31, L1 7.7412e-05, Linf 0.0103574, total time[s] 0.07933 +Converged at iteration 31, L1 5.91279e-05, Linf 0.00244109, total time[s] 0.079124 +Converged at iteration 33, L1 5.27731e-05, Linf 0.00264256, total time[s] 0.085123 +Converged at iteration 31, L1 5.57414e-05, Linf 0.0056648, total time[s] 0.082893 +Converged at iteration 32, L1 9.66815e-05, Linf 0.0192816, total time[s] 0.081687 +Converged at iteration 29, L1 9.86671e-05, Linf 0.01687, total time[s] 0.075041 +Converged at iteration 25, L1 6.73492e-05, Linf 0.00310977, total time[s] 0.065467 +Converged at iteration 38, L1 3.21383e-05, Linf 0.00730253, total time[s] 0.098784 +Converged at iteration 35, L1 8.59958e-05, Linf 0.0105324, total time[s] 0.093016 +Converged at iteration 25, L1 7.89031e-05, Linf 0.00335768, total time[s] 0.065765 +Converged at iteration 25, L1 8.484e-05, Linf 0.00613367, total time[s] 0.06544 +Converged at iteration 25, L1 5.2064e-05, Linf 0.00964057, total time[s] 0.065387 +Converged at iteration 26, L1 6.46363e-05, Linf 0.0168607, total time[s] 0.069464 +Converged at iteration 21, L1 4.65023e-05, Linf 0.00775667, total time[s] 0.055845 +Converged at iteration 19, L1 5.6276e-05, Linf 0.00422611, total time[s] 0.051401 +Converged at iteration 23, L1 9.10033e-05, Linf 0.00319086, total time[s] 0.060798 +Converged at iteration 24, L1 8.54139e-05, Linf 0.00328594, total time[s] 0.064141 +Converged at iteration 21, L1 9.39552e-05, Linf 0.00430866, total time[s] 0.057739 +Converged at iteration 20, L1 9.27536e-05, Linf 0.00408166, total time[s] 0.062734 +Converged at iteration 32, L1 5.30679e-05, Linf 0.00870337, total time[s] 0.084242 +Converged at iteration 22, L1 8.85827e-05, Linf 0.0048798, total time[s] 0.060144 +Converged at iteration 24, L1 6.47615e-05, Linf 0.00671268, total time[s] 0.069242 +Converged at iteration 26, L1 9.17886e-05, Linf 0.00463241, total time[s] 0.079347 +Converged at iteration 24, L1 5.04137e-05, Linf 0.00316897, total time[s] 0.067561 +Converged at iteration 23, L1 9.20342e-05, Linf 0.00457817, total time[s] 0.065653 +Converged at iteration 26, L1 8.56796e-05, Linf 0.00517864, total time[s] 0.076098 +Converged at iteration 28, L1 5.5267e-05, Linf 0.00335756, total time[s] 0.081535 +Converged at iteration 27, L1 9.03075e-05, Linf 0.00662935, total time[s] 0.086082 +Converged at iteration 32, L1 8.73975e-05, Linf 0.00536084, total time[s] 0.085092 +Converged at iteration 27, L1 9.39905e-05, Linf 0.00230134, total time[s] 0.087337 +Converged at iteration 31, L1 7.72394e-05, Linf 0.0103586, total time[s] 0.09128 +Converged at iteration 31, L1 5.83006e-05, Linf 0.00243448, total time[s] 0.119446 +Converged at iteration 33, L1 5.38532e-05, Linf 0.00268548, total time[s] 0.096159 +Converged at iteration 31, L1 5.74705e-05, Linf 0.00578648, total time[s] 0.080363 +Converged at iteration 32, L1 9.96679e-05, Linf 0.0197696, total time[s] 0.081469 +Converged at iteration 29, L1 9.64734e-05, Linf 0.0170312, total time[s] 0.076049 +Converged at iteration 25, L1 6.69655e-05, Linf 0.00304455, total time[s] 0.065935 +Converged at iteration 38, L1 3.23479e-05, Linf 0.00743457, total time[s] 0.097191 +Converged at iteration 35, L1 9.04969e-05, Linf 0.0110938, total time[s] 0.126787 +Converged at iteration 25, L1 7.80177e-05, Linf 0.00328108, total time[s] 0.075709 +Converged at iteration 25, L1 8.8175e-05, Linf 0.00609175, total time[s] 0.067037 +Converged at iteration 25, L1 5.12082e-05, Linf 0.00900971, total time[s] 0.066714 +Converged at iteration 26, L1 6.83684e-05, Linf 0.0178926, total time[s] 0.069094 +Converged at iteration 21, L1 4.72083e-05, Linf 0.0077244, total time[s] 0.061341 +Converged at iteration 19, L1 6.32249e-05, Linf 0.00435573, total time[s] 0.051786 +Converged at iteration 23, L1 8.91775e-05, Linf 0.00317709, total time[s] 0.061325 +Converged at iteration 24, L1 8.70894e-05, Linf 0.00327324, total time[s] 0.06555 +Converged at iteration 21, L1 9.59708e-05, Linf 0.00438855, total time[s] 0.056282 +Converged at iteration 20, L1 9.69585e-05, Linf 0.00409233, total time[s] 0.056966 +Converged at iteration 32, L1 5.49477e-05, Linf 0.00873144, total time[s] 0.086858 +Converged at iteration 22, L1 8.33149e-05, Linf 0.00502377, total time[s] 0.058907 +Converged at iteration 24, L1 6.15457e-05, Linf 0.00516168, total time[s] 0.064955 +Converged at iteration 26, L1 9.1185e-05, Linf 0.0045102, total time[s] 0.072768 +Converged at iteration 24, L1 4.9474e-05, Linf 0.00290583, total time[s] 0.08724 +Converged at iteration 23, L1 9.20225e-05, Linf 0.00446101, total time[s] 0.060624 +Converged at iteration 26, L1 8.89781e-05, Linf 0.00534819, total time[s] 0.069518 +Converged at iteration 28, L1 5.9011e-05, Linf 0.00357588, total time[s] 0.072895 +Converged at iteration 27, L1 9.01017e-05, Linf 0.00666743, total time[s] 0.072691 +Converged at iteration 32, L1 8.91709e-05, Linf 0.00545678, total time[s] 0.083513 +Converged at iteration 27, L1 9.84782e-05, Linf 0.00236324, total time[s] 0.073921 +Converged at iteration 31, L1 7.87537e-05, Linf 0.0104504, total time[s] 0.079783 +Converged at iteration 31, L1 5.79289e-05, Linf 0.00242578, total time[s] 0.082996 +Converged at iteration 33, L1 5.67667e-05, Linf 0.00282714, total time[s] 0.08981 +Converged at iteration 31, L1 6.13591e-05, Linf 0.00607844, total time[s] 0.080599 +Converged at iteration 33, L1 4.22441e-05, Linf 0.00864187, total time[s] 0.086208 +Converged at iteration 29, L1 9.85855e-05, Linf 0.0172198, total time[s] 0.076342 +Converged at iteration 25, L1 6.75604e-05, Linf 0.00302257, total time[s] 0.06678 +Converged at iteration 38, L1 3.2428e-05, Linf 0.0075319, total time[s] 0.105781 +Converged at iteration 35, L1 9.22083e-05, Linf 0.011314, total time[s] 0.09053 +Converged at iteration 25, L1 7.70293e-05, Linf 0.0032426, total time[s] 0.06616 +Converged at iteration 25, L1 8.91937e-05, Linf 0.00610539, total time[s] 0.066959 +Converged at iteration 25, L1 5.24966e-05, Linf 0.0088944, total time[s] 0.072576 +Converged at iteration 26, L1 7.05464e-05, Linf 0.0181548, total time[s] 0.090788 +Converged at iteration 21, L1 4.72523e-05, Linf 0.0078559, total time[s] 0.080921 +Converged at iteration 19, L1 6.61268e-05, Linf 0.00442775, total time[s] 0.057392 +Converged at iteration 23, L1 8.82048e-05, Linf 0.00307328, total time[s] 0.071063 +Converged at iteration 24, L1 8.79015e-05, Linf 0.00324835, total time[s] 0.063479 +Converged at iteration 21, L1 9.6873e-05, Linf 0.0044137, total time[s] 0.055919 +Converged at iteration 20, L1 9.8264e-05, Linf 0.00419177, total time[s] 0.055057 +Converged at iteration 32, L1 5.58421e-05, Linf 0.00874029, total time[s] 0.080845 +Converged at iteration 22, L1 8.12819e-05, Linf 0.00507302, total time[s] 0.057813 +Converged at iteration 24, L1 6.26034e-05, Linf 0.00474172, total time[s] 0.064871 +Converged at iteration 26, L1 9.01647e-05, Linf 0.00448747, total time[s] 0.069118 +Converged at iteration 24, L1 4.80725e-05, Linf 0.00280456, total time[s] 0.069028 +Converged at iteration 23, L1 9.11842e-05, Linf 0.00436951, total time[s] 0.069935 +Converged at iteration 26, L1 8.98475e-05, Linf 0.00540813, total time[s] 0.069413 +Converged at iteration 28, L1 6.1422e-05, Linf 0.00365941, total time[s] 0.077388 +Converged at iteration 27, L1 9.06156e-05, Linf 0.00668335, total time[s] 0.0786 +Converged at iteration 32, L1 8.96954e-05, Linf 0.00549843, total time[s] 0.102279 +Converged at iteration 28, L1 5.9023e-05, Linf 0.00174979, total time[s] 0.072038 +Converged at iteration 31, L1 7.84486e-05, Linf 0.0104514, total time[s] 0.084327 +Converged at iteration 31, L1 5.84123e-05, Linf 0.00243463, total time[s] 0.0881 +Converged at iteration 33, L1 5.71617e-05, Linf 0.00286529, total time[s] 0.093123 +Converged at iteration 31, L1 6.20165e-05, Linf 0.00623067, total time[s] 0.079414 +Converged at iteration 33, L1 4.30072e-05, Linf 0.00920752, total time[s] 0.083972 +Converged at iteration 29, L1 9.58385e-05, Linf 0.0172016, total time[s] 0.073558 +Converged at iteration 25, L1 6.80777e-05, Linf 0.00302497, total time[s] 0.06527 +Converged at iteration 38, L1 3.30697e-05, Linf 0.0077636, total time[s] 0.096668 +Converged at iteration 35, L1 9.65354e-05, Linf 0.0118669, total time[s] 0.093914 +Converged at iteration 25, L1 7.68528e-05, Linf 0.00317135, total time[s] 0.066077 +Converged at iteration 25, L1 9.35195e-05, Linf 0.00619262, total time[s] 0.07031 +Converged at iteration 25, L1 5.13451e-05, Linf 0.00839778, total time[s] 0.0757 +Converged at iteration 26, L1 7.44848e-05, Linf 0.0186064, total time[s] 0.099657 +Converged at iteration 21, L1 4.71329e-05, Linf 0.00790133, total time[s] 0.060289 +Converged at iteration 19, L1 6.94007e-05, Linf 0.00459463, total time[s] 0.056763 +Converged at iteration 23, L1 8.79894e-05, Linf 0.00369131, total time[s] 0.062646 +Converged at iteration 24, L1 9.02288e-05, Linf 0.00325728, total time[s] 0.074951 +Converged at iteration 21, L1 9.85266e-05, Linf 0.00443319, total time[s] 0.062491 +Converged at iteration 21, L1 4.82675e-05, Linf 0.00404157, total time[s] 0.062333 +Converged at iteration 32, L1 5.87376e-05, Linf 0.00861979, total time[s] 0.080078 +Converged at iteration 22, L1 9.02277e-05, Linf 0.00522565, total time[s] 0.058243 +Converged at iteration 24, L1 6.36299e-05, Linf 0.00482116, total time[s] 0.068528 +Converged at iteration 26, L1 8.88187e-05, Linf 0.00442374, total time[s] 0.073685 +Converged at iteration 23, L1 9.93943e-05, Linf 0.00422992, total time[s] 0.059993 +Converged at iteration 23, L1 8.97157e-05, Linf 0.00413742, total time[s] 0.061522 +Converged at iteration 26, L1 9.13724e-05, Linf 0.00557812, total time[s] 0.069772 +Converged at iteration 28, L1 6.56697e-05, Linf 0.00389705, total time[s] 0.079803 +Converged at iteration 27, L1 9.22235e-05, Linf 0.0067327, total time[s] 0.086681 +Converged at iteration 32, L1 9.10046e-05, Linf 0.0055719, total time[s] 0.103056 +Converged at iteration 28, L1 6.27101e-05, Linf 0.0018087, total time[s] 0.083044 +Converged at iteration 31, L1 7.8722e-05, Linf 0.0105336, total time[s] 0.082543 +Converged at iteration 31, L1 5.87874e-05, Linf 0.00244868, total time[s] 0.081084 +Converged at iteration 33, L1 5.99411e-05, Linf 0.00299933, total time[s] 0.087087 +Converged at iteration 31, L1 6.67609e-05, Linf 0.00664316, total time[s] 0.080797 +Converged at iteration 33, L1 4.52826e-05, Linf 0.00957058, total time[s] 0.084597 +Converged at iteration 29, L1 9.58608e-05, Linf 0.0173888, total time[s] 0.103847 +Converged at iteration 25, L1 6.81121e-05, Linf 0.00306015, total time[s] 0.08157 +Converged at iteration 38, L1 3.32504e-05, Linf 0.00783754, total time[s] 0.10219 +Converged at iteration 35, L1 9.8231e-05, Linf 0.0120889, total time[s] 0.10379 +Converged at iteration 25, L1 7.63586e-05, Linf 0.0031289, total time[s] 0.072239 +Converged at iteration 25, L1 9.47987e-05, Linf 0.00617056, total time[s] 0.0676 +Converged at iteration 25, L1 4.99532e-05, Linf 0.00833669, total time[s] 0.068418 +Converged at iteration 26, L1 7.61681e-05, Linf 0.018921, total time[s] 0.077194 +Converged at iteration 21, L1 4.7166e-05, Linf 0.00793585, total time[s] 0.0702 +Converged at iteration 19, L1 7.22646e-05, Linf 0.00457256, total time[s] 0.064575 +Converged at iteration 23, L1 8.66803e-05, Linf 0.00280857, total time[s] 0.080203 +Converged at iteration 24, L1 9.05088e-05, Linf 0.00300368, total time[s] 0.069932 +Converged at iteration 21, L1 9.93681e-05, Linf 0.00441462, total time[s] 0.076019 +Converged at iteration 21, L1 4.80432e-05, Linf 0.00224469, total time[s] 0.075071 +Converged at iteration 32, L1 5.94043e-05, Linf 0.00867471, total time[s] 0.09468 +Converged at iteration 22, L1 8.42621e-05, Linf 0.00527281, total time[s] 0.05998 +Converged at iteration 24, L1 6.36767e-05, Linf 0.00483956, total time[s] 0.062541 +Converged at iteration 26, L1 8.86791e-05, Linf 0.00442422, total time[s] 0.071251 +Converged at iteration 23, L1 9.85265e-05, Linf 0.00409359, total time[s] 0.060969 +Converged at iteration 23, L1 8.78063e-05, Linf 0.00400291, total time[s] 0.06188 +Converged at iteration 26, L1 9.17363e-05, Linf 0.00563481, total time[s] 0.068407 +Converged at iteration 28, L1 6.84656e-05, Linf 0.00398811, total time[s] 0.07295 +Converged at iteration 27, L1 9.22766e-05, Linf 0.00675282, total time[s] 0.070494 +Converged at iteration 32, L1 9.11591e-05, Linf 0.00561208, total time[s] 0.082367 +Converged at iteration 28, L1 6.35129e-05, Linf 0.00182833, total time[s] 0.074158 +Converged at iteration 31, L1 7.8338e-05, Linf 0.0105916, total time[s] 0.081329 +Converged at iteration 31, L1 5.88373e-05, Linf 0.00245675, total time[s] 0.08137 +Converged at iteration 33, L1 6.07441e-05, Linf 0.00304434, total time[s] 0.090499 +Converged at iteration 31, L1 7.16144e-05, Linf 0.00678273, total time[s] 0.083524 +Converged at iteration 33, L1 4.64037e-05, Linf 0.00983555, total time[s] 0.08473 +Converged at iteration 29, L1 9.6339e-05, Linf 0.0174003, total time[s] 0.075834 +Converged at iteration 25, L1 6.8151e-05, Linf 0.00308236, total time[s] 0.067414 +Converged at iteration 38, L1 3.36676e-05, Linf 0.00801228, total time[s] 0.101938 +Converged at iteration 36, L1 3.46981e-05, Linf 0.0064726, total time[s] 0.098122 +Converged at iteration 25, L1 7.68368e-05, Linf 0.0030991, total time[s] 0.068305 +Converged at iteration 25, L1 9.98146e-05, Linf 0.00628647, total time[s] 0.067423 +Converged at iteration 25, L1 4.97184e-05, Linf 0.00800535, total time[s] 0.06606 +Converged at iteration 26, L1 8.12006e-05, Linf 0.0199194, total time[s] 0.069299 +Converged at iteration 21, L1 4.75372e-05, Linf 0.00797943, total time[s] 0.061208 +Converged at iteration 19, L1 7.7214e-05, Linf 0.00480336, total time[s] 0.06146 +Converged at iteration 23, L1 8.45078e-05, Linf 0.00271143, total time[s] 0.079108 +Converged at iteration 24, L1 9.24704e-05, Linf 0.00304953, total time[s] 0.074972 +Converged at iteration 22, L1 5.21861e-05, Linf 0.00242066, total time[s] 0.08349 +Converged at iteration 21, L1 4.962e-05, Linf 0.0023144, total time[s] 0.05938 +Converged at iteration 32, L1 6.26501e-05, Linf 0.00880368, total time[s] 0.094518 +Converged at iteration 22, L1 8.97227e-05, Linf 0.00542754, total time[s] 0.069813 +Converged at iteration 24, L1 6.3115e-05, Linf 0.00491469, total time[s] 0.076718 +Converged at iteration 26, L1 8.73317e-05, Linf 0.00436267, total time[s] 0.074036 +Converged at iteration 23, L1 9.65769e-05, Linf 0.00378867, total time[s] 0.064898 +Converged at iteration 23, L1 8.25989e-05, Linf 0.00372405, total time[s] 0.070129 +Converged at iteration 27, L1 5.61099e-05, Linf 0.019855, total time[s] 0.074386 +Converged at iteration 28, L1 7.33602e-05, Linf 0.00426212, total time[s] 0.080529 +Converged at iteration 27, L1 9.46839e-05, Linf 0.00682201, total time[s] 0.076087 +Converged at iteration 32, L1 9.18036e-05, Linf 0.00568916, total time[s] 0.094117 +Converged at iteration 28, L1 6.79914e-05, Linf 0.00190462, total time[s] 0.08184 +Converged at iteration 31, L1 7.91372e-05, Linf 0.0106189, total time[s] 0.092562 +Converged at iteration 31, L1 5.91703e-05, Linf 0.00248742, total time[s] 0.082823 +Converged at iteration 33, L1 6.3618e-05, Linf 0.00319278, total time[s] 0.096517 +Converged at iteration 31, L1 7.45074e-05, Linf 0.00718575, total time[s] 0.086289 +Converged at iteration 33, L1 4.92091e-05, Linf 0.0106548, total time[s] 0.090417 +Converged at iteration 29, L1 9.48524e-05, Linf 0.0173921, total time[s] 0.08451 +Converged at iteration 25, L1 6.88255e-05, Linf 0.00312049, total time[s] 0.083083 +Converged at iteration 38, L1 3.38082e-05, Linf 0.00809768, total time[s] 0.111429 +Converged at iteration 36, L1 3.52578e-05, Linf 0.0068136, total time[s] 0.09726 +Converged at iteration 25, L1 7.66865e-05, Linf 0.00309573, total time[s] 0.071417 +Converged at iteration 26, L1 4.31222e-05, Linf 0.00315181, total time[s] 0.069164 +Converged at iteration 25, L1 4.96451e-05, Linf 0.00790987, total time[s] 0.066223 +Converged at iteration 26, L1 8.34386e-05, Linf 0.0202952, total time[s] 0.069011 +Converged at iteration 21, L1 4.77365e-05, Linf 0.00826704, total time[s] 0.059606 +Converged at iteration 19, L1 8.16559e-05, Linf 0.00483539, total time[s] 0.069062 +Converged at iteration 23, L1 8.35722e-05, Linf 0.00269466, total time[s] 0.066174 +Converged at iteration 24, L1 9.31901e-05, Linf 0.00306254, total time[s] 0.090045 +Converged at iteration 22, L1 5.26367e-05, Linf 0.00242454, total time[s] 0.064066 +Converged at iteration 21, L1 5.02072e-05, Linf 0.00234184, total time[s] 0.057897 +Converged at iteration 32, L1 6.36591e-05, Linf 0.00880914, total time[s] 0.090308 +Converged at iteration 22, L1 9.23665e-05, Linf 0.00548138, total time[s] 0.070336 +Converged at iteration 24, L1 6.36888e-05, Linf 0.00493333, total time[s] 0.071311 +Converged at iteration 26, L1 8.74306e-05, Linf 0.00436811, total time[s] 0.068102 +Converged at iteration 23, L1 9.4045e-05, Linf 0.00367669, total time[s] 0.061812 +Converged at iteration 23, L1 8.13362e-05, Linf 0.00362753, total time[s] 0.061905 +Converged at iteration 26, L1 9.7311e-05, Linf 0.00586947, total time[s] 0.072337 +Converged at iteration 28, L1 7.36293e-05, Linf 0.00436199, total time[s] 0.081642 +Converged at iteration 27, L1 9.53097e-05, Linf 0.00685018, total time[s] 0.07438 +Converged at iteration 32, L1 9.21597e-05, Linf 0.0057251, total time[s] 0.085191 +Converged at iteration 28, L1 6.83764e-05, Linf 0.00192591, total time[s] 0.073163 +Converged at iteration 31, L1 7.90543e-05, Linf 0.0106112, total time[s] 0.080055 +Converged at iteration 31, L1 5.93856e-05, Linf 0.00248253, total time[s] 0.07965 +Converged at iteration 33, L1 6.43616e-05, Linf 0.00322966, total time[s] 0.084676 +Converged at iteration 31, L1 7.60515e-05, Linf 0.00734949, total time[s] 0.081556 +Converged at iteration 33, L1 5.05327e-05, Linf 0.0109621, total time[s] 0.084079 +Converged at iteration 29, L1 9.44114e-05, Linf 0.0174886, total time[s] 0.075466 +Converged at iteration 25, L1 6.90412e-05, Linf 0.0031191, total time[s] 0.066857 +Converged at iteration 38, L1 3.39943e-05, Linf 0.00841001, total time[s] 0.104902 +Converged at iteration 36, L1 3.61519e-05, Linf 0.00679255, total time[s] 0.095801 +Converged at iteration 25, L1 7.68041e-05, Linf 0.0030773, total time[s] 0.065937 +Converged at iteration 26, L1 4.61057e-05, Linf 0.00327848, total time[s] 0.070613 +Converged at iteration 25, L1 4.96428e-05, Linf 0.00787421, total time[s] 0.074048 +Converged at iteration 26, L1 8.77335e-05, Linf 0.020824, total time[s] 0.081026 +Converged at iteration 21, L1 4.84912e-05, Linf 0.00804195, total time[s] 0.064516 +Converged at iteration 19, L1 8.70319e-05, Linf 0.00486378, total time[s] 0.063581 +Converged at iteration 23, L1 8.29454e-05, Linf 0.00265801, total time[s] 0.065587 +Converged at iteration 24, L1 9.47828e-05, Linf 0.0030871, total time[s] 0.064735 +Converged at iteration 22, L1 5.30545e-05, Linf 0.00241665, total time[s] 0.059544 +Converged at iteration 21, L1 5.5082e-05, Linf 0.00238815, total time[s] 0.061365 +Converged at iteration 32, L1 6.61768e-05, Linf 0.00881662, total time[s] 0.092545 +Converged at iteration 22, L1 9.61414e-05, Linf 0.00560073, total time[s] 0.059911 +Converged at iteration 24, L1 6.38657e-05, Linf 0.00497797, total time[s] 0.073151 +Converged at iteration 26, L1 8.60237e-05, Linf 0.00432783, total time[s] 0.100398 +Converged at iteration 23, L1 9.14902e-05, Linf 0.0034836, total time[s] 0.082523 +Converged at iteration 23, L1 8.13016e-05, Linf 0.00349418, total time[s] 0.086711 +Converged at iteration 26, L1 9.93289e-05, Linf 0.00600483, total time[s] 0.069036 +Converged at iteration 28, L1 7.86642e-05, Linf 0.00456573, total time[s] 0.087593 +Converged at iteration 27, L1 9.7058e-05, Linf 0.006915, total time[s] 0.079117 +Converged at iteration 32, L1 9.18428e-05, Linf 0.00577213, total time[s] 0.09021 +Converged at iteration 28, L1 7.08459e-05, Linf 0.00197332, total time[s] 0.074148 +Converged at iteration 31, L1 7.95259e-05, Linf 0.0108565, total time[s] 0.080066 +Converged at iteration 31, L1 5.9693e-05, Linf 0.00251762, total time[s] 0.079144 +Converged at iteration 33, L1 6.63426e-05, Linf 0.00334293, total time[s] 0.087281 +Converged at iteration 31, L1 8.02285e-05, Linf 0.00768125, total time[s] 0.080532 +Converged at iteration 33, L1 5.27447e-05, Linf 0.0116167, total time[s] 0.085313 +Converged at iteration 29, L1 9.44991e-05, Linf 0.0175107, total time[s] 0.075771 +Converged at iteration 25, L1 6.99075e-05, Linf 0.00308977, total time[s] 0.066308 +Converged at iteration 38, L1 3.42394e-05, Linf 0.0084196, total time[s] 0.102986 +Converged at iteration 36, L1 3.67395e-05, Linf 0.00702785, total time[s] 0.103657 +Converged at iteration 25, L1 7.64845e-05, Linf 0.00307444, total time[s] 0.067035 +Converged at iteration 26, L1 4.68896e-05, Linf 0.00336006, total time[s] 0.068464 +Converged at iteration 25, L1 4.95733e-05, Linf 0.00767823, total time[s] 0.066822 +Converged at iteration 26, L1 9.00007e-05, Linf 0.021513, total time[s] 0.071276 +Converged at iteration 21, L1 4.93328e-05, Linf 0.00808003, total time[s] 0.063516 +Converged at iteration 19, L1 8.98505e-05, Linf 0.00498609, total time[s] 0.059935 +Converged at iteration 23, L1 8.19484e-05, Linf 0.00268846, total time[s] 0.068539 +Converged at iteration 24, L1 9.60769e-05, Linf 0.00309632, total time[s] 0.074007 +Converged at iteration 22, L1 5.29402e-05, Linf 0.00241426, total time[s] 0.078166 +Converged at iteration 21, L1 5.2536e-05, Linf 0.00240769, total time[s] 0.064436 +Converged at iteration 32, L1 7.75832e-05, Linf 0.008821, total time[s] 0.089019 +Converged at iteration 22, L1 9.10665e-05, Linf 0.00575119, total time[s] 0.062637 +Converged at iteration 24, L1 6.42289e-05, Linf 0.00499545, total time[s] 0.062876 +Converged at iteration 26, L1 8.75486e-05, Linf 0.0129491, total time[s] 0.067318 +Converged at iteration 23, L1 9.07281e-05, Linf 0.00339378, total time[s] 0.060345 +Converged at iteration 23, L1 8.17968e-05, Linf 0.00341369, total time[s] 0.063925 +Converged at iteration 27, L1 4.8221e-05, Linf 0.00314311, total time[s] 0.070524 +Converged at iteration 28, L1 7.8925e-05, Linf 0.00467928, total time[s] 0.072406 +Converged at iteration 27, L1 9.65738e-05, Linf 0.00694505, total time[s] 0.070732 +Converged at iteration 32, L1 9.17719e-05, Linf 0.0057987, total time[s] 0.083023 +Converged at iteration 28, L1 7.19635e-05, Linf 0.00198733, total time[s] 0.074431 +Converged at iteration 31, L1 7.93695e-05, Linf 0.0106741, total time[s] 0.081973 +Converged at iteration 31, L1 6.04954e-05, Linf 0.00252403, total time[s] 0.081307 +Converged at iteration 33, L1 6.66157e-05, Linf 0.00337085, total time[s] 0.087119 +Converged at iteration 31, L1 8.52365e-05, Linf 0.00784653, total time[s] 0.08339 +Converged at iteration 33, L1 5.46011e-05, Linf 0.0119469, total time[s] 0.086562 +Converged at iteration 29, L1 9.32254e-05, Linf 0.0174411, total time[s] 0.085962 +Converged at iteration 25, L1 6.92126e-05, Linf 0.00306294, total time[s] 0.073137 +Converged at iteration 38, L1 3.5983e-05, Linf 0.00856971, total time[s] 0.099258 +Converged at iteration 36, L1 5.26908e-05, Linf 0.00727115, total time[s] 0.098485 +Converged at iteration 25, L1 7.62286e-05, Linf 0.00306294, total time[s] 0.067182 +Converged at iteration 26, L1 4.94779e-05, Linf 0.00354238, total time[s] 0.068035 +Converged at iteration 25, L1 5.51553e-05, Linf 0.00757672, total time[s] 0.067129 +Converged at iteration 26, L1 9.71643e-05, Linf 0.0224004, total time[s] 0.075012 +Converged at iteration 21, L1 4.98919e-05, Linf 0.0081184, total time[s] 0.075794 +Converged at iteration 19, L1 9.4504e-05, Linf 0.00509426, total time[s] 0.060639 +Converged at iteration 23, L1 8.0805e-05, Linf 0.00261657, total time[s] 0.080574 +Converged at iteration 24, L1 9.72485e-05, Linf 0.00311157, total time[s] 0.075162 +Converged at iteration 22, L1 5.25673e-05, Linf 0.00238954, total time[s] 0.094587 +Converged at iteration 21, L1 5.28257e-05, Linf 0.00244774, total time[s] 0.067095 +Converged at iteration 32, L1 6.98582e-05, Linf 0.00872534, total time[s] 0.094852 +Converged at iteration 22, L1 9.70309e-05, Linf 0.00624007, total time[s] 0.059923 +Converged at iteration 24, L1 6.51578e-05, Linf 0.00503635, total time[s] 0.06944 +Converged at iteration 26, L1 8.50664e-05, Linf 0.0042942, total time[s] 0.074023 +Converged at iteration 23, L1 8.85834e-05, Linf 0.00322507, total time[s] 0.063667 +Converged at iteration 23, L1 8.28947e-05, Linf 0.00328854, total time[s] 0.063771 +Converged at iteration 27, L1 4.75046e-05, Linf 0.00321769, total time[s] 0.073402 +Converged at iteration 28, L1 8.19414e-05, Linf 0.00490206, total time[s] 0.078411 +Converged at iteration 27, L1 9.86911e-05, Linf 0.00701592, total time[s] 0.073795 +Converged at iteration 32, L1 9.21868e-05, Linf 0.00583108, total time[s] 0.084394 +Converged at iteration 28, L1 7.43743e-05, Linf 0.00201741, total time[s] 0.079386 +Converged at iteration 31, L1 8.20696e-05, Linf 0.0108008, total time[s] 0.088765 +Converged at iteration 31, L1 5.94817e-05, Linf 0.00253561, total time[s] 0.090119 +Converged at iteration 33, L1 7.08789e-05, Linf 0.00347445, total time[s] 0.087739 +Converged at iteration 31, L1 8.68103e-05, Linf 0.00819893, total time[s] 0.110151 +Converged at iteration 33, L1 5.6337e-05, Linf 0.012638, total time[s] 0.090577 +Converged at iteration 29, L1 9.3626e-05, Linf 0.0173635, total time[s] 0.090996 +Converged at iteration 25, L1 7.09528e-05, Linf 0.00304656, total time[s] 0.068939 +Converged at iteration 38, L1 3.54724e-05, Linf 0.00867426, total time[s] 0.107026 +Converged at iteration 36, L1 3.83428e-05, Linf 0.00744098, total time[s] 0.106456 +Converged at iteration 25, L1 7.58721e-05, Linf 0.00305347, total time[s] 0.067864 +Converged at iteration 26, L1 5.02846e-05, Linf 0.00361281, total time[s] 0.075434 +Converged at iteration 25, L1 5.04276e-05, Linf 0.00752974, total time[s] 0.080765 +Converged at iteration 26, L1 9.71064e-05, Linf 0.0228024, total time[s] 0.079404 +Converged at iteration 21, L1 5.13032e-05, Linf 0.00814097, total time[s] 0.060673 +Converged at iteration 19, L1 9.71965e-05, Linf 0.00511504, total time[s] 0.064587 +Converged at iteration 23, L1 7.97656e-05, Linf 0.00264034, total time[s] 0.075974 +Converged at iteration 24, L1 9.74783e-05, Linf 0.00311614, total time[s] 0.064307 +Converged at iteration 22, L1 5.2963e-05, Linf 0.00237552, total time[s] 0.075062 +Converged at iteration 21, L1 5.31187e-05, Linf 0.00248275, total time[s] 0.062675 +Converged at iteration 32, L1 7.17761e-05, Linf 0.00869606, total time[s] 0.097492 +Converged at iteration 22, L1 9.34353e-05, Linf 0.00583119, total time[s] 0.061525 +Converged at iteration 24, L1 6.85105e-05, Linf 0.00698887, total time[s] 0.065959 +Converged at iteration 26, L1 8.7167e-05, Linf 0.00430097, total time[s] 0.071336 +Converged at iteration 23, L1 8.78363e-05, Linf 0.00314329, total time[s] 0.061758 +Converged at iteration 23, L1 8.20497e-05, Linf 0.0031994, total time[s] 0.06017 +Converged at iteration 27, L1 4.80321e-05, Linf 0.00325457, total time[s] 0.069059 +Converged at iteration 28, L1 8.5254e-05, Linf 0.00499242, total time[s] 0.083415 +Converged at iteration 27, L1 9.99655e-05, Linf 0.00704387, total time[s] 0.068345 +Converged at iteration 32, L1 9.21598e-05, Linf 0.00585153, total time[s] 0.085547 +Converged at iteration 28, L1 7.55337e-05, Linf 0.00202257, total time[s] 0.071648 +Converged at iteration 31, L1 8.04108e-05, Linf 0.0107297, total time[s] 0.07808 +Converged at iteration 31, L1 5.97561e-05, Linf 0.00253903, total time[s] 0.078684 +Converged at iteration 33, L1 6.92441e-05, Linf 0.00351406, total time[s] 0.082568 +Converged at iteration 31, L1 8.98943e-05, Linf 0.00840323, total time[s] 0.077806 +Converged at iteration 33, L1 5.79367e-05, Linf 0.0129653, total time[s] 0.082416 +Converged at iteration 29, L1 9.24416e-05, Linf 0.0172872, total time[s] 0.075382 +Converged at iteration 25, L1 7.13186e-05, Linf 0.00304722, total time[s] 0.069769 +Converged at iteration 38, L1 3.71049e-05, Linf 0.00904498, total time[s] 0.09973 +Converged at iteration 36, L1 6.15919e-05, Linf 0.00782929, total time[s] 0.105515 +Converged at iteration 25, L1 7.60106e-05, Linf 0.00304003, total time[s] 0.068171 +Converged at iteration 26, L1 5.4469e-05, Linf 0.0038981, total time[s] 0.06643 +Converged at iteration 25, L1 5.0681e-05, Linf 0.00742312, total time[s] 0.064066 +Converged at iteration 27, L1 3.98017e-05, Linf 0.00901927, total time[s] 0.070832 +Converged at iteration 21, L1 5.18716e-05, Linf 0.00816902, total time[s] 0.060993 +Converged at iteration 20, L1 4.78699e-05, Linf 0.00276087, total time[s] 0.062148 +Converged at iteration 23, L1 7.85745e-05, Linf 0.00260086, total time[s] 0.094045 +Converged at iteration 24, L1 9.99386e-05, Linf 0.0031338, total time[s] 0.072124 +Converged at iteration 22, L1 5.3278e-05, Linf 0.00230655, total time[s] 0.104928 +Converged at iteration 21, L1 5.86582e-05, Linf 0.00262085, total time[s] 0.082627 +Converged at iteration 32, L1 7.55086e-05, Linf 0.0087398, total time[s] 0.09986 +Converged at iteration 23, L1 6.28766e-05, Linf 0.0108444, total time[s] 0.078962 +Converged at iteration 24, L1 6.6766e-05, Linf 0.0051209, total time[s] 0.071413 +Converged at iteration 26, L1 8.39642e-05, Linf 0.00423494, total time[s] 0.071283 +Converged at iteration 23, L1 8.5332e-05, Linf 0.00293369, total time[s] 0.07274 +Converged at iteration 23, L1 8.01252e-05, Linf 0.00291281, total time[s] 0.069342 +Converged at iteration 27, L1 4.83603e-05, Linf 0.00334744, total time[s] 0.070852 +Converged at iteration 28, L1 9.09223e-05, Linf 0.00532878, total time[s] 0.07231 +Converged at iteration 28, L1 5.78356e-05, Linf 0.00447917, total time[s] 0.0719 +Converged at iteration 32, L1 9.29162e-05, Linf 0.00588859, total time[s] 0.081596 +Converged at iteration 28, L1 7.96169e-05, Linf 0.00206697, total time[s] 0.071454 +Converged at iteration 31, L1 8.29508e-05, Linf 0.0108767, total time[s] 0.078237 +Converged at iteration 31, L1 6.52674e-05, Linf 0.00256897, total time[s] 0.079027 +Converged at iteration 33, L1 7.13399e-05, Linf 0.0036431, total time[s] 0.083563 +Converged at iteration 31, L1 9.69436e-05, Linf 0.00892707, total time[s] 0.078085 +Converged at iteration 33, L1 6.09404e-05, Linf 0.0140433, total time[s] 0.084268 +Converged at iteration 29, L1 9.2511e-05, Linf 0.0171921, total time[s] 0.075177 +Converged at iteration 25, L1 7.40396e-05, Linf 0.00302662, total time[s] 0.066253 +Converged at iteration 38, L1 3.70428e-05, Linf 0.00921293, total time[s] 0.096719 +Converged at iteration 36, L1 4.819e-05, Linf 0.00906155, total time[s] 0.09789 +Converged at iteration 25, L1 7.56708e-05, Linf 0.00303119, total time[s] 0.070505 +Converged at iteration 26, L1 5.57895e-05, Linf 0.00398626, total time[s] 0.074046 +Converged at iteration 25, L1 4.97152e-05, Linf 0.00739422, total time[s] 0.064849 +Converged at iteration 27, L1 3.95011e-05, Linf 0.00924816, total time[s] 0.074215 +Converged at iteration 21, L1 5.22074e-05, Linf 0.00836298, total time[s] 0.061918 +Converged at iteration 20, L1 4.92353e-05, Linf 0.00276326, total time[s] 0.065291 +Converged at iteration 23, L1 7.76842e-05, Linf 0.00258026, total time[s] 0.078009 +Converged at iteration 25, L1 5.84448e-05, Linf 0.00207432, total time[s] 0.069974 +Converged at iteration 22, L1 5.33936e-05, Linf 0.00230786, total time[s] 0.082587 +Converged at iteration 21, L1 5.42549e-05, Linf 0.00265631, total time[s] 0.063873 +Converged at iteration 32, L1 7.65741e-05, Linf 0.00875495, total time[s] 0.113327 +Converged at iteration 23, L1 6.29246e-05, Linf 0.00336221, total time[s] 0.063215 +Converged at iteration 24, L1 6.79972e-05, Linf 0.00513688, total time[s] 0.061874 +Converged at iteration 26, L1 8.39871e-05, Linf 0.00423441, total time[s] 0.066923 +Converged at iteration 23, L1 8.52087e-05, Linf 0.00288789, total time[s] 0.060904 +Converged at iteration 23, L1 7.94012e-05, Linf 0.00278523, total time[s] 0.060901 +Converged at iteration 27, L1 4.93658e-05, Linf 0.00338071, total time[s] 0.069272 +Converged at iteration 28, L1 9.20574e-05, Linf 0.00542354, total time[s] 0.071064 +Converged at iteration 28, L1 5.87926e-05, Linf 0.0045056, total time[s] 0.07205 +Converged at iteration 32, L1 9.32806e-05, Linf 0.00591049, total time[s] 0.082316 +Converged at iteration 28, L1 8.08187e-05, Linf 0.00207266, total time[s] 0.074659 +Converged at iteration 31, L1 8.375e-05, Linf 0.0108691, total time[s] 0.079768 +Converged at iteration 31, L1 6.30198e-05, Linf 0.00257085, total time[s] 0.078728 +Converged at iteration 33, L1 7.46469e-05, Linf 0.00445153, total time[s] 0.082878 +Converged at iteration 32, L1 3.68309e-05, Linf 0.0058778, total time[s] 0.082437 +Converged at iteration 33, L1 6.21589e-05, Linf 0.0143786, total time[s] 0.082574 +Converged at iteration 29, L1 9.45297e-05, Linf 0.0171092, total time[s] 0.073876 +Converged at iteration 25, L1 7.43995e-05, Linf 0.00303202, total time[s] 0.066279 +Converged at iteration 38, L1 3.84066e-05, Linf 0.00947662, total time[s] 0.098493 +Converged at iteration 36, L1 4.20204e-05, Linf 0.0082363, total time[s] 0.097617 +Converged at iteration 25, L1 7.55357e-05, Linf 0.00301276, total time[s] 0.066783 +Converged at iteration 26, L1 5.84936e-05, Linf 0.00418684, total time[s] 0.06777 +Converged at iteration 25, L1 5.01563e-05, Linf 0.00734359, total time[s] 0.064945 +Converged at iteration 27, L1 4.15131e-05, Linf 0.00968928, total time[s] 0.071641 +Converged at iteration 21, L1 5.30776e-05, Linf 0.008233, total time[s] 0.067422 +Converged at iteration 20, L1 4.94779e-05, Linf 0.00279475, total time[s] 0.057173 +Converged at iteration 23, L1 7.69737e-05, Linf 0.00388778, total time[s] 0.079773 +Converged at iteration 25, L1 5.9117e-05, Linf 0.00210406, total time[s] 0.090936 +Converged at iteration 22, L1 5.31258e-05, Linf 0.00229354, total time[s] 0.063305 +Converged at iteration 21, L1 5.49616e-05, Linf 0.00269986, total time[s] 0.064995 +Converged at iteration 32, L1 7.93147e-05, Linf 0.00897809, total time[s] 0.099896 +Converged at iteration 22, L1 9.84179e-05, Linf 0.0062286, total time[s] 0.062198 +Converged at iteration 24, L1 6.7627e-05, Linf 0.00517366, total time[s] 0.063329 +Converged at iteration 26, L1 8.31964e-05, Linf 0.00424502, total time[s] 0.068594 +Converged at iteration 23, L1 8.36302e-05, Linf 0.00280956, total time[s] 0.061606 +Converged at iteration 23, L1 7.7858e-05, Linf 0.00258502, total time[s] 0.073965 +Converged at iteration 27, L1 4.98567e-05, Linf 0.00345282, total time[s] 0.083364 +Converged at iteration 29, L1 5.58711e-05, Linf 0.00315354, total time[s] 0.081371 +Converged at iteration 28, L1 5.84093e-05, Linf 0.00455122, total time[s] 0.075573 +Converged at iteration 32, L1 9.32085e-05, Linf 0.00592727, total time[s] 0.088595 +Converged at iteration 28, L1 8.38265e-05, Linf 0.00210124, total time[s] 0.075451 +Converged at iteration 31, L1 8.25425e-05, Linf 0.0109004, total time[s] 0.080965 +Converged at iteration 31, L1 6.18752e-05, Linf 0.0025837, total time[s] 0.080088 +Converged at iteration 33, L1 7.34839e-05, Linf 0.00376451, total time[s] 0.08857 +Converged at iteration 32, L1 3.88708e-05, Linf 0.00617904, total time[s] 0.084154 +Converged at iteration 33, L1 6.46073e-05, Linf 0.0151149, total time[s] 0.088884 +Converged at iteration 29, L1 8.99163e-05, Linf 0.017016, total time[s] 0.083632 +Converged at iteration 25, L1 7.5549e-05, Linf 0.00303524, total time[s] 0.067487 +Converged at iteration 38, L1 3.8852e-05, Linf 0.00961558, total time[s] 0.101526 +Converged at iteration 36, L1 4.24698e-05, Linf 0.00840453, total time[s] 0.098048 +Converged at iteration 25, L1 7.53183e-05, Linf 0.00300912, total time[s] 0.068724 +Converged at iteration 26, L1 5.95316e-05, Linf 0.00428461, total time[s] 0.067639 +Converged at iteration 25, L1 5.34285e-05, Linf 0.00731461, total time[s] 0.06606 +Converged at iteration 27, L1 4.15991e-05, Linf 0.00993708, total time[s] 0.071022 +Converged at iteration 21, L1 5.36806e-05, Linf 0.00827314, total time[s] 0.063226 +Converged at iteration 20, L1 5.12965e-05, Linf 0.00281043, total time[s] 0.073596 +Converged at iteration 23, L1 7.60527e-05, Linf 0.0026145, total time[s] 0.080102 +Converged at iteration 25, L1 5.9686e-05, Linf 0.00210428, total time[s] 0.072857 +Converged at iteration 22, L1 5.31183e-05, Linf 0.00229713, total time[s] 0.06379 +Converged at iteration 21, L1 5.5511e-05, Linf 0.0027291, total time[s] 0.067216 +Converged at iteration 32, L1 8.07434e-05, Linf 0.0089613, total time[s] 0.091362 +Converged at iteration 22, L1 9.93002e-05, Linf 0.00629881, total time[s] 0.064864 +Converged at iteration 24, L1 6.77564e-05, Linf 0.00519578, total time[s] 0.066371 +Converged at iteration 26, L1 8.38518e-05, Linf 0.00429008, total time[s] 0.069314 +Converged at iteration 23, L1 8.29865e-05, Linf 0.00272331, total time[s] 0.060212 +Converged at iteration 23, L1 7.77129e-05, Linf 0.0024723, total time[s] 0.060946 +Converged at iteration 27, L1 4.8957e-05, Linf 0.00348184, total time[s] 0.07054 +Converged at iteration 29, L1 5.79055e-05, Linf 0.00326992, total time[s] 0.076067 +Converged at iteration 28, L1 5.84597e-05, Linf 0.0045775, total time[s] 0.073454 +Converged at iteration 32, L1 9.33845e-05, Linf 0.00594783, total time[s] 0.08095 +Converged at iteration 28, L1 8.51866e-05, Linf 0.00211459, total time[s] 0.073464 +Converged at iteration 31, L1 8.36516e-05, Linf 0.0108839, total time[s] 0.08321 +Converged at iteration 31, L1 6.21854e-05, Linf 0.00258745, total time[s] 0.083722 +Converged at iteration 33, L1 7.32436e-05, Linf 0.0037891, total time[s] 0.08443 +Converged at iteration 32, L1 4.02412e-05, Linf 0.00652878, total time[s] 0.081858 +Converged at iteration 33, L1 6.6106e-05, Linf 0.0155458, total time[s] 0.08635 +Converged at iteration 29, L1 8.90465e-05, Linf 0.0169268, total time[s] 0.074862 +Converged at iteration 25, L1 7.57681e-05, Linf 0.0030412, total time[s] 0.065557 +Converged at iteration 38, L1 4.00002e-05, Linf 0.00982806, total time[s] 0.098218 +Converged at iteration 36, L1 4.35283e-05, Linf 0.00867706, total time[s] 0.095679 +Converged at iteration 25, L1 7.47315e-05, Linf 0.00298418, total time[s] 0.069034 +Converged at iteration 26, L1 6.19557e-05, Linf 0.0044765, total time[s] 0.06698 +Converged at iteration 25, L1 4.95885e-05, Linf 0.00727787, total time[s] 0.065356 +Converged at iteration 27, L1 4.29954e-05, Linf 0.0104198, total time[s] 0.073481 +Converged at iteration 21, L1 5.46944e-05, Linf 0.00832891, total time[s] 0.060168 +Converged at iteration 20, L1 5.14182e-05, Linf 0.00283868, total time[s] 0.058823 +Converged at iteration 23, L1 7.47315e-05, Linf 0.00265298, total time[s] 0.0639 +Converged at iteration 25, L1 6.04585e-05, Linf 0.00213367, total time[s] 0.072382 +Converged at iteration 22, L1 5.3117e-05, Linf 0.00227492, total time[s] 0.065562 +Converged at iteration 21, L1 5.63953e-05, Linf 0.00278119, total time[s] 0.063279 +Converged at iteration 32, L1 8.37761e-05, Linf 0.00913186, total time[s] 0.102333 +Converged at iteration 23, L1 5.84892e-05, Linf 0.00703999, total time[s] 0.067566 +Converged at iteration 24, L1 6.81516e-05, Linf 0.00522638, total time[s] 0.079576 +Converged at iteration 26, L1 8.28186e-05, Linf 0.00440849, total time[s] 0.066584 +Converged at iteration 23, L1 8.15138e-05, Linf 0.00267737, total time[s] 0.060559 +Converged at iteration 23, L1 7.67842e-05, Linf 0.00233711, total time[s] 0.060574 +Converged at iteration 27, L1 4.94019e-05, Linf 0.00354942, total time[s] 0.069738 +Converged at iteration 29, L1 6.11779e-05, Linf 0.00337377, total time[s] 0.076318 +Converged at iteration 28, L1 5.88745e-05, Linf 0.00461754, total time[s] 0.073178 +Converged at iteration 32, L1 9.28934e-05, Linf 0.00595776, total time[s] 0.084925 +Converged at iteration 28, L1 8.83206e-05, Linf 0.002207, total time[s] 0.072416 +Converged at iteration 31, L1 8.14302e-05, Linf 0.0107084, total time[s] 0.080329 +Converged at iteration 31, L1 6.22384e-05, Linf 0.0026066, total time[s] 0.080668 +Converged at iteration 33, L1 7.39577e-05, Linf 0.00386699, total time[s] 0.085146 +Converged at iteration 32, L1 4.28287e-05, Linf 0.00699536, total time[s] 0.081571 +Converged at iteration 33, L1 6.9138e-05, Linf 0.0163105, total time[s] 0.084838 +Converged at iteration 29, L1 8.83847e-05, Linf 0.0172089, total time[s] 0.075031 +Converged at iteration 25, L1 7.84218e-05, Linf 0.00305431, total time[s] 0.067777 +Converged at iteration 38, L1 4.04166e-05, Linf 0.00993903, total time[s] 0.103038 +Converged at iteration 36, L1 4.42762e-05, Linf 0.00882566, total time[s] 0.096781 +Converged at iteration 25, L1 7.43036e-05, Linf 0.00297706, total time[s] 0.068445 +Converged at iteration 26, L1 6.30344e-05, Linf 0.00457226, total time[s] 0.0711 +Converged at iteration 25, L1 4.93743e-05, Linf 0.00724889, total time[s] 0.065365 +Converged at iteration 27, L1 7.44907e-05, Linf 0.0106689, total time[s] 0.076486 +Converged at iteration 21, L1 5.55143e-05, Linf 0.00863863, total time[s] 0.060501 +Converged at iteration 20, L1 5.28324e-05, Linf 0.00284863, total time[s] 0.068582 +Converged at iteration 23, L1 7.38484e-05, Linf 0.00264674, total time[s] 0.071765 +Converged at iteration 25, L1 6.08755e-05, Linf 0.00213795, total time[s] 0.079423 +Converged at iteration 22, L1 5.32148e-05, Linf 0.002294, total time[s] 0.065538 +Converged at iteration 21, L1 5.69317e-05, Linf 0.00281036, total time[s] 0.067934 +Converged at iteration 32, L1 8.55366e-05, Linf 0.00885903, total time[s] 0.100076 +Converged at iteration 23, L1 5.3878e-05, Linf 0.00355221, total time[s] 0.064165 +Converged at iteration 24, L1 7.05422e-05, Linf 0.00543798, total time[s] 0.062306 +Converged at iteration 26, L1 8.30677e-05, Linf 0.0045013, total time[s] 0.066878 +Converged at iteration 23, L1 8.04884e-05, Linf 0.00259794, total time[s] 0.060894 +Converged at iteration 23, L1 7.57854e-05, Linf 0.00227828, total time[s] 0.06609 +Converged at iteration 27, L1 4.95458e-05, Linf 0.0035772, total time[s] 0.071737 +Converged at iteration 29, L1 6.40606e-05, Linf 0.00345457, total time[s] 0.07374 +Converged at iteration 28, L1 6.0335e-05, Linf 0.00461832, total time[s] 0.071376 +Converged at iteration 32, L1 9.31473e-05, Linf 0.00597481, total time[s] 0.081076 +Converged at iteration 28, L1 8.89585e-05, Linf 0.00214848, total time[s] 0.072055 +Converged at iteration 31, L1 8.12803e-05, Linf 0.0106792, total time[s] 0.07849 +Converged at iteration 31, L1 6.16506e-05, Linf 0.0026018, total time[s] 0.082892 +Converged at iteration 33, L1 7.40113e-05, Linf 0.00387643, total time[s] 0.082858 +Converged at iteration 32, L1 4.38898e-05, Linf 0.00716903, total time[s] 0.082445 +Converged at iteration 33, L1 7.01015e-05, Linf 0.0167327, total time[s] 0.090893 +Converged at iteration 29, L1 8.76961e-05, Linf 0.0176041, total time[s] 0.076465 +Converged at iteration 25, L1 7.56768e-05, Linf 0.00306286, total time[s] 0.064208 +Converged at iteration 38, L1 4.12771e-05, Linf 0.0100923, total time[s] 0.100492 +Converged at iteration 36, L1 4.67391e-05, Linf 0.00918035, total time[s] 0.102325 +Converged at iteration 25, L1 7.31605e-05, Linf 0.00294625, total time[s] 0.066621 +Converged at iteration 26, L1 6.63613e-05, Linf 0.00492545, total time[s] 0.067371 +Converged at iteration 25, L1 4.92739e-05, Linf 0.00740781, total time[s] 0.066738 +Converged at iteration 27, L1 4.5905e-05, Linf 0.0117056, total time[s] 0.071705 +Converged at iteration 21, L1 5.72464e-05, Linf 0.00857842, total time[s] 0.069139 +Converged at iteration 20, L1 5.44437e-05, Linf 0.00258299, total time[s] 0.069238 +Converged at iteration 23, L1 7.42114e-05, Linf 0.00394764, total time[s] 0.089212 +Converged at iteration 25, L1 6.17481e-05, Linf 0.00216082, total time[s] 0.073117 +Converged at iteration 22, L1 5.31849e-05, Linf 0.00227993, total time[s] 0.062617 +Converged at iteration 21, L1 5.79106e-05, Linf 0.00287884, total time[s] 0.060416 +Converged at iteration 32, L1 9.12421e-05, Linf 0.009042, total time[s] 0.088594 +Converged at iteration 23, L1 6.70359e-05, Linf 0.0111616, total time[s] 0.064699 +Converged at iteration 24, L1 7.22995e-05, Linf 0.00529632, total time[s] 0.06316 +Converged at iteration 26, L1 8.17689e-05, Linf 0.00471558, total time[s] 0.071828 +Converged at iteration 23, L1 7.71891e-05, Linf 0.00252251, total time[s] 0.060791 +Converged at iteration 23, L1 7.44334e-05, Linf 0.00218046, total time[s] 0.064729 +Converged at iteration 27, L1 5.32835e-05, Linf 0.00366715, total time[s] 0.082231 +Converged at iteration 29, L1 6.80809e-05, Linf 0.00368385, total time[s] 0.074558 +Converged at iteration 28, L1 6.38309e-05, Linf 0.00470989, total time[s] 0.112597 +Converged at iteration 32, L1 9.26112e-05, Linf 0.00597765, total time[s] 0.086908 +Converged at iteration 28, L1 9.20811e-05, Linf 0.00219931, total time[s] 0.074086 +Converged at iteration 31, L1 8.24178e-05, Linf 0.0108272, total time[s] 0.080623 +Converged at iteration 31, L1 6.11298e-05, Linf 0.00263328, total time[s] 0.080003 +Converged at iteration 33, L1 7.64974e-05, Linf 0.00393341, total time[s] 0.084849 +Converged at iteration 32, L1 4.66843e-05, Linf 0.00766575, total time[s] 0.084534 +Converged at iteration 33, L1 7.37125e-05, Linf 0.017818, total time[s] 0.085138 +Converged at iteration 29, L1 8.67573e-05, Linf 0.0174704, total time[s] 0.075036 +Converged at iteration 25, L1 7.70379e-05, Linf 0.00306946, total time[s] 0.065909 +Converged at iteration 38, L1 4.18588e-05, Linf 0.0104625, total time[s] 0.100058 +Converged at iteration 36, L1 4.61403e-05, Linf 0.00932965, total time[s] 0.097903 +Converged at iteration 25, L1 7.25673e-05, Linf 0.00293052, total time[s] 0.065254 +Converged at iteration 26, L1 6.75391e-05, Linf 0.0050285, total time[s] 0.068448 +Converged at iteration 25, L1 4.89316e-05, Linf 0.00737396, total time[s] 0.065146 +Converged at iteration 27, L1 4.64774e-05, Linf 0.0120856, total time[s] 0.071188 +Converged at iteration 21, L1 5.77404e-05, Linf 0.00859594, total time[s] 0.067199 +Converged at iteration 20, L1 5.64021e-05, Linf 0.00325425, total time[s] 0.089918 +Converged at iteration 23, L1 7.31756e-05, Linf 0.00271494, total time[s] 0.065655 +Converged at iteration 25, L1 6.17256e-05, Linf 0.00217081, total time[s] 0.072277 +Converged at iteration 22, L1 5.37955e-05, Linf 0.00227905, total time[s] 0.075162 +Converged at iteration 21, L1 5.95096e-05, Linf 0.00290782, total time[s] 0.063156 +Converged at iteration 32, L1 9.10422e-05, Linf 0.00906378, total time[s] 0.115674 +Converged at iteration 23, L1 5.74569e-05, Linf 0.00368817, total time[s] 0.066752 +Converged at iteration 24, L1 7.01826e-05, Linf 0.00531238, total time[s] 0.063035 +Converged at iteration 26, L1 8.13863e-05, Linf 0.00485302, total time[s] 0.066557 +Converged at iteration 23, L1 7.62347e-05, Linf 0.00250464, total time[s] 0.060046 +Converged at iteration 23, L1 7.38945e-05, Linf 0.00211663, total time[s] 0.059977 +Converged at iteration 27, L1 5.46195e-05, Linf 0.00369943, total time[s] 0.070492 +Converged at iteration 29, L1 6.91787e-05, Linf 0.00375914, total time[s] 0.074043 +Converged at iteration 28, L1 6.36584e-05, Linf 0.00473248, total time[s] 0.072343 +Converged at iteration 32, L1 9.2053e-05, Linf 0.00598069, total time[s] 0.08063 +Converged at iteration 28, L1 9.24014e-05, Linf 0.00220821, total time[s] 0.072303 +Converged at iteration 31, L1 8.11151e-05, Linf 0.0108038, total time[s] 0.079779 +Converged at iteration 31, L1 6.32156e-05, Linf 0.00264286, total time[s] 0.084168 +Converged at iteration 33, L1 7.44449e-05, Linf 0.00395557, total time[s] 0.094826 +Converged at iteration 32, L1 4.86134e-05, Linf 0.0077557, total time[s] 0.084299 +Converged at iteration 33, L1 7.50136e-05, Linf 0.0182468, total time[s] 0.08497 +Converged at iteration 29, L1 8.5922e-05, Linf 0.0173786, total time[s] 0.074862 +Converged at iteration 25, L1 7.48244e-05, Linf 0.00311334, total time[s] 0.066623 +Converged at iteration 38, L1 4.26325e-05, Linf 0.0105222, total time[s] 0.100541 +Converged at iteration 36, L1 7.22693e-05, Linf 0.00967785, total time[s] 0.100169 +Converged at iteration 25, L1 7.10293e-05, Linf 0.00289411, total time[s] 0.065259 +Converged at iteration 26, L1 7.14667e-05, Linf 0.00531076, total time[s] 0.069439 +Converged at iteration 25, L1 4.81077e-05, Linf 0.00712445, total time[s] 0.065518 +Converged at iteration 27, L1 4.81681e-05, Linf 0.012291, total time[s] 0.07504 +Converged at iteration 21, L1 5.95509e-05, Linf 0.00845121, total time[s] 0.063927 +Converged at iteration 20, L1 5.76332e-05, Linf 0.00270637, total time[s] 0.067544 +Converged at iteration 23, L1 7.18237e-05, Linf 0.00275818, total time[s] 0.074048 +Converged at iteration 25, L1 6.2295e-05, Linf 0.00218804, total time[s] 0.072711 +Converged at iteration 22, L1 5.26416e-05, Linf 0.00226467, total time[s] 0.064172 +Converged at iteration 21, L1 5.92915e-05, Linf 0.00297591, total time[s] 0.062716 +Converged at iteration 32, L1 9.61082e-05, Linf 0.0091055, total time[s] 0.101374 +Converged at iteration 23, L1 6.14385e-05, Linf 0.00378981, total time[s] 0.062512 +Converged at iteration 24, L1 7.43964e-05, Linf 0.00536508, total time[s] 0.101347 +Converged at iteration 26, L1 8.07354e-05, Linf 0.00444241, total time[s] 0.075114 +Converged at iteration 23, L1 7.42968e-05, Linf 0.00248613, total time[s] 0.068647 +Converged at iteration 23, L1 7.29415e-05, Linf 0.00203975, total time[s] 0.059 +Converged at iteration 27, L1 6.01157e-05, Linf 0.00490778, total time[s] 0.244859 +Converged at iteration 29, L1 7.31213e-05, Linf 0.00395249, total time[s] 0.075061 +Converged at iteration 28, L1 6.59032e-05, Linf 0.0047922, total time[s] 0.08424 +Converged at iteration 32, L1 9.08117e-05, Linf 0.00597081, total time[s] 0.077991 +Converged at iteration 28, L1 9.50757e-05, Linf 0.00224999, total time[s] 0.069229 +Converged at iteration 31, L1 8.44958e-05, Linf 0.0109001, total time[s] 0.076193 +Converged at iteration 31, L1 6.143e-05, Linf 0.00267343, total time[s] 0.076739 +Converged at iteration 33, L1 7.7221e-05, Linf 0.00400017, total time[s] 0.083708 +Converged at iteration 32, L1 5.11938e-05, Linf 0.0082279, total time[s] 0.078899 +Converged at iteration 33, L1 7.91639e-05, Linf 0.0202009, total time[s] 0.08131 +Converged at iteration 29, L1 8.62505e-05, Linf 0.017497, total time[s] 0.072204 +Converged at iteration 25, L1 7.45861e-05, Linf 0.00323034, total time[s] 0.063211 +Converged at iteration 38, L1 4.32785e-05, Linf 0.0108727, total time[s] 0.094187 +Converged at iteration 36, L1 4.77405e-05, Linf 0.0100471, total time[s] 0.096377 +Converged at iteration 25, L1 7.07321e-05, Linf 0.00288531, total time[s] 0.065599 +Converged at iteration 26, L1 7.28589e-05, Linf 0.00544212, total time[s] 0.067003 +Converged at iteration 25, L1 5.11902e-05, Linf 0.00703712, total time[s] 0.064102 +Converged at iteration 27, L1 4.93206e-05, Linf 0.0130122, total time[s] 0.072891 +Converged at iteration 21, L1 6.07214e-05, Linf 0.00866528, total time[s] 0.059684 +Converged at iteration 20, L1 5.85543e-05, Linf 0.00275837, total time[s] 0.068226 +Converged at iteration 23, L1 7.27837e-05, Linf 0.00276673, total time[s] 0.083991 +Converged at iteration 25, L1 6.27637e-05, Linf 0.00218581, total time[s] 0.079899 +Converged at iteration 22, L1 5.27636e-05, Linf 0.00225973, total time[s] 0.08655 +Converged at iteration 21, L1 6.11894e-05, Linf 0.00300957, total time[s] 0.06872 +Converged at iteration 32, L1 9.76431e-05, Linf 0.00912051, total time[s] 0.091631 +Converged at iteration 23, L1 6.00719e-05, Linf 0.00382587, total time[s] 0.06218 +Converged at iteration 24, L1 7.20686e-05, Linf 0.00538696, total time[s] 0.063075 +Converged at iteration 26, L1 8.02518e-05, Linf 0.00446149, total time[s] 0.06777 +Converged at iteration 23, L1 7.37623e-05, Linf 0.00242166, total time[s] 0.061715 +Converged at iteration 23, L1 7.22804e-05, Linf 0.0020162, total time[s] 0.060279 +Converged at iteration 27, L1 6.04467e-05, Linf 0.00383045, total time[s] 0.071395 +Converged at iteration 29, L1 7.25474e-05, Linf 0.00405374, total time[s] 0.075729 +Converged at iteration 28, L1 6.73962e-05, Linf 0.00482197, total time[s] 0.074017 +Converged at iteration 32, L1 9.06429e-05, Linf 0.00597856, total time[s] 0.084463 +Converged at iteration 28, L1 9.65654e-05, Linf 0.00226457, total time[s] 0.075058 +Converged at iteration 31, L1 8.31308e-05, Linf 0.0107771, total time[s] 0.079786 +Converged at iteration 31, L1 6.2223e-05, Linf 0.00269143, total time[s] 0.079237 +Converged at iteration 33, L1 7.5615e-05, Linf 0.00401231, total time[s] 0.083985 +Converged at iteration 32, L1 5.27348e-05, Linf 0.0081997, total time[s] 0.082794 +Converged at iteration 33, L1 8.05188e-05, Linf 0.0196585, total time[s] 0.085756 +Converged at iteration 29, L1 8.4018e-05, Linf 0.018113, total time[s] 0.075351 +Converged at iteration 25, L1 7.3727e-05, Linf 0.00322425, total time[s] 0.066882 +Converged at iteration 38, L1 4.40324e-05, Linf 0.0111295, total time[s] 0.097395 +Converged at iteration 36, L1 4.84554e-05, Linf 0.0104659, total time[s] 0.100069 +Converged at iteration 25, L1 6.94343e-05, Linf 0.00284966, total time[s] 0.066409 +Converged at iteration 26, L1 7.50753e-05, Linf 0.00565762, total time[s] 0.068792 +Converged at iteration 25, L1 4.7443e-05, Linf 0.00727136, total time[s] 0.066343 +Converged at iteration 27, L1 5.04247e-05, Linf 0.0135637, total time[s] 0.07306 +Converged at iteration 21, L1 6.19271e-05, Linf 0.00865886, total time[s] 0.061212 +Converged at iteration 20, L1 5.93327e-05, Linf 0.00345036, total time[s] 0.062567 +Converged at iteration 23, L1 7.19313e-05, Linf 0.00282826, total time[s] 0.084218 +Converged at iteration 25, L1 6.28216e-05, Linf 0.00219139, total time[s] 0.071693 +Converged at iteration 22, L1 5.24153e-05, Linf 0.00223909, total time[s] 0.077659 +Converged at iteration 21, L1 6.24391e-05, Linf 0.00306227, total time[s] 0.062242 +Converged at iteration 33, L1 3.26358e-05, Linf 0.00288777, total time[s] 0.094187 +Converged at iteration 23, L1 5.94458e-05, Linf 0.00388921, total time[s] 0.06082 +Converged at iteration 24, L1 7.24959e-05, Linf 0.00542751, total time[s] 0.064231 +Converged at iteration 26, L1 7.98239e-05, Linf 0.00443633, total time[s] 0.068699 +Converged at iteration 23, L1 7.27107e-05, Linf 0.00244021, total time[s] 0.061091 +Converged at iteration 23, L1 7.27978e-05, Linf 0.00210228, total time[s] 0.067792 +Converged at iteration 27, L1 6.29639e-05, Linf 0.00388658, total time[s] 0.071677 +Converged at iteration 29, L1 7.21793e-05, Linf 0.00419791, total time[s] 0.076912 +Converged at iteration 28, L1 7.09928e-05, Linf 0.00486289, total time[s] 0.074619 +Converged at iteration 32, L1 8.98649e-05, Linf 0.00597213, total time[s] 0.083337 +Converged at iteration 28, L1 9.81948e-05, Linf 0.00228988, total time[s] 0.074336 +Converged at iteration 31, L1 8.13961e-05, Linf 0.0107747, total time[s] 0.080999 +Converged at iteration 31, L1 6.20938e-05, Linf 0.00271914, total time[s] 0.081216 +Converged at iteration 33, L1 7.51286e-05, Linf 0.00405486, total time[s] 0.087097 +Converged at iteration 32, L1 5.43985e-05, Linf 0.00860968, total time[s] 0.087543 +Converged at iteration 33, L1 8.34044e-05, Linf 0.0207458, total time[s] 0.085894 +Converged at iteration 29, L1 8.27315e-05, Linf 0.0180518, total time[s] 0.076755 +Converged at iteration 25, L1 7.30043e-05, Linf 0.00321855, total time[s] 0.067425 +Converged at iteration 38, L1 4.43493e-05, Linf 0.0111089, total time[s] 0.098352 +Converged at iteration 36, L1 4.87959e-05, Linf 0.0106403, total time[s] 0.098256 +Converged at iteration 25, L1 6.89413e-05, Linf 0.00284456, total time[s] 0.065624 +Converged at iteration 26, L1 7.62129e-05, Linf 0.00587582, total time[s] 0.071073 +Converged at iteration 25, L1 4.69067e-05, Linf 0.00703046, total time[s] 0.067478 +Converged at iteration 27, L1 5.13968e-05, Linf 0.0134765, total time[s] 0.074895 +Converged at iteration 21, L1 6.2835e-05, Linf 0.00852629, total time[s] 0.066542 +Converged at iteration 20, L1 6.08076e-05, Linf 0.00287035, total time[s] 0.065732 +Converged at iteration 23, L1 7.10553e-05, Linf 0.00284176, total time[s] 0.066114 +Converged at iteration 25, L1 6.32692e-05, Linf 0.00218765, total time[s] 0.091929 +Converged at iteration 22, L1 5.2536e-05, Linf 0.00223299, total time[s] 0.0645 +Converged at iteration 21, L1 6.17454e-05, Linf 0.00309947, total time[s] 0.058046 +Converged at iteration 33, L1 3.28222e-05, Linf 0.00289374, total time[s] 0.102222 +Converged at iteration 23, L1 5.88933e-05, Linf 0.0039277, total time[s] 0.063869 +Converged at iteration 24, L1 7.53577e-05, Linf 0.00729429, total time[s] 0.06468 +Converged at iteration 26, L1 7.97574e-05, Linf 0.00445538, total time[s] 0.068702 +Converged at iteration 23, L1 7.18553e-05, Linf 0.00245491, total time[s] 0.06172 +Converged at iteration 23, L1 7.2775e-05, Linf 0.0020278, total time[s] 0.060991 +Converged at iteration 27, L1 6.39569e-05, Linf 0.0039174, total time[s] 0.070466 +Converged at iteration 29, L1 7.23465e-05, Linf 0.00432789, total time[s] 0.07465 +Converged at iteration 28, L1 7.39633e-05, Linf 0.00488828, total time[s] 0.072884 +Converged at iteration 32, L1 8.97087e-05, Linf 0.00597906, total time[s] 0.082533 +Converged at iteration 28, L1 9.82478e-05, Linf 0.00230841, total time[s] 0.072861 +Converged at iteration 31, L1 8.12394e-05, Linf 0.0107349, total time[s] 0.079326 +Converged at iteration 31, L1 6.1982e-05, Linf 0.00272025, total time[s] 0.079589 +Converged at iteration 33, L1 7.49449e-05, Linf 0.0040671, total time[s] 0.084229 +Converged at iteration 32, L1 5.59459e-05, Linf 0.00880025, total time[s] 0.082693 +Converged at iteration 33, L1 8.53797e-05, Linf 0.0213157, total time[s] 0.085326 +Converged at iteration 29, L1 8.19064e-05, Linf 0.0179045, total time[s] 0.074817 +Converged at iteration 25, L1 7.38944e-05, Linf 0.00323715, total time[s] 0.065477 +Converged at iteration 38, L1 4.51224e-05, Linf 0.0114143, total time[s] 0.099486 +Converged at iteration 36, L1 4.93525e-05, Linf 0.0105374, total time[s] 0.102679 +Converged at iteration 25, L1 6.82884e-05, Linf 0.00280478, total time[s] 0.066133 +Converged at iteration 26, L1 7.8641e-05, Linf 0.00617524, total time[s] 0.068351 +Converged at iteration 25, L1 4.64799e-05, Linf 0.00698986, total time[s] 0.06933 +Converged at iteration 27, L1 5.24759e-05, Linf 0.0140222, total time[s] 0.074028 +Converged at iteration 21, L1 6.37888e-05, Linf 0.00854154, total time[s] 0.064832 +Converged at iteration 20, L1 6.17806e-05, Linf 0.00294944, total time[s] 0.071787 +Converged at iteration 23, L1 7.0906e-05, Linf 0.00288168, total time[s] 0.074607 +Converged at iteration 25, L1 6.51769e-05, Linf 0.0110477, total time[s] 0.070561 +Converged at iteration 22, L1 5.19963e-05, Linf 0.00223214, total time[s] 0.063771 +Converged at iteration 21, L1 6.33309e-05, Linf 0.00315962, total time[s] 0.059021 +Converged at iteration 33, L1 3.36206e-05, Linf 0.002911, total time[s] 0.091892 +Converged at iteration 23, L1 6.2676e-05, Linf 0.00399339, total time[s] 0.080055 +Converged at iteration 24, L1 7.54743e-05, Linf 0.00549255, total time[s] 0.091025 +Converged at iteration 26, L1 8.00289e-05, Linf 0.0044355, total time[s] 0.104814 +Converged at iteration 23, L1 7.00274e-05, Linf 0.00234143, total time[s] 0.065996 +Converged at iteration 23, L1 7.29031e-05, Linf 0.00193951, total time[s] 0.063366 +Converged at iteration 27, L1 6.76048e-05, Linf 0.00649582, total time[s] 0.079559 +Converged at iteration 29, L1 7.39674e-05, Linf 0.00766362, total time[s] 0.084266 +Converged at iteration 28, L1 7.13218e-05, Linf 0.00493044, total time[s] 0.076673 +Converged at iteration 32, L1 8.9176e-05, Linf 0.00597794, total time[s] 0.082365 +Converged at iteration 28, L1 9.87481e-05, Linf 0.00233378, total time[s] 0.074321 +Converged at iteration 31, L1 8.30202e-05, Linf 0.0105679, total time[s] 0.085276 +Converged at iteration 31, L1 6.6217e-05, Linf 0.00275224, total time[s] 0.086219 +Converged at iteration 33, L1 7.72568e-05, Linf 0.00410246, total time[s] 0.090972 +Converged at iteration 32, L1 5.84822e-05, Linf 0.00896692, total time[s] 0.096244 +Converged at iteration 33, L1 8.83717e-05, Linf 0.0221924, total time[s] 0.088606 +Converged at iteration 29, L1 8.10075e-05, Linf 0.0178453, total time[s] 0.079878 +Converged at iteration 25, L1 7.326e-05, Linf 0.00326675, total time[s] 0.072012 +Converged at iteration 38, L1 4.57402e-05, Linf 0.0116146, total time[s] 0.103559 +Converged at iteration 36, L1 4.98964e-05, Linf 0.0106952, total time[s] 0.097588 +Converged at iteration 25, L1 6.80147e-05, Linf 0.00278924, total time[s] 0.066837 +Converged at iteration 26, L1 7.96001e-05, Linf 0.00629743, total time[s] 0.070779 +Converged at iteration 25, L1 5.4434e-05, Linf 0.0346489, total time[s] 0.071971 +Converged at iteration 27, L1 5.44995e-05, Linf 0.0143411, total time[s] 0.080683 +Converged at iteration 21, L1 6.35843e-05, Linf 0.00855341, total time[s] 0.074229 +Converged at iteration 20, L1 6.31399e-05, Linf 0.00296242, total time[s] 0.059726 +Converged at iteration 23, L1 7.11218e-05, Linf 0.00290361, total time[s] 0.066127 +Converged at iteration 25, L1 6.36755e-05, Linf 0.00222896, total time[s] 0.080641 +Converged at iteration 22, L1 5.20136e-05, Linf 0.00222594, total time[s] 0.060463 +Converged at iteration 21, L1 6.34868e-05, Linf 0.00319544, total time[s] 0.057738 +Converged at iteration 33, L1 3.39747e-05, Linf 0.00292176, total time[s] 0.095291 +Converged at iteration 23, L1 7.25148e-05, Linf 0.00402858, total time[s] 0.062693 +Converged at iteration 24, L1 7.42644e-05, Linf 0.00550519, total time[s] 0.06439 +Converged at iteration 26, L1 7.89843e-05, Linf 0.00444593, total time[s] 0.071031 +Converged at iteration 23, L1 6.93589e-05, Linf 0.00230543, total time[s] 0.062176 +Converged at iteration 23, L1 7.27776e-05, Linf 0.0018735, total time[s] 0.065574 +Converged at iteration 27, L1 6.71293e-05, Linf 0.0039768, total time[s] 0.076012 +Converged at iteration 29, L1 7.21676e-05, Linf 0.00453619, total time[s] 0.084596 +Converged at iteration 28, L1 6.82597e-05, Linf 0.00495826, total time[s] 0.071605 +Converged at iteration 32, L1 8.90573e-05, Linf 0.00598913, total time[s] 0.082623 +Converged at iteration 28, L1 9.89791e-05, Linf 0.00234854, total time[s] 0.083594 +Converged at iteration 31, L1 8.02706e-05, Linf 0.0106752, total time[s] 0.101625 +Converged at iteration 31, L1 6.21309e-05, Linf 0.00275683, total time[s] 0.108466 +Converged at iteration 33, L1 7.54243e-05, Linf 0.00411925, total time[s] 0.087651 +Converged at iteration 32, L1 6.18655e-05, Linf 0.00929093, total time[s] 0.08696 +Converged at iteration 33, L1 9.0345e-05, Linf 0.0227389, total time[s] 0.084221 +Converged at iteration 29, L1 8.01177e-05, Linf 0.0184321, total time[s] 0.077165 +Converged at iteration 25, L1 7.35243e-05, Linf 0.0032887, total time[s] 0.067749 +Converged at iteration 38, L1 4.66728e-05, Linf 0.0120842, total time[s] 0.177346 +Converged at iteration 36, L1 5.09399e-05, Linf 0.0110671, total time[s] 0.097015 +Converged at iteration 25, L1 6.83925e-05, Linf 0.00274273, total time[s] 0.067524 +Converged at iteration 26, L1 8.30388e-05, Linf 0.00666746, total time[s] 0.069574 +Converged at iteration 25, L1 4.55374e-05, Linf 0.00685481, total time[s] 0.067454 +Converged at iteration 27, L1 5.54437e-05, Linf 0.0158056, total time[s] 0.090943 +Converged at iteration 21, L1 6.52735e-05, Linf 0.00844049, total time[s] 0.072452 +Converged at iteration 20, L1 6.46951e-05, Linf 0.00302956, total time[s] 0.060254 +Converged at iteration 23, L1 7.00314e-05, Linf 0.00300146, total time[s] 0.062851 +Converged at iteration 25, L1 6.4206e-05, Linf 0.00225677, total time[s] 0.070496 +Converged at iteration 22, L1 5.18762e-05, Linf 0.00197147, total time[s] 0.080585 +Converged at iteration 21, L1 6.50158e-05, Linf 0.00328242, total time[s] 0.066764 +Converged at iteration 33, L1 3.54759e-05, Linf 0.00294137, total time[s] 0.118951 +Converged at iteration 23, L1 6.07409e-05, Linf 0.00412336, total time[s] 0.071193 +Converged at iteration 24, L1 7.85872e-05, Linf 0.00555676, total time[s] 0.072007 +Converged at iteration 26, L1 7.7453e-05, Linf 0.00439375, total time[s] 0.07936 +Converged at iteration 23, L1 6.79901e-05, Linf 0.00237083, total time[s] 0.079386 +Converged at iteration 23, L1 7.34961e-05, Linf 0.00179569, total time[s] 0.065278 +Converged at iteration 27, L1 6.91057e-05, Linf 0.00402579, total time[s] 0.071895 +Converged at iteration 29, L1 7.28543e-05, Linf 0.00476544, total time[s] 0.076193 +Converged at iteration 28, L1 6.60772e-05, Linf 0.00502492, total time[s] 0.074875 +Converged at iteration 32, L1 8.82324e-05, Linf 0.00598958, total time[s] 0.087094 +Converged at iteration 29, L1 5.70993e-05, Linf 0.00162255, total time[s] 0.079034 +Converged at iteration 31, L1 7.97864e-05, Linf 0.0106459, total time[s] 0.084758 +Converged at iteration 31, L1 6.34138e-05, Linf 0.00280079, total time[s] 0.08109 +Converged at iteration 33, L1 7.6015e-05, Linf 0.0041607, total time[s] 0.086196 +Converged at iteration 32, L1 6.38021e-05, Linf 0.00972914, total time[s] 0.085318 +Converged at iteration 33, L1 9.50748e-05, Linf 0.0240826, total time[s] 0.086522 +Converged at iteration 29, L1 8.01889e-05, Linf 0.0188238, total time[s] 0.077638 +Converged at iteration 25, L1 7.47827e-05, Linf 0.00329846, total time[s] 0.066752 +Converged at iteration 38, L1 4.70955e-05, Linf 0.012289, total time[s] 0.101623 +Converged at iteration 36, L1 5.1499e-05, Linf 0.0112342, total time[s] 0.099416 +Converged at iteration 25, L1 6.82216e-05, Linf 0.00272522, total time[s] 0.07036 +Converged at iteration 26, L1 8.42656e-05, Linf 0.00674401, total time[s] 0.069809 +Converged at iteration 25, L1 4.5993e-05, Linf 0.00679336, total time[s] 0.067286 +Converged at iteration 27, L1 5.66929e-05, Linf 0.0155104, total time[s] 0.075235 +Converged at iteration 21, L1 6.59236e-05, Linf 0.00856525, total time[s] 0.060998 +Converged at iteration 20, L1 6.55978e-05, Linf 0.00307734, total time[s] 0.059711 +Converged at iteration 23, L1 6.93398e-05, Linf 0.00303501, total time[s] 0.069917 +Converged at iteration 25, L1 6.47377e-05, Linf 0.00227427, total time[s] 0.073032 +Converged at iteration 22, L1 5.13901e-05, Linf 0.00196113, total time[s] 0.06229 +Converged at iteration 21, L1 6.58248e-05, Linf 0.00332659, total time[s] 0.073628 +Converged at iteration 33, L1 3.5753e-05, Linf 0.00295294, total time[s] 0.093348 +Converged at iteration 23, L1 6.1175e-05, Linf 0.00416046, total time[s] 0.065087 +Converged at iteration 24, L1 7.61566e-05, Linf 0.00557364, total time[s] 0.067584 +Converged at iteration 26, L1 7.76492e-05, Linf 0.00438706, total time[s] 0.067721 +Converged at iteration 23, L1 6.72997e-05, Linf 0.00237948, total time[s] 0.061225 +Converged at iteration 23, L1 7.27366e-05, Linf 0.00181649, total time[s] 0.060636 +Converged at iteration 27, L1 6.93964e-05, Linf 0.00404993, total time[s] 0.071416 +Converged at iteration 29, L1 7.43636e-05, Linf 0.0048616, total time[s] 0.076384 +Converged at iteration 28, L1 6.57253e-05, Linf 0.00505242, total time[s] 0.073298 +Converged at iteration 32, L1 8.80085e-05, Linf 0.00600288, total time[s] 0.082146 +Converged at iteration 29, L1 5.72999e-05, Linf 0.00163982, total time[s] 0.075421 +Converged at iteration 31, L1 7.91066e-05, Linf 0.0106126, total time[s] 0.081495 +Converged at iteration 31, L1 6.36807e-05, Linf 0.00281105, total time[s] 0.082113 +Converged at iteration 33, L1 7.62534e-05, Linf 0.00418271, total time[s] 0.085364 +Converged at iteration 32, L1 6.5581e-05, Linf 0.00991885, total time[s] 0.082411 +Converged at iteration 33, L1 9.70397e-05, Linf 0.0246483, total time[s] 0.085136 +Converged at iteration 29, L1 7.76602e-05, Linf 0.0186431, total time[s] 0.076969 +Converged at iteration 25, L1 7.51447e-05, Linf 0.0033152, total time[s] 0.065166 +Converged at iteration 38, L1 5.03306e-05, Linf 0.0126173, total time[s] 0.102471 +Converged at iteration 36, L1 8.33862e-05, Linf 0.0114244, total time[s] 0.106131 +Converged at iteration 25, L1 6.78848e-05, Linf 0.00268858, total time[s] 0.071924 +Converged at iteration 26, L1 8.9404e-05, Linf 0.00708114, total time[s] 0.078454 +Converged at iteration 24, L1 9.93685e-05, Linf 0.0123309, total time[s] 0.06352 +Converged at iteration 27, L1 5.82335e-05, Linf 0.0163552, total time[s] 0.077423 +Converged at iteration 21, L1 6.78314e-05, Linf 0.00844171, total time[s] 0.066468 +Converged at iteration 20, L1 6.70806e-05, Linf 0.00314825, total time[s] 0.05752 +Converged at iteration 23, L1 6.85331e-05, Linf 0.00311594, total time[s] 0.071341 +Converged at iteration 25, L1 6.52274e-05, Linf 0.00230646, total time[s] 0.081164 +Converged at iteration 22, L1 5.08289e-05, Linf 0.00195418, total time[s] 0.073 +Converged at iteration 21, L1 6.92624e-05, Linf 0.00490343, total time[s] 0.071416 +Converged at iteration 33, L1 4.43286e-05, Linf 0.00297508, total time[s] 0.100193 +Converged at iteration 23, L1 6.23472e-05, Linf 0.00424919, total time[s] 0.074746 +Converged at iteration 24, L1 7.77511e-05, Linf 0.00562273, total time[s] 0.066544 +Converged at iteration 26, L1 7.65345e-05, Linf 0.00432038, total time[s] 0.119252 +Converged at iteration 23, L1 6.65877e-05, Linf 0.0024332, total time[s] 0.064432 +Converged at iteration 23, L1 7.43576e-05, Linf 0.00186209, total time[s] 0.065724 +Converged at iteration 27, L1 7.06541e-05, Linf 0.00410284, total time[s] 0.070562 +Converged at iteration 29, L1 7.65026e-05, Linf 0.00509623, total time[s] 0.089326 +Converged at iteration 28, L1 6.73092e-05, Linf 0.00511783, total time[s] 0.094459 +Converged at iteration 32, L1 8.70102e-05, Linf 0.00599546, total time[s] 0.106031 +Converged at iteration 29, L1 5.91034e-05, Linf 0.0016863, total time[s] 0.099756 +Converged at iteration 31, L1 8.01291e-05, Linf 0.0107105, total time[s] 0.097311 +Converged at iteration 31, L1 6.72651e-05, Linf 0.00284567, total time[s] 0.110761 +Converged at iteration 33, L1 7.7115e-05, Linf 0.00422212, total time[s] 0.108433 +Converged at iteration 32, L1 6.96955e-05, Linf 0.0105973, total time[s] 0.100253 +Converged at iteration 34, L1 3.903e-05, Linf 0.00862372, total time[s] 0.127095 +Converged at iteration 29, L1 7.56653e-05, Linf 0.0191597, total time[s] 0.079035 +Converged at iteration 25, L1 7.628e-05, Linf 0.00331988, total time[s] 0.068138 +Converged at iteration 38, L1 4.86534e-05, Linf 0.012798, total time[s] 0.096958 +Converged at iteration 36, L1 5.2905e-05, Linf 0.0118022, total time[s] 0.092117 +Converged at iteration 25, L1 6.73199e-05, Linf 0.00268059, total time[s] 0.065661 +Converged at iteration 26, L1 8.8957e-05, Linf 0.00721066, total time[s] 0.072335 +Converged at iteration 24, L1 9.81052e-05, Linf 0.0121996, total time[s] 0.067587 +Converged at iteration 27, L1 5.92059e-05, Linf 0.0167819, total time[s] 0.074145 +Converged at iteration 21, L1 6.83681e-05, Linf 0.00857903, total time[s] 0.067505 +Converged at iteration 20, L1 6.8155e-05, Linf 0.0032052, total time[s] 0.05747 +Converged at iteration 23, L1 6.7501e-05, Linf 0.00314205, total time[s] 0.066039 +Converged at iteration 25, L1 6.52446e-05, Linf 0.00232786, total time[s] 0.06713 +Converged at iteration 22, L1 5.0555e-05, Linf 0.00193474, total time[s] 0.06065 +Converged at iteration 21, L1 6.71883e-05, Linf 0.00347188, total time[s] 0.057997 +Converged at iteration 33, L1 3.76034e-05, Linf 0.00298827, total time[s] 0.085661 +Converged at iteration 23, L1 6.29439e-05, Linf 0.00429247, total time[s] 0.063028 +Converged at iteration 24, L1 7.84451e-05, Linf 0.00564583, total time[s] 0.065596 +Converged at iteration 26, L1 7.69018e-05, Linf 0.00431666, total time[s] 0.070702 +Converged at iteration 23, L1 6.62083e-05, Linf 0.00245633, total time[s] 0.064229 +Converged at iteration 23, L1 7.31444e-05, Linf 0.00187717, total time[s] 0.061875 +Converged at iteration 27, L1 7.40352e-05, Linf 0.00412944, total time[s] 0.074273 +Converged at iteration 29, L1 7.65182e-05, Linf 0.00521257, total time[s] 0.080617 +Converged at iteration 28, L1 6.68387e-05, Linf 0.0051498, total time[s] 0.074561 +Converged at iteration 32, L1 8.70275e-05, Linf 0.00601385, total time[s] 0.083233 +Converged at iteration 29, L1 6.00039e-05, Linf 0.00170598, total time[s] 0.079078 +Converged at iteration 31, L1 7.71572e-05, Linf 0.010537, total time[s] 0.080572 +Converged at iteration 31, L1 6.57696e-05, Linf 0.00285101, total time[s] 0.081284 +Converged at iteration 33, L1 7.67313e-05, Linf 0.0042369, total time[s] 0.087733 +Converged at iteration 32, L1 7.14796e-05, Linf 0.0105436, total time[s] 0.084517 +Converged at iteration 34, L1 3.9597e-05, Linf 0.00887362, total time[s] 0.092377 +Converged at iteration 29, L1 7.43642e-05, Linf 0.0195562, total time[s] 0.077806 +Converged at iteration 25, L1 7.66265e-05, Linf 0.00330288, total time[s] 0.068617 +Converged at iteration 38, L1 4.92758e-05, Linf 0.0131294, total time[s] 0.101617 +Converged at iteration 36, L1 5.35029e-05, Linf 0.0120582, total time[s] 0.093884 +Converged at iteration 25, L1 6.72143e-05, Linf 0.0026554, total time[s] 0.069856 +Converged at iteration 26, L1 9.1152e-05, Linf 0.0073922, total time[s] 0.069294 +Converged at iteration 24, L1 9.63303e-05, Linf 0.0120573, total time[s] 0.064712 +Converged at iteration 27, L1 6.06018e-05, Linf 0.0173652, total time[s] 0.071436 +Converged at iteration 21, L1 6.8742e-05, Linf 0.00858859, total time[s] 0.056859 +Converged at iteration 20, L1 6.88099e-05, Linf 0.00325758, total time[s] 0.054199 +Converged at iteration 23, L1 6.68648e-05, Linf 0.00318686, total time[s] 0.060965 +Converged at iteration 25, L1 6.55331e-05, Linf 0.00234775, total time[s] 0.06541 +Converged at iteration 22, L1 4.99505e-05, Linf 0.00195284, total time[s] 0.058741 +Converged at iteration 21, L1 6.79537e-05, Linf 0.00353421, total time[s] 0.056221 +Converged at iteration 33, L1 3.8542e-05, Linf 0.00300358, total time[s] 0.084452 +Converged at iteration 23, L1 7.67294e-05, Linf 0.00435345, total time[s] 0.061871 +Converged at iteration 24, L1 8.12614e-05, Linf 0.00567967, total time[s] 0.063738 +Converged at iteration 26, L1 7.6332e-05, Linf 0.00426986, total time[s] 0.068012 +Converged at iteration 23, L1 6.6127e-05, Linf 0.00248928, total time[s] 0.063075 +Converged at iteration 23, L1 7.12499e-05, Linf 0.00190518, total time[s] 0.060979 +Converged at iteration 27, L1 6.93334e-05, Linf 0.00416919, total time[s] 0.070496 +Converged at iteration 29, L1 8.01295e-05, Linf 0.00537335, total time[s] 0.075002 +Converged at iteration 28, L1 6.75987e-05, Linf 0.00519446, total time[s] 0.07338 +Converged at iteration 32, L1 8.6368e-05, Linf 0.00601947, total time[s] 0.086808 +Converged at iteration 29, L1 6.16607e-05, Linf 0.0017345, total time[s] 0.07566 +Converged at iteration 31, L1 7.61142e-05, Linf 0.0105145, total time[s] 0.079618 +Converged at iteration 31, L1 6.57171e-05, Linf 0.00285902, total time[s] 0.079672 +Converged at iteration 33, L1 7.70834e-05, Linf 0.0042707, total time[s] 0.090085 +Converged at iteration 32, L1 7.45263e-05, Linf 0.0108166, total time[s] 0.081938 +Converged at iteration 34, L1 4.025e-05, Linf 0.00921024, total time[s] 0.086788 +Converged at iteration 29, L1 7.28835e-05, Linf 0.0193144, total time[s] 0.075105 +Converged at iteration 25, L1 7.70749e-05, Linf 0.00328745, total time[s] 0.06651 +Converged at iteration 38, L1 4.96112e-05, Linf 0.0132661, total time[s] 0.116805 +Converged at iteration 36, L1 5.40582e-05, Linf 0.0122472, total time[s] 0.093305 +Converged at iteration 25, L1 6.68078e-05, Linf 0.00265177, total time[s] 0.066489 +Converged at iteration 26, L1 9.28211e-05, Linf 0.00751535, total time[s] 0.069114 +Converged at iteration 24, L1 9.51669e-05, Linf 0.011935, total time[s] 0.064193 +Converged at iteration 27, L1 9.19144e-05, Linf 0.0177948, total time[s] 0.071722 +Converged at iteration 21, L1 6.89343e-05, Linf 0.00860514, total time[s] 0.056128 +Converged at iteration 20, L1 7.00752e-05, Linf 0.00334734, total time[s] 0.055669 +Converged at iteration 23, L1 6.64356e-05, Linf 0.0032156, total time[s] 0.063827 +Converged at iteration 50, L1 9.09969e-05, Linf 0.000441941, total time[s] 0.138368 +Converged at iteration 22, L1 5.00808e-05, Linf 0.00195655, total time[s] 0.063245 +Converged at iteration 21, L1 6.85394e-05, Linf 0.00358127, total time[s] 0.056903 +Converged at iteration 33, L1 4.00818e-05, Linf 0.00296752, total time[s] 0.088887 +Converged at iteration 23, L1 6.45275e-05, Linf 0.00439318, total time[s] 0.062119 +Converged at iteration 24, L1 8.16362e-05, Linf 0.00570435, total time[s] 0.062928 +Converged at iteration 26, L1 7.86243e-05, Linf 0.0140329, total time[s] 0.067922 +Converged at iteration 23, L1 6.58224e-05, Linf 0.00251227, total time[s] 0.066843 +Converged at iteration 23, L1 7.06242e-05, Linf 0.00191909, total time[s] 0.061812 +Converged at iteration 27, L1 6.89654e-05, Linf 0.00418805, total time[s] 0.071091 +Converged at iteration 29, L1 8.19643e-05, Linf 0.00547417, total time[s] 0.076448 +Converged at iteration 28, L1 6.92425e-05, Linf 0.00522716, total time[s] 0.079592 +Converged at iteration 32, L1 8.62326e-05, Linf 0.00602606, total time[s] 0.11977 +Converged at iteration 29, L1 6.26685e-05, Linf 0.00175338, total time[s] 0.115195 +Converged at iteration 31, L1 7.60897e-05, Linf 0.0104587, total time[s] 0.08881 +Converged at iteration 31, L1 6.51255e-05, Linf 0.00285966, total time[s] 0.095916 +Converged at iteration 33, L1 7.70139e-05, Linf 0.00428273, total time[s] 0.093874 +Converged at iteration 32, L1 7.64622e-05, Linf 0.0110236, total time[s] 0.089204 +Converged at iteration 34, L1 4.07759e-05, Linf 0.00946863, total time[s] 0.089554 +Converged at iteration 29, L1 7.1576e-05, Linf 0.0190909, total time[s] 0.081282 +Converged at iteration 25, L1 7.75545e-05, Linf 0.00328695, total time[s] 0.065915 +Converged at iteration 38, L1 4.96049e-05, Linf 0.0132054, total time[s] 0.104439 +Converged at iteration 36, L1 5.40038e-05, Linf 0.0121546, total time[s] 0.13172 +Converged at iteration 25, L1 6.70991e-05, Linf 0.00265356, total time[s] 0.07275 +Converged at iteration 26, L1 9.19633e-05, Linf 0.00745249, total time[s] 0.085544 +Converged at iteration 24, L1 9.78898e-05, Linf 0.0119962, total time[s] 0.070113 +Converged at iteration 27, L1 6.1637e-05, Linf 0.0175702, total time[s] 0.093089 +Converged at iteration 21, L1 6.90317e-05, Linf 0.00847596, total time[s] 0.073582 +Converged at iteration 20, L1 6.93919e-05, Linf 0.00326271, total time[s] 0.09663 +Converged at iteration 23, L1 6.66605e-05, Linf 0.0032031, total time[s] 0.070898 +Converged at iteration 25, L1 6.57532e-05, Linf 0.00235905, total time[s] 0.081696 +Converged at iteration 22, L1 4.99879e-05, Linf 0.00195547, total time[s] 0.062178 +Converged at iteration 21, L1 6.84893e-05, Linf 0.00355632, total time[s] 0.062955 +Converged at iteration 33, L1 3.88492e-05, Linf 0.00293893, total time[s] 0.10365 +Converged at iteration 23, L1 6.49505e-05, Linf 0.00437292, total time[s] 0.06318 +Converged at iteration 24, L1 8.01563e-05, Linf 0.00569193, total time[s] 0.063921 +Converged at iteration 26, L1 7.70677e-05, Linf 0.00427003, total time[s] 0.07069 +Converged at iteration 23, L1 6.63892e-05, Linf 0.00249767, total time[s] 0.068428 +Converged at iteration 23, L1 7.07002e-05, Linf 0.00190405, total time[s] 0.074841 +Converged at iteration 27, L1 7.18611e-05, Linf 0.0041746, total time[s] 0.077186 +Converged at iteration 29, L1 8.11571e-05, Linf 0.00541955, total time[s] 0.099083 +Converged at iteration 28, L1 6.79213e-05, Linf 0.00520615, total time[s] 0.083791 +Converged at iteration 32, L1 8.66747e-05, Linf 0.00602144, total time[s] 0.090402 +Converged at iteration 29, L1 6.36019e-05, Linf 0.00174503, total time[s] 0.08928 +Converged at iteration 31, L1 7.64279e-05, Linf 0.0107876, total time[s] 0.091128 +Converged at iteration 31, L1 6.54434e-05, Linf 0.00285878, total time[s] 0.090414 +Converged at iteration 33, L1 7.70909e-05, Linf 0.00427664, total time[s] 0.085421 +Converged at iteration 32, L1 7.70659e-05, Linf 0.0109116, total time[s] 0.112007 +Converged at iteration 34, L1 4.09498e-05, Linf 0.00933458, total time[s] 0.121329 +Converged at iteration 29, L1 7.21511e-05, Linf 0.0192021, total time[s] 0.090045 +Converged at iteration 25, L1 7.73904e-05, Linf 0.00325346, total time[s] 0.142839 +Converged at iteration 38, L1 4.97549e-05, Linf 0.013301, total time[s] 0.454045 +Converged at iteration 36, L1 5.43803e-05, Linf 0.0122919, total time[s] 0.202085 +Converged at iteration 25, L1 6.65777e-05, Linf 0.00263807, total time[s] 0.120319 +Converged at iteration 26, L1 9.39482e-05, Linf 0.00756706, total time[s] 0.127373 +Converged at iteration 27, L1 5.93701e-05, Linf 0.0104852, total time[s] 0.369615 +Converged at iteration 27, L1 6.19494e-05, Linf 0.0177466, total time[s] 0.092404 +Converged at iteration 21, L1 6.90199e-05, Linf 0.00859477, total time[s] 0.08455 +Converged at iteration 20, L1 7.01395e-05, Linf 0.00330648, total time[s] 0.103964 +Converged at iteration 23, L1 6.72321e-05, Linf 0.00324864, total time[s] 0.095931 +Converged at iteration 25, L1 6.61033e-05, Linf 0.00236934, total time[s] 0.079404 +Converged at iteration 22, L1 4.96403e-05, Linf 0.00196439, total time[s] 0.07482 +Converged at iteration 21, L1 6.92059e-05, Linf 0.00359639, total time[s] 0.058194 +Converged at iteration 33, L1 3.9467e-05, Linf 0.00301951, total time[s] 0.087952 +Converged at iteration 23, L1 6.47816e-05, Linf 0.00440773, total time[s] 0.063594 +Converged at iteration 24, L1 8.06883e-05, Linf 0.00571276, total time[s] 0.063677 +Converged at iteration 26, L1 7.65464e-05, Linf 0.00424105, total time[s] 0.077976 +Converged at iteration 23, L1 6.55833e-05, Linf 0.00252106, total time[s] 0.06978 +Converged at iteration 23, L1 7.26654e-05, Linf 0.0019296, total time[s] 0.061294 +Converged at iteration 27, L1 6.86322e-05, Linf 0.00419929, total time[s] 0.076702 +Converged at iteration 29, L1 8.17035e-05, Linf 0.00552813, total time[s] 0.079852 +Converged at iteration 28, L1 6.83714e-05, Linf 0.00523947, total time[s] 0.073915 +Converged at iteration 32, L1 8.57837e-05, Linf 0.00602133, total time[s] 0.085776 +Converged at iteration 29, L1 6.30549e-05, Linf 0.00176288, total time[s] 0.085246 +Converged at iteration 31, L1 7.49923e-05, Linf 0.0104725, total time[s] 0.07922 +Converged at iteration 31, L1 6.49114e-05, Linf 0.00286412, total time[s] 0.082331 +Converged at iteration 33, L1 7.80631e-05, Linf 0.00429451, total time[s] 0.087998 +Converged at iteration 32, L1 7.7542e-05, Linf 0.0110851, total time[s] 0.086267 +Converged at iteration 34, L1 4.08734e-05, Linf 0.00954027, total time[s] 0.088347 +Converged at iteration 29, L1 7.4556e-05, Linf 0.0196844, total time[s] 0.124455 +Converged at iteration 25, L1 7.77676e-05, Linf 0.00328826, total time[s] 0.116331 +Converged at iteration 38, L1 4.95376e-05, Linf 0.0132539, total time[s] 0.112713 +Converged at iteration 36, L1 5.4027e-05, Linf 0.0122319, total time[s] 0.109078 +Converged at iteration 25, L1 6.68396e-05, Linf 0.00264706, total time[s] 0.070305 +Converged at iteration 26, L1 9.27322e-05, Linf 0.00750987, total time[s] 0.072983 +Converged at iteration 24, L1 9.54257e-05, Linf 0.0119521, total time[s] 0.069543 +Converged at iteration 27, L1 6.15328e-05, Linf 0.0177567, total time[s] 0.079914 +Converged at iteration 21, L1 6.88746e-05, Linf 0.00847912, total time[s] 0.064426 +Converged at iteration 20, L1 6.97477e-05, Linf 0.00330071, total time[s] 0.055951 +Converged at iteration 23, L1 6.65343e-05, Linf 0.00321854, total time[s] 0.064517 +Converged at iteration 25, L1 6.58445e-05, Linf 0.0023645, total time[s] 0.066528 +Converged at iteration 22, L1 5.00204e-05, Linf 0.00196074, total time[s] 0.070496 +Converged at iteration 21, L1 6.86576e-05, Linf 0.00357657, total time[s] 0.067799 +Converged at iteration 33, L1 3.91404e-05, Linf 0.00301521, total time[s] 0.118715 +Converged at iteration 23, L1 6.50264e-05, Linf 0.00439035, total time[s] 0.068561 +Converged at iteration 24, L1 8.06228e-05, Linf 0.00571061, total time[s] 0.098762 +Converged at iteration 26, L1 7.808e-05, Linf 0.00425727, total time[s] 0.08053 +Converged at iteration 23, L1 6.58459e-05, Linf 0.00250798, total time[s] 0.072269 +Converged at iteration 23, L1 7.15469e-05, Linf 0.00191503, total time[s] 0.072926 +Converged at iteration 27, L1 6.99453e-05, Linf 0.00419683, total time[s] 0.077118 +Converged at iteration 29, L1 8.19825e-05, Linf 0.00547046, total time[s] 0.075909 +Converged at iteration 28, L1 6.82491e-05, Linf 0.0052325, total time[s] 0.073754 +Converged at iteration 32, L1 8.65509e-05, Linf 0.00602256, total time[s] 0.09525 +Converged at iteration 29, L1 6.30766e-05, Linf 0.00174837, total time[s] 0.087526 +Converged at iteration 31, L1 7.56048e-05, Linf 0.01048, total time[s] 0.088734 +Converged at iteration 31, L1 6.51026e-05, Linf 0.00286115, total time[s] 0.082584 +Converged at iteration 33, L1 7.71057e-05, Linf 0.00428573, total time[s] 0.086206 +Converged at iteration 32, L1 7.62623e-05, Linf 0.011003, total time[s] 0.083604 +Converged at iteration 34, L1 4.07727e-05, Linf 0.00944744, total time[s] 0.088825 +Converged at iteration 29, L1 7.18006e-05, Linf 0.0191293, total time[s] 0.082966 +Converged at iteration 25, L1 7.76192e-05, Linf 0.00328728, total time[s] 0.072865 +Converged at iteration 38, L1 6.13704e-05, Linf 0.013284, total time[s] 0.135676 +Converged at iteration 36, L1 5.42463e-05, Linf 0.0122655, total time[s] 0.103518 +Converged at iteration 25, L1 6.67783e-05, Linf 0.00264471, total time[s] 0.066938 +Converged at iteration 26, L1 9.31224e-05, Linf 0.00753854, total time[s] 0.068208 +Converged at iteration 24, L1 9.49356e-05, Linf 0.0117369, total time[s] 0.063607 +Converged at iteration 27, L1 6.17135e-05, Linf 0.0178422, total time[s] 0.072296 +Converged at iteration 21, L1 6.89888e-05, Linf 0.00860144, total time[s] 0.063478 +Converged at iteration 20, L1 7.005e-05, Linf 0.003314, total time[s] 0.055177 +Converged at iteration 23, L1 6.66814e-05, Linf 0.00322389, total time[s] 0.066851 +Converged at iteration 25, L1 6.60484e-05, Linf 0.00236897, total time[s] 0.068207 +Converged at iteration 22, L1 4.98887e-05, Linf 0.00196278, total time[s] 0.068102 +Converged at iteration 21, L1 6.87241e-05, Linf 0.00358801, total time[s] 0.065327 +Converged at iteration 33, L1 3.95018e-05, Linf 0.00296324, total time[s] 0.108758 +Converged at iteration 23, L1 7.17468e-05, Linf 0.00439928, total time[s] 0.077531 +Converged at iteration 24, L1 8.25576e-05, Linf 0.0057078, total time[s] 0.094549 +Converged at iteration 26, L1 7.71666e-05, Linf 0.00425364, total time[s] 0.100044 +Converged at iteration 23, L1 6.56517e-05, Linf 0.00251595, total time[s] 0.092453 +Converged at iteration 23, L1 7.05278e-05, Linf 0.00192263, total time[s] 0.070524 +Converged at iteration 27, L1 6.8317e-05, Linf 0.00419147, total time[s] 0.087231 +Converged at iteration 29, L1 8.16137e-05, Linf 0.00551646, total time[s] 0.090005 +Converged at iteration 28, L1 6.82609e-05, Linf 0.00523334, total time[s] 0.092711 +Converged at iteration 32, L1 8.59372e-05, Linf 0.00602437, total time[s] 0.11269 +Converged at iteration 29, L1 6.28513e-05, Linf 0.00175648, total time[s] 0.11733 +Converged at iteration 31, L1 7.67234e-05, Linf 0.0104662, total time[s] 0.121002 +Converged at iteration 31, L1 6.60216e-05, Linf 0.00286186, total time[s] 0.135274 +Converged at iteration 33, L1 7.68485e-05, Linf 0.00428106, total time[s] 0.10611 +Converged at iteration 32, L1 7.98175e-05, Linf 0.0110553, total time[s] 0.15439 +Converged at iteration 34, L1 4.10302e-05, Linf 0.00950401, total time[s] 0.12934 +Converged at iteration 29, L1 7.48123e-05, Linf 0.0190697, total time[s] 0.092439 +Converged at iteration 25, L1 7.85462e-05, Linf 0.003288, total time[s] 0.083746 +Converged at iteration 38, L1 5.01834e-05, Linf 0.0133564, total time[s] 0.115988 +Converged at iteration 36, L1 5.46061e-05, Linf 0.0123814, total time[s] 0.128602 +Converged at iteration 25, L1 6.63545e-05, Linf 0.00263596, total time[s] 0.093786 +Converged at iteration 26, L1 9.44327e-05, Linf 0.00764573, total time[s] 0.079414 +Converged at iteration 24, L1 9.44492e-05, Linf 0.0118433, total time[s] 0.074735 +Converged at iteration 27, L1 6.23737e-05, Linf 0.0181191, total time[s] 0.07872 +Converged at iteration 21, L1 6.92922e-05, Linf 0.00860265, total time[s] 0.060688 +Converged at iteration 20, L1 7.06527e-05, Linf 0.00333522, total time[s] 0.05744 +Converged at iteration 23, L1 6.64328e-05, Linf 0.00325595, total time[s] 0.08161 +Converged at iteration 25, L1 6.59875e-05, Linf 0.00238289, total time[s] 0.08125 +Converged at iteration 22, L1 4.95932e-05, Linf 0.00195893, total time[s] 0.059913 +Converged at iteration 21, L1 7.00913e-05, Linf 0.00361742, total time[s] 0.08554 +Converged at iteration 33, L1 3.99271e-05, Linf 0.00302682, total time[s] 0.097713 +Converged at iteration 23, L1 6.52729e-05, Linf 0.00442261, total time[s] 0.062497 +Converged at iteration 24, L1 8.09951e-05, Linf 0.00572512, total time[s] 0.067484 +Converged at iteration 26, L1 7.7101e-05, Linf 0.00423352, total time[s] 0.069632 +Converged at iteration 23, L1 6.53955e-05, Linf 0.00254311, total time[s] 0.067588 +Converged at iteration 23, L1 7.18654e-05, Linf 0.00194054, total time[s] 0.063139 +Converged at iteration 27, L1 7.0895e-05, Linf 0.00420574, total time[s] 0.072679 +Converged at iteration 29, L1 8.23524e-05, Linf 0.00557509, total time[s] 0.075348 +Converged at iteration 28, L1 6.87324e-05, Linf 0.00525526, total time[s] 0.075471 +Converged at iteration 32, L1 8.67241e-05, Linf 0.00602311, total time[s] 0.091127 +Converged at iteration 29, L1 6.50727e-05, Linf 0.00176957, total time[s] 0.078639 +Converged at iteration 31, L1 7.46685e-05, Linf 0.0104549, total time[s] 0.08199 +Converged at iteration 31, L1 6.46084e-05, Linf 0.00286757, total time[s] 0.080856 +Converged at iteration 33, L1 7.72326e-05, Linf 0.00430114, total time[s] 0.091014 +Converged at iteration 32, L1 9.2792e-05, Linf 0.0111737, total time[s] 0.08526 +Converged at iteration 35, L1 9.78598e-05, Linf 0.0020023, total time[s] 0.099011 +Converged at iteration 29, L1 7.04933e-05, Linf 0.018741, total time[s] 0.084098 +Converged at iteration 25, L1 7.78454e-05, Linf 0.00328991, total time[s] 0.078278 +Converged at iteration 38, L1 5.02349e-05, Linf 0.013265, total time[s] 0.123228 +Converged at iteration 36, L1 5.44297e-05, Linf 0.0124385, total time[s] 0.154714 +Converged at iteration 25, L1 6.61482e-05, Linf 0.00263285, total time[s] 0.07299 +Converged at iteration 26, L1 9.48449e-05, Linf 0.00766531, total time[s] 0.067517 +Converged at iteration 24, L1 9.36652e-05, Linf 0.0118031, total time[s] 0.064302 +Converged at iteration 27, L1 6.27232e-05, Linf 0.0180726, total time[s] 0.080619 +Converged at iteration 21, L1 6.95302e-05, Linf 0.00860393, total time[s] 0.075605 +Converged at iteration 20, L1 7.10469e-05, Linf 0.00332393, total time[s] 0.062666 +Converged at iteration 23, L1 6.6313e-05, Linf 0.00326624, total time[s] 0.070235 +Converged at iteration 25, L1 6.61164e-05, Linf 0.00238055, total time[s] 0.068686 +Converged at iteration 22, L1 4.9341e-05, Linf 0.00195072, total time[s] 0.069127 +Converged at iteration 21, L1 6.91026e-05, Linf 0.00363015, total time[s] 0.07782 +Converged at iteration 33, L1 4.00132e-05, Linf 0.00302601, total time[s] 0.08746 +Converged at iteration 23, L1 6.51157e-05, Linf 0.00443613, total time[s] 0.061899 +Converged at iteration 24, L1 8.38782e-05, Linf 0.0074841, total time[s] 0.064776 +Converged at iteration 26, L1 7.78754e-05, Linf 0.00422872, total time[s] 0.071207 +Converged at iteration 23, L1 6.47953e-05, Linf 0.00253964, total time[s] 0.067498 +Converged at iteration 23, L1 7.02849e-05, Linf 0.00194353, total time[s] 0.065166 +Converged at iteration 27, L1 6.82632e-05, Linf 0.0042109, total time[s] 0.073293 +Converged at iteration 29, L1 8.29326e-05, Linf 0.0056189, total time[s] 0.075312 +Converged at iteration 28, L1 6.89427e-05, Linf 0.00526536, total time[s] 0.07432 +Converged at iteration 32, L1 8.53645e-05, Linf 0.00602614, total time[s] 0.085383 +Converged at iteration 29, L1 6.35181e-05, Linf 0.00177682, total time[s] 0.088869 +Converged at iteration 31, L1 7.48692e-05, Linf 0.0107402, total time[s] 0.102914 +Converged at iteration 31, L1 6.55394e-05, Linf 0.00287185, total time[s] 0.102713 +Converged at iteration 33, L1 7.721e-05, Linf 0.00430151, total time[s] 0.095249 +Converged at iteration 32, L1 7.87037e-05, Linf 0.0112241, total time[s] 0.088224 +Converged at iteration 34, L1 4.17963e-05, Linf 0.00974371, total time[s] 0.119174 +Converged at iteration 29, L1 7.05622e-05, Linf 0.0188694, total time[s] 0.123024 +Converged at iteration 25, L1 7.81086e-05, Linf 0.00329065, total time[s] 0.089176 +Converged at iteration 38, L1 5.01809e-05, Linf 0.013304, total time[s] 0.134746 +Converged at iteration 36, L1 5.47588e-05, Linf 0.0125019, total time[s] 0.135278 +Converged at iteration 25, L1 6.57934e-05, Linf 0.00262724, total time[s] 0.098158 +Converged at iteration 26, L1 9.55995e-05, Linf 0.00772516, total time[s] 0.089988 +Converged at iteration 24, L1 9.31587e-05, Linf 0.0117526, total time[s] 0.0899 +Converged at iteration 27, L1 6.29502e-05, Linf 0.018412, total time[s] 0.109363 +Converged at iteration 21, L1 6.97769e-05, Linf 0.00860553, total time[s] 0.060664 +Converged at iteration 20, L1 7.1336e-05, Linf 0.00335308, total time[s] 0.078198 +Converged at iteration 23, L1 6.74061e-05, Linf 0.0032815, total time[s] 0.1066 +Converged at iteration 25, L1 6.61256e-05, Linf 0.00238668, total time[s] 0.108817 +Converged at iteration 22, L1 4.91707e-05, Linf 0.00193125, total time[s] 0.07204 +Converged at iteration 21, L1 7.70708e-05, Linf 0.0151321, total time[s] 0.064525 +Converged at iteration 33, L1 5.28773e-05, Linf 0.00303529, total time[s] 0.087072 +Converged at iteration 23, L1 6.52258e-05, Linf 0.00445052, total time[s] 0.061368 +Converged at iteration 24, L1 8.12655e-05, Linf 0.00574156, total time[s] 0.06404 +Converged at iteration 26, L1 7.74257e-05, Linf 0.00421639, total time[s] 0.070499 +Converged at iteration 23, L1 6.44341e-05, Linf 0.00254986, total time[s] 0.066108 +Converged at iteration 23, L1 7.19825e-05, Linf 0.00195453, total time[s] 0.064366 +Converged at iteration 27, L1 6.89286e-05, Linf 0.0042173, total time[s] 0.071053 +Converged at iteration 29, L1 8.38725e-05, Linf 0.00565761, total time[s] 0.077191 +Converged at iteration 28, L1 6.91815e-05, Linf 0.00527957, total time[s] 0.074742 +Converged at iteration 32, L1 8.49677e-05, Linf 0.00602391, total time[s] 0.082647 +Converged at iteration 29, L1 6.4429e-05, Linf 0.00178182, total time[s] 0.076427 +Converged at iteration 31, L1 7.42194e-05, Linf 0.0104344, total time[s] 0.083971 +Converged at iteration 31, L1 6.44422e-05, Linf 0.00287385, total time[s] 0.082615 +Converged at iteration 33, L1 7.69213e-05, Linf 0.00431306, total time[s] 0.085377 +Converged at iteration 32, L1 7.9645e-05, Linf 0.0112965, total time[s] 0.083028 +Converged at iteration 34, L1 4.16383e-05, Linf 0.00983845, total time[s] 0.08799 +Converged at iteration 29, L1 6.95519e-05, Linf 0.0188257, total time[s] 0.075981 +Converged at iteration 25, L1 7.81007e-05, Linf 0.00329224, total time[s] 0.067377 +Converged at iteration 38, L1 5.03123e-05, Linf 0.0134618, total time[s] 0.098419 +Converged at iteration 36, L1 5.46683e-05, Linf 0.0125476, total time[s] 0.102683 +Converged at iteration 25, L1 6.55407e-05, Linf 0.00262484, total time[s] 0.068988 +Converged at iteration 26, L1 9.61288e-05, Linf 0.00775105, total time[s] 0.071496 +Converged at iteration 24, L1 9.25993e-05, Linf 0.011704, total time[s] 0.064911 +Converged at iteration 27, L1 6.3725e-05, Linf 0.0185413, total time[s] 0.074146 +Converged at iteration 21, L1 6.99926e-05, Linf 0.00860596, total time[s] 0.06152 +Converged at iteration 20, L1 7.17708e-05, Linf 0.0033757, total time[s] 0.085523 +Converged at iteration 23, L1 6.62939e-05, Linf 0.00329454, total time[s] 0.069536 +Converged at iteration 25, L1 6.62558e-05, Linf 0.00239003, total time[s] 0.075424 +Converged at iteration 22, L1 4.89485e-05, Linf 0.00191208, total time[s] 0.063958 +Converged at iteration 21, L1 6.95154e-05, Linf 0.00366143, total time[s] 0.061582 +Converged at iteration 33, L1 4.07944e-05, Linf 0.00297761, total time[s] 0.107933 +Converged at iteration 23, L1 6.81658e-05, Linf 0.0129646, total time[s] 0.084138 +Converged at iteration 24, L1 8.13738e-05, Linf 0.00574878, total time[s] 0.082483 +Converged at iteration 26, L1 7.73432e-05, Linf 0.00421152, total time[s] 0.090957 +Converged at iteration 23, L1 6.39812e-05, Linf 0.00255767, total time[s] 0.069263 +Converged at iteration 23, L1 7.02308e-05, Linf 0.00195991, total time[s] 0.063478 +Converged at iteration 27, L1 6.77499e-05, Linf 0.00421886, total time[s] 0.09297 +Converged at iteration 29, L1 8.51719e-05, Linf 0.0056979, total time[s] 0.088827 +Converged at iteration 28, L1 6.94727e-05, Linf 0.00531586, total time[s] 0.08998 +Converged at iteration 32, L1 8.53677e-05, Linf 0.00602769, total time[s] 0.086673 +Converged at iteration 29, L1 6.56695e-05, Linf 0.00179489, total time[s] 0.080472 +Converged at iteration 31, L1 7.62065e-05, Linf 0.0104203, total time[s] 0.08929 +Converged at iteration 31, L1 6.54924e-05, Linf 0.00287532, total time[s] 0.085646 +Converged at iteration 33, L1 7.75684e-05, Linf 0.00432354, total time[s] 0.097073 +Converged at iteration 32, L1 7.99636e-05, Linf 0.0114492, total time[s] 0.087923 +Converged at iteration 34, L1 5.13427e-05, Linf 0.0113674, total time[s] 0.103965 +Converged at iteration 29, L1 7.06884e-05, Linf 0.0181558, total time[s] 0.085484 +Converged at iteration 25, L1 8.00117e-05, Linf 0.00332956, total time[s] 0.097132 +Converged at iteration 38, L1 5.13345e-05, Linf 0.0135052, total time[s] 0.098194 +Converged at iteration 38, L1 9.64114e-05, Linf 0.00236734, total time[s] 0.113933 +Converged at iteration 25, L1 6.5163e-05, Linf 0.00261566, total time[s] 0.093867 +Converged at iteration 26, L1 9.75987e-05, Linf 0.00781999, total time[s] 0.068472 +Converged at iteration 24, L1 9.32093e-05, Linf 0.011646, total time[s] 0.063838 +Converged at iteration 27, L1 6.51802e-05, Linf 0.018752, total time[s] 0.071036 +Converged at iteration 21, L1 7.05351e-05, Linf 0.00891129, total time[s] 0.058583 +Converged at iteration 20, L1 7.30889e-05, Linf 0.0033923, total time[s] 0.060558 +Converged at iteration 23, L1 6.59168e-05, Linf 0.00331391, total time[s] 0.095807 +Converged at iteration 25, L1 6.6335e-05, Linf 0.00239349, total time[s] 0.111674 +Converged at iteration 22, L1 4.87979e-05, Linf 0.0018724, total time[s] 0.07402 +Converged at iteration 21, L1 6.98193e-05, Linf 0.00368392, total time[s] 0.072082 +Converged at iteration 33, L1 4.1212e-05, Linf 0.00306864, total time[s] 0.108635 +Converged at iteration 23, L1 6.63177e-05, Linf 0.00448247, total time[s] 0.074618 +Converged at iteration 24, L1 8.17238e-05, Linf 0.00576164, total time[s] 0.071135 +Converged at iteration 26, L1 7.73476e-05, Linf 0.00419241, total time[s] 0.079726 +Converged at iteration 23, L1 6.36043e-05, Linf 0.00257171, total time[s] 0.06883 +Converged at iteration 23, L1 7.03004e-05, Linf 0.00197423, total time[s] 0.073113 +Converged at iteration 27, L1 6.8898e-05, Linf 0.00423062, total time[s] 0.081034 +Converged at iteration 29, L1 8.64776e-05, Linf 0.00575447, total time[s] 0.079126 +Converged at iteration 28, L1 6.94691e-05, Linf 0.00530968, total time[s] 0.079158 +Converged at iteration 32, L1 8.51646e-05, Linf 0.00602475, total time[s] 0.091698 +Converged at iteration 29, L1 6.4983e-05, Linf 0.00179742, total time[s] 0.086222 +Converged at iteration 31, L1 7.34959e-05, Linf 0.0104084, total time[s] 0.103771 +Converged at iteration 31, L1 6.45197e-05, Linf 0.0028827, total time[s] 0.081374 +Converged at iteration 33, L1 7.76948e-05, Linf 0.00431976, total time[s] 0.084724 +Converged at iteration 32, L1 8.18661e-05, Linf 0.0114609, total time[s] 0.082797 +Converged at iteration 34, L1 4.21888e-05, Linf 0.0100655, total time[s] 0.086075 +Converged at iteration 29, L1 6.84782e-05, Linf 0.0192258, total time[s] 0.075079 +Converged at iteration 25, L1 7.82631e-05, Linf 0.00329776, total time[s] 0.067912 +Converged at iteration 38, L1 5.93663e-05, Linf 0.0135649, total time[s] 0.129137 +Converged at iteration 36, L1 5.5205e-05, Linf 0.0129819, total time[s] 0.122007 +Converged at iteration 25, L1 6.50001e-05, Linf 0.00261432, total time[s] 0.06924 +Converged at iteration 26, L1 9.77791e-05, Linf 0.00789012, total time[s] 0.081417 +Converged at iteration 24, L1 9.17205e-05, Linf 0.0117794, total time[s] 0.081764 +Converged at iteration 27, L1 6.44292e-05, Linf 0.0195048, total time[s] 0.069633 +Converged at iteration 21, L1 7.05864e-05, Linf 0.00890284, total time[s] 0.057443 +Converged at iteration 20, L1 7.4593e-05, Linf 0.00340855, total time[s] 0.054872 +Converged at iteration 23, L1 6.62996e-05, Linf 0.00332848, total time[s] 0.060379 +Converged at iteration 25, L1 6.63198e-05, Linf 0.00239866, total time[s] 0.069982 +Converged at iteration 22, L1 4.86398e-05, Linf 0.00185045, total time[s] 0.059698 +Converged at iteration 21, L1 6.99834e-05, Linf 0.00369883, total time[s] 0.056011 +Converged at iteration 33, L1 4.1194e-05, Linf 0.00304566, total time[s] 0.084602 +Converged at iteration 23, L1 6.58307e-05, Linf 0.00449494, total time[s] 0.060575 +Converged at iteration 24, L1 8.18367e-05, Linf 0.00577135, total time[s] 0.063866 +Converged at iteration 26, L1 7.75873e-05, Linf 0.00418736, total time[s] 0.067484 +Converged at iteration 23, L1 6.34038e-05, Linf 0.00256246, total time[s] 0.060542 +Converged at iteration 23, L1 7.02002e-05, Linf 0.00198, total time[s] 0.062999 +Converged at iteration 27, L1 6.75609e-05, Linf 0.00424541, total time[s] 0.07037 +Converged at iteration 29, L1 8.80414e-05, Linf 0.00580402, total time[s] 0.074695 +Converged at iteration 28, L1 6.97103e-05, Linf 0.00532217, total time[s] 0.072968 +Converged at iteration 32, L1 8.46061e-05, Linf 0.00602797, total time[s] 0.081426 +Converged at iteration 29, L1 6.53948e-05, Linf 0.00179923, total time[s] 0.075902 +Converged at iteration 31, L1 7.31866e-05, Linf 0.0103839, total time[s] 0.079223 +Converged at iteration 31, L1 6.45019e-05, Linf 0.00288618, total time[s] 0.09008 +Converged at iteration 33, L1 7.69616e-05, Linf 0.00433251, total time[s] 0.086388 +Converged at iteration 32, L1 8.21611e-05, Linf 0.0115278, total time[s] 0.084426 +Converged at iteration 34, L1 4.24521e-05, Linf 0.0106217, total time[s] 0.088899 +Converged at iteration 29, L1 6.87706e-05, Linf 0.0189335, total time[s] 0.077017 +Converged at iteration 25, L1 7.83049e-05, Linf 0.00330043, total time[s] 0.088263 +Converged at iteration 40, L1 6.7148e-05, Linf 0.0036747, total time[s] 0.109694 +Converged at iteration 35, L1 7.68247e-05, Linf 0.00339755, total time[s] 0.10202 +Converged at iteration 30, L1 9.64398e-05, Linf 0.00432621, total time[s] 0.102849 +Converged at iteration 31, L1 6.27931e-05, Linf 0.00502563, total time[s] 0.117639 +Converged at iteration 27, L1 6.27654e-05, Linf 0.00499561, total time[s] 0.076494 +Converged at iteration 22, L1 8.59084e-05, Linf 0.00449009, total time[s] 0.096068 +Converged at iteration 20, L1 9.636e-05, Linf 0.00397933, total time[s] 0.080433 +Converged at iteration 24, L1 8.84152e-05, Linf 0.00482812, total time[s] 0.082596 +Converged at iteration 28, L1 7.39125e-05, Linf 0.00445909, total time[s] 0.090126 +Converged at iteration 26, L1 8.162e-05, Linf 0.00557619, total time[s] 0.086533 +Converged at iteration 22, L1 7.45988e-05, Linf 0.0050869, total time[s] 0.076701 +Converged at iteration 19, L1 6.65655e-05, Linf 0.00393048, total time[s] 0.069058 +Converged at iteration 30, L1 7.98733e-05, Linf 0.00329675, total time[s] 0.099364 +Converged at iteration 20, L1 8.45088e-05, Linf 0.00455453, total time[s] 0.086691 +Converged at iteration 24, L1 7.09816e-05, Linf 0.00463735, total time[s] 0.085233 +Converged at iteration 31, L1 8.96981e-05, Linf 0.00569112, total time[s] 0.088884 +Converged at iteration 27, L1 9.9162e-05, Linf 0.00569817, total time[s] 0.092282 +Converged at iteration 24, L1 8.79028e-05, Linf 0.00465014, total time[s] 0.069234 +Converged at iteration 23, L1 9.23215e-05, Linf 0.00410192, total time[s] 0.06605 +Converged at iteration 26, L1 7.24871e-05, Linf 0.00446119, total time[s] 0.071132 +Converged at iteration 29, L1 7.82999e-05, Linf 0.00480156, total time[s] 0.091122 +Converged at iteration 34, L1 7.06998e-05, Linf 0.0041211, total time[s] 0.120527 +Converged at iteration 30, L1 9.37012e-05, Linf 0.00442623, total time[s] 0.097206 +Converged at iteration 28, L1 9.51913e-05, Linf 0.00310979, total time[s] 0.088652 +Converged at iteration 32, L1 9.39542e-05, Linf 0.00374075, total time[s] 0.088329 +Converged at iteration 37, L1 7.34053e-05, Linf 0.0032788, total time[s] 0.116334 +Converged at iteration 33, L1 8.44934e-05, Linf 0.00469106, total time[s] 0.111086 +Converged at iteration 28, L1 9.65454e-05, Linf 0.00430198, total time[s] 0.085844 +Converged at iteration 24, L1 8.82852e-05, Linf 0.00325071, total time[s] 0.064822 +Converged at iteration 26, L1 8.98643e-05, Linf 0.00383949, total time[s] 0.093097 +Converged at iteration 40, L1 6.74789e-05, Linf 0.00390187, total time[s] 0.123161 +Converged at iteration 35, L1 8.67823e-05, Linf 0.00360727, total time[s] 0.098236 +Converged at iteration 30, L1 9.17101e-05, Linf 0.00418051, total time[s] 0.128468 +Converged at iteration 31, L1 6.34126e-05, Linf 0.00502317, total time[s] 0.149127 +Converged at iteration 26, L1 9.84918e-05, Linf 0.00577623, total time[s] 0.088541 +Converged at iteration 22, L1 7.16238e-05, Linf 0.0041395, total time[s] 0.094882 +Converged at iteration 21, L1 6.43099e-05, Linf 0.00350015, total time[s] 0.077179 +Converged at iteration 24, L1 8.93931e-05, Linf 0.00495016, total time[s] 0.087931 +Converged at iteration 28, L1 7.32204e-05, Linf 0.00442604, total time[s] 0.087457 +Converged at iteration 26, L1 8.01731e-05, Linf 0.00533327, total time[s] 0.105201 +Converged at iteration 22, L1 7.03234e-05, Linf 0.00441491, total time[s] 0.084603 +Converged at iteration 19, L1 5.49237e-05, Linf 0.0032725, total time[s] 0.076225 +Converged at iteration 30, L1 9.53215e-05, Linf 0.00334372, total time[s] 0.109106 +Converged at iteration 20, L1 8.42524e-05, Linf 0.00472687, total time[s] 0.063443 +Converged at iteration 24, L1 7.12292e-05, Linf 0.00475228, total time[s] 0.076225 +Converged at iteration 31, L1 9.41886e-05, Linf 0.00481987, total time[s] 0.098516 +Converged at iteration 27, L1 9.41209e-05, Linf 0.00468422, total time[s] 0.087945 +Converged at iteration 24, L1 8.51841e-05, Linf 0.00428114, total time[s] 0.063279 +Converged at iteration 23, L1 9.24125e-05, Linf 0.00432074, total time[s] 0.062948 +Converged at iteration 26, L1 7.13098e-05, Linf 0.00465385, total time[s] 0.068457 +Converged at iteration 29, L1 7.52431e-05, Linf 0.00488639, total time[s] 0.074135 +Converged at iteration 34, L1 8.13866e-05, Linf 0.00406122, total time[s] 0.086542 +Converged at iteration 31, L1 7.17597e-05, Linf 0.0035533, total time[s] 0.081995 +Converged at iteration 29, L1 7.03394e-05, Linf 0.00272417, total time[s] 0.075081 +Converged at iteration 32, L1 8.29324e-05, Linf 0.00354817, total time[s] 0.096225 +Converged at iteration 36, L1 8.71774e-05, Linf 0.00357622, total time[s] 0.107841 +Converged at iteration 33, L1 8.33191e-05, Linf 0.00479802, total time[s] 0.101281 +Converged at iteration 28, L1 9.11863e-05, Linf 0.00413216, total time[s] 0.090248 +Converged at iteration 24, L1 8.02963e-05, Linf 0.00293975, total time[s] 0.094657 +Converged at iteration 26, L1 8.40891e-05, Linf 0.00390092, total time[s] 0.075405 +Converged at iteration 40, L1 6.49376e-05, Linf 0.00418845, total time[s] 0.102504 +Converged at iteration 35, L1 9.62063e-05, Linf 0.00385603, total time[s] 0.12418 +Converged at iteration 30, L1 7.69255e-05, Linf 0.00420868, total time[s] 0.091189 +Converged at iteration 31, L1 6.25616e-05, Linf 0.00509346, total time[s] 0.081816 +Converged at iteration 26, L1 9.11166e-05, Linf 0.0056899, total time[s] 0.068502 +Converged at iteration 21, L1 9.60369e-05, Linf 0.00461374, total time[s] 0.056563 +Converged at iteration 21, L1 6.92896e-05, Linf 0.00393371, total time[s] 0.05933 +Converged at iteration 24, L1 8.2974e-05, Linf 0.00519798, total time[s] 0.064914 +Converged at iteration 28, L1 6.81797e-05, Linf 0.00441196, total time[s] 0.073786 +Converged at iteration 26, L1 8.20672e-05, Linf 0.00433697, total time[s] 0.068133 +Converged at iteration 21, L1 8.59653e-05, Linf 0.00434184, total time[s] 0.057609 +Converged at iteration 18, L1 7.36168e-05, Linf 0.00298992, total time[s] 0.051681 +Converged at iteration 31, L1 7.4922e-05, Linf 0.00268279, total time[s] 0.081882 +Converged at iteration 20, L1 8.18337e-05, Linf 0.00487155, total time[s] 0.05375 +Converged at iteration 24, L1 6.89344e-05, Linf 0.00519384, total time[s] 0.070973 +Converged at iteration 30, L1 9.41715e-05, Linf 0.00343158, total time[s] 0.09128 +Converged at iteration 25, L1 9.01404e-05, Linf 0.00470591, total time[s] 0.065153 +Converged at iteration 23, L1 8.36066e-05, Linf 0.00396763, total time[s] 0.06126 +Converged at iteration 23, L1 9.32196e-05, Linf 0.00443803, total time[s] 0.061842 +Converged at iteration 26, L1 6.88918e-05, Linf 0.00492262, total time[s] 0.067813 +Converged at iteration 29, L1 7.12703e-05, Linf 0.00490101, total time[s] 0.077826 +Converged at iteration 32, L1 8.57623e-05, Linf 0.00348659, total time[s] 0.086264 +Converged at iteration 31, L1 7.25376e-05, Linf 0.003048, total time[s] 0.084194 +Converged at iteration 29, L1 7.73738e-05, Linf 0.00291455, total time[s] 0.076796 +Converged at iteration 32, L1 7.57214e-05, Linf 0.00337467, total time[s] 0.081904 +Converged at iteration 35, L1 9.79359e-05, Linf 0.00407303, total time[s] 0.088845 +Converged at iteration 33, L1 8.0648e-05, Linf 0.00505943, total time[s] 0.084145 +Converged at iteration 28, L1 8.42741e-05, Linf 0.00398747, total time[s] 0.073237 +Converged at iteration 24, L1 7.8052e-05, Linf 0.0025685, total time[s] 0.063881 +Converged at iteration 26, L1 8.36605e-05, Linf 0.00404204, total time[s] 0.068992 +Converged at iteration 39, L1 9.34403e-05, Linf 0.00543253, total time[s] 0.098376 +Converged at iteration 36, L1 7.23021e-05, Linf 0.00383794, total time[s] 0.093232 +Converged at iteration 27, L1 5.17772e-05, Linf 0.00565826, total time[s] 0.072314 +Converged at iteration 31, L1 6.04815e-05, Linf 0.00508914, total time[s] 0.087863 +Converged at iteration 26, L1 7.63385e-05, Linf 0.00538576, total time[s] 0.07254 +Converged at iteration 21, L1 7.2141e-05, Linf 0.00380752, total time[s] 0.062936 +Converged at iteration 20, L1 6.89326e-05, Linf 0.00502767, total time[s] 0.057803 +Converged at iteration 22, L1 7.56031e-05, Linf 0.00745696, total time[s] 0.059358 +Converged at iteration 26, L1 9.73076e-05, Linf 0.00653623, total time[s] 0.073739 +Converged at iteration 25, L1 7.4464e-05, Linf 0.00415085, total time[s] 0.073605 +Converged at iteration 20, L1 8.84167e-05, Linf 0.00555825, total time[s] 0.054496 +Converged at iteration 17, L1 8.5247e-05, Linf 0.00400212, total time[s] 0.049061 +Converged at iteration 31, L1 9.13871e-05, Linf 0.00279815, total time[s] 0.093793 +Converged at iteration 20, L1 6.64125e-05, Linf 0.0053928, total time[s] 0.055303 +Converged at iteration 24, L1 6.20891e-05, Linf 0.00553238, total time[s] 0.067621 +Converged at iteration 28, L1 7.07511e-05, Linf 0.00373893, total time[s] 0.082969 +Converged at iteration 23, L1 9.56729e-05, Linf 0.00710216, total time[s] 0.063389 +Converged at iteration 21, L1 9.30094e-05, Linf 0.00485134, total time[s] 0.062138 +Converged at iteration 23, L1 7.86496e-05, Linf 0.00414972, total time[s] 0.060301 +Converged at iteration 25, L1 9.94341e-05, Linf 0.00625577, total time[s] 0.065109 +Converged at iteration 28, L1 9.82356e-05, Linf 0.00578729, total time[s] 0.071525 +Converged at iteration 30, L1 6.86369e-05, Linf 0.00489498, total time[s] 0.075835 +Converged at iteration 28, L1 8.30445e-05, Linf 0.00353552, total time[s] 0.074341 +Converged at iteration 29, L1 8.83982e-05, Linf 0.00330547, total time[s] 0.079301 +Converged at iteration 31, L1 7.01912e-05, Linf 0.00290721, total time[s] 0.084971 +Converged at iteration 31, L1 9.21365e-05, Linf 0.00461287, total time[s] 0.084944 +Converged at iteration 33, L1 7.43196e-05, Linf 0.00530713, total time[s] 0.094387 +Converged at iteration 28, L1 7.03687e-05, Linf 0.00368895, total time[s] 0.072532 +Converged at iteration 24, L1 8.80694e-05, Linf 0.00186805, total time[s] 0.063186 +Converged at iteration 25, L1 6.96391e-05, Linf 0.00422592, total time[s] 0.067185 +Converged at iteration 39, L1 7.79572e-05, Linf 0.00652589, total time[s] 0.099004 +Converged at iteration 36, L1 7.37629e-05, Linf 0.0052718, total time[s] 0.098649 +Converged at iteration 24, L1 7.50907e-05, Linf 0.00411522, total time[s] 0.070506 +Converged at iteration 31, L1 5.85251e-05, Linf 0.00506577, total time[s] 0.081972 +Converged at iteration 25, L1 8.67342e-05, Linf 0.00579217, total time[s] 0.066385 +Converged at iteration 20, L1 9.22961e-05, Linf 0.00380209, total time[s] 0.058586 +Converged at iteration 19, L1 6.6586e-05, Linf 0.0043306, total time[s] 0.052266 +Converged at iteration 20, L1 9.15577e-05, Linf 0.00662354, total time[s] 0.054868 +Converged at iteration 24, L1 7.93999e-05, Linf 0.00498828, total time[s] 0.067609 +Converged at iteration 24, L1 7.67495e-05, Linf 0.00492015, total time[s] 0.064623 +Converged at iteration 20, L1 6.08782e-05, Linf 0.00519212, total time[s] 0.054078 +Converged at iteration 17, L1 5.19492e-05, Linf 0.00242838, total time[s] 0.047467 +Converged at iteration 32, L1 6.90186e-05, Linf 0.00253753, total time[s] 0.082366 +Converged at iteration 19, L1 9.35075e-05, Linf 0.00706827, total time[s] 0.05082 +Converged at iteration 23, L1 7.79853e-05, Linf 0.00710088, total time[s] 0.060727 +Converged at iteration 26, L1 8.14197e-05, Linf 0.00603227, total time[s] 0.068085 +Converged at iteration 23, L1 5.80509e-05, Linf 0.00603984, total time[s] 0.060814 +Converged at iteration 20, L1 8.31032e-05, Linf 0.00552754, total time[s] 0.052085 +Converged at iteration 22, L1 9.95618e-05, Linf 0.00479505, total time[s] 0.059656 +Converged at iteration 25, L1 8.48071e-05, Linf 0.00439993, total time[s] 0.066302 +Converged at iteration 28, L1 7.8193e-05, Linf 0.00360962, total time[s] 0.073774 +Converged at iteration 29, L1 7.48415e-05, Linf 0.00611951, total time[s] 0.075481 +Converged at iteration 27, L1 7.34801e-05, Linf 0.00401973, total time[s] 0.069589 +Converged at iteration 29, L1 7.69644e-05, Linf 0.00380291, total time[s] 0.074669 +Converged at iteration 29, L1 9.30783e-05, Linf 0.00277245, total time[s] 0.074257 +Converged at iteration 28, L1 8.43235e-05, Linf 0.00273845, total time[s] 0.071628 +Converged at iteration 33, L1 6.22804e-05, Linf 0.00585219, total time[s] 0.084215 +Converged at iteration 27, L1 7.07308e-05, Linf 0.00334457, total time[s] 0.070352 +Converged at iteration 24, L1 9.67908e-05, Linf 0.00239079, total time[s] 0.063044 +Converged at iteration 23, L1 7.67795e-05, Linf 0.00333647, total time[s] 0.059287 +Converged at iteration 39, L1 7.46155e-05, Linf 0.0066106, total time[s] 0.09959 +Converged at iteration 36, L1 7.26835e-05, Linf 0.00533567, total time[s] 0.137695 +Converged at iteration 24, L1 7.445e-05, Linf 0.00388135, total time[s] 0.062521 +Converged at iteration 31, L1 5.89531e-05, Linf 0.00828632, total time[s] 0.076602 +Converged at iteration 25, L1 8.86898e-05, Linf 0.00641376, total time[s] 0.06262 +Converged at iteration 20, L1 9.44001e-05, Linf 0.00386676, total time[s] 0.052516 +Converged at iteration 19, L1 6.46489e-05, Linf 0.00438249, total time[s] 0.04958 +Converged at iteration 20, L1 9.02227e-05, Linf 0.00655195, total time[s] 0.052215 +Converged at iteration 24, L1 7.67183e-05, Linf 0.00456736, total time[s] 0.061418 +Converged at iteration 24, L1 7.89947e-05, Linf 0.00498601, total time[s] 0.061519 +Converged at iteration 20, L1 6.11856e-05, Linf 0.00508229, total time[s] 0.05249 +Converged at iteration 16, L1 9.93792e-05, Linf 0.004572, total time[s] 0.043474 +Converged at iteration 32, L1 6.9032e-05, Linf 0.00257312, total time[s] 0.085684 +Converged at iteration 19, L1 9.37188e-05, Linf 0.00697185, total time[s] 0.053593 +Converged at iteration 23, L1 7.74217e-05, Linf 0.00702792, total time[s] 0.070369 +Converged at iteration 26, L1 8.02917e-05, Linf 0.00593946, total time[s] 0.071365 +Converged at iteration 23, L1 5.71265e-05, Linf 0.00598756, total time[s] 0.068078 +Converged at iteration 20, L1 8.26356e-05, Linf 0.00551196, total time[s] 0.055035 +Converged at iteration 23, L1 6.37847e-05, Linf 0.00295572, total time[s] 0.060103 +Converged at iteration 25, L1 8.37796e-05, Linf 0.00419813, total time[s] 0.066966 +Converged at iteration 28, L1 7.77032e-05, Linf 0.00351761, total time[s] 0.077215 +Converged at iteration 29, L1 7.50884e-05, Linf 0.0061243, total time[s] 0.07704 +Converged at iteration 27, L1 7.36866e-05, Linf 0.00399132, total time[s] 0.069838 +Converged at iteration 29, L1 7.81265e-05, Linf 0.00382053, total time[s] 0.077083 +Converged at iteration 29, L1 9.27124e-05, Linf 0.00277462, total time[s] 0.08415 +Converged at iteration 28, L1 8.32352e-05, Linf 0.00266488, total time[s] 0.072495 +Converged at iteration 33, L1 6.01578e-05, Linf 0.0058575, total time[s] 0.082322 +Converged at iteration 27, L1 6.98173e-05, Linf 0.00342988, total time[s] 0.069081 +Converged at iteration 24, L1 9.91964e-05, Linf 0.00243599, total time[s] 0.062086 +Converged at iteration 23, L1 7.55184e-05, Linf 0.00324383, total time[s] 0.062802 +Converged at iteration 39, L1 7.28852e-05, Linf 0.00662663, total time[s] 0.104444 +Converged at iteration 36, L1 7.1245e-05, Linf 0.00539781, total time[s] 0.096054 +Converged at iteration 24, L1 7.41116e-05, Linf 0.00367595, total time[s] 0.062871 +Converged at iteration 31, L1 5.58909e-05, Linf 0.0050451, total time[s] 0.077868 +Converged at iteration 25, L1 8.88209e-05, Linf 0.0059944, total time[s] 0.064492 +Converged at iteration 20, L1 9.92931e-05, Linf 0.00391948, total time[s] 0.121392 +Converged at iteration 19, L1 6.22565e-05, Linf 0.00422887, total time[s] 0.053768 +Converged at iteration 20, L1 8.83596e-05, Linf 0.00608314, total time[s] 0.054811 +Converged at iteration 24, L1 7.43259e-05, Linf 0.00425148, total time[s] 0.062678 +Converged at iteration 24, L1 7.88541e-05, Linf 0.00506564, total time[s] 0.063087 +Converged at iteration 20, L1 6.23345e-05, Linf 0.00517423, total time[s] 0.054262 +Converged at iteration 16, L1 9.78678e-05, Linf 0.00485262, total time[s] 0.047044 +Converged at iteration 32, L1 6.8771e-05, Linf 0.002599, total time[s] 0.083776 +Converged at iteration 19, L1 9.3954e-05, Linf 0.00676354, total time[s] 0.051457 +Converged at iteration 23, L1 7.71927e-05, Linf 0.00694536, total time[s] 0.069952 +Converged at iteration 26, L1 7.97715e-05, Linf 0.00593259, total time[s] 0.0695 +Converged at iteration 23, L1 5.6906e-05, Linf 0.0059908, total time[s] 0.061181 +Converged at iteration 20, L1 8.37766e-05, Linf 0.00551405, total time[s] 0.058507 +Converged at iteration 23, L1 6.51831e-05, Linf 0.00280398, total time[s] 0.060541 +Converged at iteration 25, L1 8.34497e-05, Linf 0.00423902, total time[s] 0.064758 +Converged at iteration 28, L1 7.70976e-05, Linf 0.00354631, total time[s] 0.073194 +Converged at iteration 29, L1 7.5981e-05, Linf 0.00618507, total time[s] 0.074318 +Converged at iteration 27, L1 7.51856e-05, Linf 0.00397816, total time[s] 0.073378 +Converged at iteration 29, L1 7.94985e-05, Linf 0.00387117, total time[s] 0.074191 +Converged at iteration 29, L1 9.27185e-05, Linf 0.00278086, total time[s] 0.075254 +Converged at iteration 28, L1 8.3351e-05, Linf 0.00260709, total time[s] 0.07236 +Converged at iteration 33, L1 5.84668e-05, Linf 0.00585344, total time[s] 0.083002 +Converged at iteration 27, L1 7.10953e-05, Linf 0.00353898, total time[s] 0.069145 +Converged at iteration 25, L1 7.14355e-05, Linf 0.00193576, total time[s] 0.064531 +Converged at iteration 23, L1 7.46211e-05, Linf 0.00318095, total time[s] 0.060928 +Converged at iteration 39, L1 7.3274e-05, Linf 0.00661967, total time[s] 0.102907 +Converged at iteration 36, L1 6.92826e-05, Linf 0.00545906, total time[s] 0.095569 +Converged at iteration 24, L1 7.34727e-05, Linf 0.00336022, total time[s] 0.063242 +Converged at iteration 31, L1 5.55852e-05, Linf 0.00499871, total time[s] 0.079926 +Converged at iteration 25, L1 9.28997e-05, Linf 0.00625215, total time[s] 0.065965 +Converged at iteration 21, L1 5.97845e-05, Linf 0.00343176, total time[s] 0.057568 +Converged at iteration 19, L1 6.01013e-05, Linf 0.00410568, total time[s] 0.070788 +Converged at iteration 20, L1 8.61603e-05, Linf 0.00645492, total time[s] 0.065539 +Converged at iteration 24, L1 7.18637e-05, Linf 0.00445388, total time[s] 0.077184 +Converged at iteration 24, L1 8.05844e-05, Linf 0.0051989, total time[s] 0.078881 +Converged at iteration 20, L1 6.48927e-05, Linf 0.0054985, total time[s] 0.059938 +Converged at iteration 16, L1 9.73847e-05, Linf 0.00505259, total time[s] 0.05416 +Converged at iteration 32, L1 6.79059e-05, Linf 0.00262324, total time[s] 0.119578 +Converged at iteration 19, L1 9.43005e-05, Linf 0.00674311, total time[s] 0.072922 +Converged at iteration 23, L1 7.76436e-05, Linf 0.00683394, total time[s] 0.071216 +Converged at iteration 26, L1 8.01778e-05, Linf 0.00589311, total time[s] 0.090006 +Converged at iteration 23, L1 5.64062e-05, Linf 0.00596925, total time[s] 0.091517 +Converged at iteration 20, L1 8.5234e-05, Linf 0.00551679, total time[s] 0.071039 +Converged at iteration 23, L1 6.73579e-05, Linf 0.00278451, total time[s] 0.079861 +Converged at iteration 25, L1 8.39595e-05, Linf 0.00390405, total time[s] 0.072986 +Converged at iteration 28, L1 7.78333e-05, Linf 0.00378675, total time[s] 0.085428 +Converged at iteration 29, L1 7.73985e-05, Linf 0.00624075, total time[s] 0.078762 +Converged at iteration 27, L1 7.69313e-05, Linf 0.00395502, total time[s] 0.071029 +Converged at iteration 29, L1 8.10138e-05, Linf 0.00392853, total time[s] 0.077719 +Converged at iteration 29, L1 9.28392e-05, Linf 0.00278312, total time[s] 0.074138 +Converged at iteration 28, L1 8.05695e-05, Linf 0.00254224, total time[s] 0.073781 +Converged at iteration 32, L1 9.9158e-05, Linf 0.00696446, total time[s] 0.08737 +Converged at iteration 27, L1 7.17868e-05, Linf 0.00375295, total time[s] 0.07298 +Converged at iteration 25, L1 7.17233e-05, Linf 0.00198861, total time[s] 0.074281 +Converged at iteration 23, L1 7.45231e-05, Linf 0.00310259, total time[s] 0.062253 +Converged at iteration 39, L1 6.979e-05, Linf 0.00660619, total time[s] 0.10793 +Converged at iteration 36, L1 6.68075e-05, Linf 0.00545447, total time[s] 0.118038 +Converged at iteration 24, L1 7.26399e-05, Linf 0.00309785, total time[s] 0.071083 +Converged at iteration 30, L1 9.67042e-05, Linf 0.00610873, total time[s] 0.08486 +Converged at iteration 25, L1 9.80852e-05, Linf 0.0066198, total time[s] 0.068327 +Converged at iteration 21, L1 6.40965e-05, Linf 0.00333754, total time[s] 0.060143 +Converged at iteration 19, L1 5.88159e-05, Linf 0.00389241, total time[s] 0.068674 +Converged at iteration 20, L1 8.32455e-05, Linf 0.0061718, total time[s] 0.054269 +Converged at iteration 24, L1 6.89682e-05, Linf 0.00350349, total time[s] 0.064533 +Converged at iteration 24, L1 8.449e-05, Linf 0.0053896, total time[s] 0.062705 +Converged at iteration 20, L1 6.92016e-05, Linf 0.00568716, total time[s] 0.057206 +Converged at iteration 16, L1 9.71914e-05, Linf 0.00535744, total time[s] 0.052634 +Converged at iteration 32, L1 6.58487e-05, Linf 0.00264454, total time[s] 0.08201 +Converged at iteration 19, L1 9.44994e-05, Linf 0.00658279, total time[s] 0.055107 +Converged at iteration 23, L1 7.68618e-05, Linf 0.00667375, total time[s] 0.062508 +Converged at iteration 26, L1 8.06318e-05, Linf 0.00585981, total time[s] 0.06713 +Converged at iteration 23, L1 5.5905e-05, Linf 0.00596876, total time[s] 0.061042 +Converged at iteration 20, L1 8.87936e-05, Linf 0.00553084, total time[s] 0.053391 +Converged at iteration 23, L1 6.97152e-05, Linf 0.0027245, total time[s] 0.062663 +Converged at iteration 25, L1 8.48824e-05, Linf 0.00380141, total time[s] 0.068006 +Converged at iteration 28, L1 7.93307e-05, Linf 0.00392205, total time[s] 0.080382 +Converged at iteration 29, L1 7.95407e-05, Linf 0.00630973, total time[s] 0.075733 +Converged at iteration 27, L1 7.94042e-05, Linf 0.00393037, total time[s] 0.070472 +Converged at iteration 29, L1 8.28243e-05, Linf 0.00399822, total time[s] 0.075915 +Converged at iteration 29, L1 9.34338e-05, Linf 0.00277568, total time[s] 0.088099 +Converged at iteration 28, L1 8.00072e-05, Linf 0.00248123, total time[s] 0.081948 +Converged at iteration 32, L1 9.64309e-05, Linf 0.00693545, total time[s] 0.093594 +Converged at iteration 27, L1 7.58779e-05, Linf 0.00406532, total time[s] 0.090828 +Converged at iteration 25, L1 6.94401e-05, Linf 0.00201688, total time[s] 0.079406 +Converged at iteration 23, L1 7.50321e-05, Linf 0.00300667, total time[s] 0.074735 +Converged at iteration 39, L1 6.8069e-05, Linf 0.00655511, total time[s] 0.126759 +Converged at iteration 36, L1 6.35255e-05, Linf 0.00554951, total time[s] 0.100241 +Converged at iteration 24, L1 7.26832e-05, Linf 0.00307803, total time[s] 0.063876 +Converged at iteration 30, L1 9.43548e-05, Linf 0.00605523, total time[s] 0.077618 +Converged at iteration 26, L1 5.93647e-05, Linf 0.00586515, total time[s] 0.068006 +Converged at iteration 21, L1 7.47396e-05, Linf 0.00341496, total time[s] 0.056308 +Converged at iteration 19, L1 5.80192e-05, Linf 0.0039566, total time[s] 0.078654 +Converged at iteration 20, L1 8.02687e-05, Linf 0.00645164, total time[s] 0.073823 +Converged at iteration 24, L1 6.59102e-05, Linf 0.00398631, total time[s] 0.081351 +Converged at iteration 24, L1 8.88171e-05, Linf 0.00562581, total time[s] 0.084186 +Converged at iteration 20, L1 7.43268e-05, Linf 0.00581556, total time[s] 0.057328 +Converged at iteration 16, L1 9.71201e-05, Linf 0.0057281, total time[s] 0.048519 +Converged at iteration 32, L1 6.32247e-05, Linf 0.0026425, total time[s] 0.126834 +Converged at iteration 19, L1 9.39533e-05, Linf 0.00641309, total time[s] 0.063783 +Converged at iteration 23, L1 7.61438e-05, Linf 0.0064688, total time[s] 0.06035 +Converged at iteration 26, L1 8.20231e-05, Linf 0.00583513, total time[s] 0.067652 +Converged at iteration 23, L1 5.51334e-05, Linf 0.00598562, total time[s] 0.060949 +Converged at iteration 20, L1 9.26887e-05, Linf 0.0055034, total time[s] 0.05545 +Converged at iteration 23, L1 7.18941e-05, Linf 0.00263612, total time[s] 0.061806 +Converged at iteration 25, L1 8.6079e-05, Linf 0.00368291, total time[s] 0.070787 +Converged at iteration 28, L1 8.12233e-05, Linf 0.00428189, total time[s] 0.07838 +Converged at iteration 40, L1 6.71486e-05, Linf 0.00367483, total time[s] 0.116209 +Converged at iteration 35, L1 7.60938e-05, Linf 0.00339714, total time[s] 0.092637 +Converged at iteration 30, L1 9.62616e-05, Linf 0.00432603, total time[s] 0.075936 +Converged at iteration 31, L1 6.25658e-05, Linf 0.00502564, total time[s] 0.077496 +Converged at iteration 27, L1 6.27233e-05, Linf 0.00499541, total time[s] 0.071573 +Converged at iteration 22, L1 8.58668e-05, Linf 0.00448846, total time[s] 0.058106 +Converged at iteration 20, L1 9.6112e-05, Linf 0.00395687, total time[s] 0.061172 +Converged at iteration 24, L1 8.84271e-05, Linf 0.00480308, total time[s] 0.060912 +Converged at iteration 28, L1 7.39172e-05, Linf 0.00445906, total time[s] 0.070478 +Converged at iteration 26, L1 8.14516e-05, Linf 0.0054815, total time[s] 0.066071 +Converged at iteration 22, L1 7.51462e-05, Linf 0.00508686, total time[s] 0.056676 +Converged at iteration 19, L1 6.63364e-05, Linf 0.00393044, total time[s] 0.049977 +Converged at iteration 30, L1 7.98745e-05, Linf 0.00329634, total time[s] 0.075376 +Converged at iteration 20, L1 8.45323e-05, Linf 0.00455024, total time[s] 0.052404 +Converged at iteration 24, L1 7.10805e-05, Linf 0.00463777, total time[s] 0.063437 +Converged at iteration 31, L1 8.93499e-05, Linf 0.00569249, total time[s] 0.076977 +Converged at iteration 27, L1 9.91925e-05, Linf 0.00568069, total time[s] 0.068439 +Converged at iteration 24, L1 8.82237e-05, Linf 0.00465029, total time[s] 0.061501 +Converged at iteration 23, L1 9.23013e-05, Linf 0.00410187, total time[s] 0.064641 +Converged at iteration 26, L1 7.22138e-05, Linf 0.00446169, total time[s] 0.069298 +Converged at iteration 29, L1 7.84076e-05, Linf 0.00480241, total time[s] 0.076402 +Converged at iteration 34, L1 7.08937e-05, Linf 0.00422634, total time[s] 0.085032 +Converged at iteration 30, L1 9.40531e-05, Linf 0.00442602, total time[s] 0.076247 +Converged at iteration 28, L1 9.49885e-05, Linf 0.00310979, total time[s] 0.071511 +Converged at iteration 32, L1 9.39376e-05, Linf 0.00374079, total time[s] 0.080224 +Converged at iteration 37, L1 7.33885e-05, Linf 0.00327806, total time[s] 0.095072 +Converged at iteration 33, L1 8.45251e-05, Linf 0.00487639, total time[s] 0.102279 +Converged at iteration 28, L1 9.65644e-05, Linf 0.00430244, total time[s] 0.077747 +Converged at iteration 24, L1 8.82811e-05, Linf 0.00325073, total time[s] 0.07142 +Converged at iteration 26, L1 8.98061e-05, Linf 0.00383964, total time[s] 0.071058 +Converged at iteration 40, L1 6.6414e-05, Linf 0.00393408, total time[s] 0.099684 +Converged at iteration 35, L1 8.66305e-05, Linf 0.00360688, total time[s] 0.091097 +Converged at iteration 30, L1 9.16827e-05, Linf 0.00418052, total time[s] 0.075748 +Converged at iteration 31, L1 6.23624e-05, Linf 0.00504684, total time[s] 0.083041 +Converged at iteration 26, L1 9.83541e-05, Linf 0.00577635, total time[s] 0.066232 +Converged at iteration 22, L1 7.16453e-05, Linf 0.00418213, total time[s] 0.056991 +Converged at iteration 21, L1 6.4059e-05, Linf 0.00348502, total time[s] 0.055346 +Converged at iteration 24, L1 8.94331e-05, Linf 0.00495038, total time[s] 0.061272 +Converged at iteration 28, L1 7.32603e-05, Linf 0.00443344, total time[s] 0.083896 +Converged at iteration 26, L1 8.03513e-05, Linf 0.00534491, total time[s] 0.06696 +Converged at iteration 22, L1 7.09326e-05, Linf 0.00441999, total time[s] 0.061307 +Converged at iteration 19, L1 5.58272e-05, Linf 0.00547292, total time[s] 0.059858 +Converged at iteration 30, L1 9.51996e-05, Linf 0.00330736, total time[s] 0.079089 +Converged at iteration 20, L1 8.50489e-05, Linf 0.00466296, total time[s] 0.052736 +Converged at iteration 24, L1 7.12291e-05, Linf 0.00475228, total time[s] 0.078916 +Converged at iteration 31, L1 9.4323e-05, Linf 0.00482246, total time[s] 0.080445 +Converged at iteration 27, L1 9.47549e-05, Linf 0.00465738, total time[s] 0.068241 +Converged at iteration 24, L1 8.5188e-05, Linf 0.00428125, total time[s] 0.066901 +Converged at iteration 23, L1 9.24583e-05, Linf 0.00432198, total time[s] 0.060463 +Converged at iteration 26, L1 7.13004e-05, Linf 0.00466098, total time[s] 0.067666 +Converged at iteration 29, L1 7.53063e-05, Linf 0.00488658, total time[s] 0.073985 +Converged at iteration 34, L1 8.13247e-05, Linf 0.00406169, total time[s] 0.083994 +Converged at iteration 31, L1 7.17306e-05, Linf 0.00355167, total time[s] 0.077889 +Converged at iteration 29, L1 7.02736e-05, Linf 0.002724, total time[s] 0.073094 +Converged at iteration 32, L1 8.22027e-05, Linf 0.0035457, total time[s] 0.079873 +Converged at iteration 36, L1 8.71608e-05, Linf 0.00357612, total time[s] 0.089706 +Converged at iteration 33, L1 8.3227e-05, Linf 0.0048477, total time[s] 0.082345 +Converged at iteration 28, L1 9.10516e-05, Linf 0.00413141, total time[s] 0.070196 +Converged at iteration 24, L1 8.02476e-05, Linf 0.00290884, total time[s] 0.061205 +Converged at iteration 26, L1 8.39881e-05, Linf 0.00392369, total time[s] 0.066338 +Converged at iteration 39, L1 9.99501e-05, Linf 0.00489135, total time[s] 0.09499 +Converged at iteration 35, L1 9.63021e-05, Linf 0.00385589, total time[s] 0.087726 +Converged at iteration 30, L1 7.64777e-05, Linf 0.00421014, total time[s] 0.075996 +Converged at iteration 31, L1 6.16909e-05, Linf 0.00506464, total time[s] 0.080313 +Converged at iteration 26, L1 9.1203e-05, Linf 0.00568981, total time[s] 0.066729 +Converged at iteration 21, L1 9.60308e-05, Linf 0.00461195, total time[s] 0.055659 +Converged at iteration 21, L1 6.9248e-05, Linf 0.00393128, total time[s] 0.055021 +Converged at iteration 24, L1 8.29681e-05, Linf 0.00519988, total time[s] 0.061358 +Converged at iteration 28, L1 6.83684e-05, Linf 0.00441193, total time[s] 0.070869 +Converged at iteration 26, L1 8.18955e-05, Linf 0.00430144, total time[s] 0.065864 +Converged at iteration 21, L1 8.5095e-05, Linf 0.00433737, total time[s] 0.054903 +Converged at iteration 18, L1 7.37272e-05, Linf 0.00298987, total time[s] 0.048211 +Converged at iteration 31, L1 7.48958e-05, Linf 0.00268238, total time[s] 0.079686 +Converged at iteration 20, L1 8.18547e-05, Linf 0.00494615, total time[s] 0.051858 +Converged at iteration 24, L1 6.88422e-05, Linf 0.00519385, total time[s] 0.06735 +Converged at iteration 30, L1 9.60963e-05, Linf 0.0108769, total time[s] 0.075825 +Converged at iteration 25, L1 9.01836e-05, Linf 0.00466687, total time[s] 0.064262 +Converged at iteration 23, L1 8.35891e-05, Linf 0.00393125, total time[s] 0.059182 +Converged at iteration 23, L1 9.32161e-05, Linf 0.0044389, total time[s] 0.060562 +Converged at iteration 26, L1 6.88874e-05, Linf 0.00492247, total time[s] 0.067459 +Converged at iteration 29, L1 7.13934e-05, Linf 0.0049862, total time[s] 0.077641 +Converged at iteration 32, L1 8.57598e-05, Linf 0.00350835, total time[s] 0.080772 +Converged at iteration 31, L1 7.25425e-05, Linf 0.00305977, total time[s] 0.078643 +Converged at iteration 29, L1 7.74367e-05, Linf 0.00291211, total time[s] 0.074175 +Converged at iteration 32, L1 7.56372e-05, Linf 0.00337424, total time[s] 0.08352 +Converged at iteration 35, L1 9.729e-05, Linf 0.00406605, total time[s] 0.094321 +Converged at iteration 33, L1 8.06337e-05, Linf 0.0050016, total time[s] 0.084989 +Converged at iteration 28, L1 8.42759e-05, Linf 0.00398754, total time[s] 0.073364 +Converged at iteration 24, L1 7.80443e-05, Linf 0.00256146, total time[s] 0.063776 +Converged at iteration 26, L1 8.36211e-05, Linf 0.00405327, total time[s] 0.068396 +Converged at iteration 39, L1 9.93025e-05, Linf 0.00493817, total time[s] 0.101242 +Converged at iteration 35, L1 9.74935e-05, Linf 0.0038975, total time[s] 0.129623 +Converged at iteration 30, L1 6.51743e-05, Linf 0.00415287, total time[s] 0.081101 +Converged at iteration 31, L1 6.06181e-05, Linf 0.00505854, total time[s] 0.08055 +Converged at iteration 26, L1 9.14417e-05, Linf 0.00577194, total time[s] 0.068348 +Converged at iteration 21, L1 9.75441e-05, Linf 0.00465145, total time[s] 0.05798 +Converged at iteration 21, L1 6.62069e-05, Linf 0.00396274, total time[s] 0.056672 +Converged at iteration 24, L1 7.54086e-05, Linf 0.00520319, total time[s] 0.06544 +Converged at iteration 28, L1 6.65538e-05, Linf 0.0044003, total time[s] 0.073259 +Converged at iteration 26, L1 7.95527e-05, Linf 0.00408328, total time[s] 0.068145 +Converged at iteration 21, L1 7.91704e-05, Linf 0.00436519, total time[s] 0.056623 +Converged at iteration 18, L1 6.9484e-05, Linf 0.00286737, total time[s] 0.050483 +Converged at iteration 31, L1 7.65522e-05, Linf 0.00271018, total time[s] 0.082187 +Converged at iteration 20, L1 8.09888e-05, Linf 0.0049666, total time[s] 0.054861 +Converged at iteration 24, L1 6.84806e-05, Linf 0.00523436, total time[s] 0.062409 +Converged at iteration 30, L1 8.42709e-05, Linf 0.00323918, total time[s] 0.077637 +Converged at iteration 25, L1 8.01975e-05, Linf 0.00458418, total time[s] 0.069203 +Converged at iteration 23, L1 7.58379e-05, Linf 0.00382565, total time[s] 0.059906 +Converged at iteration 23, L1 9.28377e-05, Linf 0.0044172, total time[s] 0.059994 +Converged at iteration 26, L1 6.76131e-05, Linf 0.00494143, total time[s] 0.067336 +Converged at iteration 29, L1 7.05884e-05, Linf 0.00482543, total time[s] 0.075139 +Converged at iteration 32, L1 7.28724e-05, Linf 0.00335961, total time[s] 0.088941 +Converged at iteration 30, L1 9.43757e-05, Linf 0.00339246, total time[s] 0.102278 +Converged at iteration 29, L1 7.87287e-05, Linf 0.00292186, total time[s] 0.084817 +Converged at iteration 32, L1 7.50295e-05, Linf 0.00335651, total time[s] 0.085625 +Converged at iteration 35, L1 8.59233e-05, Linf 0.00398675, total time[s] 0.096458 +Converged at iteration 33, L1 7.95256e-05, Linf 0.00502143, total time[s] 0.090175 +Converged at iteration 28, L1 8.45713e-05, Linf 0.00404605, total time[s] 0.072515 +Converged at iteration 24, L1 7.92051e-05, Linf 0.00259405, total time[s] 0.066594 +Converged at iteration 26, L1 8.2199e-05, Linf 0.00404863, total time[s] 0.07739 +Converged at iteration 39, L1 9.91135e-05, Linf 0.00498559, total time[s] 0.102332 +Converged at iteration 35, L1 9.91634e-05, Linf 0.00394035, total time[s] 0.093406 +Converged at iteration 29, L1 8.64043e-05, Linf 0.00497192, total time[s] 0.074337 +Converged at iteration 31, L1 5.99058e-05, Linf 0.00508046, total time[s] 0.078704 +Converged at iteration 26, L1 9.17569e-05, Linf 0.00585324, total time[s] 0.067235 +Converged at iteration 21, L1 9.91144e-05, Linf 0.00469187, total time[s] 0.05631 +Converged at iteration 21, L1 6.29627e-05, Linf 0.00396871, total time[s] 0.055263 +Converged at iteration 24, L1 6.66857e-05, Linf 0.00527436, total time[s] 0.065086 +Converged at iteration 28, L1 6.33755e-05, Linf 0.00438503, total time[s] 0.07789 +Converged at iteration 26, L1 7.61915e-05, Linf 0.00388619, total time[s] 0.068803 +Converged at iteration 21, L1 7.45939e-05, Linf 0.00439145, total time[s] 0.054865 +Converged at iteration 18, L1 6.55896e-05, Linf 0.00301094, total time[s] 0.050583 +Converged at iteration 31, L1 7.82983e-05, Linf 0.00274065, total time[s] 0.091002 +Converged at iteration 20, L1 8.00261e-05, Linf 0.00498833, total time[s] 0.056814 +Converged at iteration 24, L1 6.76331e-05, Linf 0.00507319, total time[s] 0.070062 +Converged at iteration 30, L1 7.58208e-05, Linf 0.00306424, total time[s] 0.099939 +Converged at iteration 25, L1 7.26297e-05, Linf 0.00449935, total time[s] 0.069887 +Converged at iteration 23, L1 6.94021e-05, Linf 0.00374729, total time[s] 0.061865 +Converged at iteration 23, L1 9.21788e-05, Linf 0.00450696, total time[s] 0.060665 +Converged at iteration 26, L1 6.63487e-05, Linf 0.00492624, total time[s] 0.067403 +Converged at iteration 29, L1 6.98344e-05, Linf 0.00480576, total time[s] 0.074408 +Converged at iteration 31, L1 9.67345e-05, Linf 0.00400349, total time[s] 0.080831 +Converged at iteration 30, L1 8.62325e-05, Linf 0.00324896, total time[s] 0.084878 +Converged at iteration 29, L1 7.99787e-05, Linf 0.00296173, total time[s] 0.082554 +Converged at iteration 32, L1 7.33259e-05, Linf 0.00332302, total time[s] 0.102939 +Converged at iteration 35, L1 7.39196e-05, Linf 0.00386022, total time[s] 0.114891 +Converged at iteration 33, L1 7.84707e-05, Linf 0.00509812, total time[s] 0.092871 +Converged at iteration 28, L1 8.47702e-05, Linf 0.00410616, total time[s] 0.080199 +Converged at iteration 24, L1 8.02837e-05, Linf 0.00266402, total time[s] 0.07101 +Converged at iteration 26, L1 7.76046e-05, Linf 0.00401282, total time[s] 0.069809 +Converged at iteration 39, L1 9.71153e-05, Linf 0.00512594, total time[s] 0.111081 +Converged at iteration 36, L1 6.77535e-05, Linf 0.00341429, total time[s] 0.109355 +Converged at iteration 28, L1 9.93899e-05, Linf 0.00573689, total time[s] 0.084613 +Converged at iteration 31, L1 5.91172e-05, Linf 0.00503463, total time[s] 0.092892 +Converged at iteration 26, L1 9.21242e-05, Linf 0.00601397, total time[s] 0.074683 +Converged at iteration 22, L1 6.08539e-05, Linf 0.00400504, total time[s] 0.062102 +Converged at iteration 20, L1 9.48795e-05, Linf 0.00516084, total time[s] 0.053835 +Converged at iteration 23, L1 8.63097e-05, Linf 0.00619976, total time[s] 0.065982 +Converged at iteration 27, L1 9.38703e-05, Linf 0.00544946, total time[s] 0.091463 +Converged at iteration 26, L1 6.78722e-05, Linf 0.00354429, total time[s] 0.080477 +Converged at iteration 21, L1 6.88869e-05, Linf 0.00444326, total time[s] 0.055928 +Converged at iteration 18, L1 5.99474e-05, Linf 0.00342419, total time[s] 0.051387 +Converged at iteration 31, L1 8.18259e-05, Linf 0.00279727, total time[s] 0.077927 +Converged at iteration 20, L1 7.69921e-05, Linf 0.00503378, total time[s] 0.052484 +Converged at iteration 24, L1 6.61998e-05, Linf 0.00516034, total time[s] 0.06306 +Converged at iteration 29, L1 9.10144e-05, Linf 0.00343988, total time[s] 0.081712 +Converged at iteration 25, L1 6.23796e-05, Linf 0.00448303, total time[s] 0.064642 +Converged at iteration 22, L1 9.79608e-05, Linf 0.00445977, total time[s] 0.057429 +Converged at iteration 23, L1 9.10812e-05, Linf 0.00434564, total time[s] 0.059703 +Converged at iteration 25, L1 9.88873e-05, Linf 0.00584097, total time[s] 0.064943 +Converged at iteration 29, L1 6.84017e-05, Linf 0.0046465, total time[s] 0.075678 +Converged at iteration 31, L1 8.0304e-05, Linf 0.00389511, total time[s] 0.079363 +Converged at iteration 30, L1 7.20603e-05, Linf 0.00299534, total time[s] 0.075583 +Converged at iteration 29, L1 8.27174e-05, Linf 0.00303503, total time[s] 0.074288 +Converged at iteration 31, L1 9.78201e-05, Linf 0.00389032, total time[s] 0.078382 +Converged at iteration 34, L1 7.9331e-05, Linf 0.00424819, total time[s] 0.086063 +Converged at iteration 33, L1 7.62858e-05, Linf 0.00528486, total time[s] 0.082555 +Converged at iteration 28, L1 8.51952e-05, Linf 0.0042319, total time[s] 0.071456 +Converged at iteration 24, L1 8.28306e-05, Linf 0.00276596, total time[s] 0.065358 +Converged at iteration 26, L1 6.77494e-05, Linf 0.00385161, total time[s] 0.0715 +Converged at iteration 39, L1 9.36576e-05, Linf 0.00521777, total time[s] 0.09619 +Converged at iteration 36, L1 6.82937e-05, Linf 0.00363205, total time[s] 0.090878 +Converged at iteration 27, L1 8.77303e-05, Linf 0.0061681, total time[s] 0.067464 +Converged at iteration 30, L1 9.96572e-05, Linf 0.00610012, total time[s] 0.074511 +Converged at iteration 26, L1 9.19552e-05, Linf 0.00632841, total time[s] 0.071014 +Converged at iteration 22, L1 6.29758e-05, Linf 0.00416621, total time[s] 0.057806 +Converged at iteration 20, L1 7.52988e-05, Linf 0.00505362, total time[s] 0.052731 +Converged at iteration 22, L1 9.33424e-05, Linf 0.00721836, total time[s] 0.057547 +Converged at iteration 27, L1 7.09914e-05, Linf 0.00525812, total time[s] 0.070582 +Converged at iteration 25, L1 9.90478e-05, Linf 0.00469514, total time[s] 0.068433 +Converged at iteration 21, L1 6.03274e-05, Linf 0.00457411, total time[s] 0.057675 +Converged at iteration 17, L1 9.74113e-05, Linf 0.00503469, total time[s] 0.049447 +Converged at iteration 31, L1 8.76135e-05, Linf 0.00291605, total time[s] 0.097816 +Converged at iteration 20, L1 6.98479e-05, Linf 0.00507742, total time[s] 0.054974 +Converged at iteration 24, L1 6.21974e-05, Linf 0.00531068, total time[s] 0.065685 +Converged at iteration 28, L1 9.87229e-05, Linf 0.00416405, total time[s] 0.07419 +Converged at iteration 24, L1 8.63784e-05, Linf 0.00598406, total time[s] 0.063982 +Converged at iteration 22, L1 8.87045e-05, Linf 0.0043871, total time[s] 0.058858 +Converged at iteration 23, L1 8.52045e-05, Linf 0.00372894, total time[s] 0.063293 +Converged at iteration 25, L1 9.14459e-05, Linf 0.00583719, total time[s] 0.065732 +Converged at iteration 28, L1 9.97721e-05, Linf 0.00599871, total time[s] 0.091199 +Converged at iteration 30, L1 9.93498e-05, Linf 0.00495537, total time[s] 0.078998 +Converged at iteration 29, L1 8.14118e-05, Linf 0.00317917, total time[s] 0.073582 +Converged at iteration 29, L1 8.85324e-05, Linf 0.00312271, total time[s] 0.07373 +Converged at iteration 31, L1 8.40432e-05, Linf 0.00340195, total time[s] 0.078026 +Converged at iteration 33, L1 6.51112e-05, Linf 0.00380059, total time[s] 0.13013 +Converged at iteration 33, L1 7.07779e-05, Linf 0.00512445, total time[s] 0.111647 +Converged at iteration 28, L1 8.41944e-05, Linf 0.00443832, total time[s] 0.076724 +Converged at iteration 24, L1 8.81194e-05, Linf 0.00296555, total time[s] 0.070492 +Converged at iteration 25, L1 8.00138e-05, Linf 0.00429835, total time[s] 0.080393 +Converged at iteration 39, L1 8.41064e-05, Linf 0.0054326, total time[s] 0.126237 +Converged at iteration 36, L1 6.51184e-05, Linf 0.00406125, total time[s] 0.102626 +Converged at iteration 26, L1 5.47278e-05, Linf 0.00518122, total time[s] 0.079449 +Converged at iteration 30, L1 9.00076e-05, Linf 0.0060885, total time[s] 0.096309 +Converged at iteration 26, L1 9.12056e-05, Linf 0.00693295, total time[s] 0.071202 +Converged at iteration 22, L1 6.75521e-05, Linf 0.00450672, total time[s] 0.058096 +Converged at iteration 19, L1 8.99149e-05, Linf 0.00633285, total time[s] 0.061001 +Converged at iteration 21, L1 8.24925e-05, Linf 0.00767717, total time[s] 0.05805 +Converged at iteration 26, L1 6.35767e-05, Linf 0.00541872, total time[s] 0.070957 +Converged at iteration 25, L1 8.04458e-05, Linf 0.00506785, total time[s] 0.067089 +Converged at iteration 21, L1 5.58464e-05, Linf 0.00481159, total time[s] 0.054496 +Converged at iteration 17, L1 7.81062e-05, Linf 0.00568727, total time[s] 0.045229 +Converged at iteration 31, L1 9.70707e-05, Linf 0.00313219, total time[s] 0.079811 +Converged at iteration 19, L1 9.80906e-05, Linf 0.00630967, total time[s] 0.048878 +Converged at iteration 23, L1 8.72309e-05, Linf 0.0059328, total time[s] 0.074634 +Converged at iteration 28, L1 6.43819e-05, Linf 0.00399084, total time[s] 0.079144 +Converged at iteration 24, L1 6.94887e-05, Linf 0.00612319, total time[s] 0.066484 +Converged at iteration 22, L1 8.24204e-05, Linf 0.00449416, total time[s] 0.07031 +Converged at iteration 23, L1 7.06453e-05, Linf 0.00256192, total time[s] 0.062298 +Converged at iteration 25, L1 7.88164e-05, Linf 0.00476812, total time[s] 0.064277 +Converged at iteration 28, L1 8.92915e-05, Linf 0.00542922, total time[s] 0.07133 +Converged at iteration 30, L1 7.81447e-05, Linf 0.00514041, total time[s] 0.076031 +Converged at iteration 28, L1 9.15152e-05, Linf 0.00365367, total time[s] 0.074652 +Converged at iteration 29, L1 9.97742e-05, Linf 0.00331858, total time[s] 0.074205 +Converged at iteration 30, L1 9.36761e-05, Linf 0.00320873, total time[s] 0.080571 +Converged at iteration 31, L1 6.89429e-05, Linf 0.00245686, total time[s] 0.078877 +Converged at iteration 33, L1 6.01381e-05, Linf 0.00517251, total time[s] 0.081975 +Converged at iteration 28, L1 8.31467e-05, Linf 0.00498843, total time[s] 0.071308 +Converged at iteration 25, L1 6.23892e-05, Linf 0.00264111, total time[s] 0.064658 +Converged at iteration 24, L1 8.41367e-05, Linf 0.00399433, total time[s] 0.062117 +Converged at iteration 39, L1 8.82051e-05, Linf 0.0053376, total time[s] 0.099404 +Converged at iteration 36, L1 6.72346e-05, Linf 0.00386452, total time[s] 0.096135 +Converged at iteration 26, L1 8.95585e-05, Linf 0.0066189, total time[s] 0.066995 +Converged at iteration 30, L1 9.51633e-05, Linf 0.00609583, total time[s] 0.075972 +Converged at iteration 26, L1 9.14894e-05, Linf 0.00663415, total time[s] 0.0664 +Converged at iteration 22, L1 6.54935e-05, Linf 0.00433145, total time[s] 0.057192 +Converged at iteration 20, L1 5.96059e-05, Linf 0.00477562, total time[s] 0.053733 +Converged at iteration 22, L1 5.76884e-05, Linf 0.00623806, total time[s] 0.057739 +Converged at iteration 26, L1 8.86922e-05, Linf 0.00610821, total time[s] 0.066523 +Converged at iteration 25, L1 8.87775e-05, Linf 0.00488357, total time[s] 0.065665 +Converged at iteration 21, L1 5.87271e-05, Linf 0.00686425, total time[s] 0.055234 +Converged at iteration 17, L1 8.44322e-05, Linf 0.00542393, total time[s] 0.045497 +Converged at iteration 31, L1 9.26642e-05, Linf 0.00302633, total time[s] 0.077661 +Converged at iteration 20, L1 6.27122e-05, Linf 0.00495432, total time[s] 0.053808 +Converged at iteration 23, L1 9.54641e-05, Linf 0.00590293, total time[s] 0.061403 +Converged at iteration 28, L1 7.78132e-05, Linf 0.00413372, total time[s] 0.075081 +Converged at iteration 24, L1 7.71881e-05, Linf 0.00608494, total time[s] 0.062349 +Converged at iteration 22, L1 8.49017e-05, Linf 0.00442464, total time[s] 0.059118 +Converged at iteration 23, L1 7.63611e-05, Linf 0.0030533, total time[s] 0.061183 +Converged at iteration 25, L1 8.52856e-05, Linf 0.00561297, total time[s] 0.064841 +Converged at iteration 28, L1 9.4769e-05, Linf 0.0057785, total time[s] 0.076289 +Converged at iteration 30, L1 8.65792e-05, Linf 0.0050774, total time[s] 0.076461 +Converged at iteration 29, L1 6.76588e-05, Linf 0.002996, total time[s] 0.073396 +Converged at iteration 29, L1 9.46784e-05, Linf 0.00319248, total time[s] 0.074143 +Converged at iteration 31, L1 7.3904e-05, Linf 0.00291173, total time[s] 0.109059 +Converged at iteration 31, L1 9.81908e-05, Linf 0.00455096, total time[s] 0.079407 +Converged at iteration 33, L1 6.50775e-05, Linf 0.00515214, total time[s] 0.084803 +Converged at iteration 28, L1 8.34079e-05, Linf 0.00473766, total time[s] 0.072575 +Converged at iteration 24, L1 9.43413e-05, Linf 0.00316326, total time[s] 0.062873 +Converged at iteration 25, L1 6.28244e-05, Linf 0.00361576, total time[s] 0.068095 +Converged at iteration 39, L1 9.01134e-05, Linf 0.0052787, total time[s] 0.105423 +Converged at iteration 36, L1 6.75742e-05, Linf 0.0037879, total time[s] 0.094016 +Converged at iteration 27, L1 6.23042e-05, Linf 0.00560753, total time[s] 0.069755 +Converged at iteration 30, L1 9.71515e-05, Linf 0.00609915, total time[s] 0.076704 +Converged at iteration 26, L1 9.17317e-05, Linf 0.00648239, total time[s] 0.067543 +Converged at iteration 22, L1 6.39495e-05, Linf 0.00424869, total time[s] 0.057903 +Converged at iteration 20, L1 6.69532e-05, Linf 0.00489948, total time[s] 0.055963 +Converged at iteration 22, L1 7.33674e-05, Linf 0.00687189, total time[s] 0.072819 +Converged at iteration 27, L1 5.95588e-05, Linf 0.00503452, total time[s] 0.078878 +Converged at iteration 25, L1 9.3375e-05, Linf 0.00479031, total time[s] 0.068054 +Converged at iteration 21, L1 5.90102e-05, Linf 0.00464473, total time[s] 0.056692 +Converged at iteration 17, L1 9.01126e-05, Linf 0.00523016, total time[s] 0.060392 +Converged at iteration 31, L1 9.03494e-05, Linf 0.00297229, total time[s] 0.09299 +Converged at iteration 20, L1 6.58706e-05, Linf 0.00501017, total time[s] 0.057258 +Converged at iteration 23, L1 9.95139e-05, Linf 0.00590987, total time[s] 0.061574 +Converged at iteration 28, L1 8.74795e-05, Linf 0.00413361, total time[s] 0.072077 +Converged at iteration 24, L1 8.10551e-05, Linf 0.00604533, total time[s] 0.069433 +Converged at iteration 22, L1 8.67009e-05, Linf 0.00439846, total time[s] 0.065655 +Converged at iteration 23, L1 8.03287e-05, Linf 0.00337176, total time[s] 0.0661 +Converged at iteration 25, L1 8.79148e-05, Linf 0.00577888, total time[s] 0.073884 +Converged at iteration 28, L1 9.73601e-05, Linf 0.0058949, total time[s] 0.084245 +Converged at iteration 30, L1 9.17882e-05, Linf 0.00501546, total time[s] 0.079112 +Converged at iteration 29, L1 7.35942e-05, Linf 0.00309787, total time[s] 0.075575 +Converged at iteration 29, L1 9.15622e-05, Linf 0.00315631, total time[s] 0.074788 +Converged at iteration 31, L1 7.88768e-05, Linf 0.00313661, total time[s] 0.079925 +Converged at iteration 32, L1 7.85085e-05, Linf 0.00412095, total time[s] 0.082913 +Converged at iteration 33, L1 6.78762e-05, Linf 0.00508837, total time[s] 0.08348 +Converged at iteration 28, L1 8.37133e-05, Linf 0.00466546, total time[s] 0.07586 +Converged at iteration 24, L1 9.10839e-05, Linf 0.00303807, total time[s] 0.063076 +Converged at iteration 25, L1 7.07743e-05, Linf 0.0039782, total time[s] 0.065838 +Converged at iteration 39, L1 9.11948e-05, Linf 0.00531107, total time[s] 0.097666 +Converged at iteration 36, L1 6.7768e-05, Linf 0.0038009, total time[s] 0.092805 +Converged at iteration 27, L1 7.3652e-05, Linf 0.00590311, total time[s] 0.069026 +Converged at iteration 30, L1 9.83602e-05, Linf 0.00610014, total time[s] 0.076404 +Converged at iteration 26, L1 9.18702e-05, Linf 0.00647561, total time[s] 0.067253 +Converged at iteration 22, L1 6.35554e-05, Linf 0.00420704, total time[s] 0.05804 +Converged at iteration 20, L1 7.0979e-05, Linf 0.00500865, total time[s] 0.056005 +Converged at iteration 22, L1 8.30716e-05, Linf 0.00709116, total time[s] 0.061322 +Converged at iteration 27, L1 6.51562e-05, Linf 0.00517805, total time[s] 0.076861 +Converged at iteration 25, L1 9.61122e-05, Linf 0.0047347, total time[s] 0.069234 +Converged at iteration 21, L1 5.94357e-05, Linf 0.00465216, total time[s] 0.056466 +Converged at iteration 17, L1 9.35338e-05, Linf 0.00502886, total time[s] 0.047063 +Converged at iteration 31, L1 8.89462e-05, Linf 0.00294454, total time[s] 0.079685 +Converged at iteration 20, L1 6.77649e-05, Linf 0.00505454, total time[s] 0.054911 +Converged at iteration 24, L1 6.14197e-05, Linf 0.00526675, total time[s] 0.064048 +Converged at iteration 28, L1 9.31236e-05, Linf 0.00415917, total time[s] 0.072254 +Converged at iteration 24, L1 8.36873e-05, Linf 0.0060198, total time[s] 0.062893 +Converged at iteration 22, L1 8.77039e-05, Linf 0.00439283, total time[s] 0.059631 +Converged at iteration 23, L1 8.29931e-05, Linf 0.00354851, total time[s] 0.06238 +Converged at iteration 25, L1 8.9704e-05, Linf 0.00581826, total time[s] 0.069882 +Converged at iteration 28, L1 9.91073e-05, Linf 0.00595624, total time[s] 0.09122 +Converged at iteration 30, L1 9.53372e-05, Linf 0.00498606, total time[s] 0.079595 +Converged at iteration 29, L1 7.72209e-05, Linf 0.00312299, total time[s] 0.075146 +Converged at iteration 29, L1 8.99767e-05, Linf 0.00313188, total time[s] 0.078283 +Converged at iteration 31, L1 8.09993e-05, Linf 0.00326633, total time[s] 0.081996 +Converged at iteration 32, L1 8.90957e-05, Linf 0.00458971, total time[s] 0.082731 +Converged at iteration 33, L1 6.93998e-05, Linf 0.00513143, total time[s] 0.091054 +Converged at iteration 28, L1 8.39853e-05, Linf 0.00450042, total time[s] 0.074538 +Converged at iteration 24, L1 8.95088e-05, Linf 0.00301484, total time[s] 0.064061 +Converged at iteration 25, L1 7.52265e-05, Linf 0.00414448, total time[s] 0.068275 +Converged at iteration 39, L1 9.13194e-05, Linf 0.00526262, total time[s] 0.103001 +Converged at iteration 36, L1 6.77722e-05, Linf 0.00371617, total time[s] 0.094267 +Converged at iteration 27, L1 6.76911e-05, Linf 0.00575604, total time[s] 0.072809 +Converged at iteration 30, L1 9.8998e-05, Linf 0.00609984, total time[s] 0.07806 +Converged at iteration 26, L1 9.20027e-05, Linf 0.006444, total time[s] 0.06899 +Converged at iteration 22, L1 6.39516e-05, Linf 0.00422786, total time[s] 0.059332 +Converged at iteration 20, L1 6.9016e-05, Linf 0.00495677, total time[s] 0.054334 +Converged at iteration 22, L1 7.78711e-05, Linf 0.00699475, total time[s] 0.062691 +Converged at iteration 27, L1 6.23379e-05, Linf 0.00510162, total time[s] 0.081759 +Converged at iteration 25, L1 9.48826e-05, Linf 0.00476684, total time[s] 0.072229 +Converged at iteration 21, L1 5.91152e-05, Linf 0.00463687, total time[s] 0.059615 +Converged at iteration 17, L1 9.17705e-05, Linf 0.00518153, total time[s] 0.047075 +Converged at iteration 31, L1 8.97064e-05, Linf 0.00295849, total time[s] 0.079547 +Converged at iteration 20, L1 6.67697e-05, Linf 0.0050303, total time[s] 0.053551 +Converged at iteration 24, L1 6.03981e-05, Linf 0.00525184, total time[s] 0.063616 +Converged at iteration 28, L1 9.02994e-05, Linf 0.00417912, total time[s] 0.074023 +Converged at iteration 24, L1 8.23302e-05, Linf 0.00608364, total time[s] 0.065367 +Converged at iteration 22, L1 8.72043e-05, Linf 0.00439415, total time[s] 0.060287 +Converged at iteration 23, L1 8.16065e-05, Linf 0.00345902, total time[s] 0.097341 +Converged at iteration 25, L1 8.87852e-05, Linf 0.0058081, total time[s] 0.065096 +Converged at iteration 28, L1 9.79741e-05, Linf 0.00592785, total time[s] 0.07199 +Converged at iteration 30, L1 9.34872e-05, Linf 0.00500137, total time[s] 0.078216 +Converged at iteration 29, L1 7.52646e-05, Linf 0.00309698, total time[s] 0.078468 +Converged at iteration 29, L1 9.07154e-05, Linf 0.00314405, total time[s] 0.082077 +Converged at iteration 31, L1 7.98332e-05, Linf 0.00320031, total time[s] 0.086418 +Converged at iteration 32, L1 8.34106e-05, Linf 0.00434996, total time[s] 0.090516 +Converged at iteration 33, L1 6.85868e-05, Linf 0.00508213, total time[s] 0.0923 +Converged at iteration 28, L1 8.38381e-05, Linf 0.00457869, total time[s] 0.072316 +Converged at iteration 24, L1 9.03505e-05, Linf 0.00303991, total time[s] 0.063631 +Converged at iteration 25, L1 7.29508e-05, Linf 0.00406112, total time[s] 0.065775 +Converged at iteration 39, L1 9.09195e-05, Linf 0.00525577, total time[s] 0.104964 +Converged at iteration 36, L1 6.7719e-05, Linf 0.00370176, total time[s] 0.092712 +Converged at iteration 27, L1 7.05843e-05, Linf 0.00583025, total time[s] 0.07005 +Converged at iteration 30, L1 9.84639e-05, Linf 0.0061001, total time[s] 0.081837 +Converged at iteration 26, L1 9.28221e-05, Linf 0.00667445, total time[s] 0.075264 +Converged at iteration 22, L1 6.39393e-05, Linf 0.00421727, total time[s] 0.069244 +Converged at iteration 20, L1 6.99279e-05, Linf 0.00497373, total time[s] 0.059501 +Converged at iteration 22, L1 8.02894e-05, Linf 0.00704733, total time[s] 0.066898 +Converged at iteration 27, L1 6.37493e-05, Linf 0.00514864, total time[s] 0.07225 +Converged at iteration 25, L1 9.53945e-05, Linf 0.00473253, total time[s] 0.071724 +Converged at iteration 21, L1 5.92625e-05, Linf 0.0046315, total time[s] 0.055067 +Converged at iteration 17, L1 9.26426e-05, Linf 0.00515716, total time[s] 0.047369 +Converged at iteration 31, L1 8.94341e-05, Linf 0.00295153, total time[s] 0.082902 +Converged at iteration 20, L1 6.72824e-05, Linf 0.00504549, total time[s] 0.056174 +Converged at iteration 24, L1 6.07706e-05, Linf 0.00529109, total time[s] 0.0755 +Converged at iteration 28, L1 9.18526e-05, Linf 0.00414432, total time[s] 0.074216 +Converged at iteration 24, L1 8.29954e-05, Linf 0.00602424, total time[s] 0.062339 +Converged at iteration 22, L1 8.74432e-05, Linf 0.00439218, total time[s] 0.058009 +Converged at iteration 23, L1 8.22983e-05, Linf 0.00364031, total time[s] 0.061455 +Converged at iteration 25, L1 8.92278e-05, Linf 0.00577498, total time[s] 0.064746 +Converged at iteration 28, L1 9.83707e-05, Linf 0.00605578, total time[s] 0.072546 +Converged at iteration 30, L1 9.43977e-05, Linf 0.00499355, total time[s] 0.077254 +Converged at iteration 29, L1 7.62373e-05, Linf 0.00311002, total time[s] 0.074337 +Converged at iteration 29, L1 9.05084e-05, Linf 0.00312387, total time[s] 0.074162 +Converged at iteration 31, L1 8.05427e-05, Linf 0.00323275, total time[s] 0.078305 +Converged at iteration 32, L1 8.63783e-05, Linf 0.00444857, total time[s] 0.080498 +Converged at iteration 33, L1 6.8976e-05, Linf 0.00508015, total time[s] 0.098298 +Converged at iteration 28, L1 8.38952e-05, Linf 0.00456288, total time[s] 0.078025 +Converged at iteration 24, L1 8.9891e-05, Linf 0.00302717, total time[s] 0.064358 +Converged at iteration 25, L1 7.41364e-05, Linf 0.00410189, total time[s] 0.067382 +Converged at iteration 39, L1 9.15106e-05, Linf 0.00525931, total time[s] 0.105029 +Converged at iteration 36, L1 6.79627e-05, Linf 0.00365965, total time[s] 0.098407 +Converged at iteration 27, L1 7.20822e-05, Linf 0.00586548, total time[s] 0.070278 +Converged at iteration 30, L1 9.81713e-05, Linf 0.00610007, total time[s] 0.077614 +Converged at iteration 26, L1 9.18359e-05, Linf 0.00641528, total time[s] 0.067667 +Converged at iteration 22, L1 6.35114e-05, Linf 0.00421962, total time[s] 0.05852 +Converged at iteration 20, L1 7.04071e-05, Linf 0.00498355, total time[s] 0.053879 +Converged at iteration 22, L1 8.15217e-05, Linf 0.00706883, total time[s] 0.058561 +Converged at iteration 27, L1 6.44381e-05, Linf 0.00517957, total time[s] 0.077704 +Converged at iteration 25, L1 9.57621e-05, Linf 0.0047565, total time[s] 0.082046 +Converged at iteration 21, L1 5.93458e-05, Linf 0.00462859, total time[s] 0.061134 +Converged at iteration 17, L1 9.31116e-05, Linf 0.00514496, total time[s] 0.048251 +Converged at iteration 31, L1 8.91482e-05, Linf 0.0029772, total time[s] 0.080531 +Converged at iteration 20, L1 6.76186e-05, Linf 0.00492949, total time[s] 0.054424 +Converged at iteration 24, L1 6.07406e-05, Linf 0.00493697, total time[s] 0.074789 +Converged at iteration 28, L1 9.2435e-05, Linf 0.00414629, total time[s] 0.089721 +Converged at iteration 24, L1 8.33149e-05, Linf 0.00602144, total time[s] 0.075411 +Converged at iteration 22, L1 8.75538e-05, Linf 0.00439119, total time[s] 0.101559 +Converged at iteration 23, L1 8.26326e-05, Linf 0.00352597, total time[s] 0.081252 +Converged at iteration 25, L1 8.94729e-05, Linf 0.00581246, total time[s] 0.07939 +Converged at iteration 28, L1 9.84832e-05, Linf 0.00594943, total time[s] 0.088824 +Converged at iteration 30, L1 9.48786e-05, Linf 0.00497904, total time[s] 0.080614 +Converged at iteration 29, L1 7.67324e-05, Linf 0.00310252, total time[s] 0.085405 +Converged at iteration 29, L1 9.0368e-05, Linf 0.00313495, total time[s] 0.073527 +Converged at iteration 31, L1 8.0857e-05, Linf 0.00324794, total time[s] 0.077974 +Converged at iteration 32, L1 8.78161e-05, Linf 0.00451218, total time[s] 0.080068 +Converged at iteration 33, L1 6.91957e-05, Linf 0.00513306, total time[s] 0.083527 +Converged at iteration 28, L1 8.45902e-05, Linf 0.00455523, total time[s] 0.070892 +Converged at iteration 24, L1 8.99442e-05, Linf 0.00302107, total time[s] 0.063024 +Converged at iteration 25, L1 7.48377e-05, Linf 0.00411186, total time[s] 0.064617 +Converged at iteration 39, L1 9.17737e-05, Linf 0.00525133, total time[s] 0.097921 +Converged at iteration 36, L1 6.83084e-05, Linf 0.00368949, total time[s] 0.09445 +Converged at iteration 27, L1 7.15103e-05, Linf 0.00588717, total time[s] 0.07602 +Converged at iteration 30, L1 9.85421e-05, Linf 0.00610015, total time[s] 0.075509 +Converged at iteration 26, L1 9.18915e-05, Linf 0.00641991, total time[s] 0.066728 +Converged at iteration 22, L1 6.41388e-05, Linf 0.00421169, total time[s] 0.057903 +Converged at iteration 20, L1 7.01988e-05, Linf 0.00496749, total time[s] 0.054022 +Converged at iteration 22, L1 8.10007e-05, Linf 0.00716925, total time[s] 0.061208 +Converged at iteration 27, L1 6.42798e-05, Linf 0.00516559, total time[s] 0.081204 +Converged at iteration 25, L1 9.55658e-05, Linf 0.00475123, total time[s] 0.074149 +Converged at iteration 21, L1 5.9221e-05, Linf 0.00463004, total time[s] 0.092346 +Converged at iteration 17, L1 9.28587e-05, Linf 0.00515106, total time[s] 0.11234 +Converged at iteration 31, L1 8.93891e-05, Linf 0.00294981, total time[s] 0.098454 +Converged at iteration 20, L1 6.7508e-05, Linf 0.00506565, total time[s] 0.05392 +Converged at iteration 24, L1 6.06315e-05, Linf 0.00526183, total time[s] 0.059859 +Converged at iteration 28, L1 9.21037e-05, Linf 0.00414738, total time[s] 0.069156 +Converged at iteration 24, L1 8.48673e-05, Linf 0.00745624, total time[s] 0.060615 +Converged at iteration 22, L1 8.74359e-05, Linf 0.00439131, total time[s] 0.057263 +Converged at iteration 23, L1 8.33451e-05, Linf 0.00542745, total time[s] 0.063435 +Converged at iteration 25, L1 8.93648e-05, Linf 0.00581194, total time[s] 0.071655 +Converged at iteration 28, L1 9.84782e-05, Linf 0.00594688, total time[s] 0.071082 +Converged at iteration 30, L1 9.51537e-05, Linf 0.00499132, total time[s] 0.073615 +Converged at iteration 29, L1 7.7336e-05, Linf 0.00311299, total time[s] 0.071883 +Converged at iteration 29, L1 9.02208e-05, Linf 0.00310844, total time[s] 0.071332 +Converged at iteration 31, L1 8.05542e-05, Linf 0.00323935, total time[s] 0.076504 +Converged at iteration 32, L1 8.69114e-05, Linf 0.00450119, total time[s] 0.078334 +Converged at iteration 33, L1 6.91814e-05, Linf 0.00513381, total time[s] 0.080087 +Converged at iteration 28, L1 8.43771e-05, Linf 0.00455833, total time[s] 0.069759 +Converged at iteration 24, L1 8.98838e-05, Linf 0.00302408, total time[s] 0.062591 +Converged at iteration 25, L1 7.46137e-05, Linf 0.00411001, total time[s] 0.064842 +Converged at iteration 40, L1 6.81773e-05, Linf 0.00367319, total time[s] 0.137478 +Converged at iteration 35, L1 7.61871e-05, Linf 0.00339751, total time[s] 0.100506 +Converged at iteration 30, L1 9.6373e-05, Linf 0.00432638, total time[s] 0.083553 +Converged at iteration 31, L1 6.31831e-05, Linf 0.00502564, total time[s] 0.088936 +Converged at iteration 27, L1 6.27213e-05, Linf 0.00499708, total time[s] 0.073091 +Converged at iteration 22, L1 8.58989e-05, Linf 0.0044448, total time[s] 0.063793 +Converged at iteration 20, L1 9.61597e-05, Linf 0.00397833, total time[s] 0.122708 +Converged at iteration 24, L1 8.84238e-05, Linf 0.00482793, total time[s] 0.071049 +Converged at iteration 28, L1 7.41268e-05, Linf 0.00445906, total time[s] 0.094054 +Converged at iteration 26, L1 8.11714e-05, Linf 0.00548352, total time[s] 0.098525 +Converged at iteration 22, L1 7.39182e-05, Linf 0.00508698, total time[s] 0.077826 +Converged at iteration 19, L1 6.68558e-05, Linf 0.00393137, total time[s] 0.080211 +Converged at iteration 30, L1 8.00599e-05, Linf 0.00332962, total time[s] 0.100998 +Converged at iteration 20, L1 8.53341e-05, Linf 0.00499208, total time[s] 0.067514 +Converged at iteration 24, L1 7.13338e-05, Linf 0.00463295, total time[s] 0.085722 +Converged at iteration 31, L1 9.00794e-05, Linf 0.00569359, total time[s] 0.089067 +Converged at iteration 27, L1 9.99605e-05, Linf 0.00571234, total time[s] 0.081447 +Converged at iteration 24, L1 8.78947e-05, Linf 0.00465034, total time[s] 0.079233 +Converged at iteration 23, L1 9.21673e-05, Linf 0.00403485, total time[s] 0.064878 +Converged at iteration 26, L1 7.24935e-05, Linf 0.00446081, total time[s] 0.098753 +Converged at iteration 29, L1 7.81016e-05, Linf 0.00489885, total time[s] 0.096724 +Converged at iteration 34, L1 7.09767e-05, Linf 0.00431379, total time[s] 0.098523 +Converged at iteration 30, L1 9.39435e-05, Linf 0.00442594, total time[s] 0.092898 +Converged at iteration 28, L1 9.50194e-05, Linf 0.00310985, total time[s] 0.098239 +Converged at iteration 32, L1 9.43581e-05, Linf 0.00374388, total time[s] 0.104866 +Converged at iteration 37, L1 7.49906e-05, Linf 0.00327332, total time[s] 0.111355 +Converged at iteration 33, L1 8.45228e-05, Linf 0.00469109, total time[s] 0.092041 +Converged at iteration 28, L1 9.65741e-05, Linf 0.00430268, total time[s] 0.093351 +Converged at iteration 24, L1 8.82876e-05, Linf 0.00325072, total time[s] 0.066898 +Converged at iteration 26, L1 9.00441e-05, Linf 0.00383976, total time[s] 0.073108 +Converged at iteration 40, L1 6.67091e-05, Linf 0.00393425, total time[s] 0.106934 +Converged at iteration 35, L1 8.66302e-05, Linf 0.00360683, total time[s] 0.094821 +Converged at iteration 30, L1 9.1683e-05, Linf 0.00418081, total time[s] 0.085136 +Converged at iteration 31, L1 6.22115e-05, Linf 0.00504682, total time[s] 0.079984 +Converged at iteration 26, L1 9.84305e-05, Linf 0.00577556, total time[s] 0.066981 +Converged at iteration 22, L1 7.16667e-05, Linf 0.00418183, total time[s] 0.057558 +Converged at iteration 21, L1 6.40792e-05, Linf 0.00348498, total time[s] 0.056304 +Converged at iteration 24, L1 8.94291e-05, Linf 0.0049499, total time[s] 0.062404 +Converged at iteration 28, L1 7.32956e-05, Linf 0.00443335, total time[s] 0.071203 +Converged at iteration 26, L1 8.05746e-05, Linf 0.00536333, total time[s] 0.066922 +Converged at iteration 22, L1 7.02649e-05, Linf 0.00441475, total time[s] 0.059272 +Converged at iteration 19, L1 5.50685e-05, Linf 0.00332057, total time[s] 0.054913 +Converged at iteration 30, L1 9.51778e-05, Linf 0.00330732, total time[s] 0.07659 +Converged at iteration 20, L1 8.4424e-05, Linf 0.00473176, total time[s] 0.052605 +Converged at iteration 24, L1 7.16742e-05, Linf 0.00475322, total time[s] 0.062229 +Converged at iteration 31, L1 9.44306e-05, Linf 0.00481912, total time[s] 0.081239 +Converged at iteration 27, L1 9.40996e-05, Linf 0.00468279, total time[s] 0.071489 +Converged at iteration 24, L1 8.53185e-05, Linf 0.00429568, total time[s] 0.0853 +Converged at iteration 23, L1 9.2716e-05, Linf 0.00431905, total time[s] 0.077584 +Converged at iteration 26, L1 7.14498e-05, Linf 0.00465333, total time[s] 0.067359 +Converged at iteration 29, L1 7.68741e-05, Linf 0.00620321, total time[s] 0.082919 +Converged at iteration 34, L1 8.13579e-05, Linf 0.00406924, total time[s] 0.094704 +Converged at iteration 31, L1 7.17526e-05, Linf 0.00354642, total time[s] 0.097241 +Converged at iteration 29, L1 7.03531e-05, Linf 0.00272725, total time[s] 0.081375 +Converged at iteration 32, L1 8.24336e-05, Linf 0.00354633, total time[s] 0.080495 +Converged at iteration 36, L1 8.77731e-05, Linf 0.00357722, total time[s] 0.089782 +Converged at iteration 33, L1 8.32833e-05, Linf 0.00484761, total time[s] 0.09 +Converged at iteration 28, L1 9.1051e-05, Linf 0.00413215, total time[s] 0.073969 +Converged at iteration 24, L1 8.02405e-05, Linf 0.00290885, total time[s] 0.064765 +Converged at iteration 26, L1 8.4482e-05, Linf 0.003906, total time[s] 0.072392 +Converged at iteration 40, L1 6.56492e-05, Linf 0.00397415, total time[s] 0.100789 +Converged at iteration 35, L1 8.81499e-05, Linf 0.0036387, total time[s] 0.094324 +Converged at iteration 30, L1 9.04208e-05, Linf 0.00415818, total time[s] 0.080659 +Converged at iteration 31, L1 6.3857e-05, Linf 0.00738476, total time[s] 0.087089 +Converged at iteration 26, L1 9.8944e-05, Linf 0.00585738, total time[s] 0.073169 +Converged at iteration 22, L1 7.24427e-05, Linf 0.00421914, total time[s] 0.067529 +Converged at iteration 21, L1 6.40073e-05, Linf 0.00353332, total time[s] 0.061954 +Converged at iteration 24, L1 8.86676e-05, Linf 0.00494634, total time[s] 0.064199 +Converged at iteration 28, L1 7.27457e-05, Linf 0.00441754, total time[s] 0.080757 +Converged at iteration 26, L1 8.16283e-05, Linf 0.00524146, total time[s] 0.06689 +Converged at iteration 22, L1 6.93965e-05, Linf 0.00420952, total time[s] 0.058244 +Converged at iteration 18, L1 9.88278e-05, Linf 0.00403274, total time[s] 0.051138 +Converged at iteration 30, L1 9.77483e-05, Linf 0.0033381, total time[s] 0.078785 +Converged at iteration 20, L1 8.33094e-05, Linf 0.00474239, total time[s] 0.059084 +Converged at iteration 24, L1 7.12148e-05, Linf 0.00471221, total time[s] 0.064797 +Converged at iteration 31, L1 9.52061e-05, Linf 0.00448134, total time[s] 0.084456 +Converged at iteration 27, L1 8.97433e-05, Linf 0.0043368, total time[s] 0.068966 +Converged at iteration 24, L1 8.48576e-05, Linf 0.00415613, total time[s] 0.062555 +Converged at iteration 23, L1 9.15239e-05, Linf 0.00434486, total time[s] 0.060553 +Converged at iteration 26, L1 7.01554e-05, Linf 0.00468942, total time[s] 0.067087 +Converged at iteration 29, L1 7.45298e-05, Linf 0.00491811, total time[s] 0.07562 +Converged at iteration 34, L1 8.19792e-05, Linf 0.0037803, total time[s] 0.087826 +Converged at iteration 31, L1 7.25011e-05, Linf 0.00351137, total time[s] 0.081605 +Converged at iteration 29, L1 7.16731e-05, Linf 0.00274774, total time[s] 0.074437 +Converged at iteration 32, L1 8.10209e-05, Linf 0.00351791, total time[s] 0.080434 +Converged at iteration 36, L1 8.38169e-05, Linf 0.00353155, total time[s] 0.089792 +Converged at iteration 33, L1 8.22671e-05, Linf 0.00482233, total time[s] 0.082731 +Converged at iteration 28, L1 9.15412e-05, Linf 0.00414434, total time[s] 0.071787 +Converged at iteration 24, L1 8.12133e-05, Linf 0.0029612, total time[s] 0.067209 +Converged at iteration 26, L1 8.24843e-05, Linf 0.00390124, total time[s] 0.069127 +Converged at iteration 40, L1 6.50419e-05, Linf 0.00401148, total time[s] 0.099384 +Converged at iteration 35, L1 8.95746e-05, Linf 0.00367448, total time[s] 0.091492 +Converged at iteration 30, L1 8.94525e-05, Linf 0.00414411, total time[s] 0.076568 +Converged at iteration 31, L1 6.03755e-05, Linf 0.00506773, total time[s] 0.078264 +Converged at iteration 26, L1 9.93029e-05, Linf 0.00593683, total time[s] 0.06694 +Converged at iteration 22, L1 7.28803e-05, Linf 0.00430616, total time[s] 0.058131 +Converged at iteration 21, L1 6.3702e-05, Linf 0.00358072, total time[s] 0.055458 +Converged at iteration 24, L1 8.74003e-05, Linf 0.00495633, total time[s] 0.099135 +Converged at iteration 28, L1 7.21494e-05, Linf 0.0044055, total time[s] 0.079691 +Converged at iteration 26, L1 8.22592e-05, Linf 0.00510937, total time[s] 0.067152 +Converged at iteration 22, L1 6.79901e-05, Linf 0.00399451, total time[s] 0.056484 +Converged at iteration 18, L1 9.49782e-05, Linf 0.00384615, total time[s] 0.047127 +Converged at iteration 31, L1 6.75446e-05, Linf 0.00268044, total time[s] 0.076582 +Converged at iteration 20, L1 8.39793e-05, Linf 0.00499059, total time[s] 0.052017 +Converged at iteration 24, L1 7.04093e-05, Linf 0.00487366, total time[s] 0.060921 +Converged at iteration 31, L1 9.44797e-05, Linf 0.00411536, total time[s] 0.077569 +Converged at iteration 27, L1 8.34591e-05, Linf 0.0040089, total time[s] 0.069734 +Converged at iteration 24, L1 8.35073e-05, Linf 0.00401673, total time[s] 0.061602 +Converged at iteration 23, L1 9.06347e-05, Linf 0.00435847, total time[s] 0.074535 +Converged at iteration 26, L1 6.90278e-05, Linf 0.0047267, total time[s] 0.08171 +Converged at iteration 29, L1 7.34689e-05, Linf 0.00494256, total time[s] 0.09183 +Converged at iteration 34, L1 8.00589e-05, Linf 0.00345384, total time[s] 0.08922 +Converged at iteration 31, L1 7.54623e-05, Linf 0.00348402, total time[s] 0.086456 +Converged at iteration 29, L1 7.34025e-05, Linf 0.00277181, total time[s] 0.103513 +Converged at iteration 32, L1 8.0056e-05, Linf 0.00349122, total time[s] 0.087454 +Converged at iteration 36, L1 8.15331e-05, Linf 0.00348928, total time[s] 0.092285 +Converged at iteration 33, L1 8.13377e-05, Linf 0.00489413, total time[s] 0.08894 +Converged at iteration 28, L1 9.22293e-05, Linf 0.00424316, total time[s] 0.083603 +Converged at iteration 24, L1 8.22509e-05, Linf 0.00298853, total time[s] 0.06989 +Converged at iteration 26, L1 8.15204e-05, Linf 0.00388171, total time[s] 0.078229 +Converged at iteration 40, L1 6.57826e-05, Linf 0.0040355, total time[s] 0.100484 +Converged at iteration 35, L1 8.97204e-05, Linf 0.00374618, total time[s] 0.089699 +Converged at iteration 30, L1 9.00782e-05, Linf 0.00415166, total time[s] 0.077481 +Converged at iteration 31, L1 6.0821e-05, Linf 0.00501795, total time[s] 0.07996 +Converged at iteration 26, L1 9.91135e-05, Linf 0.00589699, total time[s] 0.069594 +Converged at iteration 22, L1 7.26578e-05, Linf 0.00423821, total time[s] 0.060368 +Converged at iteration 21, L1 6.38327e-05, Linf 0.00357017, total time[s] 0.057938 +Converged at iteration 24, L1 8.80219e-05, Linf 0.00494587, total time[s] 0.064115 +Converged at iteration 28, L1 7.20885e-05, Linf 0.00440934, total time[s] 0.074046 +Converged at iteration 26, L1 8.36386e-05, Linf 0.00964109, total time[s] 0.074541 +Converged at iteration 22, L1 6.93764e-05, Linf 0.0041031, total time[s] 0.068628 +Converged at iteration 18, L1 9.6939e-05, Linf 0.00393034, total time[s] 0.062797 +Converged at iteration 30, L1 9.90544e-05, Linf 0.00338823, total time[s] 0.081977 +Converged at iteration 20, L1 8.27334e-05, Linf 0.00467856, total time[s] 0.057486 +Converged at iteration 24, L1 7.01859e-05, Linf 0.0045539, total time[s] 0.069746 +Converged at iteration 31, L1 9.5062e-05, Linf 0.00429582, total time[s] 0.080352 +Converged at iteration 27, L1 8.66943e-05, Linf 0.00416969, total time[s] 0.073054 +Converged at iteration 24, L1 8.41705e-05, Linf 0.00406882, total time[s] 0.07036 +Converged at iteration 23, L1 9.14504e-05, Linf 0.00435024, total time[s] 0.07073 +Converged at iteration 26, L1 6.94148e-05, Linf 0.00470821, total time[s] 0.092456 +Converged at iteration 29, L1 7.40275e-05, Linf 0.00493161, total time[s] 0.077769 +Converged at iteration 34, L1 8.14038e-05, Linf 0.0036213, total time[s] 0.087754 +Converged at iteration 31, L1 7.44553e-05, Linf 0.00348231, total time[s] 0.085601 +Converged at iteration 29, L1 7.23875e-05, Linf 0.00275974, total time[s] 0.07953 +Converged at iteration 32, L1 8.04208e-05, Linf 0.00350432, total time[s] 0.095298 +Converged at iteration 36, L1 8.2233e-05, Linf 0.00350954, total time[s] 0.09289 +Converged at iteration 33, L1 8.17517e-05, Linf 0.00487973, total time[s] 0.08743 +Converged at iteration 28, L1 9.18352e-05, Linf 0.00421309, total time[s] 0.073936 +Converged at iteration 24, L1 8.17943e-05, Linf 0.00298734, total time[s] 0.075505 +Converged at iteration 26, L1 8.18145e-05, Linf 0.00389012, total time[s] 0.071206 +Converged at iteration 40, L1 6.55767e-05, Linf 0.00398306, total time[s] 0.104838 +Converged at iteration 35, L1 8.85108e-05, Linf 0.00364689, total time[s] 0.099478 +Converged at iteration 30, L1 9.0174e-05, Linf 0.00415387, total time[s] 0.079715 +Converged at iteration 31, L1 6.15849e-05, Linf 0.0050428, total time[s] 0.081501 +Converged at iteration 26, L1 9.91522e-05, Linf 0.00582115, total time[s] 0.074256 +Converged at iteration 22, L1 7.25324e-05, Linf 0.00418562, total time[s] 0.068443 +Converged at iteration 21, L1 6.3944e-05, Linf 0.00354514, total time[s] 0.065913 +Converged at iteration 24, L1 8.83361e-05, Linf 0.00494587, total time[s] 0.07021 +Converged at iteration 28, L1 7.22826e-05, Linf 0.00441348, total time[s] 0.074288 +Converged at iteration 26, L1 8.13432e-05, Linf 0.00521104, total time[s] 0.069206 +Converged at iteration 22, L1 6.98967e-05, Linf 0.00415663, total time[s] 0.062456 +Converged at iteration 18, L1 9.78553e-05, Linf 0.00398134, total time[s] 0.062183 +Converged at iteration 30, L1 9.84639e-05, Linf 0.00334587, total time[s] 0.095389 +Converged at iteration 20, L1 8.39125e-05, Linf 0.00497388, total time[s] 0.061178 +Converged at iteration 24, L1 7.04543e-05, Linf 0.00478402, total time[s] 0.064863 +Converged at iteration 31, L1 9.52171e-05, Linf 0.00438825, total time[s] 0.083522 +Converged at iteration 27, L1 8.82403e-05, Linf 0.0042777, total time[s] 0.072806 +Converged at iteration 24, L1 8.44496e-05, Linf 0.00411875, total time[s] 0.063653 +Converged at iteration 23, L1 9.14278e-05, Linf 0.00434458, total time[s] 0.060979 +Converged at iteration 26, L1 6.99816e-05, Linf 0.00469913, total time[s] 0.067764 +Converged at iteration 29, L1 7.43605e-05, Linf 0.00492521, total time[s] 0.074389 +Converged at iteration 34, L1 8.18336e-05, Linf 0.00366961, total time[s] 0.087078 +Converged at iteration 31, L1 7.39304e-05, Linf 0.00343025, total time[s] 0.108612 +Converged at iteration 29, L1 7.20682e-05, Linf 0.0027632, total time[s] 0.089719 +Converged at iteration 32, L1 8.10648e-05, Linf 0.0034945, total time[s] 0.087703 +Converged at iteration 36, L1 8.37634e-05, Linf 0.00352284, total time[s] 0.090495 +Converged at iteration 33, L1 8.20191e-05, Linf 0.00487462, total time[s] 0.092033 +Converged at iteration 28, L1 9.19501e-05, Linf 0.00419781, total time[s] 0.072334 +Converged at iteration 24, L1 8.15227e-05, Linf 0.00297428, total time[s] 0.063727 +Converged at iteration 26, L1 8.26548e-05, Linf 0.00389682, total time[s] 0.068629 +Converged at iteration 40, L1 6.70989e-05, Linf 0.0040306, total time[s] 0.104765 +Converged at iteration 35, L1 8.90194e-05, Linf 0.00365128, total time[s] 0.093134 +Converged at iteration 30, L1 9.0018e-05, Linf 0.00415337, total time[s] 0.079576 +Converged at iteration 31, L1 6.12974e-05, Linf 0.00504229, total time[s] 0.079635 +Converged at iteration 26, L1 9.91414e-05, Linf 0.00588669, total time[s] 0.067575 +Converged at iteration 22, L1 7.26933e-05, Linf 0.00423329, total time[s] 0.059347 +Converged at iteration 21, L1 6.40254e-05, Linf 0.00353608, total time[s] 0.056311 +Converged at iteration 24, L1 8.8176e-05, Linf 0.00493102, total time[s] 0.063891 +Converged at iteration 28, L1 7.21791e-05, Linf 0.00441631, total time[s] 0.073732 +Converged at iteration 26, L1 8.21434e-05, Linf 0.00518181, total time[s] 0.06832 +Converged at iteration 22, L1 6.86068e-05, Linf 0.00412972, total time[s] 0.066822 +Converged at iteration 18, L1 9.7388e-05, Linf 0.00394264, total time[s] 0.051799 +Converged at iteration 30, L1 9.8752e-05, Linf 0.00334975, total time[s] 0.077758 +Converged at iteration 20, L1 8.28735e-05, Linf 0.00474734, total time[s] 0.055714 +Converged at iteration 24, L1 7.03338e-05, Linf 0.00478967, total time[s] 0.072582 +Converged at iteration 31, L1 9.51566e-05, Linf 0.00434206, total time[s] 0.084158 +Converged at iteration 27, L1 8.74884e-05, Linf 0.00419949, total time[s] 0.075469 +Converged at iteration 24, L1 8.43116e-05, Linf 0.0041057, total time[s] 0.064417 +Converged at iteration 23, L1 9.11946e-05, Linf 0.004348, total time[s] 0.061487 +Converged at iteration 26, L1 6.97784e-05, Linf 0.0047032, total time[s] 0.071969 +Converged at iteration 29, L1 7.42297e-05, Linf 0.00492889, total time[s] 0.078497 +Converged at iteration 34, L1 8.16896e-05, Linf 0.00366189, total time[s] 0.088828 +Converged at iteration 31, L1 7.42037e-05, Linf 0.00342549, total time[s] 0.079683 +Converged at iteration 29, L1 7.22062e-05, Linf 0.00275674, total time[s] 0.082408 +Converged at iteration 32, L1 8.05662e-05, Linf 0.00350721, total time[s] 0.081419 +Converged at iteration 36, L1 8.26082e-05, Linf 0.00351511, total time[s] 0.090625 +Converged at iteration 33, L1 8.18755e-05, Linf 0.00487708, total time[s] 0.084189 +Converged at iteration 28, L1 9.17013e-05, Linf 0.00420641, total time[s] 0.072931 +Converged at iteration 24, L1 8.15932e-05, Linf 0.00298082, total time[s] 0.064142 +Converged at iteration 26, L1 8.19599e-05, Linf 0.00389351, total time[s] 0.068335 +Converged at iteration 40, L1 6.66604e-05, Linf 0.00398574, total time[s] 0.10128 +Converged at iteration 35, L1 8.85998e-05, Linf 0.00364897, total time[s] 0.091859 +Converged at iteration 30, L1 9.009e-05, Linf 0.00415384, total time[s] 0.081623 +Converged at iteration 31, L1 6.07254e-05, Linf 0.00504254, total time[s] 0.085824 +Converged at iteration 26, L1 9.90572e-05, Linf 0.00588189, total time[s] 0.069929 +Converged at iteration 22, L1 7.26677e-05, Linf 0.00423099, total time[s] 0.062823 +Converged at iteration 21, L1 6.38927e-05, Linf 0.00354802, total time[s] 0.06194 +Converged at iteration 24, L1 8.82589e-05, Linf 0.00494584, total time[s] 0.063413 +Converged at iteration 28, L1 7.22374e-05, Linf 0.00441246, total time[s] 0.079051 +Converged at iteration 26, L1 8.13995e-05, Linf 0.00520324, total time[s] 0.073266 +Converged at iteration 22, L1 6.88134e-05, Linf 0.0041436, total time[s] 0.076976 +Converged at iteration 18, L1 9.76095e-05, Linf 0.00396861, total time[s] 0.050988 +Converged at iteration 30, L1 9.8624e-05, Linf 0.00334785, total time[s] 0.080774 +Converged at iteration 20, L1 8.29254e-05, Linf 0.00474625, total time[s] 0.053513 +Converged at iteration 24, L1 7.04039e-05, Linf 0.00478386, total time[s] 0.063601 +Converged at iteration 31, L1 9.51975e-05, Linf 0.00436725, total time[s] 0.080892 +Converged at iteration 27, L1 8.78509e-05, Linf 0.00423126, total time[s] 0.070604 +Converged at iteration 24, L1 8.44053e-05, Linf 0.00411421, total time[s] 0.067292 +Converged at iteration 23, L1 9.1244e-05, Linf 0.00434686, total time[s] 0.067783 +Converged at iteration 26, L1 6.99215e-05, Linf 0.00470883, total time[s] 0.073959 +Converged at iteration 29, L1 7.42336e-05, Linf 0.00492708, total time[s] 0.076139 +Converged at iteration 34, L1 8.1763e-05, Linf 0.00368072, total time[s] 0.099173 +Converged at iteration 31, L1 7.40767e-05, Linf 0.00349226, total time[s] 0.091626 +Converged at iteration 29, L1 7.22142e-05, Linf 0.00274897, total time[s] 0.082842 +Converged at iteration 32, L1 8.08734e-05, Linf 0.003509, total time[s] 0.087427 +Converged at iteration 36, L1 8.28223e-05, Linf 0.00351802, total time[s] 0.092814 +Converged at iteration 33, L1 8.19363e-05, Linf 0.00487587, total time[s] 0.086074 +Converged at iteration 28, L1 9.16737e-05, Linf 0.00420279, total time[s] 0.07397 +Converged at iteration 24, L1 8.15309e-05, Linf 0.002978, total time[s] 0.068052 +Converged at iteration 26, L1 8.20883e-05, Linf 0.00389478, total time[s] 0.074347 +Converged at iteration 40, L1 6.56197e-05, Linf 0.00398345, total time[s] 0.109883 +Converged at iteration 35, L1 8.85593e-05, Linf 0.0036479, total time[s] 0.097554 +Converged at iteration 30, L1 9.01103e-05, Linf 0.00415416, total time[s] 0.077286 +Converged at iteration 31, L1 6.07479e-05, Linf 0.00504267, total time[s] 0.07971 +Converged at iteration 26, L1 9.91249e-05, Linf 0.00587964, total time[s] 0.067803 +Converged at iteration 22, L1 7.26267e-05, Linf 0.00422985, total time[s] 0.060987 +Converged at iteration 21, L1 6.39328e-05, Linf 0.00354658, total time[s] 0.057773 +Converged at iteration 24, L1 8.83704e-05, Linf 0.00494599, total time[s] 0.065124 +Converged at iteration 28, L1 7.22548e-05, Linf 0.00441298, total time[s] 0.074785 +Converged at iteration 26, L1 8.13694e-05, Linf 0.00520743, total time[s] 0.06928 +Converged at iteration 22, L1 6.87419e-05, Linf 0.00414987, total time[s] 0.062453 +Converged at iteration 18, L1 9.77318e-05, Linf 0.00397491, total time[s] 0.051949 +Converged at iteration 30, L1 9.8479e-05, Linf 0.00334691, total time[s] 0.098343 +Converged at iteration 20, L1 8.2966e-05, Linf 0.00474573, total time[s] 0.102327 +Converged at iteration 24, L1 7.037e-05, Linf 0.00478346, total time[s] 0.067348 +Converged at iteration 31, L1 9.53238e-05, Linf 0.00438038, total time[s] 0.081388 +Converged at iteration 27, L1 8.80858e-05, Linf 0.00424221, total time[s] 0.074469 +Converged at iteration 24, L1 8.44276e-05, Linf 0.00411876, total time[s] 0.071026 +Converged at iteration 23, L1 9.12866e-05, Linf 0.00434627, total time[s] 0.062693 +Converged at iteration 26, L1 6.9735e-05, Linf 0.00470035, total time[s] 0.071267 +Converged at iteration 29, L1 7.42173e-05, Linf 0.0049214, total time[s] 0.077626 +Converged at iteration 34, L1 8.18196e-05, Linf 0.00369168, total time[s] 0.087839 +Converged at iteration 31, L1 7.39976e-05, Linf 0.00349422, total time[s] 0.082152 +Converged at iteration 29, L1 7.21027e-05, Linf 0.00277211, total time[s] 0.085413 +Converged at iteration 32, L1 8.08066e-05, Linf 0.00350998, total time[s] 0.085965 +Converged at iteration 36, L1 8.2905e-05, Linf 0.00353713, total time[s] 0.100786 +Converged at iteration 33, L1 8.199e-05, Linf 0.00487554, total time[s] 0.088928 +Converged at iteration 28, L1 9.16634e-05, Linf 0.00420107, total time[s] 0.079063 +Converged at iteration 24, L1 8.15921e-05, Linf 0.00297592, total time[s] 0.067139 +Converged at iteration 26, L1 8.26156e-05, Linf 0.00391256, total time[s] 0.070854 +Converged at iteration 40, L1 6.62338e-05, Linf 0.00398369, total time[s] 0.1227 +Converged at iteration 35, L1 8.85348e-05, Linf 0.00364738, total time[s] 0.099271 +Converged at iteration 30, L1 9.01175e-05, Linf 0.00415438, total time[s] 0.080194 +Converged at iteration 31, L1 6.18504e-05, Linf 0.00504274, total time[s] 0.08181 +Converged at iteration 26, L1 9.94108e-05, Linf 0.00587818, total time[s] 0.068531 +Converged at iteration 22, L1 7.25981e-05, Linf 0.00422932, total time[s] 0.059635 +Converged at iteration 21, L1 6.39113e-05, Linf 0.00354585, total time[s] 0.05705 +Converged at iteration 24, L1 8.83232e-05, Linf 0.00494578, total time[s] 0.067124 +Converged at iteration 28, L1 7.23819e-05, Linf 0.00440662, total time[s] 0.086856 +Converged at iteration 26, L1 8.25433e-05, Linf 0.00519282, total time[s] 0.075584 +Converged at iteration 22, L1 7.0521e-05, Linf 0.00415326, total time[s] 0.064072 +Converged at iteration 18, L1 9.7788e-05, Linf 0.00397809, total time[s] 0.048655 +Converged at iteration 30, L1 9.85216e-05, Linf 0.00334636, total time[s] 0.085036 +Converged at iteration 20, L1 8.29901e-05, Linf 0.00484889, total time[s] 0.067628 +Converged at iteration 24, L1 7.05801e-05, Linf 0.00478265, total time[s] 0.071219 +Converged at iteration 31, L1 9.4778e-05, Linf 0.00438897, total time[s] 0.081679 +Converged at iteration 27, L1 8.81342e-05, Linf 0.00424765, total time[s] 0.076059 +Converged at iteration 24, L1 8.61536e-05, Linf 0.00625053, total time[s] 0.066654 +Converged at iteration 23, L1 9.13065e-05, Linf 0.00434601, total time[s] 0.064447 +Converged at iteration 26, L1 6.97655e-05, Linf 0.00469963, total time[s] 0.076399 +Converged at iteration 29, L1 7.43321e-05, Linf 0.00492574, total time[s] 0.082326 +Converged at iteration 34, L1 8.18034e-05, Linf 0.00369641, total time[s] 0.09091 +Converged at iteration 31, L1 7.39664e-05, Linf 0.00342919, total time[s] 0.081331 +Converged at iteration 29, L1 7.20505e-05, Linf 0.00275429, total time[s] 0.080227 +Converged at iteration 32, L1 8.07006e-05, Linf 0.00351034, total time[s] 0.085142 +Converged at iteration 36, L1 8.33429e-05, Linf 0.00352532, total time[s] 0.09685 +Converged at iteration 33, L1 8.2048e-05, Linf 0.00487488, total time[s] 0.090865 +Converged at iteration 28, L1 9.16515e-05, Linf 0.00420011, total time[s] 0.074044 +Converged at iteration 24, L1 8.15262e-05, Linf 0.00297518, total time[s] 0.063712 +Converged at iteration 26, L1 8.28399e-05, Linf 0.0039129, total time[s] 0.074817 +Converged at iteration 40, L1 6.56376e-05, Linf 0.00398263, total time[s] 0.101811 +Converged at iteration 35, L1 8.8693e-05, Linf 0.00364854, total time[s] 0.093858 +Converged at iteration 30, L1 9.02562e-05, Linf 0.00415446, total time[s] 0.079261 +Converged at iteration 31, L1 6.24751e-05, Linf 0.00504277, total time[s] 0.081244 +Converged at iteration 26, L1 9.92921e-05, Linf 0.00587767, total time[s] 0.069222 +Converged at iteration 22, L1 7.25363e-05, Linf 0.00422904, total time[s] 0.059719 +Converged at iteration 21, L1 6.39393e-05, Linf 0.00354547, total time[s] 0.057594 +Converged at iteration 24, L1 8.83743e-05, Linf 0.00494609, total time[s] 0.064617 +Converged at iteration 28, L1 7.25364e-05, Linf 0.00441341, total time[s] 0.075111 +Converged at iteration 26, L1 8.20732e-05, Linf 0.00521064, total time[s] 0.069601 +Converged at iteration 22, L1 6.90305e-05, Linf 0.00415521, total time[s] 0.059345 +Converged at iteration 18, L1 9.78075e-05, Linf 0.00397973, total time[s] 0.052724 +Converged at iteration 30, L1 9.84175e-05, Linf 0.00334614, total time[s] 0.110022 +Converged at iteration 20, L1 8.29929e-05, Linf 0.00474536, total time[s] 0.055447 +Converged at iteration 24, L1 7.04266e-05, Linf 0.00478217, total time[s] 0.064534 +Converged at iteration 31, L1 9.52041e-05, Linf 0.00438547, total time[s] 0.086603 +Converged at iteration 27, L1 8.84427e-05, Linf 0.00424996, total time[s] 0.073163 +Converged at iteration 24, L1 8.4469e-05, Linf 0.00412158, total time[s] 0.062957 +Converged at iteration 23, L1 9.13002e-05, Linf 0.00434584, total time[s] 0.061661 +Converged at iteration 26, L1 6.97674e-05, Linf 0.00469947, total time[s] 0.070548 +Converged at iteration 29, L1 7.45627e-05, Linf 0.00492514, total time[s] 0.080026 +Converged at iteration 34, L1 8.17985e-05, Linf 0.00369913, total time[s] 0.089686 +Converged at iteration 31, L1 7.39878e-05, Linf 0.00352936, total time[s] 0.086937 +Converged at iteration 29, L1 7.20401e-05, Linf 0.0027541, total time[s] 0.089419 +Converged at iteration 32, L1 8.08588e-05, Linf 0.0035099, total time[s] 0.082697 +Converged at iteration 36, L1 8.36973e-05, Linf 0.00352044, total time[s] 0.091979 +Converged at iteration 33, L1 8.20098e-05, Linf 0.00487475, total time[s] 0.084725 +Converged at iteration 28, L1 9.16451e-05, Linf 0.00420515, total time[s] 0.075218 +Converged at iteration 24, L1 8.14728e-05, Linf 0.00297475, total time[s] 0.06482 +Converged at iteration 26, L1 8.21151e-05, Linf 0.00389596, total time[s] 0.071152 +Converged at iteration 40, L1 6.6165e-05, Linf 0.00394619, total time[s] 0.114557 +Converged at iteration 35, L1 8.85994e-05, Linf 0.00361588, total time[s] 0.095435 +Converged at iteration 30, L1 9.01541e-05, Linf 0.00417226, total time[s] 0.091926 +Converged at iteration 31, L1 6.07805e-05, Linf 0.00504276, total time[s] 0.089595 +Converged at iteration 26, L1 9.90179e-05, Linf 0.00582176, total time[s] 0.076725 +Converged at iteration 22, L1 7.26832e-05, Linf 0.00422915, total time[s] 0.070094 +Converged at iteration 21, L1 6.4025e-05, Linf 0.00354597, total time[s] 0.058431 +Converged at iteration 24, L1 8.83242e-05, Linf 0.00494598, total time[s] 0.10353 +Converged at iteration 28, L1 7.22767e-05, Linf 0.00441329, total time[s] 0.075959 +Converged at iteration 26, L1 8.19066e-05, Linf 0.00520958, total time[s] 0.075453 +Converged at iteration 22, L1 6.88268e-05, Linf 0.00415409, total time[s] 0.061736 +Converged at iteration 18, L1 9.78063e-05, Linf 0.00397889, total time[s] 0.055551 +Converged at iteration 30, L1 9.85842e-05, Linf 0.00334627, total time[s] 0.094809 +Converged at iteration 20, L1 8.40633e-05, Linf 0.00479, total time[s] 0.06921 +Converged at iteration 24, L1 7.0335e-05, Linf 0.00477946, total time[s] 0.071519 +Converged at iteration 31, L1 9.54371e-05, Linf 0.00438644, total time[s] 0.079668 +Converged at iteration 27, L1 8.82323e-05, Linf 0.00424842, total time[s] 0.069981 +Converged at iteration 24, L1 8.4457e-05, Linf 0.00412103, total time[s] 0.063519 +Converged at iteration 23, L1 9.12964e-05, Linf 0.00434599, total time[s] 0.060634 +Converged at iteration 26, L1 6.97791e-05, Linf 0.00479658, total time[s] 0.067839 +Converged at iteration 29, L1 7.44788e-05, Linf 0.00492917, total time[s] 0.074215 +Converged at iteration 34, L1 8.18323e-05, Linf 0.00369671, total time[s] 0.085629 +Converged at iteration 31, L1 7.39663e-05, Linf 0.00349488, total time[s] 0.081121 +Converged at iteration 29, L1 7.20561e-05, Linf 0.00277066, total time[s] 0.074925 +Converged at iteration 32, L1 8.10486e-05, Linf 0.00351066, total time[s] 0.08936 +Converged at iteration 36, L1 8.30854e-05, Linf 0.00351989, total time[s] 0.09776 +Converged at iteration 33, L1 8.2025e-05, Linf 0.00487482, total time[s] 0.097078 +Converged at iteration 28, L1 9.18149e-05, Linf 0.00419998, total time[s] 0.080553 +Converged at iteration 24, L1 8.14824e-05, Linf 0.00297499, total time[s] 0.073152 +Converged at iteration 26, L1 8.21114e-05, Linf 0.00389585, total time[s] 0.068379 +Converged at iteration 40, L1 6.55659e-05, Linf 0.00398369, total time[s] 0.100941 +Converged at iteration 35, L1 8.85219e-05, Linf 0.00364722, total time[s] 0.092104 +Converged at iteration 30, L1 9.01412e-05, Linf 0.00415474, total time[s] 0.078937 +Converged at iteration 31, L1 6.17655e-05, Linf 0.00504276, total time[s] 0.079773 +Converged at iteration 26, L1 9.9018e-05, Linf 0.00587783, total time[s] 0.067337 +Converged at iteration 22, L1 7.25259e-05, Linf 0.00422892, total time[s] 0.06081 +Converged at iteration 21, L1 6.39256e-05, Linf 0.00354559, total time[s] 0.05862 +Converged at iteration 24, L1 8.83309e-05, Linf 0.00495822, total time[s] 0.065962 +Converged at iteration 28, L1 7.22723e-05, Linf 0.00441825, total time[s] 0.076182 +Converged at iteration 26, L1 8.2402e-05, Linf 0.00521021, total time[s] 0.073009 +Converged at iteration 22, L1 6.95798e-05, Linf 0.00412398, total time[s] 0.061642 +Converged at iteration 18, L1 9.77788e-05, Linf 0.00397947, total time[s] 0.049122 +Converged at iteration 30, L1 9.8424e-05, Linf 0.00334619, total time[s] 0.079324 +Converged at iteration 20, L1 8.30441e-05, Linf 0.0047456, total time[s] 0.056302 +Converged at iteration 24, L1 7.05604e-05, Linf 0.00478218, total time[s] 0.064429 +Converged at iteration 31, L1 9.51635e-05, Linf 0.00438456, total time[s] 0.080889 +Converged at iteration 27, L1 8.8172e-05, Linf 0.00424892, total time[s] 0.071654 +Converged at iteration 24, L1 8.44456e-05, Linf 0.00412132, total time[s] 0.064702 +Converged at iteration 23, L1 9.12953e-05, Linf 0.00434585, total time[s] 0.062743 +Converged at iteration 26, L1 6.99794e-05, Linf 0.00469926, total time[s] 0.069617 +Converged at iteration 29, L1 7.42847e-05, Linf 0.00492594, total time[s] 0.081162 +Converged at iteration 34, L1 8.17912e-05, Linf 0.00369867, total time[s] 0.088271 +Converged at iteration 31, L1 7.39711e-05, Linf 0.00349474, total time[s] 0.099182 +Converged at iteration 29, L1 7.20368e-05, Linf 0.00275399, total time[s] 0.076387 +Converged at iteration 32, L1 8.12534e-05, Linf 0.00351069, total time[s] 0.086666 +Converged at iteration 36, L1 8.40271e-05, Linf 0.00352006, total time[s] 0.09607 +Converged at iteration 33, L1 8.1995e-05, Linf 0.00487473, total time[s] 0.087668 +Converged at iteration 28, L1 9.16548e-05, Linf 0.00419984, total time[s] 0.074373 +Converged at iteration 24, L1 8.14776e-05, Linf 0.00297479, total time[s] 0.065025 +Converged at iteration 26, L1 8.21381e-05, Linf 0.0038973, total time[s] 0.07401 +Converged at iteration 40, L1 6.55683e-05, Linf 0.00398353, total time[s] 0.116685 +Converged at iteration 35, L1 8.8476e-05, Linf 0.0036883, total time[s] 0.094099 +Converged at iteration 30, L1 9.0571e-05, Linf 0.0041663, total time[s] 0.078533 +Converged at iteration 31, L1 6.07646e-05, Linf 0.00504275, total time[s] 0.081839 +Converged at iteration 26, L1 9.90359e-05, Linf 0.0058778, total time[s] 0.070212 +Converged at iteration 22, L1 7.26473e-05, Linf 0.00422907, total time[s] 0.061577 +Converged at iteration 21, L1 6.40075e-05, Linf 0.00354594, total time[s] 0.05891 +Converged at iteration 24, L1 8.8327e-05, Linf 0.00493109, total time[s] 0.064804 +Converged at iteration 28, L1 7.22804e-05, Linf 0.00441273, total time[s] 0.074966 +Converged at iteration 26, L1 8.13487e-05, Linf 0.0052097, total time[s] 0.072279 +Converged at iteration 22, L1 6.87772e-05, Linf 0.00415476, total time[s] 0.067036 +Converged at iteration 18, L1 9.79654e-05, Linf 0.00397909, total time[s] 0.049186 +Converged at iteration 30, L1 9.84212e-05, Linf 0.00334631, total time[s] 0.077161 +Converged at iteration 20, L1 8.29187e-05, Linf 0.00475045, total time[s] 0.054855 +Converged at iteration 24, L1 7.19535e-05, Linf 0.00619513, total time[s] 0.072975 +Converged at iteration 31, L1 9.53814e-05, Linf 0.00438415, total time[s] 0.08804 +Converged at iteration 27, L1 8.8148e-05, Linf 0.00424764, total time[s] 0.070927 +Converged at iteration 24, L1 8.44943e-05, Linf 0.00412127, total time[s] 0.062166 +Converged at iteration 23, L1 9.12941e-05, Linf 0.00434564, total time[s] 0.060586 +Converged at iteration 26, L1 6.98598e-05, Linf 0.00469909, total time[s] 0.068169 +Converged at iteration 29, L1 7.58007e-05, Linf 0.00688037, total time[s] 0.075518 +Converged at iteration 34, L1 8.18064e-05, Linf 0.00371143, total time[s] 0.087926 +Converged at iteration 31, L1 7.39558e-05, Linf 0.00346524, total time[s] 0.079264 +Converged at iteration 29, L1 7.21362e-05, Linf 0.00274078, total time[s] 0.073689 +Converged at iteration 32, L1 8.09452e-05, Linf 0.00352938, total time[s] 0.080666 +Converged at iteration 36, L1 8.36557e-05, Linf 0.00353904, total time[s] 0.089882 +Converged at iteration 33, L1 8.20316e-05, Linf 0.00487517, total time[s] 0.082921 +Converged at iteration 28, L1 9.15999e-05, Linf 0.00420008, total time[s] 0.071878 +Converged at iteration 24, L1 8.15069e-05, Linf 0.00297485, total time[s] 0.061777 +Converged at iteration 26, L1 8.22114e-05, Linf 0.00389583, total time[s] 0.067165 +Converged at iteration 40, L1 6.83976e-05, Linf 0.00367991, total time[s] 0.170307 +Converged at iteration 35, L1 7.71109e-05, Linf 0.00340478, total time[s] 0.120015 +Converged at iteration 30, L1 9.68127e-05, Linf 0.00432317, total time[s] 0.076886 +Converged at iteration 31, L1 6.20162e-05, Linf 0.00500251, total time[s] 0.079192 +Converged at iteration 27, L1 6.26787e-05, Linf 0.00499539, total time[s] 0.06991 +Converged at iteration 22, L1 8.63468e-05, Linf 0.0044882, total time[s] 0.057972 +Converged at iteration 20, L1 9.61871e-05, Linf 0.00402605, total time[s] 0.056585 +Converged at iteration 24, L1 8.84468e-05, Linf 0.00482802, total time[s] 0.062423 +Converged at iteration 28, L1 7.39705e-05, Linf 0.00445907, total time[s] 0.076631 +Converged at iteration 26, L1 8.14558e-05, Linf 0.00545193, total time[s] 0.07504 +Converged at iteration 22, L1 7.39234e-05, Linf 0.00508748, total time[s] 0.063618 +Converged at iteration 19, L1 6.6313e-05, Linf 0.003931, total time[s] 0.055107 +Converged at iteration 30, L1 7.98882e-05, Linf 0.00326931, total time[s] 0.077218 +Converged at iteration 20, L1 8.45104e-05, Linf 0.004653, total time[s] 0.05369 +Converged at iteration 24, L1 7.11542e-05, Linf 0.00485662, total time[s] 0.067796 +Converged at iteration 31, L1 8.93406e-05, Linf 0.00570021, total time[s] 0.079555 +Converged at iteration 27, L1 9.91453e-05, Linf 0.00569956, total time[s] 0.069806 +Converged at iteration 24, L1 8.79223e-05, Linf 0.00465064, total time[s] 0.06342 +Converged at iteration 23, L1 9.21886e-05, Linf 0.0041288, total time[s] 0.060216 +Converged at iteration 26, L1 7.21886e-05, Linf 0.00446084, total time[s] 0.067275 +Converged at iteration 29, L1 7.8203e-05, Linf 0.0048993, total time[s] 0.07492 +Converged at iteration 34, L1 7.19325e-05, Linf 0.00412721, total time[s] 0.096089 +Converged at iteration 30, L1 9.39264e-05, Linf 0.00433005, total time[s] 0.087537 +Converged at iteration 28, L1 9.5293e-05, Linf 0.00311073, total time[s] 0.113305 +Converged at iteration 32, L1 9.51614e-05, Linf 0.0037657, total time[s] 0.089502 +Converged at iteration 37, L1 7.37116e-05, Linf 0.00327861, total time[s] 0.14895 +Converged at iteration 33, L1 8.46566e-05, Linf 0.00474296, total time[s] 0.101758 +Converged at iteration 28, L1 9.68919e-05, Linf 0.00426268, total time[s] 0.073453 +Converged at iteration 24, L1 8.83136e-05, Linf 0.00325703, total time[s] 0.062289 +Converged at iteration 26, L1 8.99034e-05, Linf 0.0038396, total time[s] 0.079689 +Converged at iteration 40, L1 6.70491e-05, Linf 0.00393397, total time[s] 0.142672 +Converged at iteration 35, L1 8.66333e-05, Linf 0.00360876, total time[s] 0.114454 +Converged at iteration 30, L1 9.1688e-05, Linf 0.00420057, total time[s] 0.101575 +Converged at iteration 31, L1 6.20032e-05, Linf 0.00502319, total time[s] 0.102319 +Converged at iteration 26, L1 9.84553e-05, Linf 0.00577619, total time[s] 0.096819 +Converged at iteration 22, L1 7.17165e-05, Linf 0.00418141, total time[s] 0.067017 +Converged at iteration 21, L1 6.41016e-05, Linf 0.00348468, total time[s] 0.065624 +Converged at iteration 24, L1 8.93957e-05, Linf 0.00495028, total time[s] 0.075202 +Converged at iteration 28, L1 7.3328e-05, Linf 0.00443342, total time[s] 0.073804 +Converged at iteration 26, L1 8.01706e-05, Linf 0.00536267, total time[s] 0.07497 +Converged at iteration 22, L1 7.04426e-05, Linf 0.00442005, total time[s] 0.058469 +Converged at iteration 19, L1 5.49336e-05, Linf 0.00332059, total time[s] 0.052579 +Converged at iteration 30, L1 9.51796e-05, Linf 0.00330744, total time[s] 0.081983 +Converged at iteration 20, L1 8.42567e-05, Linf 0.0047269, total time[s] 0.057611 +Converged at iteration 24, L1 7.12438e-05, Linf 0.00452981, total time[s] 0.065218 +Converged at iteration 31, L1 9.43743e-05, Linf 0.00482, total time[s] 0.095224 +Converged at iteration 27, L1 9.41311e-05, Linf 0.00468405, total time[s] 0.077834 +Converged at iteration 24, L1 8.51933e-05, Linf 0.00428104, total time[s] 0.065644 +Converged at iteration 23, L1 9.24294e-05, Linf 0.00431941, total time[s] 0.064033 +Converged at iteration 26, L1 7.25074e-05, Linf 0.00488102, total time[s] 0.073007 +Converged at iteration 29, L1 7.55623e-05, Linf 0.00488643, total time[s] 0.080585 +Converged at iteration 34, L1 8.13674e-05, Linf 0.00406153, total time[s] 0.088781 +Converged at iteration 31, L1 7.17265e-05, Linf 0.00355216, total time[s] 0.081388 +Converged at iteration 29, L1 7.02728e-05, Linf 0.00272738, total time[s] 0.077348 +Converged at iteration 32, L1 8.28404e-05, Linf 0.00354502, total time[s] 0.083857 +Converged at iteration 36, L1 8.71711e-05, Linf 0.00357869, total time[s] 0.09329 +Converged at iteration 33, L1 8.3278e-05, Linf 0.00484747, total time[s] 0.086295 +Converged at iteration 28, L1 9.12006e-05, Linf 0.00413152, total time[s] 0.075007 +Converged at iteration 24, L1 8.02723e-05, Linf 0.00290884, total time[s] 0.064367 +Converged at iteration 26, L1 8.44202e-05, Linf 0.00390642, total time[s] 0.069994 +Converged at iteration 40, L1 6.4462e-05, Linf 0.00418843, total time[s] 0.107551 +Converged at iteration 35, L1 9.63248e-05, Linf 0.003857, total time[s] 0.093 +Converged at iteration 30, L1 7.67203e-05, Linf 0.00420677, total time[s] 0.079285 +Converged at iteration 31, L1 6.15767e-05, Linf 0.00506464, total time[s] 0.081859 +Converged at iteration 26, L1 9.10576e-05, Linf 0.00568978, total time[s] 0.069395 +Converged at iteration 21, L1 9.61117e-05, Linf 0.00461199, total time[s] 0.057721 +Converged at iteration 21, L1 6.93363e-05, Linf 0.00393355, total time[s] 0.058834 +Converged at iteration 24, L1 8.29726e-05, Linf 0.00519692, total time[s] 0.065811 +Converged at iteration 28, L1 6.79703e-05, Linf 0.00440904, total time[s] 0.074818 +Converged at iteration 26, L1 8.13459e-05, Linf 0.00428453, total time[s] 0.069267 +Converged at iteration 21, L1 8.52603e-05, Linf 0.00433736, total time[s] 0.062265 +Converged at iteration 18, L1 7.35793e-05, Linf 0.0029899, total time[s] 0.052694 +Converged at iteration 31, L1 7.50409e-05, Linf 0.00268241, total time[s] 0.084133 +Converged at iteration 20, L1 8.18492e-05, Linf 0.00494556, total time[s] 0.055375 +Converged at iteration 24, L1 6.88881e-05, Linf 0.005, total time[s] 0.065619 +Converged at iteration 30, L1 9.43239e-05, Linf 0.00346039, total time[s] 0.087044 +Converged at iteration 25, L1 9.01385e-05, Linf 0.00466777, total time[s] 0.076616 +Converged at iteration 23, L1 8.37214e-05, Linf 0.00393114, total time[s] 0.067797 +Converged at iteration 23, L1 9.32723e-05, Linf 0.00455941, total time[s] 0.068115 +Converged at iteration 26, L1 6.88459e-05, Linf 0.00492155, total time[s] 0.073846 +Converged at iteration 29, L1 7.12279e-05, Linf 0.00490012, total time[s] 0.082337 +Converged at iteration 32, L1 8.57463e-05, Linf 0.00350096, total time[s] 0.082625 +Converged at iteration 31, L1 7.25335e-05, Linf 0.00304811, total time[s] 0.080246 +Converged at iteration 29, L1 7.73547e-05, Linf 0.00291212, total time[s] 0.076183 +Converged at iteration 32, L1 7.55769e-05, Linf 0.0033745, total time[s] 0.083771 +Converged at iteration 35, L1 9.72485e-05, Linf 0.00406367, total time[s] 0.088258 +Converged at iteration 33, L1 8.06516e-05, Linf 0.00500135, total time[s] 0.08387 +Converged at iteration 28, L1 8.42856e-05, Linf 0.00398754, total time[s] 0.071858 +Converged at iteration 24, L1 7.80361e-05, Linf 0.00256146, total time[s] 0.062496 +Converged at iteration 26, L1 8.36284e-05, Linf 0.00405333, total time[s] 0.067181 +Converged at iteration 39, L1 9.3402e-05, Linf 0.00548874, total time[s] 0.098076 +Converged at iteration 36, L1 7.23715e-05, Linf 0.00384465, total time[s] 0.092043 +Converged at iteration 27, L1 5.17324e-05, Linf 0.00565748, total time[s] 0.069755 +Converged at iteration 31, L1 6.06767e-05, Linf 0.00508914, total time[s] 0.079183 +Converged at iteration 26, L1 7.63537e-05, Linf 0.00544341, total time[s] 0.067261 +Converged at iteration 21, L1 7.17576e-05, Linf 0.00380757, total time[s] 0.055956 +Converged at iteration 20, L1 6.89288e-05, Linf 0.00502943, total time[s] 0.05319 +Converged at iteration 22, L1 7.53695e-05, Linf 0.00751927, total time[s] 0.05792 +Converged at iteration 26, L1 9.72815e-05, Linf 0.00651818, total time[s] 0.068041 +Converged at iteration 25, L1 7.5023e-05, Linf 0.00412523, total time[s] 0.065542 +Converged at iteration 20, L1 8.86112e-05, Linf 0.00555823, total time[s] 0.053365 +Converged at iteration 17, L1 8.52563e-05, Linf 0.00399917, total time[s] 0.045997 +Converged at iteration 31, L1 9.13864e-05, Linf 0.00277118, total time[s] 0.079792 +Converged at iteration 20, L1 6.64678e-05, Linf 0.00539796, total time[s] 0.053371 +Converged at iteration 24, L1 6.29602e-05, Linf 0.00552361, total time[s] 0.062884 +Converged at iteration 28, L1 7.03791e-05, Linf 0.00374229, total time[s] 0.072701 +Converged at iteration 23, L1 9.55995e-05, Linf 0.00710147, total time[s] 0.060466 +Converged at iteration 21, L1 9.29953e-05, Linf 0.00485104, total time[s] 0.059514 +Converged at iteration 23, L1 7.89248e-05, Linf 0.00415508, total time[s] 0.06043 +Converged at iteration 25, L1 9.93456e-05, Linf 0.00625415, total time[s] 0.066634 +Converged at iteration 28, L1 9.8309e-05, Linf 0.005867, total time[s] 0.072012 +Converged at iteration 30, L1 6.86272e-05, Linf 0.00488123, total time[s] 0.077366 +Converged at iteration 28, L1 8.30356e-05, Linf 0.00353531, total time[s] 0.072269 +Converged at iteration 29, L1 8.83443e-05, Linf 0.00329426, total time[s] 0.082026 +Converged at iteration 31, L1 6.94628e-05, Linf 0.0029103, total time[s] 0.084519 +Converged at iteration 31, L1 9.19987e-05, Linf 0.00460078, total time[s] 0.081685 +Converged at iteration 33, L1 7.41874e-05, Linf 0.00530549, total time[s] 0.132837 +Converged at iteration 28, L1 6.99511e-05, Linf 0.00368885, total time[s] 0.08919 +Converged at iteration 24, L1 8.78554e-05, Linf 0.00186798, total time[s] 0.071608 +Converged at iteration 25, L1 6.9609e-05, Linf 0.00422724, total time[s] 0.072495 +Converged at iteration 39, L1 7.65176e-05, Linf 0.00659672, total time[s] 0.11218 +Converged at iteration 36, L1 7.35547e-05, Linf 0.00526668, total time[s] 0.095938 +Converged at iteration 24, L1 7.54793e-05, Linf 0.00411544, total time[s] 0.070339 +Converged at iteration 31, L1 5.85946e-05, Linf 0.00509164, total time[s] 0.114744 +Converged at iteration 25, L1 8.67113e-05, Linf 0.00579455, total time[s] 0.126963 +Converged at iteration 20, L1 9.2231e-05, Linf 0.0038018, total time[s] 0.06431 +Converged at iteration 19, L1 6.61422e-05, Linf 0.00441286, total time[s] 0.058205 +Converged at iteration 20, L1 9.17178e-05, Linf 0.00657082, total time[s] 0.083853 +Converged at iteration 24, L1 7.93802e-05, Linf 0.00495822, total time[s] 0.072073 +Converged at iteration 24, L1 7.5839e-05, Linf 0.00492614, total time[s] 0.064567 +Converged at iteration 20, L1 6.05432e-05, Linf 0.00519512, total time[s] 0.054438 +Converged at iteration 17, L1 5.19433e-05, Linf 0.00241754, total time[s] 0.04971 +Converged at iteration 32, L1 6.88666e-05, Linf 0.00253744, total time[s] 0.086007 +Converged at iteration 19, L1 9.35388e-05, Linf 0.00720354, total time[s] 0.054638 +Converged at iteration 23, L1 7.80454e-05, Linf 0.0071114, total time[s] 0.060972 +Converged at iteration 26, L1 8.14178e-05, Linf 0.00603224, total time[s] 0.072984 +Converged at iteration 23, L1 5.78779e-05, Linf 0.00603784, total time[s] 0.064765 +Converged at iteration 20, L1 8.30773e-05, Linf 0.00552399, total time[s] 0.056428 +Converged at iteration 22, L1 9.96534e-05, Linf 0.00479385, total time[s] 0.061482 +Converged at iteration 25, L1 8.4759e-05, Linf 0.00441169, total time[s] 0.066222 +Converged at iteration 28, L1 7.81643e-05, Linf 0.00353713, total time[s] 0.072872 +Converged at iteration 29, L1 7.48747e-05, Linf 0.0061199, total time[s] 0.075361 +Converged at iteration 27, L1 7.35017e-05, Linf 0.00402009, total time[s] 0.070728 +Converged at iteration 29, L1 7.65663e-05, Linf 0.00380597, total time[s] 0.075274 +Converged at iteration 29, L1 9.17929e-05, Linf 0.00277217, total time[s] 0.075783 +Converged at iteration 28, L1 8.35546e-05, Linf 0.00273871, total time[s] 0.074508 +Converged at iteration 33, L1 6.17995e-05, Linf 0.00592742, total time[s] 0.084511 +Converged at iteration 27, L1 6.87695e-05, Linf 0.00334615, total time[s] 0.070128 +Converged at iteration 24, L1 9.65527e-05, Linf 0.0023907, total time[s] 0.064414 +Converged at iteration 23, L1 7.56527e-05, Linf 0.00336861, total time[s] 0.063758 +Converged at iteration 39, L1 7.44145e-05, Linf 0.00661486, total time[s] 0.101331 +Converged at iteration 36, L1 7.17485e-05, Linf 0.00533838, total time[s] 0.094454 +Converged at iteration 24, L1 7.43454e-05, Linf 0.0038846, total time[s] 0.063859 +Converged at iteration 31, L1 5.69579e-05, Linf 0.00507394, total time[s] 0.080242 +Converged at iteration 25, L1 8.72743e-05, Linf 0.0058404, total time[s] 0.065542 +Converged at iteration 20, L1 9.43677e-05, Linf 0.00386634, total time[s] 0.05427 +Converged at iteration 19, L1 6.38612e-05, Linf 0.00430465, total time[s] 0.051937 +Converged at iteration 20, L1 9.02512e-05, Linf 0.00655209, total time[s] 0.055442 +Converged at iteration 24, L1 7.6708e-05, Linf 0.00459204, total time[s] 0.066268 +Converged at iteration 24, L1 7.68415e-05, Linf 0.00499215, total time[s] 0.0683 +Converged at iteration 20, L1 6.12131e-05, Linf 0.00515681, total time[s] 0.055548 +Converged at iteration 16, L1 9.93294e-05, Linf 0.00457304, total time[s] 0.049105 +Converged at iteration 32, L1 6.91892e-05, Linf 0.00257307, total time[s] 0.099619 +Converged at iteration 19, L1 9.351e-05, Linf 0.00697076, total time[s] 0.052065 +Converged at iteration 23, L1 7.74222e-05, Linf 0.00702793, total time[s] 0.061515 +Converged at iteration 26, L1 7.99041e-05, Linf 0.00596078, total time[s] 0.068475 +Converged at iteration 23, L1 5.71336e-05, Linf 0.00598848, total time[s] 0.062065 +Converged at iteration 20, L1 8.25398e-05, Linf 0.00551221, total time[s] 0.057647 +Converged at iteration 23, L1 6.34776e-05, Linf 0.0028781, total time[s] 0.063509 +Converged at iteration 25, L1 8.37496e-05, Linf 0.00419711, total time[s] 0.072034 +Converged at iteration 28, L1 7.73524e-05, Linf 0.00351775, total time[s] 0.083582 +Converged at iteration 29, L1 7.46237e-05, Linf 0.00612442, total time[s] 0.084645 +Converged at iteration 27, L1 7.36934e-05, Linf 0.00399413, total time[s] 0.086046 +Converged at iteration 29, L1 7.76227e-05, Linf 0.00382465, total time[s] 0.088698 +Converged at iteration 29, L1 9.19437e-05, Linf 0.00277467, total time[s] 0.090565 +Converged at iteration 28, L1 8.3291e-05, Linf 0.00266426, total time[s] 0.081036 +Converged at iteration 33, L1 6.0042e-05, Linf 0.00585287, total time[s] 0.091265 +Converged at iteration 27, L1 6.88025e-05, Linf 0.00343114, total time[s] 0.071578 +Converged at iteration 24, L1 9.89986e-05, Linf 0.00243571, total time[s] 0.064335 +Converged at iteration 23, L1 7.49205e-05, Linf 0.00326581, total time[s] 0.071404 +Converged at iteration 39, L1 7.24322e-05, Linf 0.00662474, total time[s] 0.100058 +Converged at iteration 36, L1 7.0217e-05, Linf 0.00539715, total time[s] 0.096391 +Converged at iteration 24, L1 7.36927e-05, Linf 0.00367949, total time[s] 0.064657 +Converged at iteration 31, L1 5.62366e-05, Linf 0.0050447, total time[s] 0.08069 +Converged at iteration 25, L1 8.87619e-05, Linf 0.00599556, total time[s] 0.066335 +Converged at iteration 20, L1 9.84514e-05, Linf 0.00391933, total time[s] 0.054123 +Converged at iteration 19, L1 6.15635e-05, Linf 0.00418996, total time[s] 0.052233 +Converged at iteration 20, L1 8.83453e-05, Linf 0.00608439, total time[s] 0.055961 +Converged at iteration 24, L1 7.43062e-05, Linf 0.0042251, total time[s] 0.064626 +Converged at iteration 24, L1 7.84e-05, Linf 0.00506617, total time[s] 0.064154 +Converged at iteration 20, L1 6.25724e-05, Linf 0.00517393, total time[s] 0.054424 +Converged at iteration 16, L1 9.79114e-05, Linf 0.00481182, total time[s] 0.049291 +Converged at iteration 32, L1 6.84864e-05, Linf 0.0025985, total time[s] 0.103241 +Converged at iteration 19, L1 9.38014e-05, Linf 0.00688499, total time[s] 0.057844 +Converged at iteration 23, L1 7.71468e-05, Linf 0.00694957, total time[s] 0.067108 +Converged at iteration 26, L1 7.96821e-05, Linf 0.00590492, total time[s] 0.073258 +Converged at iteration 23, L1 5.6882e-05, Linf 0.00600164, total time[s] 0.062709 +Converged at iteration 20, L1 8.36593e-05, Linf 0.00547948, total time[s] 0.05457 +Converged at iteration 23, L1 6.51219e-05, Linf 0.0028339, total time[s] 0.062969 +Converged at iteration 25, L1 8.33852e-05, Linf 0.00403621, total time[s] 0.066038 +Converged at iteration 28, L1 7.71141e-05, Linf 0.00362285, total time[s] 0.073997 +Converged at iteration 29, L1 7.58715e-05, Linf 0.00618471, total time[s] 0.077553 +Converged at iteration 27, L1 7.51994e-05, Linf 0.00397715, total time[s] 0.072327 +Converged at iteration 29, L1 7.90692e-05, Linf 0.00387073, total time[s] 0.081867 +Converged at iteration 29, L1 9.24583e-05, Linf 0.00278047, total time[s] 0.07857 +Converged at iteration 28, L1 8.12902e-05, Linf 0.00260626, total time[s] 0.081598 +Converged at iteration 33, L1 5.83307e-05, Linf 0.00585229, total time[s] 0.089606 +Converged at iteration 27, L1 6.92768e-05, Linf 0.00354047, total time[s] 0.071422 +Converged at iteration 25, L1 7.1213e-05, Linf 0.00193534, total time[s] 0.067741 +Converged at iteration 23, L1 7.44766e-05, Linf 0.00318557, total time[s] 0.076805 +Converged at iteration 39, L1 7.1061e-05, Linf 0.00661554, total time[s] 0.117564 +Converged at iteration 36, L1 6.83701e-05, Linf 0.0054726, total time[s] 0.093133 +Converged at iteration 24, L1 7.30142e-05, Linf 0.00336347, total time[s] 0.063306 +Converged at iteration 30, L1 9.89606e-05, Linf 0.00615494, total time[s] 0.078266 +Converged at iteration 25, L1 9.24516e-05, Linf 0.00625674, total time[s] 0.065018 +Converged at iteration 21, L1 5.85768e-05, Linf 0.00343245, total time[s] 0.058828 +Converged at iteration 19, L1 5.99415e-05, Linf 0.00410048, total time[s] 0.053477 +Converged at iteration 20, L1 8.6055e-05, Linf 0.00645552, total time[s] 0.053983 +Converged at iteration 24, L1 7.17587e-05, Linf 0.00445212, total time[s] 0.071956 +Converged at iteration 24, L1 8.06659e-05, Linf 0.00520124, total time[s] 0.065243 +Converged at iteration 20, L1 6.49036e-05, Linf 0.00543458, total time[s] 0.053716 +Converged at iteration 16, L1 9.73001e-05, Linf 0.00506882, total time[s] 0.044132 +Converged at iteration 32, L1 6.76613e-05, Linf 0.00262252, total time[s] 0.081236 +Converged at iteration 19, L1 9.42727e-05, Linf 0.00667551, total time[s] 0.054457 +Converged at iteration 23, L1 7.69196e-05, Linf 0.00683692, total time[s] 0.06001 +Converged at iteration 26, L1 8.02069e-05, Linf 0.00587873, total time[s] 0.070065 +Converged at iteration 23, L1 5.64183e-05, Linf 0.00597164, total time[s] 0.066219 +Converged at iteration 20, L1 8.53132e-05, Linf 0.0054707, total time[s] 0.053012 +Converged at iteration 23, L1 6.7397e-05, Linf 0.00288167, total time[s] 0.060782 +Converged at iteration 25, L1 8.39096e-05, Linf 0.00403637, total time[s] 0.065143 +Converged at iteration 28, L1 7.78393e-05, Linf 0.00369578, total time[s] 0.072309 +Converged at iteration 29, L1 7.74651e-05, Linf 0.0062406, total time[s] 0.078095 +Converged at iteration 27, L1 7.70058e-05, Linf 0.00399542, total time[s] 0.080168 +Converged at iteration 29, L1 8.1032e-05, Linf 0.003928, total time[s] 0.079095 +Converged at iteration 29, L1 9.28323e-05, Linf 0.00278278, total time[s] 0.083708 +Converged at iteration 28, L1 8.05558e-05, Linf 0.00253955, total time[s] 0.077015 +Converged at iteration 32, L1 9.89384e-05, Linf 0.00696301, total time[s] 0.086172 +Converged at iteration 27, L1 7.1706e-05, Linf 0.00375301, total time[s] 0.078528 +Converged at iteration 25, L1 7.21219e-05, Linf 0.00198974, total time[s] 0.072782 +Converged at iteration 23, L1 7.42589e-05, Linf 0.00305103, total time[s] 0.06528 +Converged at iteration 39, L1 6.95934e-05, Linf 0.0065215, total time[s] 0.107864 +Converged at iteration 36, L1 6.72213e-05, Linf 0.00550597, total time[s] 0.105269 +Converged at iteration 24, L1 7.25778e-05, Linf 0.0030954, total time[s] 0.067749 +Converged at iteration 30, L1 9.65814e-05, Linf 0.00610816, total time[s] 0.083447 +Converged at iteration 25, L1 9.81137e-05, Linf 0.00664186, total time[s] 0.06529 +Converged at iteration 21, L1 6.43839e-05, Linf 0.00333613, total time[s] 0.055779 +Converged at iteration 19, L1 5.89089e-05, Linf 0.00393822, total time[s] 0.051355 +Converged at iteration 20, L1 8.31022e-05, Linf 0.00614668, total time[s] 0.056198 +Converged at iteration 24, L1 6.87728e-05, Linf 0.00350149, total time[s] 0.063376 +Converged at iteration 24, L1 8.4707e-05, Linf 0.00542822, total time[s] 0.063395 +Converged at iteration 20, L1 6.93045e-05, Linf 0.00562926, total time[s] 0.053598 +Converged at iteration 16, L1 9.70798e-05, Linf 0.00552846, total time[s] 0.044757 +Converged at iteration 32, L1 6.56344e-05, Linf 0.00262268, total time[s] 0.08194 +Converged at iteration 19, L1 9.51727e-05, Linf 0.00657904, total time[s] 0.051019 +Converged at iteration 23, L1 7.66979e-05, Linf 0.00666818, total time[s] 0.062909 +Converged at iteration 26, L1 8.06493e-05, Linf 0.00586239, total time[s] 0.068283 +Converged at iteration 23, L1 5.58225e-05, Linf 0.0059741, total time[s] 0.061286 +Converged at iteration 20, L1 8.83596e-05, Linf 0.00553404, total time[s] 0.053949 +Converged at iteration 23, L1 6.93453e-05, Linf 0.00272167, total time[s] 0.061222 +Converged at iteration 25, L1 8.4728e-05, Linf 0.00378601, total time[s] 0.066388 +Converged at iteration 28, L1 8.01728e-05, Linf 0.00543061, total time[s] 0.07745 +Converged at iteration 29, L1 7.9686e-05, Linf 0.00631213, total time[s] 0.078258 +Converged at iteration 27, L1 7.9527e-05, Linf 0.00392728, total time[s] 0.072097 +Converged at iteration 29, L1 8.31385e-05, Linf 0.00399774, total time[s] 0.076027 +Converged at iteration 29, L1 9.33807e-05, Linf 0.00277531, total time[s] 0.075147 +Converged at iteration 28, L1 7.9949e-05, Linf 0.00247603, total time[s] 0.072466 +Converged at iteration 32, L1 9.6166e-05, Linf 0.00694517, total time[s] 0.082678 +Converged at iteration 27, L1 7.57891e-05, Linf 0.00408313, total time[s] 0.070719 +Converged at iteration 25, L1 6.9617e-05, Linf 0.00201715, total time[s] 0.065281 +Converged at iteration 23, L1 7.4913e-05, Linf 0.00299969, total time[s] 0.063914 +Converged at iteration 39, L1 6.78383e-05, Linf 0.00663637, total time[s] 0.110188 +Converged at iteration 36, L1 6.31399e-05, Linf 0.00554924, total time[s] 0.098165 +Converged at iteration 24, L1 7.27879e-05, Linf 0.003093, total time[s] 0.064435 +Converged at iteration 30, L1 9.41815e-05, Linf 0.0060541, total time[s] 0.078453 +Converged at iteration 26, L1 5.93235e-05, Linf 0.00588295, total time[s] 0.06746 +Converged at iteration 21, L1 7.63347e-05, Linf 0.0033628, total time[s] 0.05685 +Converged at iteration 19, L1 5.81288e-05, Linf 0.00394759, total time[s] 0.051638 +Converged at iteration 20, L1 7.96601e-05, Linf 0.00641222, total time[s] 0.060632 +Converged at iteration 24, L1 6.54701e-05, Linf 0.00398199, total time[s] 0.067729 +Converged at iteration 24, L1 8.91268e-05, Linf 0.00561127, total time[s] 0.064971 +Converged at iteration 20, L1 7.45504e-05, Linf 0.00581715, total time[s] 0.08102 +Converged at iteration 16, L1 9.67916e-05, Linf 0.00559493, total time[s] 0.05153 +Converged at iteration 32, L1 6.27958e-05, Linf 0.00266329, total time[s] 0.092746 +Converged at iteration 19, L1 9.37231e-05, Linf 0.00639163, total time[s] 0.054843 +Converged at iteration 23, L1 7.59781e-05, Linf 0.00645837, total time[s] 0.063389 +Converged at iteration 26, L1 8.20835e-05, Linf 0.00584251, total time[s] 0.071986 +Converged at iteration 23, L1 5.51738e-05, Linf 0.00599654, total time[s] 0.063715 +Converged at iteration 20, L1 9.3148e-05, Linf 0.00550927, total time[s] 0.059315 +Converged at iteration 23, L1 7.17444e-05, Linf 0.00263753, total time[s] 0.063082 +Converged at iteration 25, L1 8.60002e-05, Linf 0.00379763, total time[s] 0.065163 +Converged at iteration 28, L1 8.10431e-05, Linf 0.00428657, total time[s] 0.072257 +Converged at iteration 29, L1 8.25931e-05, Linf 0.006363, total time[s] 0.074079 +Converged at iteration 27, L1 8.28059e-05, Linf 0.00390219, total time[s] 0.07023 +Converged at iteration 29, L1 8.53824e-05, Linf 0.00406818, total time[s] 0.075667 +Converged at iteration 29, L1 9.3646e-05, Linf 0.00276551, total time[s] 0.074843 +Converged at iteration 28, L1 7.99189e-05, Linf 0.0024172, total time[s] 0.073513 +Converged at iteration 32, L1 9.29673e-05, Linf 0.00697324, total time[s] 0.081311 +Converged at iteration 27, L1 8.17056e-05, Linf 0.00449372, total time[s] 0.069733 +Converged at iteration 24, L1 9.87202e-05, Linf 0.00260702, total time[s] 0.062582 +Converged at iteration 23, L1 7.74646e-05, Linf 0.00287796, total time[s] 0.060146 +Converged at iteration 39, L1 6.65694e-05, Linf 0.00649369, total time[s] 0.099938 +Converged at iteration 36, L1 5.98604e-05, Linf 0.00556003, total time[s] 0.092475 +Converged at iteration 24, L1 7.41815e-05, Linf 0.00293933, total time[s] 0.062652 +Converged at iteration 30, L1 9.12533e-05, Linf 0.00598927, total time[s] 0.077351 +Converged at iteration 26, L1 6.45552e-05, Linf 0.00634107, total time[s] 0.07235 +Converged at iteration 21, L1 8.99224e-05, Linf 0.00429252, total time[s] 0.073785 +Converged at iteration 19, L1 5.71465e-05, Linf 0.00397518, total time[s] 0.054376 +Converged at iteration 20, L1 7.62147e-05, Linf 0.00595815, total time[s] 0.055439 +Converged at iteration 24, L1 6.19246e-05, Linf 0.00327169, total time[s] 0.06622 +Converged at iteration 24, L1 9.39499e-05, Linf 0.00593192, total time[s] 0.062805 +Converged at iteration 20, L1 8.1085e-05, Linf 0.00595891, total time[s] 0.053694 +Converged at iteration 16, L1 9.6587e-05, Linf 0.00611239, total time[s] 0.044992 +Converged at iteration 32, L1 5.78403e-05, Linf 0.00265419, total time[s] 0.082807 +Converged at iteration 19, L1 9.27726e-05, Linf 0.00622686, total time[s] 0.051537 +Converged at iteration 23, L1 7.49341e-05, Linf 0.00660033, total time[s] 0.062709 +Converged at iteration 26, L1 8.33802e-05, Linf 0.0058355, total time[s] 0.067946 +Converged at iteration 23, L1 5.48279e-05, Linf 0.00602761, total time[s] 0.063031 +Converged at iteration 20, L1 9.90178e-05, Linf 0.00559452, total time[s] 0.054546 +Converged at iteration 23, L1 7.34897e-05, Linf 0.00256901, total time[s] 0.065331 +Converged at iteration 25, L1 8.73076e-05, Linf 0.00358267, total time[s] 0.071511 +Converged at iteration 28, L1 8.3009e-05, Linf 0.00447677, total time[s] 0.072284 +Converged at iteration 29, L1 8.58633e-05, Linf 0.00649321, total time[s] 0.074553 +Converged at iteration 27, L1 8.60861e-05, Linf 0.0038509, total time[s] 0.06975 +Converged at iteration 29, L1 8.74474e-05, Linf 0.00414757, total time[s] 0.074629 +Converged at iteration 29, L1 9.41183e-05, Linf 0.00277901, total time[s] 0.075153 +Converged at iteration 28, L1 8.00486e-05, Linf 0.00236557, total time[s] 0.072471 +Converged at iteration 32, L1 8.89721e-05, Linf 0.00680218, total time[s] 0.084801 +Converged at iteration 27, L1 8.78657e-05, Linf 0.00499505, total time[s] 0.070335 +Converged at iteration 24, L1 9.96318e-05, Linf 0.00265033, total time[s] 0.067088 +Converged at iteration 23, L1 7.92549e-05, Linf 0.00273952, total time[s] 0.062794 +Converged at iteration 39, L1 6.49288e-05, Linf 0.00642214, total time[s] 0.115471 +Converged at iteration 35, L1 9.9865e-05, Linf 0.00647772, total time[s] 0.090823 +Converged at iteration 24, L1 7.65677e-05, Linf 0.00283796, total time[s] 0.064425 +Converged at iteration 30, L1 8.93075e-05, Linf 0.00591332, total time[s] 0.079057 +Converged at iteration 26, L1 6.97501e-05, Linf 0.00682616, total time[s] 0.068514 +Converged at iteration 22, L1 5.90003e-05, Linf 0.00438759, total time[s] 0.059851 +Converged at iteration 19, L1 5.75781e-05, Linf 0.00400974, total time[s] 0.05382 +Converged at iteration 20, L1 7.30619e-05, Linf 0.0056341, total time[s] 0.057128 +Converged at iteration 24, L1 5.87554e-05, Linf 0.00322917, total time[s] 0.065079 +Converged at iteration 24, L1 9.97732e-05, Linf 0.00617909, total time[s] 0.06506 +Converged at iteration 20, L1 8.82486e-05, Linf 0.00610801, total time[s] 0.062319 +Converged at iteration 16, L1 9.63882e-05, Linf 0.00643364, total time[s] 0.055939 +Converged at iteration 31, L1 9.38439e-05, Linf 0.00325803, total time[s] 0.083169 +Converged at iteration 19, L1 9.07368e-05, Linf 0.00603225, total time[s] 0.051443 +Converged at iteration 23, L1 7.31761e-05, Linf 0.00596085, total time[s] 0.061704 +Converged at iteration 26, L1 8.47654e-05, Linf 0.00580161, total time[s] 0.07828 +Converged at iteration 23, L1 5.54761e-05, Linf 0.00605841, total time[s] 0.074233 +Converged at iteration 21, L1 5.70102e-05, Linf 0.00472393, total time[s] 0.066772 +Converged at iteration 23, L1 7.38984e-05, Linf 0.00245307, total time[s] 0.063302 +Converged at iteration 25, L1 8.77682e-05, Linf 0.00348796, total time[s] 0.06585 +Converged at iteration 28, L1 8.57139e-05, Linf 0.00456387, total time[s] 0.079914 +Converged at iteration 29, L1 8.9707e-05, Linf 0.00656818, total time[s] 0.078178 +Converged at iteration 27, L1 8.95654e-05, Linf 0.00387195, total time[s] 0.078282 +Converged at iteration 29, L1 8.88961e-05, Linf 0.00423232, total time[s] 0.080905 +Converged at iteration 29, L1 9.51757e-05, Linf 0.00282445, total time[s] 0.076099 +Converged at iteration 28, L1 8.04342e-05, Linf 0.00232826, total time[s] 0.07896 +Converged at iteration 32, L1 8.36544e-05, Linf 0.00670168, total time[s] 0.084675 +Converged at iteration 27, L1 9.54729e-05, Linf 0.00555266, total time[s] 0.07078 +Converged at iteration 25, L1 6.46875e-05, Linf 0.00204224, total time[s] 0.065746 +Converged at iteration 23, L1 8.2351e-05, Linf 0.00264942, total time[s] 0.060829 +Converged at iteration 39, L1 6.17365e-05, Linf 0.00631386, total time[s] 0.101774 +Converged at iteration 35, L1 8.85418e-05, Linf 0.00638811, total time[s] 0.092415 +Converged at iteration 24, L1 7.92903e-05, Linf 0.00287701, total time[s] 0.062851 +Converged at iteration 30, L1 8.38722e-05, Linf 0.00582315, total time[s] 0.076616 +Converged at iteration 26, L1 7.53434e-05, Linf 0.00737045, total time[s] 0.075492 +Converged at iteration 22, L1 7.68768e-05, Linf 0.00539391, total time[s] 0.062279 +Converged at iteration 19, L1 5.82603e-05, Linf 0.00413005, total time[s] 0.05281 +Converged at iteration 20, L1 6.97432e-05, Linf 0.00537431, total time[s] 0.132667 +Converged at iteration 24, L1 5.57738e-05, Linf 0.00313753, total time[s] 0.076719 +Converged at iteration 25, L1 5.61602e-05, Linf 0.00523336, total time[s] 0.066562 +Converged at iteration 20, L1 9.6373e-05, Linf 0.00626004, total time[s] 0.053429 +Converged at iteration 16, L1 9.72072e-05, Linf 0.00666025, total time[s] 0.044058 +Converged at iteration 31, L1 8.8574e-05, Linf 0.00331545, total time[s] 0.079698 +Converged at iteration 19, L1 8.64977e-05, Linf 0.00581412, total time[s] 0.050905 +Converged at iteration 23, L1 7.11745e-05, Linf 0.00565644, total time[s] 0.061463 +Converged at iteration 26, L1 8.5759e-05, Linf 0.00571972, total time[s] 0.072071 +Converged at iteration 23, L1 5.63832e-05, Linf 0.00609892, total time[s] 0.060533 +Converged at iteration 21, L1 6.21518e-05, Linf 0.00472601, total time[s] 0.056122 +Converged at iteration 23, L1 7.33419e-05, Linf 0.00231158, total time[s] 0.062738 +Converged at iteration 25, L1 8.73406e-05, Linf 0.0033708, total time[s] 0.067655 +Converged at iteration 28, L1 8.90331e-05, Linf 0.00478516, total time[s] 0.074257 +Converged at iteration 29, L1 9.36252e-05, Linf 0.00665437, total time[s] 0.078787 +Converged at iteration 27, L1 9.27897e-05, Linf 0.00386539, total time[s] 0.078617 +Converged at iteration 29, L1 9.04713e-05, Linf 0.00433575, total time[s] 0.07748 +Converged at iteration 29, L1 9.59488e-05, Linf 0.00286504, total time[s] 0.077345 +Converged at iteration 28, L1 8.11531e-05, Linf 0.00228524, total time[s] 0.074067 +Converged at iteration 32, L1 7.7761e-05, Linf 0.0065922, total time[s] 0.083178 +Converged at iteration 28, L1 6.01519e-05, Linf 0.00517867, total time[s] 0.074421 +Converged at iteration 25, L1 6.86859e-05, Linf 0.00272255, total time[s] 0.067328 +Converged at iteration 23, L1 8.61924e-05, Linf 0.00256711, total time[s] 0.06121 +Converged at iteration 39, L1 5.62023e-05, Linf 0.00617769, total time[s] 0.100806 +Converged at iteration 35, L1 8.09495e-05, Linf 0.00652233, total time[s] 0.093207 +Converged at iteration 24, L1 8.35591e-05, Linf 0.00298795, total time[s] 0.065281 +Converged at iteration 30, L1 7.77503e-05, Linf 0.00572406, total time[s] 0.078839 +Converged at iteration 26, L1 8.03876e-05, Linf 0.00794793, total time[s] 0.069407 +Converged at iteration 22, L1 9.85181e-05, Linf 0.00650769, total time[s] 0.059655 +Converged at iteration 19, L1 6.06936e-05, Linf 0.00414056, total time[s] 0.052234 +Converged at iteration 20, L1 6.69768e-05, Linf 0.00486428, total time[s] 0.055419 +Converged at iteration 24, L1 5.379e-05, Linf 0.00309755, total time[s] 0.064877 +Converged at iteration 25, L1 6.00992e-05, Linf 0.00555988, total time[s] 0.076774 +Converged at iteration 21, L1 5.30936e-05, Linf 0.00541752, total time[s] 0.068735 +Converged at iteration 16, L1 9.83628e-05, Linf 0.00678554, total time[s] 0.044351 +Converged at iteration 31, L1 8.44666e-05, Linf 0.00331277, total time[s] 0.081444 +Converged at iteration 19, L1 8.03488e-05, Linf 0.00554058, total time[s] 0.052183 +Converged at iteration 23, L1 6.86548e-05, Linf 0.00530281, total time[s] 0.061997 +Converged at iteration 26, L1 8.7693e-05, Linf 0.00561541, total time[s] 0.069471 +Converged at iteration 23, L1 5.75398e-05, Linf 0.0061326, total time[s] 0.061945 +Converged at iteration 21, L1 6.8188e-05, Linf 0.004647, total time[s] 0.057027 +Converged at iteration 23, L1 7.18e-05, Linf 0.00213793, total time[s] 0.063066 +Converged at iteration 25, L1 8.81063e-05, Linf 0.00333979, total time[s] 0.06848 +Converged at iteration 28, L1 9.23597e-05, Linf 0.00522136, total time[s] 0.102202 +Converged at iteration 29, L1 9.83232e-05, Linf 0.00676205, total time[s] 0.111025 +Converged at iteration 27, L1 9.63251e-05, Linf 0.00368135, total time[s] 0.097898 +Converged at iteration 29, L1 9.4069e-05, Linf 0.00450416, total time[s] 0.107786 +Converged at iteration 29, L1 9.7247e-05, Linf 0.00291297, total time[s] 0.112283 +Converged at iteration 28, L1 8.29122e-05, Linf 0.00224274, total time[s] 0.096498 +Converged at iteration 32, L1 7.17533e-05, Linf 0.00645611, total time[s] 0.129495 +Converged at iteration 28, L1 6.26349e-05, Linf 0.00573618, total time[s] 0.092519 +Converged at iteration 25, L1 7.55662e-05, Linf 0.00344772, total time[s] 0.094271 +Converged at iteration 23, L1 9.03529e-05, Linf 0.0025255, total time[s] 0.085585 +Converged at iteration 38, L1 9.92377e-05, Linf 0.00723781, total time[s] 0.174123 +Converged at iteration 35, L1 6.78743e-05, Linf 0.00621532, total time[s] 0.123301 +Converged at iteration 24, L1 8.79518e-05, Linf 0.00314203, total time[s] 0.077174 +Converged at iteration 30, L1 7.20854e-05, Linf 0.00562898, total time[s] 0.080806 +Converged at iteration 26, L1 8.58725e-05, Linf 0.00853248, total time[s] 0.069993 +Converged at iteration 23, L1 6.91376e-05, Linf 0.00637202, total time[s] 0.06182 +Converged at iteration 19, L1 6.42396e-05, Linf 0.00433041, total time[s] 0.06842 +Converged at iteration 20, L1 6.43378e-05, Linf 0.00426059, total time[s] 0.090322 +Converged at iteration 23, L1 9.8913e-05, Linf 0.00450746, total time[s] 0.077992 +Converged at iteration 25, L1 6.46731e-05, Linf 0.00581065, total time[s] 0.082696 +Converged at iteration 21, L1 5.84677e-05, Linf 0.00553301, total time[s] 0.086599 +Converged at iteration 17, L1 5.45072e-05, Linf 0.00458794, total time[s] 0.059205 +Converged at iteration 31, L1 8.08273e-05, Linf 0.00330438, total time[s] 0.115756 +Converged at iteration 19, L1 7.24853e-05, Linf 0.00522772, total time[s] 0.059277 +Converged at iteration 23, L1 6.52813e-05, Linf 0.0049203, total time[s] 0.081356 +Converged at iteration 26, L1 8.87768e-05, Linf 0.00550717, total time[s] 0.07788 +Converged at iteration 23, L1 5.90269e-05, Linf 0.00617909, total time[s] 0.070652 +Converged at iteration 21, L1 7.44797e-05, Linf 0.00449147, total time[s] 0.062944 +Converged at iteration 23, L1 7.0269e-05, Linf 0.00193663, total time[s] 0.063352 +Converged at iteration 25, L1 8.85714e-05, Linf 0.00325274, total time[s] 0.072781 +Converged at iteration 28, L1 9.54441e-05, Linf 0.00558569, total time[s] 0.083155 +Converged at iteration 30, L1 5.13801e-05, Linf 0.00431696, total time[s] 0.08349 +Converged at iteration 27, L1 9.83888e-05, Linf 0.00363187, total time[s] 0.073546 +Converged at iteration 29, L1 9.81956e-05, Linf 0.00461345, total time[s] 0.075183 +Converged at iteration 29, L1 9.73812e-05, Linf 0.00291421, total time[s] 0.076054 +Converged at iteration 28, L1 8.43114e-05, Linf 0.00221241, total time[s] 0.081017 +Converged at iteration 32, L1 6.21526e-05, Linf 0.00625438, total time[s] 0.095537 +Converged at iteration 28, L1 6.92328e-05, Linf 0.00638294, total time[s] 0.078621 +Converged at iteration 25, L1 8.45327e-05, Linf 0.00420302, total time[s] 0.069051 +Converged at iteration 23, L1 9.56141e-05, Linf 0.00265302, total time[s] 0.064259 +Converged at iteration 38, L1 8.98381e-05, Linf 0.00710949, total time[s] 0.111691 +Converged at iteration 35, L1 5.51848e-05, Linf 0.00581994, total time[s] 0.104602 +Converged at iteration 24, L1 9.11243e-05, Linf 0.00326101, total time[s] 0.079297 +Converged at iteration 30, L1 6.72949e-05, Linf 0.00554245, total time[s] 0.081625 +Converged at iteration 26, L1 9.2269e-05, Linf 0.00911468, total time[s] 0.070177 +Converged at iteration 23, L1 8.56402e-05, Linf 0.0072841, total time[s] 0.061733 +Converged at iteration 19, L1 6.85445e-05, Linf 0.00449019, total time[s] 0.063608 +Converged at iteration 20, L1 6.1586e-05, Linf 0.00407935, total time[s] 0.062819 +Converged at iteration 23, L1 9.40243e-05, Linf 0.00452789, total time[s] 0.076576 +Converged at iteration 25, L1 6.86393e-05, Linf 0.00606623, total time[s] 0.082866 +Converged at iteration 21, L1 6.38662e-05, Linf 0.00575274, total time[s] 0.064568 +Converged at iteration 17, L1 5.47893e-05, Linf 0.00482474, total time[s] 0.064058 +Converged at iteration 31, L1 7.78164e-05, Linf 0.00337791, total time[s] 0.129786 +Converged at iteration 19, L1 6.34998e-05, Linf 0.00485066, total time[s] 0.063933 +Converged at iteration 22, L1 9.33749e-05, Linf 0.00526516, total time[s] 0.061556 +Converged at iteration 26, L1 9.11835e-05, Linf 0.0054028, total time[s] 0.073561 +Converged at iteration 23, L1 6.06252e-05, Linf 0.00626479, total time[s] 0.063065 +Converged at iteration 21, L1 8.03239e-05, Linf 0.00443567, total time[s] 0.057804 +Converged at iteration 23, L1 6.74385e-05, Linf 0.0016914, total time[s] 0.062962 +Converged at iteration 25, L1 8.72637e-05, Linf 0.00312376, total time[s] 0.074653 +Converged at iteration 28, L1 9.90822e-05, Linf 0.00596666, total time[s] 0.074626 +Converged at iteration 30, L1 5.42272e-05, Linf 0.0042325, total time[s] 0.091258 +Converged at iteration 28, L1 6.06688e-05, Linf 0.00423688, total time[s] 0.078118 +Converged at iteration 30, L1 6.29892e-05, Linf 0.00390121, total time[s] 0.085488 +Converged at iteration 29, L1 9.74703e-05, Linf 0.00290311, total time[s] 0.091974 +Converged at iteration 28, L1 8.90098e-05, Linf 0.00221299, total time[s] 0.085445 +Converged at iteration 31, L1 9.506e-05, Linf 0.00753153, total time[s] 0.086789 +Converged at iteration 28, L1 7.85015e-05, Linf 0.00703155, total time[s] 0.087382 +Converged at iteration 25, L1 9.53546e-05, Linf 0.00498169, total time[s] 0.102182 +Converged at iteration 24, L1 5.63025e-05, Linf 0.00200257, total time[s] 0.06658 +Converged at iteration 38, L1 7.89241e-05, Linf 0.00684955, total time[s] 0.163556 +Converged at iteration 34, L1 9.12599e-05, Linf 0.00694842, total time[s] 0.204672 +Converged at iteration 24, L1 9.29535e-05, Linf 0.00335745, total time[s] 0.137449 +Converged at iteration 30, L1 6.44285e-05, Linf 0.00545386, total time[s] 0.14587 +Converged at iteration 26, L1 9.84802e-05, Linf 0.00968394, total time[s] 0.169156 +Converged at iteration 24, L1 5.37483e-05, Linf 0.00675487, total time[s] 0.147685 +Converged at iteration 19, L1 7.41807e-05, Linf 0.0049708, total time[s] 0.086436 +Converged at iteration 20, L1 5.80585e-05, Linf 0.00391133, total time[s] 0.069798 +Converged at iteration 23, L1 9.16751e-05, Linf 0.0045547, total time[s] 0.077378 +Converged at iteration 25, L1 7.13954e-05, Linf 0.00629527, total time[s] 0.072847 +Converged at iteration 21, L1 6.84307e-05, Linf 0.00576785, total time[s] 0.059473 +Converged at iteration 17, L1 5.56835e-05, Linf 0.00497245, total time[s] 0.049418 +Converged at iteration 31, L1 7.57329e-05, Linf 0.00347387, total time[s] 0.085635 +Converged at iteration 18, L1 9.06047e-05, Linf 0.00570854, total time[s] 0.059166 +Converged at iteration 22, L1 8.37789e-05, Linf 0.00482259, total time[s] 0.063117 +Converged at iteration 26, L1 9.51645e-05, Linf 0.00531129, total time[s] 0.082515 +Converged at iteration 23, L1 6.29109e-05, Linf 0.00637317, total time[s] 0.065549 +Converged at iteration 21, L1 8.66962e-05, Linf 0.00430969, total time[s] 0.058789 +Converged at iteration 23, L1 6.44885e-05, Linf 0.00173487, total time[s] 0.062817 +Converged at iteration 25, L1 8.42697e-05, Linf 0.00293054, total time[s] 0.068696 +Converged at iteration 29, L1 6.67477e-05, Linf 0.00408318, total time[s] 0.09083 +Converged at iteration 30, L1 5.7091e-05, Linf 0.00428516, total time[s] 0.082932 +Converged at iteration 28, L1 6.31558e-05, Linf 0.00419511, total time[s] 0.074058 +Converged at iteration 30, L1 6.4973e-05, Linf 0.00401879, total time[s] 0.081594 +Converged at iteration 29, L1 9.78383e-05, Linf 0.00290273, total time[s] 0.077512 +Converged at iteration 28, L1 9.21426e-05, Linf 0.00216133, total time[s] 0.075277 +Converged at iteration 31, L1 8.5711e-05, Linf 0.00741948, total time[s] 0.081497 +Converged at iteration 28, L1 8.6852e-05, Linf 0.00766677, total time[s] 0.074812 +Converged at iteration 26, L1 6.20759e-05, Linf 0.00449362, total time[s] 0.072441 +Converged at iteration 24, L1 5.92972e-05, Linf 0.00213295, total time[s] 0.067643 +Converged at iteration 38, L1 6.86662e-05, Linf 0.00662844, total time[s] 0.098958 +Converged at iteration 34, L1 8.19002e-05, Linf 0.00684792, total time[s] 0.095152 +Converged at iteration 24, L1 9.54915e-05, Linf 0.0034365, total time[s] 0.067114 +Converged at iteration 30, L1 5.81588e-05, Linf 0.00536486, total time[s] 0.080818 +Converged at iteration 27, L1 5.23322e-05, Linf 0.00804825, total time[s] 0.070806 +Converged at iteration 24, L1 6.27669e-05, Linf 0.00768656, total time[s] 0.064276 +Converged at iteration 19, L1 8.00564e-05, Linf 0.00556614, total time[s] 0.05723 +Converged at iteration 20, L1 5.44832e-05, Linf 0.00377031, total time[s] 0.059718 +Converged at iteration 23, L1 9.11978e-05, Linf 0.00460858, total time[s] 0.076946 +Converged at iteration 25, L1 7.53962e-05, Linf 0.00650277, total time[s] 0.072201 +Converged at iteration 21, L1 7.22179e-05, Linf 0.00599963, total time[s] 0.07783 +Converged at iteration 17, L1 5.6237e-05, Linf 0.00504954, total time[s] 0.064196 +Converged at iteration 31, L1 7.41677e-05, Linf 0.0035808, total time[s] 0.126949 +Converged at iteration 18, L1 7.50695e-05, Linf 0.00521029, total time[s] 0.05071 +Converged at iteration 22, L1 7.39631e-05, Linf 0.00433175, total time[s] 0.062895 +Converged at iteration 26, L1 9.85466e-05, Linf 0.00524713, total time[s] 0.07003 +Converged at iteration 23, L1 6.61113e-05, Linf 0.00649292, total time[s] 0.063438 +Converged at iteration 21, L1 9.32371e-05, Linf 0.00412331, total time[s] 0.071508 +Converged at iteration 22, L1 9.76199e-05, Linf 0.00269053, total time[s] 0.060906 +Converged at iteration 25, L1 8.03604e-05, Linf 0.00270629, total time[s] 0.070016 +Converged at iteration 29, L1 6.88073e-05, Linf 0.00441017, total time[s] 0.081609 +Converged at iteration 30, L1 6.04852e-05, Linf 0.0043501, total time[s] 0.09027 +Converged at iteration 28, L1 6.4775e-05, Linf 0.00419173, total time[s] 0.077896 +Converged at iteration 30, L1 6.65598e-05, Linf 0.00415073, total time[s] 0.080606 +Converged at iteration 29, L1 9.85298e-05, Linf 0.00293681, total time[s] 0.077393 +Converged at iteration 28, L1 9.78776e-05, Linf 0.00208262, total time[s] 0.076077 +Converged at iteration 31, L1 8.07416e-05, Linf 0.0072846, total time[s] 0.092701 +Converged at iteration 28, L1 9.51445e-05, Linf 0.00829187, total time[s] 0.086499 +Converged at iteration 26, L1 7.03771e-05, Linf 0.00515966, total time[s] 0.072367 +Converged at iteration 24, L1 6.28638e-05, Linf 0.00226016, total time[s] 0.066574 +Converged at iteration 38, L1 6.18192e-05, Linf 0.00645243, total time[s] 0.124713 +Converged at iteration 34, L1 7.73165e-05, Linf 0.00665279, total time[s] 0.114959 +Converged at iteration 24, L1 9.70883e-05, Linf 0.00349167, total time[s] 0.065054 +Converged at iteration 29, L1 9.99687e-05, Linf 0.00686576, total time[s] 0.07818 +Converged at iteration 27, L1 5.52668e-05, Linf 0.00848709, total time[s] 0.074001 +Converged at iteration 24, L1 7.20803e-05, Linf 0.0085264, total time[s] 0.109086 +Converged at iteration 19, L1 8.62848e-05, Linf 0.00497568, total time[s] 0.081375 +Converged at iteration 20, L1 5.17915e-05, Linf 0.0034579, total time[s] 0.13224 +Converged at iteration 23, L1 9.05358e-05, Linf 0.00465822, total time[s] 0.095044 +Converged at iteration 25, L1 7.79993e-05, Linf 0.00668769, total time[s] 0.106647 +Converged at iteration 21, L1 7.63379e-05, Linf 0.00603816, total time[s] 0.069448 +Converged at iteration 17, L1 5.65115e-05, Linf 0.00504796, total time[s] 0.047709 +Converged at iteration 31, L1 7.2544e-05, Linf 0.00368958, total time[s] 0.08291 +Converged at iteration 17, L1 9.98609e-05, Linf 0.00660237, total time[s] 0.046865 +Converged at iteration 21, L1 9.59704e-05, Linf 0.00451703, total time[s] 0.059735 +Converged at iteration 27, L1 5.35466e-05, Linf 0.00245744, total time[s] 0.074774 +Converged at iteration 23, L1 6.99521e-05, Linf 0.00660694, total time[s] 0.069366 +Converged at iteration 21, L1 9.99753e-05, Linf 0.00415142, total time[s] 0.064597 +Converged at iteration 22, L1 9.12344e-05, Linf 0.00326775, total time[s] 0.061044 +Converged at iteration 25, L1 7.76985e-05, Linf 0.00248066, total time[s] 0.067974 +Converged at iteration 29, L1 7.03388e-05, Linf 0.00470532, total time[s] 0.076869 +Converged at iteration 30, L1 6.42692e-05, Linf 0.00445609, total time[s] 0.080263 +Converged at iteration 28, L1 6.64638e-05, Linf 0.00364831, total time[s] 0.07197 +Converged at iteration 30, L1 6.92223e-05, Linf 0.00429564, total time[s] 0.076553 +Converged at iteration 29, L1 9.88681e-05, Linf 0.00294272, total time[s] 0.074709 +Converged at iteration 29, L1 6.16081e-05, Linf 0.00136372, total time[s] 0.077647 +Converged at iteration 31, L1 7.28711e-05, Linf 0.00710181, total time[s] 0.08544 +Converged at iteration 29, L1 5.17527e-05, Linf 0.00723576, total time[s] 0.078726 +Converged at iteration 26, L1 7.9269e-05, Linf 0.00584536, total time[s] 0.067288 +Converged at iteration 24, L1 6.65032e-05, Linf 0.00237924, total time[s] 0.062651 +Converged at iteration 38, L1 5.74195e-05, Linf 0.00621794, total time[s] 0.098177 +Converged at iteration 34, L1 7.40451e-05, Linf 0.00639521, total time[s] 0.094938 +Converged at iteration 24, L1 9.80049e-05, Linf 0.00352896, total time[s] 0.06468 +Converged at iteration 29, L1 9.82428e-05, Linf 0.00678031, total time[s] 0.078019 +Converged at iteration 27, L1 5.86415e-05, Linf 0.00892889, total time[s] 0.092899 +Converged at iteration 24, L1 8.17075e-05, Linf 0.00937362, total time[s] 0.071332 +Converged at iteration 19, L1 9.0588e-05, Linf 0.00480691, total time[s] 0.085346 +Converged at iteration 20, L1 4.91071e-05, Linf 0.00336338, total time[s] 0.068724 +Converged at iteration 23, L1 8.97754e-05, Linf 0.00471668, total time[s] 0.073382 +Converged at iteration 25, L1 8.29927e-05, Linf 0.00684988, total time[s] 0.09623 +Converged at iteration 21, L1 8.24369e-05, Linf 0.0061266, total time[s] 0.07755 +Converged at iteration 17, L1 5.69427e-05, Linf 0.00500209, total time[s] 0.052132 +Converged at iteration 31, L1 7.16621e-05, Linf 0.00381426, total time[s] 0.08631 +Converged at iteration 17, L1 7.53924e-05, Linf 0.00594217, total time[s] 0.046312 +Converged at iteration 21, L1 7.89055e-05, Linf 0.00375825, total time[s] 0.056831 +Converged at iteration 27, L1 5.50011e-05, Linf 0.0024317, total time[s] 0.075493 +Converged at iteration 23, L1 7.42004e-05, Linf 0.00672751, total time[s] 0.059904 +Converged at iteration 22, L1 5.84568e-05, Linf 0.003275, total time[s] 0.059611 +Converged at iteration 22, L1 8.25011e-05, Linf 0.0028477, total time[s] 0.059164 +Converged at iteration 25, L1 7.45542e-05, Linf 0.00230027, total time[s] 0.066944 +Converged at iteration 29, L1 7.10215e-05, Linf 0.00537381, total time[s] 0.077505 +Converged at iteration 30, L1 6.85034e-05, Linf 0.00461209, total time[s] 0.087764 +Converged at iteration 28, L1 6.76342e-05, Linf 0.00363747, total time[s] 0.07283 +Converged at iteration 30, L1 7.16369e-05, Linf 0.00444698, total time[s] 0.079249 +Converged at iteration 29, L1 9.85203e-05, Linf 0.0029367, total time[s] 0.08251 +Converged at iteration 29, L1 6.42614e-05, Linf 0.00132422, total time[s] 0.075108 +Converged at iteration 31, L1 6.48072e-05, Linf 0.00693638, total time[s] 0.079988 +Converged at iteration 29, L1 5.6364e-05, Linf 0.00788176, total time[s] 0.075533 +Converged at iteration 26, L1 8.91793e-05, Linf 0.00658363, total time[s] 0.06869 +Converged at iteration 24, L1 7.06953e-05, Linf 0.00247498, total time[s] 0.063832 +Converged at iteration 38, L1 5.39424e-05, Linf 0.0059504, total time[s] 0.097036 +Converged at iteration 34, L1 7.02225e-05, Linf 0.00612885, total time[s] 0.09924 +Converged at iteration 24, L1 9.92447e-05, Linf 0.00357157, total time[s] 0.07358 +Converged at iteration 29, L1 9.55421e-05, Linf 0.00665064, total time[s] 0.07999 +Converged at iteration 27, L1 6.02104e-05, Linf 0.00948458, total time[s] 0.075342 +Converged at iteration 24, L1 9.1892e-05, Linf 0.0101199, total time[s] 0.074322 +Converged at iteration 19, L1 9.72486e-05, Linf 0.00495159, total time[s] 0.088217 +Converged at iteration 20, L1 4.7129e-05, Linf 0.00336503, total time[s] 0.064922 +Converged at iteration 23, L1 9.05206e-05, Linf 0.00475893, total time[s] 0.067953 +Converged at iteration 25, L1 8.40024e-05, Linf 0.00702876, total time[s] 0.074885 +Converged at iteration 21, L1 8.44062e-05, Linf 0.00594468, total time[s] 0.070675 +Converged at iteration 17, L1 5.67113e-05, Linf 0.00490903, total time[s] 0.074335 +Converged at iteration 31, L1 7.01551e-05, Linf 0.00394387, total time[s] 0.093959 +Converged at iteration 17, L1 5.58358e-05, Linf 0.00523999, total time[s] 0.050523 +Converged at iteration 20, L1 9.40652e-05, Linf 0.00379661, total time[s] 0.059434 +Converged at iteration 27, L1 5.88014e-05, Linf 0.00248584, total time[s] 0.072139 +Converged at iteration 23, L1 7.75947e-05, Linf 0.00686232, total time[s] 0.068009 +Converged at iteration 22, L1 6.17113e-05, Linf 0.00351157, total time[s] 0.064688 +Converged at iteration 22, L1 7.7699e-05, Linf 0.00296772, total time[s] 0.062254 +Converged at iteration 25, L1 7.13745e-05, Linf 0.00196271, total time[s] 0.068256 +Converged at iteration 29, L1 7.08863e-05, Linf 0.00502015, total time[s] 0.077745 +Converged at iteration 30, L1 7.25933e-05, Linf 0.00482288, total time[s] 0.093799 +Converged at iteration 28, L1 6.84436e-05, Linf 0.0036344, total time[s] 0.092263 +Converged at iteration 30, L1 7.45912e-05, Linf 0.00460536, total time[s] 0.077206 +Converged at iteration 29, L1 9.88003e-05, Linf 0.00296581, total time[s] 0.07912 +Converged at iteration 29, L1 6.75192e-05, Linf 0.00127912, total time[s] 0.091512 +Converged at iteration 31, L1 5.73129e-05, Linf 0.00670714, total time[s] 0.079466 +Converged at iteration 29, L1 5.96603e-05, Linf 0.00833501, total time[s] 0.074538 +Converged at iteration 27, L1 5.31174e-05, Linf 0.00573713, total time[s] 0.071163 +Converged at iteration 24, L1 7.46218e-05, Linf 0.00260621, total time[s] 0.062991 +Converged at iteration 37, L1 9.59649e-05, Linf 0.00705314, total time[s] 0.109885 +Converged at iteration 34, L1 6.62354e-05, Linf 0.00581588, total time[s] 0.099597 +Converged at iteration 24, L1 9.99965e-05, Linf 0.00363763, total time[s] 0.0646 +Converged at iteration 29, L1 8.85167e-05, Linf 0.00657568, total time[s] 0.077526 +Converged at iteration 27, L1 6.2942e-05, Linf 0.00984981, total time[s] 0.070855 +Converged at iteration 25, L1 4.47352e-05, Linf 0.00891583, total time[s] 0.068088 +Converged at iteration 20, L1 4.19212e-05, Linf 0.00377614, total time[s] 0.058743 +Converged at iteration 20, L1 4.51472e-05, Linf 0.00336532, total time[s] 0.067463 +Converged at iteration 23, L1 9.17276e-05, Linf 0.00479462, total time[s] 0.090002 +Converged at iteration 25, L1 8.67431e-05, Linf 0.00719346, total time[s] 0.088945 +Converged at iteration 21, L1 8.5654e-05, Linf 0.00599744, total time[s] 0.070928 +Converged at iteration 17, L1 5.74652e-05, Linf 0.00476545, total time[s] 0.056603 +Converged at iteration 31, L1 6.80283e-05, Linf 0.00413133, total time[s] 0.100117 +Converged at iteration 16, L1 9.37703e-05, Linf 0.00744286, total time[s] 0.045615 +Converged at iteration 20, L1 6.64838e-05, Linf 0.00282943, total time[s] 0.056648 +Converged at iteration 27, L1 5.99177e-05, Linf 0.00262957, total time[s] 0.075341 +Converged at iteration 23, L1 8.12984e-05, Linf 0.00699079, total time[s] 0.062353 +Converged at iteration 22, L1 6.61034e-05, Linf 0.00324686, total time[s] 0.060739 +Converged at iteration 22, L1 8.22395e-05, Linf 0.00310242, total time[s] 0.060804 +Converged at iteration 25, L1 6.81407e-05, Linf 0.00189778, total time[s] 0.066859 +Converged at iteration 29, L1 7.14754e-05, Linf 0.00505656, total time[s] 0.07704 +Converged at iteration 30, L1 7.62e-05, Linf 0.00504162, total time[s] 0.07898 +Converged at iteration 28, L1 6.88424e-05, Linf 0.00373631, total time[s] 0.075225 +Converged at iteration 30, L1 7.74867e-05, Linf 0.00477926, total time[s] 0.083148 +Converged at iteration 30, L1 6.31823e-05, Linf 0.00227785, total time[s] 0.080282 +Converged at iteration 29, L1 7.15452e-05, Linf 0.00127223, total time[s] 0.077955 +Converged at iteration 30, L1 9.51564e-05, Linf 0.00849788, total time[s] 0.08477 +Converged at iteration 29, L1 6.46537e-05, Linf 0.00895426, total time[s] 0.079012 +Converged at iteration 27, L1 6.03053e-05, Linf 0.00642206, total time[s] 0.072596 +Converged at iteration 24, L1 7.91332e-05, Linf 0.00272328, total time[s] 0.065061 +Converged at iteration 37, L1 9.02789e-05, Linf 0.00674913, total time[s] 0.098739 +Converged at iteration 34, L1 6.14396e-05, Linf 0.00556258, total time[s] 0.097705 +Converged at iteration 25, L1 4.35132e-05, Linf 0.00209156, total time[s] 0.069213 +Converged at iteration 29, L1 8.21031e-05, Linf 0.00647134, total time[s] 0.078008 +Converged at iteration 27, L1 6.48461e-05, Linf 0.0103459, total time[s] 0.072859 +Converged at iteration 25, L1 4.91378e-05, Linf 0.00976522, total time[s] 0.070588 +Converged at iteration 20, L1 4.55462e-05, Linf 0.00405294, total time[s] 0.06129 +Converged at iteration 20, L1 4.35068e-05, Linf 0.00338319, total time[s] 0.064312 +Converged at iteration 23, L1 9.24417e-05, Linf 0.00486241, total time[s] 0.08503 +Converged at iteration 25, L1 9.12731e-05, Linf 0.00735185, total time[s] 0.148566 +Converged at iteration 21, L1 8.62858e-05, Linf 0.00598798, total time[s] 0.121919 +Converged at iteration 17, L1 5.86869e-05, Linf 0.00457406, total time[s] 0.057793 +Converged at iteration 31, L1 6.61865e-05, Linf 0.00433133, total time[s] 0.104879 +Converged at iteration 16, L1 9.88126e-05, Linf 0.0066521, total time[s] 0.050472 +Converged at iteration 18, L1 9.96366e-05, Linf 0.00393319, total time[s] 0.095656 +Converged at iteration 27, L1 6.36486e-05, Linf 0.00281761, total time[s] 0.083528 +Converged at iteration 23, L1 8.57688e-05, Linf 0.00720643, total time[s] 0.070551 +Converged at iteration 22, L1 7.09399e-05, Linf 0.00358598, total time[s] 0.064798 +Converged at iteration 22, L1 8.92112e-05, Linf 0.00336634, total time[s] 0.063771 +Converged at iteration 24, L1 9.80309e-05, Linf 0.00196503, total time[s] 0.089772 +Converged at iteration 29, L1 7.21076e-05, Linf 0.0050691, total time[s] 0.092167 +Converged at iteration 30, L1 7.97669e-05, Linf 0.00529289, total time[s] 0.07879 +Converged at iteration 28, L1 6.89603e-05, Linf 0.00372062, total time[s] 0.073684 +Converged at iteration 30, L1 8.12678e-05, Linf 0.00496227, total time[s] 0.079515 +Converged at iteration 30, L1 6.49195e-05, Linf 0.00232063, total time[s] 0.077567 +Converged at iteration 29, L1 7.73907e-05, Linf 0.00133593, total time[s] 0.076926 +Converged at iteration 30, L1 8.67654e-05, Linf 0.00835564, total time[s] 0.079644 +Converged at iteration 29, L1 7.14057e-05, Linf 0.00962424, total time[s] 0.078524 +Converged at iteration 27, L1 6.90111e-05, Linf 0.00715278, total time[s] 0.072478 +Converged at iteration 24, L1 8.31613e-05, Linf 0.0028426, total time[s] 0.065351 +Converged at iteration 37, L1 8.43984e-05, Linf 0.00646148, total time[s] 0.103128 +Converged at iteration 34, L1 5.635e-05, Linf 0.0053512, total time[s] 0.097374 +Converged at iteration 25, L1 4.53729e-05, Linf 0.0020797, total time[s] 0.070245 +Converged at iteration 29, L1 7.42377e-05, Linf 0.0063522, total time[s] 0.077219 +Converged at iteration 27, L1 6.72346e-05, Linf 0.010861, total time[s] 0.072264 +Converged at iteration 25, L1 5.48395e-05, Linf 0.0106604, total time[s] 0.069906 +Converged at iteration 20, L1 4.91882e-05, Linf 0.00424555, total time[s] 0.058164 +Converged at iteration 20, L1 4.15953e-05, Linf 0.00337576, total time[s] 0.072155 +Converged at iteration 23, L1 9.45885e-05, Linf 0.00488747, total time[s] 0.077331 +Converged at iteration 25, L1 8.92772e-05, Linf 0.007508, total time[s] 0.077277 +Converged at iteration 21, L1 8.58333e-05, Linf 0.00613158, total time[s] 0.067726 +Converged at iteration 17, L1 6.07322e-05, Linf 0.00434311, total time[s] 0.062705 +Converged at iteration 31, L1 6.36051e-05, Linf 0.0045515, total time[s] 0.095306 +Converged at iteration 17, L1 7.81882e-05, Linf 0.0030011, total time[s] 0.049431 +Converged at iteration 18, L1 8.10908e-05, Linf 0.00253347, total time[s] 0.05029 +Converged at iteration 27, L1 6.621e-05, Linf 0.00297541, total time[s] 0.0714 +Converged at iteration 23, L1 9.17465e-05, Linf 0.00743993, total time[s] 0.062155 +Converged at iteration 22, L1 7.52641e-05, Linf 0.00387023, total time[s] 0.059681 +Converged at iteration 22, L1 9.84049e-05, Linf 0.00357853, total time[s] 0.06098 +Converged at iteration 24, L1 9.15023e-05, Linf 0.00161207, total time[s] 0.066972 +Converged at iteration 29, L1 7.27907e-05, Linf 0.00525109, total time[s] 0.078403 +Converged at iteration 30, L1 8.45311e-05, Linf 0.00560769, total time[s] 0.078646 +Converged at iteration 28, L1 6.90145e-05, Linf 0.00325091, total time[s] 0.073537 +Converged at iteration 30, L1 8.4524e-05, Linf 0.00515602, total time[s] 0.082329 +Converged at iteration 30, L1 6.69902e-05, Linf 0.00235979, total time[s] 0.07661 +Converged at iteration 29, L1 8.41279e-05, Linf 0.00154463, total time[s] 0.074867 +Converged at iteration 30, L1 7.99663e-05, Linf 0.00821485, total time[s] 0.076803 +Converged at iteration 29, L1 7.83367e-05, Linf 0.0103363, total time[s] 0.075293 +Converged at iteration 27, L1 7.92061e-05, Linf 0.00782326, total time[s] 0.069554 +Converged at iteration 24, L1 8.77689e-05, Linf 0.0029605, total time[s] 0.066063 +Converged at iteration 37, L1 7.85992e-05, Linf 0.00629849, total time[s] 0.102033 +Converged at iteration 34, L1 5.15806e-05, Linf 0.00511783, total time[s] 0.100839 +Converged at iteration 25, L1 4.69193e-05, Linf 0.00205853, total time[s] 0.06626 +Converged at iteration 29, L1 6.83677e-05, Linf 0.00619138, total time[s] 0.074381 +Converged at iteration 27, L1 7.06854e-05, Linf 0.0113808, total time[s] 0.071298 +Converged at iteration 25, L1 6.12669e-05, Linf 0.0114622, total time[s] 0.066832 +Converged at iteration 20, L1 5.25892e-05, Linf 0.00444016, total time[s] 0.055733 +Converged at iteration 19, L1 9.55839e-05, Linf 0.0051025, total time[s] 0.065052 +Converged at iteration 23, L1 9.58907e-05, Linf 0.00488197, total time[s] 0.08103 +Converged at iteration 25, L1 8.19638e-05, Linf 0.00766036, total time[s] 0.0734 +Converged at iteration 21, L1 8.5554e-05, Linf 0.00598002, total time[s] 0.072379 +Converged at iteration 17, L1 6.27364e-05, Linf 0.00408134, total time[s] 0.051293 +Converged at iteration 31, L1 6.09316e-05, Linf 0.00477025, total time[s] 0.091979 +Converged at iteration 18, L1 7.19069e-05, Linf 0.00155536, total time[s] 0.057005 +Converged at iteration 19, L1 7.07373e-05, Linf 0.0015676, total time[s] 0.057649 +Converged at iteration 27, L1 7.07529e-05, Linf 0.00311523, total time[s] 0.079897 +Converged at iteration 23, L1 9.75268e-05, Linf 0.00778004, total time[s] 0.067213 +Converged at iteration 22, L1 7.88762e-05, Linf 0.00429475, total time[s] 0.060418 +Converged at iteration 23, L1 6.51398e-05, Linf 0.00279824, total time[s] 0.063943 +Converged at iteration 24, L1 8.57652e-05, Linf 0.00162847, total time[s] 0.07505 +Converged at iteration 29, L1 7.28058e-05, Linf 0.00482242, total time[s] 0.108599 +Converged at iteration 30, L1 8.90759e-05, Linf 0.00578939, total time[s] 0.087464 +Converged at iteration 28, L1 6.92891e-05, Linf 0.00314929, total time[s] 0.082251 +Converged at iteration 30, L1 8.94878e-05, Linf 0.00543147, total time[s] 0.087872 +Converged at iteration 30, L1 7.09191e-05, Linf 0.00240109, total time[s] 0.086586 +Converged at iteration 29, L1 9.1427e-05, Linf 0.00173469, total time[s] 0.117952 +Converged at iteration 30, L1 7.47826e-05, Linf 0.00807349, total time[s] 0.111625 +Converged at iteration 29, L1 8.60054e-05, Linf 0.0110931, total time[s] 0.07768 +Converged at iteration 27, L1 9.02115e-05, Linf 0.00868826, total time[s] 0.069736 +Converged at iteration 24, L1 9.11972e-05, Linf 0.00308732, total time[s] 0.062642 +Converged at iteration 37, L1 7.26396e-05, Linf 0.00599294, total time[s] 0.09858 +Converged at iteration 33, L1 9.75891e-05, Linf 0.0062723, total time[s] 0.087856 +Converged at iteration 25, L1 4.73648e-05, Linf 0.00202924, total time[s] 0.064815 +Converged at iteration 29, L1 6.03973e-05, Linf 0.00598711, total time[s] 0.074091 +Converged at iteration 27, L1 7.40225e-05, Linf 0.0118755, total time[s] 0.070078 +Converged at iteration 25, L1 6.78902e-05, Linf 0.0124486, total time[s] 0.065525 +Converged at iteration 20, L1 5.59937e-05, Linf 0.00464697, total time[s] 0.053781 +Converged at iteration 19, L1 8.78604e-05, Linf 0.00512265, total time[s] 0.050511 +Converged at iteration 23, L1 9.99486e-05, Linf 0.00490026, total time[s] 0.06043 +Converged at iteration 25, L1 7.07985e-05, Linf 0.00778487, total time[s] 0.066763 +Converged at iteration 21, L1 8.48592e-05, Linf 0.00592165, total time[s] 0.061205 +Converged at iteration 17, L1 6.64399e-05, Linf 0.00375712, total time[s] 0.046218 +Converged at iteration 31, L1 5.84768e-05, Linf 0.00504367, total time[s] 0.085827 +Converged at iteration 18, L1 9.1667e-05, Linf 0.00212375, total time[s] 0.049526 +Converged at iteration 20, L1 6.66286e-05, Linf 0.00208218, total time[s] 0.054879 +Converged at iteration 27, L1 7.45127e-05, Linf 0.00329913, total time[s] 0.084966 +Converged at iteration 24, L1 4.79279e-05, Linf 0.00379995, total time[s] 0.064822 +Converged at iteration 22, L1 8.39229e-05, Linf 0.00462678, total time[s] 0.059876 +Converged at iteration 23, L1 7.26756e-05, Linf 0.00286634, total time[s] 0.063657 +Converged at iteration 24, L1 7.83873e-05, Linf 0.00163611, total time[s] 0.064871 +Converged at iteration 29, L1 7.27194e-05, Linf 0.00511982, total time[s] 0.078667 +Converged at iteration 30, L1 9.43803e-05, Linf 0.00609466, total time[s] 0.079295 +Converged at iteration 28, L1 6.89518e-05, Linf 0.00291061, total time[s] 0.073682 +Converged at iteration 30, L1 9.21473e-05, Linf 0.00558924, total time[s] 0.078674 +Converged at iteration 30, L1 7.17648e-05, Linf 0.00245144, total time[s] 0.081161 +Converged at iteration 30, L1 5.28782e-05, Linf 0.00113137, total time[s] 0.078531 +Converged at iteration 30, L1 6.97147e-05, Linf 0.00791712, total time[s] 0.079292 +Converged at iteration 29, L1 9.36512e-05, Linf 0.0119064, total time[s] 0.076283 +Converged at iteration 28, L1 4.76821e-05, Linf 0.00745432, total time[s] 0.073433 +Converged at iteration 24, L1 9.65442e-05, Linf 0.00323438, total time[s] 0.065443 +Converged at iteration 37, L1 6.6669e-05, Linf 0.0058106, total time[s] 0.097868 +Converged at iteration 33, L1 9.15178e-05, Linf 0.00601147, total time[s] 0.086786 +Converged at iteration 25, L1 4.98748e-05, Linf 0.00200566, total time[s] 0.066296 +Converged at iteration 29, L1 5.64449e-05, Linf 0.00580391, total time[s] 0.077202 +Converged at iteration 27, L1 7.79051e-05, Linf 0.0123063, total time[s] 0.07103 +Converged at iteration 25, L1 7.45436e-05, Linf 0.0132704, total time[s] 0.066283 +Converged at iteration 20, L1 5.97529e-05, Linf 0.00504046, total time[s] 0.054682 +Converged at iteration 19, L1 7.98457e-05, Linf 0.00513642, total time[s] 0.051889 +Converged at iteration 24, L1 5.37252e-05, Linf 0.00302661, total time[s] 0.063944 +Converged at iteration 25, L1 5.89724e-05, Linf 0.0078514, total time[s] 0.067272 +Converged at iteration 21, L1 8.35535e-05, Linf 0.00589299, total time[s] 0.057188 +Converged at iteration 17, L1 7.08403e-05, Linf 0.00338354, total time[s] 0.051231 +Converged at iteration 31, L1 5.69904e-05, Linf 0.00531615, total time[s] 0.081533 +Converged at iteration 19, L1 7.19134e-05, Linf 0.00273851, total time[s] 0.053265 +Converged at iteration 20, L1 9.2408e-05, Linf 0.00296747, total time[s] 0.054224 +Converged at iteration 27, L1 7.70393e-05, Linf 0.00349615, total time[s] 0.071981 +Converged at iteration 24, L1 5.30429e-05, Linf 0.00402398, total time[s] 0.063726 +Converged at iteration 22, L1 8.86812e-05, Linf 0.00492129, total time[s] 0.060131 +Converged at iteration 23, L1 8.16905e-05, Linf 0.00300487, total time[s] 0.063371 +Converged at iteration 24, L1 7.10041e-05, Linf 0.00168536, total time[s] 0.069665 +Converged at iteration 29, L1 7.22218e-05, Linf 0.00516833, total time[s] 0.075847 +Converged at iteration 31, L1 5.26227e-05, Linf 0.00346755, total time[s] 0.096279 +Converged at iteration 28, L1 6.81766e-05, Linf 0.0030131, total time[s] 0.079698 +Converged at iteration 30, L1 9.58534e-05, Linf 0.00591864, total time[s] 0.090878 +Converged at iteration 30, L1 7.46025e-05, Linf 0.0025217, total time[s] 0.078486 +Converged at iteration 30, L1 5.68175e-05, Linf 0.00121777, total time[s] 0.078092 +Converged at iteration 30, L1 6.56688e-05, Linf 0.0077387, total time[s] 0.078294 +Converged at iteration 30, L1 3.96888e-05, Linf 0.00944091, total time[s] 0.078226 +Converged at iteration 28, L1 5.51e-05, Linf 0.00818311, total time[s] 0.073604 +Converged at iteration 25, L1 5.33378e-05, Linf 0.0020429, total time[s] 0.067406 +Converged at iteration 37, L1 6.08227e-05, Linf 0.00564841, total time[s] 0.100374 +Converged at iteration 33, L1 8.65939e-05, Linf 0.00572919, total time[s] 0.091591 +Converged at iteration 25, L1 5.02091e-05, Linf 0.00205503, total time[s] 0.070299 +Converged at iteration 28, L1 9.80779e-05, Linf 0.00770317, total time[s] 0.078976 +Converged at iteration 27, L1 8.08663e-05, Linf 0.0126663, total time[s] 0.080684 +Converged at iteration 25, L1 8.0986e-05, Linf 0.0139516, total time[s] 0.093261 +Converged at iteration 20, L1 6.40554e-05, Linf 0.00542579, total time[s] 0.062656 +Converged at iteration 19, L1 7.45085e-05, Linf 0.00515798, total time[s] 0.050988 +Converged at iteration 24, L1 5.36688e-05, Linf 0.00299871, total time[s] 0.073364 +Converged at iteration 25, L1 4.93645e-05, Linf 0.00784244, total time[s] 0.066595 +Converged at iteration 21, L1 8.10943e-05, Linf 0.0058761, total time[s] 0.05598 +Converged at iteration 17, L1 7.68312e-05, Linf 0.00296543, total time[s] 0.046939 +Converged at iteration 31, L1 5.65743e-05, Linf 0.00562401, total time[s] 0.082472 +Converged at iteration 19, L1 8.4196e-05, Linf 0.0033489, total time[s] 0.051822 +Converged at iteration 21, L1 7.70316e-05, Linf 0.00353691, total time[s] 0.058121 +Converged at iteration 27, L1 7.73039e-05, Linf 0.00361855, total time[s] 0.083672 +Converged at iteration 24, L1 5.74457e-05, Linf 0.00421879, total time[s] 0.067254 +Converged at iteration 22, L1 9.32287e-05, Linf 0.00510366, total time[s] 0.065527 +Converged at iteration 23, L1 9.18699e-05, Linf 0.00354732, total time[s] 0.065591 +Converged at iteration 23, L1 9.05478e-05, Linf 0.00243259, total time[s] 0.063976 +Converged at iteration 29, L1 7.14839e-05, Linf 0.00522569, total time[s] 0.081779 +Converged at iteration 31, L1 5.60579e-05, Linf 0.00377739, total time[s] 0.087412 +Converged at iteration 28, L1 6.66804e-05, Linf 0.00279452, total time[s] 0.094016 +Converged at iteration 30, L1 9.99231e-05, Linf 0.00611369, total time[s] 0.080501 +Converged at iteration 30, L1 7.79154e-05, Linf 0.00264083, total time[s] 0.080071 +Converged at iteration 30, L1 6.04497e-05, Linf 0.00131298, total time[s] 0.079942 +Converged at iteration 30, L1 6.2214e-05, Linf 0.00753119, total time[s] 0.077641 +Converged at iteration 30, L1 4.36884e-05, Linf 0.0100745, total time[s] 0.087878 +Converged at iteration 28, L1 6.16278e-05, Linf 0.00892669, total time[s] 0.095812 +Converged at iteration 25, L1 5.47829e-05, Linf 0.00207759, total time[s] 0.06928 +Converged at iteration 37, L1 5.53933e-05, Linf 0.00550274, total time[s] 0.09622 +Converged at iteration 33, L1 8.29163e-05, Linf 0.00543226, total time[s] 0.087864 +Converged at iteration 25, L1 5.17646e-05, Linf 0.00212555, total time[s] 0.066566 +Converged at iteration 28, L1 9.26059e-05, Linf 0.00763939, total time[s] 0.073661 +Converged at iteration 27, L1 8.25855e-05, Linf 0.0129754, total time[s] 0.076382 +Converged at iteration 25, L1 8.75093e-05, Linf 0.0148977, total time[s] 0.070132 +Converged at iteration 20, L1 6.87114e-05, Linf 0.00582433, total time[s] 0.055914 +Converged at iteration 19, L1 7.08535e-05, Linf 0.00516787, total time[s] 0.053447 +Converged at iteration 24, L1 5.45173e-05, Linf 0.00296013, total time[s] 0.065009 +Converged at iteration 24, L1 9.34638e-05, Linf 0.0105404, total time[s] 0.067073 +Converged at iteration 21, L1 7.78579e-05, Linf 0.00588069, total time[s] 0.056669 +Converged at iteration 17, L1 8.40965e-05, Linf 0.00250075, total time[s] 0.048512 +Converged at iteration 31, L1 5.7359e-05, Linf 0.00591076, total time[s] 0.082099 +Converged at iteration 20, L1 6.05269e-05, Linf 0.00361635, total time[s] 0.055004 +Converged at iteration 21, L1 9.27824e-05, Linf 0.00454808, total time[s] 0.056757 +Converged at iteration 27, L1 7.86051e-05, Linf 0.00368761, total time[s] 0.071741 +Converged at iteration 24, L1 6.10794e-05, Linf 0.00439036, total time[s] 0.065187 +Converged at iteration 22, L1 9.86698e-05, Linf 0.00530287, total time[s] 0.060289 +Converged at iteration 24, L1 5.85813e-05, Linf 0.00294988, total time[s] 0.065505 +Converged at iteration 23, L1 8.15434e-05, Linf 0.00242975, total time[s] 0.068184 +Converged at iteration 29, L1 7.00323e-05, Linf 0.00523921, total time[s] 0.07733 +Converged at iteration 31, L1 5.93282e-05, Linf 0.00392718, total time[s] 0.082137 +Converged at iteration 28, L1 6.48934e-05, Linf 0.00274713, total time[s] 0.074604 +Converged at iteration 31, L1 5.52579e-05, Linf 0.00492737, total time[s] 0.081949 +Converged at iteration 30, L1 8.12324e-05, Linf 0.00276203, total time[s] 0.079114 +Converged at iteration 30, L1 6.43778e-05, Linf 0.00142184, total time[s] 0.079326 +Converged at iteration 30, L1 5.91369e-05, Linf 0.00723119, total time[s] 0.080582 +Converged at iteration 30, L1 4.78025e-05, Linf 0.0107882, total time[s] 0.079344 +Converged at iteration 28, L1 6.97365e-05, Linf 0.00984103, total time[s] 0.078914 +Converged at iteration 25, L1 5.62319e-05, Linf 0.00213254, total time[s] 0.067567 +Converged at iteration 36, L1 9.55507e-05, Linf 0.00680017, total time[s] 0.094912 +Converged at iteration 33, L1 8.08357e-05, Linf 0.0051223, total time[s] 0.08812 +Converged at iteration 25, L1 5.35608e-05, Linf 0.00221133, total time[s] 0.067196 +Converged at iteration 28, L1 8.39098e-05, Linf 0.00759057, total time[s] 0.075443 +Converged at iteration 27, L1 8.23312e-05, Linf 0.0125084, total time[s] 0.071545 +Converged at iteration 25, L1 9.58706e-05, Linf 0.0158179, total time[s] 0.06654 +Converged at iteration 20, L1 7.37834e-05, Linf 0.0067125, total time[s] 0.056238 +Converged at iteration 19, L1 6.92031e-05, Linf 0.00518824, total time[s] 0.052984 +Converged at iteration 24, L1 5.51616e-05, Linf 0.00292009, total time[s] 0.064817 +Converged at iteration 24, L1 7.92869e-05, Linf 0.0104351, total time[s] 0.064276 +Converged at iteration 21, L1 7.30387e-05, Linf 0.00589337, total time[s] 0.057927 +Converged at iteration 17, L1 9.38284e-05, Linf 0.00215993, total time[s] 0.04814 +Converged at iteration 31, L1 5.96329e-05, Linf 0.00623832, total time[s] 0.081578 +Converged at iteration 20, L1 7.18509e-05, Linf 0.00453376, total time[s] 0.05627 +Converged at iteration 22, L1 6.34745e-05, Linf 0.00429574, total time[s] 0.060141 +Converged at iteration 27, L1 8.15434e-05, Linf 0.00382103, total time[s] 0.087003 +Converged at iteration 24, L1 6.45332e-05, Linf 0.00453674, total time[s] 0.081299 +Converged at iteration 23, L1 5.63521e-05, Linf 0.00347781, total time[s] 0.061658 +Converged at iteration 24, L1 6.53772e-05, Linf 0.00341284, total time[s] 0.064625 +Converged at iteration 23, L1 7.56589e-05, Linf 0.00285503, total time[s] 0.06198 +Converged at iteration 29, L1 6.73918e-05, Linf 0.00526346, total time[s] 0.076097 +Converged at iteration 31, L1 6.43974e-05, Linf 0.00418069, total time[s] 0.08708 +Converged at iteration 28, L1 6.33151e-05, Linf 0.00272526, total time[s] 0.078568 +Converged at iteration 31, L1 5.66142e-05, Linf 0.00516678, total time[s] 0.087208 +Converged at iteration 30, L1 8.44457e-05, Linf 0.00283893, total time[s] 0.078651 +Converged at iteration 30, L1 6.72412e-05, Linf 0.00164181, total time[s] 0.079403 +Converged at iteration 30, L1 5.74898e-05, Linf 0.0069879, total time[s] 0.079991 +Converged at iteration 30, L1 5.26238e-05, Linf 0.0115172, total time[s] 0.081227 +Converged at iteration 28, L1 7.89259e-05, Linf 0.0105194, total time[s] 0.076016 +Converged at iteration 25, L1 5.67662e-05, Linf 0.00220994, total time[s] 0.071841 +Converged at iteration 36, L1 8.88072e-05, Linf 0.0066685, total time[s] 0.095525 +Converged at iteration 33, L1 8.03046e-05, Linf 0.00488131, total time[s] 0.088302 +Converged at iteration 25, L1 5.2944e-05, Linf 0.0022996, total time[s] 0.067595 +Converged at iteration 28, L1 7.26877e-05, Linf 0.00757382, total time[s] 0.07533 +Converged at iteration 27, L1 8.07493e-05, Linf 0.0119348, total time[s] 0.081445 +Converged at iteration 26, L1 2.89921e-05, Linf 0.0100003, total time[s] 0.09443 +Converged at iteration 20, L1 7.90253e-05, Linf 0.00706287, total time[s] 0.078797 +Converged at iteration 19, L1 6.93572e-05, Linf 0.00515025, total time[s] 0.06203 +Converged at iteration 24, L1 5.70852e-05, Linf 0.00288433, total time[s] 0.072292 +Converged at iteration 24, L1 6.69083e-05, Linf 0.0103394, total time[s] 0.09077 +Converged at iteration 21, L1 6.50887e-05, Linf 0.00585978, total time[s] 0.067099 +Converged at iteration 18, L1 5.42078e-05, Linf 0.00165387, total time[s] 0.049424 +Converged at iteration 31, L1 6.21963e-05, Linf 0.00657218, total time[s] 0.082253 +Converged at iteration 20, L1 8.99369e-05, Linf 0.00493295, total time[s] 0.054628 +Converged at iteration 22, L1 6.9459e-05, Linf 0.0049952, total time[s] 0.063106 +Converged at iteration 27, L1 8.49531e-05, Linf 0.00398614, total time[s] 0.070752 +Converged at iteration 24, L1 6.69212e-05, Linf 0.00468962, total time[s] 0.06391 +Converged at iteration 23, L1 5.88679e-05, Linf 0.00357496, total time[s] 0.062342 +Converged at iteration 24, L1 7.31921e-05, Linf 0.00397073, total time[s] 0.071424 +Converged at iteration 23, L1 7.50649e-05, Linf 0.00372247, total time[s] 0.062884 +Converged at iteration 28, L1 9.97994e-05, Linf 0.00643982, total time[s] 0.076494 +Converged at iteration 31, L1 6.82936e-05, Linf 0.00435037, total time[s] 0.08103 +Converged at iteration 28, L1 6.15025e-05, Linf 0.00272608, total time[s] 0.07434 +Converged at iteration 31, L1 5.88839e-05, Linf 0.0054153, total time[s] 0.080611 +Converged at iteration 30, L1 8.76665e-05, Linf 0.00292151, total time[s] 0.077612 +Converged at iteration 30, L1 7.2704e-05, Linf 0.00185902, total time[s] 0.079936 +Converged at iteration 30, L1 5.65849e-05, Linf 0.00657548, total time[s] 0.078411 +Converged at iteration 30, L1 5.77156e-05, Linf 0.0125725, total time[s] 0.078592 +Converged at iteration 28, L1 8.89374e-05, Linf 0.01143, total time[s] 0.073303 +Converged at iteration 25, L1 5.68431e-05, Linf 0.00224666, total time[s] 0.067627 +Converged at iteration 36, L1 8.31839e-05, Linf 0.00647952, total time[s] 0.111166 +Converged at iteration 33, L1 8.10869e-05, Linf 0.0047335, total time[s] 0.091787 +Converged at iteration 25, L1 5.45406e-05, Linf 0.00237888, total time[s] 0.0663 +Converged at iteration 28, L1 5.4438e-05, Linf 0.00749503, total time[s] 0.077594 +Converged at iteration 27, L1 7.7611e-05, Linf 0.0119539, total time[s] 0.074394 +Converged at iteration 26, L1 3.15539e-05, Linf 0.0112023, total time[s] 0.071139 +Converged at iteration 20, L1 8.60357e-05, Linf 0.00737293, total time[s] 0.054689 +Converged at iteration 19, L1 7.14615e-05, Linf 0.00508332, total time[s] 0.051901 +Converged at iteration 24, L1 5.95145e-05, Linf 0.00284937, total time[s] 0.064316 +Converged at iteration 24, L1 5.48155e-05, Linf 0.00990177, total time[s] 0.064667 +Converged at iteration 21, L1 5.34705e-05, Linf 0.00561608, total time[s] 0.063865 +Converged at iteration 18, L1 6.37105e-05, Linf 0.00195788, total time[s] 0.061169 +Converged at iteration 31, L1 6.51853e-05, Linf 0.00693451, total time[s] 0.096671 +Converged at iteration 21, L1 6.29663e-05, Linf 0.00342136, total time[s] 0.06626 +Converged at iteration 22, L1 7.65431e-05, Linf 0.00568508, total time[s] 0.066437 +Converged at iteration 27, L1 8.65594e-05, Linf 0.0041458, total time[s] 0.075663 +Converged at iteration 24, L1 6.96908e-05, Linf 0.00486972, total time[s] 0.067696 +Converged at iteration 23, L1 6.16503e-05, Linf 0.00375915, total time[s] 0.064237 +Converged at iteration 24, L1 8.30583e-05, Linf 0.00565334, total time[s] 0.064523 +Converged at iteration 23, L1 7.80825e-05, Linf 0.00467401, total time[s] 0.065604 +Converged at iteration 28, L1 9.53667e-05, Linf 0.006207, total time[s] 0.070694 +Converged at iteration 31, L1 7.45401e-05, Linf 0.00503096, total time[s] 0.080131 +Converged at iteration 27, L1 9.96828e-05, Linf 0.00364134, total time[s] 0.071092 +Converged at iteration 31, L1 5.88195e-05, Linf 0.0057031, total time[s] 0.080752 +Converged at iteration 30, L1 9.30854e-05, Linf 0.00303338, total time[s] 0.082526 +Converged at iteration 30, L1 8.17985e-05, Linf 0.00221156, total time[s] 0.077718 +Converged at iteration 30, L1 5.54285e-05, Linf 0.00605719, total time[s] 0.076968 +Converged at iteration 30, L1 6.42282e-05, Linf 0.0137855, total time[s] 0.077355 +Converged at iteration 29, L1 4.08498e-05, Linf 0.00902413, total time[s] 0.077239 +Converged at iteration 25, L1 5.69899e-05, Linf 0.00233679, total time[s] 0.064349 +Converged at iteration 36, L1 7.9501e-05, Linf 0.00640961, total time[s] 0.093212 +Converged at iteration 33, L1 8.29107e-05, Linf 0.00473492, total time[s] 0.088381 +Converged at iteration 25, L1 5.39325e-05, Linf 0.00243856, total time[s] 0.076889 +Converged at iteration 27, L1 7.3864e-05, Linf 0.00956595, total time[s] 0.080949 +Converged at iteration 27, L1 7.77844e-05, Linf 0.011435, total time[s] 0.07198 +Converged at iteration 26, L1 3.39505e-05, Linf 0.0110234, total time[s] 0.076423 +Converged at iteration 20, L1 9.22899e-05, Linf 0.00793303, total time[s] 0.060399 +Converged at iteration 19, L1 7.63115e-05, Linf 0.00502816, total time[s] 0.054023 +Converged at iteration 24, L1 5.96627e-05, Linf 0.00281005, total time[s] 0.08693 +Converged at iteration 24, L1 4.51816e-05, Linf 0.00954054, total time[s] 0.070149 +Converged at iteration 21, L1 4.43445e-05, Linf 0.00510251, total time[s] 0.066113 +Converged at iteration 18, L1 7.38803e-05, Linf 0.00221337, total time[s] 0.069671 +Converged at iteration 31, L1 6.73434e-05, Linf 0.00730563, total time[s] 0.097693 +Converged at iteration 21, L1 6.55994e-05, Linf 0.00379909, total time[s] 0.062348 +Converged at iteration 22, L1 8.59689e-05, Linf 0.00604421, total time[s] 0.06855 +Converged at iteration 27, L1 8.37745e-05, Linf 0.00420454, total time[s] 0.079505 +Converged at iteration 24, L1 7.17989e-05, Linf 0.00507598, total time[s] 0.068564 +Converged at iteration 23, L1 6.42163e-05, Linf 0.00389539, total time[s] 0.063091 +Converged at iteration 24, L1 9.14635e-05, Linf 0.00713713, total time[s] 0.065645 +Converged at iteration 23, L1 8.58387e-05, Linf 0.00556235, total time[s] 0.066236 +Converged at iteration 28, L1 9.00617e-05, Linf 0.00589118, total time[s] 0.076897 +Converged at iteration 31, L1 7.94788e-05, Linf 0.00523783, total time[s] 0.082287 +Converged at iteration 27, L1 9.70583e-05, Linf 0.00354605, total time[s] 0.072418 +Converged at iteration 31, L1 5.99211e-05, Linf 0.00601472, total time[s] 0.086816 +Converged at iteration 30, L1 9.49349e-05, Linf 0.00326788, total time[s] 0.07917 +Converged at iteration 30, L1 9.11468e-05, Linf 0.00255165, total time[s] 0.080943 +Converged at iteration 29, L1 9.90967e-05, Linf 0.00911382, total time[s] 0.07796 +Converged at iteration 30, L1 7.2698e-05, Linf 0.0149643, total time[s] 0.079569 +Converged at iteration 29, L1 4.60613e-05, Linf 0.0097082, total time[s] 0.079005 +Converged at iteration 25, L1 5.52807e-05, Linf 0.0023647, total time[s] 0.070017 +Converged at iteration 36, L1 7.6855e-05, Linf 0.00627923, total time[s] 0.0979 +Converged at iteration 33, L1 8.62046e-05, Linf 0.00489092, total time[s] 0.1008 +Converged at iteration 25, L1 5.38449e-05, Linf 0.00252607, total time[s] 0.091948 +Converged at iteration 27, L1 4.86252e-05, Linf 0.00924037, total time[s] 0.076053 +Converged at iteration 27, L1 8.10608e-05, Linf 0.0114823, total time[s] 0.077304 +Converged at iteration 26, L1 3.46594e-05, Linf 0.012508, total time[s] 0.102466 +Converged at iteration 20, L1 9.89131e-05, Linf 0.00822039, total time[s] 0.091576 +Converged at iteration 19, L1 7.92885e-05, Linf 0.0049359, total time[s] 0.08886 +Converged at iteration 24, L1 5.98466e-05, Linf 0.00277486, total time[s] 0.128512 +Converged at iteration 23, L1 9.87958e-05, Linf 0.0141295, total time[s] 0.093198 +Converged at iteration 20, L1 9.70179e-05, Linf 0.00687456, total time[s] 0.087374 +Converged at iteration 18, L1 8.15545e-05, Linf 0.00252769, total time[s] 0.083554 +Converged at iteration 31, L1 7.00354e-05, Linf 0.0077529, total time[s] 0.126866 +Converged at iteration 21, L1 6.37031e-05, Linf 0.00416863, total time[s] 0.083655 +Converged at iteration 22, L1 9.24391e-05, Linf 0.00684134, total time[s] 0.072856 +Converged at iteration 27, L1 7.98642e-05, Linf 0.00412651, total time[s] 0.092672 +Converged at iteration 24, L1 7.44406e-05, Linf 0.00534744, total time[s] 0.073808 +Converged at iteration 23, L1 6.77002e-05, Linf 0.00398793, total time[s] 0.071011 +Converged at iteration 25, L1 5.53244e-05, Linf 0.00361425, total time[s] 0.080469 +Converged at iteration 23, L1 9.76835e-05, Linf 0.00656478, total time[s] 0.065122 +Converged at iteration 28, L1 8.09913e-05, Linf 0.00551242, total time[s] 0.078079 +Converged at iteration 31, L1 8.6012e-05, Linf 0.00570702, total time[s] 0.083612 +Converged at iteration 27, L1 9.40206e-05, Linf 0.00346797, total time[s] 0.072236 +Converged at iteration 31, L1 6.02981e-05, Linf 0.00623901, total time[s] 0.099329 +Converged at iteration 30, L1 9.70124e-05, Linf 0.00330473, total time[s] 0.079911 +Converged at iteration 31, L1 5.07158e-05, Linf 0.00179452, total time[s] 0.087883 +Converged at iteration 29, L1 9.62649e-05, Linf 0.00862548, total time[s] 0.098487 +Converged at iteration 30, L1 8.37321e-05, Linf 0.0161448, total time[s] 0.082858 +Converged at iteration 29, L1 5.38038e-05, Linf 0.0104687, total time[s] 0.079108 +Converged at iteration 25, L1 5.3999e-05, Linf 0.00236411, total time[s] 0.074257 +Converged at iteration 36, L1 7.66571e-05, Linf 0.00631583, total time[s] 0.093989 +Converged at iteration 33, L1 8.98656e-05, Linf 0.00506484, total time[s] 0.086527 +Converged at iteration 25, L1 5.40059e-05, Linf 0.00262371, total time[s] 0.073959 +Converged at iteration 26, L1 8.17663e-05, Linf 0.0114973, total time[s] 0.069138 +Converged at iteration 27, L1 8.03913e-05, Linf 0.0120404, total time[s] 0.071504 +Converged at iteration 26, L1 3.54714e-05, Linf 0.0129011, total time[s] 0.070116 +Converged at iteration 21, L1 3.51292e-05, Linf 0.00590071, total time[s] 0.06874 +Converged at iteration 19, L1 8.32978e-05, Linf 0.00482567, total time[s] 0.056611 +Converged at iteration 24, L1 6.02872e-05, Linf 0.00274092, total time[s] 0.077356 +Converged at iteration 23, L1 8.8592e-05, Linf 0.0140545, total time[s] 0.079521 +Converged at iteration 20, L1 9.09838e-05, Linf 0.00628608, total time[s] 0.062932 +Converged at iteration 18, L1 8.74518e-05, Linf 0.00275699, total time[s] 0.067028 +Converged at iteration 31, L1 7.20079e-05, Linf 0.00812096, total time[s] 0.094037 +Converged at iteration 21, L1 8.15471e-05, Linf 0.00442131, total time[s] 0.066389 +Converged at iteration 22, L1 9.67514e-05, Linf 0.00736917, total time[s] 0.064153 +Converged at iteration 27, L1 7.72456e-05, Linf 0.00403927, total time[s] 0.072498 +Converged at iteration 24, L1 7.55894e-05, Linf 0.00555062, total time[s] 0.06461 +Converged at iteration 23, L1 6.95676e-05, Linf 0.00398972, total time[s] 0.062349 +Converged at iteration 25, L1 5.88736e-05, Linf 0.0038394, total time[s] 0.069759 +Converged at iteration 24, L1 6.29873e-05, Linf 0.00534136, total time[s] 0.063122 +Converged at iteration 28, L1 7.29515e-05, Linf 0.00526734, total time[s] 0.076009 +Converged at iteration 31, L1 8.89473e-05, Linf 0.00581517, total time[s] 0.08167 +Converged at iteration 27, L1 9.15638e-05, Linf 0.00338232, total time[s] 0.072101 +Converged at iteration 31, L1 6.11426e-05, Linf 0.00651905, total time[s] 0.08036 +Converged at iteration 30, L1 9.83781e-05, Linf 0.00334424, total time[s] 0.081253 +Converged at iteration 31, L1 5.39267e-05, Linf 0.00198296, total time[s] 0.082639 +Converged at iteration 29, L1 9.50092e-05, Linf 0.00817212, total time[s] 0.087415 +Converged at iteration 30, L1 9.23811e-05, Linf 0.0170473, total time[s] 0.079285 +Converged at iteration 29, L1 5.68893e-05, Linf 0.0110948, total time[s] 0.079605 +Converged at iteration 25, L1 5.36176e-05, Linf 0.00234138, total time[s] 0.068491 +Converged at iteration 36, L1 7.82175e-05, Linf 0.00655924, total time[s] 0.093922 +Converged at iteration 33, L1 9.58533e-05, Linf 0.00535529, total time[s] 0.089097 +Converged at iteration 25, L1 5.85905e-05, Linf 0.00275781, total time[s] 0.071804 +Converged at iteration 26, L1 5.68728e-05, Linf 0.0110946, total time[s] 0.068161 +Converged at iteration 27, L1 8.38844e-05, Linf 0.0124604, total time[s] 0.074242 +Converged at iteration 26, L1 3.737e-05, Linf 0.0133357, total time[s] 0.073887 +Converged at iteration 21, L1 3.70692e-05, Linf 0.00619566, total time[s] 0.093292 +Converged at iteration 19, L1 8.75331e-05, Linf 0.00465359, total time[s] 0.063362 +Converged at iteration 24, L1 6.32659e-05, Linf 0.0027008, total time[s] 0.08354 +Converged at iteration 23, L1 8.15702e-05, Linf 0.0135759, total time[s] 0.083294 +Converged at iteration 20, L1 8.70369e-05, Linf 0.00539782, total time[s] 0.071961 +Converged at iteration 18, L1 9.71673e-05, Linf 0.00309252, total time[s] 0.073324 +Converged at iteration 31, L1 7.44571e-05, Linf 0.00861687, total time[s] 0.089716 +Converged at iteration 21, L1 9.61378e-05, Linf 0.00453858, total time[s] 0.058339 +Converged at iteration 23, L1 5.73549e-05, Linf 0.0053285, total time[s] 0.062804 +Converged at iteration 27, L1 7.46627e-05, Linf 0.00390036, total time[s] 0.072041 +Converged at iteration 24, L1 7.72231e-05, Linf 0.00567177, total time[s] 0.063886 +Converged at iteration 23, L1 7.18474e-05, Linf 0.00424125, total time[s] 0.061665 +Converged at iteration 25, L1 6.36131e-05, Linf 0.00413994, total time[s] 0.066723 +Converged at iteration 24, L1 7.57626e-05, Linf 0.006173, total time[s] 0.064503 +Converged at iteration 28, L1 6.24996e-05, Linf 0.00512495, total time[s] 0.074375 +Converged at iteration 31, L1 9.32664e-05, Linf 0.00528518, total time[s] 0.083335 +Converged at iteration 27, L1 8.66956e-05, Linf 0.00321196, total time[s] 0.072312 +Converged at iteration 31, L1 6.2321e-05, Linf 0.00687518, total time[s] 0.08838 +Converged at iteration 31, L1 6.18205e-05, Linf 0.00220251, total time[s] 0.086671 +Converged at iteration 31, L1 6.37766e-05, Linf 0.00230303, total time[s] 0.081966 +Converged at iteration 29, L1 9.47132e-05, Linf 0.00757111, total time[s] 0.079667 +Converged at iteration 31, L1 3.23657e-05, Linf 0.00893854, total time[s] 0.090767 +Converged at iteration 29, L1 6.36163e-05, Linf 0.0118817, total time[s] 0.07777 +Converged at iteration 25, L1 5.23327e-05, Linf 0.00228322, total time[s] 0.067362 +Converged at iteration 36, L1 8.01883e-05, Linf 0.00684027, total time[s] 0.099035 +Converged at iteration 34, L1 4.49411e-05, Linf 0.00430427, total time[s] 0.115962 +Converged at iteration 25, L1 5.98725e-05, Linf 0.00289499, total time[s] 0.082626 +Converged at iteration 26, L1 4.27934e-05, Linf 0.0106458, total time[s] 0.068746 +Converged at iteration 27, L1 8.25559e-05, Linf 0.0133416, total time[s] 0.07152 +Converged at iteration 26, L1 3.90125e-05, Linf 0.0139373, total time[s] 0.073103 +Converged at iteration 21, L1 3.72924e-05, Linf 0.0063945, total time[s] 0.069309 +Converged at iteration 19, L1 8.94453e-05, Linf 0.00455623, total time[s] 0.068154 +Converged at iteration 24, L1 6.22973e-05, Linf 0.00265209, total time[s] 0.09537 +Converged at iteration 23, L1 7.73546e-05, Linf 0.0131998, total time[s] 0.069932 +Converged at iteration 20, L1 8.58101e-05, Linf 0.00495253, total time[s] 0.118852 +Converged at iteration 19, L1 4.96609e-05, Linf 0.00174932, total time[s] 0.062596 +Converged at iteration 31, L1 7.63832e-05, Linf 0.00897342, total time[s] 0.086663 +Converged at iteration 21, L1 9.82983e-05, Linf 0.00452678, total time[s] 0.072114 +Converged at iteration 23, L1 5.92112e-05, Linf 0.00553971, total time[s] 0.065051 +Converged at iteration 27, L1 7.28707e-05, Linf 0.00383997, total time[s] 0.072449 +Converged at iteration 24, L1 7.66696e-05, Linf 0.00566644, total time[s] 0.065503 +Converged at iteration 23, L1 7.38056e-05, Linf 0.00428931, total time[s] 0.063775 +Converged at iteration 25, L1 6.53231e-05, Linf 0.00428595, total time[s] 0.071859 +Converged at iteration 24, L1 8.64353e-05, Linf 0.00676019, total time[s] 0.065614 +Converged at iteration 27, L1 9.58976e-05, Linf 0.00662658, total time[s] 0.072639 +Converged at iteration 31, L1 9.67081e-05, Linf 0.00544499, total time[s] 0.082271 +Converged at iteration 27, L1 8.24945e-05, Linf 0.00309178, total time[s] 0.072601 +Converged at iteration 31, L1 6.37626e-05, Linf 0.0071002, total time[s] 0.082249 +Converged at iteration 31, L1 6.20822e-05, Linf 0.00229312, total time[s] 0.081856 +Converged at iteration 31, L1 6.71713e-05, Linf 0.00248927, total time[s] 0.083867 +Converged at iteration 29, L1 9.35629e-05, Linf 0.00710501, total time[s] 0.07648 +Converged at iteration 31, L1 3.53098e-05, Linf 0.00932179, total time[s] 0.083847 +Converged at iteration 29, L1 6.90264e-05, Linf 0.0124607, total time[s] 0.074596 +Converged at iteration 25, L1 5.21406e-05, Linf 0.00228312, total time[s] 0.065503 +Converged at iteration 36, L1 8.48105e-05, Linf 0.00737713, total time[s] 0.103231 +Converged at iteration 34, L1 4.89366e-05, Linf 0.00428635, total time[s] 0.099451 +Converged at iteration 25, L1 6.27538e-05, Linf 0.00299263, total time[s] 0.079449 +Converged at iteration 25, L1 8.68189e-05, Linf 0.0134391, total time[s] 0.064538 +Converged at iteration 27, L1 8.8977e-05, Linf 0.0135506, total time[s] 0.069894 +Converged at iteration 26, L1 4.22085e-05, Linf 0.0145932, total time[s] 0.06775 +Converged at iteration 21, L1 3.82662e-05, Linf 0.00653485, total time[s] 0.068991 +Converged at iteration 19, L1 9.14877e-05, Linf 0.00435612, total time[s] 0.068145 +Converged at iteration 24, L1 6.30098e-05, Linf 0.00270045, total time[s] 0.074744 +Converged at iteration 23, L1 7.5405e-05, Linf 0.0121229, total time[s] 0.09186 +Converged at iteration 20, L1 8.59798e-05, Linf 0.00501361, total time[s] 0.07434 +Converged at iteration 19, L1 5.78654e-05, Linf 0.00245326, total time[s] 0.08291 +Converged at iteration 31, L1 7.92632e-05, Linf 0.00950309, total time[s] 0.095253 +Converged at iteration 21, L1 9.98746e-05, Linf 0.00460543, total time[s] 0.061442 +Converged at iteration 23, L1 6.20586e-05, Linf 0.00614048, total time[s] 0.067763 +Converged at iteration 27, L1 7.04172e-05, Linf 0.00372652, total time[s] 0.073104 +Converged at iteration 24, L1 7.72962e-05, Linf 0.00557449, total time[s] 0.065668 +Converged at iteration 23, L1 7.75214e-05, Linf 0.00437296, total time[s] 0.062009 +Converged at iteration 25, L1 6.68842e-05, Linf 0.00443835, total time[s] 0.066245 +Converged at iteration 25, L1 5.88489e-05, Linf 0.00536608, total time[s] 0.066153 +Converged at iteration 27, L1 9.38253e-05, Linf 0.00667729, total time[s] 0.072301 +Converged at iteration 32, L1 5.41603e-05, Linf 0.00319289, total time[s] 0.082 +Converged at iteration 27, L1 7.85502e-05, Linf 0.00294943, total time[s] 0.075975 +Converged at iteration 31, L1 6.66229e-05, Linf 0.00744585, total time[s] 0.087304 +Converged at iteration 31, L1 6.32376e-05, Linf 0.00226962, total time[s] 0.079871 +Converged at iteration 31, L1 7.72826e-05, Linf 0.00291141, total time[s] 0.080204 +Converged at iteration 29, L1 9.39304e-05, Linf 0.00653081, total time[s] 0.074765 +Converged at iteration 31, L1 4.01528e-05, Linf 0.00929666, total time[s] 0.079711 +Converged at iteration 29, L1 7.54685e-05, Linf 0.0132503, total time[s] 0.076476 +Converged at iteration 25, L1 5.25434e-05, Linf 0.00236205, total time[s] 0.065126 +Converged at iteration 36, L1 8.65767e-05, Linf 0.00757639, total time[s] 0.0999 +Converged at iteration 34, L1 5.1676e-05, Linf 0.0046576, total time[s] 0.097456 +Converged at iteration 25, L1 6.15147e-05, Linf 0.00306048, total time[s] 0.067 +Converged at iteration 25, L1 7.42415e-05, Linf 0.0131081, total time[s] 0.073213 +Converged at iteration 27, L1 8.19812e-05, Linf 0.0136415, total time[s] 0.071054 +Converged at iteration 26, L1 4.44481e-05, Linf 0.0150221, total time[s] 0.071113 +Converged at iteration 21, L1 3.7898e-05, Linf 0.00671985, total time[s] 0.071824 +Converged at iteration 19, L1 9.04873e-05, Linf 0.00428939, total time[s] 0.068398 +Converged at iteration 24, L1 6.2143e-05, Linf 0.00261693, total time[s] 0.06773 +Converged at iteration 23, L1 7.38319e-05, Linf 0.0114762, total time[s] 0.078258 +Converged at iteration 20, L1 8.85772e-05, Linf 0.00501295, total time[s] 0.05798 +Converged at iteration 19, L1 5.73977e-05, Linf 0.00195912, total time[s] 0.059584 +Converged at iteration 31, L1 8.09611e-05, Linf 0.00986754, total time[s] 0.094299 +Converged at iteration 22, L1 6.83324e-05, Linf 0.00281527, total time[s] 0.07208 +Converged at iteration 23, L1 6.66638e-05, Linf 0.00605096, total time[s] 0.063629 +Converged at iteration 27, L1 6.91859e-05, Linf 0.00366509, total time[s] 0.073439 +Converged at iteration 24, L1 7.77855e-05, Linf 0.00550382, total time[s] 0.065247 +Converged at iteration 23, L1 7.946e-05, Linf 0.0043116, total time[s] 0.064682 +Converged at iteration 25, L1 6.77601e-05, Linf 0.00448549, total time[s] 0.067456 +Converged at iteration 25, L1 6.53487e-05, Linf 0.00573114, total time[s] 0.070337 +Converged at iteration 27, L1 9.2071e-05, Linf 0.00671005, total time[s] 0.079177 +Converged at iteration 32, L1 5.63551e-05, Linf 0.00322214, total time[s] 0.085383 +Converged at iteration 27, L1 7.52449e-05, Linf 0.00283824, total time[s] 0.07365 +Converged at iteration 31, L1 6.7144e-05, Linf 0.00763906, total time[s] 0.08741 +Converged at iteration 31, L1 6.31075e-05, Linf 0.00230526, total time[s] 0.090045 +Converged at iteration 31, L1 8.25779e-05, Linf 0.00316807, total time[s] 0.086563 +Converged at iteration 29, L1 9.40774e-05, Linf 0.00615767, total time[s] 0.079584 +Converged at iteration 31, L1 4.35754e-05, Linf 0.00997406, total time[s] 0.088403 +Converged at iteration 29, L1 7.85758e-05, Linf 0.0137578, total time[s] 0.080583 +Converged at iteration 25, L1 5.21212e-05, Linf 0.00243023, total time[s] 0.075306 +Converged at iteration 36, L1 9.16771e-05, Linf 0.00799348, total time[s] 0.101891 +Converged at iteration 34, L1 5.68272e-05, Linf 0.00470969, total time[s] 0.09385 +Converged at iteration 25, L1 6.00065e-05, Linf 0.0031053, total time[s] 0.069868 +Converged at iteration 25, L1 6.61151e-05, Linf 0.0126196, total time[s] 0.072725 +Converged at iteration 27, L1 7.69894e-05, Linf 0.0136525, total time[s] 0.077455 +Converged at iteration 26, L1 4.95784e-05, Linf 0.015583, total time[s] 0.07576 +Converged at iteration 21, L1 3.7542e-05, Linf 0.00684424, total time[s] 0.058792 +Converged at iteration 19, L1 8.82574e-05, Linf 0.00417953, total time[s] 0.055348 +Converged at iteration 24, L1 6.24153e-05, Linf 0.00254933, total time[s] 0.064268 +Converged at iteration 23, L1 7.33665e-05, Linf 0.01045, total time[s] 0.076215 +Converged at iteration 20, L1 9.01855e-05, Linf 0.00500422, total time[s] 0.055799 +Converged at iteration 19, L1 6.20094e-05, Linf 0.00207532, total time[s] 0.053602 +Converged at iteration 31, L1 8.28247e-05, Linf 0.0103883, total time[s] 0.082405 +Converged at iteration 22, L1 7.03119e-05, Linf 0.00290311, total time[s] 0.060948 +Converged at iteration 23, L1 7.20803e-05, Linf 0.00633098, total time[s] 0.063582 +Converged at iteration 27, L1 7.28661e-05, Linf 0.00364994, total time[s] 0.073017 +Converged at iteration 24, L1 7.15598e-05, Linf 0.00527822, total time[s] 0.066935 +Converged at iteration 23, L1 8.22726e-05, Linf 0.00440284, total time[s] 0.06697 +Converged at iteration 25, L1 6.92679e-05, Linf 0.00458324, total time[s] 0.074455 +Converged at iteration 25, L1 7.47474e-05, Linf 0.00611797, total time[s] 0.079159 +Converged at iteration 27, L1 8.90049e-05, Linf 0.0066747, total time[s] 0.08749 +Converged at iteration 32, L1 5.63344e-05, Linf 0.00324846, total time[s] 0.099332 +Converged at iteration 27, L1 7.05498e-05, Linf 0.00266541, total time[s] 0.114049 +Converged at iteration 31, L1 6.95135e-05, Linf 0.00789429, total time[s] 0.106472 +Converged at iteration 31, L1 6.33894e-05, Linf 0.00236, total time[s] 0.126412 +Converged at iteration 31, L1 9.6215e-05, Linf 0.00365568, total time[s] 0.087432 +Converged at iteration 29, L1 9.6597e-05, Linf 0.00574681, total time[s] 0.088578 +Converged at iteration 31, L1 4.87418e-05, Linf 0.0100069, total time[s] 0.094807 +Converged at iteration 29, L1 8.2127e-05, Linf 0.0144611, total time[s] 0.09141 +Converged at iteration 25, L1 5.2567e-05, Linf 0.00254916, total time[s] 0.07917 +Converged at iteration 36, L1 9.55356e-05, Linf 0.00817178, total time[s] 0.115007 +Converged at iteration 34, L1 5.99382e-05, Linf 0.00478964, total time[s] 0.111953 +Converged at iteration 25, L1 5.82361e-05, Linf 0.00319125, total time[s] 0.087079 +Converged at iteration 25, L1 5.58355e-05, Linf 0.0122655, total time[s] 0.099371 +Converged at iteration 27, L1 6.69521e-05, Linf 0.0135582, total time[s] 0.07367 +Converged at iteration 26, L1 4.9484e-05, Linf 0.015932, total time[s] 0.078258 +Converged at iteration 21, L1 3.73309e-05, Linf 0.00691576, total time[s] 0.071578 +Converged at iteration 19, L1 8.82271e-05, Linf 0.0041028, total time[s] 0.059062 +Converged at iteration 24, L1 6.34271e-05, Linf 0.00255298, total time[s] 0.075319 +Converged at iteration 23, L1 7.64409e-05, Linf 0.00982366, total time[s] 0.06989 +Converged at iteration 20, L1 9.18595e-05, Linf 0.00497867, total time[s] 0.066298 +Converged at iteration 19, L1 6.52655e-05, Linf 0.00214765, total time[s] 0.054343 +Converged at iteration 31, L1 8.41436e-05, Linf 0.0106887, total time[s] 0.121565 +Converged at iteration 22, L1 7.13711e-05, Linf 0.00297124, total time[s] 0.099808 +Converged at iteration 23, L1 7.32842e-05, Linf 0.00648681, total time[s] 0.103599 +Converged at iteration 27, L1 7.24278e-05, Linf 0.00366054, total time[s] 0.119609 +Converged at iteration 24, L1 6.9405e-05, Linf 0.00513902, total time[s] 0.114362 +Converged at iteration 23, L1 8.34174e-05, Linf 0.00447413, total time[s] 0.072895 +Converged at iteration 25, L1 7.01204e-05, Linf 0.0046388, total time[s] 0.069138 +Converged at iteration 25, L1 7.72121e-05, Linf 0.00648612, total time[s] 0.077534 +Converged at iteration 27, L1 8.62252e-05, Linf 0.00679238, total time[s] 0.077767 +Converged at iteration 32, L1 5.74175e-05, Linf 0.00322099, total time[s] 0.090304 +Converged at iteration 27, L1 6.72465e-05, Linf 0.00251919, total time[s] 0.072294 +Converged at iteration 31, L1 7.02943e-05, Linf 0.00814221, total time[s] 0.080813 +Converged at iteration 31, L1 6.30344e-05, Linf 0.00235665, total time[s] 0.08103 +Converged at iteration 32, L1 4.72549e-05, Linf 0.00222035, total time[s] 0.131716 +Converged at iteration 29, L1 9.89079e-05, Linf 0.0055007, total time[s] 0.078859 +Converged at iteration 31, L1 5.16812e-05, Linf 0.0119555, total time[s] 0.079441 +Converged at iteration 29, L1 8.25812e-05, Linf 0.0148652, total time[s] 0.074398 +Converged at iteration 25, L1 5.26618e-05, Linf 0.00257712, total time[s] 0.064672 +Converged at iteration 37, L1 4.94883e-05, Linf 0.00673369, total time[s] 0.097615 +Converged at iteration 34, L1 6.57195e-05, Linf 0.00557965, total time[s] 0.096167 +Converged at iteration 25, L1 5.82284e-05, Linf 0.00330572, total time[s] 0.072498 +Converged at iteration 25, L1 4.99075e-05, Linf 0.0117639, total time[s] 0.065793 +Converged at iteration 27, L1 5.73837e-05, Linf 0.0131236, total time[s] 0.069826 +Converged at iteration 26, L1 5.35695e-05, Linf 0.0166799, total time[s] 0.074062 +Converged at iteration 21, L1 3.8113e-05, Linf 0.00703171, total time[s] 0.073706 +Converged at iteration 19, L1 8.83148e-05, Linf 0.00391217, total time[s] 0.060817 +Converged at iteration 24, L1 6.34515e-05, Linf 0.00256376, total time[s] 0.084094 +Converged at iteration 23, L1 7.79214e-05, Linf 0.00912116, total time[s] 0.071405 +Converged at iteration 20, L1 9.54817e-05, Linf 0.00495853, total time[s] 0.058061 +Converged at iteration 19, L1 7.07587e-05, Linf 0.00228453, total time[s] 0.065756 +Converged at iteration 31, L1 8.45835e-05, Linf 0.011248, total time[s] 0.108502 +Converged at iteration 22, L1 7.0861e-05, Linf 0.00308446, total time[s] 0.062495 +Converged at iteration 23, L1 7.38593e-05, Linf 0.0067519, total time[s] 0.065801 +Converged at iteration 27, L1 7.15648e-05, Linf 0.00369665, total time[s] 0.069974 +Converged at iteration 24, L1 6.71814e-05, Linf 0.00483436, total time[s] 0.063857 +Converged at iteration 23, L1 8.55e-05, Linf 0.00456585, total time[s] 0.065721 +Converged at iteration 25, L1 7.32886e-05, Linf 0.00476417, total time[s] 0.067024 +Converged at iteration 25, L1 7.97553e-05, Linf 0.00705337, total time[s] 0.067408 +Converged at iteration 27, L1 8.44271e-05, Linf 0.00697869, total time[s] 0.074568 +Converged at iteration 32, L1 5.90213e-05, Linf 0.00324983, total time[s] 0.082429 +Converged at iteration 27, L1 6.36279e-05, Linf 0.0023209, total time[s] 0.070836 +Converged at iteration 31, L1 7.18415e-05, Linf 0.00848876, total time[s] 0.079739 +Converged at iteration 31, L1 6.34284e-05, Linf 0.00249961, total time[s] 0.079502 +Converged at iteration 32, L1 5.48737e-05, Linf 0.00249897, total time[s] 0.086805 +Converged at iteration 30, L1 6.69975e-05, Linf 0.00292688, total time[s] 0.079156 +Converged at iteration 31, L1 5.72109e-05, Linf 0.0129711, total time[s] 0.07767 +Converged at iteration 29, L1 8.40378e-05, Linf 0.0153163, total time[s] 0.074057 +Converged at iteration 25, L1 5.40374e-05, Linf 0.00258016, total time[s] 0.064807 +Converged at iteration 37, L1 5.13984e-05, Linf 0.0069557, total time[s] 0.092834 +Converged at iteration 34, L1 6.98669e-05, Linf 0.00550511, total time[s] 0.090095 +Converged at iteration 25, L1 5.78998e-05, Linf 0.00339205, total time[s] 0.075329 +Converged at iteration 25, L1 4.73179e-05, Linf 0.0114175, total time[s] 0.06707 +Converged at iteration 27, L1 4.89548e-05, Linf 0.0127821, total time[s] 0.083945 +Converged at iteration 26, L1 5.48696e-05, Linf 0.0167726, total time[s] 0.076095 +Converged at iteration 21, L1 3.77318e-05, Linf 0.00716554, total time[s] 0.063548 +Converged at iteration 19, L1 8.80489e-05, Linf 0.0038446, total time[s] 0.067793 +Converged at iteration 24, L1 6.3021e-05, Linf 0.00253392, total time[s] 0.079957 +Converged at iteration 23, L1 8.25075e-05, Linf 0.00847222, total time[s] 0.128115 +Converged at iteration 20, L1 9.97217e-05, Linf 0.00794288, total time[s] 0.071522 +Converged at iteration 19, L1 7.47039e-05, Linf 0.00235532, total time[s] 0.053192 +Converged at iteration 31, L1 8.57671e-05, Linf 0.0114647, total time[s] 0.090017 +Converged at iteration 22, L1 7.52999e-05, Linf 0.00314498, total time[s] 0.058474 +Converged at iteration 23, L1 7.81136e-05, Linf 0.00656109, total time[s] 0.063276 +Converged at iteration 27, L1 6.89745e-05, Linf 0.00367317, total time[s] 0.067169 +Converged at iteration 24, L1 6.50054e-05, Linf 0.0046877, total time[s] 0.060745 +Converged at iteration 23, L1 8.53284e-05, Linf 0.00461998, total time[s] 0.059919 +Converged at iteration 25, L1 7.54669e-05, Linf 0.00482353, total time[s] 0.063378 +Converged at iteration 25, L1 8.15613e-05, Linf 0.00763564, total time[s] 0.062411 +Converged at iteration 27, L1 8.41034e-05, Linf 0.00683959, total time[s] 0.06877 +Converged at iteration 32, L1 6.64279e-05, Linf 0.00323445, total time[s] 0.080649 +Converged at iteration 27, L1 6.10176e-05, Linf 0.00218173, total time[s] 0.067185 +Converged at iteration 31, L1 7.362e-05, Linf 0.00854348, total time[s] 0.075644 +Converged at iteration 31, L1 6.47448e-05, Linf 0.00236189, total time[s] 0.081956 +Converged at iteration 32, L1 5.75915e-05, Linf 0.00259598, total time[s] 0.07954 +Converged at iteration 30, L1 6.91412e-05, Linf 0.00295723, total time[s] 0.076097 +Converged at iteration 31, L1 6.06192e-05, Linf 0.0132507, total time[s] 0.07769 +Converged at iteration 29, L1 8.45834e-05, Linf 0.015784, total time[s] 0.073089 +Converged at iteration 25, L1 5.63385e-05, Linf 0.00260056, total time[s] 0.06843 +Converged at iteration 37, L1 5.4257e-05, Linf 0.00732215, total time[s] 0.091855 +Converged at iteration 34, L1 7.76501e-05, Linf 0.00578026, total time[s] 0.090688 +Converged at iteration 25, L1 6.02874e-05, Linf 0.00350555, total time[s] 0.069462 +Converged at iteration 25, L1 4.60822e-05, Linf 0.0108433, total time[s] 0.064397 +Converged at iteration 27, L1 3.95575e-05, Linf 0.0116449, total time[s] 0.068953 +Converged at iteration 26, L1 5.46431e-05, Linf 0.0168608, total time[s] 0.066169 +Converged at iteration 21, L1 3.85232e-05, Linf 0.00716809, total time[s] 0.056656 +Converged at iteration 19, L1 8.92367e-05, Linf 0.00369989, total time[s] 0.054761 +Converged at iteration 24, L1 6.19593e-05, Linf 0.00278558, total time[s] 0.072026 +Converged at iteration 23, L1 8.5957e-05, Linf 0.0076881, total time[s] 0.078113 +Converged at iteration 21, L1 4.52395e-05, Linf 0.00227596, total time[s] 0.082554 +Converged at iteration 19, L1 7.97079e-05, Linf 0.00257577, total time[s] 0.067371 +Converged at iteration 31, L1 8.58361e-05, Linf 0.0120197, total time[s] 0.093185 +Converged at iteration 22, L1 6.74494e-05, Linf 0.00325455, total time[s] 0.067566 +Converged at iteration 23, L1 8.12869e-05, Linf 0.00713233, total time[s] 0.070351 +Converged at iteration 27, L1 6.42261e-05, Linf 0.00355222, total time[s] 0.075434 +Converged at iteration 24, L1 6.16797e-05, Linf 0.00439455, total time[s] 0.066761 +Converged at iteration 23, L1 8.67124e-05, Linf 0.00472091, total time[s] 0.063186 +Converged at iteration 25, L1 7.87161e-05, Linf 0.00497622, total time[s] 0.066412 +Converged at iteration 25, L1 8.39251e-05, Linf 0.0058357, total time[s] 0.066865 +Converged at iteration 27, L1 8.29312e-05, Linf 0.00691516, total time[s] 0.071392 +Converged at iteration 32, L1 6.14306e-05, Linf 0.00328367, total time[s] 0.083519 +Converged at iteration 26, L1 9.67893e-05, Linf 0.00291795, total time[s] 0.071822 +Converged at iteration 31, L1 7.37552e-05, Linf 0.00883141, total time[s] 0.081435 +Converged at iteration 31, L1 6.09126e-05, Linf 0.00238907, total time[s] 0.089636 +Converged at iteration 32, L1 6.09683e-05, Linf 0.00284151, total time[s] 0.08577 +Converged at iteration 30, L1 7.20265e-05, Linf 0.00300034, total time[s] 0.078638 +Converged at iteration 31, L1 6.64615e-05, Linf 0.0142032, total time[s] 0.081814 +Converged at iteration 29, L1 8.51282e-05, Linf 0.0163453, total time[s] 0.076039 +Converged at iteration 25, L1 5.55639e-05, Linf 0.0025128, total time[s] 0.066435 +Converged at iteration 37, L1 5.58547e-05, Linf 0.00752957, total time[s] 0.101625 +Converged at iteration 34, L1 8.34353e-05, Linf 0.00627035, total time[s] 0.105134 +Converged at iteration 25, L1 5.881e-05, Linf 0.00355144, total time[s] 0.070428 +Converged at iteration 25, L1 4.46274e-05, Linf 0.0104662, total time[s] 0.073552 +Converged at iteration 26, L1 9.0783e-05, Linf 0.0185056, total time[s] 0.070174 +Converged at iteration 26, L1 5.33867e-05, Linf 0.0168644, total time[s] 0.07257 +Converged at iteration 21, L1 3.85152e-05, Linf 0.00737234, total time[s] 0.075726 +Converged at iteration 19, L1 8.8591e-05, Linf 0.0036953, total time[s] 0.076035 +Converged at iteration 24, L1 6.11878e-05, Linf 0.00248056, total time[s] 0.091482 +Converged at iteration 23, L1 8.74231e-05, Linf 0.00713562, total time[s] 0.080695 +Converged at iteration 21, L1 4.61182e-05, Linf 0.0023523, total time[s] 0.062087 +Converged at iteration 19, L1 8.26985e-05, Linf 0.00270864, total time[s] 0.062269 +Converged at iteration 31, L1 8.65254e-05, Linf 0.0123863, total time[s] 0.119535 +Converged at iteration 22, L1 6.72554e-05, Linf 0.00329522, total time[s] 0.088099 +Converged at iteration 23, L1 8.6227e-05, Linf 0.00721617, total time[s] 0.06563 +Converged at iteration 27, L1 6.29924e-05, Linf 0.00351807, total time[s] 0.070739 +Converged at iteration 24, L1 6.06405e-05, Linf 0.00430403, total time[s] 0.066186 +Converged at iteration 23, L1 8.70521e-05, Linf 0.00476309, total time[s] 0.066683 +Converged at iteration 25, L1 8.04124e-05, Linf 0.00504312, total time[s] 0.084625 +Converged at iteration 25, L1 8.73991e-05, Linf 0.00581083, total time[s] 0.066943 +Converged at iteration 27, L1 8.40349e-05, Linf 0.00720886, total time[s] 0.070253 +Converged at iteration 32, L1 6.21111e-05, Linf 0.00331584, total time[s] 0.081452 +Converged at iteration 26, L1 9.39003e-05, Linf 0.00277884, total time[s] 0.06623 +Converged at iteration 31, L1 7.54247e-05, Linf 0.00882056, total time[s] 0.079093 +Converged at iteration 31, L1 6.39791e-05, Linf 0.00236467, total time[s] 0.079165 +Converged at iteration 32, L1 6.60193e-05, Linf 0.00362516, total time[s] 0.147541 +Converged at iteration 30, L1 7.43227e-05, Linf 0.00307023, total time[s] 0.079575 +Converged at iteration 31, L1 7.02442e-05, Linf 0.0149302, total time[s] 0.081582 +Converged at iteration 29, L1 8.46593e-05, Linf 0.0165813, total time[s] 0.078154 +Converged at iteration 25, L1 5.46673e-05, Linf 0.00252909, total time[s] 0.065045 +Converged at iteration 37, L1 5.91198e-05, Linf 0.0079365, total time[s] 0.095193 +Converged at iteration 34, L1 8.81786e-05, Linf 0.00677586, total time[s] 0.095197 +Converged at iteration 25, L1 5.99352e-05, Linf 0.00366697, total time[s] 0.07676 +Converged at iteration 25, L1 4.43107e-05, Linf 0.00988102, total time[s] 0.06667 +Converged at iteration 26, L1 7.31528e-05, Linf 0.0175826, total time[s] 0.070316 +Converged at iteration 26, L1 5.07863e-05, Linf 0.0168233, total time[s] 0.068366 +Converged at iteration 21, L1 3.98474e-05, Linf 0.00742468, total time[s] 0.063907 +Converged at iteration 19, L1 8.78141e-05, Linf 0.0035433, total time[s] 0.069044 +Converged at iteration 24, L1 6.09648e-05, Linf 0.00251574, total time[s] 0.073616 +Converged at iteration 23, L1 9.21111e-05, Linf 0.00618656, total time[s] 0.070581 +Converged at iteration 21, L1 4.93411e-05, Linf 0.00250468, total time[s] 0.062039 +Converged at iteration 19, L1 8.96242e-05, Linf 0.00297625, total time[s] 0.060409 +Converged at iteration 31, L1 8.69693e-05, Linf 0.0126781, total time[s] 0.086468 +Converged at iteration 22, L1 7.0472e-05, Linf 0.00339057, total time[s] 0.062854 +Converged at iteration 23, L1 9.60407e-05, Linf 0.00745868, total time[s] 0.063438 +Converged at iteration 27, L1 6.25037e-05, Linf 0.00341716, total time[s] 0.079514 +Converged at iteration 24, L1 6.09225e-05, Linf 0.00415319, total time[s] 0.072298 +Converged at iteration 23, L1 8.99406e-05, Linf 0.00485896, total time[s] 0.089986 +Converged at iteration 25, L1 8.4354e-05, Linf 0.0052314, total time[s] 0.070237 +Converged at iteration 25, L1 9.58739e-05, Linf 0.00605836, total time[s] 0.121032 +Converged at iteration 27, L1 8.07239e-05, Linf 0.00737109, total time[s] 0.083901 +Converged at iteration 32, L1 6.35236e-05, Linf 0.00334877, total time[s] 0.087775 +Converged at iteration 26, L1 8.90286e-05, Linf 0.00249294, total time[s] 0.080151 +Converged at iteration 31, L1 7.5425e-05, Linf 0.00911976, total time[s] 0.08073 +Converged at iteration 31, L1 5.9398e-05, Linf 0.00241734, total time[s] 0.08119 +Converged at iteration 32, L1 6.67119e-05, Linf 0.00309741, total time[s] 0.083413 +Converged at iteration 30, L1 8.08842e-05, Linf 0.00331186, total time[s] 0.077837 +Converged at iteration 31, L1 7.78932e-05, Linf 0.015916, total time[s] 0.080503 +Converged at iteration 29, L1 8.58468e-05, Linf 0.0171444, total time[s] 0.077328 +Converged at iteration 25, L1 5.5516e-05, Linf 0.00243537, total time[s] 0.069377 +Converged at iteration 37, L1 6.08413e-05, Linf 0.00813366, total time[s] 0.100726 +Converged at iteration 34, L1 9.17464e-05, Linf 0.006888, total time[s] 0.090318 +Converged at iteration 25, L1 6.08995e-05, Linf 0.0036862, total time[s] 0.067873 +Converged at iteration 25, L1 4.35766e-05, Linf 0.00953397, total time[s] 0.068118 +Converged at iteration 26, L1 6.92742e-05, Linf 0.0170322, total time[s] 0.070283 +Converged at iteration 26, L1 4.99396e-05, Linf 0.0165579, total time[s] 0.070405 +Converged at iteration 21, L1 4.00069e-05, Linf 0.00733205, total time[s] 0.058445 +Converged at iteration 19, L1 8.55209e-05, Linf 0.0035477, total time[s] 0.053917 +Converged at iteration 24, L1 5.9978e-05, Linf 0.00251199, total time[s] 0.064905 +Converged at iteration 23, L1 9.39017e-05, Linf 0.00586194, total time[s] 0.064488 +Converged at iteration 21, L1 5.07458e-05, Linf 0.00257486, total time[s] 0.060708 +Converged at iteration 19, L1 9.2759e-05, Linf 0.00310529, total time[s] 0.057913 +Converged at iteration 31, L1 8.71835e-05, Linf 0.0128922, total time[s] 0.126408 +Converged at iteration 22, L1 6.46009e-05, Linf 0.00342826, total time[s] 0.059276 +Converged at iteration 23, L1 9.66751e-05, Linf 0.00752489, total time[s] 0.065198 +Converged at iteration 27, L1 6.10107e-05, Linf 0.00339449, total time[s] 0.075652 +Converged at iteration 24, L1 6.00009e-05, Linf 0.00418249, total time[s] 0.06523 +Converged at iteration 23, L1 9.02366e-05, Linf 0.00487635, total time[s] 0.066641 +Converged at iteration 25, L1 8.60763e-05, Linf 0.00530726, total time[s] 0.068235 +Converged at iteration 25, L1 9.93279e-05, Linf 0.00617501, total time[s] 0.068433 +Converged at iteration 27, L1 8.01424e-05, Linf 0.00722025, total time[s] 0.072594 +Converged at iteration 32, L1 6.42382e-05, Linf 0.00336822, total time[s] 0.084418 +Converged at iteration 26, L1 8.66755e-05, Linf 0.00236445, total time[s] 0.071109 +Converged at iteration 31, L1 7.48757e-05, Linf 0.00914125, total time[s] 0.08242 +Converged at iteration 31, L1 5.91465e-05, Linf 0.00241097, total time[s] 0.080877 +Converged at iteration 32, L1 6.78583e-05, Linf 0.00317304, total time[s] 0.083717 +Converged at iteration 30, L1 8.34759e-05, Linf 0.00331038, total time[s] 0.081813 +Converged at iteration 31, L1 8.18032e-05, Linf 0.0168186, total time[s] 0.093341 +Converged at iteration 29, L1 8.59324e-05, Linf 0.017331, total time[s] 0.08758 +Converged at iteration 25, L1 5.59411e-05, Linf 0.00236556, total time[s] 0.070118 +Converged at iteration 37, L1 6.43261e-05, Linf 0.00858315, total time[s] 0.099403 +Converged at iteration 35, L1 3.49886e-05, Linf 0.0041246, total time[s] 0.096393 +Converged at iteration 25, L1 6.47282e-05, Linf 0.00374267, total time[s] 0.070333 +Converged at iteration 25, L1 4.56046e-05, Linf 0.00905581, total time[s] 0.065794 +Converged at iteration 26, L1 5.52212e-05, Linf 0.0157133, total time[s] 0.068399 +Converged at iteration 26, L1 4.77022e-05, Linf 0.0161504, total time[s] 0.068126 +Converged at iteration 21, L1 4.12934e-05, Linf 0.00737266, total time[s] 0.057089 +Converged at iteration 19, L1 8.52585e-05, Linf 0.00340695, total time[s] 0.051648 +Converged at iteration 24, L1 5.86416e-05, Linf 0.00240309, total time[s] 0.065799 +Converged at iteration 23, L1 9.80294e-05, Linf 0.0051233, total time[s] 0.061324 +Converged at iteration 21, L1 5.40445e-05, Linf 0.00273727, total time[s] 0.056285 +Converged at iteration 20, L1 4.53546e-05, Linf 0.00182764, total time[s] 0.05423 +Converged at iteration 31, L1 9.00223e-05, Linf 0.0133862, total time[s] 0.081425 +Converged at iteration 22, L1 6.40277e-05, Linf 0.00351401, total time[s] 0.060687 +Converged at iteration 23, L1 9.99133e-05, Linf 0.00779463, total time[s] 0.063038 +Converged at iteration 27, L1 5.80781e-05, Linf 0.00327013, total time[s] 0.071671 +Converged at iteration 24, L1 6.052e-05, Linf 0.00429845, total time[s] 0.064458 +Converged at iteration 23, L1 9.33134e-05, Linf 0.00494866, total time[s] 0.06254 +Converged at iteration 25, L1 9.33079e-05, Linf 0.00554025, total time[s] 0.066759 +Converged at iteration 26, L1 6.01096e-05, Linf 0.00410805, total time[s] 0.070264 +Converged at iteration 27, L1 7.98694e-05, Linf 0.00625163, total time[s] 0.073133 +Converged at iteration 32, L1 6.51732e-05, Linf 0.00350005, total time[s] 0.097019 +Converged at iteration 26, L1 8.10869e-05, Linf 0.00231723, total time[s] 0.071715 +Converged at iteration 31, L1 7.66786e-05, Linf 0.00934969, total time[s] 0.081925 +Converged at iteration 31, L1 5.8416e-05, Linf 0.00241725, total time[s] 0.081394 +Converged at iteration 32, L1 7.23362e-05, Linf 0.00330179, total time[s] 0.084664 +Converged at iteration 30, L1 8.91332e-05, Linf 0.0035857, total time[s] 0.079652 +Converged at iteration 31, L1 9.11838e-05, Linf 0.0176781, total time[s] 0.081997 +Converged at iteration 29, L1 8.81591e-05, Linf 0.0179048, total time[s] 0.077025 +Converged at iteration 25, L1 5.72877e-05, Linf 0.00241916, total time[s] 0.068357 +Converged at iteration 37, L1 6.61313e-05, Linf 0.00877726, total time[s] 0.098009 +Converged at iteration 35, L1 3.60355e-05, Linf 0.00427489, total time[s] 0.0933 +Converged at iteration 25, L1 6.51049e-05, Linf 0.00374662, total time[s] 0.066944 +Converged at iteration 25, L1 4.54609e-05, Linf 0.00879278, total time[s] 0.067875 +Converged at iteration 26, L1 5.11754e-05, Linf 0.0151194, total time[s] 0.069672 +Converged at iteration 26, L1 4.68682e-05, Linf 0.0159925, total time[s] 0.072426 +Converged at iteration 21, L1 4.18562e-05, Linf 0.00740813, total time[s] 0.062269 +Converged at iteration 19, L1 8.34493e-05, Linf 0.00337304, total time[s] 0.062816 +Converged at iteration 24, L1 5.77812e-05, Linf 0.00240256, total time[s] 0.067533 +Converged at iteration 23, L1 9.82082e-05, Linf 0.00485131, total time[s] 0.06257 +Converged at iteration 21, L1 5.49015e-05, Linf 0.00280654, total time[s] 0.058532 +Converged at iteration 20, L1 4.67854e-05, Linf 0.00189736, total time[s] 0.053769 +Converged at iteration 31, L1 9.00976e-05, Linf 0.0135411, total time[s] 0.081053 +Converged at iteration 22, L1 6.52138e-05, Linf 0.00364513, total time[s] 0.058581 +Converged at iteration 24, L1 5.66809e-05, Linf 0.00432435, total time[s] 0.062798 +Converged at iteration 27, L1 5.7206e-05, Linf 0.00324142, total time[s] 0.070772 +Converged at iteration 24, L1 6.11072e-05, Linf 0.00447842, total time[s] 0.063674 +Converged at iteration 23, L1 9.40807e-05, Linf 0.00495364, total time[s] 0.061483 +Converged at iteration 25, L1 9.55305e-05, Linf 0.0056241, total time[s] 0.067523 +Converged at iteration 26, L1 6.24439e-05, Linf 0.0041922, total time[s] 0.069266 +Converged at iteration 27, L1 7.87301e-05, Linf 0.0059229, total time[s] 0.073708 +Converged at iteration 32, L1 6.50552e-05, Linf 0.0035919, total time[s] 0.086181 +Converged at iteration 26, L1 7.89458e-05, Linf 0.00234994, total time[s] 0.068546 +Converged at iteration 31, L1 7.61701e-05, Linf 0.00934948, total time[s] 0.079807 +Converged at iteration 31, L1 5.82558e-05, Linf 0.00240854, total time[s] 0.079485 +Converged at iteration 32, L1 7.42019e-05, Linf 0.00337844, total time[s] 0.08156 +Converged at iteration 30, L1 8.83713e-05, Linf 0.00377772, total time[s] 0.078547 +Converged at iteration 31, L1 9.55254e-05, Linf 0.0182094, total time[s] 0.103829 +Converged at iteration 29, L1 8.82253e-05, Linf 0.0180659, total time[s] 0.084553 +Converged at iteration 25, L1 5.80122e-05, Linf 0.00242608, total time[s] 0.07108 +Converged at iteration 37, L1 6.97124e-05, Linf 0.00925396, total time[s] 0.109942 +Converged at iteration 35, L1 3.97028e-05, Linf 0.00461128, total time[s] 0.098118 +Converged at iteration 25, L1 6.48406e-05, Linf 0.0037643, total time[s] 0.066186 +Converged at iteration 25, L1 4.86031e-05, Linf 0.00847005, total time[s] 0.0665 +Converged at iteration 26, L1 4.33989e-05, Linf 0.013696, total time[s] 0.068908 +Converged at iteration 26, L1 4.58309e-05, Linf 0.0155415, total time[s] 0.068302 +Converged at iteration 21, L1 4.26776e-05, Linf 0.00742804, total time[s] 0.056522 +Converged at iteration 19, L1 8.094e-05, Linf 0.0032204, total time[s] 0.051981 +Converged at iteration 24, L1 5.89977e-05, Linf 0.00233928, total time[s] 0.06911 +Converged at iteration 24, L1 5.97041e-05, Linf 0.00210792, total time[s] 0.064394 +Converged at iteration 21, L1 5.90258e-05, Linf 0.00297373, total time[s] 0.056307 +Converged at iteration 20, L1 5.05176e-05, Linf 0.00206005, total time[s] 0.055464 +Converged at iteration 31, L1 9.3941e-05, Linf 0.0139461, total time[s] 0.089634 +Converged at iteration 22, L1 7.4793e-05, Linf 0.00476332, total time[s] 0.057987 +Converged at iteration 24, L1 5.8358e-05, Linf 0.00444008, total time[s] 0.069006 +Converged at iteration 27, L1 5.52638e-05, Linf 0.00312679, total time[s] 0.072997 +Converged at iteration 24, L1 6.33661e-05, Linf 0.0048661, total time[s] 0.064679 +Converged at iteration 23, L1 9.73134e-05, Linf 0.00500591, total time[s] 0.061847 +Converged at iteration 26, L1 4.97852e-05, Linf 0.00331677, total time[s] 0.068325 +Converged at iteration 26, L1 7.03637e-05, Linf 0.00445311, total time[s] 0.068879 +Converged at iteration 27, L1 7.9602e-05, Linf 0.00628557, total time[s] 0.075433 +Converged at iteration 32, L1 6.52262e-05, Linf 0.00373759, total time[s] 0.083813 +Converged at iteration 26, L1 7.40766e-05, Linf 0.00247779, total time[s] 0.069348 +Converged at iteration 31, L1 8.0036e-05, Linf 0.00952204, total time[s] 0.080447 +Converged at iteration 31, L1 6.03225e-05, Linf 0.00241768, total time[s] 0.080235 +Converged at iteration 32, L1 7.89061e-05, Linf 0.00346646, total time[s] 0.081462 +Converged at iteration 30, L1 8.39027e-05, Linf 0.00412771, total time[s] 0.077775 +Converged at iteration 32, L1 3.78584e-05, Linf 0.00868037, total time[s] 0.082464 +Converged at iteration 29, L1 9.24094e-05, Linf 0.018603, total time[s] 0.076833 +Converged at iteration 25, L1 5.92559e-05, Linf 0.00244204, total time[s] 0.065727 +Converged at iteration 37, L1 7.16041e-05, Linf 0.0094527, total time[s] 0.094689 +Converged at iteration 35, L1 4.17514e-05, Linf 0.00477422, total time[s] 0.091985 +Converged at iteration 25, L1 6.47414e-05, Linf 0.0037625, total time[s] 0.066591 +Converged at iteration 25, L1 4.89114e-05, Linf 0.00825754, total time[s] 0.066586 +Converged at iteration 26, L1 4.07596e-05, Linf 0.013105, total time[s] 0.069594 +Converged at iteration 26, L1 4.53113e-05, Linf 0.0153349, total time[s] 0.071413 +Converged at iteration 21, L1 4.35318e-05, Linf 0.00745255, total time[s] 0.058088 +Converged at iteration 19, L1 7.82244e-05, Linf 0.00316553, total time[s] 0.064741 +Converged at iteration 24, L1 5.8675e-05, Linf 0.00344517, total time[s] 0.084954 +Converged at iteration 24, L1 6.19875e-05, Linf 0.00354541, total time[s] 0.069331 +Converged at iteration 21, L1 6.0201e-05, Linf 0.00303501, total time[s] 0.057383 +Converged at iteration 20, L1 5.19167e-05, Linf 0.00213271, total time[s] 0.054915 +Converged at iteration 31, L1 9.42416e-05, Linf 0.0140814, total time[s] 0.079869 +Converged at iteration 22, L1 6.82079e-05, Linf 0.00366037, total time[s] 0.06137 +Converged at iteration 24, L1 6.01427e-05, Linf 0.00451565, total time[s] 0.066738 +Converged at iteration 27, L1 5.45803e-05, Linf 0.00309935, total time[s] 0.088462 +Converged at iteration 24, L1 6.37149e-05, Linf 0.00503589, total time[s] 0.070558 +Converged at iteration 23, L1 9.77531e-05, Linf 0.00501215, total time[s] 0.061316 +Converged at iteration 26, L1 5.3154e-05, Linf 0.00336232, total time[s] 0.074871 +Converged at iteration 26, L1 7.29616e-05, Linf 0.00456131, total time[s] 0.069821 +Converged at iteration 27, L1 8.05709e-05, Linf 0.00671028, total time[s] 0.070255 +Converged at iteration 32, L1 6.54934e-05, Linf 0.00382304, total time[s] 0.081166 +Converged at iteration 26, L1 7.26204e-05, Linf 0.00253422, total time[s] 0.066917 +Converged at iteration 31, L1 7.90967e-05, Linf 0.00950625, total time[s] 0.080973 +Converged at iteration 31, L1 6.22911e-05, Linf 0.00241858, total time[s] 0.091714 +Converged at iteration 32, L1 8.08053e-05, Linf 0.00352831, total time[s] 0.084942 +Converged at iteration 30, L1 8.2536e-05, Linf 0.00414404, total time[s] 0.097614 +Converged at iteration 32, L1 4.23934e-05, Linf 0.00895044, total time[s] 0.083253 +Converged at iteration 29, L1 9.17733e-05, Linf 0.0185412, total time[s] 0.077724 +Converged at iteration 25, L1 6.02361e-05, Linf 0.00274042, total time[s] 0.065909 +Converged at iteration 37, L1 7.50106e-05, Linf 0.00997595, total time[s] 0.094903 +Converged at iteration 35, L1 4.50007e-05, Linf 0.00525094, total time[s] 0.091506 +Converged at iteration 25, L1 6.71811e-05, Linf 0.00377551, total time[s] 0.072188 +Converged at iteration 25, L1 5.29882e-05, Linf 0.00799085, total time[s] 0.075454 +Converged at iteration 26, L1 3.48796e-05, Linf 0.0115994, total time[s] 0.070422 +Converged at iteration 26, L1 4.41388e-05, Linf 0.0149237, total time[s] 0.067776 +Converged at iteration 21, L1 4.54434e-05, Linf 0.00746326, total time[s] 0.058393 +Converged at iteration 19, L1 7.44106e-05, Linf 0.00296201, total time[s] 0.071834 +Converged at iteration 24, L1 5.63137e-05, Linf 0.00221529, total time[s] 0.075729 +Converged at iteration 24, L1 6.27646e-05, Linf 0.00228842, total time[s] 0.079506 +Converged at iteration 21, L1 6.40768e-05, Linf 0.0031989, total time[s] 0.059652 +Converged at iteration 20, L1 5.57573e-05, Linf 0.0023317, total time[s] 0.058026 +Converged at iteration 31, L1 9.89019e-05, Linf 0.0145346, total time[s] 0.07839 +Converged at iteration 22, L1 6.76425e-05, Linf 0.00375699, total time[s] 0.059753 +Converged at iteration 24, L1 5.91596e-05, Linf 0.00503117, total time[s] 0.064674 +Converged at iteration 27, L1 5.47297e-05, Linf 0.00300915, total time[s] 0.070382 +Converged at iteration 24, L1 6.41062e-05, Linf 0.00518385, total time[s] 0.064121 +Converged at iteration 23, L1 9.96981e-05, Linf 0.00504705, total time[s] 0.061782 +Converged at iteration 26, L1 5.20572e-05, Linf 0.00351272, total time[s] 0.068407 +Converged at iteration 26, L1 8.19778e-05, Linf 0.00488217, total time[s] 0.06764 +Converged at iteration 27, L1 8.17539e-05, Linf 0.00636371, total time[s] 0.070405 +Converged at iteration 32, L1 6.71342e-05, Linf 0.00395625, total time[s] 0.084595 +Converged at iteration 26, L1 7.07837e-05, Linf 0.00261981, total time[s] 0.068373 +Converged at iteration 31, L1 7.92658e-05, Linf 0.00965336, total time[s] 0.081935 +Converged at iteration 31, L1 6.12046e-05, Linf 0.00243246, total time[s] 0.078604 +Converged at iteration 32, L1 8.33198e-05, Linf 0.00363735, total time[s] 0.08158 +Converged at iteration 30, L1 8.35583e-05, Linf 0.00454846, total time[s] 0.079436 +Converged at iteration 32, L1 4.29157e-05, Linf 0.00971723, total time[s] 0.085826 +Converged at iteration 29, L1 9.54258e-05, Linf 0.0192577, total time[s] 0.078674 +Converged at iteration 25, L1 6.01841e-05, Linf 0.00276354, total time[s] 0.068528 +Converged at iteration 37, L1 7.66897e-05, Linf 0.0101733, total time[s] 0.106031 +Converged at iteration 35, L1 4.64823e-05, Linf 0.00543102, total time[s] 0.098388 +Converged at iteration 25, L1 6.75218e-05, Linf 0.00377157, total time[s] 0.067068 +Converged at iteration 25, L1 5.35855e-05, Linf 0.00780533, total time[s] 0.066858 +Converged at iteration 26, L1 3.43326e-05, Linf 0.0110455, total time[s] 0.069122 +Converged at iteration 26, L1 4.37581e-05, Linf 0.0147675, total time[s] 0.070007 +Converged at iteration 21, L1 4.5549e-05, Linf 0.00748197, total time[s] 0.059343 +Converged at iteration 19, L1 7.22591e-05, Linf 0.00295783, total time[s] 0.05548 +Converged at iteration 24, L1 5.65668e-05, Linf 0.002787, total time[s] 0.068966 +Converged at iteration 24, L1 6.40385e-05, Linf 0.0023435, total time[s] 0.066203 +Converged at iteration 21, L1 6.55926e-05, Linf 0.00325839, total time[s] 0.064418 +Converged at iteration 20, L1 5.71596e-05, Linf 0.00240887, total time[s] 0.054403 +Converged at iteration 32, L1 3.84291e-05, Linf 0.00847926, total time[s] 0.08643 +Converged at iteration 22, L1 7.44711e-05, Linf 0.00495008, total time[s] 0.058415 +Converged at iteration 24, L1 5.81482e-05, Linf 0.00462073, total time[s] 0.063856 +Converged at iteration 27, L1 5.44218e-05, Linf 0.00299498, total time[s] 0.069196 +Converged at iteration 24, L1 6.29601e-05, Linf 0.00513533, total time[s] 0.063345 +Converged at iteration 24, L1 5.43672e-05, Linf 0.00320501, total time[s] 0.065208 +Converged at iteration 26, L1 5.34299e-05, Linf 0.00357663, total time[s] 0.083217 +Converged at iteration 26, L1 8.48778e-05, Linf 0.00501634, total time[s] 0.066 +Converged at iteration 27, L1 8.27534e-05, Linf 0.00638555, total time[s] 0.075234 +Converged at iteration 32, L1 6.82438e-05, Linf 0.00401337, total time[s] 0.082293 +Converged at iteration 26, L1 7.09213e-05, Linf 0.00267522, total time[s] 0.066033 +Converged at iteration 31, L1 7.68725e-05, Linf 0.00965209, total time[s] 0.079313 +Converged at iteration 31, L1 5.93087e-05, Linf 0.00242823, total time[s] 0.07858 +Converged at iteration 32, L1 8.29508e-05, Linf 0.00368532, total time[s] 0.083861 +Converged at iteration 30, L1 8.43131e-05, Linf 0.00422494, total time[s] 0.076881 +Converged at iteration 32, L1 4.46425e-05, Linf 0.0102237, total time[s] 0.082776 +Converged at iteration 29, L1 9.32091e-05, Linf 0.019745, total time[s] 0.084625 +Converged at iteration 25, L1 6.02409e-05, Linf 0.00277176, total time[s] 0.075392 +Converged at iteration 37, L1 8.04613e-05, Linf 0.0109151, total time[s] 0.111374 +Converged at iteration 35, L1 5.04294e-05, Linf 0.00595951, total time[s] 0.103569 +Converged at iteration 25, L1 6.99532e-05, Linf 0.00378733, total time[s] 0.069213 +Converged at iteration 25, L1 5.88307e-05, Linf 0.0075758, total time[s] 0.068537 +Converged at iteration 25, L1 9.22941e-05, Linf 0.0201942, total time[s] 0.069933 +Converged at iteration 26, L1 4.42824e-05, Linf 0.0147057, total time[s] 0.082068 +Converged at iteration 21, L1 4.78448e-05, Linf 0.00742099, total time[s] 0.060588 +Converged at iteration 19, L1 6.75817e-05, Linf 0.00279247, total time[s] 0.056232 +Converged at iteration 24, L1 5.57818e-05, Linf 0.0024876, total time[s] 0.068829 +Converged at iteration 24, L1 6.72523e-05, Linf 0.00254505, total time[s] 0.065179 +Converged at iteration 21, L1 6.91313e-05, Linf 0.00341312, total time[s] 0.058029 +Converged at iteration 20, L1 6.10909e-05, Linf 0.00261914, total time[s] 0.05454 +Converged at iteration 32, L1 3.96477e-05, Linf 0.00854031, total time[s] 0.113212 +Converged at iteration 22, L1 6.9064e-05, Linf 0.0038754, total time[s] 0.071841 +Converged at iteration 24, L1 5.62148e-05, Linf 0.00464456, total time[s] 0.071237 +Converged at iteration 27, L1 5.16177e-05, Linf 0.00288358, total time[s] 0.079475 +Converged at iteration 24, L1 6.26882e-05, Linf 0.00489365, total time[s] 0.064326 +Converged at iteration 24, L1 5.63184e-05, Linf 0.00321602, total time[s] 0.065297 +Converged at iteration 26, L1 5.47711e-05, Linf 0.00372884, total time[s] 0.070614 +Converged at iteration 26, L1 9.52954e-05, Linf 0.00538009, total time[s] 0.071839 +Converged at iteration 27, L1 8.25105e-05, Linf 0.00645591, total time[s] 0.08765 +Converged at iteration 32, L1 7.02513e-05, Linf 0.00419187, total time[s] 0.107065 +Converged at iteration 26, L1 7.25813e-05, Linf 0.00274096, total time[s] 0.072669 +Converged at iteration 31, L1 7.67703e-05, Linf 0.00979224, total time[s] 0.084598 +Converged at iteration 31, L1 5.77669e-05, Linf 0.00245042, total time[s] 0.081075 +Converged at iteration 32, L1 8.54087e-05, Linf 0.00377229, total time[s] 0.08377 +Converged at iteration 30, L1 8.85682e-05, Linf 0.00449017, total time[s] 0.080155 +Converged at iteration 32, L1 5.01452e-05, Linf 0.0108686, total time[s] 0.08377 +Converged at iteration 29, L1 9.48651e-05, Linf 0.0198012, total time[s] 0.076477 +Converged at iteration 25, L1 6.01217e-05, Linf 0.00287192, total time[s] 0.066988 +Converged at iteration 37, L1 8.13983e-05, Linf 0.0103428, total time[s] 0.097252 +Converged at iteration 35, L1 5.16193e-05, Linf 0.00613109, total time[s] 0.091052 +Converged at iteration 25, L1 7.01053e-05, Linf 0.00376088, total time[s] 0.066722 +Converged at iteration 25, L1 5.90686e-05, Linf 0.00740907, total time[s] 0.06763 +Converged at iteration 25, L1 8.50632e-05, Linf 0.0195896, total time[s] 0.067347 +Converged at iteration 26, L1 4.36056e-05, Linf 0.0143885, total time[s] 0.069356 +Converged at iteration 21, L1 4.92937e-05, Linf 0.00752625, total time[s] 0.057297 +Converged at iteration 19, L1 6.49615e-05, Linf 0.00279624, total time[s] 0.053149 +Converged at iteration 24, L1 5.41976e-05, Linf 0.00282463, total time[s] 0.069654 +Converged at iteration 24, L1 6.85331e-05, Linf 0.0026268, total time[s] 0.063605 +Converged at iteration 21, L1 7.06235e-05, Linf 0.00346733, total time[s] 0.057344 +Converged at iteration 20, L1 6.21232e-05, Linf 0.00269795, total time[s] 0.055142 +Converged at iteration 32, L1 4.57544e-05, Linf 0.0086436, total time[s] 0.090479 +Converged at iteration 22, L1 6.68033e-05, Linf 0.00400252, total time[s] 0.070783 +Converged at iteration 24, L1 5.55249e-05, Linf 0.00472717, total time[s] 0.065387 +Converged at iteration 27, L1 5.11256e-05, Linf 0.00286, total time[s] 0.081492 +Converged at iteration 24, L1 6.25939e-05, Linf 0.00477037, total time[s] 0.075106 +Converged at iteration 24, L1 5.58882e-05, Linf 0.00320218, total time[s] 0.071684 +Converged at iteration 26, L1 5.62867e-05, Linf 0.00378624, total time[s] 0.074445 +Converged at iteration 26, L1 9.85868e-05, Linf 0.00551002, total time[s] 0.078279 +Converged at iteration 27, L1 8.32192e-05, Linf 0.00644048, total time[s] 0.07507 +Converged at iteration 32, L1 7.11982e-05, Linf 0.00429013, total time[s] 0.100446 +Converged at iteration 26, L1 7.42853e-05, Linf 0.00275981, total time[s] 0.076197 +Converged at iteration 31, L1 7.67839e-05, Linf 0.00979608, total time[s] 0.081419 +Converged at iteration 31, L1 5.72052e-05, Linf 0.00245394, total time[s] 0.080136 +Converged at iteration 32, L1 8.68289e-05, Linf 0.003829, total time[s] 0.085225 +Converged at iteration 30, L1 9.02748e-05, Linf 0.00465105, total time[s] 0.083851 +Converged at iteration 32, L1 5.05079e-05, Linf 0.0112073, total time[s] 0.083282 +Converged at iteration 29, L1 9.47521e-05, Linf 0.0192834, total time[s] 0.075687 +Converged at iteration 25, L1 6.00759e-05, Linf 0.00293437, total time[s] 0.066366 +Converged at iteration 37, L1 8.46084e-05, Linf 0.0108651, total time[s] 0.097724 +Converged at iteration 35, L1 5.61744e-05, Linf 0.00670609, total time[s] 0.089788 +Converged at iteration 25, L1 7.34247e-05, Linf 0.00367808, total time[s] 0.067392 +Converged at iteration 25, L1 6.40471e-05, Linf 0.00721329, total time[s] 0.066253 +Converged at iteration 25, L1 7.52187e-05, Linf 0.0178322, total time[s] 0.072699 +Converged at iteration 26, L1 4.53058e-05, Linf 0.0142938, total time[s] 0.077106 +Converged at iteration 21, L1 4.96021e-05, Linf 0.00755614, total time[s] 0.066355 +Converged at iteration 19, L1 5.82248e-05, Linf 0.00299028, total time[s] 0.0568 +Converged at iteration 24, L1 5.28653e-05, Linf 0.00222944, total time[s] 0.067147 +Converged at iteration 24, L1 7.02933e-05, Linf 0.00282151, total time[s] 0.066965 +Converged at iteration 21, L1 7.39191e-05, Linf 0.00360137, total time[s] 0.058082 +Converged at iteration 20, L1 6.61636e-05, Linf 0.00291105, total time[s] 0.05466 +Converged at iteration 32, L1 4.75573e-05, Linf 0.00854324, total time[s] 0.096139 +Converged at iteration 22, L1 6.78018e-05, Linf 0.00400342, total time[s] 0.06091 +Converged at iteration 24, L1 5.81854e-05, Linf 0.00486143, total time[s] 0.065561 +Converged at iteration 27, L1 4.87476e-05, Linf 0.00273117, total time[s] 0.073828 +Converged at iteration 24, L1 6.16612e-05, Linf 0.00451739, total time[s] 0.064316 +Converged at iteration 24, L1 5.5365e-05, Linf 0.0032052, total time[s] 0.063672 +Converged at iteration 26, L1 5.94183e-05, Linf 0.00396111, total time[s] 0.070977 +Converged at iteration 27, L1 5.66787e-05, Linf 0.00363817, total time[s] 0.071468 +Converged at iteration 27, L1 8.35491e-05, Linf 0.00647753, total time[s] 0.070751 +Converged at iteration 32, L1 7.20695e-05, Linf 0.00441591, total time[s] 0.086652 +Converged at iteration 26, L1 8.07853e-05, Linf 0.00286532, total time[s] 0.069324 +Converged at iteration 31, L1 7.75438e-05, Linf 0.0099159, total time[s] 0.081144 +Converged at iteration 31, L1 5.67637e-05, Linf 0.00245827, total time[s] 0.080911 +Converged at iteration 32, L1 9.06937e-05, Linf 0.00394699, total time[s] 0.083009 +Converged at iteration 30, L1 9.48212e-05, Linf 0.00520895, total time[s] 0.078557 +Converged at iteration 32, L1 5.59006e-05, Linf 0.0124024, total time[s] 0.083587 +Converged at iteration 29, L1 9.52975e-05, Linf 0.0175788, total time[s] 0.075821 +Converged at iteration 25, L1 6.19888e-05, Linf 0.00321062, total time[s] 0.066686 +Converged at iteration 37, L1 8.58865e-05, Linf 0.0110555, total time[s] 0.113074 +Converged at iteration 35, L1 5.79592e-05, Linf 0.00689949, total time[s] 0.097525 +Converged at iteration 25, L1 7.4255e-05, Linf 0.00365701, total time[s] 0.067838 +Converged at iteration 25, L1 6.51944e-05, Linf 0.00706347, total time[s] 0.06645 +Converged at iteration 25, L1 7.23705e-05, Linf 0.0172115, total time[s] 0.068483 +Converged at iteration 26, L1 4.72531e-05, Linf 0.0142641, total time[s] 0.079552 +Converged at iteration 21, L1 4.89787e-05, Linf 0.00758079, total time[s] 0.060887 +Converged at iteration 19, L1 5.47603e-05, Linf 0.00303999, total time[s] 0.05623 +Converged at iteration 24, L1 5.19452e-05, Linf 0.00218811, total time[s] 0.066958 +Converged at iteration 24, L1 7.12168e-05, Linf 0.00287338, total time[s] 0.070879 +Converged at iteration 21, L1 7.57729e-05, Linf 0.00365525, total time[s] 0.057216 +Converged at iteration 20, L1 6.80678e-05, Linf 0.00298765, total time[s] 0.055684 +Converged at iteration 32, L1 4.15598e-05, Linf 0.00864542, total time[s] 0.083546 +Converged at iteration 22, L1 6.82997e-05, Linf 0.00403456, total time[s] 0.06092 +Converged at iteration 24, L1 5.57512e-05, Linf 0.00491764, total time[s] 0.064464 +Converged at iteration 27, L1 4.81478e-05, Linf 0.00270438, total time[s] 0.076696 +Converged at iteration 24, L1 6.15762e-05, Linf 0.00442852, total time[s] 0.066034 +Converged at iteration 24, L1 5.45579e-05, Linf 0.0031863, total time[s] 0.065928 +Converged at iteration 26, L1 6.08146e-05, Linf 0.00401619, total time[s] 0.06862 +Converged at iteration 27, L1 6.00994e-05, Linf 0.00372443, total time[s] 0.075598 +Converged at iteration 27, L1 8.30325e-05, Linf 0.00649352, total time[s] 0.076873 +Converged at iteration 32, L1 7.27749e-05, Linf 0.00461994, total time[s] 0.083715 +Converged at iteration 26, L1 8.34163e-05, Linf 0.00288706, total time[s] 0.068797 +Converged at iteration 31, L1 7.78011e-05, Linf 0.00991457, total time[s] 0.080784 +Converged at iteration 31, L1 5.59821e-05, Linf 0.00245309, total time[s] 0.081084 +Converged at iteration 32, L1 9.27388e-05, Linf 0.00400626, total time[s] 0.085151 +Converged at iteration 30, L1 9.64028e-05, Linf 0.0054113, total time[s] 0.078683 +Converged at iteration 32, L1 5.80013e-05, Linf 0.0129448, total time[s] 0.08613 +Converged at iteration 29, L1 9.48336e-05, Linf 0.0169128, total time[s] 0.076472 +Converged at iteration 25, L1 6.2993e-05, Linf 0.00314673, total time[s] 0.067724 +Converged at iteration 37, L1 8.84669e-05, Linf 0.0116294, total time[s] 0.109279 +Converged at iteration 35, L1 6.26608e-05, Linf 0.0074826, total time[s] 0.091092 +Converged at iteration 25, L1 7.73724e-05, Linf 0.00367511, total time[s] 0.06716 +Converged at iteration 25, L1 6.99499e-05, Linf 0.00683493, total time[s] 0.067244 +Converged at iteration 25, L1 6.52422e-05, Linf 0.0154878, total time[s] 0.066984 +Converged at iteration 26, L1 4.72658e-05, Linf 0.0142037, total time[s] 0.06999 +Converged at iteration 21, L1 4.93281e-05, Linf 0.00761888, total time[s] 0.062364 +Converged at iteration 19, L1 4.72037e-05, Linf 0.00326558, total time[s] 0.052668 +Converged at iteration 23, L1 9.95327e-05, Linf 0.00302396, total time[s] 0.06191 +Converged at iteration 24, L1 7.41765e-05, Linf 0.00299714, total time[s] 0.064553 +Converged at iteration 21, L1 7.89963e-05, Linf 0.00378213, total time[s] 0.056849 +Converged at iteration 20, L1 7.19492e-05, Linf 0.00319291, total time[s] 0.054644 +Converged at iteration 32, L1 4.28363e-05, Linf 0.00854282, total time[s] 0.117715 +Converged at iteration 22, L1 6.91146e-05, Linf 0.00414229, total time[s] 0.060291 +Converged at iteration 24, L1 5.82082e-05, Linf 0.00487471, total time[s] 0.066378 +Converged at iteration 27, L1 4.52719e-05, Linf 0.00255533, total time[s] 0.071709 +Converged at iteration 24, L1 6.0153e-05, Linf 0.00420525, total time[s] 0.067332 +Converged at iteration 23, L1 9.9816e-05, Linf 0.00507993, total time[s] 0.061757 +Converged at iteration 26, L1 6.48369e-05, Linf 0.00419885, total time[s] 0.066868 +Converged at iteration 27, L1 6.51732e-05, Linf 0.00399191, total time[s] 0.071484 +Converged at iteration 27, L1 8.33996e-05, Linf 0.00650745, total time[s] 0.072113 +Converged at iteration 32, L1 7.62134e-05, Linf 0.00479695, total time[s] 0.083518 +Converged at iteration 26, L1 9.62543e-05, Linf 0.00299991, total time[s] 0.07028 +Converged at iteration 31, L1 7.74494e-05, Linf 0.00994276, total time[s] 0.086179 +Converged at iteration 31, L1 5.74939e-05, Linf 0.00250582, total time[s] 0.080451 +Converged at iteration 32, L1 9.71626e-05, Linf 0.00415726, total time[s] 0.082897 +Converged at iteration 31, L1 4.38976e-05, Linf 0.00418756, total time[s] 0.081562 +Converged at iteration 32, L1 6.41635e-05, Linf 0.0135771, total time[s] 0.083004 +Converged at iteration 29, L1 9.50085e-05, Linf 0.0153526, total time[s] 0.075975 +Converged at iteration 25, L1 6.32057e-05, Linf 0.00307303, total time[s] 0.066208 +Converged at iteration 37, L1 8.96939e-05, Linf 0.0118247, total time[s] 0.097012 +Converged at iteration 35, L1 6.41919e-05, Linf 0.0076723, total time[s] 0.091256 +Converged at iteration 25, L1 7.74074e-05, Linf 0.00365418, total time[s] 0.067715 +Converged at iteration 25, L1 7.01478e-05, Linf 0.00667677, total time[s] 0.067102 +Converged at iteration 25, L1 6.32092e-05, Linf 0.0149103, total time[s] 0.068204 +Converged at iteration 26, L1 4.78779e-05, Linf 0.0143843, total time[s] 0.06925 +Converged at iteration 21, L1 4.94629e-05, Linf 0.00764335, total time[s] 0.05689 +Converged at iteration 19, L1 4.48505e-05, Linf 0.00331336, total time[s] 0.051705 +Converged at iteration 23, L1 9.88128e-05, Linf 0.00300381, total time[s] 0.061598 +Converged at iteration 24, L1 7.51962e-05, Linf 0.00300197, total time[s] 0.065794 +Converged at iteration 21, L1 8.01223e-05, Linf 0.00380729, total time[s] 0.058898 +Converged at iteration 20, L1 7.35855e-05, Linf 0.00326728, total time[s] 0.067786 +Converged at iteration 32, L1 4.32877e-05, Linf 0.00866413, total time[s] 0.099861 +Converged at iteration 22, L1 7.16503e-05, Linf 0.00418438, total time[s] 0.064452 +Converged at iteration 24, L1 5.90126e-05, Linf 0.00480777, total time[s] 0.063967 +Converged at iteration 27, L1 4.46292e-05, Linf 0.00252343, total time[s] 0.071188 +Converged at iteration 24, L1 5.95393e-05, Linf 0.00409174, total time[s] 0.06414 +Converged at iteration 23, L1 9.90196e-05, Linf 0.00504895, total time[s] 0.061626 +Converged at iteration 26, L1 6.63909e-05, Linf 0.00425651, total time[s] 0.068613 +Converged at iteration 27, L1 6.84162e-05, Linf 0.00408241, total time[s] 0.073277 +Converged at iteration 27, L1 8.34095e-05, Linf 0.00651798, total time[s] 0.071745 +Converged at iteration 32, L1 7.73261e-05, Linf 0.00483722, total time[s] 0.082919 +Converged at iteration 27, L1 6.24046e-05, Linf 0.00193283, total time[s] 0.097557 +Converged at iteration 31, L1 7.72361e-05, Linf 0.0100114, total time[s] 0.093922 +Converged at iteration 31, L1 5.86614e-05, Linf 0.002466, total time[s] 0.101501 +Converged at iteration 32, L1 9.88426e-05, Linf 0.00422276, total time[s] 0.091884 +Converged at iteration 31, L1 4.41836e-05, Linf 0.00428167, total time[s] 0.090358 +Converged at iteration 32, L1 6.64102e-05, Linf 0.0139505, total time[s] 0.105224 +Converged at iteration 29, L1 9.61434e-05, Linf 0.0153609, total time[s] 0.0894 +Converged at iteration 25, L1 6.35903e-05, Linf 0.00310008, total time[s] 0.079006 +Converged at iteration 37, L1 9.28995e-05, Linf 0.0115588, total time[s] 0.109842 +Converged at iteration 35, L1 6.87486e-05, Linf 0.00824617, total time[s] 0.108327 +Converged at iteration 25, L1 7.85535e-05, Linf 0.00359842, total time[s] 0.06743 +Converged at iteration 25, L1 7.29601e-05, Linf 0.00645506, total time[s] 0.067788 +Converged at iteration 25, L1 6.11575e-05, Linf 0.0134424, total time[s] 0.068922 +Converged at iteration 26, L1 5.08845e-05, Linf 0.0150716, total time[s] 0.070802 +Converged at iteration 21, L1 5.03879e-05, Linf 0.00767801, total time[s] 0.061682 +Converged at iteration 18, L1 9.37916e-05, Linf 0.00603803, total time[s] 0.062019 +Converged at iteration 23, L1 9.68135e-05, Linf 0.00313166, total time[s] 0.097149 +Converged at iteration 24, L1 7.65496e-05, Linf 0.00305612, total time[s] 0.085802 +Converged at iteration 21, L1 8.26922e-05, Linf 0.00395304, total time[s] 0.063492 +Converged at iteration 20, L1 7.73851e-05, Linf 0.00345734, total time[s] 0.056705 +Converged at iteration 32, L1 4.54087e-05, Linf 0.00868294, total time[s] 0.092729 +Converged at iteration 22, L1 7.13785e-05, Linf 0.00438951, total time[s] 0.061127 +Converged at iteration 24, L1 5.71802e-05, Linf 0.00549216, total time[s] 0.066568 +Converged at iteration 26, L1 9.71983e-05, Linf 0.00523448, total time[s] 0.092152 +Converged at iteration 24, L1 5.82397e-05, Linf 0.0039822, total time[s] 0.070621 +Converged at iteration 23, L1 9.6279e-05, Linf 0.00499953, total time[s] 0.07791 +Converged at iteration 26, L1 7.01165e-05, Linf 0.00443634, total time[s] 0.079249 +Converged at iteration 27, L1 7.45663e-05, Linf 0.00435356, total time[s] 0.081992 +Converged at iteration 27, L1 8.37823e-05, Linf 0.00647272, total time[s] 0.076346 +Converged at iteration 32, L1 8.05668e-05, Linf 0.0049804, total time[s] 0.085712 +Converged at iteration 27, L1 6.92979e-05, Linf 0.00200992, total time[s] 0.073164 +Converged at iteration 31, L1 7.75667e-05, Linf 0.0101038, total time[s] 0.084855 +Converged at iteration 31, L1 5.84994e-05, Linf 0.00245817, total time[s] 0.082928 +Converged at iteration 33, L1 4.40492e-05, Linf 0.00219912, total time[s] 0.087569 +Converged at iteration 31, L1 4.59617e-05, Linf 0.00455137, total time[s] 0.085644 +Converged at iteration 32, L1 7.34073e-05, Linf 0.0150458, total time[s] 0.081561 +Converged at iteration 29, L1 9.52517e-05, Linf 0.0153495, total time[s] 0.080518 +Converged at iteration 25, L1 6.44843e-05, Linf 0.00320235, total time[s] 0.070447 +Converged at iteration 37, L1 9.32181e-05, Linf 0.0117539, total time[s] 0.098757 +Converged at iteration 35, L1 7.0392e-05, Linf 0.00844823, total time[s] 0.096417 +Converged at iteration 25, L1 7.85994e-05, Linf 0.0035844, total time[s] 0.065838 +Converged at iteration 25, L1 7.31185e-05, Linf 0.0063526, total time[s] 0.067225 +Converged at iteration 25, L1 5.80403e-05, Linf 0.0129396, total time[s] 0.066245 +Converged at iteration 26, L1 5.12882e-05, Linf 0.0147336, total time[s] 0.069561 +Converged at iteration 21, L1 5.02502e-05, Linf 0.00771164, total time[s] 0.079723 +Converged at iteration 18, L1 9.15677e-05, Linf 0.00618614, total time[s] 0.054171 +Converged at iteration 23, L1 9.66319e-05, Linf 0.00313137, total time[s] 0.07467 +Converged at iteration 24, L1 7.72638e-05, Linf 0.00307574, total time[s] 0.075291 +Converged at iteration 21, L1 8.42279e-05, Linf 0.00396736, total time[s] 0.071399 +Converged at iteration 20, L1 7.93514e-05, Linf 0.00358409, total time[s] 0.061902 +Converged at iteration 32, L1 4.59496e-05, Linf 0.00858041, total time[s] 0.097041 +Converged at iteration 22, L1 7.18874e-05, Linf 0.00434741, total time[s] 0.075852 +Converged at iteration 24, L1 5.7347e-05, Linf 0.0055942, total time[s] 0.069224 +Converged at iteration 26, L1 9.6003e-05, Linf 0.00520095, total time[s] 0.067983 +Converged at iteration 24, L1 5.71616e-05, Linf 0.00400116, total time[s] 0.064404 +Converged at iteration 23, L1 9.52952e-05, Linf 0.00495649, total time[s] 0.060397 +Converged at iteration 26, L1 7.02623e-05, Linf 0.00450169, total time[s] 0.071286 +Converged at iteration 27, L1 7.60169e-05, Linf 0.00446424, total time[s] 0.071278 +Converged at iteration 27, L1 8.40982e-05, Linf 0.00650177, total time[s] 0.069902 +Converged at iteration 32, L1 8.13596e-05, Linf 0.00502541, total time[s] 0.08391 +Converged at iteration 27, L1 7.12943e-05, Linf 0.00204964, total time[s] 0.071221 +Converged at iteration 31, L1 7.70938e-05, Linf 0.010101, total time[s] 0.079677 +Converged at iteration 31, L1 5.8276e-05, Linf 0.00244449, total time[s] 0.081082 +Converged at iteration 33, L1 4.51556e-05, Linf 0.00224444, total time[s] 0.085278 +Converged at iteration 31, L1 4.59853e-05, Linf 0.00464818, total time[s] 0.080161 +Converged at iteration 32, L1 7.50031e-05, Linf 0.0154219, total time[s] 0.082524 +Converged at iteration 29, L1 9.5064e-05, Linf 0.0154449, total time[s] 0.07555 +Converged at iteration 25, L1 6.4836e-05, Linf 0.00322823, total time[s] 0.065131 +Converged at iteration 37, L1 9.61305e-05, Linf 0.012011, total time[s] 0.098794 +Converged at iteration 35, L1 7.5181e-05, Linf 0.00905789, total time[s] 0.098302 +Converged at iteration 25, L1 7.92042e-05, Linf 0.00355383, total time[s] 0.066577 +Converged at iteration 25, L1 7.61525e-05, Linf 0.00625673, total time[s] 0.066556 +Converged at iteration 25, L1 5.53033e-05, Linf 0.0116793, total time[s] 0.121656 +Converged at iteration 26, L1 5.42962e-05, Linf 0.0151332, total time[s] 0.100862 +Converged at iteration 21, L1 5.13582e-05, Linf 0.00774623, total time[s] 0.062288 +Converged at iteration 18, L1 9.03673e-05, Linf 0.00666008, total time[s] 0.055411 +Converged at iteration 23, L1 9.58411e-05, Linf 0.00322989, total time[s] 0.070483 +Converged at iteration 24, L1 8.01038e-05, Linf 0.00313988, total time[s] 0.076615 +Converged at iteration 21, L1 8.66437e-05, Linf 0.00405729, total time[s] 0.070066 +Converged at iteration 20, L1 8.32011e-05, Linf 0.00369071, total time[s] 0.080994 +Converged at iteration 32, L1 4.77592e-05, Linf 0.00868893, total time[s] 0.096243 +Converged at iteration 22, L1 8.42617e-05, Linf 0.00481952, total time[s] 0.091275 +Converged at iteration 24, L1 6.01165e-05, Linf 0.00572876, total time[s] 0.067951 +Converged at iteration 26, L1 9.49071e-05, Linf 0.00502327, total time[s] 0.075611 +Converged at iteration 24, L1 5.5058e-05, Linf 0.00392346, total time[s] 0.065351 +Converged at iteration 23, L1 9.47592e-05, Linf 0.00578201, total time[s] 0.061265 +Converged at iteration 26, L1 7.51096e-05, Linf 0.00468331, total time[s] 0.067754 +Converged at iteration 27, L1 8.48413e-05, Linf 0.0047612, total time[s] 0.072433 +Converged at iteration 27, L1 8.6022e-05, Linf 0.00652487, total time[s] 0.071908 +Converged at iteration 32, L1 8.39027e-05, Linf 0.00516656, total time[s] 0.08284 +Converged at iteration 27, L1 7.81966e-05, Linf 0.0021107, total time[s] 0.071624 +Converged at iteration 31, L1 7.80046e-05, Linf 0.0101965, total time[s] 0.085193 +Converged at iteration 31, L1 5.67295e-05, Linf 0.00242599, total time[s] 0.083409 +Converged at iteration 33, L1 4.84342e-05, Linf 0.00241586, total time[s] 0.087187 +Converged at iteration 31, L1 4.80313e-05, Linf 0.00495227, total time[s] 0.085432 +Converged at iteration 32, L1 8.15796e-05, Linf 0.0165761, total time[s] 0.102774 +Converged at iteration 29, L1 9.58398e-05, Linf 0.0160446, total time[s] 0.082135 +Converged at iteration 25, L1 6.58604e-05, Linf 0.00319334, total time[s] 0.094864 +Converged at iteration 37, L1 9.75142e-05, Linf 0.0122409, total time[s] 0.129114 +Converged at iteration 35, L1 7.6977e-05, Linf 0.00926431, total time[s] 0.1179 +Converged at iteration 25, L1 7.88984e-05, Linf 0.00352335, total time[s] 0.107301 +Converged at iteration 25, L1 7.86969e-05, Linf 0.010627, total time[s] 0.074629 +Converged at iteration 25, L1 5.85002e-05, Linf 0.011292, total time[s] 0.088402 +Converged at iteration 26, L1 5.7647e-05, Linf 0.0152854, total time[s] 0.074341 +Converged at iteration 21, L1 5.04093e-05, Linf 0.00768574, total time[s] 0.061637 +Converged at iteration 18, L1 9.34177e-05, Linf 0.00639709, total time[s] 0.069443 +Converged at iteration 23, L1 9.43472e-05, Linf 0.00316304, total time[s] 0.084003 +Converged at iteration 24, L1 8.08786e-05, Linf 0.00317248, total time[s] 0.083633 +Converged at iteration 21, L1 8.74128e-05, Linf 0.0040469, total time[s] 0.069707 +Converged at iteration 20, L1 8.69932e-05, Linf 0.00375692, total time[s] 0.073365 +Converged at iteration 32, L1 4.84481e-05, Linf 0.00872528, total time[s] 0.111596 +Converged at iteration 22, L1 7.6098e-05, Linf 0.00453831, total time[s] 0.126395 +Converged at iteration 24, L1 5.92273e-05, Linf 0.00616378, total time[s] 0.072286 +Converged at iteration 26, L1 9.38766e-05, Linf 0.00495242, total time[s] 0.070633 +Converged at iteration 24, L1 5.44264e-05, Linf 0.00384753, total time[s] 0.076939 +Converged at iteration 23, L1 9.32438e-05, Linf 0.00483707, total time[s] 0.065958 +Converged at iteration 26, L1 7.64354e-05, Linf 0.00474289, total time[s] 0.076526 +Converged at iteration 27, L1 8.85138e-05, Linf 0.00487704, total time[s] 0.071218 +Converged at iteration 27, L1 8.58238e-05, Linf 0.00653426, total time[s] 0.071605 +Converged at iteration 32, L1 8.45129e-05, Linf 0.00520938, total time[s] 0.083605 +Converged at iteration 27, L1 7.99321e-05, Linf 0.00213256, total time[s] 0.071668 +Converged at iteration 31, L1 7.73699e-05, Linf 0.0103246, total time[s] 0.081401 +Converged at iteration 31, L1 5.69708e-05, Linf 0.00238776, total time[s] 0.082596 +Converged at iteration 33, L1 5.06739e-05, Linf 0.00247069, total time[s] 0.085923 +Converged at iteration 31, L1 4.90479e-05, Linf 0.00506986, total time[s] 0.102254 +Converged at iteration 32, L1 8.39428e-05, Linf 0.0169976, total time[s] 0.091456 +Converged at iteration 29, L1 9.56105e-05, Linf 0.0161392, total time[s] 0.084967 +Converged at iteration 25, L1 6.67049e-05, Linf 0.00315647, total time[s] 0.076635 +Converged at iteration 38, L1 3.32178e-05, Linf 0.0069363, total time[s] 0.128983 +Converged at iteration 35, L1 8.15895e-05, Linf 0.00985762, total time[s] 0.115634 +Converged at iteration 25, L1 7.94024e-05, Linf 0.00345853, total time[s] 0.071311 +Converged at iteration 25, L1 7.97433e-05, Linf 0.00608367, total time[s] 0.067367 +Converged at iteration 25, L1 5.28145e-05, Linf 0.0102881, total time[s] 0.067154 +Converged at iteration 26, L1 5.98134e-05, Linf 0.0158613, total time[s] 0.071036 +Converged at iteration 21, L1 4.88929e-05, Linf 0.0078952, total time[s] 0.067739 +Converged at iteration 19, L1 4.4528e-05, Linf 0.00403366, total time[s] 0.062355 +Converged at iteration 23, L1 9.415e-05, Linf 0.00324165, total time[s] 0.067237 +Converged at iteration 24, L1 8.29639e-05, Linf 0.00325235, total time[s] 0.077306 +Converged at iteration 21, L1 9.06371e-05, Linf 0.00419546, total time[s] 0.075394 +Converged at iteration 20, L1 8.88139e-05, Linf 0.00389151, total time[s] 0.057611 +Converged at iteration 32, L1 5.06836e-05, Linf 0.00855537, total time[s] 0.09734 +Converged at iteration 22, L1 8.42192e-05, Linf 0.0048015, total time[s] 0.068892 +Converged at iteration 24, L1 6.11152e-05, Linf 0.00970017, total time[s] 0.077386 +Converged at iteration 26, L1 9.16863e-05, Linf 0.00472592, total time[s] 0.070331 +Converged at iteration 24, L1 5.20321e-05, Linf 0.00354002, total time[s] 0.068193 +Converged at iteration 23, L1 9.26387e-05, Linf 0.00478299, total time[s] 0.064688 +Converged at iteration 26, L1 8.20675e-05, Linf 0.00494083, total time[s] 0.087369 +Converged at iteration 27, L1 9.60831e-05, Linf 0.00528618, total time[s] 0.080763 +Converged at iteration 27, L1 8.68929e-05, Linf 0.00657276, total time[s] 0.071661 +Converged at iteration 32, L1 8.70095e-05, Linf 0.00535139, total time[s] 0.084408 +Converged at iteration 27, L1 8.59976e-05, Linf 0.00222314, total time[s] 0.073926 +Converged at iteration 31, L1 7.81374e-05, Linf 0.0102975, total time[s] 0.08807 +Converged at iteration 31, L1 5.87542e-05, Linf 0.00245387, total time[s] 0.091344 +Converged at iteration 33, L1 5.38952e-05, Linf 0.00265356, total time[s] 0.087262 +Converged at iteration 31, L1 5.19329e-05, Linf 0.00539516, total time[s] 0.080725 +Converged at iteration 32, L1 9.13326e-05, Linf 0.0182972, total time[s] 0.087183 +Converged at iteration 29, L1 9.58634e-05, Linf 0.0165805, total time[s] 0.086037 +Converged at iteration 25, L1 6.65863e-05, Linf 0.00309574, total time[s] 0.06827 +Converged at iteration 38, L1 3.2844e-05, Linf 0.00704706, total time[s] 0.100952 +Converged at iteration 35, L1 8.33302e-05, Linf 0.0101083, total time[s] 0.100189 +Converged at iteration 25, L1 7.88567e-05, Linf 0.00342048, total time[s] 0.070869 +Converged at iteration 25, L1 8.00206e-05, Linf 0.00600917, total time[s] 0.068633 +Converged at iteration 25, L1 5.31266e-05, Linf 0.0099995, total time[s] 0.069686 +Converged at iteration 26, L1 6.08027e-05, Linf 0.0165612, total time[s] 0.071018 +Converged at iteration 21, L1 4.80798e-05, Linf 0.00782397, total time[s] 0.073343 +Converged at iteration 19, L1 4.83256e-05, Linf 0.00406806, total time[s] 0.059585 +Converged at iteration 23, L1 9.23028e-05, Linf 0.00322664, total time[s] 0.069685 +Converged at iteration 24, L1 8.3942e-05, Linf 0.0032746, total time[s] 0.082471 +Converged at iteration 21, L1 9.15684e-05, Linf 0.00421919, total time[s] 0.07046 +Converged at iteration 20, L1 9.19771e-05, Linf 0.00394065, total time[s] 0.073666 +Converged at iteration 32, L1 5.13116e-05, Linf 0.00870403, total time[s] 0.114917 +Converged at iteration 22, L1 7.65846e-05, Linf 0.00474481, total time[s] 0.069698 +Converged at iteration 24, L1 5.88179e-05, Linf 0.00413321, total time[s] 0.085226 +Converged at iteration 26, L1 9.33557e-05, Linf 0.00469634, total time[s] 0.091777 +Converged at iteration 24, L1 5.24018e-05, Linf 0.00341504, total time[s] 0.096328 +Converged at iteration 23, L1 9.36441e-05, Linf 0.00472042, total time[s] 0.080819 +Converged at iteration 26, L1 9.28159e-05, Linf 0.00500217, total time[s] 0.088997 +Converged at iteration 27, L1 9.9241e-05, Linf 0.00534669, total time[s] 0.083463 +Converged at iteration 27, L1 8.72439e-05, Linf 0.00655085, total time[s] 0.071802 +Converged at iteration 32, L1 8.80622e-05, Linf 0.00538837, total time[s] 0.083688 +Converged at iteration 27, L1 8.84844e-05, Linf 0.00223808, total time[s] 0.074835 +Converged at iteration 31, L1 7.79029e-05, Linf 0.0102993, total time[s] 0.101801 +Converged at iteration 31, L1 5.99856e-05, Linf 0.00245077, total time[s] 0.092718 +Converged at iteration 33, L1 5.49865e-05, Linf 0.00270004, total time[s] 0.112724 +Converged at iteration 31, L1 5.54201e-05, Linf 0.00551372, total time[s] 0.08195 +Converged at iteration 33, L1 9.83173e-05, Linf 0.00734155, total time[s] 0.106664 +Converged at iteration 29, L1 9.60065e-05, Linf 0.0166413, total time[s] 0.077907 +Converged at iteration 25, L1 6.68097e-05, Linf 0.00305613, total time[s] 0.126199 +Converged at iteration 38, L1 3.35274e-05, Linf 0.00727794, total time[s] 0.132144 +Converged at iteration 35, L1 8.80861e-05, Linf 0.0106953, total time[s] 0.105625 +Converged at iteration 25, L1 8.10413e-05, Linf 0.00345339, total time[s] 0.070722 +Converged at iteration 25, L1 8.4852e-05, Linf 0.0059864, total time[s] 0.064468 +Converged at iteration 25, L1 5.5404e-05, Linf 0.00934332, total time[s] 0.07486 +Converged at iteration 26, L1 8.65988e-05, Linf 0.0166762, total time[s] 0.104002 +Converged at iteration 21, L1 4.87442e-05, Linf 0.00784959, total time[s] 0.078531 +Converged at iteration 19, L1 5.3902e-05, Linf 0.00425483, total time[s] 0.088848 +Converged at iteration 23, L1 9.08047e-05, Linf 0.00319291, total time[s] 0.078492 +Converged at iteration 24, L1 8.57599e-05, Linf 0.00330365, total time[s] 0.094228 +Converged at iteration 21, L1 9.40898e-05, Linf 0.00432211, total time[s] 0.07448 +Converged at iteration 20, L1 9.37416e-05, Linf 0.00406093, total time[s] 0.053403 +Converged at iteration 32, L1 5.4101e-05, Linf 0.00876955, total time[s] 0.101149 +Converged at iteration 22, L1 7.98692e-05, Linf 0.00487454, total time[s] 0.06213 +Converged at iteration 24, L1 5.94735e-05, Linf 0.00538767, total time[s] 0.063997 +Converged at iteration 26, L1 8.95443e-05, Linf 0.00456547, total time[s] 0.067575 +Converged at iteration 24, L1 5.04175e-05, Linf 0.00313927, total time[s] 0.063998 +Converged at iteration 23, L1 9.16278e-05, Linf 0.0046468, total time[s] 0.062105 +Converged at iteration 26, L1 8.67227e-05, Linf 0.00518753, total time[s] 0.069339 +Converged at iteration 28, L1 5.58089e-05, Linf 0.0033724, total time[s] 0.0752 +Converged at iteration 27, L1 8.86869e-05, Linf 0.00658406, total time[s] 0.072039 +Converged at iteration 32, L1 8.93506e-05, Linf 0.0054955, total time[s] 0.083848 +Converged at iteration 27, L1 9.33894e-05, Linf 0.00231392, total time[s] 0.081807 +Converged at iteration 31, L1 7.99643e-05, Linf 0.0103026, total time[s] 0.125445 +Converged at iteration 31, L1 6.09741e-05, Linf 0.00242689, total time[s] 0.101531 +Converged at iteration 33, L1 5.95608e-05, Linf 0.00285231, total time[s] 0.10029 +Converged at iteration 31, L1 5.75313e-05, Linf 0.0058381, total time[s] 0.094022 +Converged at iteration 33, L1 4.0463e-05, Linf 0.00819351, total time[s] 0.091962 +Converged at iteration 29, L1 9.47283e-05, Linf 0.0169366, total time[s] 0.075498 +Converged at iteration 25, L1 6.7614e-05, Linf 0.00303725, total time[s] 0.068655 +Converged at iteration 38, L1 3.32998e-05, Linf 0.00743573, total time[s] 0.104929 +Converged at iteration 35, L1 8.95353e-05, Linf 0.010924, total time[s] 0.137481 +Converged at iteration 25, L1 7.96185e-05, Linf 0.00331527, total time[s] 0.134136 +Converged at iteration 25, L1 8.72156e-05, Linf 0.0108751, total time[s] 0.178206 +Converged at iteration 25, L1 5.14682e-05, Linf 0.00911752, total time[s] 0.181478 +Converged at iteration 26, L1 6.56732e-05, Linf 0.016936, total time[s] 0.146588 +Converged at iteration 21, L1 4.74558e-05, Linf 0.00779846, total time[s] 0.145671 +Converged at iteration 19, L1 5.74816e-05, Linf 0.00429282, total time[s] 0.116673 +Converged at iteration 23, L1 8.95479e-05, Linf 0.00320644, total time[s] 0.074868 +Converged at iteration 24, L1 8.70978e-05, Linf 0.00328922, total time[s] 0.081322 +Converged at iteration 21, L1 9.47846e-05, Linf 0.00434656, total time[s] 0.067111 +Converged at iteration 20, L1 9.55651e-05, Linf 0.00411329, total time[s] 0.055557 +Converged at iteration 32, L1 5.48176e-05, Linf 0.00873521, total time[s] 0.087655 +Converged at iteration 22, L1 8.08011e-05, Linf 0.00493562, total time[s] 0.064943 +Converged at iteration 24, L1 6.1785e-05, Linf 0.00574789, total time[s] 0.06413 +Converged at iteration 26, L1 8.96208e-05, Linf 0.00452853, total time[s] 0.074695 +Converged at iteration 24, L1 5.02012e-05, Linf 0.00302767, total time[s] 0.064883 +Converged at iteration 23, L1 9.12327e-05, Linf 0.00457226, total time[s] 0.061982 +Converged at iteration 26, L1 8.82562e-05, Linf 0.00526134, total time[s] 0.070569 +Converged at iteration 28, L1 5.69351e-05, Linf 0.00342091, total time[s] 0.073755 +Converged at iteration 27, L1 8.88672e-05, Linf 0.00662357, total time[s] 0.072181 +Converged at iteration 32, L1 8.99322e-05, Linf 0.00552905, total time[s] 0.090151 +Converged at iteration 27, L1 9.53143e-05, Linf 0.00230427, total time[s] 0.08116 +Converged at iteration 31, L1 7.86738e-05, Linf 0.0103986, total time[s] 0.084902 +Converged at iteration 31, L1 5.8192e-05, Linf 0.00242241, total time[s] 0.090929 +Converged at iteration 33, L1 5.8491e-05, Linf 0.0028947, total time[s] 0.090521 +Converged at iteration 31, L1 5.83609e-05, Linf 0.00597265, total time[s] 0.092234 +Converged at iteration 33, L1 4.13486e-05, Linf 0.00842407, total time[s] 0.108841 +Converged at iteration 29, L1 9.47052e-05, Linf 0.01696, total time[s] 0.109081 +Converged at iteration 25, L1 6.85403e-05, Linf 0.00302894, total time[s] 0.085661 +Converged at iteration 38, L1 3.32966e-05, Linf 0.00765691, total time[s] 0.126253 +Converged at iteration 36, L1 4.4211e-05, Linf 0.00553671, total time[s] 0.129422 +Converged at iteration 25, L1 7.91911e-05, Linf 0.00322783, total time[s] 0.067374 +Converged at iteration 25, L1 8.78298e-05, Linf 0.00599489, total time[s] 0.065779 +Converged at iteration 25, L1 4.99615e-05, Linf 0.00879695, total time[s] 0.067912 +Converged at iteration 26, L1 6.98805e-05, Linf 0.0179505, total time[s] 0.076011 +Converged at iteration 21, L1 4.77822e-05, Linf 0.00807201, total time[s] 0.061052 +Converged at iteration 19, L1 6.37132e-05, Linf 0.00440854, total time[s] 0.068509 +Converged at iteration 23, L1 8.94346e-05, Linf 0.00322385, total time[s] 0.065974 +Converged at iteration 24, L1 8.85273e-05, Linf 0.00327396, total time[s] 0.07082 +Converged at iteration 21, L1 9.69011e-05, Linf 0.00444011, total time[s] 0.062876 +Converged at iteration 21, L1 4.74197e-05, Linf 0.00222915, total time[s] 0.074049 +Converged at iteration 32, L1 5.73466e-05, Linf 0.00876303, total time[s] 0.13067 +Converged at iteration 22, L1 9.48483e-05, Linf 0.0064658, total time[s] 0.085933 +Converged at iteration 24, L1 6.36002e-05, Linf 0.00474281, total time[s] 0.073915 +Converged at iteration 26, L1 8.75249e-05, Linf 0.00440947, total time[s] 0.071699 +Converged at iteration 24, L1 4.90089e-05, Linf 0.00280308, total time[s] 0.065237 +Converged at iteration 23, L1 9.02798e-05, Linf 0.00439823, total time[s] 0.061971 +Converged at iteration 26, L1 9.06223e-05, Linf 0.00541122, total time[s] 0.068244 +Converged at iteration 28, L1 6.22153e-05, Linf 0.00367673, total time[s] 0.074742 +Converged at iteration 27, L1 9.10288e-05, Linf 0.00663354, total time[s] 0.074935 +Converged at iteration 32, L1 9.13799e-05, Linf 0.00560628, total time[s] 0.087725 +Converged at iteration 28, L1 5.96061e-05, Linf 0.00178492, total time[s] 0.079215 +Converged at iteration 31, L1 8.2028e-05, Linf 0.0105364, total time[s] 0.083069 +Converged at iteration 31, L1 6.47617e-05, Linf 0.0024522, total time[s] 0.080832 +Converged at iteration 33, L1 6.19128e-05, Linf 0.00303172, total time[s] 0.084137 +Converged at iteration 31, L1 6.23464e-05, Linf 0.0062786, total time[s] 0.079775 +Converged at iteration 33, L1 4.46174e-05, Linf 0.00930603, total time[s] 0.090333 +Converged at iteration 29, L1 9.89449e-05, Linf 0.0171094, total time[s] 0.085152 +Converged at iteration 25, L1 6.99618e-05, Linf 0.00302317, total time[s] 0.076741 +Converged at iteration 38, L1 3.36087e-05, Linf 0.00774792, total time[s] 0.144024 +Converged at iteration 35, L1 9.62195e-05, Linf 0.0116799, total time[s] 0.133442 +Converged at iteration 25, L1 7.84269e-05, Linf 0.00319374, total time[s] 0.085779 +Converged at iteration 25, L1 8.88717e-05, Linf 0.00596801, total time[s] 0.079504 +Converged at iteration 25, L1 4.95405e-05, Linf 0.00847752, total time[s] 0.104007 +Converged at iteration 26, L1 7.11775e-05, Linf 0.0179334, total time[s] 0.100346 +Converged at iteration 21, L1 4.83802e-05, Linf 0.00797331, total time[s] 0.094833 +Converged at iteration 19, L1 6.62374e-05, Linf 0.00448474, total time[s] 0.065457 +Converged at iteration 23, L1 8.79818e-05, Linf 0.00315576, total time[s] 0.08438 +Converged at iteration 24, L1 8.89796e-05, Linf 0.00326497, total time[s] 0.082051 +Converged at iteration 21, L1 9.76491e-05, Linf 0.00447413, total time[s] 0.073427 +Converged at iteration 21, L1 4.70734e-05, Linf 0.00220668, total time[s] 0.056795 +Converged at iteration 32, L1 5.82266e-05, Linf 0.0087736, total time[s] 0.10518 +Converged at iteration 22, L1 8.23093e-05, Linf 0.00513208, total time[s] 0.062842 +Converged at iteration 24, L1 6.09074e-05, Linf 0.00476662, total time[s] 0.071912 +Converged at iteration 26, L1 8.72695e-05, Linf 0.00441048, total time[s] 0.090007 +Converged at iteration 24, L1 4.81795e-05, Linf 0.00268826, total time[s] 0.067318 +Converged at iteration 23, L1 8.94303e-05, Linf 0.00428057, total time[s] 0.069989 +Converged at iteration 26, L1 9.12394e-05, Linf 0.0054671, total time[s] 0.076561 +Converged at iteration 28, L1 6.401e-05, Linf 0.00376007, total time[s] 0.078515 +Converged at iteration 27, L1 9.10346e-05, Linf 0.00665601, total time[s] 0.071318 +Converged at iteration 32, L1 9.18441e-05, Linf 0.00563688, total time[s] 0.084255 +Converged at iteration 28, L1 6.03752e-05, Linf 0.00180153, total time[s] 0.089801 +Converged at iteration 31, L1 8.03644e-05, Linf 0.0104812, total time[s] 0.089688 +Converged at iteration 31, L1 5.8886e-05, Linf 0.00245277, total time[s] 0.099213 +Converged at iteration 33, L1 6.27061e-05, Linf 0.00308227, total time[s] 0.107572 +Converged at iteration 31, L1 6.3904e-05, Linf 0.00647224, total time[s] 0.102915 +Converged at iteration 33, L1 4.43647e-05, Linf 0.00918542, total time[s] 0.111185 +Converged at iteration 29, L1 9.42255e-05, Linf 0.0171269, total time[s] 0.091085 +Converged at iteration 25, L1 6.80766e-05, Linf 0.00303448, total time[s] 0.071895 +Converged at iteration 38, L1 3.39137e-05, Linf 0.00795417, total time[s] 0.101121 +Converged at iteration 35, L1 9.98385e-05, Linf 0.0122723, total time[s] 0.098304 +Converged at iteration 25, L1 7.70589e-05, Linf 0.00310778, total time[s] 0.06746 +Converged at iteration 25, L1 9.43661e-05, Linf 0.00608683, total time[s] 0.067803 +Converged at iteration 25, L1 4.91572e-05, Linf 0.00831316, total time[s] 0.066532 +Converged at iteration 26, L1 7.60147e-05, Linf 0.0188489, total time[s] 0.073048 +Converged at iteration 21, L1 4.8198e-05, Linf 0.0080285, total time[s] 0.075017 +Converged at iteration 19, L1 6.94679e-05, Linf 0.00463858, total time[s] 0.094188 +Converged at iteration 23, L1 8.59105e-05, Linf 0.00273939, total time[s] 0.114573 +Converged at iteration 24, L1 9.1052e-05, Linf 0.00301585, total time[s] 0.113013 +Converged at iteration 21, L1 9.91206e-05, Linf 0.00445741, total time[s] 0.104786 +Converged at iteration 21, L1 4.90004e-05, Linf 0.00227323, total time[s] 0.063059 +Converged at iteration 32, L1 6.12434e-05, Linf 0.00865102, total time[s] 0.084322 +Converged at iteration 22, L1 9.05096e-05, Linf 0.00528968, total time[s] 0.062518 +Converged at iteration 24, L1 6.16361e-05, Linf 0.00484084, total time[s] 0.068688 +Converged at iteration 26, L1 8.58516e-05, Linf 0.00433833, total time[s] 0.075003 +Converged at iteration 23, L1 9.84189e-05, Linf 0.00402542, total time[s] 0.072159 +Converged at iteration 23, L1 8.59956e-05, Linf 0.00397634, total time[s] 0.062486 +Converged at iteration 26, L1 9.22991e-05, Linf 0.00564963, total time[s] 0.07749 +Converged at iteration 28, L1 7.29345e-05, Linf 0.00401441, total time[s] 0.083313 +Converged at iteration 27, L1 9.16583e-05, Linf 0.00671623, total time[s] 0.072219 +Converged at iteration 32, L1 9.67978e-05, Linf 0.00571747, total time[s] 0.090745 +Converged at iteration 28, L1 6.44446e-05, Linf 0.00184999, total time[s] 0.083139 +Converged at iteration 31, L1 7.90229e-05, Linf 0.0105706, total time[s] 0.08437 +Converged at iteration 31, L1 5.94407e-05, Linf 0.00249401, total time[s] 0.085746 +Converged at iteration 33, L1 6.5509e-05, Linf 0.0032346, total time[s] 0.08614 +Converged at iteration 31, L1 6.97479e-05, Linf 0.00684108, total time[s] 0.082193 +Converged at iteration 33, L1 4.72844e-05, Linf 0.0100575, total time[s] 0.085726 +Converged at iteration 29, L1 9.38459e-05, Linf 0.0172713, total time[s] 0.079341 +Converged at iteration 25, L1 6.89693e-05, Linf 0.00308633, total time[s] 0.06961 +Converged at iteration 38, L1 3.40659e-05, Linf 0.00801043, total time[s] 0.104338 +Converged at iteration 36, L1 3.43828e-05, Linf 0.00634766, total time[s] 0.102641 +Converged at iteration 25, L1 7.66947e-05, Linf 0.00309337, total time[s] 0.066167 +Converged at iteration 25, L1 9.55552e-05, Linf 0.00608695, total time[s] 0.105003 +Converged at iteration 25, L1 4.93977e-05, Linf 0.00797806, total time[s] 0.068249 +Converged at iteration 26, L1 7.79349e-05, Linf 0.0198221, total time[s] 0.074501 +Converged at iteration 21, L1 4.84931e-05, Linf 0.00806387, total time[s] 0.118606 +Converged at iteration 19, L1 7.23191e-05, Linf 0.0046998, total time[s] 0.113142 +Converged at iteration 23, L1 8.46155e-05, Linf 0.00275077, total time[s] 0.1556 +Converged at iteration 24, L1 9.23428e-05, Linf 0.00304057, total time[s] 0.141094 +Converged at iteration 21, L1 9.9979e-05, Linf 0.00440728, total time[s] 0.077003 +Converged at iteration 21, L1 4.98769e-05, Linf 0.00230078, total time[s] 0.109091 +Converged at iteration 32, L1 6.24163e-05, Linf 0.00866216, total time[s] 0.106499 +Converged at iteration 22, L1 8.92935e-05, Linf 0.00535118, total time[s] 0.065142 +Converged at iteration 24, L1 6.16972e-05, Linf 0.00486316, total time[s] 0.071821 +Converged at iteration 26, L1 8.62121e-05, Linf 0.00433948, total time[s] 0.073202 +Converged at iteration 23, L1 9.70546e-05, Linf 0.00391755, total time[s] 0.065864 +Converged at iteration 23, L1 8.50122e-05, Linf 0.0058845, total time[s] 0.071494 +Converged at iteration 26, L1 9.32844e-05, Linf 0.00570576, total time[s] 0.074201 +Converged at iteration 28, L1 7.2312e-05, Linf 0.0040886, total time[s] 0.075206 +Converged at iteration 27, L1 9.24974e-05, Linf 0.00673871, total time[s] 0.072486 +Converged at iteration 32, L1 9.28818e-05, Linf 0.00574444, total time[s] 0.084954 +Converged at iteration 28, L1 6.55042e-05, Linf 0.00187141, total time[s] 0.075956 +Converged at iteration 31, L1 7.89062e-05, Linf 0.0106284, total time[s] 0.082632 +Converged at iteration 31, L1 5.98341e-05, Linf 0.00250417, total time[s] 0.090094 +Converged at iteration 33, L1 6.85732e-05, Linf 0.00327683, total time[s] 0.086242 +Converged at iteration 31, L1 7.1171e-05, Linf 0.00702351, total time[s] 0.08332 +Converged at iteration 33, L1 4.82728e-05, Linf 0.0103389, total time[s] 0.089299 +Converged at iteration 29, L1 9.33171e-05, Linf 0.0172717, total time[s] 0.077819 +Converged at iteration 25, L1 6.90619e-05, Linf 0.00310504, total time[s] 0.070143 +Converged at iteration 38, L1 3.4315e-05, Linf 0.0083398, total time[s] 0.116843 +Converged at iteration 36, L1 3.54815e-05, Linf 0.00664796, total time[s] 0.11245 +Converged at iteration 25, L1 7.66257e-05, Linf 0.00308682, total time[s] 0.075197 +Converged at iteration 25, L1 9.98296e-05, Linf 0.00620485, total time[s] 0.066963 +Converged at iteration 25, L1 4.99381e-05, Linf 0.00775552, total time[s] 0.075041 +Converged at iteration 27, L1 5.73902e-05, Linf 0.0071714, total time[s] 0.074851 +Converged at iteration 21, L1 4.86113e-05, Linf 0.00810893, total time[s] 0.063161 +Converged at iteration 19, L1 7.98638e-05, Linf 0.00484063, total time[s] 0.067544 +Converged at iteration 23, L1 8.34942e-05, Linf 0.00272623, total time[s] 0.081744 +Converged at iteration 24, L1 9.36288e-05, Linf 0.00307351, total time[s] 0.066335 +Converged at iteration 22, L1 5.18708e-05, Linf 0.00240073, total time[s] 0.070326 +Converged at iteration 21, L1 5.08141e-05, Linf 0.00235994, total time[s] 0.072571 +Converged at iteration 32, L1 6.49145e-05, Linf 0.00881784, total time[s] 0.106728 +Converged at iteration 22, L1 8.75877e-05, Linf 0.00547414, total time[s] 0.064797 +Converged at iteration 24, L1 6.23778e-05, Linf 0.00492357, total time[s] 0.074048 +Converged at iteration 26, L1 8.44486e-05, Linf 0.00428744, total time[s] 0.07285 +Converged at iteration 23, L1 9.40058e-05, Linf 0.00367408, total time[s] 0.063381 +Converged at iteration 23, L1 8.0539e-05, Linf 0.0036503, total time[s] 0.070555 +Converged at iteration 26, L1 9.69258e-05, Linf 0.00585203, total time[s] 0.071409 +Converged at iteration 28, L1 7.44233e-05, Linf 0.00436375, total time[s] 0.074374 +Converged at iteration 27, L1 9.38906e-05, Linf 0.00680347, total time[s] 0.072561 +Converged at iteration 32, L1 9.3028e-05, Linf 0.00579288, total time[s] 0.084841 +Converged at iteration 28, L1 6.89045e-05, Linf 0.00193137, total time[s] 0.082704 +Converged at iteration 31, L1 7.96575e-05, Linf 0.0105304, total time[s] 0.086992 +Converged at iteration 31, L1 5.93774e-05, Linf 0.00251849, total time[s] 0.089267 +Converged at iteration 33, L1 6.84109e-05, Linf 0.00340415, total time[s] 0.089597 +Converged at iteration 31, L1 7.56177e-05, Linf 0.00738797, total time[s] 0.089224 +Converged at iteration 33, L1 5.08607e-05, Linf 0.0110389, total time[s] 0.097169 +Converged at iteration 29, L1 9.30461e-05, Linf 0.0173273, total time[s] 0.081609 +Converged at iteration 25, L1 7.10171e-05, Linf 0.00311795, total time[s] 0.067899 +Converged at iteration 38, L1 3.45157e-05, Linf 0.00829641, total time[s] 0.103378 +Converged at iteration 36, L1 3.61001e-05, Linf 0.00677686, total time[s] 0.102507 +Converged at iteration 25, L1 7.70275e-05, Linf 0.00308952, total time[s] 0.076865 +Converged at iteration 26, L1 4.39658e-05, Linf 0.00318678, total time[s] 0.07562 +Converged at iteration 25, L1 4.92008e-05, Linf 0.0076762, total time[s] 0.068075 +Converged at iteration 26, L1 8.51602e-05, Linf 0.0204252, total time[s] 0.079559 +Converged at iteration 21, L1 4.88372e-05, Linf 0.00814135, total time[s] 0.068164 +Converged at iteration 19, L1 8.30446e-05, Linf 0.00487397, total time[s] 0.0636 +Converged at iteration 23, L1 8.27951e-05, Linf 0.00274315, total time[s] 0.084558 +Converged at iteration 24, L1 9.43521e-05, Linf 0.00308585, total time[s] 0.090129 +Converged at iteration 22, L1 5.22715e-05, Linf 0.00240024, total time[s] 0.075203 +Converged at iteration 21, L1 5.09026e-05, Linf 0.00238307, total time[s] 0.073811 +Converged at iteration 32, L1 6.59717e-05, Linf 0.00867201, total time[s] 0.09252 +Converged at iteration 22, L1 9.6545e-05, Linf 0.00552809, total time[s] 0.089779 +Converged at iteration 24, L1 6.3167e-05, Linf 0.00493813, total time[s] 0.071112 +Converged at iteration 26, L1 8.47345e-05, Linf 0.00429044, total time[s] 0.066941 +Converged at iteration 23, L1 9.27474e-05, Linf 0.00357121, total time[s] 0.066566 +Converged at iteration 23, L1 8.02045e-05, Linf 0.0035629, total time[s] 0.057083 +Converged at iteration 26, L1 9.81606e-05, Linf 0.00591335, total time[s] 0.067315 +Converged at iteration 28, L1 7.58566e-05, Linf 0.00444906, total time[s] 0.0826 +Converged at iteration 27, L1 9.54714e-05, Linf 0.00683097, total time[s] 0.068054 +Converged at iteration 32, L1 9.34022e-05, Linf 0.00581877, total time[s] 0.080331 +Converged at iteration 28, L1 7.03147e-05, Linf 0.00194929, total time[s] 0.070618 +Converged at iteration 31, L1 8.35024e-05, Linf 0.0106956, total time[s] 0.077057 +Converged at iteration 31, L1 6.30261e-05, Linf 0.00251312, total time[s] 0.077419 +Converged at iteration 33, L1 7.07448e-05, Linf 0.00344269, total time[s] 0.085659 +Converged at iteration 31, L1 7.84937e-05, Linf 0.00754375, total time[s] 0.086618 +Converged at iteration 33, L1 5.22898e-05, Linf 0.0113776, total time[s] 0.087238 +Converged at iteration 29, L1 9.54725e-05, Linf 0.017286, total time[s] 0.075207 +Converged at iteration 25, L1 7.28842e-05, Linf 0.00310552, total time[s] 0.067914 +Converged at iteration 38, L1 3.62653e-05, Linf 0.00851884, total time[s] 0.098114 +Converged at iteration 36, L1 3.71918e-05, Linf 0.00704462, total time[s] 0.103955 +Converged at iteration 25, L1 7.73904e-05, Linf 0.00307522, total time[s] 0.069934 +Converged at iteration 26, L1 4.67732e-05, Linf 0.00333122, total time[s] 0.08335 +Converged at iteration 25, L1 4.95271e-05, Linf 0.00774517, total time[s] 0.073787 +Converged at iteration 26, L1 8.95056e-05, Linf 0.0213214, total time[s] 0.073689 +Converged at iteration 21, L1 4.94515e-05, Linf 0.00818659, total time[s] 0.08739 +Converged at iteration 19, L1 8.76911e-05, Linf 0.00498285, total time[s] 0.101099 +Converged at iteration 23, L1 8.20683e-05, Linf 0.00270065, total time[s] 0.14127 +Converged at iteration 24, L1 9.57297e-05, Linf 0.00311007, total time[s] 0.150414 +Converged at iteration 22, L1 5.28333e-05, Linf 0.00235974, total time[s] 0.119854 +Converged at iteration 21, L1 5.18689e-05, Linf 0.00242225, total time[s] 0.103777 +Converged at iteration 32, L1 6.86566e-05, Linf 0.00887656, total time[s] 0.272968 +Converged at iteration 22, L1 9.52186e-05, Linf 0.00564998, total time[s] 0.115778 +Converged at iteration 24, L1 6.40593e-05, Linf 0.00498155, total time[s] 0.139254 +Converged at iteration 26, L1 8.32864e-05, Linf 0.00424833, total time[s] 0.101242 +Converged at iteration 23, L1 9.00329e-05, Linf 0.00337631, total time[s] 0.077979 +Converged at iteration 23, L1 8.1976e-05, Linf 0.00344382, total time[s] 0.068227 +Converged at iteration 27, L1 4.70435e-05, Linf 0.00313708, total time[s] 0.080151 +Converged at iteration 28, L1 7.94578e-05, Linf 0.00467623, total time[s] 0.094205 +Converged at iteration 27, L1 9.5583e-05, Linf 0.00690302, total time[s] 0.072993 +Converged at iteration 32, L1 9.2957e-05, Linf 0.00585201, total time[s] 0.115435 +Converged at iteration 28, L1 7.31768e-05, Linf 0.00198807, total time[s] 0.10908 +Converged at iteration 31, L1 8.08184e-05, Linf 0.0107667, total time[s] 0.126823 +Converged at iteration 31, L1 6.33396e-05, Linf 0.00254017, total time[s] 0.084847 +Converged at iteration 33, L1 7.13114e-05, Linf 0.00355635, total time[s] 0.117409 +Converged at iteration 31, L1 8.1685e-05, Linf 0.00789433, total time[s] 0.088679 +Converged at iteration 33, L1 5.44853e-05, Linf 0.0120377, total time[s] 0.133076 +Converged at iteration 29, L1 9.25989e-05, Linf 0.0172658, total time[s] 0.08402 +Converged at iteration 25, L1 7.16185e-05, Linf 0.00306319, total time[s] 0.098104 +Converged at iteration 38, L1 3.61869e-05, Linf 0.00861173, total time[s] 0.125084 +Converged at iteration 36, L1 6.72914e-05, Linf 0.00726737, total time[s] 0.118484 +Converged at iteration 25, L1 7.71215e-05, Linf 0.00306858, total time[s] 0.080581 +Converged at iteration 26, L1 4.85184e-05, Linf 0.00340364, total time[s] 0.08088 +Converged at iteration 25, L1 5.11189e-05, Linf 0.00749107, total time[s] 0.072148 +Converged at iteration 26, L1 9.21186e-05, Linf 0.0216997, total time[s] 0.070701 +Converged at iteration 21, L1 5.06393e-05, Linf 0.00821388, total time[s] 0.059142 +Converged at iteration 19, L1 9.09746e-05, Linf 0.00501699, total time[s] 0.053716 +Converged at iteration 23, L1 8.09398e-05, Linf 0.00266398, total time[s] 0.066196 +Converged at iteration 24, L1 9.72133e-05, Linf 0.00311459, total time[s] 0.069115 +Converged at iteration 22, L1 5.27394e-05, Linf 0.00234921, total time[s] 0.073234 +Converged at iteration 21, L1 5.28265e-05, Linf 0.00248414, total time[s] 0.068575 +Converged at iteration 32, L1 7.74999e-05, Linf 0.00884351, total time[s] 0.086324 +Converged at iteration 22, L1 9.17789e-05, Linf 0.00569016, total time[s] 0.076248 +Converged at iteration 24, L1 6.46725e-05, Linf 0.0049968, total time[s] 0.097683 +Converged at iteration 26, L1 8.35402e-05, Linf 0.00425169, total time[s] 0.076276 +Converged at iteration 23, L1 9.03478e-05, Linf 0.00443972, total time[s] 0.07028 +Converged at iteration 23, L1 8.17923e-05, Linf 0.00336119, total time[s] 0.07861 +Converged at iteration 27, L1 4.97676e-05, Linf 0.00316985, total time[s] 0.086625 +Converged at iteration 28, L1 7.9953e-05, Linf 0.00477838, total time[s] 0.085478 +Converged at iteration 27, L1 9.63567e-05, Linf 0.00687939, total time[s] 0.077571 +Converged at iteration 32, L1 9.29037e-05, Linf 0.00587335, total time[s] 0.088384 +Converged at iteration 28, L1 7.35221e-05, Linf 0.00199719, total time[s] 0.073886 +Converged at iteration 31, L1 8.06174e-05, Linf 0.0108955, total time[s] 0.084046 +Converged at iteration 31, L1 6.06238e-05, Linf 0.00253998, total time[s] 0.092329 +Converged at iteration 33, L1 7.16175e-05, Linf 0.00358922, total time[s] 0.092052 +Converged at iteration 31, L1 8.40061e-05, Linf 0.00806618, total time[s] 0.084227 +Converged at iteration 33, L1 5.56635e-05, Linf 0.0123556, total time[s] 0.130216 +Converged at iteration 29, L1 9.14273e-05, Linf 0.0171627, total time[s] 0.079956 +Converged at iteration 25, L1 7.17499e-05, Linf 0.00304737, total time[s] 0.099283 +Converged at iteration 38, L1 3.63852e-05, Linf 0.00882205, total time[s] 0.10803 +Converged at iteration 36, L1 3.90555e-05, Linf 0.00756024, total time[s] 0.104043 +Converged at iteration 25, L1 7.72516e-05, Linf 0.00305338, total time[s] 0.085818 +Converged at iteration 26, L1 5.10571e-05, Linf 0.00364213, total time[s] 0.070077 +Converged at iteration 25, L1 5.17357e-05, Linf 0.00738259, total time[s] 0.069129 +Converged at iteration 26, L1 9.78564e-05, Linf 0.0228343, total time[s] 0.076712 +Converged at iteration 21, L1 5.09547e-05, Linf 0.00825267, total time[s] 0.073342 +Converged at iteration 19, L1 9.49831e-05, Linf 0.00516762, total time[s] 0.053462 +Converged at iteration 23, L1 7.9326e-05, Linf 0.00263268, total time[s] 0.063532 +Converged at iteration 24, L1 9.81033e-05, Linf 0.00312746, total time[s] 0.075496 +Converged at iteration 22, L1 5.28885e-05, Linf 0.00230843, total time[s] 0.072997 +Converged at iteration 21, L1 5.38772e-05, Linf 0.00255471, total time[s] 0.058173 +Converged at iteration 32, L1 7.31225e-05, Linf 0.0088713, total time[s] 0.088602 +Converged at iteration 22, L1 9.35748e-05, Linf 0.00587108, total time[s] 0.061126 +Converged at iteration 24, L1 6.50232e-05, Linf 0.00505891, total time[s] 0.07276 +Converged at iteration 26, L1 8.17526e-05, Linf 0.00419752, total time[s] 0.081906 +Converged at iteration 23, L1 8.65426e-05, Linf 0.00306413, total time[s] 0.066331 +Converged at iteration 23, L1 8.20776e-05, Linf 0.00315855, total time[s] 0.063541 +Converged at iteration 27, L1 4.81437e-05, Linf 0.00326263, total time[s] 0.073756 +Converged at iteration 28, L1 8.65204e-05, Linf 0.00505827, total time[s] 0.075621 +Converged at iteration 27, L1 9.98185e-05, Linf 0.00702564, total time[s] 0.072478 +Converged at iteration 32, L1 9.27866e-05, Linf 0.00590559, total time[s] 0.085575 +Converged at iteration 28, L1 7.69674e-05, Linf 0.00203341, total time[s] 0.075059 +Converged at iteration 31, L1 8.0936e-05, Linf 0.0107679, total time[s] 0.081709 +Converged at iteration 31, L1 5.99179e-05, Linf 0.00256215, total time[s] 0.082002 +Converged at iteration 33, L1 7.36508e-05, Linf 0.00370737, total time[s] 0.086379 +Converged at iteration 31, L1 9.0606e-05, Linf 0.00854789, total time[s] 0.082334 +Converged at iteration 33, L1 5.86728e-05, Linf 0.0132461, total time[s] 0.086826 +Converged at iteration 29, L1 9.09091e-05, Linf 0.0171021, total time[s] 0.075976 +Converged at iteration 25, L1 7.49747e-05, Linf 0.00304166, total time[s] 0.066903 +Converged at iteration 38, L1 3.69439e-05, Linf 0.00894987, total time[s] 0.101258 +Converged at iteration 36, L1 3.97124e-05, Linf 0.00770133, total time[s] 0.094752 +Converged at iteration 25, L1 7.69738e-05, Linf 0.00304216, total time[s] 0.067133 +Converged at iteration 26, L1 5.20804e-05, Linf 0.00371606, total time[s] 0.068733 +Converged at iteration 25, L1 5.10966e-05, Linf 0.00734939, total time[s] 0.066444 +Converged at iteration 27, L1 3.8537e-05, Linf 0.00863842, total time[s] 0.071507 +Converged at iteration 21, L1 5.17155e-05, Linf 0.00827435, total time[s] 0.05711 +Converged at iteration 19, L1 9.74452e-05, Linf 0.00518834, total time[s] 0.053051 +Converged at iteration 23, L1 7.8441e-05, Linf 0.0026111, total time[s] 0.07232 +Converged at iteration 24, L1 9.90973e-05, Linf 0.00313307, total time[s] 0.065885 +Converged at iteration 22, L1 5.24599e-05, Linf 0.00230588, total time[s] 0.060924 +Converged at iteration 21, L1 5.425e-05, Linf 0.00260468, total time[s] 0.058544 +Converged at iteration 32, L1 7.43546e-05, Linf 0.00873721, total time[s] 0.08633 +Converged at iteration 22, L1 9.43535e-05, Linf 0.00593664, total time[s] 0.060307 +Converged at iteration 24, L1 6.51619e-05, Linf 0.00507515, total time[s] 0.06563 +Converged at iteration 26, L1 8.20597e-05, Linf 0.00419781, total time[s] 0.072206 +Converged at iteration 23, L1 8.5926e-05, Linf 0.00298777, total time[s] 0.063542 +Converged at iteration 23, L1 8.09134e-05, Linf 0.00303456, total time[s] 0.063687 +Converged at iteration 27, L1 4.84365e-05, Linf 0.00329283, total time[s] 0.072434 +Converged at iteration 28, L1 8.85433e-05, Linf 0.00515913, total time[s] 0.075045 +Converged at iteration 28, L1 5.64321e-05, Linf 0.00441733, total time[s] 0.074831 +Converged at iteration 32, L1 9.27717e-05, Linf 0.00592002, total time[s] 0.084884 +Converged at iteration 28, L1 7.78861e-05, Linf 0.0020405, total time[s] 0.075789 +Converged at iteration 31, L1 8.12064e-05, Linf 0.0107645, total time[s] 0.083745 +Converged at iteration 31, L1 6.0187e-05, Linf 0.00256861, total time[s] 0.082304 +Converged at iteration 33, L1 7.41473e-05, Linf 0.00374671, total time[s] 0.087455 +Converged at iteration 31, L1 9.31022e-05, Linf 0.00874234, total time[s] 0.08215 +Converged at iteration 33, L1 5.97792e-05, Linf 0.0135891, total time[s] 0.086699 +Converged at iteration 29, L1 9.03156e-05, Linf 0.0170507, total time[s] 0.078254 +Converged at iteration 25, L1 7.52018e-05, Linf 0.00303456, total time[s] 0.067552 +Converged at iteration 38, L1 3.7944e-05, Linf 0.00932545, total time[s] 0.102225 +Converged at iteration 36, L1 4.10553e-05, Linf 0.00805556, total time[s] 0.095781 +Converged at iteration 25, L1 7.64516e-05, Linf 0.00301762, total time[s] 0.069155 +Converged at iteration 26, L1 5.58112e-05, Linf 0.00398301, total time[s] 0.070429 +Converged at iteration 25, L1 4.91339e-05, Linf 0.00727172, total time[s] 0.067793 +Converged at iteration 27, L1 3.96103e-05, Linf 0.00919568, total time[s] 0.072926 +Converged at iteration 21, L1 5.29262e-05, Linf 0.00831027, total time[s] 0.058303 +Converged at iteration 20, L1 4.63966e-05, Linf 0.00277398, total time[s] 0.055163 +Converged at iteration 23, L1 7.72728e-05, Linf 0.00257246, total time[s] 0.064029 +Converged at iteration 25, L1 5.84277e-05, Linf 0.00210612, total time[s] 0.069988 +Converged at iteration 22, L1 5.25464e-05, Linf 0.00231422, total time[s] 0.064146 +Converged at iteration 21, L1 5.46381e-05, Linf 0.0026842, total time[s] 0.058462 +Converged at iteration 32, L1 7.83099e-05, Linf 0.00892738, total time[s] 0.087153 +Converged at iteration 22, L1 9.67305e-05, Linf 0.00611184, total time[s] 0.060983 +Converged at iteration 24, L1 6.61941e-05, Linf 0.00512777, total time[s] 0.066303 +Converged at iteration 26, L1 8.09684e-05, Linf 0.00413858, total time[s] 0.074642 +Converged at iteration 23, L1 8.3655e-05, Linf 0.00279508, total time[s] 0.067285 +Converged at iteration 23, L1 7.96379e-05, Linf 0.00276742, total time[s] 0.061869 +Converged at iteration 27, L1 4.97047e-05, Linf 0.00338272, total time[s] 0.070583 +Converged at iteration 28, L1 9.76779e-05, Linf 0.00544883, total time[s] 0.073227 +Converged at iteration 28, L1 5.77644e-05, Linf 0.00447986, total time[s] 0.118784 +Converged at iteration 32, L1 9.25836e-05, Linf 0.00593496, total time[s] 0.101728 +Converged at iteration 28, L1 8.14314e-05, Linf 0.00207671, total time[s] 0.083914 +Converged at iteration 31, L1 8.18527e-05, Linf 0.010819, total time[s] 0.088682 +Converged at iteration 31, L1 6.18121e-05, Linf 0.00260623, total time[s] 0.089388 +Converged at iteration 33, L1 7.62797e-05, Linf 0.00383486, total time[s] 0.095263 +Converged at iteration 32, L1 3.72862e-05, Linf 0.00601066, total time[s] 0.099685 +Converged at iteration 33, L1 6.32924e-05, Linf 0.0149735, total time[s] 0.097667 +Converged at iteration 29, L1 9.09196e-05, Linf 0.0169142, total time[s] 0.079612 +Converged at iteration 25, L1 7.72378e-05, Linf 0.00305983, total time[s] 0.072308 +Converged at iteration 38, L1 3.89981e-05, Linf 0.00958463, total time[s] 0.12028 +Converged at iteration 36, L1 4.17009e-05, Linf 0.0081066, total time[s] 0.100345 +Converged at iteration 25, L1 7.63878e-05, Linf 0.00300965, total time[s] 0.06789 +Converged at iteration 26, L1 5.73937e-05, Linf 0.0040751, total time[s] 0.076344 +Converged at iteration 25, L1 4.97291e-05, Linf 0.00737494, total time[s] 0.070679 +Converged at iteration 27, L1 4.08099e-05, Linf 0.00937547, total time[s] 0.076033 +Converged at iteration 21, L1 5.37257e-05, Linf 0.00833361, total time[s] 0.062835 +Converged at iteration 20, L1 4.74033e-05, Linf 0.00279104, total time[s] 0.058865 +Converged at iteration 23, L1 7.69152e-05, Linf 0.0025678, total time[s] 0.066847 +Converged at iteration 25, L1 5.88934e-05, Linf 0.00210657, total time[s] 0.0772 +Converged at iteration 22, L1 5.34846e-05, Linf 0.00230201, total time[s] 0.068904 +Converged at iteration 21, L1 5.52179e-05, Linf 0.00270995, total time[s] 0.063432 +Converged at iteration 32, L1 7.97323e-05, Linf 0.00894703, total time[s] 0.083497 +Converged at iteration 22, L1 9.76335e-05, Linf 0.00618485, total time[s] 0.058317 +Converged at iteration 24, L1 6.73636e-05, Linf 0.00514486, total time[s] 0.071034 +Converged at iteration 26, L1 8.13689e-05, Linf 0.00414936, total time[s] 0.068591 +Converged at iteration 23, L1 8.32594e-05, Linf 0.00278896, total time[s] 0.063038 +Converged at iteration 23, L1 7.8786e-05, Linf 0.00264091, total time[s] 0.072957 +Converged at iteration 27, L1 5.08039e-05, Linf 0.00341735, total time[s] 0.098221 +Converged at iteration 29, L1 5.58192e-05, Linf 0.00313347, total time[s] 0.083463 +Converged at iteration 28, L1 5.815e-05, Linf 0.00450498, total time[s] 0.098857 +Converged at iteration 32, L1 9.30192e-05, Linf 0.00595534, total time[s] 0.115818 +Converged at iteration 28, L1 8.28248e-05, Linf 0.00208818, total time[s] 0.09296 +Converged at iteration 31, L1 8.15202e-05, Linf 0.010872, total time[s] 0.101774 +Converged at iteration 31, L1 6.1491e-05, Linf 0.00260257, total time[s] 0.094174 +Converged at iteration 33, L1 7.52805e-05, Linf 0.00385703, total time[s] 0.094176 +Converged at iteration 32, L1 3.83471e-05, Linf 0.00619834, total time[s] 0.100345 +Converged at iteration 33, L1 9.94692e-05, Linf 0.0149497, total time[s] 0.092181 +Converged at iteration 29, L1 8.85533e-05, Linf 0.016832, total time[s] 0.07992 +Converged at iteration 25, L1 7.73169e-05, Linf 0.00525766, total time[s] 0.077533 +Converged at iteration 38, L1 3.95972e-05, Linf 0.00970417, total time[s] 0.130769 +Converged at iteration 36, L1 4.29981e-05, Linf 0.00848452, total time[s] 0.117761 +Converged at iteration 25, L1 7.56379e-05, Linf 0.00298191, total time[s] 0.077411 +Converged at iteration 26, L1 5.95057e-05, Linf 0.0042592, total time[s] 0.091096 +Converged at iteration 25, L1 6.01798e-05, Linf 0.00721152, total time[s] 0.093299 +Converged at iteration 27, L1 6.90757e-05, Linf 0.00979593, total time[s] 0.139429 +Converged at iteration 21, L1 5.45155e-05, Linf 0.00840115, total time[s] 0.081834 +Converged at iteration 20, L1 4.85239e-05, Linf 0.00281316, total time[s] 0.079282 +Converged at iteration 23, L1 7.51609e-05, Linf 0.00263383, total time[s] 0.104586 +Converged at iteration 25, L1 5.99978e-05, Linf 0.00213738, total time[s] 0.1022 +Converged at iteration 22, L1 5.31284e-05, Linf 0.00230486, total time[s] 0.067595 +Converged at iteration 21, L1 5.60806e-05, Linf 0.00276232, total time[s] 0.060742 +Converged at iteration 32, L1 8.27765e-05, Linf 0.00897821, total time[s] 0.088149 +Converged at iteration 22, L1 9.93867e-05, Linf 0.00631584, total time[s] 0.060085 +Converged at iteration 24, L1 6.69389e-05, Linf 0.00517829, total time[s] 0.064601 +Converged at iteration 26, L1 8.04979e-05, Linf 0.00419301, total time[s] 0.071589 +Converged at iteration 23, L1 8.14931e-05, Linf 0.00266544, total time[s] 0.068498 +Converged at iteration 23, L1 7.8061e-05, Linf 0.00246212, total time[s] 0.062846 +Converged at iteration 27, L1 5.06723e-05, Linf 0.00348334, total time[s] 0.08026 +Converged at iteration 29, L1 6.01917e-05, Linf 0.00327836, total time[s] 0.114733 +Converged at iteration 28, L1 5.83099e-05, Linf 0.00455262, total time[s] 0.087376 +Converged at iteration 32, L1 9.23995e-05, Linf 0.00595714, total time[s] 0.0914 +Converged at iteration 28, L1 8.50357e-05, Linf 0.00211945, total time[s] 0.074802 +Converged at iteration 31, L1 8.26351e-05, Linf 0.0107016, total time[s] 0.085863 +Converged at iteration 31, L1 6.16357e-05, Linf 0.00263261, total time[s] 0.082493 +Converged at iteration 33, L1 7.59795e-05, Linf 0.00391489, total time[s] 0.087923 +Converged at iteration 32, L1 4.0915e-05, Linf 0.00673622, total time[s] 0.086331 +Converged at iteration 33, L1 6.68867e-05, Linf 0.0156792, total time[s] 0.09291 +Converged at iteration 29, L1 8.77475e-05, Linf 0.0167576, total time[s] 0.076836 +Converged at iteration 25, L1 7.76512e-05, Linf 0.00304204, total time[s] 0.06964 +Converged at iteration 38, L1 4.01644e-05, Linf 0.00982266, total time[s] 0.104995 +Converged at iteration 36, L1 4.34141e-05, Linf 0.00863953, total time[s] 0.110265 +Converged at iteration 25, L1 7.48839e-05, Linf 0.00297751, total time[s] 0.067175 +Converged at iteration 26, L1 6.05754e-05, Linf 0.00436075, total time[s] 0.069167 +Converged at iteration 25, L1 4.92016e-05, Linf 0.00718423, total time[s] 0.066841 +Converged at iteration 27, L1 7.08823e-05, Linf 0.0101538, total time[s] 0.075753 +Converged at iteration 21, L1 5.47089e-05, Linf 0.00871975, total time[s] 0.064122 +Converged at iteration 20, L1 5.04387e-05, Linf 0.00285286, total time[s] 0.091797 +Converged at iteration 23, L1 7.4499e-05, Linf 0.00264487, total time[s] 0.073299 +Converged at iteration 25, L1 6.0512e-05, Linf 0.00213969, total time[s] 0.093498 +Converged at iteration 22, L1 5.28473e-05, Linf 0.00229574, total time[s] 0.093893 +Converged at iteration 21, L1 5.628e-05, Linf 0.00279235, total time[s] 0.071873 +Converged at iteration 32, L1 8.42251e-05, Linf 0.00884964, total time[s] 0.113187 +Converged at iteration 23, L1 5.26644e-05, Linf 0.00348554, total time[s] 0.068599 +Converged at iteration 24, L1 6.72054e-05, Linf 0.00519582, total time[s] 0.069181 +Converged at iteration 26, L1 8.1797e-05, Linf 0.00427736, total time[s] 0.081504 +Converged at iteration 23, L1 8.06701e-05, Linf 0.00264215, total time[s] 0.077752 +Converged at iteration 23, L1 7.75263e-05, Linf 0.00237562, total time[s] 0.063512 +Converged at iteration 27, L1 4.96402e-05, Linf 0.00351339, total time[s] 0.073234 +Converged at iteration 29, L1 6.2055e-05, Linf 0.00335694, total time[s] 0.08197 +Converged at iteration 28, L1 5.77151e-05, Linf 0.00457824, total time[s] 0.08065 +Converged at iteration 32, L1 9.25567e-05, Linf 0.00597219, total time[s] 0.088776 +Converged at iteration 28, L1 8.62726e-05, Linf 0.00213801, total time[s] 0.086063 +Converged at iteration 31, L1 8.17057e-05, Linf 0.0108154, total time[s] 0.101164 +Converged at iteration 31, L1 6.24577e-05, Linf 0.00263727, total time[s] 0.08968 +Converged at iteration 33, L1 7.59445e-05, Linf 0.00393229, total time[s] 0.112188 +Converged at iteration 32, L1 4.19729e-05, Linf 0.00681887, total time[s] 0.102382 +Converged at iteration 33, L1 6.83228e-05, Linf 0.0161033, total time[s] 0.102755 +Converged at iteration 29, L1 8.69786e-05, Linf 0.0166602, total time[s] 0.075337 +Converged at iteration 25, L1 7.58953e-05, Linf 0.0030475, total time[s] 0.066353 +Converged at iteration 38, L1 4.12234e-05, Linf 0.0100055, total time[s] 0.101182 +Converged at iteration 36, L1 4.44009e-05, Linf 0.00919877, total time[s] 0.151661 +Converged at iteration 25, L1 7.39623e-05, Linf 0.00294882, total time[s] 0.068352 +Converged at iteration 26, L1 6.26643e-05, Linf 0.00455712, total time[s] 0.068964 +Converged at iteration 25, L1 4.88666e-05, Linf 0.00715636, total time[s] 0.067004 +Converged at iteration 27, L1 4.39175e-05, Linf 0.0106081, total time[s] 0.073559 +Converged at iteration 21, L1 5.59428e-05, Linf 0.00849829, total time[s] 0.060317 +Converged at iteration 20, L1 5.09898e-05, Linf 0.00285364, total time[s] 0.072312 +Converged at iteration 23, L1 7.34614e-05, Linf 0.00267192, total time[s] 0.077109 +Converged at iteration 25, L1 6.12087e-05, Linf 0.00215619, total time[s] 0.069336 +Converged at iteration 22, L1 5.28345e-05, Linf 0.00230271, total time[s] 0.076176 +Converged at iteration 21, L1 5.73914e-05, Linf 0.00284442, total time[s] 0.065978 +Converged at iteration 32, L1 8.7203e-05, Linf 0.00902408, total time[s] 0.098091 +Converged at iteration 23, L1 5.35337e-05, Linf 0.00355738, total time[s] 0.073276 +Converged at iteration 24, L1 6.77607e-05, Linf 0.00541965, total time[s] 0.06409 +Converged at iteration 26, L1 7.9499e-05, Linf 0.00439915, total time[s] 0.074053 +Converged at iteration 23, L1 7.85736e-05, Linf 0.00252911, total time[s] 0.064855 +Converged at iteration 23, L1 7.7802e-05, Linf 0.00227488, total time[s] 0.063319 +Converged at iteration 27, L1 5.06029e-05, Linf 0.00357467, total time[s] 0.076186 +Converged at iteration 29, L1 6.50385e-05, Linf 0.00349304, total time[s] 0.077529 +Converged at iteration 28, L1 6.00716e-05, Linf 0.00462205, total time[s] 0.082911 +Converged at iteration 32, L1 9.2101e-05, Linf 0.00597204, total time[s] 0.090133 +Converged at iteration 28, L1 8.95341e-05, Linf 0.00216438, total time[s] 0.077184 +Converged at iteration 31, L1 8.12814e-05, Linf 0.0108276, total time[s] 0.093595 +Converged at iteration 31, L1 6.21609e-05, Linf 0.00266228, total time[s] 0.092711 +Converged at iteration 33, L1 7.61419e-05, Linf 0.00398165, total time[s] 0.087319 +Converged at iteration 32, L1 4.41269e-05, Linf 0.00720103, total time[s] 0.09614 +Converged at iteration 33, L1 7.07511e-05, Linf 0.0168318, total time[s] 0.087206 +Converged at iteration 29, L1 8.6447e-05, Linf 0.0174423, total time[s] 0.078652 +Converged at iteration 25, L1 7.47799e-05, Linf 0.0030649, total time[s] 0.06716 +Converged at iteration 38, L1 4.19159e-05, Linf 0.010104, total time[s] 0.104219 +Converged at iteration 36, L1 7.54006e-05, Linf 0.00903267, total time[s] 0.10342 +Converged at iteration 25, L1 7.33852e-05, Linf 0.00293421, total time[s] 0.07325 +Converged at iteration 26, L1 6.44561e-05, Linf 0.00467066, total time[s] 0.068461 +Converged at iteration 25, L1 5.11216e-05, Linf 0.00775819, total time[s] 0.066475 +Converged at iteration 27, L1 7.87332e-05, Linf 0.0265737, total time[s] 0.073373 +Converged at iteration 21, L1 5.67511e-05, Linf 0.00852888, total time[s] 0.07878 +Converged at iteration 20, L1 5.19503e-05, Linf 0.00284682, total time[s] 0.056758 +Converged at iteration 23, L1 7.27582e-05, Linf 0.00269051, total time[s] 0.065419 +Converged at iteration 25, L1 6.16585e-05, Linf 0.00216605, total time[s] 0.084356 +Converged at iteration 22, L1 5.3076e-05, Linf 0.00229824, total time[s] 0.071074 +Converged at iteration 21, L1 5.77791e-05, Linf 0.00287276, total time[s] 0.063603 +Converged at iteration 32, L1 8.85473e-05, Linf 0.0090419, total time[s] 0.098308 +Converged at iteration 23, L1 5.42624e-05, Linf 0.00359479, total time[s] 0.063856 +Converged at iteration 24, L1 6.79965e-05, Linf 0.0052461, total time[s] 0.06487 +Converged at iteration 26, L1 7.96629e-05, Linf 0.00449857, total time[s] 0.068858 +Converged at iteration 23, L1 7.75029e-05, Linf 0.00249587, total time[s] 0.062907 +Converged at iteration 23, L1 7.57787e-05, Linf 0.00221429, total time[s] 0.063239 +Converged at iteration 27, L1 5.05552e-05, Linf 0.00360086, total time[s] 0.127311 +Converged at iteration 29, L1 6.57019e-05, Linf 0.00355571, total time[s] 0.077328 +Converged at iteration 28, L1 6.15025e-05, Linf 0.00464431, total time[s] 0.07777 +Converged at iteration 32, L1 9.22288e-05, Linf 0.00598046, total time[s] 0.095094 +Converged at iteration 28, L1 8.96161e-05, Linf 0.0021742, total time[s] 0.079881 +Converged at iteration 31, L1 8.14759e-05, Linf 0.0108051, total time[s] 0.080528 +Converged at iteration 31, L1 6.83174e-05, Linf 0.0026592, total time[s] 0.088421 +Converged at iteration 33, L1 7.75803e-05, Linf 0.00399682, total time[s] 0.093174 +Converged at iteration 32, L1 4.52534e-05, Linf 0.00745694, total time[s] 0.086737 +Converged at iteration 33, L1 7.26904e-05, Linf 0.0183561, total time[s] 0.090805 +Converged at iteration 29, L1 8.58377e-05, Linf 0.0173418, total time[s] 0.094741 +Converged at iteration 25, L1 7.44897e-05, Linf 0.00307638, total time[s] 0.093515 +Converged at iteration 38, L1 4.28088e-05, Linf 0.0105418, total time[s] 0.115045 +Converged at iteration 36, L1 4.69402e-05, Linf 0.00976392, total time[s] 0.108194 +Converged at iteration 25, L1 7.19061e-05, Linf 0.00288321, total time[s] 0.068944 +Converged at iteration 26, L1 6.77583e-05, Linf 0.00503714, total time[s] 0.075338 +Converged at iteration 25, L1 4.79174e-05, Linf 0.00707126, total time[s] 0.070003 +Converged at iteration 27, L1 4.98663e-05, Linf 0.0116066, total time[s] 0.116175 +Converged at iteration 21, L1 5.88291e-05, Linf 0.00857048, total time[s] 0.076498 +Converged at iteration 20, L1 5.46214e-05, Linf 0.00289385, total time[s] 0.063588 +Converged at iteration 23, L1 7.18786e-05, Linf 0.00271396, total time[s] 0.100795 +Converged at iteration 25, L1 6.20755e-05, Linf 0.00218866, total time[s] 0.112254 +Converged at iteration 22, L1 5.27033e-05, Linf 0.00228554, total time[s] 0.103997 +Converged at iteration 21, L1 5.88861e-05, Linf 0.00295056, total time[s] 0.096006 +Converged at iteration 32, L1 9.36235e-05, Linf 0.00908738, total time[s] 0.114051 +Converged at iteration 23, L1 6.7374e-05, Linf 0.00553318, total time[s] 0.085613 +Converged at iteration 24, L1 6.91945e-05, Linf 0.0053072, total time[s] 0.089284 +Converged at iteration 26, L1 7.76837e-05, Linf 0.00460429, total time[s] 0.100932 +Converged at iteration 23, L1 7.46357e-05, Linf 0.00246241, total time[s] 0.103566 +Converged at iteration 23, L1 7.53395e-05, Linf 0.00208982, total time[s] 0.118943 +Converged at iteration 27, L1 5.57085e-05, Linf 0.00370168, total time[s] 0.101298 +Converged at iteration 29, L1 6.93771e-05, Linf 0.00377735, total time[s] 0.113139 +Converged at iteration 28, L1 6.4131e-05, Linf 0.00471013, total time[s] 0.106392 +Converged at iteration 32, L1 9.11469e-05, Linf 0.0059744, total time[s] 0.11785 +Converged at iteration 28, L1 9.27836e-05, Linf 0.00221861, total time[s] 0.081298 +Converged at iteration 31, L1 8.2338e-05, Linf 0.0108165, total time[s] 0.102817 +Converged at iteration 31, L1 6.24937e-05, Linf 0.00270721, total time[s] 0.088298 +Converged at iteration 33, L1 7.63628e-05, Linf 0.00404457, total time[s] 0.085987 +Converged at iteration 32, L1 4.81354e-05, Linf 0.0078123, total time[s] 0.092637 +Converged at iteration 33, L1 7.61367e-05, Linf 0.0184793, total time[s] 0.088628 +Converged at iteration 29, L1 8.42682e-05, Linf 0.0171745, total time[s] 0.075553 +Converged at iteration 25, L1 7.23867e-05, Linf 0.00312056, total time[s] 0.067567 +Converged at iteration 38, L1 4.26845e-05, Linf 0.0104666, total time[s] 0.102386 +Converged at iteration 36, L1 4.68591e-05, Linf 0.00959414, total time[s] 0.096866 +Converged at iteration 25, L1 7.11845e-05, Linf 0.00286983, total time[s] 0.066589 +Converged at iteration 26, L1 6.90178e-05, Linf 0.00513944, total time[s] 0.068504 +Converged at iteration 25, L1 4.77516e-05, Linf 0.00705198, total time[s] 0.07326 +Converged at iteration 27, L1 4.7609e-05, Linf 0.0118694, total time[s] 0.094074 +Converged at iteration 21, L1 5.97189e-05, Linf 0.00875577, total time[s] 0.063668 +Converged at iteration 20, L1 5.62904e-05, Linf 0.00331202, total time[s] 0.06536 +Converged at iteration 23, L1 7.16468e-05, Linf 0.00272804, total time[s] 0.074699 +Converged at iteration 25, L1 6.22876e-05, Linf 0.00219127, total time[s] 0.080743 +Converged at iteration 22, L1 5.30503e-05, Linf 0.00227642, total time[s] 0.076419 +Converged at iteration 21, L1 5.94097e-05, Linf 0.00298204, total time[s] 0.062869 +Converged at iteration 32, L1 9.54494e-05, Linf 0.00900356, total time[s] 0.093719 +Converged at iteration 23, L1 6.78118e-05, Linf 0.00890208, total time[s] 0.074373 +Converged at iteration 24, L1 7.18056e-05, Linf 0.00532522, total time[s] 0.06725 +Converged at iteration 26, L1 7.79578e-05, Linf 0.00440542, total time[s] 0.08908 +Converged at iteration 23, L1 7.38488e-05, Linf 0.00244733, total time[s] 0.074775 +Converged at iteration 23, L1 7.56408e-05, Linf 0.00203472, total time[s] 0.070348 +Converged at iteration 27, L1 5.76882e-05, Linf 0.00373737, total time[s] 0.083369 +Converged at iteration 29, L1 6.97984e-05, Linf 0.00386482, total time[s] 0.078992 +Converged at iteration 28, L1 6.3508e-05, Linf 0.00473568, total time[s] 0.073464 +Converged at iteration 32, L1 9.09348e-05, Linf 0.00598348, total time[s] 0.085568 +Converged at iteration 28, L1 9.29356e-05, Linf 0.00223092, total time[s] 0.083836 +Converged at iteration 31, L1 8.26733e-05, Linf 0.0107897, total time[s] 0.097766 +Converged at iteration 31, L1 6.25968e-05, Linf 0.00271383, total time[s] 0.098605 +Converged at iteration 33, L1 7.62344e-05, Linf 0.00405954, total time[s] 0.115574 +Converged at iteration 32, L1 5.01929e-05, Linf 0.00798371, total time[s] 0.093285 +Converged at iteration 33, L1 7.77278e-05, Linf 0.0189533, total time[s] 0.099758 +Converged at iteration 29, L1 8.34328e-05, Linf 0.0170801, total time[s] 0.077157 +Converged at iteration 25, L1 7.21046e-05, Linf 0.00314425, total time[s] 0.066437 +Converged at iteration 38, L1 4.41843e-05, Linf 0.0107077, total time[s] 0.108609 +Converged at iteration 36, L1 4.77307e-05, Linf 0.00987076, total time[s] 0.109896 +Converged at iteration 25, L1 6.98519e-05, Linf 0.00283294, total time[s] 0.067671 +Converged at iteration 26, L1 7.18167e-05, Linf 0.00539578, total time[s] 0.06922 +Converged at iteration 25, L1 4.73602e-05, Linf 0.00701404, total time[s] 0.068058 +Converged at iteration 27, L1 4.90582e-05, Linf 0.0124751, total time[s] 0.075965 +Converged at iteration 21, L1 6.083e-05, Linf 0.00860999, total time[s] 0.057198 +Converged at iteration 20, L1 5.67553e-05, Linf 0.00292467, total time[s] 0.055866 +Converged at iteration 23, L1 7.13406e-05, Linf 0.00279778, total time[s] 0.062074 +Converged at iteration 25, L1 6.24735e-05, Linf 0.00219251, total time[s] 0.067087 +Converged at iteration 22, L1 5.2386e-05, Linf 0.00226066, total time[s] 0.059966 +Converged at iteration 21, L1 6.04844e-05, Linf 0.00304093, total time[s] 0.057338 +Converged at iteration 32, L1 9.9266e-05, Linf 0.0091335, total time[s] 0.088879 +Converged at iteration 23, L1 5.67088e-05, Linf 0.0038162, total time[s] 0.062084 +Converged at iteration 24, L1 7.21976e-05, Linf 0.00536759, total time[s] 0.068304 +Converged at iteration 26, L1 7.70607e-05, Linf 0.00433305, total time[s] 0.074383 +Converged at iteration 23, L1 7.31411e-05, Linf 0.00240013, total time[s] 0.064418 +Converged at iteration 23, L1 7.30779e-05, Linf 0.0019964, total time[s] 0.071255 +Converged at iteration 27, L1 6.08252e-05, Linf 0.00381617, total time[s] 0.07201 +Converged at iteration 29, L1 6.97568e-05, Linf 0.00406583, total time[s] 0.076754 +Converged at iteration 28, L1 6.59019e-05, Linf 0.00478367, total time[s] 0.076669 +Converged at iteration 32, L1 9.05737e-05, Linf 0.00597776, total time[s] 0.088762 +Converged at iteration 28, L1 9.47331e-05, Linf 0.00226491, total time[s] 0.077645 +Converged at iteration 31, L1 8.12926e-05, Linf 0.0107911, total time[s] 0.081372 +Converged at iteration 31, L1 6.30283e-05, Linf 0.00273877, total time[s] 0.081161 +Converged at iteration 33, L1 7.59878e-05, Linf 0.00408551, total time[s] 0.114009 +Converged at iteration 32, L1 5.17025e-05, Linf 0.00831073, total time[s] 0.086706 +Converged at iteration 33, L1 9.68228e-05, Linf 0.0197458, total time[s] 0.085741 +Converged at iteration 29, L1 8.23523e-05, Linf 0.017843, total time[s] 0.076868 +Converged at iteration 25, L1 7.21425e-05, Linf 0.00318806, total time[s] 0.066815 +Converged at iteration 38, L1 4.40793e-05, Linf 0.010881, total time[s] 0.111191 +Converged at iteration 36, L1 4.82216e-05, Linf 0.0100456, total time[s] 0.113911 +Converged at iteration 25, L1 6.90735e-05, Linf 0.00282243, total time[s] 0.067846 +Converged at iteration 26, L1 7.30574e-05, Linf 0.00549528, total time[s] 0.073226 +Converged at iteration 25, L1 4.69777e-05, Linf 0.006988, total time[s] 0.071979 +Converged at iteration 27, L1 5.01236e-05, Linf 0.0127991, total time[s] 0.072612 +Converged at iteration 21, L1 6.16679e-05, Linf 0.00863068, total time[s] 0.057527 +Converged at iteration 20, L1 5.77233e-05, Linf 0.00293036, total time[s] 0.055817 +Converged at iteration 23, L1 7.10801e-05, Linf 0.00281764, total time[s] 0.068281 +Converged at iteration 25, L1 6.27261e-05, Linf 0.00219351, total time[s] 0.066216 +Converged at iteration 22, L1 5.23749e-05, Linf 0.0022431, total time[s] 0.0598 +Converged at iteration 21, L1 6.12588e-05, Linf 0.00307736, total time[s] 0.058349 +Converged at iteration 33, L1 3.25638e-05, Linf 0.00288551, total time[s] 0.08419 +Converged at iteration 23, L1 5.75346e-05, Linf 0.00385825, total time[s] 0.06117 +Converged at iteration 24, L1 7.09724e-05, Linf 0.00560068, total time[s] 0.065329 +Converged at iteration 26, L1 7.76025e-05, Linf 0.00435208, total time[s] 0.068429 +Converged at iteration 23, L1 7.2632e-05, Linf 0.00241936, total time[s] 0.062771 +Converged at iteration 23, L1 7.3109e-05, Linf 0.00200268, total time[s] 0.061754 +Converged at iteration 27, L1 6.19013e-05, Linf 0.00384562, total time[s] 0.070964 +Converged at iteration 29, L1 6.93433e-05, Linf 0.00412926, total time[s] 0.074758 +Converged at iteration 28, L1 6.80298e-05, Linf 0.00483115, total time[s] 0.072897 +Converged at iteration 32, L1 8.97317e-05, Linf 0.00598858, total time[s] 0.081501 +Converged at iteration 28, L1 9.61458e-05, Linf 0.00235735, total time[s] 0.072914 +Converged at iteration 31, L1 8.13251e-05, Linf 0.010756, total time[s] 0.080696 +Converged at iteration 31, L1 6.3043e-05, Linf 0.00274377, total time[s] 0.080741 +Converged at iteration 33, L1 7.59268e-05, Linf 0.00409744, total time[s] 0.085894 +Converged at iteration 32, L1 5.33895e-05, Linf 0.00850344, total time[s] 0.08321 +Converged at iteration 34, L1 6.90302e-05, Linf 0.00637922, total time[s] 0.088439 +Converged at iteration 29, L1 8.18282e-05, Linf 0.0178833, total time[s] 0.076164 +Converged at iteration 25, L1 7.24043e-05, Linf 0.00320983, total time[s] 0.06664 +Converged at iteration 38, L1 4.47877e-05, Linf 0.0111786, total time[s] 0.099847 +Converged at iteration 36, L1 5.0132e-05, Linf 0.0101693, total time[s] 0.093629 +Converged at iteration 25, L1 6.79236e-05, Linf 0.00278359, total time[s] 0.066505 +Converged at iteration 26, L1 7.52192e-05, Linf 0.00586526, total time[s] 0.069095 +Converged at iteration 25, L1 4.6565e-05, Linf 0.0069483, total time[s] 0.066854 +Converged at iteration 27, L1 5.15868e-05, Linf 0.0137751, total time[s] 0.072175 +Converged at iteration 21, L1 6.27883e-05, Linf 0.00865064, total time[s] 0.05851 +Converged at iteration 20, L1 5.91689e-05, Linf 0.00292072, total time[s] 0.054743 +Converged at iteration 23, L1 7.08155e-05, Linf 0.00285066, total time[s] 0.064079 +Converged at iteration 25, L1 6.31173e-05, Linf 0.00218539, total time[s] 0.066586 +Converged at iteration 22, L1 5.21151e-05, Linf 0.0022394, total time[s] 0.060109 +Converged at iteration 21, L1 6.26543e-05, Linf 0.00313832, total time[s] 0.058039 +Converged at iteration 33, L1 3.31942e-05, Linf 0.00289852, total time[s] 0.093142 +Converged at iteration 23, L1 5.80804e-05, Linf 0.00392588, total time[s] 0.061821 +Converged at iteration 24, L1 7.20276e-05, Linf 0.00543489, total time[s] 0.064259 +Converged at iteration 26, L1 7.65891e-05, Linf 0.00433011, total time[s] 0.068898 +Converged at iteration 23, L1 7.17228e-05, Linf 0.00503922, total time[s] 0.061555 +Converged at iteration 23, L1 7.33885e-05, Linf 0.00212506, total time[s] 0.061705 +Converged at iteration 27, L1 6.39666e-05, Linf 0.00389563, total time[s] 0.072546 +Converged at iteration 29, L1 7.00035e-05, Linf 0.00427623, total time[s] 0.076274 +Converged at iteration 28, L1 7.26081e-05, Linf 0.00485262, total time[s] 0.074127 +Converged at iteration 32, L1 8.89523e-05, Linf 0.00598442, total time[s] 0.083299 +Converged at iteration 28, L1 9.72582e-05, Linf 0.00230295, total time[s] 0.073751 +Converged at iteration 31, L1 8.12081e-05, Linf 0.0107472, total time[s] 0.081056 +Converged at iteration 31, L1 6.39289e-05, Linf 0.00276656, total time[s] 0.080915 +Converged at iteration 33, L1 7.60766e-05, Linf 0.00412716, total time[s] 0.08798 +Converged at iteration 32, L1 5.55818e-05, Linf 0.00880633, total time[s] 0.082565 +Converged at iteration 33, L1 8.56872e-05, Linf 0.0212989, total time[s] 0.087889 +Converged at iteration 29, L1 8.07641e-05, Linf 0.0177278, total time[s] 0.076085 +Converged at iteration 25, L1 7.4816e-05, Linf 0.00324534, total time[s] 0.068703 +Converged at iteration 38, L1 4.52057e-05, Linf 0.0113726, total time[s] 0.112714 +Converged at iteration 36, L1 4.97124e-05, Linf 0.0104766, total time[s] 0.098336 +Converged at iteration 25, L1 6.78532e-05, Linf 0.00277289, total time[s] 0.067725 +Converged at iteration 26, L1 7.71134e-05, Linf 0.00604554, total time[s] 0.099555 +Converged at iteration 25, L1 4.6583e-05, Linf 0.00691033, total time[s] 0.083 +Converged at iteration 27, L1 5.20934e-05, Linf 0.0136845, total time[s] 0.07674 +Converged at iteration 21, L1 6.36578e-05, Linf 0.00867331, total time[s] 0.079373 +Converged at iteration 20, L1 6.06014e-05, Linf 0.00292112, total time[s] 0.059783 +Converged at iteration 23, L1 7.05256e-05, Linf 0.00286464, total time[s] 0.064853 +Converged at iteration 25, L1 6.33909e-05, Linf 0.00220323, total time[s] 0.066863 +Converged at iteration 22, L1 5.2232e-05, Linf 0.00223672, total time[s] 0.062707 +Converged at iteration 21, L1 6.32396e-05, Linf 0.00317737, total time[s] 0.061125 +Converged at iteration 33, L1 3.35558e-05, Linf 0.00290881, total time[s] 0.086998 +Converged at iteration 23, L1 5.85391e-05, Linf 0.00396442, total time[s] 0.064029 +Converged at iteration 24, L1 7.26607e-05, Linf 0.00545824, total time[s] 0.065997 +Converged at iteration 26, L1 7.75962e-05, Linf 0.00434605, total time[s] 0.073352 +Converged at iteration 23, L1 6.98915e-05, Linf 0.00239958, total time[s] 0.066426 +Converged at iteration 23, L1 7.30336e-05, Linf 0.00202039, total time[s] 0.067879 +Converged at iteration 27, L1 6.53864e-05, Linf 0.00391726, total time[s] 0.080684 +Converged at iteration 29, L1 6.96734e-05, Linf 0.00433653, total time[s] 0.076799 +Converged at iteration 28, L1 7.36932e-05, Linf 0.0049025, total time[s] 0.073982 +Converged at iteration 32, L1 8.8984e-05, Linf 0.00599676, total time[s] 0.083573 +Converged at iteration 28, L1 9.76302e-05, Linf 0.00231931, total time[s] 0.084065 +Converged at iteration 31, L1 8.27143e-05, Linf 0.0109614, total time[s] 0.100325 +Converged at iteration 31, L1 6.48443e-05, Linf 0.00276951, total time[s] 0.086046 +Converged at iteration 33, L1 7.68147e-05, Linf 0.00414302, total time[s] 0.103997 +Converged at iteration 32, L1 5.87852e-05, Linf 0.00886103, total time[s] 0.092856 +Converged at iteration 33, L1 8.79441e-05, Linf 0.0218411, total time[s] 0.106528 +Converged at iteration 29, L1 7.99038e-05, Linf 0.0176766, total time[s] 0.105471 +Converged at iteration 25, L1 7.42127e-05, Linf 0.00325928, total time[s] 0.089833 +Converged at iteration 38, L1 4.60855e-05, Linf 0.011804, total time[s] 0.146923 +Converged at iteration 36, L1 5.05279e-05, Linf 0.0106605, total time[s] 0.133653 +Converged at iteration 25, L1 6.80542e-05, Linf 0.00273546, total time[s] 0.081216 +Converged at iteration 26, L1 7.93464e-05, Linf 0.0063323, total time[s] 0.0795 +Converged at iteration 25, L1 4.57292e-05, Linf 0.00683614, total time[s] 0.067692 +Converged at iteration 27, L1 5.39241e-05, Linf 0.0144085, total time[s] 0.085676 +Converged at iteration 21, L1 6.57723e-05, Linf 0.00885202, total time[s] 0.060324 +Converged at iteration 20, L1 6.25873e-05, Linf 0.00292537, total time[s] 0.059329 +Converged at iteration 23, L1 7.00577e-05, Linf 0.00295555, total time[s] 0.100304 +Converged at iteration 25, L1 6.45472e-05, Linf 0.00223167, total time[s] 0.127134 +Converged at iteration 22, L1 5.17603e-05, Linf 0.00222254, total time[s] 0.102993 +Converged at iteration 21, L1 6.47901e-05, Linf 0.00325869, total time[s] 0.056833 +Converged at iteration 33, L1 3.46956e-05, Linf 0.00292481, total time[s] 0.087101 +Converged at iteration 23, L1 5.96434e-05, Linf 0.00404839, total time[s] 0.060601 +Converged at iteration 24, L1 7.38212e-05, Linf 0.00550345, total time[s] 0.066148 +Converged at iteration 26, L1 7.53985e-05, Linf 0.00431129, total time[s] 0.067824 +Converged at iteration 23, L1 6.84501e-05, Linf 0.00231841, total time[s] 0.060767 +Converged at iteration 23, L1 7.29046e-05, Linf 0.00188064, total time[s] 0.061304 +Converged at iteration 27, L1 6.78603e-05, Linf 0.0039661, total time[s] 0.070058 +Converged at iteration 29, L1 7.03128e-05, Linf 0.00457655, total time[s] 0.075081 +Converged at iteration 28, L1 6.72779e-05, Linf 0.00493725, total time[s] 0.072391 +Converged at iteration 32, L1 8.82785e-05, Linf 0.0059967, total time[s] 0.082171 +Converged at iteration 28, L1 9.99092e-05, Linf 0.00236451, total time[s] 0.072962 +Converged at iteration 31, L1 8.01856e-05, Linf 0.0106719, total time[s] 0.084325 +Converged at iteration 31, L1 6.78124e-05, Linf 0.00278922, total time[s] 0.086144 +Converged at iteration 33, L1 7.70657e-05, Linf 0.00418286, total time[s] 0.085033 +Converged at iteration 32, L1 6.06877e-05, Linf 0.00924858, total time[s] 0.082214 +Converged at iteration 33, L1 9.18167e-05, Linf 0.0230369, total time[s] 0.084841 +Converged at iteration 29, L1 7.88072e-05, Linf 0.0186033, total time[s] 0.075494 +Converged at iteration 25, L1 7.5772e-05, Linf 0.00330415, total time[s] 0.066063 +Converged at iteration 38, L1 4.65127e-05, Linf 0.0120025, total time[s] 0.097491 +Converged at iteration 36, L1 5.10494e-05, Linf 0.0109718, total time[s] 0.097785 +Converged at iteration 25, L1 6.81598e-05, Linf 0.00271894, total time[s] 0.069725 +Converged at iteration 26, L1 8.03047e-05, Linf 0.00643603, total time[s] 0.06793 +Converged at iteration 25, L1 4.51818e-05, Linf 0.00679315, total time[s] 0.066177 +Converged at iteration 27, L1 5.48441e-05, Linf 0.0153513, total time[s] 0.070659 +Converged at iteration 21, L1 6.60294e-05, Linf 0.00869848, total time[s] 0.059302 +Converged at iteration 20, L1 6.36245e-05, Linf 0.00297417, total time[s] 0.056431 +Converged at iteration 23, L1 6.93198e-05, Linf 0.00296952, total time[s] 0.064476 +Converged at iteration 25, L1 6.41039e-05, Linf 0.00224432, total time[s] 0.066984 +Converged at iteration 22, L1 5.15484e-05, Linf 0.00221349, total time[s] 0.070281 +Converged at iteration 21, L1 6.54441e-05, Linf 0.00329859, total time[s] 0.057155 +Converged at iteration 33, L1 3.51727e-05, Linf 0.00293612, total time[s] 0.093413 +Converged at iteration 23, L1 6.00745e-05, Linf 0.00408258, total time[s] 0.062464 +Converged at iteration 24, L1 7.43156e-05, Linf 0.00551865, total time[s] 0.067858 +Converged at iteration 26, L1 7.55677e-05, Linf 0.00431176, total time[s] 0.067628 +Converged at iteration 23, L1 6.80349e-05, Linf 0.00233484, total time[s] 0.071927 +Converged at iteration 23, L1 7.24129e-05, Linf 0.00180044, total time[s] 0.061693 +Converged at iteration 27, L1 6.86397e-05, Linf 0.00398385, total time[s] 0.072831 +Converged at iteration 29, L1 7.05852e-05, Linf 0.00465944, total time[s] 0.080531 +Converged at iteration 28, L1 6.57183e-05, Linf 0.00496167, total time[s] 0.131569 +Converged at iteration 32, L1 8.82183e-05, Linf 0.006005, total time[s] 0.11669 +Converged at iteration 29, L1 5.70761e-05, Linf 0.00160554, total time[s] 0.079931 +Converged at iteration 31, L1 7.96421e-05, Linf 0.0106311, total time[s] 0.079119 +Converged at iteration 31, L1 6.47166e-05, Linf 0.00279608, total time[s] 0.07913 +Converged at iteration 33, L1 7.73488e-05, Linf 0.00420507, total time[s] 0.092499 +Converged at iteration 32, L1 6.23281e-05, Linf 0.00957769, total time[s] 0.08461 +Converged at iteration 33, L1 9.37989e-05, Linf 0.0235852, total time[s] 0.096805 +Converged at iteration 29, L1 7.8004e-05, Linf 0.0186991, total time[s] 0.077815 +Converged at iteration 25, L1 7.58044e-05, Linf 0.00331274, total time[s] 0.065316 +Converged at iteration 38, L1 4.75824e-05, Linf 0.0125013, total time[s] 0.101254 +Converged at iteration 36, L1 5.22058e-05, Linf 0.0113844, total time[s] 0.097137 +Converged at iteration 25, L1 6.83864e-05, Linf 0.00268078, total time[s] 0.068595 +Converged at iteration 26, L1 8.45696e-05, Linf 0.00680957, total time[s] 0.069335 +Converged at iteration 24, L1 9.99089e-05, Linf 0.0123475, total time[s] 0.064321 +Converged at iteration 27, L1 5.74998e-05, Linf 0.0156329, total time[s] 0.071372 +Converged at iteration 21, L1 6.69252e-05, Linf 0.00870358, total time[s] 0.059575 +Converged at iteration 20, L1 6.51993e-05, Linf 0.0030651, total time[s] 0.056087 +Converged at iteration 23, L1 6.87824e-05, Linf 0.00308219, total time[s] 0.065064 +Converged at iteration 25, L1 6.51058e-05, Linf 0.00228435, total time[s] 0.068001 +Converged at iteration 22, L1 5.1255e-05, Linf 0.0034429, total time[s] 0.062053 +Converged at iteration 21, L1 6.6903e-05, Linf 0.00341182, total time[s] 0.060134 +Converged at iteration 33, L1 3.66181e-05, Linf 0.00297414, total time[s] 0.087142 +Converged at iteration 23, L1 6.89069e-05, Linf 0.00418108, total time[s] 0.068938 +Converged at iteration 24, L1 7.58631e-05, Linf 0.00557248, total time[s] 0.085565 +Converged at iteration 26, L1 7.59502e-05, Linf 0.0042376, total time[s] 0.103393 +Converged at iteration 23, L1 6.62838e-05, Linf 0.0023781, total time[s] 0.077625 +Converged at iteration 23, L1 7.14499e-05, Linf 0.0018659, total time[s] 0.069617 +Converged at iteration 27, L1 7.03785e-05, Linf 0.00404314, total time[s] 0.097195 +Converged at iteration 29, L1 7.31261e-05, Linf 0.00491458, total time[s] 0.083286 +Converged at iteration 28, L1 6.56634e-05, Linf 0.0050323, total time[s] 0.08686 +Converged at iteration 32, L1 8.72056e-05, Linf 0.00599976, total time[s] 0.083873 +Converged at iteration 29, L1 5.97267e-05, Linf 0.00166042, total time[s] 0.078337 +Converged at iteration 31, L1 7.89222e-05, Linf 0.0106113, total time[s] 0.085547 +Converged at iteration 31, L1 6.98083e-05, Linf 0.00282256, total time[s] 0.080812 +Converged at iteration 33, L1 7.79635e-05, Linf 0.00425088, total time[s] 0.090811 +Converged at iteration 32, L1 6.7115e-05, Linf 0.0100395, total time[s] 0.090001 +Converged at iteration 34, L1 3.92402e-05, Linf 0.00832684, total time[s] 0.107374 +Converged at iteration 29, L1 7.60045e-05, Linf 0.0183528, total time[s] 0.083963 +Converged at iteration 25, L1 7.66958e-05, Linf 0.00332924, total time[s] 0.116074 +Converged at iteration 38, L1 5.63265e-05, Linf 0.012686, total time[s] 0.202415 +Converged at iteration 36, L1 5.25951e-05, Linf 0.0119814, total time[s] 0.12563 +Converged at iteration 25, L1 6.77227e-05, Linf 0.00267003, total time[s] 0.082015 +Converged at iteration 26, L1 8.55088e-05, Linf 0.00692596, total time[s] 0.123865 +Converged at iteration 25, L1 4.59879e-05, Linf 0.00660391, total time[s] 0.157186 +Converged at iteration 27, L1 5.87157e-05, Linf 0.0164787, total time[s] 0.124185 +Converged at iteration 21, L1 6.78478e-05, Linf 0.00888402, total time[s] 0.090023 +Converged at iteration 20, L1 6.7995e-05, Linf 0.00310506, total time[s] 0.133395 +Converged at iteration 23, L1 6.81425e-05, Linf 0.00310159, total time[s] 0.121908 +Converged at iteration 25, L1 6.51728e-05, Linf 0.0023038, total time[s] 0.093017 +Converged at iteration 22, L1 5.06869e-05, Linf 0.00196933, total time[s] 0.071061 +Converged at iteration 21, L1 6.74832e-05, Linf 0.00346094, total time[s] 0.08 +Converged at iteration 33, L1 3.7151e-05, Linf 0.00297045, total time[s] 0.094599 +Converged at iteration 23, L1 6.19372e-05, Linf 0.00422047, total time[s] 0.063326 +Converged at iteration 24, L1 7.66462e-05, Linf 0.00559271, total time[s] 0.072804 +Converged at iteration 26, L1 7.44463e-05, Linf 0.00423802, total time[s] 0.105152 +Converged at iteration 23, L1 6.59986e-05, Linf 0.00242585, total time[s] 0.071386 +Converged at iteration 23, L1 7.10188e-05, Linf 0.00188397, total time[s] 0.062526 +Converged at iteration 27, L1 7.04376e-05, Linf 0.00406872, total time[s] 0.071401 +Converged at iteration 29, L1 7.40465e-05, Linf 0.0049951, total time[s] 0.079387 +Converged at iteration 28, L1 6.56792e-05, Linf 0.0050682, total time[s] 0.076916 +Converged at iteration 32, L1 8.70081e-05, Linf 0.006007, total time[s] 0.084646 +Converged at iteration 29, L1 6.00886e-05, Linf 0.00167775, total time[s] 0.115161 +Converged at iteration 31, L1 7.81641e-05, Linf 0.0105741, total time[s] 0.115939 +Converged at iteration 31, L1 6.62366e-05, Linf 0.0028285, total time[s] 0.11216 +Converged at iteration 33, L1 7.92318e-05, Linf 0.00426747, total time[s] 0.096853 +Converged at iteration 32, L1 6.88532e-05, Linf 0.0102448, total time[s] 0.091287 +Converged at iteration 34, L1 3.88071e-05, Linf 0.00855365, total time[s] 0.10031 +Converged at iteration 29, L1 7.48565e-05, Linf 0.0184546, total time[s] 0.092727 +Converged at iteration 25, L1 7.67138e-05, Linf 0.00333007, total time[s] 0.067226 +Converged at iteration 38, L1 4.87304e-05, Linf 0.0129659, total time[s] 0.107446 +Converged at iteration 36, L1 5.3174e-05, Linf 0.0118385, total time[s] 0.114891 +Converged at iteration 25, L1 6.70574e-05, Linf 0.00263886, total time[s] 0.074846 +Converged at iteration 26, L1 8.74092e-05, Linf 0.0071392, total time[s] 0.068759 +Converged at iteration 24, L1 9.75974e-05, Linf 0.0120983, total time[s] 0.06585 +Converged at iteration 27, L1 6.05816e-05, Linf 0.0166009, total time[s] 0.07871 +Converged at iteration 21, L1 6.89091e-05, Linf 0.00872871, total time[s] 0.063516 +Converged at iteration 20, L1 6.70172e-05, Linf 0.00315939, total time[s] 0.070391 +Converged at iteration 23, L1 6.72111e-05, Linf 0.00314341, total time[s] 0.068376 +Converged at iteration 25, L1 6.53305e-05, Linf 0.00232412, total time[s] 0.0843 +Converged at iteration 22, L1 5.02131e-05, Linf 0.00196699, total time[s] 0.069619 +Converged at iteration 21, L1 6.85974e-05, Linf 0.00353223, total time[s] 0.068898 +Converged at iteration 33, L1 3.82537e-05, Linf 0.0029861, total time[s] 0.093051 +Converged at iteration 23, L1 6.3081e-05, Linf 0.0042841, total time[s] 0.061853 +Converged at iteration 24, L1 7.76405e-05, Linf 0.00562601, total time[s] 0.064133 +Converged at iteration 26, L1 7.4203e-05, Linf 0.00418939, total time[s] 0.07035 +Converged at iteration 23, L1 6.62104e-05, Linf 0.00518944, total time[s] 0.074846 +Converged at iteration 23, L1 7.03858e-05, Linf 0.00192395, total time[s] 0.061576 +Converged at iteration 27, L1 7.07412e-05, Linf 0.00411275, total time[s] 0.072691 +Converged at iteration 29, L1 7.69831e-05, Linf 0.0051952, total time[s] 0.076607 +Converged at iteration 28, L1 6.64403e-05, Linf 0.0051126, total time[s] 0.074227 +Converged at iteration 32, L1 8.63854e-05, Linf 0.00600415, total time[s] 0.087077 +Converged at iteration 29, L1 6.10017e-05, Linf 0.00170862, total time[s] 0.076346 +Converged at iteration 31, L1 7.72458e-05, Linf 0.0106865, total time[s] 0.080202 +Converged at iteration 31, L1 6.47446e-05, Linf 0.0028477, total time[s] 0.08098 +Converged at iteration 33, L1 7.80632e-05, Linf 0.00429939, total time[s] 0.086158 +Converged at iteration 32, L1 7.12735e-05, Linf 0.0105433, total time[s] 0.097964 +Converged at iteration 34, L1 3.95311e-05, Linf 0.0089063, total time[s] 0.11687 +Converged at iteration 29, L1 7.34343e-05, Linf 0.0193711, total time[s] 0.08279 +Converged at iteration 25, L1 7.81724e-05, Linf 0.00502063, total time[s] 0.109912 +Converged at iteration 38, L1 4.91445e-05, Linf 0.0131236, total time[s] 0.122739 +Converged at iteration 36, L1 9.56183e-05, Linf 0.0120249, total time[s] 0.112856 +Converged at iteration 25, L1 6.71514e-05, Linf 0.0026304, total time[s] 0.070467 +Converged at iteration 26, L1 8.84434e-05, Linf 0.0072561, total time[s] 0.070974 +Converged at iteration 24, L1 9.54986e-05, Linf 0.0119777, total time[s] 0.070398 +Converged at iteration 27, L1 6.09098e-05, Linf 0.0170543, total time[s] 0.095507 +Converged at iteration 21, L1 6.96907e-05, Linf 0.00873615, total time[s] 0.064614 +Converged at iteration 20, L1 6.81786e-05, Linf 0.00321881, total time[s] 0.061921 +Converged at iteration 23, L1 6.67304e-05, Linf 0.00316872, total time[s] 0.074454 +Converged at iteration 25, L1 6.55375e-05, Linf 0.00235095, total time[s] 0.090349 +Converged at iteration 22, L1 4.97887e-05, Linf 0.00196556, total time[s] 0.086579 +Converged at iteration 21, L1 6.91825e-05, Linf 0.00357752, total time[s] 0.083711 +Converged at iteration 33, L1 3.90668e-05, Linf 0.00299968, total time[s] 0.128866 +Converged at iteration 23, L1 7.20597e-05, Linf 0.00432583, total time[s] 0.066723 +Converged at iteration 24, L1 7.84346e-05, Linf 0.00564975, total time[s] 0.075842 +Converged at iteration 26, L1 7.47425e-05, Linf 0.00419025, total time[s] 0.070312 +Converged at iteration 23, L1 6.57572e-05, Linf 0.00247523, total time[s] 0.062242 +Converged at iteration 23, L1 7.11285e-05, Linf 0.00193369, total time[s] 0.063409 +Converged at iteration 27, L1 7.01906e-05, Linf 0.00413531, total time[s] 0.085409 +Converged at iteration 29, L1 8.04856e-05, Linf 0.00531843, total time[s] 0.087382 +Converged at iteration 28, L1 6.65696e-05, Linf 0.00514633, total time[s] 0.087552 +Converged at iteration 32, L1 8.62704e-05, Linf 0.00601516, total time[s] 0.097078 +Converged at iteration 29, L1 6.17683e-05, Linf 0.00172817, total time[s] 0.083134 +Converged at iteration 31, L1 7.6272e-05, Linf 0.0105119, total time[s] 0.090762 +Converged at iteration 31, L1 6.42379e-05, Linf 0.00285537, total time[s] 0.085679 +Converged at iteration 33, L1 7.78732e-05, Linf 0.00430933, total time[s] 0.088349 +Converged at iteration 32, L1 7.40073e-05, Linf 0.0107387, total time[s] 0.0916 +Converged at iteration 34, L1 4.0166e-05, Linf 0.00915131, total time[s] 0.107791 +Converged at iteration 29, L1 7.19828e-05, Linf 0.0191493, total time[s] 0.091475 +Converged at iteration 25, L1 7.72888e-05, Linf 0.00330394, total time[s] 0.067734 +Converged at iteration 38, L1 4.98012e-05, Linf 0.0133366, total time[s] 0.103979 +Converged at iteration 36, L1 5.4495e-05, Linf 0.0123301, total time[s] 0.111321 +Converged at iteration 25, L1 6.57695e-05, Linf 0.00259355, total time[s] 0.067807 +Converged at iteration 26, L1 9.11988e-05, Linf 0.00747841, total time[s] 0.071303 +Converged at iteration 24, L1 9.36863e-05, Linf 0.0118137, total time[s] 0.064392 +Converged at iteration 27, L1 6.20114e-05, Linf 0.0177469, total time[s] 0.073024 +Converged at iteration 21, L1 7.08605e-05, Linf 0.00876254, total time[s] 0.062547 +Converged at iteration 20, L1 6.99488e-05, Linf 0.00324893, total time[s] 0.06067 +Converged at iteration 23, L1 6.63322e-05, Linf 0.0032401, total time[s] 0.075093 +Converged at iteration 25, L1 6.59121e-05, Linf 0.00236583, total time[s] 0.097356 +Converged at iteration 22, L1 4.94628e-05, Linf 0.00196315, total time[s] 0.065516 +Converged at iteration 21, L1 7.00526e-05, Linf 0.00365499, total time[s] 0.066844 +Converged at iteration 33, L1 3.99989e-05, Linf 0.00294682, total time[s] 0.096541 +Converged at iteration 23, L1 6.96757e-05, Linf 0.00439762, total time[s] 0.062884 +Converged at iteration 24, L1 8.20593e-05, Linf 0.00569044, total time[s] 0.06888 +Converged at iteration 26, L1 7.45296e-05, Linf 0.00413155, total time[s] 0.07111 +Converged at iteration 23, L1 6.47806e-05, Linf 0.00251467, total time[s] 0.065479 +Converged at iteration 23, L1 7.07533e-05, Linf 0.00196928, total time[s] 0.065896 +Converged at iteration 27, L1 6.9313e-05, Linf 0.00417558, total time[s] 0.073733 +Converged at iteration 29, L1 8.17763e-05, Linf 0.00549165, total time[s] 0.080097 +Converged at iteration 28, L1 6.74495e-05, Linf 0.0052001, total time[s] 0.074812 +Converged at iteration 32, L1 8.53684e-05, Linf 0.00600546, total time[s] 0.085357 +Converged at iteration 29, L1 6.34102e-05, Linf 0.00176097, total time[s] 0.079158 +Converged at iteration 31, L1 7.52998e-05, Linf 0.0103167, total time[s] 0.082831 +Converged at iteration 31, L1 6.45182e-05, Linf 0.00288195, total time[s] 0.089791 +Converged at iteration 33, L1 7.8775e-05, Linf 0.00434717, total time[s] 0.137098 +Converged at iteration 32, L1 7.65205e-05, Linf 0.0110662, total time[s] 0.087558 +Converged at iteration 34, L1 4.09477e-05, Linf 0.00955564, total time[s] 0.088318 +Converged at iteration 29, L1 7.03036e-05, Linf 0.0188759, total time[s] 0.076138 +Converged at iteration 25, L1 7.95306e-05, Linf 0.00329617, total time[s] 0.067189 +Converged at iteration 38, L1 5.01315e-05, Linf 0.0134384, total time[s] 0.100356 +Converged at iteration 36, L1 5.4842e-05, Linf 0.0125075, total time[s] 0.094053 +Converged at iteration 25, L1 6.47888e-05, Linf 0.00258214, total time[s] 0.100855 +Converged at iteration 26, L1 9.3238e-05, Linf 0.00758067, total time[s] 0.137559 +Converged at iteration 24, L1 9.34672e-05, Linf 0.01171, total time[s] 0.093514 +Converged at iteration 27, L1 6.47016e-05, Linf 0.0180418, total time[s] 0.133968 +Converged at iteration 21, L1 7.06496e-05, Linf 0.00877287, total time[s] 0.111045 +Converged at iteration 20, L1 7.13973e-05, Linf 0.00331553, total time[s] 0.124724 +Converged at iteration 23, L1 6.66133e-05, Linf 0.00326974, total time[s] 0.195948 +Converged at iteration 25, L1 6.65639e-05, Linf 0.00238333, total time[s] 0.160127 +Converged at iteration 22, L1 4.91679e-05, Linf 0.00191834, total time[s] 0.145966 +Converged at iteration 21, L1 7.19488e-05, Linf 0.00369885, total time[s] 0.084383 +Converged at iteration 33, L1 4.05563e-05, Linf 0.00302911, total time[s] 0.165633 +Converged at iteration 23, L1 7.20484e-05, Linf 0.00443913, total time[s] 0.107924 +Converged at iteration 24, L1 8.55663e-05, Linf 0.00858515, total time[s] 0.106633 +Converged at iteration 26, L1 7.51983e-05, Linf 0.00412976, total time[s] 0.097043 +Converged at iteration 23, L1 6.39969e-05, Linf 0.00253399, total time[s] 0.071752 +Converged at iteration 23, L1 7.0381e-05, Linf 0.0019809, total time[s] 0.072123 +Converged at iteration 27, L1 6.86947e-05, Linf 0.00419425, total time[s] 0.086165 +Converged at iteration 29, L1 8.50457e-05, Linf 0.00560636, total time[s] 0.079062 +Converged at iteration 28, L1 6.87296e-05, Linf 0.00522986, total time[s] 0.074765 +Converged at iteration 32, L1 8.46917e-05, Linf 0.00601516, total time[s] 0.08434 +Converged at iteration 29, L1 6.47775e-05, Linf 0.00177625, total time[s] 0.081255 +Converged at iteration 31, L1 7.41923e-05, Linf 0.0102625, total time[s] 0.084833 +Converged at iteration 31, L1 6.47529e-05, Linf 0.00288763, total time[s] 0.088538 +Converged at iteration 33, L1 7.76533e-05, Linf 0.00435891, total time[s] 0.087792 +Converged at iteration 32, L1 7.82643e-05, Linf 0.011251, total time[s] 0.086032 +Converged at iteration 34, L1 4.14429e-05, Linf 0.0098235, total time[s] 0.087841 +Converged at iteration 29, L1 6.95684e-05, Linf 0.0186614, total time[s] 0.075763 +Converged at iteration 25, L1 7.6975e-05, Linf 0.00329845, total time[s] 0.067743 +Converged at iteration 38, L1 5.07759e-05, Linf 0.0136153, total time[s] 0.101299 +Converged at iteration 36, L1 5.55861e-05, Linf 0.012725, total time[s] 0.100782 +Converged at iteration 25, L1 6.28081e-05, Linf 0.00253944, total time[s] 0.077309 +Converged at iteration 26, L1 9.75848e-05, Linf 0.00793882, total time[s] 0.07643 +Converged at iteration 24, L1 8.997e-05, Linf 0.0114566, total time[s] 0.066496 +Converged at iteration 27, L1 6.52852e-05, Linf 0.0191368, total time[s] 0.080085 +Converged at iteration 21, L1 7.16156e-05, Linf 0.00881497, total time[s] 0.066724 +Converged at iteration 20, L1 7.35429e-05, Linf 0.00339104, total time[s] 0.066758 +Converged at iteration 23, L1 6.5157e-05, Linf 0.00338433, total time[s] 0.064632 +Converged at iteration 25, L1 6.63277e-05, Linf 0.00240322, total time[s] 0.067338 +Converged at iteration 22, L1 4.78661e-05, Linf 0.00178767, total time[s] 0.060967 +Converged at iteration 21, L1 7.20624e-05, Linf 0.00379446, total time[s] 0.058026 +Converged at iteration 33, L1 4.2359e-05, Linf 0.00304965, total time[s] 0.094965 +Converged at iteration 23, L1 6.62028e-05, Linf 0.00452101, total time[s] 0.060284 +Converged at iteration 24, L1 8.21102e-05, Linf 0.00577249, total time[s] 0.074389 +Converged at iteration 26, L1 7.52014e-05, Linf 0.00404356, total time[s] 0.068507 +Converged at iteration 23, L1 6.23949e-05, Linf 0.00260361, total time[s] 0.062245 +Converged at iteration 23, L1 7.09356e-05, Linf 0.00204588, total time[s] 0.060359 +Converged at iteration 27, L1 6.7934e-05, Linf 0.00423004, total time[s] 0.091801 +Converged at iteration 29, L1 9.34948e-05, Linf 0.00586618, total time[s] 0.093948 +Converged at iteration 28, L1 6.93025e-05, Linf 0.00530531, total time[s] 0.088654 +Converged at iteration 32, L1 8.3548e-05, Linf 0.00600029, total time[s] 0.098977 +Converged at iteration 29, L1 6.76865e-05, Linf 0.00182097, total time[s] 0.107077 +Converged at iteration 31, L1 7.26005e-05, Linf 0.0107012, total time[s] 0.106422 +Converged at iteration 31, L1 6.39963e-05, Linf 0.00293022, total time[s] 0.087051 +Converged at iteration 33, L1 7.72468e-05, Linf 0.00439914, total time[s] 0.086542 +Converged at iteration 32, L1 8.26195e-05, Linf 0.0116911, total time[s] 0.083102 +Converged at iteration 34, L1 4.27984e-05, Linf 0.0103886, total time[s] 0.088329 +Converged at iteration 29, L1 7.00601e-05, Linf 0.0182442, total time[s] 0.077522 +Converged at iteration 25, L1 7.71392e-05, Linf 0.00330654, total time[s] 0.068079 +Converged at iteration 38, L1 5.10528e-05, Linf 0.0136799, total time[s] 0.106486 +Converged at iteration 36, L1 5.59952e-05, Linf 0.0130853, total time[s] 0.103973 +Converged at iteration 25, L1 6.22159e-05, Linf 0.0025258, total time[s] 0.112871 +Converged at iteration 26, L1 9.95484e-05, Linf 0.00806989, total time[s] 0.078993 +Converged at iteration 24, L1 9.12591e-05, Linf 0.0113573, total time[s] 0.073633 +Converged at iteration 27, L1 6.77767e-05, Linf 0.0197043, total time[s] 0.079434 +Converged at iteration 21, L1 7.33697e-05, Linf 0.00883821, total time[s] 0.061509 +Converged at iteration 20, L1 7.42218e-05, Linf 0.00342678, total time[s] 0.057039 +Converged at iteration 23, L1 6.49713e-05, Linf 0.00340919, total time[s] 0.069346 +Converged at iteration 25, L1 6.66645e-05, Linf 0.00240825, total time[s] 0.067165 +Converged at iteration 22, L1 4.78621e-05, Linf 0.00178593, total time[s] 0.060837 +Converged at iteration 21, L1 7.31626e-05, Linf 0.00383069, total time[s] 0.05848 +Converged at iteration 33, L1 4.333e-05, Linf 0.00307071, total time[s] 0.088086 +Converged at iteration 23, L1 7.81285e-05, Linf 0.013134, total time[s] 0.062174 +Converged at iteration 24, L1 8.62478e-05, Linf 0.00579664, total time[s] 0.065777 +Converged at iteration 26, L1 7.56587e-05, Linf 0.00402425, total time[s] 0.078245 +Converged at iteration 23, L1 6.22286e-05, Linf 0.00261291, total time[s] 0.060621 +Converged at iteration 23, L1 7.16758e-05, Linf 0.00205982, total time[s] 0.069172 +Converged at iteration 27, L1 6.90198e-05, Linf 0.00423918, total time[s] 0.080053 +Converged at iteration 29, L1 9.61238e-05, Linf 0.0059451, total time[s] 0.081506 +Converged at iteration 28, L1 7.15472e-05, Linf 0.00533486, total time[s] 0.078465 +Converged at iteration 32, L1 8.33125e-05, Linf 0.00600179, total time[s] 0.084152 +Converged at iteration 29, L1 6.77591e-05, Linf 0.00183726, total time[s] 0.076829 +Converged at iteration 31, L1 7.43672e-05, Linf 0.0104675, total time[s] 0.083439 +Converged at iteration 31, L1 6.88648e-05, Linf 0.00522584, total time[s] 0.0811 +Converged at iteration 33, L1 7.75279e-05, Linf 0.00441519, total time[s] 0.085817 +Converged at iteration 32, L1 8.4788e-05, Linf 0.0118718, total time[s] 0.083676 +Converged at iteration 34, L1 4.35819e-05, Linf 0.0106585, total time[s] 0.087662 +Converged at iteration 29, L1 6.85619e-05, Linf 0.0180458, total time[s] 0.076239 +Converged at iteration 25, L1 7.8443e-05, Linf 0.00331292, total time[s] 0.066743 +Converged at iteration 38, L1 5.17176e-05, Linf 0.0137631, total time[s] 0.099056 +Converged at iteration 36, L1 5.6901e-05, Linf 0.0134308, total time[s] 0.103677 +Converged at iteration 25, L1 6.11226e-05, Linf 0.00251048, total time[s] 0.068904 +Converged at iteration 27, L1 4.16721e-05, Linf 0.00418333, total time[s] 0.071826 +Converged at iteration 24, L1 8.68294e-05, Linf 0.0111507, total time[s] 0.064876 +Converged at iteration 27, L1 6.90162e-05, Linf 0.0203835, total time[s] 0.075549 +Converged at iteration 21, L1 7.44023e-05, Linf 0.00887136, total time[s] 0.06895 +Converged at iteration 20, L1 7.37255e-05, Linf 0.0034801, total time[s] 0.075031 +Converged at iteration 23, L1 6.46621e-05, Linf 0.00351281, total time[s] 0.064298 +Converged at iteration 25, L1 6.66803e-05, Linf 0.00243087, total time[s] 0.076941 +Converged at iteration 22, L1 4.77098e-05, Linf 0.00175303, total time[s] 0.07216 +Converged at iteration 21, L1 7.61881e-05, Linf 0.0103784, total time[s] 0.099418 +Converged at iteration 33, L1 4.46383e-05, Linf 0.00297469, total time[s] 0.103565 +Converged at iteration 23, L1 7.8138e-05, Linf 0.0046326, total time[s] 0.073685 +Converged at iteration 24, L1 8.67131e-05, Linf 0.00585541, total time[s] 0.074846 +Converged at iteration 26, L1 7.50747e-05, Linf 0.00395312, total time[s] 0.086399 +Converged at iteration 23, L1 6.11441e-05, Linf 0.00266333, total time[s] 0.099439 +Converged at iteration 23, L1 7.25191e-05, Linf 0.00210733, total time[s] 0.082183 +Converged at iteration 27, L1 6.76015e-05, Linf 0.00422262, total time[s] 0.0872 +Converged at iteration 30, L1 5.75888e-05, Linf 0.00306363, total time[s] 0.081671 +Converged at iteration 28, L1 7.24784e-05, Linf 0.00540118, total time[s] 0.07783 +Converged at iteration 32, L1 8.20155e-05, Linf 0.00598596, total time[s] 0.088992 +Converged at iteration 29, L1 6.97124e-05, Linf 0.00186787, total time[s] 0.080528 +Converged at iteration 31, L1 7.64391e-05, Linf 0.0104488, total time[s] 0.091762 +Converged at iteration 31, L1 7.08123e-05, Linf 0.00299334, total time[s] 0.097057 +Converged at iteration 33, L1 7.72706e-05, Linf 0.00443021, total time[s] 0.086769 +Converged at iteration 32, L1 8.81685e-05, Linf 0.0122105, total time[s] 0.08328 +Converged at iteration 34, L1 4.45413e-05, Linf 0.0111384, total time[s] 0.089569 +Converged at iteration 29, L1 6.30447e-05, Linf 0.0176942, total time[s] 0.082563 +Converged at iteration 25, L1 7.70579e-05, Linf 0.00333842, total time[s] 0.067055 +Converged at iteration 38, L1 5.14754e-05, Linf 0.013789, total time[s] 0.10171 +Converged at iteration 36, L1 5.69153e-05, Linf 0.0135837, total time[s] 0.100664 +Converged at iteration 25, L1 6.11516e-05, Linf 0.00249169, total time[s] 0.068371 +Converged at iteration 27, L1 4.23255e-05, Linf 0.00425059, total time[s] 0.074564 +Converged at iteration 24, L1 8.56718e-05, Linf 0.0110355, total time[s] 0.067382 +Converged at iteration 27, L1 6.92683e-05, Linf 0.0207672, total time[s] 0.073832 +Converged at iteration 21, L1 7.46539e-05, Linf 0.00890122, total time[s] 0.058799 +Converged at iteration 20, L1 7.41242e-05, Linf 0.00353641, total time[s] 0.057065 +Converged at iteration 23, L1 6.44265e-05, Linf 0.00352766, total time[s] 0.066008 +Converged at iteration 25, L1 6.69344e-05, Linf 0.002446, total time[s] 0.072648 +Converged at iteration 21, L1 9.98308e-05, Linf 0.00380076, total time[s] 0.05989 +Converged at iteration 21, L1 7.46853e-05, Linf 0.00393062, total time[s] 0.059442 +Converged at iteration 33, L1 4.47544e-05, Linf 0.00308456, total time[s] 0.087113 +Converged at iteration 23, L1 6.89267e-05, Linf 0.00465803, total time[s] 0.063768 +Converged at iteration 24, L1 8.43243e-05, Linf 0.0058711, total time[s] 0.070456 +Converged at iteration 26, L1 7.56153e-05, Linf 0.00394461, total time[s] 0.077556 +Converged at iteration 23, L1 6.08766e-05, Linf 0.00268656, total time[s] 0.064167 +Converged at iteration 23, L1 7.3133e-05, Linf 0.00212605, total time[s] 0.069365 +Converged at iteration 27, L1 6.66142e-05, Linf 0.00418547, total time[s] 0.079539 +Converged at iteration 30, L1 6.21449e-05, Linf 0.00311773, total time[s] 0.088707 +Converged at iteration 28, L1 7.15319e-05, Linf 0.005433, total time[s] 0.071718 +Converged at iteration 32, L1 8.14542e-05, Linf 0.00598622, total time[s] 0.082476 +Converged at iteration 29, L1 7.62792e-05, Linf 0.00188396, total time[s] 0.076406 +Converged at iteration 31, L1 7.38248e-05, Linf 0.0102946, total time[s] 0.079941 +Converged at iteration 31, L1 6.81983e-05, Linf 0.00298748, total time[s] 0.07946 +Converged at iteration 33, L1 7.88139e-05, Linf 0.00443828, total time[s] 0.086899 +Converged at iteration 32, L1 9.07147e-05, Linf 0.0123948, total time[s] 0.086374 +Converged at iteration 34, L1 4.50823e-05, Linf 0.0114421, total time[s] 0.089041 +Converged at iteration 29, L1 7.01235e-05, Linf 0.0174834, total time[s] 0.07578 +Converged at iteration 25, L1 7.76072e-05, Linf 0.00336039, total time[s] 0.066815 +Converged at iteration 38, L1 5.17429e-05, Linf 0.013802, total time[s] 0.09737 +Converged at iteration 37, L1 7.01685e-05, Linf 0.00512899, total time[s] 0.099966 +Converged at iteration 25, L1 6.19134e-05, Linf 0.00257922, total time[s] 0.069763 +Converged at iteration 27, L1 4.38308e-05, Linf 0.00438784, total time[s] 0.073753 +Converged at iteration 24, L1 8.36765e-05, Linf 0.0108551, total time[s] 0.066182 +Converged at iteration 27, L1 7.1906e-05, Linf 0.021565, total time[s] 0.076592 +Converged at iteration 21, L1 7.65316e-05, Linf 0.00880483, total time[s] 0.060396 +Converged at iteration 20, L1 7.48301e-05, Linf 0.00356657, total time[s] 0.057316 +Converged at iteration 23, L1 6.45196e-05, Linf 0.00361754, total time[s] 0.072484 +Converged at iteration 25, L1 6.73143e-05, Linf 0.00245335, total time[s] 0.067672 +Converged at iteration 21, L1 9.91917e-05, Linf 0.00378822, total time[s] 0.061684 +Converged at iteration 21, L1 7.6567e-05, Linf 0.00398733, total time[s] 0.056282 +Converged at iteration 33, L1 4.61836e-05, Linf 0.00300188, total time[s] 0.089137 +Converged at iteration 23, L1 7.77733e-05, Linf 0.00659643, total time[s] 0.079771 +Converged at iteration 24, L1 9.07536e-05, Linf 0.00593069, total time[s] 0.083136 +Converged at iteration 26, L1 7.61887e-05, Linf 0.00388942, total time[s] 0.080415 +Converged at iteration 23, L1 6.04512e-05, Linf 0.00273771, total time[s] 0.064898 +Converged at iteration 23, L1 7.51633e-05, Linf 0.00214094, total time[s] 0.061871 +Converged at iteration 27, L1 6.81865e-05, Linf 0.00779564, total time[s] 0.072535 +Converged at iteration 30, L1 6.38358e-05, Linf 0.00324618, total time[s] 0.09211 +Converged at iteration 28, L1 7.30412e-05, Linf 0.00549435, total time[s] 0.079443 +Converged at iteration 32, L1 8.01815e-05, Linf 0.00597109, total time[s] 0.090312 +Converged at iteration 29, L1 7.18853e-05, Linf 0.0019138, total time[s] 0.096606 +Converged at iteration 31, L1 6.92304e-05, Linf 0.0102763, total time[s] 0.105012 +Converged at iteration 31, L1 6.66862e-05, Linf 0.00302091, total time[s] 0.097619 +Converged at iteration 33, L1 7.88695e-05, Linf 0.0065365, total time[s] 0.116745 +Converged at iteration 32, L1 9.35357e-05, Linf 0.0126894, total time[s] 0.107275 +Converged at iteration 34, L1 4.59794e-05, Linf 0.0119031, total time[s] 0.11543 +Converged at iteration 29, L1 6.0294e-05, Linf 0.0171773, total time[s] 0.079339 +Converged at iteration 25, L1 7.80134e-05, Linf 0.0033976, total time[s] 0.068671 +Converged at iteration 38, L1 5.18857e-05, Linf 0.0140211, total time[s] 0.207163 +Converged at iteration 36, L1 5.77628e-05, Linf 0.0140324, total time[s] 0.115228 +Converged at iteration 25, L1 6.10099e-05, Linf 0.00247198, total time[s] 0.066185 +Converged at iteration 27, L1 4.38337e-05, Linf 0.00446426, total time[s] 0.071367 +Converged at iteration 24, L1 8.2323e-05, Linf 0.0107355, total time[s] 0.064579 +Converged at iteration 27, L1 7.21773e-05, Linf 0.0219817, total time[s] 0.076332 +Converged at iteration 21, L1 7.64069e-05, Linf 0.00896652, total time[s] 0.064425 +Converged at iteration 20, L1 7.59999e-05, Linf 0.00362012, total time[s] 0.075875 +Converged at iteration 23, L1 6.3881e-05, Linf 0.00364959, total time[s] 0.091026 +Converged at iteration 25, L1 6.78061e-05, Linf 0.00247253, total time[s] 0.084855 +Converged at iteration 21, L1 9.91302e-05, Linf 0.00378682, total time[s] 0.067512 +Converged at iteration 21, L1 7.59037e-05, Linf 0.00402164, total time[s] 0.067723 +Converged at iteration 33, L1 4.66507e-05, Linf 0.00301248, total time[s] 0.10098 +Converged at iteration 23, L1 6.98377e-05, Linf 0.00475268, total time[s] 0.06782 +Converged at iteration 24, L1 8.68451e-05, Linf 0.00596401, total time[s] 0.07558 +Converged at iteration 26, L1 7.65621e-05, Linf 0.0038873, total time[s] 0.081766 +Converged at iteration 23, L1 6.01104e-05, Linf 0.00274992, total time[s] 0.073957 +Converged at iteration 23, L1 7.54937e-05, Linf 0.00217537, total time[s] 0.065613 +Converged at iteration 27, L1 6.4954e-05, Linf 0.00414291, total time[s] 0.072125 +Converged at iteration 30, L1 6.49543e-05, Linf 0.00331951, total time[s] 0.082128 +Converged at iteration 28, L1 7.25177e-05, Linf 0.00551645, total time[s] 0.078805 +Converged at iteration 32, L1 8.00153e-05, Linf 0.00597401, total time[s] 0.100339 +Converged at iteration 29, L1 7.21408e-05, Linf 0.00192941, total time[s] 0.10751 +Converged at iteration 31, L1 6.86278e-05, Linf 0.0102361, total time[s] 0.115579 +Converged at iteration 31, L1 6.81967e-05, Linf 0.00302548, total time[s] 0.099535 +Converged at iteration 33, L1 7.64182e-05, Linf 0.00444847, total time[s] 0.108541 +Converged at iteration 32, L1 9.60323e-05, Linf 0.0128728, total time[s] 0.090104 +Converged at iteration 34, L1 4.70912e-05, Linf 0.0121388, total time[s] 0.094162 +Converged at iteration 29, L1 5.91269e-05, Linf 0.0169604, total time[s] 0.076884 +Converged at iteration 25, L1 8.203e-05, Linf 0.00341513, total time[s] 0.06651 +Converged at iteration 38, L1 5.26565e-05, Linf 0.0140016, total time[s] 0.098185 +Converged at iteration 36, L1 5.84996e-05, Linf 0.0143113, total time[s] 0.109151 +Converged at iteration 25, L1 6.12943e-05, Linf 0.00244339, total time[s] 0.080431 +Converged at iteration 27, L1 4.7968e-05, Linf 0.0127193, total time[s] 0.082755 +Converged at iteration 24, L1 8.07287e-05, Linf 0.0105207, total time[s] 0.069917 +Converged at iteration 27, L1 7.57317e-05, Linf 0.0228708, total time[s] 0.076785 +Converged at iteration 21, L1 7.83359e-05, Linf 0.00900313, total time[s] 0.064419 +Converged at iteration 20, L1 7.65433e-05, Linf 0.00366671, total time[s] 0.071106 +Converged at iteration 23, L1 6.3505e-05, Linf 0.00373587, total time[s] 0.067579 +Converged at iteration 25, L1 6.79959e-05, Linf 0.0024915, total time[s] 0.066088 +Converged at iteration 21, L1 9.8919e-05, Linf 0.00377451, total time[s] 0.057392 +Converged at iteration 21, L1 7.7628e-05, Linf 0.0040869, total time[s] 0.056908 +Converged at iteration 33, L1 4.85622e-05, Linf 0.00302472, total time[s] 0.08581 +Converged at iteration 23, L1 7.66814e-05, Linf 0.0048241, total time[s] 0.062346 +Converged at iteration 24, L1 9.06614e-05, Linf 0.0120518, total time[s] 0.064644 +Converged at iteration 26, L1 7.65517e-05, Linf 0.0038118, total time[s] 0.069263 +Converged at iteration 23, L1 6.00531e-05, Linf 0.00280024, total time[s] 0.060848 +Converged at iteration 23, L1 7.73182e-05, Linf 0.00220806, total time[s] 0.062114 +Converged at iteration 27, L1 6.32682e-05, Linf 0.00418046, total time[s] 0.072821 +Converged at iteration 30, L1 6.59074e-05, Linf 0.00344747, total time[s] 0.078478 +Converged at iteration 28, L1 7.44473e-05, Linf 0.00559966, total time[s] 0.074577 +Converged at iteration 32, L1 7.85614e-05, Linf 0.00595503, total time[s] 0.084761 +Converged at iteration 29, L1 7.46314e-05, Linf 0.00196237, total time[s] 0.076137 +Converged at iteration 31, L1 7.16624e-05, Linf 0.0103501, total time[s] 0.080866 +Converged at iteration 31, L1 6.79849e-05, Linf 0.00304376, total time[s] 0.081469 +Converged at iteration 33, L1 7.61159e-05, Linf 0.00445629, total time[s] 0.084986 +Converged at iteration 32, L1 9.91409e-05, Linf 0.0131845, total time[s] 0.082113 +Converged at iteration 34, L1 4.83093e-05, Linf 0.0126972, total time[s] 0.086877 +Converged at iteration 29, L1 6.98213e-05, Linf 0.016625, total time[s] 0.075745 +Converged at iteration 25, L1 8.11892e-05, Linf 0.00461772, total time[s] 0.066423 +Converged at iteration 40, L1 6.71404e-05, Linf 0.0036746, total time[s] 0.107209 +Converged at iteration 35, L1 7.62129e-05, Linf 0.00343211, total time[s] 0.094464 +Converged at iteration 30, L1 9.62475e-05, Linf 0.00432624, total time[s] 0.079703 +Converged at iteration 31, L1 6.19659e-05, Linf 0.00502563, total time[s] 0.078399 +Converged at iteration 27, L1 6.25942e-05, Linf 0.00499554, total time[s] 0.069447 +Converged at iteration 22, L1 8.58686e-05, Linf 0.00448845, total time[s] 0.057726 +Converged at iteration 20, L1 9.60265e-05, Linf 0.00397842, total time[s] 0.072068 +Converged at iteration 24, L1 8.8477e-05, Linf 0.00473009, total time[s] 0.073277 +Converged at iteration 28, L1 7.42478e-05, Linf 0.00445904, total time[s] 0.094988 +Converged at iteration 26, L1 8.15006e-05, Linf 0.0054679, total time[s] 0.083001 +Converged at iteration 22, L1 7.40807e-05, Linf 0.00508717, total time[s] 0.068593 +Converged at iteration 19, L1 6.6328e-05, Linf 0.00393142, total time[s] 0.069232 +Converged at iteration 30, L1 7.98721e-05, Linf 0.00329632, total time[s] 0.094582 +Converged at iteration 20, L1 8.44264e-05, Linf 0.00455015, total time[s] 0.056618 +Converged at iteration 24, L1 7.11479e-05, Linf 0.00463719, total time[s] 0.064247 +Converged at iteration 31, L1 8.93437e-05, Linf 0.00570131, total time[s] 0.088304 +Converged at iteration 27, L1 9.91905e-05, Linf 0.00569837, total time[s] 0.072087 +Converged at iteration 24, L1 8.78966e-05, Linf 0.00465013, total time[s] 0.071137 +Converged at iteration 23, L1 9.21791e-05, Linf 0.0041019, total time[s] 0.064193 +Converged at iteration 26, L1 7.22009e-05, Linf 0.00446075, total time[s] 0.069545 +Converged at iteration 29, L1 7.81609e-05, Linf 0.00479609, total time[s] 0.077106 +Converged at iteration 34, L1 7.09001e-05, Linf 0.00422701, total time[s] 0.088561 +Converged at iteration 30, L1 9.39462e-05, Linf 0.00442601, total time[s] 0.078852 +Converged at iteration 28, L1 9.49935e-05, Linf 0.00310976, total time[s] 0.075414 +Converged at iteration 32, L1 9.4365e-05, Linf 0.00374023, total time[s] 0.086423 +Converged at iteration 37, L1 7.34715e-05, Linf 0.00334282, total time[s] 0.098477 +Converged at iteration 33, L1 8.44828e-05, Linf 0.00469111, total time[s] 0.091174 +Converged at iteration 28, L1 9.67085e-05, Linf 0.00426361, total time[s] 0.081739 +Converged at iteration 24, L1 8.8298e-05, Linf 0.00325321, total time[s] 0.069777 +Converged at iteration 26, L1 9.00223e-05, Linf 0.00382058, total time[s] 0.068671 +Converged at iteration 40, L1 6.63932e-05, Linf 0.00389533, total time[s] 0.107385 +Converged at iteration 35, L1 8.6912e-05, Linf 0.00360883, total time[s] 0.097745 +Converged at iteration 30, L1 9.23099e-05, Linf 0.00416155, total time[s] 0.086856 +Converged at iteration 31, L1 6.17517e-05, Linf 0.00504684, total time[s] 0.0794 +Converged at iteration 26, L1 9.84017e-05, Linf 0.00577611, total time[s] 0.069073 +Converged at iteration 22, L1 7.164e-05, Linf 0.00418204, total time[s] 0.061424 +Converged at iteration 21, L1 6.41693e-05, Linf 0.00346832, total time[s] 0.069405 +Converged at iteration 24, L1 8.94112e-05, Linf 0.00495039, total time[s] 0.073521 +Converged at iteration 28, L1 7.32133e-05, Linf 0.00443933, total time[s] 0.083861 +Converged at iteration 26, L1 8.01775e-05, Linf 0.00536403, total time[s] 0.080418 +Converged at iteration 22, L1 7.01734e-05, Linf 0.00441496, total time[s] 0.069894 +Converged at iteration 19, L1 5.49463e-05, Linf 0.00332634, total time[s] 0.068124 +Converged at iteration 30, L1 9.5252e-05, Linf 0.00330734, total time[s] 0.097686 +Converged at iteration 20, L1 8.42594e-05, Linf 0.00472687, total time[s] 0.054944 +Converged at iteration 24, L1 7.14151e-05, Linf 0.00475228, total time[s] 0.063719 +Converged at iteration 31, L1 9.41983e-05, Linf 0.00482002, total time[s] 0.080422 +Converged at iteration 27, L1 9.412e-05, Linf 0.00468425, total time[s] 0.070733 +Converged at iteration 24, L1 8.51901e-05, Linf 0.00428119, total time[s] 0.064787 +Converged at iteration 23, L1 9.23985e-05, Linf 0.00432074, total time[s] 0.061801 +Converged at iteration 26, L1 7.12978e-05, Linf 0.00465377, total time[s] 0.070339 +Converged at iteration 29, L1 7.5336e-05, Linf 0.00488639, total time[s] 0.125278 +Converged at iteration 34, L1 8.13386e-05, Linf 0.00406125, total time[s] 0.110662 +Converged at iteration 31, L1 7.17555e-05, Linf 0.00355191, total time[s] 0.081666 +Converged at iteration 29, L1 7.0312e-05, Linf 0.002724, total time[s] 0.080407 +Converged at iteration 32, L1 8.22014e-05, Linf 0.00354588, total time[s] 0.083565 +Converged at iteration 36, L1 8.75643e-05, Linf 0.00357845, total time[s] 0.103371 +Converged at iteration 33, L1 8.33347e-05, Linf 0.00484763, total time[s] 0.089792 +Converged at iteration 28, L1 9.13741e-05, Linf 0.00413151, total time[s] 0.080219 +Converged at iteration 24, L1 8.03499e-05, Linf 0.00290884, total time[s] 0.065644 +Converged at iteration 26, L1 8.42008e-05, Linf 0.00392619, total time[s] 0.076764 +Converged at iteration 40, L1 6.81624e-05, Linf 0.00368565, total time[s] 0.126132 +Converged at iteration 35, L1 7.70833e-05, Linf 0.00343134, total time[s] 0.172302 +Converged at iteration 30, L1 9.68013e-05, Linf 0.00432339, total time[s] 0.106933 +Converged at iteration 31, L1 6.23399e-05, Linf 0.00500241, total time[s] 0.09448 +Converged at iteration 27, L1 6.37054e-05, Linf 0.00500689, total time[s] 0.109161 +Converged at iteration 22, L1 8.62852e-05, Linf 0.00444485, total time[s] 0.124434 +Converged at iteration 20, L1 9.60286e-05, Linf 0.00397838, total time[s] 0.078094 +Converged at iteration 24, L1 8.84558e-05, Linf 0.00482814, total time[s] 0.079487 +Converged at iteration 28, L1 7.41618e-05, Linf 0.00445905, total time[s] 0.078268 +Converged at iteration 26, L1 8.3735e-05, Linf 0.0100966, total time[s] 0.077608 +Converged at iteration 22, L1 7.49002e-05, Linf 0.00509521, total time[s] 0.064713 +Converged at iteration 19, L1 6.64916e-05, Linf 0.0039212, total time[s] 0.049744 +Converged at iteration 30, L1 8.02929e-05, Linf 0.0033021, total time[s] 0.077161 +Converged at iteration 20, L1 8.44972e-05, Linf 0.0045501, total time[s] 0.053156 +Converged at iteration 24, L1 7.09535e-05, Linf 0.00463156, total time[s] 0.064014 +Converged at iteration 31, L1 8.98111e-05, Linf 0.00569205, total time[s] 0.081045 +Converged at iteration 27, L1 9.9179e-05, Linf 0.00569807, total time[s] 0.069793 +Converged at iteration 24, L1 8.83795e-05, Linf 0.00465023, total time[s] 0.063483 +Converged at iteration 23, L1 9.22538e-05, Linf 0.00410197, total time[s] 0.062282 +Converged at iteration 26, L1 7.22414e-05, Linf 0.00446122, total time[s] 0.069636 +Converged at iteration 29, L1 7.81278e-05, Linf 0.00479193, total time[s] 0.073409 +Converged at iteration 34, L1 7.09426e-05, Linf 0.00431194, total time[s] 0.085134 +Converged at iteration 30, L1 9.39677e-05, Linf 0.00449729, total time[s] 0.12423 +Converged at iteration 28, L1 9.50512e-05, Linf 0.00310978, total time[s] 0.119285 +Converged at iteration 32, L1 9.4325e-05, Linf 0.00372059, total time[s] 0.089465 +Converged at iteration 37, L1 7.34203e-05, Linf 0.00327793, total time[s] 0.098558 +Converged at iteration 33, L1 8.45901e-05, Linf 0.0046457, total time[s] 0.091646 +Converged at iteration 28, L1 9.65525e-05, Linf 0.00430177, total time[s] 0.074574 +Converged at iteration 24, L1 8.83004e-05, Linf 0.0032507, total time[s] 0.063559 +Converged at iteration 26, L1 9.00452e-05, Linf 0.0038395, total time[s] 0.178994 +Converged at iteration 40, L1 6.64042e-05, Linf 0.00393404, total time[s] 0.13333 +Converged at iteration 35, L1 8.74344e-05, Linf 0.00361081, total time[s] 0.088092 +Converged at iteration 30, L1 9.18576e-05, Linf 0.00418105, total time[s] 0.083101 +Converged at iteration 31, L1 6.18452e-05, Linf 0.00505109, total time[s] 0.084674 +Converged at iteration 26, L1 9.85574e-05, Linf 0.0057813, total time[s] 0.072736 +Converged at iteration 22, L1 7.19391e-05, Linf 0.00418869, total time[s] 0.058567 +Converged at iteration 21, L1 6.41059e-05, Linf 0.00348498, total time[s] 0.063 +Converged at iteration 24, L1 8.97701e-05, Linf 0.00494958, total time[s] 0.063383 +Converged at iteration 28, L1 7.37483e-05, Linf 0.00443346, total time[s] 0.07312 +Converged at iteration 26, L1 8.08334e-05, Linf 0.00534707, total time[s] 0.06833 +Converged at iteration 22, L1 7.02762e-05, Linf 0.00441459, total time[s] 0.058719 +Converged at iteration 19, L1 5.55072e-05, Linf 0.00343939, total time[s] 0.071074 +Converged at iteration 30, L1 9.53726e-05, Linf 0.00334418, total time[s] 0.088593 +Converged at iteration 20, L1 8.49933e-05, Linf 0.00472302, total time[s] 0.06527 +Converged at iteration 24, L1 7.23767e-05, Linf 0.00581796, total time[s] 0.068957 +Converged at iteration 31, L1 9.42933e-05, Linf 0.00481856, total time[s] 0.096779 +Converged at iteration 27, L1 9.41259e-05, Linf 0.0046828, total time[s] 0.081088 +Converged at iteration 24, L1 8.52413e-05, Linf 0.00429595, total time[s] 0.086044 +Converged at iteration 23, L1 9.24547e-05, Linf 0.00432598, total time[s] 0.058032 +Converged at iteration 26, L1 7.12791e-05, Linf 0.00464387, total time[s] 0.066763 +Converged at iteration 29, L1 7.58357e-05, Linf 0.00487185, total time[s] 0.073925 +Converged at iteration 34, L1 8.1394e-05, Linf 0.00406034, total time[s] 0.094525 +Converged at iteration 31, L1 7.17006e-05, Linf 0.00359763, total time[s] 0.080592 +Converged at iteration 29, L1 7.05579e-05, Linf 0.002724, total time[s] 0.074845 +Converged at iteration 32, L1 8.29135e-05, Linf 0.00354607, total time[s] 0.079783 +Converged at iteration 36, L1 8.72595e-05, Linf 0.00357984, total time[s] 0.089575 +Converged at iteration 33, L1 8.35407e-05, Linf 0.00485644, total time[s] 0.082933 +Converged at iteration 28, L1 9.10404e-05, Linf 0.00409195, total time[s] 0.07183 +Converged at iteration 24, L1 8.03057e-05, Linf 0.00291552, total time[s] 0.064071 +Converged at iteration 26, L1 8.40491e-05, Linf 0.00392414, total time[s] 0.068862 +Converged at iteration 39, L1 9.99301e-05, Linf 0.00489763, total time[s] 0.09545 +Converged at iteration 35, L1 9.66457e-05, Linf 0.00382192, total time[s] 0.091416 +Converged at iteration 30, L1 7.68443e-05, Linf 0.00421151, total time[s] 0.076786 +Converged at iteration 31, L1 6.14084e-05, Linf 0.00506454, total time[s] 0.077983 +Converged at iteration 26, L1 9.11903e-05, Linf 0.00568961, total time[s] 0.072722 +Converged at iteration 21, L1 9.60878e-05, Linf 0.00461215, total time[s] 0.056156 +Converged at iteration 21, L1 6.92315e-05, Linf 0.00393124, total time[s] 0.091092 +Converged at iteration 24, L1 8.33004e-05, Linf 0.00519788, total time[s] 0.08856 +Converged at iteration 28, L1 6.83576e-05, Linf 0.00441191, total time[s] 0.09948 +Converged at iteration 26, L1 8.12497e-05, Linf 0.00430191, total time[s] 0.101534 +Converged at iteration 21, L1 8.50956e-05, Linf 0.00433736, total time[s] 0.073711 +Converged at iteration 18, L1 7.35782e-05, Linf 0.00298992, total time[s] 0.068363 +Converged at iteration 31, L1 7.48991e-05, Linf 0.0026824, total time[s] 0.104303 +Converged at iteration 20, L1 8.18465e-05, Linf 0.00494545, total time[s] 0.062446 +Converged at iteration 24, L1 6.88721e-05, Linf 0.00500123, total time[s] 0.07437 +Converged at iteration 30, L1 9.41788e-05, Linf 0.00345649, total time[s] 0.09622 +Converged at iteration 25, L1 9.01625e-05, Linf 0.00466695, total time[s] 0.063523 +Converged at iteration 23, L1 8.35938e-05, Linf 0.00394558, total time[s] 0.065708 +Converged at iteration 23, L1 9.32404e-05, Linf 0.00455938, total time[s] 0.06282 +Converged at iteration 26, L1 6.89641e-05, Linf 0.00492276, total time[s] 0.075161 +Converged at iteration 29, L1 7.12672e-05, Linf 0.00485981, total time[s] 0.077595 +Converged at iteration 32, L1 8.57784e-05, Linf 0.00350128, total time[s] 0.079916 +Converged at iteration 31, L1 7.25423e-05, Linf 0.00303287, total time[s] 0.078156 +Converged at iteration 29, L1 7.74151e-05, Linf 0.00291209, total time[s] 0.076104 +Converged at iteration 32, L1 7.55812e-05, Linf 0.00337438, total time[s] 0.081831 +Converged at iteration 35, L1 9.72523e-05, Linf 0.00405321, total time[s] 0.091255 +Converged at iteration 33, L1 8.10797e-05, Linf 0.00505952, total time[s] 0.256989 +Converged at iteration 28, L1 8.41463e-05, Linf 0.00398757, total time[s] 0.082564 +Converged at iteration 24, L1 7.80455e-05, Linf 0.00256158, total time[s] 0.107531 +Converged at iteration 26, L1 8.3647e-05, Linf 0.00405315, total time[s] 0.093329 +Converged at iteration 39, L1 9.33947e-05, Linf 0.00548889, total time[s] 0.121134 +Converged at iteration 36, L1 7.24076e-05, Linf 0.00384525, total time[s] 0.121672 +Converged at iteration 27, L1 5.17456e-05, Linf 0.00564357, total time[s] 0.07445 +Converged at iteration 31, L1 6.06931e-05, Linf 0.00508905, total time[s] 0.084663 +Converged at iteration 26, L1 7.63468e-05, Linf 0.00544335, total time[s] 0.066814 +Converged at iteration 21, L1 7.21062e-05, Linf 0.00380746, total time[s] 0.093482 +Converged at iteration 20, L1 6.90281e-05, Linf 0.00502958, total time[s] 0.077247 +Converged at iteration 22, L1 7.53609e-05, Linf 0.00745863, total time[s] 0.079866 +Converged at iteration 26, L1 9.72587e-05, Linf 0.00651816, total time[s] 0.098864 +Converged at iteration 25, L1 7.48964e-05, Linf 0.00412523, total time[s] 0.101333 +Converged at iteration 20, L1 8.85205e-05, Linf 0.00555822, total time[s] 0.061242 +Converged at iteration 17, L1 8.52409e-05, Linf 0.00400211, total time[s] 0.075331 +Converged at iteration 31, L1 9.16929e-05, Linf 0.00277124, total time[s] 0.081579 +Converged at iteration 20, L1 6.65179e-05, Linf 0.00524998, total time[s] 0.05332 +Converged at iteration 24, L1 6.21681e-05, Linf 0.00577283, total time[s] 0.063209 +Converged at iteration 28, L1 7.06891e-05, Linf 0.00373892, total time[s] 0.074847 +Converged at iteration 23, L1 9.56472e-05, Linf 0.00710109, total time[s] 0.059876 +Converged at iteration 21, L1 9.33369e-05, Linf 0.00485117, total time[s] 0.063226 +Converged at iteration 23, L1 7.86796e-05, Linf 0.00427955, total time[s] 0.06067 +Converged at iteration 25, L1 9.93878e-05, Linf 0.00625544, total time[s] 0.06602 +Converged at iteration 28, L1 9.8307e-05, Linf 0.00586776, total time[s] 0.07159 +Converged at iteration 30, L1 6.95695e-05, Linf 0.00575234, total time[s] 0.076392 +Converged at iteration 28, L1 8.30672e-05, Linf 0.00350225, total time[s] 0.074374 +Converged at iteration 29, L1 8.84436e-05, Linf 0.00330593, total time[s] 0.077733 +Converged at iteration 31, L1 6.97276e-05, Linf 0.00287773, total time[s] 0.08014 +Converged at iteration 31, L1 9.12329e-05, Linf 0.00461576, total time[s] 0.079545 +Converged at iteration 33, L1 7.43888e-05, Linf 0.00530488, total time[s] 0.082407 +Converged at iteration 28, L1 7.04942e-05, Linf 0.00368841, total time[s] 0.070529 +Converged at iteration 24, L1 8.81631e-05, Linf 0.00186804, total time[s] 0.066476 +Converged at iteration 25, L1 6.97651e-05, Linf 0.00420999, total time[s] 0.063182 +Converged at iteration 39, L1 7.84417e-05, Linf 0.00659513, total time[s] 0.098448 +Converged at iteration 36, L1 7.39818e-05, Linf 0.00526415, total time[s] 0.098547 +Converged at iteration 24, L1 7.4989e-05, Linf 0.00411351, total time[s] 0.062544 +Converged at iteration 31, L1 5.84228e-05, Linf 0.00509162, total time[s] 0.078595 +Converged at iteration 25, L1 8.72466e-05, Linf 0.00571572, total time[s] 0.064991 +Converged at iteration 20, L1 9.16069e-05, Linf 0.00380211, total time[s] 0.053738 +Converged at iteration 19, L1 6.71824e-05, Linf 0.00437689, total time[s] 0.064694 +Converged at iteration 20, L1 9.17447e-05, Linf 0.00662009, total time[s] 0.074671 +Converged at iteration 24, L1 7.94261e-05, Linf 0.00492142, total time[s] 0.088318 +Converged at iteration 24, L1 7.63745e-05, Linf 0.00492114, total time[s] 0.104675 +Converged at iteration 20, L1 6.05012e-05, Linf 0.00519215, total time[s] 0.090965 +Converged at iteration 17, L1 5.23764e-05, Linf 0.00271902, total time[s] 0.069271 +Converged at iteration 32, L1 6.88626e-05, Linf 0.00256264, total time[s] 0.112477 +Converged at iteration 19, L1 9.36241e-05, Linf 0.00720358, total time[s] 0.063448 +Converged at iteration 23, L1 7.83803e-05, Linf 0.00666727, total time[s] 0.079746 +Converged at iteration 26, L1 8.17412e-05, Linf 0.00603273, total time[s] 0.081608 +Converged at iteration 23, L1 5.79695e-05, Linf 0.00603964, total time[s] 0.06685 +Converged at iteration 20, L1 8.30729e-05, Linf 0.00552724, total time[s] 0.059092 +Converged at iteration 22, L1 9.94638e-05, Linf 0.00479483, total time[s] 0.070032 +Converged at iteration 25, L1 8.48529e-05, Linf 0.00440043, total time[s] 0.079073 +Converged at iteration 28, L1 7.85047e-05, Linf 0.00358719, total time[s] 0.096153 +Converged at iteration 29, L1 7.54401e-05, Linf 0.00611356, total time[s] 0.101195 +Converged at iteration 27, L1 7.35715e-05, Linf 0.00401961, total time[s] 0.104186 +Converged at iteration 29, L1 7.65653e-05, Linf 0.00380602, total time[s] 0.117723 +Converged at iteration 29, L1 9.18122e-05, Linf 0.00277216, total time[s] 0.124052 +Converged at iteration 28, L1 8.41879e-05, Linf 0.00273967, total time[s] 0.091979 +Converged at iteration 33, L1 6.18566e-05, Linf 0.00584838, total time[s] 0.111192 +Converged at iteration 27, L1 6.96723e-05, Linf 0.00334635, total time[s] 0.091508 +Converged at iteration 24, L1 9.65684e-05, Linf 0.00239091, total time[s] 0.083093 +Converged at iteration 23, L1 7.57439e-05, Linf 0.00331323, total time[s] 0.077083 +Converged at iteration 39, L1 7.44549e-05, Linf 0.00654581, total time[s] 0.136314 +Converged at iteration 36, L1 7.20281e-05, Linf 0.00533752, total time[s] 0.11976 +Converged at iteration 24, L1 7.46079e-05, Linf 0.00388338, total time[s] 0.066374 +Converged at iteration 31, L1 5.7246e-05, Linf 0.00507387, total time[s] 0.088165 +Converged at iteration 25, L1 8.73503e-05, Linf 0.00584015, total time[s] 0.092073 +Converged at iteration 20, L1 9.49196e-05, Linf 0.0038663, total time[s] 0.091699 +Converged at iteration 19, L1 6.41399e-05, Linf 0.00437904, total time[s] 0.096503 +Converged at iteration 20, L1 9.02205e-05, Linf 0.00655202, total time[s] 0.109498 +Converged at iteration 24, L1 7.66816e-05, Linf 0.00459199, total time[s] 0.110989 +Converged at iteration 24, L1 7.6925e-05, Linf 0.00496137, total time[s] 0.091124 +Converged at iteration 20, L1 6.13185e-05, Linf 0.00518391, total time[s] 0.059835 +Converged at iteration 16, L1 9.93341e-05, Linf 0.00457307, total time[s] 0.065777 +Converged at iteration 32, L1 6.89002e-05, Linf 0.00257308, total time[s] 0.099835 +Converged at iteration 19, L1 9.32956e-05, Linf 0.00680647, total time[s] 0.052201 +Converged at iteration 23, L1 7.74187e-05, Linf 0.00702777, total time[s] 0.062018 +Converged at iteration 26, L1 7.98968e-05, Linf 0.00596561, total time[s] 0.065859 +Converged at iteration 23, L1 5.70306e-05, Linf 0.00599, total time[s] 0.062398 +Converged at iteration 20, L1 8.25345e-05, Linf 0.00551311, total time[s] 0.055486 +Converged at iteration 23, L1 6.34521e-05, Linf 0.00287808, total time[s] 0.109766 +Converged at iteration 25, L1 8.37244e-05, Linf 0.00419775, total time[s] 0.07438 +Converged at iteration 28, L1 7.74134e-05, Linf 0.00351774, total time[s] 0.085743 +Converged at iteration 29, L1 7.46557e-05, Linf 0.00612404, total time[s] 0.106189 +Converged at iteration 27, L1 7.36957e-05, Linf 0.00399124, total time[s] 0.080471 +Converged at iteration 29, L1 7.81909e-05, Linf 0.00382388, total time[s] 0.09362 +Converged at iteration 29, L1 9.20341e-05, Linf 0.00277469, total time[s] 0.084488 +Converged at iteration 28, L1 8.20037e-05, Linf 0.00266479, total time[s] 0.080886 +Converged at iteration 33, L1 6.01686e-05, Linf 0.0058558, total time[s] 0.089872 +Converged at iteration 27, L1 6.88221e-05, Linf 0.0033954, total time[s] 0.070318 +Converged at iteration 24, L1 9.89834e-05, Linf 0.00243466, total time[s] 0.075201 +Converged at iteration 23, L1 7.49353e-05, Linf 0.00326563, total time[s] 0.078687 +Converged at iteration 39, L1 7.35793e-05, Linf 0.00662455, total time[s] 0.104099 +Converged at iteration 36, L1 7.01149e-05, Linf 0.00546732, total time[s] 0.106095 +Converged at iteration 24, L1 7.39247e-05, Linf 0.00367742, total time[s] 0.082155 +Converged at iteration 31, L1 5.6974e-05, Linf 0.00504473, total time[s] 0.08683 +Converged at iteration 25, L1 8.92568e-05, Linf 0.00599553, total time[s] 0.064503 +Converged at iteration 20, L1 9.88212e-05, Linf 0.00391928, total time[s] 0.054801 +Converged at iteration 19, L1 6.20255e-05, Linf 0.00426566, total time[s] 0.080169 +Converged at iteration 20, L1 8.83027e-05, Linf 0.00608453, total time[s] 0.087056 +Converged at iteration 24, L1 7.46364e-05, Linf 0.00422518, total time[s] 0.075514 +Converged at iteration 24, L1 8.13189e-05, Linf 0.00506513, total time[s] 0.091786 +Converged at iteration 20, L1 6.2769e-05, Linf 0.00517392, total time[s] 0.072411 +Converged at iteration 16, L1 9.79502e-05, Linf 0.00481191, total time[s] 0.05216 +Converged at iteration 32, L1 6.88798e-05, Linf 0.00270563, total time[s] 0.103628 +Converged at iteration 19, L1 9.40841e-05, Linf 0.00687812, total time[s] 0.058558 +Converged at iteration 23, L1 7.89313e-05, Linf 0.00696471, total time[s] 0.078145 +Converged at iteration 26, L1 8.268e-05, Linf 0.00592604, total time[s] 0.093409 +Converged at iteration 23, L1 5.69713e-05, Linf 0.00598287, total time[s] 0.073035 +Converged at iteration 20, L1 8.4751e-05, Linf 0.00551307, total time[s] 0.096728 +Converged at iteration 23, L1 6.56697e-05, Linf 0.00283113, total time[s] 0.063156 +Converged at iteration 25, L1 8.32858e-05, Linf 0.00403768, total time[s] 0.06645 +Converged at iteration 28, L1 7.71614e-05, Linf 0.00354693, total time[s] 0.077552 +Converged at iteration 29, L1 7.74126e-05, Linf 0.00618361, total time[s] 0.072321 +Converged at iteration 27, L1 7.56075e-05, Linf 0.00397643, total time[s] 0.071711 +Converged at iteration 29, L1 7.90953e-05, Linf 0.00387163, total time[s] 0.077488 +Converged at iteration 29, L1 9.28081e-05, Linf 0.00278044, total time[s] 0.075633 +Converged at iteration 28, L1 8.28327e-05, Linf 0.00260603, total time[s] 0.072174 +Converged at iteration 33, L1 5.8621e-05, Linf 0.00585167, total time[s] 0.080858 +Converged at iteration 27, L1 6.93061e-05, Linf 0.00353857, total time[s] 0.067583 +Converged at iteration 25, L1 7.13835e-05, Linf 0.00193448, total time[s] 0.064983 +Converged at iteration 23, L1 7.4654e-05, Linf 0.00321752, total time[s] 0.062867 +Converged at iteration 39, L1 7.17455e-05, Linf 0.00661419, total time[s] 0.108656 +Converged at iteration 36, L1 6.8993e-05, Linf 0.00552546, total time[s] 0.134141 +Converged at iteration 24, L1 7.30374e-05, Linf 0.00336432, total time[s] 0.070122 +Converged at iteration 30, L1 9.89066e-05, Linf 0.00615495, total time[s] 0.08654 +Converged at iteration 25, L1 9.27823e-05, Linf 0.00625682, total time[s] 0.067663 +Converged at iteration 21, L1 5.87401e-05, Linf 0.00343225, total time[s] 0.070145 +Converged at iteration 19, L1 6.00318e-05, Linf 0.00410252, total time[s] 0.056673 +Converged at iteration 20, L1 8.60596e-05, Linf 0.00645565, total time[s] 0.07979 +Converged at iteration 24, L1 7.1828e-05, Linf 0.00445249, total time[s] 0.070344 +Converged at iteration 24, L1 8.13328e-05, Linf 0.00517547, total time[s] 0.077605 +Converged at iteration 20, L1 6.52551e-05, Linf 0.00550009, total time[s] 0.077325 +Converged at iteration 16, L1 9.73425e-05, Linf 0.00506905, total time[s] 0.068071 +Converged at iteration 32, L1 6.80919e-05, Linf 0.00262261, total time[s] 0.119237 +Converged at iteration 19, L1 9.43222e-05, Linf 0.00675485, total time[s] 0.101569 +Converged at iteration 23, L1 7.68418e-05, Linf 0.00682942, total time[s] 0.106371 +Converged at iteration 26, L1 8.01843e-05, Linf 0.00589282, total time[s] 0.105436 +Converged at iteration 23, L1 5.64049e-05, Linf 0.00597023, total time[s] 0.090284 +Converged at iteration 20, L1 8.53125e-05, Linf 0.0055156, total time[s] 0.057907 +Converged at iteration 23, L1 6.73774e-05, Linf 0.00278426, total time[s] 0.061678 +Converged at iteration 25, L1 8.39207e-05, Linf 0.00390293, total time[s] 0.066939 +Converged at iteration 28, L1 7.7795e-05, Linf 0.00378893, total time[s] 0.077353 +Converged at iteration 29, L1 7.74508e-05, Linf 0.0062418, total time[s] 0.07798 +Converged at iteration 27, L1 7.70008e-05, Linf 0.00395291, total time[s] 0.06948 +Converged at iteration 29, L1 8.10797e-05, Linf 0.00392798, total time[s] 0.073905 +Converged at iteration 29, L1 9.29294e-05, Linf 0.00278277, total time[s] 0.074561 +Converged at iteration 28, L1 8.05544e-05, Linf 0.00253957, total time[s] 0.072348 +Converged at iteration 32, L1 9.89395e-05, Linf 0.00696647, total time[s] 0.081538 +Converged at iteration 27, L1 7.23112e-05, Linf 0.00375337, total time[s] 0.083046 +Converged at iteration 25, L1 7.21896e-05, Linf 0.00198931, total time[s] 0.082418 +Converged at iteration 23, L1 7.42659e-05, Linf 0.00310038, total time[s] 0.07397 +Converged at iteration 39, L1 6.9931e-05, Linf 0.00659201, total time[s] 0.126479 +Converged at iteration 36, L1 6.74194e-05, Linf 0.00551407, total time[s] 0.107611 +Converged at iteration 24, L1 7.26061e-05, Linf 0.00309909, total time[s] 0.064164 +Converged at iteration 30, L1 9.72481e-05, Linf 0.00610833, total time[s] 0.082678 +Converged at iteration 25, L1 9.81605e-05, Linf 0.0066441, total time[s] 0.076349 +Converged at iteration 21, L1 6.44052e-05, Linf 0.00333627, total time[s] 0.141399 +Converged at iteration 19, L1 5.86185e-05, Linf 0.00392564, total time[s] 0.070852 +Converged at iteration 20, L1 8.29087e-05, Linf 0.0061466, total time[s] 0.091045 +Converged at iteration 24, L1 6.90526e-05, Linf 0.00350188, total time[s] 0.162298 +Converged at iteration 24, L1 8.47111e-05, Linf 0.0053699, total time[s] 0.079451 +Converged at iteration 20, L1 6.93118e-05, Linf 0.00568758, total time[s] 0.056896 +Converged at iteration 16, L1 9.70538e-05, Linf 0.00537964, total time[s] 0.051315 +Converged at iteration 32, L1 6.56381e-05, Linf 0.0026426, total time[s] 0.089904 +Converged at iteration 19, L1 9.50219e-05, Linf 0.00656031, total time[s] 0.056243 +Converged at iteration 23, L1 7.65565e-05, Linf 0.00676602, total time[s] 0.075921 +Converged at iteration 26, L1 8.06437e-05, Linf 0.00586182, total time[s] 0.081028 +Converged at iteration 23, L1 5.58454e-05, Linf 0.00598311, total time[s] 0.085353 +Converged at iteration 20, L1 8.8338e-05, Linf 0.00552707, total time[s] 0.108356 +Converged at iteration 23, L1 6.9402e-05, Linf 0.0027197, total time[s] 0.072874 +Converged at iteration 25, L1 8.49276e-05, Linf 0.00379329, total time[s] 0.073802 +Converged at iteration 28, L1 7.92517e-05, Linf 0.00400913, total time[s] 0.082658 +Converged at iteration 29, L1 7.98045e-05, Linf 0.00631214, total time[s] 0.088804 +Converged at iteration 27, L1 7.95327e-05, Linf 0.00392722, total time[s] 0.076293 +Converged at iteration 29, L1 8.38897e-05, Linf 0.00399186, total time[s] 0.088011 +Converged at iteration 29, L1 9.48469e-05, Linf 0.00277544, total time[s] 0.085755 +Converged at iteration 28, L1 8.261e-05, Linf 0.00247539, total time[s] 0.075104 +Converged at iteration 32, L1 9.63881e-05, Linf 0.00693881, total time[s] 0.091661 +Converged at iteration 27, L1 7.67643e-05, Linf 0.00407079, total time[s] 0.083416 +Converged at iteration 25, L1 7.02078e-05, Linf 0.00201723, total time[s] 0.073381 +Converged at iteration 23, L1 7.49873e-05, Linf 0.00298122, total time[s] 0.065234 +Converged at iteration 39, L1 6.86151e-05, Linf 0.00654376, total time[s] 0.109973 +Converged at iteration 36, L1 6.36671e-05, Linf 0.00554766, total time[s] 0.1106 +Converged at iteration 24, L1 7.30504e-05, Linf 0.00308198, total time[s] 0.071298 +Converged at iteration 30, L1 9.46407e-05, Linf 0.00605411, total time[s] 0.084014 +Converged at iteration 26, L1 5.94546e-05, Linf 0.00588317, total time[s] 0.068161 +Converged at iteration 21, L1 7.5276e-05, Linf 0.00339875, total time[s] 0.06001 +Converged at iteration 19, L1 5.80936e-05, Linf 0.00394738, total time[s] 0.0753 +Converged at iteration 20, L1 7.96824e-05, Linf 0.00641203, total time[s] 0.070471 +Converged at iteration 24, L1 6.57869e-05, Linf 0.00398207, total time[s] 0.087576 +Converged at iteration 24, L1 8.98087e-05, Linf 0.00563849, total time[s] 0.085478 +Converged at iteration 20, L1 7.54521e-05, Linf 0.00581721, total time[s] 0.075751 +Converged at iteration 16, L1 9.75481e-05, Linf 0.00574966, total time[s] 0.054405 +Converged at iteration 32, L1 6.29286e-05, Linf 0.00266328, total time[s] 0.102035 +Converged at iteration 19, L1 9.38602e-05, Linf 0.00640544, total time[s] 0.050706 +Converged at iteration 23, L1 7.58995e-05, Linf 0.00645876, total time[s] 0.059704 +Converged at iteration 26, L1 8.21505e-05, Linf 0.00584415, total time[s] 0.067442 +Converged at iteration 23, L1 5.52567e-05, Linf 0.00598942, total time[s] 0.060388 +Converged at iteration 20, L1 9.33366e-05, Linf 0.00550904, total time[s] 0.056205 +Converged at iteration 23, L1 7.20964e-05, Linf 0.00264772, total time[s] 0.061982 +Converged at iteration 25, L1 8.60494e-05, Linf 0.00367634, total time[s] 0.066294 +Converged at iteration 28, L1 8.09085e-05, Linf 0.00429666, total time[s] 0.073913 +Converged at iteration 29, L1 8.38874e-05, Linf 0.00639132, total time[s] 0.076235 +Converged at iteration 27, L1 8.28245e-05, Linf 0.00390219, total time[s] 0.070719 +Converged at iteration 29, L1 8.53338e-05, Linf 0.00409284, total time[s] 0.078568 +Converged at iteration 29, L1 9.44873e-05, Linf 0.00276559, total time[s] 0.075554 +Converged at iteration 28, L1 8.04649e-05, Linf 0.00241732, total time[s] 0.073265 +Converged at iteration 32, L1 9.30328e-05, Linf 0.00687931, total time[s] 0.082779 +Converged at iteration 27, L1 8.12541e-05, Linf 0.004554, total time[s] 0.071533 +Converged at iteration 24, L1 9.87881e-05, Linf 0.00261957, total time[s] 0.064337 +Converged at iteration 23, L1 7.71853e-05, Linf 0.00287349, total time[s] 0.060992 +Converged at iteration 39, L1 6.67823e-05, Linf 0.00649309, total time[s] 0.104175 +Converged at iteration 36, L1 5.98807e-05, Linf 0.00555937, total time[s] 0.105528 +Converged at iteration 24, L1 7.42013e-05, Linf 0.00294092, total time[s] 0.065397 +Converged at iteration 30, L1 9.12939e-05, Linf 0.00602789, total time[s] 0.077621 +Converged at iteration 26, L1 6.46841e-05, Linf 0.00632767, total time[s] 0.06868 +Converged at iteration 21, L1 9.07282e-05, Linf 0.00429046, total time[s] 0.05802 +Converged at iteration 19, L1 5.74497e-05, Linf 0.00397498, total time[s] 0.056618 +Converged at iteration 20, L1 7.62577e-05, Linf 0.00595873, total time[s] 0.074455 +Converged at iteration 24, L1 6.19258e-05, Linf 0.00327172, total time[s] 0.078718 +Converged at iteration 24, L1 9.53636e-05, Linf 0.00590048, total time[s] 0.072836 +Converged at iteration 20, L1 8.19762e-05, Linf 0.00595911, total time[s] 0.077714 +Converged at iteration 16, L1 9.65929e-05, Linf 0.00611309, total time[s] 0.079789 +Converged at iteration 32, L1 5.81294e-05, Linf 0.00265434, total time[s] 0.12752 +Converged at iteration 19, L1 9.27425e-05, Linf 0.00622701, total time[s] 0.076873 +Converged at iteration 23, L1 7.48295e-05, Linf 0.00622591, total time[s] 0.073113 +Converged at iteration 26, L1 8.39077e-05, Linf 0.00582288, total time[s] 0.084364 +Converged at iteration 23, L1 5.48009e-05, Linf 0.00603671, total time[s] 0.102836 +Converged at iteration 20, L1 9.90168e-05, Linf 0.00559457, total time[s] 0.058371 +Converged at iteration 23, L1 7.33924e-05, Linf 0.00256223, total time[s] 0.065302 +Converged at iteration 25, L1 8.73056e-05, Linf 0.00358299, total time[s] 0.075422 +Converged at iteration 28, L1 8.30272e-05, Linf 0.00436921, total time[s] 0.074618 +Converged at iteration 29, L1 8.58672e-05, Linf 0.00647902, total time[s] 0.078622 +Converged at iteration 27, L1 8.60922e-05, Linf 0.00387772, total time[s] 0.145077 +Converged at iteration 29, L1 8.74472e-05, Linf 0.00414647, total time[s] 0.130496 +Converged at iteration 29, L1 9.41793e-05, Linf 0.00277905, total time[s] 0.091486 +Converged at iteration 28, L1 8.00581e-05, Linf 0.00236565, total time[s] 0.095126 +Converged at iteration 32, L1 8.8975e-05, Linf 0.00680213, total time[s] 0.093813 +Converged at iteration 27, L1 8.72508e-05, Linf 0.00499555, total time[s] 0.074358 +Converged at iteration 24, L1 9.99346e-05, Linf 0.00261528, total time[s] 0.071455 +Converged at iteration 23, L1 7.9292e-05, Linf 0.00273767, total time[s] 0.073719 +Converged at iteration 39, L1 6.49532e-05, Linf 0.00642592, total time[s] 0.145862 +Converged at iteration 35, L1 9.99199e-05, Linf 0.0064765, total time[s] 0.135056 +Converged at iteration 24, L1 7.6976e-05, Linf 0.0028393, total time[s] 0.069381 +Converged at iteration 30, L1 8.78405e-05, Linf 0.00591335, total time[s] 0.085021 +Converged at iteration 26, L1 7.00071e-05, Linf 0.00682651, total time[s] 0.093895 +Converged at iteration 22, L1 5.90035e-05, Linf 0.00432691, total time[s] 0.09491 +Converged at iteration 19, L1 5.75675e-05, Linf 0.00390806, total time[s] 0.137497 +Converged at iteration 20, L1 7.3067e-05, Linf 0.00563186, total time[s] 0.09647 +Converged at iteration 24, L1 5.89793e-05, Linf 0.00323256, total time[s] 0.098734 +Converged at iteration 25, L1 5.4453e-05, Linf 0.00493799, total time[s] 0.097573 +Converged at iteration 20, L1 8.82587e-05, Linf 0.00610808, total time[s] 0.065028 +Converged at iteration 16, L1 9.63851e-05, Linf 0.00643446, total time[s] 0.044777 +Converged at iteration 31, L1 9.40592e-05, Linf 0.00325807, total time[s] 0.092129 +Converged at iteration 19, L1 9.0902e-05, Linf 0.00603219, total time[s] 0.061817 +Converged at iteration 23, L1 7.31773e-05, Linf 0.00596086, total time[s] 0.073164 +Converged at iteration 26, L1 8.47843e-05, Linf 0.00579464, total time[s] 0.120476 +Converged at iteration 23, L1 5.54748e-05, Linf 0.00605803, total time[s] 0.061256 +Converged at iteration 21, L1 5.70172e-05, Linf 0.00472394, total time[s] 0.064474 +Converged at iteration 23, L1 7.40604e-05, Linf 0.00244376, total time[s] 0.078122 +Converged at iteration 25, L1 8.81299e-05, Linf 0.00348768, total time[s] 0.144696 +Converged at iteration 28, L1 8.56594e-05, Linf 0.0046492, total time[s] 0.078709 +Converged at iteration 29, L1 8.9714e-05, Linf 0.00657381, total time[s] 0.074769 +Converged at iteration 27, L1 8.95631e-05, Linf 0.00387, total time[s] 0.077269 +Converged at iteration 29, L1 8.86573e-05, Linf 0.004261, total time[s] 0.08025 +Converged at iteration 29, L1 9.52214e-05, Linf 0.00282445, total time[s] 0.083937 +Converged at iteration 28, L1 8.0426e-05, Linf 0.00232819, total time[s] 0.078047 +Converged at iteration 32, L1 8.3667e-05, Linf 0.00670171, total time[s] 0.090696 +Converged at iteration 27, L1 9.54089e-05, Linf 0.00555549, total time[s] 0.080723 +Converged at iteration 25, L1 6.46976e-05, Linf 0.00204246, total time[s] 0.077627 +Converged at iteration 23, L1 8.23455e-05, Linf 0.00264938, total time[s] 0.066152 +Converged at iteration 39, L1 6.17271e-05, Linf 0.00624748, total time[s] 0.120954 +Converged at iteration 35, L1 8.86785e-05, Linf 0.00645462, total time[s] 0.114598 +Converged at iteration 24, L1 7.94024e-05, Linf 0.00290138, total time[s] 0.086755 +Converged at iteration 30, L1 8.34579e-05, Linf 0.00582319, total time[s] 0.111312 +Converged at iteration 26, L1 7.54374e-05, Linf 0.00746678, total time[s] 0.0921 +Converged at iteration 22, L1 7.68744e-05, Linf 0.0053945, total time[s] 0.081628 +Converged at iteration 19, L1 5.85841e-05, Linf 0.00403673, total time[s] 0.060813 +Converged at iteration 20, L1 6.97741e-05, Linf 0.00537394, total time[s] 0.0658 +Converged at iteration 24, L1 5.59443e-05, Linf 0.00313746, total time[s] 0.083282 +Converged at iteration 25, L1 5.63458e-05, Linf 0.00523344, total time[s] 0.106656 +Converged at iteration 20, L1 9.63735e-05, Linf 0.00626008, total time[s] 0.067271 +Converged at iteration 16, L1 9.72102e-05, Linf 0.00666104, total time[s] 0.05955 +Converged at iteration 31, L1 8.85719e-05, Linf 0.00331558, total time[s] 0.084209 +Converged at iteration 19, L1 8.64994e-05, Linf 0.00581437, total time[s] 0.052431 +Converged at iteration 23, L1 7.11715e-05, Linf 0.00565569, total time[s] 0.060169 +Converged at iteration 26, L1 8.57805e-05, Linf 0.00572111, total time[s] 0.067002 +Converged at iteration 23, L1 5.65267e-05, Linf 0.00611305, total time[s] 0.062171 +Converged at iteration 21, L1 6.19946e-05, Linf 0.00472664, total time[s] 0.056702 +Converged at iteration 23, L1 7.35677e-05, Linf 0.00231207, total time[s] 0.081311 +Converged at iteration 25, L1 8.75176e-05, Linf 0.00340786, total time[s] 0.067983 +Converged at iteration 28, L1 8.89563e-05, Linf 0.00488968, total time[s] 0.074109 +Converged at iteration 29, L1 9.36533e-05, Linf 0.00665502, total time[s] 0.078947 +Converged at iteration 27, L1 9.28395e-05, Linf 0.00383475, total time[s] 0.073632 +Converged at iteration 29, L1 9.04777e-05, Linf 0.0043358, total time[s] 0.074128 +Converged at iteration 29, L1 9.61835e-05, Linf 0.00286502, total time[s] 0.08838 +Converged at iteration 28, L1 8.11512e-05, Linf 0.00228524, total time[s] 0.077542 +Converged at iteration 32, L1 7.77822e-05, Linf 0.00658922, total time[s] 0.099809 +Converged at iteration 28, L1 6.01264e-05, Linf 0.00516457, total time[s] 0.098842 +Converged at iteration 25, L1 6.86907e-05, Linf 0.00272072, total time[s] 0.07003 +Converged at iteration 23, L1 8.63951e-05, Linf 0.00256738, total time[s] 0.064948 +Converged at iteration 39, L1 5.61945e-05, Linf 0.00617748, total time[s] 0.107068 +Converged at iteration 35, L1 8.09658e-05, Linf 0.00651855, total time[s] 0.129076 +Converged at iteration 24, L1 8.35818e-05, Linf 0.00299013, total time[s] 0.082433 +Converged at iteration 30, L1 7.88276e-05, Linf 0.0057242, total time[s] 0.084886 +Converged at iteration 26, L1 8.03856e-05, Linf 0.00794846, total time[s] 0.072241 +Converged at iteration 22, L1 9.95628e-05, Linf 0.00650975, total time[s] 0.104147 +Converged at iteration 19, L1 6.09068e-05, Linf 0.00418057, total time[s] 0.064176 +Converged at iteration 20, L1 6.70023e-05, Linf 0.00486359, total time[s] 0.073694 +Converged at iteration 24, L1 5.40408e-05, Linf 0.00309746, total time[s] 0.101755 +Converged at iteration 25, L1 6.08557e-05, Linf 0.00550632, total time[s] 0.107608 +Converged at iteration 21, L1 5.31493e-05, Linf 0.00535506, total time[s] 0.088121 +Converged at iteration 16, L1 9.83762e-05, Linf 0.0067862, total time[s] 0.04759 +Converged at iteration 31, L1 8.44756e-05, Linf 0.00331259, total time[s] 0.123839 +Converged at iteration 19, L1 8.00646e-05, Linf 0.00554055, total time[s] 0.084067 +Converged at iteration 23, L1 6.84983e-05, Linf 0.0053027, total time[s] 0.071449 +Converged at iteration 26, L1 8.76992e-05, Linf 0.00561481, total time[s] 0.078051 +Converged at iteration 23, L1 5.75118e-05, Linf 0.00613044, total time[s] 0.068188 +Converged at iteration 21, L1 6.82044e-05, Linf 0.00464703, total time[s] 0.062976 +Converged at iteration 23, L1 7.17982e-05, Linf 0.00213789, total time[s] 0.075529 +Converged at iteration 25, L1 8.8177e-05, Linf 0.0033398, total time[s] 0.089522 +Converged at iteration 28, L1 9.27445e-05, Linf 0.00524001, total time[s] 0.109145 +Converged at iteration 29, L1 9.83013e-05, Linf 0.00676461, total time[s] 0.087376 +Converged at iteration 27, L1 9.63223e-05, Linf 0.00368111, total time[s] 0.084507 +Converged at iteration 29, L1 9.44094e-05, Linf 0.00447129, total time[s] 0.087469 +Converged at iteration 29, L1 9.90774e-05, Linf 0.00291288, total time[s] 0.081131 +Converged at iteration 28, L1 8.43274e-05, Linf 0.00224284, total time[s] 0.077335 +Converged at iteration 32, L1 7.17739e-05, Linf 0.00645635, total time[s] 0.081273 +Converged at iteration 28, L1 6.2703e-05, Linf 0.00573662, total time[s] 0.071543 +Converged at iteration 25, L1 7.61054e-05, Linf 0.00344793, total time[s] 0.064886 +Converged at iteration 23, L1 9.03809e-05, Linf 0.00252174, total time[s] 0.060144 +Converged at iteration 38, L1 9.92021e-05, Linf 0.00723734, total time[s] 0.098144 +Converged at iteration 35, L1 6.78499e-05, Linf 0.00620422, total time[s] 0.107612 +Converged at iteration 24, L1 8.80253e-05, Linf 0.00314087, total time[s] 0.080514 +Converged at iteration 30, L1 7.20865e-05, Linf 0.00560033, total time[s] 0.080623 +Converged at iteration 26, L1 8.61525e-05, Linf 0.00853322, total time[s] 0.067194 +Converged at iteration 23, L1 6.91995e-05, Linf 0.0063776, total time[s] 0.065276 +Converged at iteration 19, L1 6.42779e-05, Linf 0.00428535, total time[s] 0.062986 +Converged at iteration 20, L1 6.43455e-05, Linf 0.00425903, total time[s] 0.063459 +Converged at iteration 23, L1 9.89677e-05, Linf 0.00450768, total time[s] 0.108921 +Converged at iteration 25, L1 6.48398e-05, Linf 0.00578627, total time[s] 0.125819 +Converged at iteration 21, L1 5.86213e-05, Linf 0.00553321, total time[s] 0.09721 +Converged at iteration 16, L1 9.94266e-05, Linf 0.00684054, total time[s] 0.067596 +Converged at iteration 31, L1 8.08277e-05, Linf 0.00326864, total time[s] 0.091928 +Converged at iteration 19, L1 7.21753e-05, Linf 0.00522536, total time[s] 0.068191 +Converged at iteration 23, L1 6.48563e-05, Linf 0.00491977, total time[s] 0.060474 +Converged at iteration 26, L1 8.87482e-05, Linf 0.00550589, total time[s] 0.06805 +Converged at iteration 23, L1 5.89784e-05, Linf 0.00618105, total time[s] 0.075894 +Converged at iteration 21, L1 7.44467e-05, Linf 0.00449107, total time[s] 0.06857 +Converged at iteration 23, L1 7.00879e-05, Linf 0.00193674, total time[s] 0.097753 +Converged at iteration 25, L1 8.83066e-05, Linf 0.0032546, total time[s] 0.073313 +Converged at iteration 28, L1 9.55253e-05, Linf 0.00558528, total time[s] 0.112109 +Converged at iteration 30, L1 5.13325e-05, Linf 0.00428681, total time[s] 0.095643 +Converged at iteration 27, L1 9.84052e-05, Linf 0.00363201, total time[s] 0.133542 +Converged at iteration 29, L1 9.81224e-05, Linf 0.00461348, total time[s] 0.10289 +Converged at iteration 29, L1 9.72518e-05, Linf 0.00291415, total time[s] 0.09077 +Converged at iteration 28, L1 8.4349e-05, Linf 0.00221241, total time[s] 0.106471 +Converged at iteration 32, L1 6.21462e-05, Linf 0.00625414, total time[s] 0.094277 +Converged at iteration 28, L1 6.94949e-05, Linf 0.00637671, total time[s] 0.077901 +Converged at iteration 25, L1 8.42378e-05, Linf 0.00420305, total time[s] 0.074768 +Converged at iteration 23, L1 9.56323e-05, Linf 0.00265302, total time[s] 0.073807 +Converged at iteration 38, L1 8.9824e-05, Linf 0.00709535, total time[s] 0.098948 +Converged at iteration 35, L1 5.49824e-05, Linf 0.00581924, total time[s] 0.110424 +Converged at iteration 24, L1 9.11165e-05, Linf 0.00326078, total time[s] 0.066308 +Converged at iteration 30, L1 6.65394e-05, Linf 0.0055426, total time[s] 0.084156 +Converged at iteration 26, L1 9.20284e-05, Linf 0.00911502, total time[s] 0.081542 +Converged at iteration 23, L1 8.57862e-05, Linf 0.00737078, total time[s] 0.0695 +Converged at iteration 19, L1 6.85859e-05, Linf 0.00453429, total time[s] 0.077377 +Converged at iteration 20, L1 6.16028e-05, Linf 0.00407903, total time[s] 0.10573 +Converged at iteration 23, L1 9.40688e-05, Linf 0.00452794, total time[s] 0.08507 +Converged at iteration 25, L1 6.80494e-05, Linf 0.0060663, total time[s] 0.115361 +Converged at iteration 21, L1 6.37477e-05, Linf 0.00569032, total time[s] 0.088707 +Converged at iteration 17, L1 5.4803e-05, Linf 0.00482653, total time[s] 0.049442 +Converged at iteration 31, L1 7.78292e-05, Linf 0.00336169, total time[s] 0.079215 +Converged at iteration 19, L1 6.28959e-05, Linf 0.00485132, total time[s] 0.050282 +Converged at iteration 22, L1 9.33659e-05, Linf 0.00526238, total time[s] 0.058714 +Converged at iteration 26, L1 9.11985e-05, Linf 0.00540814, total time[s] 0.067529 +Converged at iteration 23, L1 6.06058e-05, Linf 0.00625848, total time[s] 0.062823 +Converged at iteration 21, L1 8.033e-05, Linf 0.0044359, total time[s] 0.060278 +Converged at iteration 23, L1 6.85065e-05, Linf 0.00525446, total time[s] 0.072131 +Converged at iteration 25, L1 8.72122e-05, Linf 0.00312375, total time[s] 0.077539 +Converged at iteration 28, L1 9.9068e-05, Linf 0.00596601, total time[s] 0.094316 +Converged at iteration 30, L1 5.41148e-05, Linf 0.00423239, total time[s] 0.085976 +Converged at iteration 28, L1 6.06679e-05, Linf 0.00425115, total time[s] 0.074313 +Converged at iteration 30, L1 6.2861e-05, Linf 0.00390115, total time[s] 0.077806 +Converged at iteration 29, L1 9.74679e-05, Linf 0.00290305, total time[s] 0.078276 +Converged at iteration 28, L1 8.75703e-05, Linf 0.00221311, total time[s] 0.085125 +Converged at iteration 31, L1 9.50583e-05, Linf 0.00753112, total time[s] 0.094713 +Converged at iteration 28, L1 7.8374e-05, Linf 0.00703379, total time[s] 0.092918 +Converged at iteration 25, L1 9.51605e-05, Linf 0.00498177, total time[s] 0.075061 +Converged at iteration 24, L1 5.63074e-05, Linf 0.00200253, total time[s] 0.069098 +Converged at iteration 38, L1 7.89402e-05, Linf 0.00684936, total time[s] 0.100229 +Converged at iteration 34, L1 9.09848e-05, Linf 0.00702649, total time[s] 0.110357 +Converged at iteration 24, L1 9.29082e-05, Linf 0.00335766, total time[s] 0.067175 +Converged at iteration 30, L1 6.58009e-05, Linf 0.00547059, total time[s] 0.085059 +Converged at iteration 26, L1 9.95549e-05, Linf 0.00968632, total time[s] 0.071861 +Converged at iteration 24, L1 5.44464e-05, Linf 0.00675471, total time[s] 0.105371 +Converged at iteration 19, L1 7.41726e-05, Linf 0.00497207, total time[s] 0.066585 +Converged at iteration 20, L1 5.80932e-05, Linf 0.00390904, total time[s] 0.109633 +Converged at iteration 23, L1 9.18034e-05, Linf 0.00455469, total time[s] 0.117904 +Converged at iteration 25, L1 7.16759e-05, Linf 0.00629571, total time[s] 0.084049 +Converged at iteration 21, L1 6.83192e-05, Linf 0.00588709, total time[s] 0.063722 +Converged at iteration 17, L1 5.57521e-05, Linf 0.004974, total time[s] 0.069042 +Converged at iteration 31, L1 7.57022e-05, Linf 0.00347388, total time[s] 0.090711 +Converged at iteration 18, L1 9.09519e-05, Linf 0.00570544, total time[s] 0.058861 +Converged at iteration 22, L1 8.42105e-05, Linf 0.00482179, total time[s] 0.075074 +Converged at iteration 26, L1 9.48868e-05, Linf 0.00531341, total time[s] 0.090614 +Converged at iteration 23, L1 6.29039e-05, Linf 0.00640183, total time[s] 0.061271 +Converged at iteration 21, L1 8.66885e-05, Linf 0.00430996, total time[s] 0.057854 +Converged at iteration 23, L1 6.4374e-05, Linf 0.0017347, total time[s] 0.0651 +Converged at iteration 25, L1 8.42194e-05, Linf 0.00303921, total time[s] 0.066122 +Converged at iteration 29, L1 6.66015e-05, Linf 0.00408378, total time[s] 0.081174 +Converged at iteration 30, L1 5.7091e-05, Linf 0.00428626, total time[s] 0.087967 +Converged at iteration 28, L1 6.3153e-05, Linf 0.00419466, total time[s] 0.082079 +Converged at iteration 30, L1 6.49739e-05, Linf 0.00401883, total time[s] 0.077121 +Converged at iteration 29, L1 9.87002e-05, Linf 0.00290273, total time[s] 0.079577 +Converged at iteration 28, L1 9.21209e-05, Linf 0.00216103, total time[s] 0.075922 +Converged at iteration 31, L1 8.57192e-05, Linf 0.00741921, total time[s] 0.080168 +Converged at iteration 28, L1 8.72171e-05, Linf 0.00766757, total time[s] 0.074116 +Converged at iteration 26, L1 6.23179e-05, Linf 0.0044938, total time[s] 0.068627 +Converged at iteration 24, L1 5.94233e-05, Linf 0.00211832, total time[s] 0.075164 +Converged at iteration 38, L1 6.86639e-05, Linf 0.00662898, total time[s] 0.123043 +Converged at iteration 34, L1 8.21056e-05, Linf 0.00684641, total time[s] 0.105217 +Converged at iteration 24, L1 9.56194e-05, Linf 0.00343686, total time[s] 0.077965 +Converged at iteration 30, L1 5.79032e-05, Linf 0.00536499, total time[s] 0.089213 +Converged at iteration 27, L1 5.23292e-05, Linf 0.00804889, total time[s] 0.090488 +Converged at iteration 24, L1 6.31663e-05, Linf 0.00768741, total time[s] 0.088693 +Converged at iteration 19, L1 8.02826e-05, Linf 0.00556148, total time[s] 0.075587 +Converged at iteration 20, L1 5.45162e-05, Linf 0.00376816, total time[s] 0.122995 +Converged at iteration 23, L1 9.11457e-05, Linf 0.00460867, total time[s] 0.085235 +Converged at iteration 25, L1 7.44737e-05, Linf 0.00650286, total time[s] 0.0871 +Converged at iteration 21, L1 7.47346e-05, Linf 0.0059397, total time[s] 0.096115 +Converged at iteration 17, L1 5.63619e-05, Linf 0.00504549, total time[s] 0.064081 +Converged at iteration 31, L1 7.41943e-05, Linf 0.00358077, total time[s] 0.089472 +Converged at iteration 18, L1 7.58556e-05, Linf 0.00520988, total time[s] 0.058351 +Converged at iteration 22, L1 7.33034e-05, Linf 0.00432787, total time[s] 0.065687 +Converged at iteration 27, L1 5.53836e-05, Linf 0.00361625, total time[s] 0.077046 +Converged at iteration 23, L1 6.6449e-05, Linf 0.00648823, total time[s] 0.07056 +Converged at iteration 21, L1 9.32975e-05, Linf 0.00415141, total time[s] 0.05573 +Converged at iteration 22, L1 9.82813e-05, Linf 0.00269332, total time[s] 0.061088 +Converged at iteration 25, L1 8.06195e-05, Linf 0.00270725, total time[s] 0.06711 +Converged at iteration 29, L1 6.99387e-05, Linf 0.00540022, total time[s] 0.093912 +Converged at iteration 30, L1 6.24055e-05, Linf 0.00683966, total time[s] 0.075991 +Converged at iteration 28, L1 6.47963e-05, Linf 0.00425328, total time[s] 0.073774 +Converged at iteration 30, L1 6.64053e-05, Linf 0.00415072, total time[s] 0.100257 +Converged at iteration 29, L1 9.83494e-05, Linf 0.00293698, total time[s] 0.076351 +Converged at iteration 28, L1 9.82167e-05, Linf 0.00208247, total time[s] 0.073684 +Converged at iteration 31, L1 8.07901e-05, Linf 0.00731023, total time[s] 0.089126 +Converged at iteration 28, L1 9.55353e-05, Linf 0.00832073, total time[s] 0.082642 +Converged at iteration 26, L1 7.05373e-05, Linf 0.0051798, total time[s] 0.076703 +Converged at iteration 24, L1 6.36651e-05, Linf 0.00226197, total time[s] 0.062806 +Converged at iteration 38, L1 6.18338e-05, Linf 0.00647388, total time[s] 0.111411 +Converged at iteration 34, L1 7.73595e-05, Linf 0.00665401, total time[s] 0.116382 +Converged at iteration 24, L1 9.72122e-05, Linf 0.00349024, total time[s] 0.066005 +Converged at iteration 30, L1 5.53997e-05, Linf 0.0052483, total time[s] 0.079007 +Converged at iteration 27, L1 5.5632e-05, Linf 0.00832467, total time[s] 0.073987 +Converged at iteration 24, L1 7.27255e-05, Linf 0.00864638, total time[s] 0.095964 +Converged at iteration 19, L1 8.62869e-05, Linf 0.00497383, total time[s] 0.063888 +Converged at iteration 20, L1 5.14946e-05, Linf 0.00345725, total time[s] 0.077807 +Converged at iteration 23, L1 9.054e-05, Linf 0.00465825, total time[s] 0.076479 +Converged at iteration 25, L1 7.87887e-05, Linf 0.00666051, total time[s] 0.102032 +Converged at iteration 21, L1 7.75592e-05, Linf 0.00597984, total time[s] 0.095642 +Converged at iteration 17, L1 5.66206e-05, Linf 0.00504833, total time[s] 0.077037 +Converged at iteration 31, L1 7.26615e-05, Linf 0.00367555, total time[s] 0.093638 +Converged at iteration 17, L1 9.97117e-05, Linf 0.00660379, total time[s] 0.051275 +Converged at iteration 21, L1 9.61056e-05, Linf 0.00451242, total time[s] 0.066046 +Converged at iteration 27, L1 5.48431e-05, Linf 0.00245826, total time[s] 0.099667 +Converged at iteration 23, L1 6.99292e-05, Linf 0.00660597, total time[s] 0.064153 +Converged at iteration 21, L1 9.99666e-05, Linf 0.00415114, total time[s] 0.06165 +Converged at iteration 22, L1 9.05367e-05, Linf 0.00279925, total time[s] 0.067212 +Converged at iteration 25, L1 7.77271e-05, Linf 0.00254907, total time[s] 0.086103 +Converged at iteration 29, L1 7.03053e-05, Linf 0.00470447, total time[s] 0.108995 +Converged at iteration 30, L1 6.42724e-05, Linf 0.00445567, total time[s] 0.100551 +Converged at iteration 28, L1 6.65708e-05, Linf 0.00364741, total time[s] 0.075318 +Converged at iteration 30, L1 6.9011e-05, Linf 0.00429577, total time[s] 0.077145 +Converged at iteration 29, L1 9.85787e-05, Linf 0.00294305, total time[s] 0.083402 +Converged at iteration 29, L1 6.27676e-05, Linf 0.00136374, total time[s] 0.087925 +Converged at iteration 31, L1 7.28069e-05, Linf 0.00710191, total time[s] 0.090495 +Converged at iteration 29, L1 5.17424e-05, Linf 0.00715602, total time[s] 0.080441 +Converged at iteration 26, L1 7.9257e-05, Linf 0.00584496, total time[s] 0.079997 +Converged at iteration 24, L1 6.67822e-05, Linf 0.00237911, total time[s] 0.085216 +Converged at iteration 38, L1 5.73977e-05, Linf 0.00621767, total time[s] 0.104662 +Converged at iteration 34, L1 7.40916e-05, Linf 0.00648192, total time[s] 0.103267 +Converged at iteration 24, L1 9.80038e-05, Linf 0.00352903, total time[s] 0.077618 +Converged at iteration 29, L1 9.66568e-05, Linf 0.00678025, total time[s] 0.075959 +Converged at iteration 27, L1 5.84226e-05, Linf 0.00892935, total time[s] 0.072656 +Converged at iteration 24, L1 8.17731e-05, Linf 0.00937663, total time[s] 0.073504 +Converged at iteration 19, L1 9.03916e-05, Linf 0.00481393, total time[s] 0.068615 +Converged at iteration 20, L1 4.8901e-05, Linf 0.00336345, total time[s] 0.099613 +Converged at iteration 23, L1 8.97818e-05, Linf 0.00471694, total time[s] 0.093842 +Converged at iteration 25, L1 8.27583e-05, Linf 0.00687875, total time[s] 0.085302 +Converged at iteration 21, L1 8.16125e-05, Linf 0.00615408, total time[s] 0.108873 +Converged at iteration 17, L1 5.68369e-05, Linf 0.00500263, total time[s] 0.07664 +Converged at iteration 31, L1 7.16587e-05, Linf 0.0038143, total time[s] 0.131121 +Converged at iteration 17, L1 7.47308e-05, Linf 0.00593372, total time[s] 0.05263 +Converged at iteration 21, L1 7.89548e-05, Linf 0.00379937, total time[s] 0.059082 +Converged at iteration 27, L1 5.52272e-05, Linf 0.00243034, total time[s] 0.072381 +Converged at iteration 23, L1 7.42077e-05, Linf 0.00673192, total time[s] 0.06436 +Converged at iteration 22, L1 5.78743e-05, Linf 0.00327531, total time[s] 0.061075 +Converged at iteration 22, L1 8.29455e-05, Linf 0.00287966, total time[s] 0.073896 +Converged at iteration 25, L1 7.45847e-05, Linf 0.00229933, total time[s] 0.070908 +Converged at iteration 29, L1 7.11283e-05, Linf 0.00491533, total time[s] 0.076966 +Converged at iteration 30, L1 6.85389e-05, Linf 0.00461256, total time[s] 0.077649 +Converged at iteration 28, L1 6.75409e-05, Linf 0.00363539, total time[s] 0.075109 +Converged at iteration 30, L1 7.17641e-05, Linf 0.0044452, total time[s] 0.080761 +Converged at iteration 29, L1 9.85215e-05, Linf 0.00293662, total time[s] 0.076457 +Converged at iteration 29, L1 6.4364e-05, Linf 0.00132403, total time[s] 0.075222 +Converged at iteration 31, L1 6.48107e-05, Linf 0.00690639, total time[s] 0.08499 +Converged at iteration 29, L1 5.56927e-05, Linf 0.00777223, total time[s] 0.080635 +Converged at iteration 26, L1 8.91502e-05, Linf 0.00666038, total time[s] 0.086267 +Converged at iteration 24, L1 7.05963e-05, Linf 0.00247737, total time[s] 0.07625 +Converged at iteration 38, L1 5.39556e-05, Linf 0.00595356, total time[s] 0.113955 +Converged at iteration 34, L1 7.02761e-05, Linf 0.00618418, total time[s] 0.099691 +Converged at iteration 24, L1 9.90745e-05, Linf 0.00357206, total time[s] 0.125733 +Converged at iteration 29, L1 9.41326e-05, Linf 0.00668354, total time[s] 0.090456 +Converged at iteration 27, L1 6.0222e-05, Linf 0.00937785, total time[s] 0.088346 +Converged at iteration 24, L1 9.139e-05, Linf 0.0102341, total time[s] 0.078365 +Converged at iteration 19, L1 9.71389e-05, Linf 0.00512005, total time[s] 0.076492 +Converged at iteration 20, L1 4.71912e-05, Linf 0.00336525, total time[s] 0.109524 +Converged at iteration 23, L1 9.04577e-05, Linf 0.00475922, total time[s] 0.085222 +Converged at iteration 25, L1 8.40532e-05, Linf 0.00704975, total time[s] 0.091187 +Converged at iteration 21, L1 8.3814e-05, Linf 0.00594489, total time[s] 0.092342 +Converged at iteration 17, L1 5.67229e-05, Linf 0.00491053, total time[s] 0.063769 +Converged at iteration 31, L1 7.00837e-05, Linf 0.0039795, total time[s] 0.096339 +Converged at iteration 17, L1 5.6944e-05, Linf 0.00523881, total time[s] 0.051194 +Converged at iteration 20, L1 9.45816e-05, Linf 0.0038005, total time[s] 0.075996 +Converged at iteration 27, L1 5.85766e-05, Linf 0.00248221, total time[s] 0.086359 +Converged at iteration 23, L1 7.74714e-05, Linf 0.00685836, total time[s] 0.071182 +Converged at iteration 22, L1 6.17405e-05, Linf 0.00351244, total time[s] 0.066047 +Converged at iteration 22, L1 7.7432e-05, Linf 0.00297014, total time[s] 0.078894 +Converged at iteration 25, L1 7.13733e-05, Linf 0.00196263, total time[s] 0.06686 +Converged at iteration 29, L1 7.07881e-05, Linf 0.00502008, total time[s] 0.089824 +Converged at iteration 30, L1 7.21962e-05, Linf 0.00485696, total time[s] 0.085324 +Converged at iteration 28, L1 6.85136e-05, Linf 0.00363292, total time[s] 0.084528 +Converged at iteration 30, L1 7.46014e-05, Linf 0.00460552, total time[s] 0.085234 +Converged at iteration 29, L1 9.93459e-05, Linf 0.00296588, total time[s] 0.087227 +Converged at iteration 29, L1 6.79445e-05, Linf 0.00127929, total time[s] 0.082495 +Converged at iteration 31, L1 5.72027e-05, Linf 0.00680394, total time[s] 0.102287 +Converged at iteration 29, L1 5.96674e-05, Linf 0.0083358, total time[s] 0.083918 +Converged at iteration 27, L1 5.33109e-05, Linf 0.00573771, total time[s] 0.073645 +Converged at iteration 24, L1 7.46581e-05, Linf 0.00261632, total time[s] 0.064959 +Converged at iteration 37, L1 9.59705e-05, Linf 0.0070534, total time[s] 0.100607 +Converged at iteration 34, L1 6.62288e-05, Linf 0.00581773, total time[s] 0.112982 +Converged at iteration 25, L1 4.21916e-05, Linf 0.00209563, total time[s] 0.09077 +Converged at iteration 29, L1 8.85061e-05, Linf 0.00654455, total time[s] 0.090578 +Converged at iteration 27, L1 6.26456e-05, Linf 0.00985073, total time[s] 0.082435 +Converged at iteration 25, L1 4.42613e-05, Linf 0.0089186, total time[s] 0.078263 +Converged at iteration 20, L1 4.14122e-05, Linf 0.00377572, total time[s] 0.070537 +Converged at iteration 20, L1 4.55929e-05, Linf 0.0033654, total time[s] 0.09943 +Converged at iteration 23, L1 9.16996e-05, Linf 0.00479476, total time[s] 0.101507 +Converged at iteration 25, L1 8.70817e-05, Linf 0.00719353, total time[s] 0.097027 +Converged at iteration 21, L1 8.5702e-05, Linf 0.00600037, total time[s] 0.07833 +Converged at iteration 17, L1 5.74956e-05, Linf 0.00476685, total time[s] 0.095357 +Converged at iteration 31, L1 6.81891e-05, Linf 0.00413212, total time[s] 0.097175 +Converged at iteration 16, L1 9.34366e-05, Linf 0.00753242, total time[s] 0.046994 +Converged at iteration 20, L1 6.65657e-05, Linf 0.00282854, total time[s] 0.054699 +Converged at iteration 27, L1 5.94084e-05, Linf 0.00264025, total time[s] 0.073388 +Converged at iteration 23, L1 8.13692e-05, Linf 0.00699415, total time[s] 0.064398 +Converged at iteration 22, L1 6.67981e-05, Linf 0.00324624, total time[s] 0.062833 +Converged at iteration 22, L1 8.21262e-05, Linf 0.00310182, total time[s] 0.076952 +Converged at iteration 25, L1 6.86753e-05, Linf 0.00221458, total time[s] 0.101705 +Converged at iteration 29, L1 7.14649e-05, Linf 0.00505698, total time[s] 0.083022 +Converged at iteration 30, L1 7.59767e-05, Linf 0.00504641, total time[s] 0.089799 +Converged at iteration 28, L1 6.88224e-05, Linf 0.00373601, total time[s] 0.08024 +Converged at iteration 30, L1 7.74777e-05, Linf 0.00477927, total time[s] 0.088952 +Converged at iteration 30, L1 6.31791e-05, Linf 0.00227775, total time[s] 0.082276 +Converged at iteration 29, L1 7.39496e-05, Linf 0.00127221, total time[s] 0.084321 +Converged at iteration 30, L1 9.513e-05, Linf 0.00849973, total time[s] 0.10327 +Converged at iteration 29, L1 6.46804e-05, Linf 0.00895594, total time[s] 0.091161 +Converged at iteration 27, L1 6.03152e-05, Linf 0.00642237, total time[s] 0.074507 +Converged at iteration 24, L1 7.91434e-05, Linf 0.00272327, total time[s] 0.070022 +Converged at iteration 37, L1 9.03103e-05, Linf 0.00674905, total time[s] 0.123668 +Converged at iteration 34, L1 6.14356e-05, Linf 0.00556008, total time[s] 0.130076 +Converged at iteration 25, L1 4.35972e-05, Linf 0.00209173, total time[s] 0.083089 +Converged at iteration 29, L1 8.29272e-05, Linf 0.00647708, total time[s] 0.096699 +Converged at iteration 27, L1 6.494e-05, Linf 0.0103473, total time[s] 0.085014 +Converged at iteration 25, L1 4.91282e-05, Linf 0.00989675, total time[s] 0.130764 +Converged at iteration 20, L1 4.50863e-05, Linf 0.00405246, total time[s] 0.071924 +Converged at iteration 20, L1 4.34257e-05, Linf 0.00338261, total time[s] 0.075743 +Converged at iteration 23, L1 9.25566e-05, Linf 0.00486258, total time[s] 0.098275 +Converged at iteration 25, L1 8.85855e-05, Linf 0.00734164, total time[s] 0.106074 +Converged at iteration 21, L1 8.56622e-05, Linf 0.00598843, total time[s] 0.063949 +Converged at iteration 17, L1 5.86877e-05, Linf 0.00457541, total time[s] 0.046285 +Converged at iteration 31, L1 6.61762e-05, Linf 0.00433166, total time[s] 0.08165 +Converged at iteration 16, L1 9.88159e-05, Linf 0.00665014, total time[s] 0.045192 +Converged at iteration 18, L1 9.97352e-05, Linf 0.00391199, total time[s] 0.04957 +Converged at iteration 27, L1 6.36594e-05, Linf 0.00281623, total time[s] 0.072532 +Converged at iteration 23, L1 8.62089e-05, Linf 0.00716339, total time[s] 0.06105 +Converged at iteration 22, L1 7.09892e-05, Linf 0.00358686, total time[s] 0.064071 +Converged at iteration 22, L1 8.93128e-05, Linf 0.00328548, total time[s] 0.059852 +Converged at iteration 24, L1 9.79395e-05, Linf 0.00196444, total time[s] 0.089849 +Converged at iteration 29, L1 7.22224e-05, Linf 0.00509217, total time[s] 0.093587 +Converged at iteration 30, L1 8.16135e-05, Linf 0.00798998, total time[s] 0.094806 +Converged at iteration 28, L1 6.90155e-05, Linf 0.00370898, total time[s] 0.07319 +Converged at iteration 30, L1 8.12534e-05, Linf 0.00489377, total time[s] 0.0808 +Converged at iteration 30, L1 6.49273e-05, Linf 0.00232072, total time[s] 0.077879 +Converged at iteration 29, L1 7.74092e-05, Linf 0.00133675, total time[s] 0.129453 +Converged at iteration 30, L1 8.70141e-05, Linf 0.00835495, total time[s] 0.079309 +Converged at iteration 29, L1 7.18908e-05, Linf 0.00962132, total time[s] 0.079058 +Converged at iteration 27, L1 6.90271e-05, Linf 0.0071537, total time[s] 0.096262 +Converged at iteration 24, L1 8.31679e-05, Linf 0.00284264, total time[s] 0.07599 +Converged at iteration 37, L1 8.44067e-05, Linf 0.00646098, total time[s] 0.100852 +Converged at iteration 34, L1 5.62903e-05, Linf 0.00535442, total time[s] 0.102925 +Converged at iteration 25, L1 4.53933e-05, Linf 0.00209953, total time[s] 0.08915 +Converged at iteration 29, L1 7.4233e-05, Linf 0.00635213, total time[s] 0.08071 +Converged at iteration 27, L1 6.717e-05, Linf 0.0108617, total time[s] 0.070836 +Converged at iteration 25, L1 5.48655e-05, Linf 0.010662, total time[s] 0.085268 +Converged at iteration 20, L1 4.91563e-05, Linf 0.0042225, total time[s] 0.084465 +Converged at iteration 20, L1 4.15404e-05, Linf 0.00337594, total time[s] 0.102603 +Converged at iteration 23, L1 9.45973e-05, Linf 0.0048878, total time[s] 0.094552 +Converged at iteration 25, L1 9.0086e-05, Linf 0.00750796, total time[s] 0.092672 +Converged at iteration 21, L1 8.62927e-05, Linf 0.00610559, total time[s] 0.072121 +Converged at iteration 17, L1 6.07439e-05, Linf 0.00442865, total time[s] 0.065314 +Converged at iteration 31, L1 6.36799e-05, Linf 0.0045337, total time[s] 0.080329 +Converged at iteration 17, L1 7.82046e-05, Linf 0.00307971, total time[s] 0.047352 +Converged at iteration 18, L1 8.10948e-05, Linf 0.00253759, total time[s] 0.050892 +Converged at iteration 27, L1 6.6665e-05, Linf 0.00297777, total time[s] 0.07676 +Converged at iteration 23, L1 9.17031e-05, Linf 0.00741395, total time[s] 0.064604 +Converged at iteration 22, L1 7.52379e-05, Linf 0.00389217, total time[s] 0.061588 +Converged at iteration 22, L1 9.85434e-05, Linf 0.00357753, total time[s] 0.058048 +Converged at iteration 24, L1 9.15058e-05, Linf 0.00161201, total time[s] 0.063898 +Converged at iteration 29, L1 7.26083e-05, Linf 0.0050518, total time[s] 0.074892 +Converged at iteration 30, L1 8.44854e-05, Linf 0.0055675, total time[s] 0.077863 +Converged at iteration 28, L1 6.90156e-05, Linf 0.00332074, total time[s] 0.073399 +Converged at iteration 30, L1 8.4536e-05, Linf 0.00515593, total time[s] 0.091259 +Converged at iteration 30, L1 6.76249e-05, Linf 0.00235966, total time[s] 0.083801 +Converged at iteration 29, L1 8.45772e-05, Linf 0.00154433, total time[s] 0.082982 +Converged at iteration 30, L1 7.9929e-05, Linf 0.00821501, total time[s] 0.092261 +Converged at iteration 29, L1 7.88319e-05, Linf 0.0103325, total time[s] 0.08965 +Converged at iteration 27, L1 7.93135e-05, Linf 0.00790958, total time[s] 0.085103 +Converged at iteration 24, L1 8.79993e-05, Linf 0.00296072, total time[s] 0.067507 +Converged at iteration 37, L1 7.86079e-05, Linf 0.0062092, total time[s] 0.125538 +Converged at iteration 34, L1 5.15747e-05, Linf 0.00516443, total time[s] 0.111763 +Converged at iteration 25, L1 4.69877e-05, Linf 0.00205832, total time[s] 0.074956 +Converged at iteration 29, L1 6.65433e-05, Linf 0.00619117, total time[s] 0.083496 +Converged at iteration 27, L1 7.01168e-05, Linf 0.0113776, total time[s] 0.072647 +Converged at iteration 25, L1 6.12391e-05, Linf 0.0115847, total time[s] 0.113086 +Converged at iteration 20, L1 5.25755e-05, Linf 0.00443949, total time[s] 0.066813 +Converged at iteration 19, L1 9.56784e-05, Linf 0.00510305, total time[s] 0.120572 +Converged at iteration 23, L1 9.59949e-05, Linf 0.00488189, total time[s] 0.108824 +Converged at iteration 25, L1 8.23107e-05, Linf 0.00765293, total time[s] 0.110493 +Converged at iteration 21, L1 8.55511e-05, Linf 0.00598536, total time[s] 0.096968 +Converged at iteration 17, L1 6.27415e-05, Linf 0.00407814, total time[s] 0.066357 +Converged at iteration 31, L1 6.09399e-05, Linf 0.00478926, total time[s] 0.092053 +Converged at iteration 18, L1 7.18621e-05, Linf 0.00155593, total time[s] 0.05406 +Converged at iteration 19, L1 7.03013e-05, Linf 0.00156867, total time[s] 0.053537 +Converged at iteration 27, L1 7.01952e-05, Linf 0.00311491, total time[s] 0.071759 +Converged at iteration 23, L1 9.74948e-05, Linf 0.00780106, total time[s] 0.063142 +Converged at iteration 22, L1 7.89082e-05, Linf 0.00425948, total time[s] 0.080391 +Converged at iteration 23, L1 6.51092e-05, Linf 0.00279551, total time[s] 0.078002 +Converged at iteration 24, L1 8.52165e-05, Linf 0.00162311, total time[s] 0.082383 +Converged at iteration 29, L1 7.36253e-05, Linf 0.00507482, total time[s] 0.085088 +Converged at iteration 30, L1 8.9467e-05, Linf 0.00578715, total time[s] 0.078127 +Converged at iteration 28, L1 6.93357e-05, Linf 0.00318124, total time[s] 0.099134 +Converged at iteration 30, L1 8.9845e-05, Linf 0.00539226, total time[s] 0.098086 +Converged at iteration 30, L1 7.17686e-05, Linf 0.0024005, total time[s] 0.091328 +Converged at iteration 29, L1 9.41071e-05, Linf 0.00173302, total time[s] 0.087319 +Converged at iteration 30, L1 7.4961e-05, Linf 0.00807254, total time[s] 0.119731 +Converged at iteration 29, L1 8.73437e-05, Linf 0.0110977, total time[s] 0.087113 +Converged at iteration 27, L1 9.15759e-05, Linf 0.00868929, total time[s] 0.099591 +Converged at iteration 24, L1 9.11614e-05, Linf 0.00308737, total time[s] 0.079355 +Converged at iteration 37, L1 7.26503e-05, Linf 0.00599437, total time[s] 0.112664 +Converged at iteration 33, L1 9.76144e-05, Linf 0.00626909, total time[s] 0.106695 +Converged at iteration 25, L1 4.75554e-05, Linf 0.00202919, total time[s] 0.080006 +Converged at iteration 29, L1 6.04452e-05, Linf 0.00596138, total time[s] 0.089757 +Converged at iteration 27, L1 7.38044e-05, Linf 0.0118754, total time[s] 0.095895 +Converged at iteration 25, L1 6.77049e-05, Linf 0.0124446, total time[s] 0.092432 +Converged at iteration 20, L1 5.59781e-05, Linf 0.0046831, total time[s] 0.094046 +Converged at iteration 19, L1 8.79323e-05, Linf 0.00512188, total time[s] 0.086213 +Converged at iteration 23, L1 9.96184e-05, Linf 0.00490009, total time[s] 0.078548 +Converged at iteration 25, L1 7.08288e-05, Linf 0.00778465, total time[s] 0.101893 +Converged at iteration 21, L1 8.48349e-05, Linf 0.0059218, total time[s] 0.080075 +Converged at iteration 17, L1 6.64065e-05, Linf 0.00375964, total time[s] 0.05931 +Converged at iteration 31, L1 5.82319e-05, Linf 0.00504372, total time[s] 0.106969 +Converged at iteration 18, L1 9.17006e-05, Linf 0.00212251, total time[s] 0.070852 +Converged at iteration 20, L1 6.67225e-05, Linf 0.00208172, total time[s] 0.074865 +Converged at iteration 27, L1 7.49184e-05, Linf 0.00329897, total time[s] 0.07532 +Converged at iteration 24, L1 4.78762e-05, Linf 0.00379879, total time[s] 0.069589 +Converged at iteration 22, L1 8.38517e-05, Linf 0.00462713, total time[s] 0.062022 +Converged at iteration 23, L1 7.26057e-05, Linf 0.00281524, total time[s] 0.073349 +Converged at iteration 24, L1 7.82454e-05, Linf 0.00163625, total time[s] 0.067311 +Converged at iteration 29, L1 7.26856e-05, Linf 0.00512165, total time[s] 0.090725 +Converged at iteration 30, L1 9.43531e-05, Linf 0.00609452, total time[s] 0.079798 +Converged at iteration 28, L1 6.89462e-05, Linf 0.00290982, total time[s] 0.080071 +Converged at iteration 30, L1 9.21503e-05, Linf 0.0055918, total time[s] 0.076446 +Converged at iteration 30, L1 7.1761e-05, Linf 0.00245124, total time[s] 0.075572 +Converged at iteration 29, L1 9.91384e-05, Linf 0.00191114, total time[s] 0.075011 +Converged at iteration 30, L1 6.97175e-05, Linf 0.00791774, total time[s] 0.083445 +Converged at iteration 29, L1 9.36927e-05, Linf 0.0119066, total time[s] 0.117595 +Converged at iteration 28, L1 4.75557e-05, Linf 0.00745378, total time[s] 0.079288 +Converged at iteration 24, L1 9.65681e-05, Linf 0.00323419, total time[s] 0.067513 +Converged at iteration 37, L1 6.66373e-05, Linf 0.00581057, total time[s] 0.116459 +Converged at iteration 33, L1 9.15812e-05, Linf 0.00601056, total time[s] 0.112769 +Converged at iteration 25, L1 5.01869e-05, Linf 0.00200483, total time[s] 0.111292 +Converged at iteration 29, L1 5.64882e-05, Linf 0.00580364, total time[s] 0.082631 +Converged at iteration 27, L1 7.71011e-05, Linf 0.0123071, total time[s] 0.087899 +Converged at iteration 25, L1 7.48722e-05, Linf 0.0131415, total time[s] 0.105059 +Converged at iteration 20, L1 5.97791e-05, Linf 0.00503956, total time[s] 0.083001 +Converged at iteration 19, L1 7.98296e-05, Linf 0.00513624, total time[s] 0.091692 +Converged at iteration 24, L1 5.36695e-05, Linf 0.00302667, total time[s] 0.08711 +Converged at iteration 25, L1 5.92803e-05, Linf 0.00785121, total time[s] 0.08738 +Converged at iteration 21, L1 8.41871e-05, Linf 0.00589296, total time[s] 0.064394 +Converged at iteration 17, L1 7.08162e-05, Linf 0.00338527, total time[s] 0.04759 +Converged at iteration 31, L1 5.73592e-05, Linf 0.0053, total time[s] 0.084826 +Converged at iteration 19, L1 7.23504e-05, Linf 0.00273548, total time[s] 0.053291 +Converged at iteration 20, L1 9.25474e-05, Linf 0.00296882, total time[s] 0.055152 +Converged at iteration 27, L1 7.70824e-05, Linf 0.00349838, total time[s] 0.070574 +Converged at iteration 24, L1 5.24803e-05, Linf 0.00402386, total time[s] 0.063395 +Converged at iteration 22, L1 8.85317e-05, Linf 0.00488524, total time[s] 0.058894 +Converged at iteration 23, L1 8.17457e-05, Linf 0.00300573, total time[s] 0.060682 +Converged at iteration 24, L1 7.08088e-05, Linf 0.00165007, total time[s] 0.063381 +Converged at iteration 29, L1 7.2778e-05, Linf 0.00516744, total time[s] 0.075409 +Converged at iteration 31, L1 5.24367e-05, Linf 0.00345169, total time[s] 0.079446 +Converged at iteration 28, L1 6.81802e-05, Linf 0.0029991, total time[s] 0.074794 +Converged at iteration 30, L1 9.76219e-05, Linf 0.0059189, total time[s] 0.080346 +Converged at iteration 30, L1 7.70289e-05, Linf 0.00252321, total time[s] 0.081394 +Converged at iteration 30, L1 5.65327e-05, Linf 0.00122026, total time[s] 0.078056 +Converged at iteration 30, L1 6.57155e-05, Linf 0.00773805, total time[s] 0.076853 +Converged at iteration 30, L1 3.99621e-05, Linf 0.00945496, total time[s] 0.07822 +Converged at iteration 28, L1 5.47328e-05, Linf 0.00818404, total time[s] 0.073752 +Converged at iteration 25, L1 5.42955e-05, Linf 0.00204289, total time[s] 0.070644 +Converged at iteration 37, L1 6.11372e-05, Linf 0.00564767, total time[s] 0.104594 +Converged at iteration 33, L1 8.65903e-05, Linf 0.00573239, total time[s] 0.097031 +Converged at iteration 25, L1 5.00842e-05, Linf 0.00205647, total time[s] 0.087965 +Converged at iteration 28, L1 9.67449e-05, Linf 0.0077033, total time[s] 0.074821 +Converged at iteration 27, L1 7.99425e-05, Linf 0.0126661, total time[s] 0.069866 +Converged at iteration 25, L1 8.09738e-05, Linf 0.0140889, total time[s] 0.072673 +Converged at iteration 20, L1 6.42167e-05, Linf 0.00542402, total time[s] 0.071863 +Converged at iteration 19, L1 7.48822e-05, Linf 0.0051584, total time[s] 0.071726 +Converged at iteration 24, L1 5.37946e-05, Linf 0.0029989, total time[s] 0.078166 +Converged at iteration 25, L1 4.92699e-05, Linf 0.00784157, total time[s] 0.108886 +Converged at iteration 21, L1 8.10913e-05, Linf 0.0058764, total time[s] 0.069295 +Converged at iteration 17, L1 7.70331e-05, Linf 0.00295083, total time[s] 0.069665 +Converged at iteration 31, L1 5.65393e-05, Linf 0.00560855, total time[s] 0.112692 +Converged at iteration 19, L1 8.41391e-05, Linf 0.00333798, total time[s] 0.058547 +Converged at iteration 21, L1 7.73498e-05, Linf 0.00353596, total time[s] 0.061388 +Converged at iteration 27, L1 8.18423e-05, Linf 0.0036191, total time[s] 0.080527 +Converged at iteration 24, L1 5.8825e-05, Linf 0.00422193, total time[s] 0.069396 +Converged at iteration 22, L1 9.31459e-05, Linf 0.00513597, total time[s] 0.065194 +Converged at iteration 23, L1 9.26653e-05, Linf 0.00354971, total time[s] 0.069657 +Converged at iteration 23, L1 9.0515e-05, Linf 0.00243259, total time[s] 0.07504 +Converged at iteration 29, L1 7.14683e-05, Linf 0.00523084, total time[s] 0.092059 +Converged at iteration 31, L1 5.60615e-05, Linf 0.0037755, total time[s] 0.097547 +Converged at iteration 28, L1 6.68127e-05, Linf 0.00279431, total time[s] 0.077644 +Converged at iteration 30, L1 9.97667e-05, Linf 0.00611341, total time[s] 0.077784 +Converged at iteration 30, L1 7.84838e-05, Linf 0.00264082, total time[s] 0.079175 +Converged at iteration 30, L1 6.14664e-05, Linf 0.0013124, total time[s] 0.078426 +Converged at iteration 30, L1 6.23978e-05, Linf 0.00753121, total time[s] 0.076775 +Converged at iteration 30, L1 4.42825e-05, Linf 0.0100739, total time[s] 0.077368 +Converged at iteration 28, L1 6.20609e-05, Linf 0.00892607, total time[s] 0.084573 +Converged at iteration 25, L1 5.50083e-05, Linf 0.00207754, total time[s] 0.066038 +Converged at iteration 37, L1 5.57549e-05, Linf 0.00550077, total time[s] 0.102693 +Converged at iteration 33, L1 8.30125e-05, Linf 0.00542953, total time[s] 0.095531 +Converged at iteration 25, L1 5.25067e-05, Linf 0.00212452, total time[s] 0.075477 +Converged at iteration 28, L1 9.41081e-05, Linf 0.00763929, total time[s] 0.069672 +Converged at iteration 27, L1 8.44643e-05, Linf 0.0129762, total time[s] 0.06731 +Converged at iteration 25, L1 8.80581e-05, Linf 0.0149017, total time[s] 0.062622 +Converged at iteration 20, L1 6.89685e-05, Linf 0.00582374, total time[s] 0.062301 +Converged at iteration 19, L1 7.11528e-05, Linf 0.00516775, total time[s] 0.058387 +Converged at iteration 24, L1 5.46871e-05, Linf 0.00295996, total time[s] 0.069689 +Converged at iteration 24, L1 9.52199e-05, Linf 0.0104601, total time[s] 0.104933 +Converged at iteration 21, L1 7.99191e-05, Linf 0.0058983, total time[s] 0.058754 +Converged at iteration 17, L1 8.45234e-05, Linf 0.00250658, total time[s] 0.048185 +Converged at iteration 31, L1 5.73986e-05, Linf 0.00591162, total time[s] 0.104641 +Converged at iteration 20, L1 6.11128e-05, Linf 0.00361676, total time[s] 0.064057 +Converged at iteration 21, L1 9.44707e-05, Linf 0.00497878, total time[s] 0.073641 +Converged at iteration 27, L1 8.01408e-05, Linf 0.00490548, total time[s] 0.072443 +Converged at iteration 24, L1 6.19985e-05, Linf 0.00438498, total time[s] 0.063856 +Converged at iteration 22, L1 9.85531e-05, Linf 0.00530154, total time[s] 0.05915 +Converged at iteration 24, L1 5.93334e-05, Linf 0.00485842, total time[s] 0.062015 +Converged at iteration 23, L1 8.23071e-05, Linf 0.00242965, total time[s] 0.059064 +Converged at iteration 29, L1 7.01567e-05, Linf 0.00523986, total time[s] 0.075456 +Converged at iteration 31, L1 6.03695e-05, Linf 0.00391724, total time[s] 0.078364 +Converged at iteration 28, L1 6.53932e-05, Linf 0.00274684, total time[s] 0.071631 +Converged at iteration 31, L1 5.59492e-05, Linf 0.00483983, total time[s] 0.07892 +Converged at iteration 30, L1 8.12637e-05, Linf 0.00279738, total time[s] 0.11092 +Converged at iteration 30, L1 6.5784e-05, Linf 0.00142229, total time[s] 0.085623 +Converged at iteration 30, L1 5.96466e-05, Linf 0.00730057, total time[s] 0.077224 +Converged at iteration 30, L1 4.81723e-05, Linf 0.0107853, total time[s] 0.077895 +Converged at iteration 28, L1 7.03039e-05, Linf 0.00969024, total time[s] 0.071944 +Converged at iteration 25, L1 5.66954e-05, Linf 0.00213257, total time[s] 0.065424 +Converged at iteration 36, L1 9.56498e-05, Linf 0.00662532, total time[s] 0.091725 +Converged at iteration 33, L1 8.08542e-05, Linf 0.00512648, total time[s] 0.088318 +Converged at iteration 25, L1 5.41953e-05, Linf 0.0022129, total time[s] 0.07926 +Converged at iteration 28, L1 8.61339e-05, Linf 0.00761078, total time[s] 0.076361 +Converged at iteration 27, L1 8.38002e-05, Linf 0.0125038, total time[s] 0.06879 +Converged at iteration 25, L1 9.62031e-05, Linf 0.0158165, total time[s] 0.064559 +Converged at iteration 20, L1 7.3973e-05, Linf 0.00664229, total time[s] 0.068623 +Converged at iteration 19, L1 6.91435e-05, Linf 0.00518827, total time[s] 0.061661 +Converged at iteration 24, L1 5.5325e-05, Linf 0.00292027, total time[s] 0.06786 +Converged at iteration 24, L1 8.04151e-05, Linf 0.0104815, total time[s] 0.076643 +Converged at iteration 21, L1 7.47791e-05, Linf 0.00589386, total time[s] 0.064418 +Converged at iteration 17, L1 9.39168e-05, Linf 0.00215681, total time[s] 0.055032 +Converged at iteration 31, L1 5.96717e-05, Linf 0.00625037, total time[s] 0.109767 +Converged at iteration 20, L1 7.18293e-05, Linf 0.00453126, total time[s] 0.054842 +Converged at iteration 22, L1 6.36106e-05, Linf 0.00429446, total time[s] 0.061856 +Converged at iteration 27, L1 8.40403e-05, Linf 0.00382131, total time[s] 0.07229 +Converged at iteration 24, L1 6.5326e-05, Linf 0.00452573, total time[s] 0.063729 +Converged at iteration 23, L1 5.69719e-05, Linf 0.00417545, total time[s] 0.05971 +Converged at iteration 24, L1 6.56493e-05, Linf 0.00341199, total time[s] 0.063327 +Converged at iteration 23, L1 7.58753e-05, Linf 0.00285279, total time[s] 0.059938 +Converged at iteration 29, L1 6.74597e-05, Linf 0.00526337, total time[s] 0.074438 +Converged at iteration 31, L1 6.97178e-05, Linf 0.00416753, total time[s] 0.078563 +Converged at iteration 28, L1 6.43682e-05, Linf 0.00272371, total time[s] 0.07216 +Converged at iteration 31, L1 5.68851e-05, Linf 0.00516625, total time[s] 0.079456 +Converged at iteration 30, L1 8.44514e-05, Linf 0.00283847, total time[s] 0.076372 +Converged at iteration 30, L1 6.72943e-05, Linf 0.00163304, total time[s] 0.077207 +Converged at iteration 30, L1 5.78163e-05, Linf 0.00698791, total time[s] 0.076589 +Converged at iteration 30, L1 5.26658e-05, Linf 0.0116234, total time[s] 0.076344 +Converged at iteration 28, L1 7.9251e-05, Linf 0.0105181, total time[s] 0.07212 +Converged at iteration 25, L1 5.66714e-05, Linf 0.00219377, total time[s] 0.064998 +Converged at iteration 36, L1 8.88685e-05, Linf 0.00664354, total time[s] 0.092319 +Converged at iteration 33, L1 8.03554e-05, Linf 0.00488153, total time[s] 0.08865 +Converged at iteration 25, L1 5.32311e-05, Linf 0.00229905, total time[s] 0.069315 +Converged at iteration 28, L1 7.84242e-05, Linf 0.00759113, total time[s] 0.074754 +Converged at iteration 27, L1 8.22357e-05, Linf 0.0119807, total time[s] 0.070464 +Converged at iteration 26, L1 2.89849e-05, Linf 0.0100042, total time[s] 0.06879 +Converged at iteration 20, L1 7.94931e-05, Linf 0.00706331, total time[s] 0.061156 +Converged at iteration 19, L1 6.94724e-05, Linf 0.00515, total time[s] 0.079703 +Converged at iteration 24, L1 5.69538e-05, Linf 0.00288442, total time[s] 0.090104 +Converged at iteration 24, L1 6.76257e-05, Linf 0.0102961, total time[s] 0.070997 +Converged at iteration 21, L1 6.52177e-05, Linf 0.00585978, total time[s] 0.074801 +Converged at iteration 18, L1 5.52714e-05, Linf 0.00165369, total time[s] 0.072008 +Converged at iteration 31, L1 6.22659e-05, Linf 0.00655291, total time[s] 0.107169 +Converged at iteration 20, L1 8.99872e-05, Linf 0.00493366, total time[s] 0.057235 +Converged at iteration 22, L1 6.92138e-05, Linf 0.00499583, total time[s] 0.060399 +Converged at iteration 27, L1 8.50056e-05, Linf 0.00398454, total time[s] 0.074149 +Converged at iteration 24, L1 6.69634e-05, Linf 0.00468679, total time[s] 0.063463 +Converged at iteration 23, L1 5.89002e-05, Linf 0.00357561, total time[s] 0.064562 +Converged at iteration 24, L1 7.29584e-05, Linf 0.00394128, total time[s] 0.063538 +Converged at iteration 23, L1 7.50114e-05, Linf 0.00372665, total time[s] 0.062182 +Converged at iteration 28, L1 9.94953e-05, Linf 0.00644129, total time[s] 0.078262 +Converged at iteration 31, L1 6.81174e-05, Linf 0.0043477, total time[s] 0.080725 +Converged at iteration 28, L1 6.15749e-05, Linf 0.00272594, total time[s] 0.073245 +Converged at iteration 31, L1 5.83418e-05, Linf 0.00541616, total time[s] 0.08257 +Converged at iteration 30, L1 8.76829e-05, Linf 0.00292207, total time[s] 0.077954 +Converged at iteration 30, L1 7.18668e-05, Linf 0.00186142, total time[s] 0.077986 +Converged at iteration 30, L1 5.67527e-05, Linf 0.00657129, total time[s] 0.07752 +Converged at iteration 30, L1 5.77327e-05, Linf 0.0125725, total time[s] 0.07729 +Converged at iteration 28, L1 8.8952e-05, Linf 0.0113938, total time[s] 0.0742 +Converged at iteration 25, L1 5.68878e-05, Linf 0.00227367, total time[s] 0.067183 +Converged at iteration 36, L1 8.32066e-05, Linf 0.00655321, total time[s] 0.098236 +Converged at iteration 33, L1 8.10818e-05, Linf 0.00473435, total time[s] 0.098132 +Converged at iteration 25, L1 5.44086e-05, Linf 0.00237866, total time[s] 0.069212 +Converged at iteration 28, L1 5.06346e-05, Linf 0.00750673, total time[s] 0.073085 +Converged at iteration 27, L1 7.76191e-05, Linf 0.011957, total time[s] 0.070895 +Converged at iteration 26, L1 3.1427e-05, Linf 0.0112359, total time[s] 0.070265 +Converged at iteration 20, L1 8.6098e-05, Linf 0.00744644, total time[s] 0.056816 +Converged at iteration 19, L1 7.13196e-05, Linf 0.00508428, total time[s] 0.060722 +Converged at iteration 24, L1 5.94924e-05, Linf 0.00284964, total time[s] 0.086588 +Converged at iteration 24, L1 5.48933e-05, Linf 0.00998043, total time[s] 0.107658 +Converged at iteration 21, L1 5.31889e-05, Linf 0.00561893, total time[s] 0.06764 +Converged at iteration 18, L1 6.44258e-05, Linf 0.00195394, total time[s] 0.061658 +Converged at iteration 31, L1 6.49643e-05, Linf 0.0069323, total time[s] 0.100008 +Converged at iteration 21, L1 6.30274e-05, Linf 0.00341701, total time[s] 0.056736 +Converged at iteration 22, L1 7.65675e-05, Linf 0.00568233, total time[s] 0.059232 +Converged at iteration 27, L1 8.69358e-05, Linf 0.00414616, total time[s] 0.071927 +Converged at iteration 24, L1 6.97591e-05, Linf 0.00486535, total time[s] 0.064707 +Converged at iteration 23, L1 6.17274e-05, Linf 0.00375621, total time[s] 0.061739 +Converged at iteration 24, L1 8.31998e-05, Linf 0.00564866, total time[s] 0.064135 +Converged at iteration 23, L1 7.82634e-05, Linf 0.00469595, total time[s] 0.08466 +Converged at iteration 28, L1 9.559e-05, Linf 0.00618123, total time[s] 0.087832 +Converged at iteration 31, L1 7.44968e-05, Linf 0.00502207, total time[s] 0.104342 +Converged at iteration 27, L1 9.96835e-05, Linf 0.00364127, total time[s] 0.081329 +Converged at iteration 31, L1 5.94604e-05, Linf 0.0057006, total time[s] 0.09615 +Converged at iteration 30, L1 9.1829e-05, Linf 0.00303244, total time[s] 0.104548 +Converged at iteration 30, L1 8.17404e-05, Linf 0.00220683, total time[s] 0.09534 +Converged at iteration 30, L1 5.53872e-05, Linf 0.00606039, total time[s] 0.092095 +Converged at iteration 30, L1 6.41707e-05, Linf 0.0137786, total time[s] 0.084317 +Converged at iteration 29, L1 4.08153e-05, Linf 0.00901969, total time[s] 0.07919 +Converged at iteration 25, L1 5.69927e-05, Linf 0.00233633, total time[s] 0.066846 +Converged at iteration 36, L1 7.9505e-05, Linf 0.0064112, total time[s] 0.094185 +Converged at iteration 33, L1 8.29305e-05, Linf 0.0047343, total time[s] 0.090256 +Converged at iteration 25, L1 5.40953e-05, Linf 0.00243668, total time[s] 0.078691 +Converged at iteration 27, L1 7.53447e-05, Linf 0.00956551, total time[s] 0.073013 +Converged at iteration 27, L1 8.03712e-05, Linf 0.0114336, total time[s] 0.068354 +Converged at iteration 26, L1 3.40149e-05, Linf 0.0110251, total time[s] 0.066573 +Converged at iteration 20, L1 9.28892e-05, Linf 0.00781416, total time[s] 0.058943 +Converged at iteration 19, L1 7.73836e-05, Linf 0.00502783, total time[s] 0.077575 +Converged at iteration 24, L1 5.99885e-05, Linf 0.00281043, total time[s] 0.081621 +Converged at iteration 24, L1 4.55732e-05, Linf 0.00958946, total time[s] 0.080823 +Converged at iteration 21, L1 4.50852e-05, Linf 0.00510172, total time[s] 0.060571 +Converged at iteration 18, L1 7.55066e-05, Linf 0.00818567, total time[s] 0.063792 +Converged at iteration 31, L1 6.75243e-05, Linf 0.00731065, total time[s] 0.101764 +Converged at iteration 21, L1 6.7589e-05, Linf 0.00379388, total time[s] 0.058072 +Converged at iteration 22, L1 8.66442e-05, Linf 0.00622758, total time[s] 0.059164 +Converged at iteration 27, L1 8.37886e-05, Linf 0.00419246, total time[s] 0.067746 +Converged at iteration 24, L1 7.18948e-05, Linf 0.00507562, total time[s] 0.059312 +Converged at iteration 23, L1 6.44907e-05, Linf 0.00389627, total time[s] 0.057408 +Converged at iteration 24, L1 9.15534e-05, Linf 0.00714173, total time[s] 0.059257 +Converged at iteration 23, L1 8.57765e-05, Linf 0.0055674, total time[s] 0.057364 +Converged at iteration 28, L1 9.08762e-05, Linf 0.00589102, total time[s] 0.068902 +Converged at iteration 31, L1 7.97517e-05, Linf 0.00523659, total time[s] 0.074586 +Converged at iteration 27, L1 9.71616e-05, Linf 0.00354571, total time[s] 0.067532 +Converged at iteration 31, L1 6.12023e-05, Linf 0.00598613, total time[s] 0.075637 +Converged at iteration 30, L1 9.61795e-05, Linf 0.00325963, total time[s] 0.080541 +Converged at iteration 30, L1 9.21906e-05, Linf 0.00255089, total time[s] 0.073096 +Converged at iteration 29, L1 9.87555e-05, Linf 0.00911601, total time[s] 0.070094 +Converged at iteration 30, L1 7.29237e-05, Linf 0.0149751, total time[s] 0.072262 +Converged at iteration 29, L1 4.68842e-05, Linf 0.00970866, total time[s] 0.070121 +Converged at iteration 25, L1 5.611e-05, Linf 0.00236447, total time[s] 0.163458 +Converged at iteration 36, L1 7.77018e-05, Linf 0.00628199, total time[s] 0.163036 +Converged at iteration 33, L1 8.63137e-05, Linf 0.00489349, total time[s] 0.110455 +Converged at iteration 25, L1 5.44652e-05, Linf 0.00252623, total time[s] 0.063154 +Converged at iteration 27, L1 4.90692e-05, Linf 0.00924715, total time[s] 0.069307 +Converged at iteration 27, L1 7.97378e-05, Linf 0.0114764, total time[s] 0.066371 +Converged at iteration 26, L1 3.59235e-05, Linf 0.0126907, total time[s] 0.088035 +Converged at iteration 20, L1 9.94997e-05, Linf 0.00825231, total time[s] 0.051709 +Converged at iteration 19, L1 7.97249e-05, Linf 0.00493882, total time[s] 0.064984 +Converged at iteration 24, L1 6.00572e-05, Linf 0.00277543, total time[s] 0.095311 +Converged at iteration 23, L1 9.93603e-05, Linf 0.0141281, total time[s] 0.081556 +Converged at iteration 20, L1 9.82647e-05, Linf 0.00688313, total time[s] 0.060574 +Converged at iteration 18, L1 8.38815e-05, Linf 0.00793753, total time[s] 0.047396 +Converged at iteration 31, L1 7.03509e-05, Linf 0.00767428, total time[s] 0.091452 +Converged at iteration 21, L1 6.63783e-05, Linf 0.00416213, total time[s] 0.056073 +Converged at iteration 22, L1 9.24644e-05, Linf 0.00686913, total time[s] 0.06973 +Converged at iteration 27, L1 8.00485e-05, Linf 0.00413036, total time[s] 0.078833 +Converged at iteration 24, L1 7.46973e-05, Linf 0.00534407, total time[s] 0.067337 +Converged at iteration 23, L1 6.74613e-05, Linf 0.00398237, total time[s] 0.086656 +Converged at iteration 25, L1 5.57175e-05, Linf 0.00360737, total time[s] 0.06982 +Converged at iteration 23, L1 9.78781e-05, Linf 0.00655436, total time[s] 0.071439 +Converged at iteration 28, L1 8.11679e-05, Linf 0.00551975, total time[s] 0.072892 +Converged at iteration 31, L1 8.63387e-05, Linf 0.00568594, total time[s] 0.084925 +Converged at iteration 27, L1 9.41609e-05, Linf 0.00346887, total time[s] 0.079134 +Converged at iteration 31, L1 6.02259e-05, Linf 0.00627515, total time[s] 0.084631 +Converged at iteration 30, L1 9.73415e-05, Linf 0.00330493, total time[s] 0.222824 +Converged at iteration 31, L1 4.93515e-05, Linf 0.00178885, total time[s] 0.08543 +Converged at iteration 29, L1 9.63464e-05, Linf 0.00863093, total time[s] 0.081217 +Converged at iteration 30, L1 8.31371e-05, Linf 0.0161129, total time[s] 0.085527 +Converged at iteration 29, L1 5.23394e-05, Linf 0.0104618, total time[s] 0.083434 +Converged at iteration 25, L1 5.39588e-05, Linf 0.00237992, total time[s] 0.068637 +Converged at iteration 36, L1 7.66713e-05, Linf 0.00641484, total time[s] 0.110824 +Converged at iteration 33, L1 8.98726e-05, Linf 0.00506431, total time[s] 0.11503 +Converged at iteration 25, L1 5.40685e-05, Linf 0.00262058, total time[s] 0.07052 +Converged at iteration 26, L1 8.44014e-05, Linf 0.0115051, total time[s] 0.076134 +Converged at iteration 27, L1 8.03832e-05, Linf 0.0120389, total time[s] 0.093966 +Converged at iteration 26, L1 3.59967e-05, Linf 0.012779, total time[s] 0.112916 +Converged at iteration 21, L1 3.51077e-05, Linf 0.00584987, total time[s] 0.083674 +Converged at iteration 19, L1 8.34916e-05, Linf 0.00482677, total time[s] 0.11108 +Converged at iteration 24, L1 6.02605e-05, Linf 0.00274142, total time[s] 0.109477 +Converged at iteration 23, L1 8.86122e-05, Linf 0.0140555, total time[s] 0.077387 +Converged at iteration 20, L1 9.10325e-05, Linf 0.00629134, total time[s] 0.059575 +Converged at iteration 18, L1 8.73351e-05, Linf 0.0027542, total time[s] 0.050087 +Converged at iteration 31, L1 7.21306e-05, Linf 0.00811792, total time[s] 0.095524 +Converged at iteration 21, L1 8.167e-05, Linf 0.00441872, total time[s] 0.05569 +Converged at iteration 22, L1 9.69819e-05, Linf 0.00771508, total time[s] 0.059426 +Converged at iteration 27, L1 7.68978e-05, Linf 0.00403984, total time[s] 0.071263 +Converged at iteration 24, L1 7.55098e-05, Linf 0.00554622, total time[s] 0.065794 +Converged at iteration 23, L1 6.91848e-05, Linf 0.00399208, total time[s] 0.078418 +Converged at iteration 25, L1 5.88414e-05, Linf 0.003867, total time[s] 0.09069 +Converged at iteration 24, L1 6.29028e-05, Linf 0.00527735, total time[s] 0.070016 +Converged at iteration 28, L1 7.2983e-05, Linf 0.00526769, total time[s] 0.074806 +Converged at iteration 31, L1 8.89097e-05, Linf 0.00580734, total time[s] 0.080436 +Converged at iteration 27, L1 9.15762e-05, Linf 0.00338287, total time[s] 0.07171 +Converged at iteration 31, L1 6.11601e-05, Linf 0.0065175, total time[s] 0.082704 +Converged at iteration 30, L1 9.83748e-05, Linf 0.00334161, total time[s] 0.099832 +Converged at iteration 31, L1 5.39051e-05, Linf 0.00198402, total time[s] 0.09366 +Converged at iteration 29, L1 9.50245e-05, Linf 0.00810372, total time[s] 0.076967 +Converged at iteration 30, L1 9.23688e-05, Linf 0.017047, total time[s] 0.078052 +Converged at iteration 29, L1 5.68517e-05, Linf 0.011151, total time[s] 0.075752 +Converged at iteration 25, L1 5.33788e-05, Linf 0.0023389, total time[s] 0.08604 +Converged at iteration 36, L1 7.8262e-05, Linf 0.00655374, total time[s] 0.108446 +Converged at iteration 33, L1 9.56574e-05, Linf 0.00534633, total time[s] 0.089952 +Converged at iteration 25, L1 5.82553e-05, Linf 0.00275736, total time[s] 0.075991 +Converged at iteration 26, L1 5.72286e-05, Linf 0.011116, total time[s] 0.075627 +Converged at iteration 27, L1 8.38161e-05, Linf 0.0123704, total time[s] 0.08063 +Converged at iteration 26, L1 3.73672e-05, Linf 0.0134472, total time[s] 0.098255 +Converged at iteration 21, L1 3.71225e-05, Linf 0.00613689, total time[s] 0.083001 +Converged at iteration 19, L1 8.75249e-05, Linf 0.00465955, total time[s] 0.078949 +Converged at iteration 24, L1 6.29277e-05, Linf 0.00270239, total time[s] 0.101115 +Converged at iteration 23, L1 8.22711e-05, Linf 0.0137136, total time[s] 0.108695 +Converged at iteration 20, L1 8.89874e-05, Linf 0.00544313, total time[s] 0.088722 +Converged at iteration 18, L1 9.70986e-05, Linf 0.00308202, total time[s] 0.099331 +Converged at iteration 31, L1 7.43729e-05, Linf 0.00859389, total time[s] 0.103786 +Converged at iteration 21, L1 9.60005e-05, Linf 0.00453567, total time[s] 0.061638 +Converged at iteration 23, L1 5.72076e-05, Linf 0.00531149, total time[s] 0.081173 +Converged at iteration 27, L1 7.4973e-05, Linf 0.00390627, total time[s] 0.085098 +Converged at iteration 24, L1 7.71265e-05, Linf 0.00567062, total time[s] 0.080517 +Converged at iteration 23, L1 7.18262e-05, Linf 0.0042183, total time[s] 0.067471 +Converged at iteration 25, L1 6.34705e-05, Linf 0.00413425, total time[s] 0.073698 +Converged at iteration 24, L1 7.50433e-05, Linf 0.00614681, total time[s] 0.064661 +Converged at iteration 28, L1 6.26249e-05, Linf 0.00512208, total time[s] 0.074154 +Converged at iteration 31, L1 9.31342e-05, Linf 0.00529696, total time[s] 0.085951 +Converged at iteration 27, L1 8.6806e-05, Linf 0.00321686, total time[s] 0.072006 +Converged at iteration 31, L1 6.22548e-05, Linf 0.00686508, total time[s] 0.083559 +Converged at iteration 31, L1 6.16877e-05, Linf 0.00220149, total time[s] 0.08903 +Converged at iteration 31, L1 6.34202e-05, Linf 0.00229786, total time[s] 0.080683 +Converged at iteration 29, L1 9.46574e-05, Linf 0.00758236, total time[s] 0.076111 +Converged at iteration 31, L1 3.27399e-05, Linf 0.00892492, total time[s] 0.080607 +Converged at iteration 29, L1 6.36663e-05, Linf 0.0118638, total time[s] 0.076098 +Converged at iteration 25, L1 5.24374e-05, Linf 0.00228347, total time[s] 0.066738 +Converged at iteration 36, L1 8.02311e-05, Linf 0.00683774, total time[s] 0.093402 +Converged at iteration 34, L1 4.49681e-05, Linf 0.00428812, total time[s] 0.095702 +Converged at iteration 25, L1 5.98848e-05, Linf 0.0028934, total time[s] 0.071137 +Converged at iteration 26, L1 4.25733e-05, Linf 0.0106707, total time[s] 0.068208 +Converged at iteration 27, L1 8.26187e-05, Linf 0.0133389, total time[s] 0.070091 +Converged at iteration 26, L1 3.90101e-05, Linf 0.0139311, total time[s] 0.068267 +Converged at iteration 21, L1 3.72991e-05, Linf 0.00639082, total time[s] 0.064025 +Converged at iteration 19, L1 8.9663e-05, Linf 0.00456046, total time[s] 0.067192 +Converged at iteration 24, L1 6.19283e-05, Linf 0.00265374, total time[s] 0.094708 +Converged at iteration 23, L1 7.7615e-05, Linf 0.0132397, total time[s] 0.078814 +Converged at iteration 20, L1 8.47499e-05, Linf 0.00495174, total time[s] 0.067402 +Converged at iteration 19, L1 4.95436e-05, Linf 0.00174512, total time[s] 0.0679 +Converged at iteration 31, L1 7.63605e-05, Linf 0.0089763, total time[s] 0.092164 +Converged at iteration 21, L1 9.94905e-05, Linf 0.00452322, total time[s] 0.057126 +Converged at iteration 23, L1 5.92681e-05, Linf 0.00553499, total time[s] 0.061913 +Converged at iteration 27, L1 7.28616e-05, Linf 0.0038432, total time[s] 0.073551 +Converged at iteration 24, L1 7.68712e-05, Linf 0.00566002, total time[s] 0.064809 +Converged at iteration 23, L1 7.35593e-05, Linf 0.00429123, total time[s] 0.062565 +Converged at iteration 25, L1 6.56265e-05, Linf 0.00428748, total time[s] 0.067155 +Converged at iteration 24, L1 8.56723e-05, Linf 0.00674522, total time[s] 0.066149 +Converged at iteration 27, L1 9.52641e-05, Linf 0.00662765, total time[s] 0.072077 +Converged at iteration 31, L1 9.65745e-05, Linf 0.00543399, total time[s] 0.079511 +Converged at iteration 27, L1 8.25468e-05, Linf 0.00309186, total time[s] 0.07083 +Converged at iteration 31, L1 6.37117e-05, Linf 0.00709392, total time[s] 0.079588 +Converged at iteration 31, L1 6.22981e-05, Linf 0.00229697, total time[s] 0.07949 +Converged at iteration 31, L1 6.80035e-05, Linf 0.00248624, total time[s] 0.079908 +Converged at iteration 29, L1 9.37045e-05, Linf 0.00711315, total time[s] 0.075381 +Converged at iteration 31, L1 3.52358e-05, Linf 0.00920223, total time[s] 0.079698 +Converged at iteration 29, L1 6.88972e-05, Linf 0.0124489, total time[s] 0.074986 +Converged at iteration 25, L1 5.20941e-05, Linf 0.00228139, total time[s] 0.068497 +Converged at iteration 36, L1 8.36405e-05, Linf 0.00725668, total time[s] 0.098361 +Converged at iteration 34, L1 4.86475e-05, Linf 0.00428057, total time[s] 0.094238 +Converged at iteration 25, L1 6.25474e-05, Linf 0.00298702, total time[s] 0.067885 +Converged at iteration 25, L1 8.68505e-05, Linf 0.0134444, total time[s] 0.066679 +Converged at iteration 27, L1 8.2152e-05, Linf 0.0135472, total time[s] 0.070194 +Converged at iteration 26, L1 4.18015e-05, Linf 0.0145795, total time[s] 0.068544 +Converged at iteration 21, L1 3.77596e-05, Linf 0.00653775, total time[s] 0.069427 +Converged at iteration 19, L1 9.10786e-05, Linf 0.00436219, total time[s] 0.057534 +Converged at iteration 24, L1 6.25994e-05, Linf 0.00270442, total time[s] 0.082731 +Converged at iteration 23, L1 7.61988e-05, Linf 0.0121455, total time[s] 0.069782 +Converged at iteration 20, L1 8.56913e-05, Linf 0.0050123, total time[s] 0.109996 +Converged at iteration 19, L1 5.45056e-05, Linf 0.00188383, total time[s] 0.073764 +Converged at iteration 31, L1 7.90985e-05, Linf 0.00951161, total time[s] 0.098699 +Converged at iteration 21, L1 9.97201e-05, Linf 0.0046002, total time[s] 0.062572 +Converged at iteration 23, L1 6.29715e-05, Linf 0.00585161, total time[s] 0.064579 +Converged at iteration 27, L1 7.27634e-05, Linf 0.0037339, total time[s] 0.075371 +Converged at iteration 24, L1 7.57958e-05, Linf 0.00557567, total time[s] 0.06987 +Converged at iteration 23, L1 7.74779e-05, Linf 0.00437774, total time[s] 0.063171 +Converged at iteration 25, L1 6.63595e-05, Linf 0.00442931, total time[s] 0.064366 +Converged at iteration 25, L1 5.89775e-05, Linf 0.00535129, total time[s] 0.069566 +Converged at iteration 27, L1 9.39675e-05, Linf 0.00667931, total time[s] 0.07314 +Converged at iteration 32, L1 5.33777e-05, Linf 0.00327687, total time[s] 0.082383 +Converged at iteration 27, L1 7.82164e-05, Linf 0.00295177, total time[s] 0.071989 +Converged at iteration 31, L1 6.70311e-05, Linf 0.00744117, total time[s] 0.084855 +Converged at iteration 31, L1 6.34395e-05, Linf 0.00226904, total time[s] 0.083484 +Converged at iteration 31, L1 7.68764e-05, Linf 0.00291363, total time[s] 0.085536 +Converged at iteration 29, L1 9.36921e-05, Linf 0.00648751, total time[s] 0.084576 +Converged at iteration 31, L1 4.04857e-05, Linf 0.00929771, total time[s] 0.093198 +Converged at iteration 29, L1 7.55339e-05, Linf 0.0133016, total time[s] 0.082829 +Converged at iteration 25, L1 5.25217e-05, Linf 0.00234948, total time[s] 0.066649 +Converged at iteration 36, L1 8.66392e-05, Linf 0.00760447, total time[s] 0.098001 +Converged at iteration 34, L1 5.19394e-05, Linf 0.00463721, total time[s] 0.105118 +Converged at iteration 25, L1 6.15951e-05, Linf 0.00305878, total time[s] 0.079837 +Converged at iteration 25, L1 7.48658e-05, Linf 0.0131126, total time[s] 0.177276 +Converged at iteration 27, L1 8.21277e-05, Linf 0.0136391, total time[s] 0.128338 +Converged at iteration 26, L1 4.42044e-05, Linf 0.0150107, total time[s] 0.110678 +Converged at iteration 21, L1 3.78581e-05, Linf 0.00671178, total time[s] 0.071208 +Converged at iteration 19, L1 9.04449e-05, Linf 0.00429271, total time[s] 0.069367 +Converged at iteration 24, L1 6.2244e-05, Linf 0.00265515, total time[s] 0.084813 +Converged at iteration 23, L1 7.42102e-05, Linf 0.0114857, total time[s] 0.122481 +Converged at iteration 20, L1 8.80192e-05, Linf 0.00501034, total time[s] 0.097216 +Converged at iteration 19, L1 5.71491e-05, Linf 0.00195529, total time[s] 0.055638 +Converged at iteration 31, L1 8.08121e-05, Linf 0.00983923, total time[s] 0.087359 +Converged at iteration 22, L1 6.99373e-05, Linf 0.00281378, total time[s] 0.067973 +Converged at iteration 23, L1 6.64573e-05, Linf 0.0060423, total time[s] 0.067986 +Converged at iteration 27, L1 6.92018e-05, Linf 0.00366633, total time[s] 0.09538 +Converged at iteration 24, L1 7.42261e-05, Linf 0.00550451, total time[s] 0.081783 +Converged at iteration 23, L1 7.94228e-05, Linf 0.00430986, total time[s] 0.08052 +Converged at iteration 25, L1 6.71812e-05, Linf 0.00449016, total time[s] 0.0931 +Converged at iteration 25, L1 6.54453e-05, Linf 0.00572072, total time[s] 0.068745 +Converged at iteration 27, L1 9.20619e-05, Linf 0.00677577, total time[s] 0.081039 +Converged at iteration 32, L1 5.5068e-05, Linf 0.00321893, total time[s] 0.23722 +Converged at iteration 26, L1 9.66635e-05, Linf 0.00399038, total time[s] 0.097562 +Converged at iteration 31, L1 6.71706e-05, Linf 0.00763178, total time[s] 0.10946 +Converged at iteration 31, L1 6.30102e-05, Linf 0.00231766, total time[s] 0.09916 +Converged at iteration 31, L1 8.56093e-05, Linf 0.00316255, total time[s] 0.100516 +Converged at iteration 29, L1 9.41976e-05, Linf 0.00616789, total time[s] 0.09193 +Converged at iteration 31, L1 4.35709e-05, Linf 0.0100884, total time[s] 0.087475 +Converged at iteration 29, L1 7.84959e-05, Linf 0.0137443, total time[s] 0.096722 +Converged at iteration 25, L1 5.20867e-05, Linf 0.00242694, total time[s] 0.090629 +Converged at iteration 36, L1 9.21762e-05, Linf 0.00806043, total time[s] 0.162575 +Converged at iteration 34, L1 5.76472e-05, Linf 0.00460557, total time[s] 0.124259 +Converged at iteration 25, L1 5.95082e-05, Linf 0.00313043, total time[s] 0.071241 +Converged at iteration 25, L1 6.12039e-05, Linf 0.0125245, total time[s] 0.076056 +Converged at iteration 27, L1 7.4869e-05, Linf 0.013635, total time[s] 0.083506 +Converged at iteration 26, L1 5.08032e-05, Linf 0.0156474, total time[s] 0.105807 +Converged at iteration 21, L1 3.77612e-05, Linf 0.006977, total time[s] 0.109218 +Converged at iteration 19, L1 8.90713e-05, Linf 0.00414375, total time[s] 0.100572 +Converged at iteration 24, L1 6.26039e-05, Linf 0.00254805, total time[s] 0.100801 +Converged at iteration 23, L1 7.38995e-05, Linf 0.0102547, total time[s] 0.103909 +Converged at iteration 20, L1 9.07185e-05, Linf 0.00503278, total time[s] 0.070405 +Converged at iteration 19, L1 6.28344e-05, Linf 0.00208918, total time[s] 0.05784 +Converged at iteration 31, L1 8.33531e-05, Linf 0.0104669, total time[s] 0.101252 +Converged at iteration 22, L1 7.15674e-05, Linf 0.00291982, total time[s] 0.073568 +Converged at iteration 23, L1 7.62949e-05, Linf 0.006386, total time[s] 0.078409 +Converged at iteration 27, L1 7.30143e-05, Linf 0.00363709, total time[s] 0.086572 +Converged at iteration 24, L1 7.11939e-05, Linf 0.00524678, total time[s] 0.069711 +Converged at iteration 23, L1 8.33999e-05, Linf 0.00442522, total time[s] 0.065707 +Converged at iteration 25, L1 7.01354e-05, Linf 0.00460247, total time[s] 0.080155 +Converged at iteration 25, L1 7.57765e-05, Linf 0.00620877, total time[s] 0.079414 +Converged at iteration 27, L1 8.76476e-05, Linf 0.00675486, total time[s] 0.077201 +Converged at iteration 32, L1 5.74593e-05, Linf 0.00321876, total time[s] 0.082284 +Converged at iteration 27, L1 7.01834e-05, Linf 0.00261767, total time[s] 0.07564 +Converged at iteration 31, L1 7.18365e-05, Linf 0.0080367, total time[s] 0.090335 +Converged at iteration 31, L1 6.35948e-05, Linf 0.00230873, total time[s] 0.087486 +Converged at iteration 31, L1 9.74777e-05, Linf 0.00372957, total time[s] 0.089168 +Converged at iteration 29, L1 9.83594e-05, Linf 0.00572108, total time[s] 0.086318 +Converged at iteration 31, L1 4.9772e-05, Linf 0.0100826, total time[s] 0.110815 +Converged at iteration 29, L1 8.22132e-05, Linf 0.0145678, total time[s] 0.087202 +Converged at iteration 25, L1 5.30079e-05, Linf 0.00257809, total time[s] 0.076734 +Converged at iteration 36, L1 9.64308e-05, Linf 0.00831365, total time[s] 0.143615 +Converged at iteration 34, L1 6.06216e-05, Linf 0.00488296, total time[s] 0.107612 +Converged at iteration 25, L1 5.83322e-05, Linf 0.00321455, total time[s] 0.094004 +Converged at iteration 25, L1 5.59004e-05, Linf 0.0121542, total time[s] 0.09563 +Converged at iteration 27, L1 7.72149e-05, Linf 0.0134765, total time[s] 0.166978 +Converged at iteration 26, L1 5.02691e-05, Linf 0.0162325, total time[s] 0.122364 +Converged at iteration 21, L1 3.77566e-05, Linf 0.00690803, total time[s] 0.09484 +Converged at iteration 19, L1 8.92607e-05, Linf 0.00406563, total time[s] 0.109196 +Converged at iteration 24, L1 6.29534e-05, Linf 0.00257964, total time[s] 0.068039 +Converged at iteration 23, L1 7.58807e-05, Linf 0.00969038, total time[s] 0.068475 +Converged at iteration 20, L1 9.41669e-05, Linf 0.00499568, total time[s] 0.072059 +Converged at iteration 19, L1 6.79492e-05, Linf 0.00216338, total time[s] 0.072288 +Converged at iteration 31, L1 8.41853e-05, Linf 0.0107475, total time[s] 0.092686 +Converged at iteration 22, L1 7.35738e-05, Linf 0.0029807, total time[s] 0.066346 +Converged at iteration 23, L1 7.48416e-05, Linf 0.00652535, total time[s] 0.066258 +Converged at iteration 27, L1 7.33887e-05, Linf 0.00365199, total time[s] 0.087756 +Converged at iteration 24, L1 7.0624e-05, Linf 0.00510983, total time[s] 0.065383 +Converged at iteration 23, L1 8.4557e-05, Linf 0.00449034, total time[s] 0.070924 +Converged at iteration 25, L1 7.00247e-05, Linf 0.004649, total time[s] 0.070666 +Converged at iteration 25, L1 7.81091e-05, Linf 0.00651952, total time[s] 0.068791 +Converged at iteration 27, L1 8.58601e-05, Linf 0.0068068, total time[s] 0.092208 +Converged at iteration 32, L1 5.83036e-05, Linf 0.00322324, total time[s] 0.083963 +Converged at iteration 27, L1 6.70882e-05, Linf 0.00248909, total time[s] 0.076612 +Converged at iteration 31, L1 7.0603e-05, Linf 0.00819338, total time[s] 0.088001 +Converged at iteration 31, L1 6.29337e-05, Linf 0.00236227, total time[s] 0.082463 +Converged at iteration 32, L1 4.77668e-05, Linf 0.00224289, total time[s] 0.085676 +Converged at iteration 30, L1 6.68298e-05, Linf 0.00481031, total time[s] 0.085745 +Converged at iteration 31, L1 5.5836e-05, Linf 0.0120363, total time[s] 0.0986 +Converged at iteration 29, L1 8.26414e-05, Linf 0.0149236, total time[s] 0.077219 +Converged at iteration 25, L1 5.27303e-05, Linf 0.00257757, total time[s] 0.073699 +Converged at iteration 37, L1 5.00348e-05, Linf 0.00669381, total time[s] 0.108413 +Converged at iteration 34, L1 6.8868e-05, Linf 0.0055852, total time[s] 0.115584 +Converged at iteration 25, L1 5.80843e-05, Linf 0.00331486, total time[s] 0.093345 +Converged at iteration 25, L1 5.05971e-05, Linf 0.0117142, total time[s] 0.066669 +Converged at iteration 27, L1 6.3197e-05, Linf 0.0130537, total time[s] 0.071121 +Converged at iteration 26, L1 6.06146e-05, Linf 0.0165743, total time[s] 0.099839 +Converged at iteration 21, L1 3.75847e-05, Linf 0.00703305, total time[s] 0.07974 +Converged at iteration 19, L1 8.95374e-05, Linf 0.00386806, total time[s] 0.066318 +Converged at iteration 24, L1 6.3137e-05, Linf 0.00255612, total time[s] 0.109642 +Converged at iteration 23, L1 7.88402e-05, Linf 0.00887202, total time[s] 0.071883 +Converged at iteration 20, L1 9.60895e-05, Linf 0.00497386, total time[s] 0.088352 +Converged at iteration 19, L1 7.13998e-05, Linf 0.00231673, total time[s] 0.054116 +Converged at iteration 31, L1 8.46615e-05, Linf 0.0112667, total time[s] 0.096517 +Converged at iteration 22, L1 7.06088e-05, Linf 0.0031053, total time[s] 0.076984 +Converged at iteration 23, L1 7.42034e-05, Linf 0.00681778, total time[s] 0.073562 +Converged at iteration 27, L1 7.07399e-05, Linf 0.00367633, total time[s] 0.098874 +Converged at iteration 24, L1 6.62052e-05, Linf 0.00480045, total time[s] 0.091156 +Converged at iteration 23, L1 8.55867e-05, Linf 0.00460374, total time[s] 0.082323 +Converged at iteration 25, L1 7.30134e-05, Linf 0.00477914, total time[s] 0.07818 +Converged at iteration 25, L1 7.95735e-05, Linf 0.00703106, total time[s] 0.083559 +Converged at iteration 27, L1 8.3898e-05, Linf 0.0069007, total time[s] 0.093136 +Converged at iteration 32, L1 5.93904e-05, Linf 0.00324284, total time[s] 0.107012 +Converged at iteration 27, L1 6.32579e-05, Linf 0.00229126, total time[s] 0.083891 +Converged at iteration 31, L1 7.36904e-05, Linf 0.00850622, total time[s] 0.089681 +Converged at iteration 31, L1 6.35992e-05, Linf 0.00232328, total time[s] 0.094973 +Converged at iteration 32, L1 5.37413e-05, Linf 0.0025109, total time[s] 0.089663 +Converged at iteration 30, L1 6.73759e-05, Linf 0.00295087, total time[s] 0.08044 +Converged at iteration 31, L1 5.78562e-05, Linf 0.0128094, total time[s] 0.08089 +Converged at iteration 29, L1 8.40954e-05, Linf 0.0155635, total time[s] 0.074507 +Converged at iteration 25, L1 5.37681e-05, Linf 0.00258303, total time[s] 0.068876 +Converged at iteration 37, L1 5.12317e-05, Linf 0.00697897, total time[s] 0.322639 +Converged at iteration 34, L1 7.02021e-05, Linf 0.00548445, total time[s] 0.110323 +Converged at iteration 25, L1 5.73551e-05, Linf 0.0034044, total time[s] 0.078415 +Converged at iteration 25, L1 4.75674e-05, Linf 0.0113983, total time[s] 0.081045 +Converged at iteration 27, L1 4.44078e-05, Linf 0.0126198, total time[s] 0.090163 +Converged at iteration 26, L1 5.52602e-05, Linf 0.0166631, total time[s] 0.101358 +Converged at iteration 21, L1 3.74359e-05, Linf 0.0071047, total time[s] 0.093351 +Converged at iteration 19, L1 8.90326e-05, Linf 0.00381458, total time[s] 0.079556 +Converged at iteration 24, L1 6.23019e-05, Linf 0.00251888, total time[s] 0.082289 +Converged at iteration 23, L1 8.07935e-05, Linf 0.00843953, total time[s] 0.08451 +Converged at iteration 20, L1 9.79849e-05, Linf 0.00489066, total time[s] 0.061987 +Converged at iteration 19, L1 7.52108e-05, Linf 0.00237876, total time[s] 0.061966 +Converged at iteration 31, L1 8.51752e-05, Linf 0.0115735, total time[s] 0.092166 +Converged at iteration 22, L1 7.14558e-05, Linf 0.00315069, total time[s] 0.063948 +Converged at iteration 23, L1 7.73735e-05, Linf 0.00693051, total time[s] 0.06372 +Converged at iteration 27, L1 6.8706e-05, Linf 0.00365269, total time[s] 0.074518 +Converged at iteration 24, L1 6.43207e-05, Linf 0.00465896, total time[s] 0.066888 +Converged at iteration 23, L1 8.57991e-05, Linf 0.00464155, total time[s] 0.063153 +Converged at iteration 25, L1 7.59433e-05, Linf 0.00483423, total time[s] 0.065438 +Converged at iteration 25, L1 8.18442e-05, Linf 0.00768211, total time[s] 0.070055 +Converged at iteration 27, L1 8.33116e-05, Linf 0.00683327, total time[s] 0.074051 +Converged at iteration 32, L1 6.03846e-05, Linf 0.0032452, total time[s] 0.081008 +Converged at iteration 27, L1 6.07697e-05, Linf 0.00216738, total time[s] 0.071443 +Converged at iteration 31, L1 7.21984e-05, Linf 0.00861248, total time[s] 0.084193 +Converged at iteration 31, L1 6.28761e-05, Linf 0.00236014, total time[s] 0.081714 +Converged at iteration 32, L1 5.67164e-05, Linf 0.00263036, total time[s] 0.082298 +Converged at iteration 30, L1 6.88057e-05, Linf 0.00296753, total time[s] 0.093129 +Converged at iteration 31, L1 6.25544e-05, Linf 0.0132551, total time[s] 0.098947 +Converged at iteration 29, L1 8.37594e-05, Linf 0.0158487, total time[s] 0.074609 +Converged at iteration 25, L1 5.4421e-05, Linf 0.00261862, total time[s] 0.068441 +Converged at iteration 37, L1 5.3688e-05, Linf 0.00732035, total time[s] 0.098946 +Converged at iteration 34, L1 7.61723e-05, Linf 0.0058044, total time[s] 0.100666 +Converged at iteration 25, L1 5.92556e-05, Linf 0.00350248, total time[s] 0.064378 +Converged at iteration 25, L1 4.75967e-05, Linf 0.0108817, total time[s] 0.065107 +Converged at iteration 27, L1 4.07467e-05, Linf 0.0116713, total time[s] 0.068591 +Converged at iteration 26, L1 6.13901e-05, Linf 0.0168549, total time[s] 0.069056 +Converged at iteration 21, L1 3.82403e-05, Linf 0.00716983, total time[s] 0.082097 +Converged at iteration 19, L1 8.96983e-05, Linf 0.00368955, total time[s] 0.085466 +Converged at iteration 24, L1 6.17038e-05, Linf 0.00246449, total time[s] 0.096905 +Converged at iteration 23, L1 8.64072e-05, Linf 0.00743372, total time[s] 0.093338 +Converged at iteration 21, L1 4.60466e-05, Linf 0.0022832, total time[s] 0.082262 +Converged at iteration 19, L1 8.1004e-05, Linf 0.00261611, total time[s] 0.091415 +Converged at iteration 31, L1 8.60101e-05, Linf 0.0120077, total time[s] 0.096106 +Converged at iteration 22, L1 7.19271e-05, Linf 0.00324812, total time[s] 0.061252 +Converged at iteration 23, L1 7.91377e-05, Linf 0.00716216, total time[s] 0.071534 +Converged at iteration 27, L1 6.3987e-05, Linf 0.00353623, total time[s] 0.08154 +Converged at iteration 24, L1 6.16117e-05, Linf 0.00439541, total time[s] 0.068402 +Converged at iteration 23, L1 8.76936e-05, Linf 0.00473778, total time[s] 0.064461 +Converged at iteration 25, L1 7.85059e-05, Linf 0.004977, total time[s] 0.073027 +Converged at iteration 25, L1 8.45422e-05, Linf 0.0059248, total time[s] 0.077121 +Converged at iteration 27, L1 8.3586e-05, Linf 0.00690881, total time[s] 0.070508 +Converged at iteration 32, L1 6.16294e-05, Linf 0.00329239, total time[s] 0.087102 +Converged at iteration 26, L1 9.72723e-05, Linf 0.00292916, total time[s] 0.072547 +Converged at iteration 31, L1 7.4049e-05, Linf 0.00885553, total time[s] 0.087467 +Converged at iteration 31, L1 6.28379e-05, Linf 0.00237729, total time[s] 0.087411 +Converged at iteration 32, L1 6.34562e-05, Linf 0.00283355, total time[s] 0.088264 +Converged at iteration 30, L1 7.23746e-05, Linf 0.00301034, total time[s] 0.086331 +Converged at iteration 31, L1 6.76614e-05, Linf 0.0142257, total time[s] 0.081875 +Converged at iteration 29, L1 8.692e-05, Linf 0.0163636, total time[s] 0.076667 +Converged at iteration 25, L1 5.61225e-05, Linf 0.00251295, total time[s] 0.066487 +Converged at iteration 37, L1 5.64736e-05, Linf 0.00752926, total time[s] 0.1086 +Converged at iteration 34, L1 7.98059e-05, Linf 0.00629637, total time[s] 0.110135 +Converged at iteration 25, L1 5.82545e-05, Linf 0.00354858, total time[s] 0.068921 +Converged at iteration 25, L1 4.51564e-05, Linf 0.0105139, total time[s] 0.07286 +Converged at iteration 26, L1 8.99241e-05, Linf 0.0185305, total time[s] 0.082239 +Converged at iteration 26, L1 5.33385e-05, Linf 0.0168541, total time[s] 0.072287 +Converged at iteration 21, L1 3.85733e-05, Linf 0.00716179, total time[s] 0.062362 +Converged at iteration 19, L1 8.99316e-05, Linf 0.00368164, total time[s] 0.086231 +Converged at iteration 24, L1 6.05455e-05, Linf 0.00247426, total time[s] 0.124103 +Converged at iteration 23, L1 8.80213e-05, Linf 0.00702504, total time[s] 0.087653 +Converged at iteration 21, L1 4.65047e-05, Linf 0.00236197, total time[s] 0.114129 +Converged at iteration 19, L1 8.28427e-05, Linf 0.00270773, total time[s] 0.086285 +Converged at iteration 31, L1 8.5415e-05, Linf 0.0122515, total time[s] 0.08963 +Converged at iteration 22, L1 7.00253e-05, Linf 0.00329548, total time[s] 0.065979 +Converged at iteration 23, L1 8.43628e-05, Linf 0.00719952, total time[s] 0.061348 +Converged at iteration 27, L1 6.36057e-05, Linf 0.00350601, total time[s] 0.067827 +Converged at iteration 24, L1 6.07121e-05, Linf 0.00429617, total time[s] 0.061123 +Converged at iteration 23, L1 8.76111e-05, Linf 0.00477645, total time[s] 0.062591 +Converged at iteration 25, L1 8.11143e-05, Linf 0.00504759, total time[s] 0.069345 +Converged at iteration 25, L1 8.80355e-05, Linf 0.00585869, total time[s] 0.097814 +Converged at iteration 27, L1 8.25919e-05, Linf 0.007194, total time[s] 0.069788 +Converged at iteration 32, L1 6.30096e-05, Linf 0.0033234, total time[s] 0.095177 +Converged at iteration 26, L1 9.41647e-05, Linf 0.00279551, total time[s] 0.268725 +Converged at iteration 31, L1 7.35567e-05, Linf 0.00889335, total time[s] 0.086525 +Converged at iteration 31, L1 6.04107e-05, Linf 0.0023727, total time[s] 0.088164 +Converged at iteration 32, L1 6.29909e-05, Linf 0.00293405, total time[s] 0.088876 +Converged at iteration 30, L1 7.43196e-05, Linf 0.00307769, total time[s] 0.080545 +Converged at iteration 31, L1 7.02083e-05, Linf 0.0147911, total time[s] 0.088787 +Converged at iteration 29, L1 8.47471e-05, Linf 0.0168833, total time[s] 0.080091 +Converged at iteration 25, L1 5.51822e-05, Linf 0.0025332, total time[s] 0.084219 +Converged at iteration 37, L1 5.87622e-05, Linf 0.00792501, total time[s] 0.116168 +Converged at iteration 34, L1 8.79771e-05, Linf 0.00678115, total time[s] 0.115567 +Converged at iteration 25, L1 5.95266e-05, Linf 0.00365319, total time[s] 0.087181 +Converged at iteration 25, L1 4.49567e-05, Linf 0.00996355, total time[s] 0.076461 +Converged at iteration 26, L1 7.39601e-05, Linf 0.017638, total time[s] 0.090957 +Converged at iteration 26, L1 5.12532e-05, Linf 0.0167251, total time[s] 0.119822 +Converged at iteration 21, L1 3.98737e-05, Linf 0.00727793, total time[s] 0.080227 +Converged at iteration 19, L1 8.85314e-05, Linf 0.00356668, total time[s] 0.088735 +Converged at iteration 24, L1 6.02819e-05, Linf 0.0025032, total time[s] 0.106233 +Converged at iteration 23, L1 9.24216e-05, Linf 0.00626887, total time[s] 0.099657 +Converged at iteration 21, L1 4.97806e-05, Linf 0.00250889, total time[s] 0.064463 +Converged at iteration 19, L1 9.02542e-05, Linf 0.00296559, total time[s] 0.059728 +Converged at iteration 31, L1 8.69044e-05, Linf 0.0124991, total time[s] 0.084963 +Converged at iteration 22, L1 7.11322e-05, Linf 0.00338226, total time[s] 0.060931 +Converged at iteration 23, L1 9.49049e-05, Linf 0.00748005, total time[s] 0.062669 +Converged at iteration 27, L1 6.14839e-05, Linf 0.00340816, total time[s] 0.077643 +Converged at iteration 24, L1 5.99466e-05, Linf 0.00414595, total time[s] 0.067617 +Converged at iteration 23, L1 8.95052e-05, Linf 0.00486353, total time[s] 0.060632 +Converged at iteration 25, L1 8.40319e-05, Linf 0.00522682, total time[s] 0.067713 +Converged at iteration 25, L1 9.65983e-05, Linf 0.00607383, total time[s] 0.072721 +Converged at iteration 27, L1 8.18065e-05, Linf 0.00737113, total time[s] 0.075398 +Converged at iteration 32, L1 6.36545e-05, Linf 0.0033587, total time[s] 0.094012 +Converged at iteration 26, L1 8.95599e-05, Linf 0.00252082, total time[s] 0.072753 +Converged at iteration 31, L1 7.53571e-05, Linf 0.00912918, total time[s] 0.088731 +Converged at iteration 31, L1 6.07657e-05, Linf 0.00236599, total time[s] 0.079449 +Converged at iteration 32, L1 6.65545e-05, Linf 0.00309002, total time[s] 0.082413 +Converged at iteration 30, L1 8.05771e-05, Linf 0.00330914, total time[s] 0.08198 +Converged at iteration 31, L1 7.77159e-05, Linf 0.0158863, total time[s] 0.113245 +Converged at iteration 29, L1 8.70871e-05, Linf 0.0169601, total time[s] 0.105916 +Converged at iteration 25, L1 5.55377e-05, Linf 0.00243396, total time[s] 0.074528 +Converged at iteration 37, L1 6.14827e-05, Linf 0.00812458, total time[s] 0.114425 +Converged at iteration 34, L1 9.17636e-05, Linf 0.00690426, total time[s] 0.112147 +Converged at iteration 25, L1 6.08715e-05, Linf 0.00367912, total time[s] 0.072318 +Converged at iteration 25, L1 4.48337e-05, Linf 0.00962702, total time[s] 0.076917 +Converged at iteration 26, L1 6.92719e-05, Linf 0.0170869, total time[s] 0.067298 +Converged at iteration 26, L1 4.97985e-05, Linf 0.0165369, total time[s] 0.091089 +Converged at iteration 21, L1 4.02306e-05, Linf 0.00731931, total time[s] 0.106222 +Converged at iteration 19, L1 8.65772e-05, Linf 0.00353415, total time[s] 0.092318 +Converged at iteration 24, L1 5.97044e-05, Linf 0.00249705, total time[s] 0.080987 +Converged at iteration 23, L1 9.62183e-05, Linf 0.00588856, total time[s] 0.088324 +Converged at iteration 21, L1 5.14853e-05, Linf 0.00257959, total time[s] 0.089759 +Converged at iteration 19, L1 9.24251e-05, Linf 0.00309528, total time[s] 0.070409 +Converged at iteration 31, L1 8.72918e-05, Linf 0.0128896, total time[s] 0.093644 +Converged at iteration 22, L1 6.67746e-05, Linf 0.00342929, total time[s] 0.065622 +Converged at iteration 23, L1 9.69293e-05, Linf 0.00754422, total time[s] 0.062282 +Converged at iteration 27, L1 6.07743e-05, Linf 0.00338765, total time[s] 0.082037 +Converged at iteration 24, L1 6.00576e-05, Linf 0.00418004, total time[s] 0.070552 +Converged at iteration 23, L1 9.04449e-05, Linf 0.00488509, total time[s] 0.065362 +Converged at iteration 25, L1 8.5787e-05, Linf 0.00530139, total time[s] 0.067232 +Converged at iteration 25, L1 9.99661e-05, Linf 0.00620488, total time[s] 0.070158 +Converged at iteration 27, L1 8.04552e-05, Linf 0.00724338, total time[s] 0.074152 +Converged at iteration 32, L1 6.44659e-05, Linf 0.00337686, total time[s] 0.091759 +Converged at iteration 26, L1 8.74507e-05, Linf 0.00239472, total time[s] 0.076051 +Converged at iteration 31, L1 7.49042e-05, Linf 0.00915823, total time[s] 0.101484 +Converged at iteration 31, L1 5.97518e-05, Linf 0.00243692, total time[s] 0.085648 +Converged at iteration 32, L1 6.80518e-05, Linf 0.00317121, total time[s] 0.082959 +Converged at iteration 30, L1 8.33489e-05, Linf 0.00331544, total time[s] 0.079199 +Converged at iteration 31, L1 8.1909e-05, Linf 0.0167979, total time[s] 0.083017 +Converged at iteration 29, L1 8.58196e-05, Linf 0.017327, total time[s] 0.077636 +Converged at iteration 25, L1 5.60403e-05, Linf 0.00236835, total time[s] 0.203326 +Converged at iteration 37, L1 6.43356e-05, Linf 0.00859226, total time[s] 0.141381 +Converged at iteration 35, L1 3.49869e-05, Linf 0.00413139, total time[s] 0.106018 +Converged at iteration 25, L1 6.49771e-05, Linf 0.00373067, total time[s] 0.065599 +Converged at iteration 25, L1 4.61733e-05, Linf 0.00914991, total time[s] 0.065663 +Converged at iteration 26, L1 5.72764e-05, Linf 0.0157364, total time[s] 0.08573 +Converged at iteration 26, L1 4.79026e-05, Linf 0.0161382, total time[s] 0.115393 +Converged at iteration 21, L1 4.16399e-05, Linf 0.00735952, total time[s] 0.090234 +Converged at iteration 19, L1 8.60458e-05, Linf 0.00344814, total time[s] 0.09151 +Converged at iteration 24, L1 5.86069e-05, Linf 0.00294998, total time[s] 0.073769 +Converged at iteration 23, L1 9.72388e-05, Linf 0.00502215, total time[s] 0.075864 +Converged at iteration 21, L1 5.39673e-05, Linf 0.00274862, total time[s] 0.089885 +Converged at iteration 20, L1 4.53549e-05, Linf 0.00182538, total time[s] 0.075815 +Converged at iteration 31, L1 9.01273e-05, Linf 0.0134242, total time[s] 0.08342 +Converged at iteration 22, L1 6.44453e-05, Linf 0.00349973, total time[s] 0.064983 +Converged at iteration 23, L1 9.99997e-05, Linf 0.00782466, total time[s] 0.062996 +Converged at iteration 27, L1 5.8627e-05, Linf 0.00325692, total time[s] 0.078866 +Converged at iteration 24, L1 6.05971e-05, Linf 0.00429374, total time[s] 0.065171 +Converged at iteration 23, L1 9.35174e-05, Linf 0.00495614, total time[s] 0.072021 +Converged at iteration 25, L1 9.29563e-05, Linf 0.00556185, total time[s] 0.080744 +Converged at iteration 26, L1 6.05494e-05, Linf 0.00413723, total time[s] 0.077377 +Converged at iteration 27, L1 7.92995e-05, Linf 0.00618446, total time[s] 0.0884 +Converged at iteration 32, L1 6.54222e-05, Linf 0.00350576, total time[s] 0.105141 +Converged at iteration 26, L1 8.10749e-05, Linf 0.00229395, total time[s] 0.104277 +Converged at iteration 31, L1 7.83951e-05, Linf 0.00937306, total time[s] 0.100838 +Converged at iteration 31, L1 5.97973e-05, Linf 0.00242203, total time[s] 0.081521 +Converged at iteration 32, L1 7.22849e-05, Linf 0.00329861, total time[s] 0.087187 +Converged at iteration 30, L1 9.00709e-05, Linf 0.00359517, total time[s] 0.089631 +Converged at iteration 31, L1 9.11587e-05, Linf 0.0176914, total time[s] 0.086364 +Converged at iteration 29, L1 9.01931e-05, Linf 0.0179109, total time[s] 0.114758 +Converged at iteration 25, L1 5.82662e-05, Linf 0.00241813, total time[s] 0.080154 +Converged at iteration 37, L1 6.62451e-05, Linf 0.00894524, total time[s] 0.166525 +Converged at iteration 35, L1 3.63257e-05, Linf 0.00428373, total time[s] 0.12861 +Converged at iteration 25, L1 6.5078e-05, Linf 0.00373144, total time[s] 0.10714 +Converged at iteration 25, L1 4.68791e-05, Linf 0.00884826, total time[s] 0.12069 +Converged at iteration 26, L1 6.71324e-05, Linf 0.0151424, total time[s] 0.15534 +Converged at iteration 26, L1 4.67463e-05, Linf 0.0159789, total time[s] 0.123988 +Converged at iteration 21, L1 4.21778e-05, Linf 0.00732637, total time[s] 0.14283 +Converged at iteration 19, L1 8.47915e-05, Linf 0.0033638, total time[s] 0.078319 +Converged at iteration 24, L1 5.80769e-05, Linf 0.00239267, total time[s] 0.064764 +Converged at iteration 23, L1 9.86028e-05, Linf 0.0048636, total time[s] 0.212315 +Converged at iteration 21, L1 5.55019e-05, Linf 0.00281797, total time[s] 0.106869 +Converged at iteration 20, L1 4.66813e-05, Linf 0.00189208, total time[s] 0.068195 +Converged at iteration 31, L1 9.02177e-05, Linf 0.0136362, total time[s] 0.091777 +Converged at iteration 22, L1 6.68974e-05, Linf 0.00353545, total time[s] 0.06257 +Converged at iteration 24, L1 5.76017e-05, Linf 0.00434281, total time[s] 0.071853 +Converged at iteration 27, L1 5.71788e-05, Linf 0.00323102, total time[s] 0.081373 +Converged at iteration 24, L1 6.12508e-05, Linf 0.00447859, total time[s] 0.066847 +Converged at iteration 23, L1 9.40881e-05, Linf 0.00495963, total time[s] 0.06659 +Converged at iteration 25, L1 9.66493e-05, Linf 0.00562438, total time[s] 0.067731 +Converged at iteration 26, L1 6.37119e-05, Linf 0.00421893, total time[s] 0.069669 +Converged at iteration 27, L1 7.88361e-05, Linf 0.00591952, total time[s] 0.075657 +Converged at iteration 32, L1 6.86255e-05, Linf 0.00357456, total time[s] 0.083963 +Converged at iteration 26, L1 7.98177e-05, Linf 0.00234351, total time[s] 0.066892 +Converged at iteration 31, L1 7.81869e-05, Linf 0.0093734, total time[s] 0.07987 +Converged at iteration 31, L1 5.95197e-05, Linf 0.00242708, total time[s] 0.081426 +Converged at iteration 32, L1 7.71959e-05, Linf 0.00392105, total time[s] 0.100688 +Converged at iteration 30, L1 8.97277e-05, Linf 0.00378983, total time[s] 0.086026 +Converged at iteration 32, L1 4.34539e-05, Linf 0.00804525, total time[s] 0.080575 +Converged at iteration 29, L1 8.94008e-05, Linf 0.0180698, total time[s] 0.080892 +Converged at iteration 25, L1 5.76341e-05, Linf 0.00242537, total time[s] 0.072578 +Converged at iteration 37, L1 7.07537e-05, Linf 0.00925777, total time[s] 0.099485 +Converged at iteration 35, L1 4.22595e-05, Linf 0.00444933, total time[s] 0.11895 +Converged at iteration 25, L1 6.41945e-05, Linf 0.00373945, total time[s] 0.067773 +Converged at iteration 25, L1 5.0795e-05, Linf 0.00857316, total time[s] 0.070428 +Converged at iteration 26, L1 5.40801e-05, Linf 0.01372, total time[s] 0.075116 +Converged at iteration 26, L1 6.60347e-05, Linf 0.0155285, total time[s] 0.088596 +Converged at iteration 21, L1 4.26179e-05, Linf 0.00741071, total time[s] 0.097354 +Converged at iteration 19, L1 8.16141e-05, Linf 0.00326198, total time[s] 0.073909 +Converged at iteration 24, L1 5.77885e-05, Linf 0.00347908, total time[s] 0.09918 +Converged at iteration 24, L1 6.11116e-05, Linf 0.00467945, total time[s] 0.106258 +Converged at iteration 21, L1 5.93831e-05, Linf 0.00298668, total time[s] 0.075641 +Converged at iteration 20, L1 5.06354e-05, Linf 0.0020582, total time[s] 0.067173 +Converged at iteration 31, L1 9.39442e-05, Linf 0.0141136, total time[s] 0.091068 +Converged at iteration 22, L1 6.48753e-05, Linf 0.00361591, total time[s] 0.071256 +Converged at iteration 24, L1 5.9046e-05, Linf 0.00446696, total time[s] 0.08119 +Converged at iteration 27, L1 5.50479e-05, Linf 0.00311315, total time[s] 0.073113 +Converged at iteration 24, L1 6.3416e-05, Linf 0.00486418, total time[s] 0.065604 +Converged at iteration 23, L1 9.696e-05, Linf 0.00500998, total time[s] 0.063748 +Converged at iteration 26, L1 4.88664e-05, Linf 0.00331582, total time[s] 0.171407 +Converged at iteration 26, L1 7.0178e-05, Linf 0.0044839, total time[s] 0.072869 +Converged at iteration 27, L1 7.97168e-05, Linf 0.00630288, total time[s] 0.077859 +Converged at iteration 32, L1 6.51393e-05, Linf 0.00373452, total time[s] 0.09206 +Converged at iteration 26, L1 7.44947e-05, Linf 0.00247051, total time[s] 0.126504 +Converged at iteration 31, L1 7.77346e-05, Linf 0.0095336, total time[s] 0.093593 +Converged at iteration 31, L1 5.88963e-05, Linf 0.00243317, total time[s] 0.081498 +Converged at iteration 32, L1 7.70933e-05, Linf 0.00348474, total time[s] 0.093159 +Converged at iteration 30, L1 8.6334e-05, Linf 0.00564026, total time[s] 0.08766 +Converged at iteration 32, L1 3.78653e-05, Linf 0.00869222, total time[s] 0.152006 +Converged at iteration 29, L1 9.0286e-05, Linf 0.0186061, total time[s] 0.080755 +Converged at iteration 25, L1 5.93457e-05, Linf 0.00248851, total time[s] 0.075777 +Converged at iteration 37, L1 7.16768e-05, Linf 0.00945904, total time[s] 0.111014 +Converged at iteration 35, L1 4.11051e-05, Linf 0.00477923, total time[s] 0.105508 +Converged at iteration 25, L1 6.39915e-05, Linf 0.00372853, total time[s] 0.06657 +Converged at iteration 25, L1 4.95741e-05, Linf 0.00836377, total time[s] 0.067434 +Converged at iteration 26, L1 4.07067e-05, Linf 0.0131191, total time[s] 0.068243 +Converged at iteration 26, L1 4.57144e-05, Linf 0.0153142, total time[s] 0.06848 +Converged at iteration 21, L1 4.29166e-05, Linf 0.00736808, total time[s] 0.064862 +Converged at iteration 19, L1 7.88815e-05, Linf 0.00315376, total time[s] 0.066851 +Converged at iteration 24, L1 5.63084e-05, Linf 0.00224993, total time[s] 0.154356 +Converged at iteration 24, L1 6.10354e-05, Linf 0.00218775, total time[s] 0.078702 +Converged at iteration 21, L1 6.04207e-05, Linf 0.00304995, total time[s] 0.072479 +Converged at iteration 20, L1 5.17057e-05, Linf 0.00213077, total time[s] 0.063728 +Converged at iteration 31, L1 9.45416e-05, Linf 0.0141577, total time[s] 0.08559 +Converged at iteration 22, L1 6.41859e-05, Linf 0.00364683, total time[s] 0.060818 +Converged at iteration 24, L1 5.76245e-05, Linf 0.00447434, total time[s] 0.089887 +Converged at iteration 27, L1 5.53772e-05, Linf 0.00308625, total time[s] 0.088311 +Converged at iteration 24, L1 6.35175e-05, Linf 0.00502744, total time[s] 0.083417 +Converged at iteration 23, L1 9.90033e-05, Linf 0.00569845, total time[s] 0.081006 +Converged at iteration 26, L1 4.84694e-05, Linf 0.00336122, total time[s] 0.103204 +Converged at iteration 26, L1 7.33711e-05, Linf 0.00458437, total time[s] 0.106653 +Converged at iteration 27, L1 8.04489e-05, Linf 0.00666689, total time[s] 0.121602 +Converged at iteration 32, L1 6.71044e-05, Linf 0.00381552, total time[s] 0.123478 +Converged at iteration 26, L1 7.28803e-05, Linf 0.00250294, total time[s] 0.091927 +Converged at iteration 31, L1 7.66278e-05, Linf 0.00952755, total time[s] 0.080423 +Converged at iteration 31, L1 5.8952e-05, Linf 0.00243565, total time[s] 0.08018 +Converged at iteration 32, L1 7.88915e-05, Linf 0.00354054, total time[s] 0.082716 +Converged at iteration 30, L1 8.30605e-05, Linf 0.00418131, total time[s] 0.077613 +Converged at iteration 32, L1 3.88415e-05, Linf 0.0089701, total time[s] 0.082697 +Converged at iteration 29, L1 9.05625e-05, Linf 0.018738, total time[s] 0.075542 +Converged at iteration 25, L1 5.88581e-05, Linf 0.00278036, total time[s] 0.065929 +Converged at iteration 37, L1 7.47911e-05, Linf 0.00997139, total time[s] 0.110428 +Converged at iteration 35, L1 4.51027e-05, Linf 0.00525893, total time[s] 0.099005 +Converged at iteration 25, L1 6.6475e-05, Linf 0.00376309, total time[s] 0.071424 +Converged at iteration 25, L1 5.38104e-05, Linf 0.0081037, total time[s] 0.0719 +Converged at iteration 26, L1 3.54184e-05, Linf 0.0116389, total time[s] 0.076697 +Converged at iteration 26, L1 4.42559e-05, Linf 0.0149077, total time[s] 0.10286 +Converged at iteration 21, L1 4.46859e-05, Linf 0.00744244, total time[s] 0.072424 +Converged at iteration 19, L1 7.52087e-05, Linf 0.00299809, total time[s] 0.055771 +Converged at iteration 24, L1 5.67385e-05, Linf 0.00285241, total time[s] 0.090547 +Converged at iteration 24, L1 6.58001e-05, Linf 0.0118883, total time[s] 0.070483 +Converged at iteration 21, L1 6.45675e-05, Linf 0.00319206, total time[s] 0.056357 +Converged at iteration 20, L1 5.89035e-05, Linf 0.00232472, total time[s] 0.051878 +Converged at iteration 31, L1 9.83082e-05, Linf 0.0145182, total time[s] 0.078707 +Converged at iteration 22, L1 6.80616e-05, Linf 0.00375238, total time[s] 0.058661 +Converged at iteration 24, L1 5.95815e-05, Linf 0.00460853, total time[s] 0.068159 +Converged at iteration 27, L1 5.5337e-05, Linf 0.00299818, total time[s] 0.070947 +Converged at iteration 24, L1 6.38205e-05, Linf 0.00518337, total time[s] 0.061392 +Converged at iteration 23, L1 9.98646e-05, Linf 0.00504345, total time[s] 0.058934 +Converged at iteration 26, L1 5.73461e-05, Linf 0.00350939, total time[s] 0.06651 +Converged at iteration 26, L1 8.32018e-05, Linf 0.00497182, total time[s] 0.065923 +Converged at iteration 27, L1 8.25502e-05, Linf 0.00631968, total time[s] 0.068757 +Converged at iteration 32, L1 6.74205e-05, Linf 0.00394039, total time[s] 0.082046 +Converged at iteration 26, L1 7.20125e-05, Linf 0.0026088, total time[s] 0.06535 +Converged at iteration 31, L1 7.80471e-05, Linf 0.00966873, total time[s] 0.077933 +Converged at iteration 31, L1 5.98562e-05, Linf 0.00243679, total time[s] 0.078619 +Converged at iteration 32, L1 8.19418e-05, Linf 0.00362726, total time[s] 0.079479 +Converged at iteration 30, L1 8.56395e-05, Linf 0.0058654, total time[s] 0.075784 +Converged at iteration 32, L1 4.28952e-05, Linf 0.00972183, total time[s] 0.079607 +Converged at iteration 29, L1 9.25615e-05, Linf 0.0192428, total time[s] 0.072548 +Converged at iteration 25, L1 5.92559e-05, Linf 0.00275607, total time[s] 0.063891 +Converged at iteration 37, L1 7.68814e-05, Linf 0.0101705, total time[s] 0.10434 +Converged at iteration 35, L1 4.67129e-05, Linf 0.00543384, total time[s] 0.14615 +Converged at iteration 25, L1 6.67954e-05, Linf 0.00375446, total time[s] 0.064205 +Converged at iteration 25, L1 5.41212e-05, Linf 0.00791712, total time[s] 0.063948 +Converged at iteration 26, L1 3.7905e-05, Linf 0.0141466, total time[s] 0.067878 +Converged at iteration 26, L1 4.67666e-05, Linf 0.0147472, total time[s] 0.075398 +Converged at iteration 21, L1 4.54687e-05, Linf 0.00746026, total time[s] 0.0551 +Converged at iteration 19, L1 7.28804e-05, Linf 0.00295059, total time[s] 0.050357 +Converged at iteration 24, L1 5.613e-05, Linf 0.00223547, total time[s] 0.065781 +Converged at iteration 24, L1 6.62515e-05, Linf 0.00235213, total time[s] 0.060044 +Converged at iteration 21, L1 6.55199e-05, Linf 0.00326309, total time[s] 0.054513 +Converged at iteration 20, L1 5.82703e-05, Linf 0.00240291, total time[s] 0.053898 +Converged at iteration 32, L1 3.83935e-05, Linf 0.00859784, total time[s] 0.07936 +Converged at iteration 22, L1 6.80171e-05, Linf 0.0037679, total time[s] 0.056948 +Converged at iteration 24, L1 5.89393e-05, Linf 0.00463786, total time[s] 0.061036 +Converged at iteration 27, L1 5.75322e-05, Linf 0.00298261, total time[s] 0.067035 +Converged at iteration 24, L1 6.44386e-05, Linf 0.0051384, total time[s] 0.061149 +Converged at iteration 24, L1 5.46683e-05, Linf 0.00337237, total time[s] 0.060361 +Converged at iteration 26, L1 5.83516e-05, Linf 0.00355526, total time[s] 0.073732 +Converged at iteration 26, L1 8.60772e-05, Linf 0.00503206, total time[s] 0.078182 +Converged at iteration 27, L1 8.20738e-05, Linf 0.00635065, total time[s] 0.076475 +Converged at iteration 32, L1 6.783e-05, Linf 0.00399474, total time[s] 0.0934 +Converged at iteration 26, L1 7.14366e-05, Linf 0.0026297, total time[s] 0.068675 +Converged at iteration 31, L1 7.93437e-05, Linf 0.00966943, total time[s] 0.080711 +Converged at iteration 31, L1 5.99155e-05, Linf 0.00243118, total time[s] 0.078821 +Converged at iteration 32, L1 8.31754e-05, Linf 0.00368173, total time[s] 0.080966 +Converged at iteration 30, L1 8.47092e-05, Linf 0.00424382, total time[s] 0.077615 +Converged at iteration 32, L1 4.45382e-05, Linf 0.0102143, total time[s] 0.085187 +Converged at iteration 29, L1 9.40032e-05, Linf 0.0191435, total time[s] 0.081485 +Converged at iteration 25, L1 5.95386e-05, Linf 0.00273432, total time[s] 0.072225 +Converged at iteration 37, L1 7.99888e-05, Linf 0.0102493, total time[s] 0.126425 +Converged at iteration 35, L1 5.05182e-05, Linf 0.00598054, total time[s] 0.107882 +Converged at iteration 25, L1 6.9706e-05, Linf 0.00374075, total time[s] 0.072283 +Converged at iteration 25, L1 5.9441e-05, Linf 0.00767946, total time[s] 0.07097 +Converged at iteration 25, L1 8.91628e-05, Linf 0.0202188, total time[s] 0.066665 +Converged at iteration 26, L1 4.35678e-05, Linf 0.0143363, total time[s] 0.070938 +Converged at iteration 21, L1 4.78292e-05, Linf 0.0076708, total time[s] 0.056113 +Converged at iteration 19, L1 6.83618e-05, Linf 0.00276978, total time[s] 0.052027 +Converged at iteration 24, L1 5.56862e-05, Linf 0.00244828, total time[s] 0.064086 +Converged at iteration 24, L1 6.72917e-05, Linf 0.00254955, total time[s] 0.066741 +Converged at iteration 21, L1 6.95522e-05, Linf 0.0034235, total time[s] 0.061766 +Converged at iteration 20, L1 6.0707e-05, Linf 0.00261891, total time[s] 0.055442 +Converged at iteration 32, L1 3.96579e-05, Linf 0.00858367, total time[s] 0.110663 +Converged at iteration 22, L1 7.30569e-05, Linf 0.00464826, total time[s] 0.073624 +Converged at iteration 24, L1 5.61336e-05, Linf 0.00467133, total time[s] 0.065526 +Converged at iteration 27, L1 5.14012e-05, Linf 0.00286964, total time[s] 0.076668 +Converged at iteration 24, L1 6.25226e-05, Linf 0.00490497, total time[s] 0.065912 +Converged at iteration 24, L1 5.60579e-05, Linf 0.00321651, total time[s] 0.077378 +Converged at iteration 26, L1 5.50017e-05, Linf 0.00372919, total time[s] 0.079706 +Converged at iteration 26, L1 9.65548e-05, Linf 0.00542833, total time[s] 0.092614 +Converged at iteration 27, L1 8.26066e-05, Linf 0.00642975, total time[s] 0.106231 +Converged at iteration 32, L1 6.92889e-05, Linf 0.00407278, total time[s] 0.101723 +Converged at iteration 26, L1 7.24206e-05, Linf 0.00273113, total time[s] 0.080769 +Converged at iteration 31, L1 7.77655e-05, Linf 0.00981283, total time[s] 0.079857 +Converged at iteration 31, L1 5.95646e-05, Linf 0.00245722, total time[s] 0.079594 +Converged at iteration 32, L1 8.60767e-05, Linf 0.00378703, total time[s] 0.14847 +Converged at iteration 30, L1 8.94378e-05, Linf 0.00451342, total time[s] 0.096619 +Converged at iteration 32, L1 5.05463e-05, Linf 0.0108818, total time[s] 0.091095 +Converged at iteration 29, L1 9.48098e-05, Linf 0.019795, total time[s] 0.08753 +Converged at iteration 25, L1 5.98491e-05, Linf 0.00289483, total time[s] 0.097774 +Converged at iteration 37, L1 8.16716e-05, Linf 0.0103575, total time[s] 0.119797 +Converged at iteration 35, L1 5.19081e-05, Linf 0.0061568, total time[s] 0.108523 +Converged at iteration 25, L1 7.01592e-05, Linf 0.00365243, total time[s] 0.081768 +Converged at iteration 25, L1 5.99253e-05, Linf 0.00748213, total time[s] 0.073257 +Converged at iteration 25, L1 8.51724e-05, Linf 0.0195951, total time[s] 0.079967 +Converged at iteration 26, L1 4.35686e-05, Linf 0.0143783, total time[s] 0.092864 +Converged at iteration 21, L1 4.822e-05, Linf 0.007419, total time[s] 0.10142 +Converged at iteration 19, L1 6.5802e-05, Linf 0.00337495, total time[s] 0.070604 +Converged at iteration 24, L1 5.55168e-05, Linf 0.00289257, total time[s] 0.081151 +Converged at iteration 24, L1 6.88265e-05, Linf 0.00263254, total time[s] 0.088951 +Converged at iteration 21, L1 7.06083e-05, Linf 0.00348019, total time[s] 0.060887 +Converged at iteration 20, L1 6.25617e-05, Linf 0.00269688, total time[s] 0.060578 +Converged at iteration 32, L1 4.01548e-05, Linf 0.0086644, total time[s] 0.095227 +Converged at iteration 22, L1 6.75901e-05, Linf 0.00390129, total time[s] 0.062821 +Converged at iteration 24, L1 5.69751e-05, Linf 0.0047499, total time[s] 0.0633 +Converged at iteration 27, L1 5.08966e-05, Linf 0.00284467, total time[s] 0.070705 +Converged at iteration 24, L1 6.24506e-05, Linf 0.0047715, total time[s] 0.064957 +Converged at iteration 24, L1 5.74726e-05, Linf 0.00320411, total time[s] 0.068962 +Converged at iteration 26, L1 5.61413e-05, Linf 0.00379448, total time[s] 0.081689 +Converged at iteration 26, L1 9.93399e-05, Linf 0.00556073, total time[s] 0.075148 +Converged at iteration 27, L1 8.34144e-05, Linf 0.00644558, total time[s] 0.08328 +Converged at iteration 32, L1 7.01398e-05, Linf 0.00430474, total time[s] 0.093831 +Converged at iteration 26, L1 7.35988e-05, Linf 0.00274993, total time[s] 0.068068 +Converged at iteration 31, L1 7.98247e-05, Linf 0.00981542, total time[s] 0.082935 +Converged at iteration 31, L1 5.89558e-05, Linf 0.00248675, total time[s] 0.083718 +Converged at iteration 32, L1 8.84548e-05, Linf 0.00383851, total time[s] 0.104249 +Converged at iteration 30, L1 9.04205e-05, Linf 0.00467407, total time[s] 0.08823 +Converged at iteration 32, L1 5.07641e-05, Linf 0.0112552, total time[s] 0.103628 +Converged at iteration 29, L1 9.45832e-05, Linf 0.0192761, total time[s] 0.075601 +Converged at iteration 25, L1 6.10201e-05, Linf 0.00293533, total time[s] 0.067717 +Converged at iteration 37, L1 8.44227e-05, Linf 0.0108745, total time[s] 0.097147 +Converged at iteration 35, L1 5.63303e-05, Linf 0.00672835, total time[s] 0.098258 +Converged at iteration 25, L1 7.43889e-05, Linf 0.00367366, total time[s] 0.097004 +Converged at iteration 25, L1 6.47384e-05, Linf 0.00731016, total time[s] 0.077437 +Converged at iteration 25, L1 7.56775e-05, Linf 0.0178507, total time[s] 0.065626 +Converged at iteration 26, L1 4.49357e-05, Linf 0.0142748, total time[s] 0.07415 +Converged at iteration 21, L1 4.92785e-05, Linf 0.00753214, total time[s] 0.05792 +Converged at iteration 19, L1 5.86844e-05, Linf 0.00299887, total time[s] 0.080065 +Converged at iteration 24, L1 5.3714e-05, Linf 0.0022365, total time[s] 0.085536 +Converged at iteration 24, L1 7.0537e-05, Linf 0.0028265, total time[s] 0.070119 +Converged at iteration 21, L1 7.42221e-05, Linf 0.00361544, total time[s] 0.059368 +Converged at iteration 20, L1 6.68053e-05, Linf 0.00290856, total time[s] 0.069674 +Converged at iteration 32, L1 4.12971e-05, Linf 0.00858708, total time[s] 0.119119 +Converged at iteration 22, L1 6.96961e-05, Linf 0.00399538, total time[s] 0.06358 +Converged at iteration 24, L1 5.66939e-05, Linf 0.00495364, total time[s] 0.086511 +Converged at iteration 27, L1 4.87587e-05, Linf 0.00271374, total time[s] 0.076626 +Converged at iteration 24, L1 6.17757e-05, Linf 0.00450661, total time[s] 0.081109 +Converged at iteration 24, L1 5.64298e-05, Linf 0.00320227, total time[s] 0.074569 +Converged at iteration 26, L1 6.00726e-05, Linf 0.00396131, total time[s] 0.088391 +Converged at iteration 27, L1 5.71843e-05, Linf 0.00365712, total time[s] 0.085349 +Converged at iteration 27, L1 8.42041e-05, Linf 0.00648176, total time[s] 0.099694 +Converged at iteration 32, L1 7.23722e-05, Linf 0.0043743, total time[s] 0.08445 +Converged at iteration 26, L1 8.03446e-05, Linf 0.00285287, total time[s] 0.069579 +Converged at iteration 31, L1 7.74597e-05, Linf 0.00993282, total time[s] 0.092477 +Converged at iteration 31, L1 5.69917e-05, Linf 0.00249022, total time[s] 0.088721 +Converged at iteration 32, L1 9.10708e-05, Linf 0.00395874, total time[s] 0.085453 +Converged at iteration 30, L1 9.53428e-05, Linf 0.00522773, total time[s] 0.094531 +Converged at iteration 32, L1 5.62119e-05, Linf 0.0121887, total time[s] 0.085795 +Converged at iteration 29, L1 9.58124e-05, Linf 0.0175859, total time[s] 0.129145 +Converged at iteration 25, L1 9.28128e-05, Linf 0.0031863, total time[s] 0.104716 +Converged at iteration 38, L1 5.34877e-05, Linf 0.0121792, total time[s] 0.107725 +Converged at iteration 36, L1 5.7235e-05, Linf 0.0109893, total time[s] 0.118662 +Converged at iteration 25, L1 9.6741e-05, Linf 0.00368722, total time[s] 0.091688 +Converged at iteration 26, L1 6.04396e-05, Linf 0.0109244, total time[s] 0.073603 +Converged at iteration 25, L1 6.34193e-05, Linf 0.00834978, total time[s] 0.077573 +Converged at iteration 27, L1 4.40491e-05, Linf 0.00900851, total time[s] 0.094332 +Converged at iteration 21, L1 6.43842e-05, Linf 0.0103754, total time[s] 0.084648 +Converged at iteration 19, L1 4.93579e-05, Linf 0.00506875, total time[s] 0.082362 +Converged at iteration 24, L1 5.14386e-05, Linf 0.00221913, total time[s] 0.089527 +Converged at iteration 25, L1 6.08863e-05, Linf 0.00226583, total time[s] 0.112743 +Converged at iteration 22, L1 5.81356e-05, Linf 0.00265821, total time[s] 0.071981 +Converged at iteration 21, L1 5.87373e-05, Linf 0.00294892, total time[s] 0.064877 +Converged at iteration 33, L1 3.34425e-05, Linf 0.00336674, total time[s] 0.087961 +Converged at iteration 22, L1 9.78918e-05, Linf 0.00668675, total time[s] 0.062666 +Converged at iteration 24, L1 7.55009e-05, Linf 0.00526776, total time[s] 0.085167 +Converged at iteration 26, L1 6.74147e-05, Linf 0.00269679, total time[s] 0.067968 +Converged at iteration 23, L1 8.40146e-05, Linf 0.00324332, total time[s] 0.062274 +Converged at iteration 24, L1 5.85236e-05, Linf 0.00269166, total time[s] 0.082062 +Converged at iteration 27, L1 5.76666e-05, Linf 0.00366138, total time[s] 0.071579 +Converged at iteration 28, L1 8.8548e-05, Linf 0.00508956, total time[s] 0.072353 +Converged at iteration 27, L1 9.77852e-05, Linf 0.00639218, total time[s] 0.070011 +Converged at iteration 33, L1 5.22509e-05, Linf 0.00348249, total time[s] 0.084348 +Converged at iteration 28, L1 8.70919e-05, Linf 0.0020031, total time[s] 0.115074 +Converged at iteration 31, L1 8.15519e-05, Linf 0.0115796, total time[s] 0.100906 +Converged at iteration 31, L1 6.58652e-05, Linf 0.00278735, total time[s] 0.084465 +Converged at iteration 33, L1 8.62121e-05, Linf 0.00419194, total time[s] 0.084871 +Converged at iteration 31, L1 8.46489e-05, Linf 0.00808137, total time[s] 0.081211 +Converged at iteration 33, L1 6.94147e-05, Linf 0.0152011, total time[s] 0.084075 +Converged at iteration 30, L1 3.37455e-05, Linf 0.00814996, total time[s] 0.076946 +Converged at iteration 25, L1 7.77405e-05, Linf 0.00320567, total time[s] 0.066593 +Converged at iteration 38, L1 9.17224e-05, Linf 0.021216, total time[s] 0.097359 +Converged at iteration 37, L1 4.23913e-05, Linf 0.0113254, total time[s] 0.095165 +Converged at iteration 25, L1 9.23365e-05, Linf 0.00371715, total time[s] 0.067507 +Converged at iteration 27, L1 5.3757e-05, Linf 0.00561133, total time[s] 0.086804 +Converged at iteration 25, L1 8.81875e-05, Linf 0.011646, total time[s] 0.079688 +Converged at iteration 27, L1 9.47052e-05, Linf 0.019799, total time[s] 0.069088 +Converged at iteration 22, L1 3.00632e-05, Linf 0.00636843, total time[s] 0.058318 +Converged at iteration 19, L1 8.82139e-05, Linf 0.00528963, total time[s] 0.051163 +Converged at iteration 24, L1 6.27592e-05, Linf 0.00317532, total time[s] 0.06238 +Converged at iteration 25, L1 8.42791e-05, Linf 0.00342387, total time[s] 0.065678 +Converged at iteration 22, L1 7.19802e-05, Linf 0.00312402, total time[s] 0.058495 +Converged at iteration 21, L1 8.6902e-05, Linf 0.00538157, total time[s] 0.056175 +Converged at iteration 33, L1 9.08209e-05, Linf 0.00829734, total time[s] 0.085936 +Converged at iteration 23, L1 7.76257e-05, Linf 0.00534883, total time[s] 0.0613 +Converged at iteration 24, L1 9.95264e-05, Linf 0.00708972, total time[s] 0.063902 +Converged at iteration 26, L1 6.81826e-05, Linf 0.00333037, total time[s] 0.070291 +Converged at iteration 23, L1 7.40773e-05, Linf 0.00385197, total time[s] 0.060146 +Converged at iteration 24, L1 7.16562e-05, Linf 0.00316478, total time[s] 0.063845 +Converged at iteration 27, L1 8.63416e-05, Linf 0.00585309, total time[s] 0.06948 +Converged at iteration 29, L1 9.40728e-05, Linf 0.00557512, total time[s] 0.082963 +Converged at iteration 28, L1 7.63419e-05, Linf 0.00463486, total time[s] 0.071765 +Converged at iteration 32, L1 8.73516e-05, Linf 0.00719425, total time[s] 0.080619 +Converged at iteration 29, L1 9.14682e-05, Linf 0.00209806, total time[s] 0.073918 +Converged at iteration 31, L1 8.30552e-05, Linf 0.012911, total time[s] 0.09106 +Converged at iteration 31, L1 8.20022e-05, Linf 0.0037275, total time[s] 0.078086 +Converged at iteration 34, L1 4.17267e-05, Linf 0.00305055, total time[s] 0.084788 +Converged at iteration 32, L1 6.25144e-05, Linf 0.00890292, total time[s] 0.109048 +Converged at iteration 34, L1 5.41761e-05, Linf 0.0114844, total time[s] 0.104187 +Converged at iteration 30, L1 4.65238e-05, Linf 0.0119995, total time[s] 0.083624 +Converged at iteration 25, L1 9.28531e-05, Linf 0.00309562, total time[s] 0.066305 +Converged at iteration 38, L1 9.55665e-05, Linf 0.0288681, total time[s] 0.111478 +Converged at iteration 37, L1 6.46923e-05, Linf 0.0205364, total time[s] 0.113425 +Converged at iteration 26, L1 4.25755e-05, Linf 0.00228878, total time[s] 0.068748 +Converged at iteration 28, L1 7.12027e-05, Linf 0.0128031, total time[s] 0.072244 +Converged at iteration 26, L1 8.37862e-05, Linf 0.00528856, total time[s] 0.066769 +Converged at iteration 29, L1 7.79748e-05, Linf 0.00175684, total time[s] 0.08097 +Converged at iteration 22, L1 5.93791e-05, Linf 0.013884, total time[s] 0.069088 +Converged at iteration 20, L1 6.61966e-05, Linf 0.00317865, total time[s] 0.062002 +Converged at iteration 24, L1 8.88971e-05, Linf 0.0044115, total time[s] 0.101263 +Converged at iteration 26, L1 7.39945e-05, Linf 0.00455208, total time[s] 0.072614 +Converged at iteration 23, L1 4.82986e-05, Linf 0.00236235, total time[s] 0.096732 +Converged at iteration 22, L1 6.40984e-05, Linf 0.00415174, total time[s] 0.082957 +Converged at iteration 35, L1 5.93109e-05, Linf 0.00880566, total time[s] 0.119465 +Converged at iteration 24, L1 6.56082e-05, Linf 0.00439531, total time[s] 0.067695 +Converged at iteration 25, L1 6.89352e-05, Linf 0.00621046, total time[s] 0.073515 +Converged at iteration 27, L1 6.83822e-05, Linf 0.00336872, total time[s] 0.08571 +Converged at iteration 24, L1 5.6344e-05, Linf 0.00290713, total time[s] 0.070413 +Converged at iteration 24, L1 6.56628e-05, Linf 0.00415281, total time[s] 0.070991 +Converged at iteration 28, L1 6.44002e-05, Linf 0.0177675, total time[s] 0.082906 +Converged at iteration 30, L1 9.55359e-05, Linf 0.00539705, total time[s] 0.112489 +Converged at iteration 28, L1 6.98975e-05, Linf 0.00503838, total time[s] 0.106615 +Converged at iteration 32, L1 7.66589e-05, Linf 0.0074804, total time[s] 0.090455 +Converged at iteration 31, L1 6.00935e-05, Linf 0.00233309, total time[s] 0.080498 +Converged at iteration 31, L1 8.69409e-05, Linf 0.0132012, total time[s] 0.080733 +Converged at iteration 32, L1 6.05626e-05, Linf 0.0035765, total time[s] 0.095022 +Converged at iteration 33, L1 9.77797e-05, Linf 0.0104556, total time[s] 0.091081 +Converged at iteration 32, L1 8.18652e-05, Linf 0.00970796, total time[s] 0.084094 +Converged at iteration 34, L1 7.90116e-05, Linf 0.0151683, total time[s] 0.089001 +Converged at iteration 31, L1 4.92024e-05, Linf 0.00756947, total time[s] 0.088479 +Converged at iteration 26, L1 5.76716e-05, Linf 0.0109125, total time[s] 0.079297 +Converged at iteration 39, L1 2.72508e-05, Linf 0.0100992, total time[s] 0.10729 +Converged at iteration 44, L1 9.10513e-05, Linf 0.00257544, total time[s] 0.11973 +Converged at iteration 25, L1 9.32364e-05, Linf 0.00423407, total time[s] 0.090367 +Converged at iteration 27, L1 9.81195e-05, Linf 0.0115822, total time[s] 0.094389 +Converged at iteration 26, L1 7.35657e-05, Linf 0.00680111, total time[s] 0.133067 +Converged at iteration 42, L1 8.85936e-05, Linf 0.00248002, total time[s] 0.125967 +Converged at iteration 22, L1 4.92186e-05, Linf 0.0103207, total time[s] 0.061961 +Converged at iteration 20, L1 5.02051e-05, Linf 0.00226905, total time[s] 0.060478 +Converged at iteration 24, L1 7.45451e-05, Linf 0.00388279, total time[s] 0.071034 +Converged at iteration 26, L1 6.51811e-05, Linf 0.0280536, total time[s] 0.072971 +Converged at iteration 22, L1 8.51461e-05, Linf 0.0034701, total time[s] 0.056791 +Converged at iteration 22, L1 5.12642e-05, Linf 0.00329798, total time[s] 0.05809 +Converged at iteration 34, L1 7.04482e-05, Linf 0.00994334, total time[s] 0.086072 +Converged at iteration 23, L1 8.95089e-05, Linf 0.00740776, total time[s] 0.061502 +Converged at iteration 25, L1 6.14851e-05, Linf 0.00514237, total time[s] 0.066666 +Converged at iteration 26, L1 9.55541e-05, Linf 0.00415595, total time[s] 0.069835 +Converged at iteration 23, L1 9.05153e-05, Linf 0.00446373, total time[s] 0.067769 +Converged at iteration 24, L1 7.73095e-05, Linf 0.00861156, total time[s] 0.064127 +Converged at iteration 28, L1 8.5069e-05, Linf 0.00386178, total time[s] 0.153884 +Converged at iteration 30, L1 5.24013e-05, Linf 0.00425345, total time[s] 0.128833 +Converged at iteration 28, L1 6.59693e-05, Linf 0.00491621, total time[s] 0.074125 +Converged at iteration 32, L1 8.63813e-05, Linf 0.00840044, total time[s] 0.084333 +Converged at iteration 30, L1 7.57629e-05, Linf 0.00230841, total time[s] 0.078612 +Converged at iteration 31, L1 8.33504e-05, Linf 0.0133192, total time[s] 0.083904 +Converged at iteration 32, L1 5.46416e-05, Linf 0.0030718, total time[s] 0.0914 +Converged at iteration 34, L1 4.12023e-05, Linf 0.00463054, total time[s] 0.101228 +Converged at iteration 32, L1 7.539e-05, Linf 0.00970616, total time[s] 0.090968 +Converged at iteration 34, L1 6.89634e-05, Linf 0.0152253, total time[s] 0.088485 +Converged at iteration 30, L1 7.50765e-05, Linf 0.0189882, total time[s] 0.084333 +Converged at iteration 25, L1 9.75989e-05, Linf 0.00315787, total time[s] 0.069375 +Converged at iteration 39, L1 2.66109e-05, Linf 0.00927133, total time[s] 0.104375 +Converged at iteration 37, L1 6.18059e-05, Linf 0.019486, total time[s] 0.100934 +Converged at iteration 25, L1 9.6391e-05, Linf 0.00434026, total time[s] 0.090271 +Converged at iteration 28, L1 5.38158e-05, Linf 0.00930129, total time[s] 0.07313 +Converged at iteration 26, L1 7.42133e-05, Linf 0.00640632, total time[s] 0.067279 +Converged at iteration 28, L1 9.6943e-05, Linf 0.00978627, total time[s] 0.075207 +Converged at iteration 22, L1 5.38325e-05, Linf 0.0121698, total time[s] 0.065803 +Converged at iteration 20, L1 5.68093e-05, Linf 0.00266502, total time[s] 0.0595 +Converged at iteration 24, L1 8.13826e-05, Linf 0.00418875, total time[s] 0.078947 +Converged at iteration 26, L1 6.68579e-05, Linf 0.00400885, total time[s] 0.074478 +Converged at iteration 22, L1 9.19086e-05, Linf 0.00366997, total time[s] 0.059051 +Converged at iteration 22, L1 5.55145e-05, Linf 0.00375355, total time[s] 0.065756 +Converged at iteration 34, L1 9.44256e-05, Linf 0.0168211, total time[s] 0.097505 +Converged at iteration 23, L1 9.77154e-05, Linf 0.00821711, total time[s] 0.061036 +Converged at iteration 25, L1 6.52431e-05, Linf 0.00570004, total time[s] 0.073172 +Converged at iteration 27, L1 6.17532e-05, Linf 0.00301711, total time[s] 0.070618 +Converged at iteration 24, L1 5.43369e-05, Linf 0.00272432, total time[s] 0.067307 +Converged at iteration 24, L1 7.47906e-05, Linf 0.00391821, total time[s] 0.064033 +Converged at iteration 28, L1 5.33428e-05, Linf 0.00436819, total time[s] 0.095894 +Converged at iteration 30, L1 7.38683e-05, Linf 0.00487042, total time[s] 0.078656 +Converged at iteration 28, L1 6.81724e-05, Linf 0.00498888, total time[s] 0.074355 +Converged at iteration 32, L1 8.16836e-05, Linf 0.00787763, total time[s] 0.100201 +Converged at iteration 30, L1 9.58701e-05, Linf 0.00293947, total time[s] 0.081801 +Converged at iteration 31, L1 8.44327e-05, Linf 0.0133165, total time[s] 0.07992 +Converged at iteration 32, L1 6.16543e-05, Linf 0.00334611, total time[s] 0.082684 +Converged at iteration 34, L1 3.97262e-05, Linf 0.00540907, total time[s] 0.092661 +Converged at iteration 32, L1 7.69434e-05, Linf 0.00937436, total time[s] 0.097796 +Converged at iteration 55, L1 5.93014e-05, Linf 0.00458821, total time[s] 0.14674 +Converged at iteration 30, L1 8.55651e-05, Linf 0.0234767, total time[s] 0.080627 +Converged at iteration 25, L1 9.70112e-05, Linf 0.00342486, total time[s] 0.068369 +Converged at iteration 38, L1 9.91983e-05, Linf 0.0275848, total time[s] 0.100349 +Converged at iteration 37, L1 6.4166e-05, Linf 0.0201679, total time[s] 0.10897 +Converged at iteration 25, L1 9.83611e-05, Linf 0.00430581, total time[s] 0.068205 +Converged at iteration 28, L1 6.25475e-05, Linf 0.0110403, total time[s] 0.085574 +Converged at iteration 26, L1 8.21137e-05, Linf 0.0058869, total time[s] 0.094799 +Converged at iteration 60, L1 9.3559e-05, Linf 0.00319136, total time[s] 0.168044 +Converged at iteration 22, L1 5.63385e-05, Linf 0.0131755, total time[s] 0.071712 +Converged at iteration 20, L1 6.19527e-05, Linf 0.00292063, total time[s] 0.063341 +Converged at iteration 24, L1 8.50337e-05, Linf 0.00425738, total time[s] 0.07523 +Converged at iteration 26, L1 7.01336e-05, Linf 0.00424825, total time[s] 0.071446 +Converged at iteration 22, L1 9.50403e-05, Linf 0.00376834, total time[s] 0.066288 +Converged at iteration 22, L1 6.54013e-05, Linf 0.00397163, total time[s] 0.068367 +Converged at iteration 39, L1 9.15901e-05, Linf 0.0023386, total time[s] 0.099039 +Converged at iteration 24, L1 5.30323e-05, Linf 0.00934955, total time[s] 0.066429 +Converged at iteration 25, L1 6.73218e-05, Linf 0.00595768, total time[s] 0.069134 +Converged at iteration 27, L1 6.30783e-05, Linf 0.00316955, total time[s] 0.070194 +Converged at iteration 24, L1 5.46125e-05, Linf 0.00280749, total time[s] 0.063201 +Converged at iteration 24, L1 6.92535e-05, Linf 0.00407297, total time[s] 0.06601 +Converged at iteration 28, L1 5.70919e-05, Linf 0.00462444, total time[s] 0.078952 +Converged at iteration 30, L1 8.60096e-05, Linf 0.00515958, total time[s] 0.07918 +Converged at iteration 28, L1 6.83009e-05, Linf 0.005013, total time[s] 0.079432 +Converged at iteration 32, L1 7.99109e-05, Linf 0.00776318, total time[s] 0.084357 +Converged at iteration 30, L1 9.70282e-05, Linf 0.00322617, total time[s] 0.078738 +Converged at iteration 31, L1 8.6144e-05, Linf 0.0132377, total time[s] 0.079771 +Converged at iteration 32, L1 6.72743e-05, Linf 0.00348131, total time[s] 0.082189 +Converged at iteration 33, L1 9.9669e-05, Linf 0.00997509, total time[s] 0.085481 +Converged at iteration 32, L1 7.7004e-05, Linf 0.00935393, total time[s] 0.081733 +Converged at iteration 34, L1 7.59278e-05, Linf 0.0150189, total time[s] 0.085964 +Converged at iteration 30, L1 9.29324e-05, Linf 0.0258735, total time[s] 0.080373 +Converged at iteration 26, L1 5.47272e-05, Linf 0.00242882, total time[s] 0.068524 +Converged at iteration 39, L1 2.66062e-05, Linf 0.00953509, total time[s] 0.098962 +Converged at iteration 37, L1 6.23308e-05, Linf 0.0196598, total time[s] 0.125727 +Converged at iteration 25, L1 9.65113e-05, Linf 0.0043391, total time[s] 0.108783 +Converged at iteration 28, L1 6.05276e-05, Linf 0.014032, total time[s] 0.084901 +Converged at iteration 26, L1 7.63487e-05, Linf 0.00638735, total time[s] 0.075435 +Converged at iteration 28, L1 9.50402e-05, Linf 0.0106392, total time[s] 0.07124 +Converged at iteration 22, L1 5.51003e-05, Linf 0.0125877, total time[s] 0.060169 +Converged at iteration 20, L1 6.02557e-05, Linf 0.00277683, total time[s] 0.07215 +Converged at iteration 24, L1 8.34822e-05, Linf 0.00420413, total time[s] 0.100206 +Converged at iteration 26, L1 6.86835e-05, Linf 0.00412451, total time[s] 0.077992 +Converged at iteration 22, L1 9.36474e-05, Linf 0.00372449, total time[s] 0.063703 +Converged at iteration 22, L1 5.80038e-05, Linf 0.00386998, total time[s] 0.079886 +Converged at iteration 35, L1 5.06934e-05, Linf 0.00624298, total time[s] 0.117732 +Converged at iteration 24, L1 6.52031e-05, Linf 0.00563037, total time[s] 0.068602 +Converged at iteration 25, L1 6.60659e-05, Linf 0.00582939, total time[s] 0.066011 +Converged at iteration 27, L1 6.25865e-05, Linf 0.00308425, total time[s] 0.071892 +Converged at iteration 24, L1 5.53827e-05, Linf 0.00276687, total time[s] 0.062655 +Converged at iteration 24, L1 7.09426e-05, Linf 0.00400934, total time[s] 0.065776 +Converged at iteration 28, L1 5.80897e-05, Linf 0.00448301, total time[s] 0.074095 +Converged at iteration 30, L1 7.97372e-05, Linf 0.00501681, total time[s] 0.078705 +Converged at iteration 28, L1 6.82464e-05, Linf 0.00501578, total time[s] 0.078901 +Converged at iteration 32, L1 8.09025e-05, Linf 0.00783387, total time[s] 0.088273 +Converged at iteration 30, L1 9.628e-05, Linf 0.00308072, total time[s] 0.081158 +Converged at iteration 31, L1 9.06747e-05, Linf 0.013277, total time[s] 0.081219 +Converged at iteration 32, L1 6.93038e-05, Linf 0.00341109, total time[s] 0.082696 +Converged at iteration 33, L1 9.98486e-05, Linf 0.00955619, total time[s] 0.08279 +Converged at iteration 32, L1 7.6971e-05, Linf 0.00929275, total time[s] 0.080933 +Converged at iteration 34, L1 7.76046e-05, Linf 0.0159759, total time[s] 0.086432 +Converged at iteration 30, L1 9.54021e-05, Linf 0.0242994, total time[s] 0.076751 +Converged at iteration 26, L1 5.35237e-05, Linf 0.00237278, total time[s] 0.067623 +Converged at iteration 39, L1 2.59328e-05, Linf 0.00959935, total time[s] 0.099197 +Converged at iteration 37, L1 6.20753e-05, Linf 0.0194915, total time[s] 0.097008 +Converged at iteration 25, L1 9.64384e-05, Linf 0.00434175, total time[s] 0.075357 +Converged at iteration 28, L1 5.59208e-05, Linf 0.00972697, total time[s] 0.073739 +Converged at iteration 26, L1 7.41369e-05, Linf 0.00628173, total time[s] 0.066914 +Converged at iteration 28, L1 9.6186e-05, Linf 0.0104406, total time[s] 0.075013 +Converged at iteration 22, L1 5.44624e-05, Linf 0.0129671, total time[s] 0.063806 +Converged at iteration 20, L1 5.93839e-05, Linf 0.00274563, total time[s] 0.062325 +Converged at iteration 24, L1 8.33459e-05, Linf 0.00418495, total time[s] 0.064634 +Converged at iteration 26, L1 6.76452e-05, Linf 0.00406655, total time[s] 0.077391 +Converged at iteration 22, L1 9.44882e-05, Linf 0.0037001, total time[s] 0.065986 +Converged at iteration 22, L1 5.76532e-05, Linf 0.00381222, total time[s] 0.060914 +Converged at iteration 34, L1 9.79538e-05, Linf 0.016856, total time[s] 0.121714 +Converged at iteration 24, L1 5.21085e-05, Linf 0.00403549, total time[s] 0.065676 +Converged at iteration 25, L1 6.76135e-05, Linf 0.00576489, total time[s] 0.067326 +Converged at iteration 27, L1 6.17851e-05, Linf 0.00304889, total time[s] 0.070834 +Converged at iteration 24, L1 5.57636e-05, Linf 0.00274747, total time[s] 0.075359 +Converged at iteration 24, L1 7.30494e-05, Linf 0.00396898, total time[s] 0.065905 +Converged at iteration 28, L1 5.42399e-05, Linf 0.00442954, total time[s] 0.074033 +Converged at iteration 30, L1 7.6887e-05, Linf 0.00492902, total time[s] 0.0781 +Converged at iteration 28, L1 6.88122e-05, Linf 0.00500805, total time[s] 0.074225 +Converged at iteration 32, L1 8.1182e-05, Linf 0.00784987, total time[s] 0.09154 +Converged at iteration 31, L1 6.05468e-05, Linf 0.00199693, total time[s] 0.088089 +Converged at iteration 31, L1 8.46479e-05, Linf 0.0132967, total time[s] 0.078545 +Converged at iteration 32, L1 6.43572e-05, Linf 0.00338169, total time[s] 0.084069 +Converged at iteration 34, L1 3.97953e-05, Linf 0.00547367, total time[s] 0.095292 +Converged at iteration 32, L1 7.70816e-05, Linf 0.0093332, total time[s] 0.087546 +Converged at iteration 34, L1 7.55408e-05, Linf 0.0161446, total time[s] 0.090553 +Converged at iteration 30, L1 8.77259e-05, Linf 0.0250109, total time[s] 0.082323 +Converged at iteration 26, L1 5.67696e-05, Linf 0.00474027, total time[s] 0.069868 +Converged at iteration 39, L1 2.61954e-05, Linf 0.0092274, total time[s] 0.103334 +Converged at iteration 37, L1 6.28698e-05, Linf 0.0206459, total time[s] 0.099128 +Converged at iteration 25, L1 9.64736e-05, Linf 0.00434138, total time[s] 0.073917 +Converged at iteration 28, L1 5.70433e-05, Linf 0.009942, total time[s] 0.082387 +Converged at iteration 26, L1 7.59283e-05, Linf 0.00644637, total time[s] 0.069924 +Converged at iteration 28, L1 9.61349e-05, Linf 0.0104284, total time[s] 0.080571 +Converged at iteration 22, L1 5.47512e-05, Linf 0.0130663, total time[s] 0.07686 +Converged at iteration 20, L1 5.92958e-05, Linf 0.00277307, total time[s] 0.060382 +Converged at iteration 24, L1 8.33759e-05, Linf 0.00418246, total time[s] 0.065165 +Converged at iteration 26, L1 6.82423e-05, Linf 0.00409599, total time[s] 0.083852 +Converged at iteration 22, L1 9.34689e-05, Linf 0.00371334, total time[s] 0.064142 +Converged at iteration 22, L1 5.79935e-05, Linf 0.00384298, total time[s] 0.062406 +Converged at iteration 34, L1 9.95391e-05, Linf 0.0169835, total time[s] 0.091989 +Converged at iteration 24, L1 6.16931e-05, Linf 0.00408189, total time[s] 0.085552 +Converged at iteration 25, L1 6.73005e-05, Linf 0.00579713, total time[s] 0.086284 +Converged at iteration 27, L1 6.32591e-05, Linf 0.00306572, total time[s] 0.079907 +Converged at iteration 24, L1 5.56901e-05, Linf 0.00275724, total time[s] 0.073947 +Converged at iteration 24, L1 7.29206e-05, Linf 0.00398523, total time[s] 0.067752 +Converged at iteration 28, L1 5.69274e-05, Linf 0.00447172, total time[s] 0.102837 +Converged at iteration 30, L1 7.8517e-05, Linf 0.0049778, total time[s] 0.095903 +Converged at iteration 28, L1 6.82657e-05, Linf 0.00501145, total time[s] 0.081683 +Converged at iteration 32, L1 8.10965e-05, Linf 0.00784407, total time[s] 0.09269 +Converged at iteration 30, L1 9.51894e-05, Linf 0.00304899, total time[s] 0.092899 +Converged at iteration 31, L1 8.58606e-05, Linf 0.0132871, total time[s] 0.098236 +Converged at iteration 32, L1 6.01588e-05, Linf 0.00339401, total time[s] 0.096103 +Converged at iteration 33, L1 9.97856e-05, Linf 0.00960245, total time[s] 0.10424 +Converged at iteration 32, L1 7.95834e-05, Linf 0.00930814, total time[s] 0.095317 +Converged at iteration 34, L1 7.49648e-05, Linf 0.015217, total time[s] 0.103347 +Converged at iteration 31, L1 3.87323e-05, Linf 0.00675963, total time[s] 0.089013 +Converged at iteration 25, L1 9.79518e-05, Linf 0.00347806, total time[s] 0.151159 +Converged at iteration 39, L1 2.74815e-05, Linf 0.00918159, total time[s] 0.139957 +Converged at iteration 37, L1 6.28419e-05, Linf 0.0198084, total time[s] 0.117503 +Converged at iteration 25, L1 9.6465e-05, Linf 0.00434026, total time[s] 0.07159 +Converged at iteration 28, L1 5.75847e-05, Linf 0.0100515, total time[s] 0.083295 +Converged at iteration 26, L1 7.56347e-05, Linf 0.0061971, total time[s] 0.078337 +Converged at iteration 28, L1 9.5017e-05, Linf 0.0100364, total time[s] 0.100521 +Converged at iteration 22, L1 5.46457e-05, Linf 0.0127229, total time[s] 0.086171 +Converged at iteration 20, L1 5.9592e-05, Linf 0.00278882, total time[s] 0.086229 +Converged at iteration 24, L1 8.31506e-05, Linf 0.00420234, total time[s] 0.073619 +Converged at iteration 26, L1 6.84807e-05, Linf 0.00410988, total time[s] 0.109841 +Converged at iteration 22, L1 9.28671e-05, Linf 0.00371901, total time[s] 0.072064 +Converged at iteration 22, L1 5.81653e-05, Linf 0.00385398, total time[s] 0.070357 +Converged at iteration 35, L1 5.01698e-05, Linf 0.0061594, total time[s] 0.118648 +Converged at iteration 24, L1 4.83967e-05, Linf 0.00407655, total time[s] 0.078546 +Converged at iteration 25, L1 6.63039e-05, Linf 0.00581327, total time[s] 0.07803 +Converged at iteration 27, L1 6.22731e-05, Linf 0.00307481, total time[s] 0.091511 +Converged at iteration 24, L1 5.49045e-05, Linf 0.00276213, total time[s] 0.076271 +Converged at iteration 24, L1 7.12404e-05, Linf 0.00399902, total time[s] 0.067731 +Converged at iteration 28, L1 5.49923e-05, Linf 0.00447781, total time[s] 0.082246 +Converged at iteration 30, L1 7.93879e-05, Linf 0.00499594, total time[s] 0.09043 +Converged at iteration 28, L1 6.82778e-05, Linf 0.00501254, total time[s] 0.079191 +Converged at iteration 32, L1 8.07997e-05, Linf 0.00784403, total time[s] 0.102333 +Converged at iteration 30, L1 9.45503e-05, Linf 0.00306357, total time[s] 0.118414 +Converged at iteration 31, L1 8.49139e-05, Linf 0.0132812, total time[s] 0.104483 +Converged at iteration 32, L1 6.0854e-05, Linf 0.00340492, total time[s] 0.084753 +Converged at iteration 33, L1 9.94714e-05, Linf 0.00963879, total time[s] 0.087882 +Converged at iteration 32, L1 7.85602e-05, Linf 0.0102893, total time[s] 0.090699 +Converged at iteration 34, L1 7.50706e-05, Linf 0.0152039, total time[s] 0.102725 +Converged at iteration 30, L1 9.84839e-05, Linf 0.0245097, total time[s] 0.098144 +Converged at iteration 25, L1 9.7444e-05, Linf 0.00349096, total time[s] 0.087512 +Converged at iteration 39, L1 2.67206e-05, Linf 0.00943586, total time[s] 0.114979 +Converged at iteration 37, L1 6.21457e-05, Linf 0.0198206, total time[s] 0.257865 +Converged at iteration 25, L1 9.64887e-05, Linf 0.0043397, total time[s] 0.092177 +Converged at iteration 28, L1 5.79236e-05, Linf 0.0101057, total time[s] 0.114945 +Converged at iteration 26, L1 7.60549e-05, Linf 0.00618626, total time[s] 0.094163 +Converged at iteration 30, L1 6.9366e-05, Linf 0.00352438, total time[s] 0.116424 +Converged at iteration 22, L1 5.48356e-05, Linf 0.012756, total time[s] 0.096173 +Converged at iteration 20, L1 6.03954e-05, Linf 0.00279589, total time[s] 0.062938 +Converged at iteration 24, L1 8.30586e-05, Linf 0.00420342, total time[s] 0.081392 +Converged at iteration 26, L1 6.84963e-05, Linf 0.00411716, total time[s] 0.081539 +Converged at iteration 22, L1 9.29992e-05, Linf 0.00372177, total time[s] 0.061884 +Converged at iteration 22, L1 5.83364e-05, Linf 0.0038608, total time[s] 0.065852 +Converged at iteration 35, L1 5.03095e-05, Linf 0.00619349, total time[s] 0.105674 +Converged at iteration 24, L1 5.59038e-05, Linf 0.00408445, total time[s] 0.070488 +Converged at iteration 25, L1 6.65393e-05, Linf 0.0058218, total time[s] 0.078159 +Converged at iteration 27, L1 6.26905e-05, Linf 0.0030795, total time[s] 0.096085 +Converged at iteration 24, L1 5.49487e-05, Linf 0.00276451, total time[s] 0.078445 +Converged at iteration 24, L1 7.09846e-05, Linf 0.00400413, total time[s] 0.066378 +Converged at iteration 28, L1 5.4964e-05, Linf 0.00448276, total time[s] 0.081793 +Converged at iteration 30, L1 7.95235e-05, Linf 0.00500325, total time[s] 0.09362 +Converged at iteration 28, L1 6.87907e-05, Linf 0.00501196, total time[s] 0.079173 +Converged at iteration 32, L1 8.09964e-05, Linf 0.00784368, total time[s] 0.087746 +Converged at iteration 30, L1 9.4821e-05, Linf 0.0030717, total time[s] 0.084067 +Converged at iteration 31, L1 8.50056e-05, Linf 0.0136621, total time[s] 0.109447 +Converged at iteration 32, L1 6.69411e-05, Linf 0.00340988, total time[s] 0.085478 +Converged at iteration 33, L1 9.94145e-05, Linf 0.00966493, total time[s] 0.087622 +Converged at iteration 32, L1 7.75884e-05, Linf 0.00944477, total time[s] 0.095477 +Converged at iteration 39, L1 7.83256e-05, Linf 0.00471854, total time[s] 0.116981 +Converged at iteration 30, L1 8.9168e-05, Linf 0.0245876, total time[s] 0.085738 +Converged at iteration 26, L1 5.21658e-05, Linf 0.00238066, total time[s] 0.074364 +Converged at iteration 39, L1 2.60824e-05, Linf 0.00917118, total time[s] 0.096791 +Converged at iteration 37, L1 6.23914e-05, Linf 0.0198478, total time[s] 0.100973 +Converged at iteration 25, L1 9.64615e-05, Linf 0.00433967, total time[s] 0.074952 +Converged at iteration 28, L1 5.79213e-05, Linf 0.0101258, total time[s] 0.09447 +Converged at iteration 26, L1 7.62264e-05, Linf 0.0061747, total time[s] 0.080177 +Converged at iteration 28, L1 9.40409e-05, Linf 0.00998663, total time[s] 0.087461 +Converged at iteration 22, L1 5.51041e-05, Linf 0.0127644, total time[s] 0.097173 +Converged at iteration 20, L1 5.97499e-05, Linf 0.00279939, total time[s] 0.069909 +Converged at iteration 24, L1 8.3243e-05, Linf 0.00420462, total time[s] 0.069422 +Converged at iteration 26, L1 6.86372e-05, Linf 0.00412081, total time[s] 0.163382 +Converged at iteration 22, L1 9.3855e-05, Linf 0.00372313, total time[s] 0.083986 +Converged at iteration 22, L1 5.70365e-05, Linf 0.00386698, total time[s] 0.059672 +Converged at iteration 35, L1 5.04225e-05, Linf 0.00622054, total time[s] 0.090804 +Converged at iteration 24, L1 4.85288e-05, Linf 0.00408863, total time[s] 0.064659 +Converged at iteration 25, L1 6.6162e-05, Linf 0.00582551, total time[s] 0.0667 +Converged at iteration 27, L1 6.34955e-05, Linf 0.00308186, total time[s] 0.072806 +Converged at iteration 24, L1 5.49924e-05, Linf 0.00276554, total time[s] 0.06458 +Converged at iteration 24, L1 7.21287e-05, Linf 0.00400873, total time[s] 0.064022 +Converged at iteration 28, L1 5.62335e-05, Linf 0.0044892, total time[s] 0.072999 +Converged at iteration 30, L1 8.03837e-05, Linf 0.00503048, total time[s] 0.077566 +Converged at iteration 28, L1 7.02864e-05, Linf 0.00516482, total time[s] 0.072523 +Converged at iteration 32, L1 8.08949e-05, Linf 0.00785063, total time[s] 0.081281 +Converged at iteration 30, L1 9.48864e-05, Linf 0.00307855, total time[s] 0.077121 +Converged at iteration 31, L1 8.84193e-05, Linf 0.0132764, total time[s] 0.081593 +Converged at iteration 32, L1 7.20027e-05, Linf 0.00921952, total time[s] 0.081437 +Converged at iteration 34, L1 4.23882e-05, Linf 0.00550198, total time[s] 0.08597 +Converged at iteration 32, L1 7.76931e-05, Linf 0.00944966, total time[s] 0.080923 +Converged at iteration 34, L1 7.59398e-05, Linf 0.015187, total time[s] 0.086033 +Converged at iteration 31, L1 4.14236e-05, Linf 0.00681176, total time[s] 0.079183 +Converged at iteration 26, L1 5.41222e-05, Linf 0.00236974, total time[s] 0.072049 +Converged at iteration 40, L1 6.71342e-05, Linf 0.00367627, total time[s] 0.104991 +Converged at iteration 35, L1 7.60938e-05, Linf 0.0033974, total time[s] 0.091261 +Converged at iteration 30, L1 9.62526e-05, Linf 0.0043264, total time[s] 0.074464 +Converged at iteration 31, L1 6.19657e-05, Linf 0.00502563, total time[s] 0.076002 +Converged at iteration 27, L1 6.25942e-05, Linf 0.00499543, total time[s] 0.066075 +Converged at iteration 22, L1 8.58861e-05, Linf 0.0044885, total time[s] 0.056427 +Converged at iteration 20, L1 9.60206e-05, Linf 0.00397848, total time[s] 0.052219 +Converged at iteration 24, L1 8.84323e-05, Linf 0.00482885, total time[s] 0.067507 +Converged at iteration 28, L1 7.3889e-05, Linf 0.00446135, total time[s] 0.072771 +Converged at iteration 26, L1 8.11722e-05, Linf 0.00547505, total time[s] 0.068416 +Converged at iteration 22, L1 7.42212e-05, Linf 0.00511771, total time[s] 0.05811 +Converged at iteration 19, L1 6.63305e-05, Linf 0.00393176, total time[s] 0.051428 +Converged at iteration 30, L1 7.98739e-05, Linf 0.00329884, total time[s] 0.086525 +Converged at iteration 20, L1 8.44399e-05, Linf 0.00465306, total time[s] 0.051919 +Converged at iteration 24, L1 7.1086e-05, Linf 0.00463287, total time[s] 0.061469 +Converged at iteration 31, L1 8.93592e-05, Linf 0.00569187, total time[s] 0.077824 +Converged at iteration 27, L1 9.9136e-05, Linf 0.005698, total time[s] 0.069163 +Converged at iteration 24, L1 8.79062e-05, Linf 0.0046502, total time[s] 0.07038 +Converged at iteration 23, L1 9.22638e-05, Linf 0.004102, total time[s] 0.074746 +Converged at iteration 26, L1 7.22119e-05, Linf 0.00446119, total time[s] 0.066533 +Converged at iteration 29, L1 7.81421e-05, Linf 0.00479591, total time[s] 0.07418 +Converged at iteration 34, L1 7.09388e-05, Linf 0.00422895, total time[s] 0.08532 +Converged at iteration 30, L1 9.3944e-05, Linf 0.00442591, total time[s] 0.080707 +Converged at iteration 28, L1 9.49804e-05, Linf 0.00309455, total time[s] 0.082042 +Converged at iteration 32, L1 9.44432e-05, Linf 0.00374365, total time[s] 0.080485 +Converged at iteration 37, L1 7.44688e-05, Linf 0.00327758, total time[s] 0.091948 +Converged at iteration 33, L1 8.4514e-05, Linf 0.00469104, total time[s] 0.082927 +Converged at iteration 28, L1 9.65034e-05, Linf 0.0043016, total time[s] 0.071673 +Converged at iteration 24, L1 8.83131e-05, Linf 0.00325072, total time[s] 0.066108 +Converged at iteration 26, L1 9.01667e-05, Linf 0.00381927, total time[s] 0.075193 +Converged at iteration 40, L1 6.67287e-05, Linf 0.0039334, total time[s] 0.104638 +Converged at iteration 35, L1 8.6886e-05, Linf 0.00360632, total time[s] 0.088476 +Converged at iteration 30, L1 9.23483e-05, Linf 0.00415438, total time[s] 0.076057 +Converged at iteration 31, L1 6.21001e-05, Linf 0.00504682, total time[s] 0.077914 +Converged at iteration 26, L1 9.83769e-05, Linf 0.00577605, total time[s] 0.066292 +Converged at iteration 22, L1 7.17019e-05, Linf 0.00418206, total time[s] 0.059211 +Converged at iteration 21, L1 6.44898e-05, Linf 0.00348437, total time[s] 0.055229 +Converged at iteration 24, L1 8.94226e-05, Linf 0.00496496, total time[s] 0.062305 +Converged at iteration 28, L1 7.38298e-05, Linf 0.00443932, total time[s] 0.071332 +Converged at iteration 26, L1 8.02237e-05, Linf 0.00534475, total time[s] 0.066649 +Converged at iteration 22, L1 7.0552e-05, Linf 0.00441483, total time[s] 0.057397 +Converged at iteration 19, L1 5.49391e-05, Linf 0.00332056, total time[s] 0.050757 +Converged at iteration 30, L1 9.53195e-05, Linf 0.00330738, total time[s] 0.079084 +Converged at iteration 20, L1 8.42606e-05, Linf 0.00472678, total time[s] 0.052343 +Converged at iteration 24, L1 7.12206e-05, Linf 0.00475279, total time[s] 0.06165 +Converged at iteration 31, L1 9.41737e-05, Linf 0.00481986, total time[s] 0.078075 +Converged at iteration 27, L1 9.41351e-05, Linf 0.00468331, total time[s] 0.069308 +Converged at iteration 24, L1 8.52431e-05, Linf 0.00428051, total time[s] 0.070059 +Converged at iteration 23, L1 9.23978e-05, Linf 0.00432074, total time[s] 0.062187 +Converged at iteration 26, L1 7.13262e-05, Linf 0.00465405, total time[s] 0.079568 +Converged at iteration 29, L1 7.52223e-05, Linf 0.00488615, total time[s] 0.072211 +Converged at iteration 34, L1 8.13606e-05, Linf 0.00403917, total time[s] 0.083765 +Converged at iteration 31, L1 7.1763e-05, Linf 0.00355317, total time[s] 0.078661 +Converged at iteration 29, L1 7.02516e-05, Linf 0.00272481, total time[s] 0.074865 +Converged at iteration 32, L1 8.2726e-05, Linf 0.00354805, total time[s] 0.079622 +Converged at iteration 36, L1 8.7344e-05, Linf 0.0035946, total time[s] 0.090629 +Converged at iteration 33, L1 8.32446e-05, Linf 0.00484799, total time[s] 0.083193 +Converged at iteration 28, L1 9.10449e-05, Linf 0.00413137, total time[s] 0.071124 +Converged at iteration 24, L1 8.02988e-05, Linf 0.00290884, total time[s] 0.062638 +Converged at iteration 26, L1 8.45248e-05, Linf 0.00392398, total time[s] 0.066292 +Converged at iteration 40, L1 6.50171e-05, Linf 0.00418306, total time[s] 0.099321 +Converged at iteration 35, L1 9.64217e-05, Linf 0.00385477, total time[s] 0.090577 +Converged at iteration 30, L1 7.65415e-05, Linf 0.00420731, total time[s] 0.078729 +Converged at iteration 31, L1 6.17552e-05, Linf 0.00506463, total time[s] 0.081533 +Converged at iteration 26, L1 9.11383e-05, Linf 0.00568966, total time[s] 0.068757 +Converged at iteration 21, L1 9.60221e-05, Linf 0.00461207, total time[s] 0.063321 +Converged at iteration 21, L1 6.92669e-05, Linf 0.00393164, total time[s] 0.064319 +Converged at iteration 24, L1 8.29871e-05, Linf 0.00519938, total time[s] 0.064114 +Converged at iteration 28, L1 6.80069e-05, Linf 0.00440907, total time[s] 0.099821 +Converged at iteration 26, L1 8.12492e-05, Linf 0.00431826, total time[s] 0.101032 +Converged at iteration 21, L1 8.51121e-05, Linf 0.00433737, total time[s] 0.059781 +Converged at iteration 18, L1 7.37611e-05, Linf 0.00298989, total time[s] 0.051799 +Converged at iteration 31, L1 7.48927e-05, Linf 0.00268238, total time[s] 0.081659 +Converged at iteration 20, L1 8.18446e-05, Linf 0.00494539, total time[s] 0.053358 +Converged at iteration 24, L1 6.88906e-05, Linf 0.00499741, total time[s] 0.064864 +Converged at iteration 30, L1 9.41545e-05, Linf 0.00345566, total time[s] 0.081859 +Converged at iteration 25, L1 9.0155e-05, Linf 0.00466623, total time[s] 0.065733 +Converged at iteration 23, L1 8.35872e-05, Linf 0.00393111, total time[s] 0.060403 +Converged at iteration 23, L1 9.32952e-05, Linf 0.00455938, total time[s] 0.061185 +Converged at iteration 26, L1 6.88923e-05, Linf 0.00492269, total time[s] 0.068271 +Converged at iteration 29, L1 7.12694e-05, Linf 0.00490059, total time[s] 0.079839 +Converged at iteration 32, L1 8.57715e-05, Linf 0.0035015, total time[s] 0.088034 +Converged at iteration 31, L1 7.25467e-05, Linf 0.003048, total time[s] 0.086414 +Converged at iteration 29, L1 7.73521e-05, Linf 0.00289707, total time[s] 0.075492 +Converged at iteration 32, L1 7.57835e-05, Linf 0.00338821, total time[s] 0.085032 +Converged at iteration 35, L1 9.72509e-05, Linf 0.00406386, total time[s] 0.089737 +Converged at iteration 33, L1 8.06329e-05, Linf 0.00500355, total time[s] 0.083064 +Converged at iteration 28, L1 8.42751e-05, Linf 0.00398747, total time[s] 0.076475 +Converged at iteration 24, L1 7.80462e-05, Linf 0.00256146, total time[s] 0.0706 +Converged at iteration 26, L1 8.36315e-05, Linf 0.00405328, total time[s] 0.065657 +Converged at iteration 39, L1 9.33911e-05, Linf 0.00548868, total time[s] 0.096733 +Converged at iteration 36, L1 7.28782e-05, Linf 0.00384483, total time[s] 0.092722 +Converged at iteration 27, L1 5.17241e-05, Linf 0.00565824, total time[s] 0.068838 +Converged at iteration 31, L1 6.04568e-05, Linf 0.00508914, total time[s] 0.077035 +Converged at iteration 26, L1 7.63223e-05, Linf 0.00544344, total time[s] 0.071757 +Converged at iteration 21, L1 7.19211e-05, Linf 0.00380743, total time[s] 0.06887 +Converged at iteration 20, L1 6.893e-05, Linf 0.00502794, total time[s] 0.058284 +Converged at iteration 22, L1 7.53441e-05, Linf 0.00759128, total time[s] 0.064746 +Converged at iteration 26, L1 9.72512e-05, Linf 0.00651837, total time[s] 0.071821 +Converged at iteration 25, L1 7.44581e-05, Linf 0.00412422, total time[s] 0.065119 +Converged at iteration 20, L1 8.84175e-05, Linf 0.00555827, total time[s] 0.054248 +Converged at iteration 17, L1 8.52471e-05, Linf 0.00400213, total time[s] 0.045402 +Converged at iteration 31, L1 9.13849e-05, Linf 0.00277121, total time[s] 0.079458 +Converged at iteration 20, L1 6.6414e-05, Linf 0.00539278, total time[s] 0.051463 +Converged at iteration 24, L1 6.21069e-05, Linf 0.00552686, total time[s] 0.066747 +Converged at iteration 28, L1 7.07415e-05, Linf 0.00373886, total time[s] 0.071743 +Converged at iteration 23, L1 9.56707e-05, Linf 0.00710106, total time[s] 0.058337 +Converged at iteration 21, L1 9.30106e-05, Linf 0.0048513, total time[s] 0.060206 +Converged at iteration 23, L1 7.86622e-05, Linf 0.0042781, total time[s] 0.058731 +Converged at iteration 25, L1 9.94336e-05, Linf 0.00626438, total time[s] 0.065946 +Converged at iteration 28, L1 9.8256e-05, Linf 0.00586729, total time[s] 0.085482 +Converged at iteration 30, L1 6.8633e-05, Linf 0.00488175, total time[s] 0.074594 +Converged at iteration 28, L1 8.30339e-05, Linf 0.00350206, total time[s] 0.090315 +Converged at iteration 29, L1 8.81949e-05, Linf 0.00329484, total time[s] 0.076827 +Converged at iteration 31, L1 6.93373e-05, Linf 0.00290639, total time[s] 0.089323 +Converged at iteration 31, L1 9.11092e-05, Linf 0.00460221, total time[s] 0.07796 +Converged at iteration 33, L1 7.40788e-05, Linf 0.00530596, total time[s] 0.081419 +Converged at iteration 28, L1 6.99534e-05, Linf 0.00368888, total time[s] 0.070159 +Converged at iteration 24, L1 8.8104e-05, Linf 0.00186806, total time[s] 0.081203 +Converged at iteration 25, L1 6.96138e-05, Linf 0.00424598, total time[s] 0.069968 +Converged at iteration 39, L1 7.64718e-05, Linf 0.0063509, total time[s] 0.095803 +Converged at iteration 36, L1 7.31093e-05, Linf 0.00528136, total time[s] 0.098113 +Converged at iteration 24, L1 7.4866e-05, Linf 0.00410962, total time[s] 0.068648 +Converged at iteration 31, L1 5.87403e-05, Linf 0.00509163, total time[s] 0.083273 +Converged at iteration 25, L1 8.69325e-05, Linf 0.00571603, total time[s] 0.062852 +Converged at iteration 20, L1 9.16226e-05, Linf 0.00380206, total time[s] 0.050938 +Converged at iteration 19, L1 6.59644e-05, Linf 0.00441336, total time[s] 0.051512 +Converged at iteration 20, L1 9.17779e-05, Linf 0.00663658, total time[s] 0.055036 +Converged at iteration 24, L1 7.94685e-05, Linf 0.00495826, total time[s] 0.064566 +Converged at iteration 24, L1 7.5846e-05, Linf 0.00495168, total time[s] 0.067981 +Converged at iteration 20, L1 6.05534e-05, Linf 0.00519212, total time[s] 0.051595 +Converged at iteration 17, L1 5.20036e-05, Linf 0.00244089, total time[s] 0.053755 +Converged at iteration 32, L1 6.9088e-05, Linf 0.00254341, total time[s] 0.079214 +Converged at iteration 19, L1 9.3665e-05, Linf 0.00688572, total time[s] 0.06648 +Converged at iteration 23, L1 7.81668e-05, Linf 0.00710086, total time[s] 0.062546 +Converged at iteration 26, L1 8.14235e-05, Linf 0.00603279, total time[s] 0.065155 +Converged at iteration 23, L1 5.79516e-05, Linf 0.00604583, total time[s] 0.060195 +Converged at iteration 20, L1 8.31352e-05, Linf 0.00552682, total time[s] 0.050717 +Converged at iteration 22, L1 9.95502e-05, Linf 0.00479376, total time[s] 0.056697 +Converged at iteration 25, L1 8.56043e-05, Linf 0.0045432, total time[s] 0.063666 +Converged at iteration 28, L1 7.84056e-05, Linf 0.00358746, total time[s] 0.070037 +Converged at iteration 29, L1 7.49177e-05, Linf 0.00611982, total time[s] 0.071293 +Converged at iteration 27, L1 7.35924e-05, Linf 0.00402013, total time[s] 0.067771 +Converged at iteration 29, L1 7.65682e-05, Linf 0.00380597, total time[s] 0.072021 +Converged at iteration 29, L1 9.18059e-05, Linf 0.00277217, total time[s] 0.072312 +Converged at iteration 28, L1 8.32076e-05, Linf 0.00273875, total time[s] 0.070792 +Converged at iteration 33, L1 6.17854e-05, Linf 0.00584927, total time[s] 0.080731 +Converged at iteration 27, L1 6.87681e-05, Linf 0.00334626, total time[s] 0.067524 +Converged at iteration 24, L1 9.65666e-05, Linf 0.00239088, total time[s] 0.061015 +Converged at iteration 23, L1 7.56583e-05, Linf 0.00333628, total time[s] 0.058914 +Converged at iteration 39, L1 7.43871e-05, Linf 0.00661421, total time[s] 0.095427 +Converged at iteration 36, L1 7.17142e-05, Linf 0.00533653, total time[s] 0.091057 +Converged at iteration 24, L1 7.43373e-05, Linf 0.00388462, total time[s] 0.06173 +Converged at iteration 31, L1 5.76967e-05, Linf 0.00507395, total time[s] 0.076808 +Converged at iteration 25, L1 8.74913e-05, Linf 0.00584041, total time[s] 0.062913 +Converged at iteration 20, L1 9.40664e-05, Linf 0.00386639, total time[s] 0.051985 +Converged at iteration 19, L1 6.41428e-05, Linf 0.00438275, total time[s] 0.055577 +Converged at iteration 20, L1 9.02377e-05, Linf 0.00655212, total time[s] 0.058502 +Converged at iteration 24, L1 7.67393e-05, Linf 0.00459179, total time[s] 0.091954 +Converged at iteration 24, L1 7.67883e-05, Linf 0.00497061, total time[s] 0.06634 +Converged at iteration 20, L1 6.12158e-05, Linf 0.00515332, total time[s] 0.056923 +Converged at iteration 16, L1 9.93319e-05, Linf 0.00457313, total time[s] 0.101845 +Converged at iteration 32, L1 6.89811e-05, Linf 0.00257437, total time[s] 0.08167 +Converged at iteration 19, L1 9.32945e-05, Linf 0.00680648, total time[s] 0.050374 +Converged at iteration 23, L1 7.73172e-05, Linf 0.00661132, total time[s] 0.058912 +Converged at iteration 26, L1 7.99146e-05, Linf 0.00596611, total time[s] 0.064652 +Converged at iteration 23, L1 5.70402e-05, Linf 0.00596405, total time[s] 0.059465 +Converged at iteration 20, L1 8.25408e-05, Linf 0.00551221, total time[s] 0.051399 +Converged at iteration 23, L1 6.34954e-05, Linf 0.00299056, total time[s] 0.060549 +Converged at iteration 25, L1 8.37495e-05, Linf 0.00419644, total time[s] 0.06276 +Converged at iteration 28, L1 7.73349e-05, Linf 0.00347411, total time[s] 0.068978 +Converged at iteration 29, L1 7.46123e-05, Linf 0.0061099, total time[s] 0.07126 +Converged at iteration 27, L1 7.37011e-05, Linf 0.0040022, total time[s] 0.068753 +Converged at iteration 29, L1 7.80995e-05, Linf 0.00380192, total time[s] 0.071262 +Converged at iteration 29, L1 9.26971e-05, Linf 0.00277467, total time[s] 0.071117 +Converged at iteration 28, L1 8.26958e-05, Linf 0.00266535, total time[s] 0.069913 +Converged at iteration 33, L1 5.99878e-05, Linf 0.00585307, total time[s] 0.082144 +Converged at iteration 27, L1 6.87702e-05, Linf 0.0034311, total time[s] 0.067827 +Converged at iteration 24, L1 9.89957e-05, Linf 0.00243498, total time[s] 0.061378 +Converged at iteration 23, L1 7.49224e-05, Linf 0.00326573, total time[s] 0.058312 +Converged at iteration 39, L1 7.24372e-05, Linf 0.00662489, total time[s] 0.101683 +Converged at iteration 36, L1 7.00716e-05, Linf 0.00539874, total time[s] 0.090361 +Converged at iteration 24, L1 7.36872e-05, Linf 0.00367951, total time[s] 0.06103 +Converged at iteration 31, L1 5.585e-05, Linf 0.00504471, total time[s] 0.076698 +Converged at iteration 25, L1 8.8689e-05, Linf 0.00599547, total time[s] 0.064672 +Converged at iteration 20, L1 9.83713e-05, Linf 0.00391929, total time[s] 0.052457 +Converged at iteration 19, L1 6.18763e-05, Linf 0.00426945, total time[s] 0.052707 +Converged at iteration 20, L1 8.84551e-05, Linf 0.00608391, total time[s] 0.055736 +Converged at iteration 24, L1 7.44661e-05, Linf 0.00420046, total time[s] 0.063504 +Converged at iteration 24, L1 7.79689e-05, Linf 0.0050882, total time[s] 0.062072 +Converged at iteration 20, L1 6.23006e-05, Linf 0.00517783, total time[s] 0.055156 +Converged at iteration 16, L1 9.7911e-05, Linf 0.00481189, total time[s] 0.052612 +Converged at iteration 32, L1 6.85159e-05, Linf 0.00260468, total time[s] 0.087711 +Converged at iteration 19, L1 9.44422e-05, Linf 0.00676172, total time[s] 0.056634 +Converged at iteration 23, L1 7.75956e-05, Linf 0.00694566, total time[s] 0.081789 +Converged at iteration 26, L1 7.9692e-05, Linf 0.00593083, total time[s] 0.066363 +Converged at iteration 23, L1 5.70276e-05, Linf 0.00599365, total time[s] 0.069192 +Converged at iteration 20, L1 8.36524e-05, Linf 0.00546742, total time[s] 0.053856 +Converged at iteration 23, L1 6.51269e-05, Linf 0.00283394, total time[s] 0.063192 +Converged at iteration 25, L1 8.41917e-05, Linf 0.00403734, total time[s] 0.066724 +Converged at iteration 28, L1 7.71886e-05, Linf 0.00362167, total time[s] 0.072745 +Converged at iteration 29, L1 7.58785e-05, Linf 0.00618363, total time[s] 0.074324 +Converged at iteration 27, L1 7.51844e-05, Linf 0.0039771, total time[s] 0.06929 +Converged at iteration 29, L1 7.9276e-05, Linf 0.00387171, total time[s] 0.075574 +Converged at iteration 29, L1 9.23167e-05, Linf 0.00278045, total time[s] 0.075401 +Converged at iteration 28, L1 8.12809e-05, Linf 0.00260626, total time[s] 0.073181 +Converged at iteration 33, L1 5.84291e-05, Linf 0.00585237, total time[s] 0.086315 +Converged at iteration 27, L1 6.93099e-05, Linf 0.00353849, total time[s] 0.074903 +Converged at iteration 25, L1 7.12637e-05, Linf 0.00193445, total time[s] 0.066435 +Converged at iteration 23, L1 7.43399e-05, Linf 0.00318752, total time[s] 0.060658 +Converged at iteration 39, L1 7.17192e-05, Linf 0.00661479, total time[s] 0.148541 +Converged at iteration 36, L1 6.83322e-05, Linf 0.0054566, total time[s] 0.130158 +Converged at iteration 24, L1 7.30616e-05, Linf 0.00336557, total time[s] 0.08302 +Converged at iteration 31, L1 5.59243e-05, Linf 0.00499766, total time[s] 0.081892 +Converged at iteration 25, L1 9.29113e-05, Linf 0.00634294, total time[s] 0.069548 +Converged at iteration 21, L1 5.86978e-05, Linf 0.00343234, total time[s] 0.057733 +Converged at iteration 19, L1 5.99416e-05, Linf 0.00410049, total time[s] 0.058691 +Converged at iteration 20, L1 8.60179e-05, Linf 0.00645549, total time[s] 0.097747 +Converged at iteration 24, L1 7.17978e-05, Linf 0.00445201, total time[s] 0.064538 +Converged at iteration 24, L1 8.13487e-05, Linf 0.00520122, total time[s] 0.073814 +Converged at iteration 20, L1 6.52061e-05, Linf 0.00543447, total time[s] 0.068297 +Converged at iteration 16, L1 9.73105e-05, Linf 0.00506916, total time[s] 0.053326 +Converged at iteration 32, L1 6.76537e-05, Linf 0.00262259, total time[s] 0.094746 +Converged at iteration 19, L1 9.43034e-05, Linf 0.00674376, total time[s] 0.049891 +Converged at iteration 23, L1 7.68996e-05, Linf 0.0067962, total time[s] 0.068941 +Converged at iteration 26, L1 8.0221e-05, Linf 0.00589295, total time[s] 0.06618 +Converged at iteration 23, L1 5.63956e-05, Linf 0.00596968, total time[s] 0.067844 +Converged at iteration 20, L1 8.53169e-05, Linf 0.00551568, total time[s] 0.155533 +Converged at iteration 23, L1 6.73734e-05, Linf 0.00279217, total time[s] 0.084966 +Converged at iteration 25, L1 8.39473e-05, Linf 0.00409751, total time[s] 0.067698 +Converged at iteration 28, L1 7.77747e-05, Linf 0.0037886, total time[s] 0.073795 +Converged at iteration 29, L1 7.74542e-05, Linf 0.0062416, total time[s] 0.083916 +Converged at iteration 27, L1 7.69885e-05, Linf 0.00395299, total time[s] 0.076748 +Converged at iteration 29, L1 8.11341e-05, Linf 0.003928, total time[s] 0.073204 +Converged at iteration 29, L1 9.57592e-05, Linf 0.00278269, total time[s] 0.076861 +Converged at iteration 28, L1 8.05554e-05, Linf 0.00253961, total time[s] 0.07083 +Converged at iteration 32, L1 9.89495e-05, Linf 0.00696323, total time[s] 0.080651 +Converged at iteration 27, L1 7.17082e-05, Linf 0.00375317, total time[s] 0.068899 +Converged at iteration 25, L1 7.24306e-05, Linf 0.00198927, total time[s] 0.064587 +Converged at iteration 23, L1 7.45593e-05, Linf 0.0030492, total time[s] 0.063162 +Converged at iteration 39, L1 6.99502e-05, Linf 0.00658927, total time[s] 0.11244 +Converged at iteration 36, L1 6.63415e-05, Linf 0.00550653, total time[s] 0.094799 +Converged at iteration 24, L1 7.26369e-05, Linf 0.00310394, total time[s] 0.065406 +Converged at iteration 30, L1 9.65659e-05, Linf 0.00610826, total time[s] 0.07583 +Converged at iteration 25, L1 9.80963e-05, Linf 0.00663222, total time[s] 0.06403 +Converged at iteration 21, L1 6.42646e-05, Linf 0.00333618, total time[s] 0.055447 +Converged at iteration 19, L1 5.92003e-05, Linf 0.00397631, total time[s] 0.066736 +Converged at iteration 20, L1 8.29152e-05, Linf 0.00614815, total time[s] 0.063621 +Converged at iteration 24, L1 6.88173e-05, Linf 0.00350164, total time[s] 0.063231 +Converged at iteration 24, L1 8.46948e-05, Linf 0.00539635, total time[s] 0.065084 +Converged at iteration 20, L1 6.93226e-05, Linf 0.00568772, total time[s] 0.056222 +Converged at iteration 16, L1 9.70517e-05, Linf 0.00537939, total time[s] 0.062743 +Converged at iteration 32, L1 6.56392e-05, Linf 0.00264258, total time[s] 0.09074 +Converged at iteration 19, L1 9.44437e-05, Linf 0.00657902, total time[s] 0.051433 +Converged at iteration 23, L1 7.6699e-05, Linf 0.00666756, total time[s] 0.086581 +Converged at iteration 26, L1 8.06493e-05, Linf 0.00586198, total time[s] 0.088064 +Converged at iteration 23, L1 5.58052e-05, Linf 0.00597152, total time[s] 0.091136 +Converged at iteration 20, L1 8.84288e-05, Linf 0.0055271, total time[s] 0.060925 +Converged at iteration 23, L1 7.03316e-05, Linf 0.00272168, total time[s] 0.066412 +Converged at iteration 25, L1 8.47943e-05, Linf 0.00378474, total time[s] 0.076897 +Converged at iteration 28, L1 7.92665e-05, Linf 0.00400947, total time[s] 0.075418 +Converged at iteration 29, L1 7.96809e-05, Linf 0.0062834, total time[s] 0.102388 +Converged at iteration 27, L1 7.9528e-05, Linf 0.00392728, total time[s] 0.077164 +Converged at iteration 29, L1 8.28984e-05, Linf 0.00402091, total time[s] 0.078535 +Converged at iteration 29, L1 9.38126e-05, Linf 0.00277513, total time[s] 0.073126 +Converged at iteration 28, L1 7.99586e-05, Linf 0.00247604, total time[s] 0.070723 +Converged at iteration 32, L1 9.61212e-05, Linf 0.00693291, total time[s] 0.087101 +Converged at iteration 27, L1 7.63028e-05, Linf 0.00407244, total time[s] 0.073471 +Converged at iteration 25, L1 6.94018e-05, Linf 0.0020173, total time[s] 0.108217 +Converged at iteration 23, L1 7.50868e-05, Linf 0.00300239, total time[s] 0.071142 +Converged at iteration 39, L1 6.78268e-05, Linf 0.00654713, total time[s] 0.191085 +Converged at iteration 36, L1 6.36886e-05, Linf 0.00555347, total time[s] 0.162367 +Converged at iteration 24, L1 7.26536e-05, Linf 0.00308085, total time[s] 0.083768 +Converged at iteration 30, L1 9.42164e-05, Linf 0.00605409, total time[s] 0.119633 +Converged at iteration 26, L1 5.93314e-05, Linf 0.0058832, total time[s] 0.078523 +Converged at iteration 21, L1 7.50371e-05, Linf 0.0033988, total time[s] 0.057383 +Converged at iteration 19, L1 5.76876e-05, Linf 0.00394748, total time[s] 0.055224 +Converged at iteration 20, L1 7.97156e-05, Linf 0.00641244, total time[s] 0.058375 +Converged at iteration 24, L1 6.54768e-05, Linf 0.00398202, total time[s] 0.063161 +Converged at iteration 24, L1 8.91875e-05, Linf 0.00563854, total time[s] 0.063175 +Converged at iteration 20, L1 7.46022e-05, Linf 0.0057576, total time[s] 0.052792 +Converged at iteration 16, L1 9.67975e-05, Linf 0.00574905, total time[s] 0.044329 +Converged at iteration 32, L1 6.26773e-05, Linf 0.00266329, total time[s] 0.081775 +Converged at iteration 19, L1 9.37612e-05, Linf 0.00641177, total time[s] 0.051233 +Converged at iteration 23, L1 7.5975e-05, Linf 0.00645811, total time[s] 0.072877 +Converged at iteration 26, L1 8.2098e-05, Linf 0.0058541, total time[s] 0.068681 +Converged at iteration 23, L1 5.51734e-05, Linf 0.00597433, total time[s] 0.059639 +Converged at iteration 20, L1 9.33459e-05, Linf 0.00550921, total time[s] 0.0553 +Converged at iteration 23, L1 7.20404e-05, Linf 0.00264853, total time[s] 0.05857 +Converged at iteration 25, L1 8.62197e-05, Linf 0.00367212, total time[s] 0.063507 +Converged at iteration 28, L1 8.18312e-05, Linf 0.00422627, total time[s] 0.069445 +Converged at iteration 29, L1 8.26105e-05, Linf 0.00639039, total time[s] 0.087996 +Converged at iteration 27, L1 8.28136e-05, Linf 0.00394325, total time[s] 0.078266 +Converged at iteration 29, L1 8.53502e-05, Linf 0.00406332, total time[s] 0.075733 +Converged at iteration 29, L1 9.40162e-05, Linf 0.00276546, total time[s] 0.094412 +Converged at iteration 28, L1 7.99255e-05, Linf 0.00241735, total time[s] 0.076413 +Converged at iteration 32, L1 9.29705e-05, Linf 0.00687887, total time[s] 0.080761 +Converged at iteration 27, L1 8.12423e-05, Linf 0.0044941, total time[s] 0.074054 +Converged at iteration 24, L1 9.85894e-05, Linf 0.00261268, total time[s] 0.069008 +Converged at iteration 23, L1 7.68829e-05, Linf 0.00290501, total time[s] 0.058127 +Converged at iteration 39, L1 6.65937e-05, Linf 0.00649212, total time[s] 0.114608 +Converged at iteration 36, L1 6.03637e-05, Linf 0.00556, total time[s] 0.092824 +Converged at iteration 24, L1 7.42197e-05, Linf 0.00293937, total time[s] 0.06221 +Converged at iteration 30, L1 9.12738e-05, Linf 0.0059894, total time[s] 0.075805 +Converged at iteration 26, L1 6.45889e-05, Linf 0.00632779, total time[s] 0.067121 +Converged at iteration 21, L1 9.00026e-05, Linf 0.00429055, total time[s] 0.055366 +Converged at iteration 19, L1 5.71459e-05, Linf 0.00397523, total time[s] 0.069261 +Converged at iteration 20, L1 7.62359e-05, Linf 0.00595836, total time[s] 0.058942 +Converged at iteration 24, L1 6.19189e-05, Linf 0.00327163, total time[s] 0.064704 +Converged at iteration 24, L1 9.39522e-05, Linf 0.00590053, total time[s] 0.066246 +Converged at iteration 20, L1 8.1095e-05, Linf 0.00595929, total time[s] 0.054666 +Converged at iteration 16, L1 9.65828e-05, Linf 0.00611303, total time[s] 0.044099 +Converged at iteration 32, L1 5.79558e-05, Linf 0.00267463, total time[s] 0.091763 +Converged at iteration 19, L1 9.27719e-05, Linf 0.00622702, total time[s] 0.051162 +Converged at iteration 23, L1 7.48391e-05, Linf 0.00622691, total time[s] 0.063824 +Converged at iteration 26, L1 8.3434e-05, Linf 0.00582496, total time[s] 0.07673 +Converged at iteration 23, L1 5.48187e-05, Linf 0.00602727, total time[s] 0.061186 +Converged at iteration 20, L1 9.90181e-05, Linf 0.00559458, total time[s] 0.052666 +Converged at iteration 23, L1 7.34033e-05, Linf 0.00262825, total time[s] 0.060525 +Converged at iteration 25, L1 8.7307e-05, Linf 0.00358286, total time[s] 0.068496 +Converged at iteration 28, L1 8.30192e-05, Linf 0.00447657, total time[s] 0.080646 +Converged at iteration 29, L1 8.59117e-05, Linf 0.00647886, total time[s] 0.074522 +Converged at iteration 27, L1 8.64352e-05, Linf 0.00387877, total time[s] 0.069149 +Converged at iteration 29, L1 8.74454e-05, Linf 0.00414758, total time[s] 0.089646 +Converged at iteration 29, L1 9.41147e-05, Linf 0.00277903, total time[s] 0.126257 +Converged at iteration 28, L1 8.00287e-05, Linf 0.00236563, total time[s] 0.079835 +Converged at iteration 32, L1 8.89742e-05, Linf 0.00680244, total time[s] 0.080492 +Converged at iteration 27, L1 8.72719e-05, Linf 0.00506295, total time[s] 0.07028 +Converged at iteration 24, L1 9.96294e-05, Linf 0.00265501, total time[s] 0.060276 +Converged at iteration 23, L1 7.92531e-05, Linf 0.00273948, total time[s] 0.057666 +Converged at iteration 39, L1 6.49332e-05, Linf 0.00642307, total time[s] 0.09643 +Converged at iteration 35, L1 9.99496e-05, Linf 0.00647746, total time[s] 0.105386 +Converged at iteration 24, L1 7.66193e-05, Linf 0.00283844, total time[s] 0.079374 +Converged at iteration 30, L1 8.78161e-05, Linf 0.00591329, total time[s] 0.083261 +Converged at iteration 26, L1 6.97541e-05, Linf 0.00682662, total time[s] 0.066986 +Converged at iteration 22, L1 5.90951e-05, Linf 0.00439006, total time[s] 0.066247 +Converged at iteration 19, L1 5.73076e-05, Linf 0.00402373, total time[s] 0.059281 +Converged at iteration 20, L1 7.30654e-05, Linf 0.00563364, total time[s] 0.060672 +Converged at iteration 24, L1 5.87642e-05, Linf 0.0032301, total time[s] 0.069594 +Converged at iteration 24, L1 9.9779e-05, Linf 0.00617927, total time[s] 0.07382 +Converged at iteration 20, L1 8.82558e-05, Linf 0.0061083, total time[s] 0.072574 +Converged at iteration 16, L1 9.6394e-05, Linf 0.0064343, total time[s] 0.060992 +Converged at iteration 31, L1 9.38359e-05, Linf 0.0032582, total time[s] 0.084426 +Converged at iteration 19, L1 9.04889e-05, Linf 0.00600487, total time[s] 0.048643 +Converged at iteration 23, L1 7.31749e-05, Linf 0.00596371, total time[s] 0.059073 +Converged at iteration 26, L1 8.47653e-05, Linf 0.00579117, total time[s] 0.06652 +Converged at iteration 23, L1 5.67007e-05, Linf 0.00605595, total time[s] 0.066738 +Converged at iteration 21, L1 5.73646e-05, Linf 0.00472429, total time[s] 0.060258 +Converged at iteration 23, L1 7.4015e-05, Linf 0.00250323, total time[s] 0.061039 +Converged at iteration 25, L1 8.77773e-05, Linf 0.00348826, total time[s] 0.068893 +Converged at iteration 28, L1 8.5851e-05, Linf 0.00458502, total time[s] 0.078449 +Converged at iteration 29, L1 8.98419e-05, Linf 0.00656814, total time[s] 0.084134 +Converged at iteration 27, L1 8.95683e-05, Linf 0.003878, total time[s] 0.082653 +Converged at iteration 29, L1 8.86524e-05, Linf 0.00423238, total time[s] 0.073508 +Converged at iteration 29, L1 9.5181e-05, Linf 0.00282449, total time[s] 0.073074 +Converged at iteration 28, L1 8.04369e-05, Linf 0.00232839, total time[s] 0.072451 +Converged at iteration 32, L1 8.36407e-05, Linf 0.00670212, total time[s] 0.080388 +Converged at iteration 27, L1 9.54865e-05, Linf 0.00555362, total time[s] 0.069041 +Converged at iteration 25, L1 6.46929e-05, Linf 0.00206473, total time[s] 0.067465 +Converged at iteration 23, L1 8.23587e-05, Linf 0.00263422, total time[s] 0.060043 +Converged at iteration 39, L1 6.17328e-05, Linf 0.00631359, total time[s] 0.101494 +Converged at iteration 35, L1 8.85361e-05, Linf 0.00645701, total time[s] 0.109567 +Converged at iteration 24, L1 7.92036e-05, Linf 0.00287658, total time[s] 0.078577 +Converged at iteration 30, L1 8.39142e-05, Linf 0.00582315, total time[s] 0.082427 +Converged at iteration 26, L1 7.53542e-05, Linf 0.00737093, total time[s] 0.074547 +Converged at iteration 22, L1 7.68921e-05, Linf 0.0053947, total time[s] 0.059939 +Converged at iteration 19, L1 5.82487e-05, Linf 0.00407607, total time[s] 0.082835 +Converged at iteration 20, L1 6.97629e-05, Linf 0.00537389, total time[s] 0.069021 +Converged at iteration 24, L1 5.57791e-05, Linf 0.00313758, total time[s] 0.086713 +Converged at iteration 25, L1 5.61957e-05, Linf 0.00523271, total time[s] 0.079021 +Converged at iteration 20, L1 9.69184e-05, Linf 0.00626036, total time[s] 0.091118 +Converged at iteration 16, L1 9.75788e-05, Linf 0.00666068, total time[s] 0.066315 +Converged at iteration 31, L1 8.85226e-05, Linf 0.00331527, total time[s] 0.108683 +Converged at iteration 19, L1 8.69855e-05, Linf 0.0058139, total time[s] 0.058342 +Converged at iteration 23, L1 7.11148e-05, Linf 0.00565183, total time[s] 0.077833 +Converged at iteration 26, L1 8.57693e-05, Linf 0.00572105, total time[s] 0.077512 +Converged at iteration 23, L1 5.65665e-05, Linf 0.00609712, total time[s] 0.06859 +Converged at iteration 21, L1 6.19841e-05, Linf 0.00472653, total time[s] 0.069099 +Converged at iteration 23, L1 7.39479e-05, Linf 0.00231216, total time[s] 0.061969 +Converged at iteration 25, L1 8.73479e-05, Linf 0.00340807, total time[s] 0.072092 +Converged at iteration 28, L1 8.90901e-05, Linf 0.00489145, total time[s] 0.101556 +Converged at iteration 29, L1 9.36646e-05, Linf 0.00665574, total time[s] 0.093971 +Converged at iteration 27, L1 9.27972e-05, Linf 0.00386547, total time[s] 0.082472 +Converged at iteration 29, L1 9.05797e-05, Linf 0.00436726, total time[s] 0.084065 +Converged at iteration 29, L1 9.67194e-05, Linf 0.0028651, total time[s] 0.078671 +Converged at iteration 28, L1 8.15976e-05, Linf 0.00228525, total time[s] 0.085342 +Converged at iteration 32, L1 7.77298e-05, Linf 0.00651397, total time[s] 0.086131 +Converged at iteration 28, L1 6.09981e-05, Linf 0.00517991, total time[s] 0.094125 +Converged at iteration 25, L1 6.90239e-05, Linf 0.00273182, total time[s] 0.075242 +Converged at iteration 23, L1 8.62298e-05, Linf 0.00256745, total time[s] 0.078422 +Converged at iteration 39, L1 5.62685e-05, Linf 0.00626268, total time[s] 0.356181 +Converged at iteration 35, L1 8.09279e-05, Linf 0.00631206, total time[s] 0.084139 +Converged at iteration 24, L1 8.38605e-05, Linf 0.00298927, total time[s] 0.062233 +Converged at iteration 30, L1 7.7816e-05, Linf 0.00571193, total time[s] 0.097251 +Converged at iteration 26, L1 8.06874e-05, Linf 0.00796511, total time[s] 0.076599 +Converged at iteration 22, L1 9.91005e-05, Linf 0.00651437, total time[s] 0.058884 +Converged at iteration 19, L1 6.097e-05, Linf 0.00423943, total time[s] 0.050917 +Converged at iteration 20, L1 6.70032e-05, Linf 0.00485958, total time[s] 0.053043 +Converged at iteration 24, L1 5.36559e-05, Linf 0.00309763, total time[s] 0.083307 +Converged at iteration 25, L1 6.09316e-05, Linf 0.00553479, total time[s] 0.076113 +Converged at iteration 21, L1 5.36349e-05, Linf 0.00530118, total time[s] 0.092828 +Converged at iteration 16, L1 9.83973e-05, Linf 0.00678594, total time[s] 0.079987 +Converged at iteration 31, L1 8.46071e-05, Linf 0.00331257, total time[s] 0.104132 +Converged at iteration 19, L1 8.03304e-05, Linf 0.00554075, total time[s] 0.049449 +Converged at iteration 23, L1 6.86785e-05, Linf 0.00530231, total time[s] 0.059457 +Converged at iteration 26, L1 8.79496e-05, Linf 0.0056156, total time[s] 0.06709 +Converged at iteration 23, L1 5.76014e-05, Linf 0.00613733, total time[s] 0.060043 +Converged at iteration 21, L1 6.82115e-05, Linf 0.0046473, total time[s] 0.053333 +Converged at iteration 23, L1 7.18485e-05, Linf 0.00213653, total time[s] 0.057845 +Converged at iteration 25, L1 8.81883e-05, Linf 0.00330145, total time[s] 0.065559 +Converged at iteration 28, L1 9.23724e-05, Linf 0.0052235, total time[s] 0.120338 +Converged at iteration 29, L1 9.84409e-05, Linf 0.00677052, total time[s] 0.106451 +Converged at iteration 27, L1 9.63274e-05, Linf 0.00368085, total time[s] 0.091144 +Converged at iteration 29, L1 9.39531e-05, Linf 0.00447143, total time[s] 0.081577 +Converged at iteration 29, L1 9.71383e-05, Linf 0.00291269, total time[s] 0.074414 +Converged at iteration 28, L1 8.25292e-05, Linf 0.00224285, total time[s] 0.071764 +Converged at iteration 32, L1 7.17544e-05, Linf 0.00645651, total time[s] 0.079276 +Converged at iteration 28, L1 6.24321e-05, Linf 0.00573759, total time[s] 0.07138 +Converged at iteration 25, L1 7.54914e-05, Linf 0.00344867, total time[s] 0.074453 +Converged at iteration 23, L1 9.02861e-05, Linf 0.00252161, total time[s] 0.06035 +Converged at iteration 38, L1 9.91863e-05, Linf 0.00723736, total time[s] 0.099191 +Converged at iteration 35, L1 6.78293e-05, Linf 0.00620549, total time[s] 0.090504 +Converged at iteration 24, L1 8.79267e-05, Linf 0.00314247, total time[s] 0.061985 +Converged at iteration 30, L1 7.208e-05, Linf 0.00562884, total time[s] 0.079551 +Converged at iteration 26, L1 8.58881e-05, Linf 0.00853357, total time[s] 0.073751 +Converged at iteration 23, L1 6.90269e-05, Linf 0.00637789, total time[s] 0.086089 +Converged at iteration 19, L1 6.44522e-05, Linf 0.00432772, total time[s] 0.05303 +Converged at iteration 20, L1 6.43367e-05, Linf 0.00425904, total time[s] 0.053544 +Converged at iteration 23, L1 9.89054e-05, Linf 0.00450759, total time[s] 0.100459 +Converged at iteration 25, L1 6.38865e-05, Linf 0.00581092, total time[s] 0.066793 +Converged at iteration 21, L1 5.84115e-05, Linf 0.00553337, total time[s] 0.056333 +Converged at iteration 16, L1 9.93973e-05, Linf 0.00684008, total time[s] 0.053838 +Converged at iteration 31, L1 8.07973e-05, Linf 0.00324477, total time[s] 0.080175 +Converged at iteration 19, L1 7.29531e-05, Linf 0.00511303, total time[s] 0.055633 +Converged at iteration 23, L1 6.48605e-05, Linf 0.00491979, total time[s] 0.06192 +Converged at iteration 26, L1 8.87548e-05, Linf 0.00550395, total time[s] 0.066716 +Converged at iteration 23, L1 5.89763e-05, Linf 0.00618106, total time[s] 0.058124 +Converged at iteration 21, L1 7.44048e-05, Linf 0.0044914, total time[s] 0.053768 +Converged at iteration 23, L1 7.00617e-05, Linf 0.0019504, total time[s] 0.059495 +Converged at iteration 25, L1 8.83349e-05, Linf 0.00325493, total time[s] 0.077249 +Converged at iteration 28, L1 9.54373e-05, Linf 0.00558683, total time[s] 0.075188 +Converged at iteration 30, L1 5.13907e-05, Linf 0.00431776, total time[s] 0.079986 +Converged at iteration 27, L1 9.8405e-05, Linf 0.0036323, total time[s] 0.072877 +Converged at iteration 29, L1 9.83707e-05, Linf 0.00461354, total time[s] 0.073686 +Converged at iteration 29, L1 9.72516e-05, Linf 0.00291414, total time[s] 0.073471 +Converged at iteration 28, L1 8.43266e-05, Linf 0.00221236, total time[s] 0.070716 +Converged at iteration 32, L1 6.21641e-05, Linf 0.00625434, total time[s] 0.081662 +Converged at iteration 28, L1 6.92307e-05, Linf 0.0063807, total time[s] 0.077217 +Converged at iteration 25, L1 8.44771e-05, Linf 0.00420374, total time[s] 0.065016 +Converged at iteration 23, L1 9.55824e-05, Linf 0.00265326, total time[s] 0.059258 +Converged at iteration 38, L1 8.98204e-05, Linf 0.00709171, total time[s] 0.116012 +Converged at iteration 35, L1 5.49513e-05, Linf 0.00582093, total time[s] 0.090591 +Converged at iteration 24, L1 9.1127e-05, Linf 0.00326092, total time[s] 0.061875 +Converged at iteration 30, L1 6.65326e-05, Linf 0.00554252, total time[s] 0.075628 +Converged at iteration 26, L1 9.2033e-05, Linf 0.00911568, total time[s] 0.06896 +Converged at iteration 23, L1 8.56787e-05, Linf 0.00737124, total time[s] 0.060496 +Converged at iteration 19, L1 6.85412e-05, Linf 0.00453461, total time[s] 0.052689 +Converged at iteration 20, L1 6.15471e-05, Linf 0.00407913, total time[s] 0.053638 +Converged at iteration 23, L1 9.40854e-05, Linf 0.0045284, total time[s] 0.063547 +Converged at iteration 25, L1 6.8066e-05, Linf 0.00606651, total time[s] 0.072461 +Converged at iteration 21, L1 6.35405e-05, Linf 0.00569061, total time[s] 0.054902 +Converged at iteration 17, L1 5.47912e-05, Linf 0.00482613, total time[s] 0.046487 +Converged at iteration 31, L1 7.77553e-05, Linf 0.00336245, total time[s] 0.079758 +Converged at iteration 19, L1 6.34992e-05, Linf 0.00485098, total time[s] 0.054893 +Converged at iteration 22, L1 9.34214e-05, Linf 0.00526684, total time[s] 0.057695 +Converged at iteration 26, L1 9.11932e-05, Linf 0.00540566, total time[s] 0.065374 +Converged at iteration 23, L1 6.21814e-05, Linf 0.00626472, total time[s] 0.059519 +Converged at iteration 21, L1 8.03751e-05, Linf 0.00443586, total time[s] 0.054196 +Converged at iteration 23, L1 6.74334e-05, Linf 0.00169111, total time[s] 0.059821 +Converged at iteration 25, L1 8.72086e-05, Linf 0.00312374, total time[s] 0.065068 +Converged at iteration 28, L1 9.90917e-05, Linf 0.00596697, total time[s] 0.072145 +Converged at iteration 30, L1 5.41309e-05, Linf 0.00423232, total time[s] 0.077141 +Converged at iteration 28, L1 6.06432e-05, Linf 0.00419151, total time[s] 0.070782 +Converged at iteration 30, L1 6.29935e-05, Linf 0.00393716, total time[s] 0.076402 +Converged at iteration 29, L1 9.74666e-05, Linf 0.00290301, total time[s] 0.085298 +Converged at iteration 28, L1 8.76944e-05, Linf 0.002213, total time[s] 0.071019 +Converged at iteration 31, L1 9.50458e-05, Linf 0.00753135, total time[s] 0.078236 +Converged at iteration 28, L1 7.82338e-05, Linf 0.00703461, total time[s] 0.071798 +Converged at iteration 25, L1 9.54514e-05, Linf 0.00498285, total time[s] 0.102613 +Converged at iteration 24, L1 5.67798e-05, Linf 0.0019894, total time[s] 0.061734 +Converged at iteration 38, L1 7.89637e-05, Linf 0.00685222, total time[s] 0.10354 +Converged at iteration 34, L1 9.13417e-05, Linf 0.00702209, total time[s] 0.090542 +Converged at iteration 24, L1 9.31144e-05, Linf 0.00335822, total time[s] 0.061258 +Converged at iteration 30, L1 6.26944e-05, Linf 0.00548937, total time[s] 0.07677 +Converged at iteration 26, L1 9.87834e-05, Linf 0.00968617, total time[s] 0.074269 +Converged at iteration 24, L1 5.34335e-05, Linf 0.00683603, total time[s] 0.061522 +Converged at iteration 19, L1 7.41576e-05, Linf 0.0050461, total time[s] 0.057828 +Converged at iteration 20, L1 5.80441e-05, Linf 0.00391038, total time[s] 0.053882 +Converged at iteration 23, L1 9.17758e-05, Linf 0.00455494, total time[s] 0.07071 +Converged at iteration 25, L1 7.31156e-05, Linf 0.00632182, total time[s] 0.066315 +Converged at iteration 21, L1 6.80898e-05, Linf 0.0057683, total time[s] 0.095951 +Converged at iteration 17, L1 5.5742e-05, Linf 0.00497374, total time[s] 0.063258 +Converged at iteration 31, L1 7.57499e-05, Linf 0.00347399, total time[s] 0.080485 +Converged at iteration 18, L1 9.05698e-05, Linf 0.00570959, total time[s] 0.048438 +Converged at iteration 22, L1 8.37575e-05, Linf 0.00482172, total time[s] 0.062429 +Converged at iteration 26, L1 9.51275e-05, Linf 0.00530997, total time[s] 0.086497 +Converged at iteration 23, L1 6.30069e-05, Linf 0.00637635, total time[s] 0.059205 +Converged at iteration 21, L1 8.66739e-05, Linf 0.00430788, total time[s] 0.054435 +Converged at iteration 23, L1 6.45417e-05, Linf 0.00173527, total time[s] 0.059056 +Converged at iteration 25, L1 8.42402e-05, Linf 0.00293012, total time[s] 0.064036 +Converged at iteration 29, L1 6.66439e-05, Linf 0.00408368, total time[s] 0.074209 +Converged at iteration 30, L1 5.72841e-05, Linf 0.00428082, total time[s] 0.078131 +Converged at iteration 28, L1 6.31533e-05, Linf 0.00419869, total time[s] 0.072318 +Converged at iteration 30, L1 6.50186e-05, Linf 0.00401891, total time[s] 0.077354 +Converged at iteration 29, L1 9.78403e-05, Linf 0.00290276, total time[s] 0.076439 +Converged at iteration 28, L1 9.21458e-05, Linf 0.00216123, total time[s] 0.070571 +Converged at iteration 31, L1 8.58183e-05, Linf 0.00741867, total time[s] 0.078066 +Converged at iteration 28, L1 8.70488e-05, Linf 0.00766801, total time[s] 0.071882 +Converged at iteration 26, L1 6.20865e-05, Linf 0.00449471, total time[s] 0.06637 +Converged at iteration 24, L1 5.93639e-05, Linf 0.0021332, total time[s] 0.061547 +Converged at iteration 38, L1 6.87137e-05, Linf 0.00656061, total time[s] 0.100546 +Converged at iteration 34, L1 8.18956e-05, Linf 0.00677973, total time[s] 0.087619 +Converged at iteration 24, L1 9.56904e-05, Linf 0.00343671, total time[s] 0.061922 +Converged at iteration 30, L1 6.02991e-05, Linf 0.00539964, total time[s] 0.075794 +Converged at iteration 27, L1 5.29705e-05, Linf 0.00804944, total time[s] 0.068104 +Converged at iteration 24, L1 6.27623e-05, Linf 0.00768796, total time[s] 0.061676 +Converged at iteration 19, L1 8.00901e-05, Linf 0.00556125, total time[s] 0.050607 +Converged at iteration 20, L1 5.44359e-05, Linf 0.00377096, total time[s] 0.057761 +Converged at iteration 23, L1 9.13964e-05, Linf 0.00460891, total time[s] 0.074605 +Converged at iteration 25, L1 7.46183e-05, Linf 0.0065032, total time[s] 0.077427 +Converged at iteration 21, L1 7.20766e-05, Linf 0.00593998, total time[s] 0.060654 +Converged at iteration 17, L1 5.62224e-05, Linf 0.00504388, total time[s] 0.106826 +Converged at iteration 31, L1 7.44061e-05, Linf 0.00358499, total time[s] 0.085532 +Converged at iteration 18, L1 7.58295e-05, Linf 0.00531384, total time[s] 0.050008 +Converged at iteration 22, L1 7.33049e-05, Linf 0.00433004, total time[s] 0.057594 +Converged at iteration 26, L1 9.88433e-05, Linf 0.00524752, total time[s] 0.067086 +Converged at iteration 23, L1 6.61542e-05, Linf 0.00649058, total time[s] 0.061017 +Converged at iteration 21, L1 9.35036e-05, Linf 0.00412429, total time[s] 0.054129 +Converged at iteration 22, L1 9.73672e-05, Linf 0.0026909, total time[s] 0.056914 +Converged at iteration 25, L1 8.03643e-05, Linf 0.00270623, total time[s] 0.073796 +Converged at iteration 29, L1 6.89173e-05, Linf 0.00441033, total time[s] 0.112452 +Converged at iteration 30, L1 6.05062e-05, Linf 0.00435084, total time[s] 0.077409 +Converged at iteration 28, L1 6.47696e-05, Linf 0.00419157, total time[s] 0.070117 +Converged at iteration 30, L1 6.66682e-05, Linf 0.00415084, total time[s] 0.07607 +Converged at iteration 29, L1 9.85552e-05, Linf 0.00293697, total time[s] 0.073432 +Converged at iteration 28, L1 9.7885e-05, Linf 0.00208245, total time[s] 0.074214 +Converged at iteration 31, L1 8.0722e-05, Linf 0.00728461, total time[s] 0.078073 +Converged at iteration 28, L1 9.57071e-05, Linf 0.0082927, total time[s] 0.071372 +Converged at iteration 26, L1 7.03985e-05, Linf 0.0051612, total time[s] 0.067535 +Converged at iteration 24, L1 6.28683e-05, Linf 0.00226039, total time[s] 0.062163 +Converged at iteration 38, L1 6.18729e-05, Linf 0.00645139, total time[s] 0.112718 +Converged at iteration 34, L1 7.735e-05, Linf 0.00665557, total time[s] 0.099353 +Converged at iteration 24, L1 9.71171e-05, Linf 0.00349067, total time[s] 0.064885 +Converged at iteration 29, L1 9.99641e-05, Linf 0.00687253, total time[s] 0.074875 +Converged at iteration 27, L1 5.49715e-05, Linf 0.00859209, total time[s] 0.068495 +Converged at iteration 24, L1 7.24765e-05, Linf 0.00852787, total time[s] 0.064992 +Converged at iteration 19, L1 8.6272e-05, Linf 0.00496952, total time[s] 0.052181 +Converged at iteration 20, L1 5.14701e-05, Linf 0.00345587, total time[s] 0.054896 +Converged at iteration 23, L1 9.05319e-05, Linf 0.00465837, total time[s] 0.061632 +Converged at iteration 25, L1 7.76826e-05, Linf 0.00670948, total time[s] 0.066941 +Converged at iteration 21, L1 7.63165e-05, Linf 0.00603861, total time[s] 0.106827 +Converged at iteration 17, L1 5.65199e-05, Linf 0.0050497, total time[s] 0.080235 +Converged at iteration 31, L1 7.2655e-05, Linf 0.00368968, total time[s] 0.095725 +Converged at iteration 17, L1 9.9839e-05, Linf 0.00660817, total time[s] 0.047185 +Converged at iteration 21, L1 9.57113e-05, Linf 0.00451094, total time[s] 0.057322 +Converged at iteration 27, L1 5.29994e-05, Linf 0.00245742, total time[s] 0.069479 +Converged at iteration 23, L1 6.99395e-05, Linf 0.00660943, total time[s] 0.061561 +Converged at iteration 22, L1 5.3785e-05, Linf 0.0030438, total time[s] 0.05742 +Converged at iteration 22, L1 9.05134e-05, Linf 0.00275604, total time[s] 0.058194 +Converged at iteration 25, L1 7.77018e-05, Linf 0.00248233, total time[s] 0.064273 +Converged at iteration 29, L1 7.03399e-05, Linf 0.00470572, total time[s] 0.073877 +Converged at iteration 30, L1 6.4271e-05, Linf 0.00444077, total time[s] 0.075864 +Converged at iteration 28, L1 6.63567e-05, Linf 0.00358311, total time[s] 0.070907 +Converged at iteration 30, L1 6.89351e-05, Linf 0.00429583, total time[s] 0.076095 +Converged at iteration 29, L1 9.85714e-05, Linf 0.00294307, total time[s] 0.07516 +Converged at iteration 29, L1 6.14785e-05, Linf 0.00136374, total time[s] 0.073808 +Converged at iteration 31, L1 7.28442e-05, Linf 0.00710168, total time[s] 0.078666 +Converged at iteration 29, L1 5.17651e-05, Linf 0.00723706, total time[s] 0.073731 +Converged at iteration 26, L1 7.92791e-05, Linf 0.00584661, total time[s] 0.066716 +Converged at iteration 24, L1 6.65071e-05, Linf 0.00237952, total time[s] 0.066677 +Converged at iteration 38, L1 5.75423e-05, Linf 0.00621749, total time[s] 0.095527 +Converged at iteration 34, L1 7.40332e-05, Linf 0.00639774, total time[s] 0.086726 +Converged at iteration 24, L1 9.80108e-05, Linf 0.00352911, total time[s] 0.062606 +Converged at iteration 29, L1 9.6676e-05, Linf 0.00678018, total time[s] 0.073946 +Converged at iteration 27, L1 5.77336e-05, Linf 0.00892966, total time[s] 0.069196 +Converged at iteration 24, L1 8.16878e-05, Linf 0.00937383, total time[s] 0.063136 +Converged at iteration 19, L1 9.04587e-05, Linf 0.00480707, total time[s] 0.05667 +Converged at iteration 20, L1 4.88746e-05, Linf 0.00336366, total time[s] 0.061666 +Converged at iteration 23, L1 8.97656e-05, Linf 0.004717, total time[s] 0.11992 +Converged at iteration 25, L1 8.13239e-05, Linf 0.00684167, total time[s] 0.108936 +Converged at iteration 21, L1 8.18713e-05, Linf 0.00612441, total time[s] 0.08007 +Converged at iteration 17, L1 5.67999e-05, Linf 0.00500307, total time[s] 0.062942 +Converged at iteration 31, L1 7.16818e-05, Linf 0.00381446, total time[s] 0.086202 +Converged at iteration 17, L1 7.52564e-05, Linf 0.00593254, total time[s] 0.053013 +Converged at iteration 21, L1 7.88781e-05, Linf 0.00374062, total time[s] 0.082263 +Converged at iteration 27, L1 5.4936e-05, Linf 0.00243153, total time[s] 0.07162 +Converged at iteration 23, L1 7.42268e-05, Linf 0.00673305, total time[s] 0.060805 +Converged at iteration 22, L1 5.78832e-05, Linf 0.0032755, total time[s] 0.059344 +Converged at iteration 22, L1 8.2212e-05, Linf 0.00284886, total time[s] 0.06045 +Converged at iteration 25, L1 7.47516e-05, Linf 0.00229655, total time[s] 0.089258 +Converged at iteration 29, L1 7.13403e-05, Linf 0.00491465, total time[s] 0.086623 +Converged at iteration 30, L1 6.85995e-05, Linf 0.00462955, total time[s] 0.096465 +Converged at iteration 28, L1 6.7543e-05, Linf 0.0035769, total time[s] 0.102764 +Converged at iteration 30, L1 7.16416e-05, Linf 0.00444708, total time[s] 0.090353 +Converged at iteration 29, L1 9.84547e-05, Linf 0.00293662, total time[s] 0.081779 +Converged at iteration 29, L1 6.4209e-05, Linf 0.0013242, total time[s] 0.089099 +Converged at iteration 31, L1 6.48397e-05, Linf 0.00690985, total time[s] 0.117456 +Converged at iteration 29, L1 5.56021e-05, Linf 0.00777366, total time[s] 0.079633 +Converged at iteration 26, L1 8.92047e-05, Linf 0.00657977, total time[s] 0.068884 +Converged at iteration 24, L1 7.06347e-05, Linf 0.00252154, total time[s] 0.065627 +Converged at iteration 38, L1 5.40436e-05, Linf 0.00595302, total time[s] 0.095383 +Converged at iteration 34, L1 7.02336e-05, Linf 0.00612913, total time[s] 0.08828 +Converged at iteration 24, L1 9.90937e-05, Linf 0.00430382, total time[s] 0.076486 +Converged at iteration 29, L1 9.40887e-05, Linf 0.00665136, total time[s] 0.079538 +Converged at iteration 27, L1 6.00673e-05, Linf 0.00937781, total time[s] 0.072017 +Converged at iteration 24, L1 9.12083e-05, Linf 0.0102341, total time[s] 0.075374 +Converged at iteration 19, L1 9.7138e-05, Linf 0.00514679, total time[s] 0.059291 +Converged at iteration 20, L1 4.70743e-05, Linf 0.00336499, total time[s] 0.0547 +Converged at iteration 23, L1 9.04929e-05, Linf 0.00475929, total time[s] 0.067184 +Converged at iteration 25, L1 8.40054e-05, Linf 0.00702901, total time[s] 0.071614 +Converged at iteration 21, L1 8.37358e-05, Linf 0.00594511, total time[s] 0.059924 +Converged at iteration 17, L1 5.68595e-05, Linf 0.00490974, total time[s] 0.047775 +Converged at iteration 31, L1 7.00246e-05, Linf 0.00395941, total time[s] 0.079402 +Converged at iteration 17, L1 5.57733e-05, Linf 0.00523761, total time[s] 0.046939 +Converged at iteration 20, L1 9.39924e-05, Linf 0.003642, total time[s] 0.056868 +Converged at iteration 27, L1 5.81592e-05, Linf 0.00248238, total time[s] 0.070722 +Converged at iteration 23, L1 7.75291e-05, Linf 0.00686445, total time[s] 0.060982 +Converged at iteration 22, L1 6.18735e-05, Linf 0.0035124, total time[s] 0.058119 +Converged at iteration 22, L1 7.74619e-05, Linf 0.00297015, total time[s] 0.057162 +Converged at iteration 25, L1 7.13633e-05, Linf 0.00196225, total time[s] 0.065406 +Converged at iteration 29, L1 7.08053e-05, Linf 0.00502078, total time[s] 0.076348 +Converged at iteration 30, L1 7.22187e-05, Linf 0.00482469, total time[s] 0.084327 +Converged at iteration 28, L1 6.84371e-05, Linf 0.0036283, total time[s] 0.079299 +Converged at iteration 30, L1 7.47933e-05, Linf 0.0046591, total time[s] 0.077274 +Converged at iteration 29, L1 9.96196e-05, Linf 0.00296577, total time[s] 0.074478 +Converged at iteration 29, L1 6.75673e-05, Linf 0.00127904, total time[s] 0.074281 +Converged at iteration 31, L1 5.72375e-05, Linf 0.0067064, total time[s] 0.079791 +Converged at iteration 29, L1 6.02236e-05, Linf 0.00833573, total time[s] 0.075889 +Converged at iteration 27, L1 5.31282e-05, Linf 0.00573824, total time[s] 0.079635 +Converged at iteration 24, L1 7.46356e-05, Linf 0.00260642, total time[s] 0.063837 +Converged at iteration 37, L1 9.60237e-05, Linf 0.00715564, total time[s] 0.10701 +Converged at iteration 34, L1 6.6235e-05, Linf 0.00589367, total time[s] 0.0871 +Converged at iteration 24, L1 9.99409e-05, Linf 0.0036375, total time[s] 0.061189 +Converged at iteration 29, L1 8.89072e-05, Linf 0.00658185, total time[s] 0.072597 +Converged at iteration 27, L1 6.27829e-05, Linf 0.00995808, total time[s] 0.067998 +Converged at iteration 25, L1 4.43267e-05, Linf 0.0090432, total time[s] 0.064699 +Converged at iteration 20, L1 4.14223e-05, Linf 0.00378601, total time[s] 0.052049 +Converged at iteration 20, L1 4.5191e-05, Linf 0.00336551, total time[s] 0.054205 +Converged at iteration 23, L1 9.20162e-05, Linf 0.00479468, total time[s] 0.06899 +Converged at iteration 25, L1 8.79916e-05, Linf 0.00720395, total time[s] 0.067417 +Converged at iteration 21, L1 8.52441e-05, Linf 0.00609314, total time[s] 0.055677 +Converged at iteration 17, L1 5.75094e-05, Linf 0.00476611, total time[s] 0.046132 +Converged at iteration 31, L1 6.80297e-05, Linf 0.00413166, total time[s] 0.077938 +Converged at iteration 16, L1 9.33743e-05, Linf 0.00753651, total time[s] 0.043158 +Converged at iteration 20, L1 6.66055e-05, Linf 0.00283302, total time[s] 0.060314 +Converged at iteration 27, L1 6.08592e-05, Linf 0.00263945, total time[s] 0.079874 +Converged at iteration 23, L1 8.16201e-05, Linf 0.00699017, total time[s] 0.059818 +Converged at iteration 22, L1 6.61193e-05, Linf 0.00324756, total time[s] 0.060942 +Converged at iteration 22, L1 8.21078e-05, Linf 0.00310242, total time[s] 0.057386 +Converged at iteration 25, L1 6.81188e-05, Linf 0.00189813, total time[s] 0.064867 +Converged at iteration 29, L1 7.14791e-05, Linf 0.00505695, total time[s] 0.075867 +Converged at iteration 30, L1 7.63394e-05, Linf 0.00504652, total time[s] 0.084403 +Converged at iteration 28, L1 6.8923e-05, Linf 0.00373295, total time[s] 0.078196 +Converged at iteration 30, L1 7.7485e-05, Linf 0.00471716, total time[s] 0.074401 +Converged at iteration 30, L1 6.33487e-05, Linf 0.00227838, total time[s] 0.074596 +Converged at iteration 29, L1 7.19949e-05, Linf 0.00127217, total time[s] 0.073276 +Converged at iteration 30, L1 9.51049e-05, Linf 0.00840033, total time[s] 0.086895 +Converged at iteration 29, L1 6.53911e-05, Linf 0.00895644, total time[s] 0.090252 +Converged at iteration 27, L1 6.06771e-05, Linf 0.00644502, total time[s] 0.101905 +Converged at iteration 24, L1 8.00028e-05, Linf 0.00265911, total time[s] 0.101888 +Converged at iteration 37, L1 9.03514e-05, Linf 0.00697761, total time[s] 0.140926 +Converged at iteration 34, L1 6.15006e-05, Linf 0.0055834, total time[s] 0.101423 +Converged at iteration 25, L1 4.38885e-05, Linf 0.0021006, total time[s] 0.073412 +Converged at iteration 29, L1 8.77837e-05, Linf 0.0115712, total time[s] 0.106043 +Converged at iteration 27, L1 6.63697e-05, Linf 0.0102522, total time[s] 0.084454 +Converged at iteration 25, L1 4.95256e-05, Linf 0.009772, total time[s] 0.07027 +Converged at iteration 20, L1 4.51268e-05, Linf 0.00405262, total time[s] 0.094371 +Converged at iteration 20, L1 4.36449e-05, Linf 0.00338293, total time[s] 0.060328 +Converged at iteration 23, L1 9.25255e-05, Linf 0.00486272, total time[s] 0.080799 +Converged at iteration 44, L1 9.37544e-05, Linf 0.000559543, total time[s] 0.146209 +Converged at iteration 21, L1 8.60018e-05, Linf 0.00601514, total time[s] 0.065052 +Converged at iteration 17, L1 5.87373e-05, Linf 0.0045796, total time[s] 0.047532 +Converged at iteration 31, L1 6.61856e-05, Linf 0.00433169, total time[s] 0.077821 +Converged at iteration 16, L1 9.88549e-05, Linf 0.00668267, total time[s] 0.042695 +Converged at iteration 18, L1 9.97769e-05, Linf 0.00398018, total time[s] 0.047391 +Converged at iteration 27, L1 6.38657e-05, Linf 0.00281652, total time[s] 0.068342 +Converged at iteration 23, L1 8.57728e-05, Linf 0.00716541, total time[s] 0.061083 +Converged at iteration 22, L1 7.11972e-05, Linf 0.00358638, total time[s] 0.059228 +Converged at iteration 22, L1 8.92703e-05, Linf 0.00327932, total time[s] 0.062483 +Converged at iteration 24, L1 9.78771e-05, Linf 0.00196375, total time[s] 0.063693 +Converged at iteration 29, L1 7.21112e-05, Linf 0.00506897, total time[s] 0.074661 +Converged at iteration 30, L1 7.98121e-05, Linf 0.00532937, total time[s] 0.083588 +Converged at iteration 28, L1 6.89464e-05, Linf 0.00370741, total time[s] 0.075174 +Converged at iteration 30, L1 8.161e-05, Linf 0.00496264, total time[s] 0.076544 +Converged at iteration 30, L1 6.51957e-05, Linf 0.00232089, total time[s] 0.078416 +Converged at iteration 29, L1 7.74134e-05, Linf 0.00133667, total time[s] 0.089417 +Converged at iteration 30, L1 8.67312e-05, Linf 0.00835564, total time[s] 0.077977 +Converged at iteration 29, L1 7.1516e-05, Linf 0.00976833, total time[s] 0.075106 +Converged at iteration 27, L1 6.90295e-05, Linf 0.00715418, total time[s] 0.070168 +Converged at iteration 24, L1 8.33098e-05, Linf 0.00284286, total time[s] 0.073915 +Converged at iteration 37, L1 8.57832e-05, Linf 0.00652861, total time[s] 0.117132 +Converged at iteration 34, L1 5.73933e-05, Linf 0.005391, total time[s] 0.112245 +Converged at iteration 25, L1 4.55668e-05, Linf 0.00210737, total time[s] 0.085933 +Converged at iteration 29, L1 7.84782e-05, Linf 0.00639409, total time[s] 0.1007 +Converged at iteration 27, L1 6.62905e-05, Linf 0.0107116, total time[s] 0.08239 +Converged at iteration 25, L1 5.39132e-05, Linf 0.0105216, total time[s] 0.117915 +Converged at iteration 20, L1 4.86945e-05, Linf 0.00421612, total time[s] 0.060303 +Converged at iteration 20, L1 4.20076e-05, Linf 0.00338149, total time[s] 0.081371 +Converged at iteration 23, L1 9.45654e-05, Linf 0.00489175, total time[s] 0.076012 +Converged at iteration 25, L1 8.97943e-05, Linf 0.00747636, total time[s] 0.121979 +Converged at iteration 21, L1 8.63993e-05, Linf 0.00608325, total time[s] 0.075227 +Converged at iteration 17, L1 6.04531e-05, Linf 0.0043883, total time[s] 0.105894 +Converged at iteration 31, L1 6.47935e-05, Linf 0.00456803, total time[s] 0.10556 +Converged at iteration 17, L1 7.75037e-05, Linf 0.00303992, total time[s] 0.054976 +Converged at iteration 18, L1 8.05018e-05, Linf 0.002716, total time[s] 0.047981 +Converged at iteration 27, L1 6.56552e-05, Linf 0.00294407, total time[s] 0.09881 +Converged at iteration 23, L1 9.12772e-05, Linf 0.00738082, total time[s] 0.073584 +Converged at iteration 22, L1 7.46967e-05, Linf 0.00382389, total time[s] 0.087382 +Converged at iteration 22, L1 9.75353e-05, Linf 0.0035561, total time[s] 0.096883 +Converged at iteration 24, L1 9.23752e-05, Linf 0.00161171, total time[s] 0.094985 +Converged at iteration 29, L1 7.24935e-05, Linf 0.0050531, total time[s] 0.083528 +Converged at iteration 30, L1 8.39349e-05, Linf 0.00553403, total time[s] 0.077474 +Converged at iteration 28, L1 6.87078e-05, Linf 0.00336232, total time[s] 0.073741 +Converged at iteration 30, L1 8.53537e-05, Linf 0.00520681, total time[s] 0.083627 +Converged at iteration 30, L1 6.78063e-05, Linf 0.00240049, total time[s] 0.078127 +Converged at iteration 29, L1 8.35955e-05, Linf 0.00150932, total time[s] 0.075192 +Converged at iteration 30, L1 8.05904e-05, Linf 0.00822871, total time[s] 0.077416 +Converged at iteration 29, L1 7.62055e-05, Linf 0.0101751, total time[s] 0.075229 +Converged at iteration 27, L1 7.72891e-05, Linf 0.00777965, total time[s] 0.072442 +Converged at iteration 24, L1 8.79665e-05, Linf 0.00294066, total time[s] 0.063565 +Converged at iteration 37, L1 7.88741e-05, Linf 0.00622971, total time[s] 0.100518 +Converged at iteration 34, L1 5.19639e-05, Linf 0.00515513, total time[s] 0.106628 +Converged at iteration 25, L1 4.75019e-05, Linf 0.002075, total time[s] 0.071586 +Converged at iteration 29, L1 6.5173e-05, Linf 0.00617532, total time[s] 0.075777 +Converged at iteration 27, L1 7.03197e-05, Linf 0.011405, total time[s] 0.070237 +Converged at iteration 25, L1 6.14576e-05, Linf 0.0116033, total time[s] 0.070503 +Converged at iteration 20, L1 5.24352e-05, Linf 0.00442786, total time[s] 0.066027 +Converged at iteration 19, L1 9.32607e-05, Linf 0.00510007, total time[s] 0.094447 +Converged at iteration 23, L1 9.72908e-05, Linf 0.00488421, total time[s] 0.084526 +Converged at iteration 25, L1 8.1705e-05, Linf 0.00771446, total time[s] 0.079125 +Converged at iteration 21, L1 8.63005e-05, Linf 0.00601167, total time[s] 0.065172 +Converged at iteration 17, L1 6.28956e-05, Linf 0.00414208, total time[s] 0.066641 +Converged at iteration 31, L1 6.14141e-05, Linf 0.0048402, total time[s] 0.089657 +Converged at iteration 18, L1 7.13154e-05, Linf 0.00151297, total time[s] 0.051805 +Converged at iteration 19, L1 7.155e-05, Linf 0.00160798, total time[s] 0.049963 +Converged at iteration 27, L1 7.08829e-05, Linf 0.00312218, total time[s] 0.069447 +Converged at iteration 23, L1 9.92393e-05, Linf 0.00785121, total time[s] 0.06033 +Converged at iteration 22, L1 7.88391e-05, Linf 0.00428247, total time[s] 0.058456 +Converged at iteration 23, L1 6.5061e-05, Linf 0.00280736, total time[s] 0.060772 +Converged at iteration 24, L1 8.4785e-05, Linf 0.00162646, total time[s] 0.062886 +Converged at iteration 29, L1 7.27339e-05, Linf 0.00504987, total time[s] 0.073809 +Converged at iteration 30, L1 8.95127e-05, Linf 0.00580753, total time[s] 0.076133 +Converged at iteration 28, L1 6.85343e-05, Linf 0.00311564, total time[s] 0.072671 +Converged at iteration 30, L1 8.94875e-05, Linf 0.00547856, total time[s] 0.090153 +Converged at iteration 30, L1 7.11542e-05, Linf 0.002474, total time[s] 0.08327 +Converged at iteration 29, L1 9.16742e-05, Linf 0.00172313, total time[s] 0.075394 +Converged at iteration 30, L1 7.27008e-05, Linf 0.00800625, total time[s] 0.081924 +Converged at iteration 29, L1 8.37095e-05, Linf 0.0109882, total time[s] 0.074222 +Converged at iteration 27, L1 8.96796e-05, Linf 0.00878232, total time[s] 0.073141 +Converged at iteration 24, L1 9.24443e-05, Linf 0.00308821, total time[s] 0.063364 +Converged at iteration 37, L1 7.39351e-05, Linf 0.00604646, total time[s] 0.105849 +Converged at iteration 33, L1 9.93362e-05, Linf 0.00629712, total time[s] 0.107607 +Converged at iteration 25, L1 4.79558e-05, Linf 0.00205272, total time[s] 0.069272 +Converged at iteration 29, L1 5.88976e-05, Linf 0.00596194, total time[s] 0.075033 +Converged at iteration 27, L1 7.37419e-05, Linf 0.0118849, total time[s] 0.074502 +Converged at iteration 25, L1 6.70274e-05, Linf 0.0122514, total time[s] 0.06514 +Converged at iteration 20, L1 5.53464e-05, Linf 0.00458775, total time[s] 0.062662 +Converged at iteration 19, L1 8.71405e-05, Linf 0.00511662, total time[s] 0.065707 +Converged at iteration 24, L1 5.33951e-05, Linf 0.00302964, total time[s] 0.088781 +Converged at iteration 25, L1 7.43114e-05, Linf 0.00787643, total time[s] 0.07222 +Converged at iteration 21, L1 8.62273e-05, Linf 0.00596124, total time[s] 0.065956 +Converged at iteration 17, L1 6.60879e-05, Linf 0.00390487, total time[s] 0.051378 +Converged at iteration 31, L1 5.91929e-05, Linf 0.0050715, total time[s] 0.095668 +Converged at iteration 18, L1 8.75696e-05, Linf 0.00198053, total time[s] 0.10826 +Converged at iteration 20, L1 6.40222e-05, Linf 0.00200962, total time[s] 0.055996 +Converged at iteration 27, L1 7.52267e-05, Linf 0.00327668, total time[s] 0.074891 +Converged at iteration 24, L1 4.85792e-05, Linf 0.00379001, total time[s] 0.075938 +Converged at iteration 22, L1 8.46251e-05, Linf 0.00460742, total time[s] 0.064766 +Converged at iteration 23, L1 7.18726e-05, Linf 0.00281974, total time[s] 0.061972 +Converged at iteration 24, L1 7.91146e-05, Linf 0.00164303, total time[s] 0.068672 +Converged at iteration 29, L1 7.26189e-05, Linf 0.0050997, total time[s] 0.091075 +Converged at iteration 30, L1 9.4965e-05, Linf 0.00609037, total time[s] 0.093163 +Converged at iteration 28, L1 6.96405e-05, Linf 0.00292506, total time[s] 0.08324 +Converged at iteration 30, L1 9.3741e-05, Linf 0.00570993, total time[s] 0.078108 +Converged at iteration 30, L1 7.35435e-05, Linf 0.00253015, total time[s] 0.086392 +Converged at iteration 29, L1 9.97632e-05, Linf 0.0019207, total time[s] 0.074427 +Converged at iteration 30, L1 6.7598e-05, Linf 0.00795436, total time[s] 0.07737 +Converged at iteration 29, L1 8.98337e-05, Linf 0.0118278, total time[s] 0.07777 +Converged at iteration 27, L1 9.95213e-05, Linf 0.0093398, total time[s] 0.070308 +Converged at iteration 24, L1 9.65916e-05, Linf 0.00321463, total time[s] 0.067404 +Converged at iteration 37, L1 6.86033e-05, Linf 0.00587839, total time[s] 0.097594 +Converged at iteration 33, L1 9.39938e-05, Linf 0.00605587, total time[s] 0.08971 +Converged at iteration 25, L1 4.96719e-05, Linf 0.00204514, total time[s] 0.071547 +Converged at iteration 28, L1 9.84427e-05, Linf 0.00780416, total time[s] 0.078071 +Converged at iteration 27, L1 7.91345e-05, Linf 0.012352, total time[s] 0.070759 +Converged at iteration 25, L1 7.34395e-05, Linf 0.0131468, total time[s] 0.06591 +Converged at iteration 20, L1 5.87652e-05, Linf 0.00496902, total time[s] 0.056267 +Converged at iteration 19, L1 8.10154e-05, Linf 0.00514312, total time[s] 0.06452 +Converged at iteration 24, L1 5.35147e-05, Linf 0.0030192, total time[s] 0.083005 +Converged at iteration 25, L1 6.41342e-05, Linf 0.00799513, total time[s] 0.071379 +Converged at iteration 21, L1 8.56197e-05, Linf 0.00596428, total time[s] 0.067629 +Converged at iteration 17, L1 6.92222e-05, Linf 0.00358461, total time[s] 0.058747 +Converged at iteration 31, L1 5.74911e-05, Linf 0.00531799, total time[s] 0.10161 +Converged at iteration 19, L1 6.66749e-05, Linf 0.00247882, total time[s] 0.050802 +Converged at iteration 20, L1 8.63306e-05, Linf 0.00276545, total time[s] 0.093171 +Converged at iteration 27, L1 7.57928e-05, Linf 0.00343593, total time[s] 0.078556 +Converged at iteration 24, L1 5.14153e-05, Linf 0.003973, total time[s] 0.103249 +Converged at iteration 22, L1 8.62765e-05, Linf 0.00484937, total time[s] 0.066458 +Converged at iteration 23, L1 7.85658e-05, Linf 0.00286245, total time[s] 0.066282 +Converged at iteration 24, L1 7.3369e-05, Linf 0.00164913, total time[s] 0.104398 +Converged at iteration 29, L1 7.25941e-05, Linf 0.00515989, total time[s] 0.090875 +Converged at iteration 30, L1 9.83861e-05, Linf 0.00637217, total time[s] 0.07901 +Converged at iteration 28, L1 6.68779e-05, Linf 0.00297739, total time[s] 0.082107 +Converged at iteration 30, L1 9.60114e-05, Linf 0.00591118, total time[s] 0.089134 +Converged at iteration 30, L1 7.60441e-05, Linf 0.0025894, total time[s] 0.082656 +Converged at iteration 30, L1 5.39918e-05, Linf 0.00117638, total time[s] 0.079821 +Converged at iteration 30, L1 6.34527e-05, Linf 0.00763781, total time[s] 0.077644 +Converged at iteration 29, L1 9.67474e-05, Linf 0.01239, total time[s] 0.075277 +Converged at iteration 28, L1 5.19751e-05, Linf 0.0079503, total time[s] 0.074506 +Converged at iteration 24, L1 9.95748e-05, Linf 0.00336563, total time[s] 0.065901 +Converged at iteration 37, L1 6.18815e-05, Linf 0.0056905, total time[s] 0.095969 +Converged at iteration 33, L1 8.77768e-05, Linf 0.00573543, total time[s] 0.091692 +Converged at iteration 25, L1 5.06919e-05, Linf 0.00210652, total time[s] 0.068494 +Converged at iteration 28, L1 8.72944e-05, Linf 0.00757596, total time[s] 0.076012 +Converged at iteration 27, L1 8.18039e-05, Linf 0.0129114, total time[s] 0.071596 +Converged at iteration 25, L1 8.16316e-05, Linf 0.0141716, total time[s] 0.068245 +Converged at iteration 20, L1 6.37655e-05, Linf 0.00541309, total time[s] 0.058975 +Converged at iteration 19, L1 7.30471e-05, Linf 0.00515022, total time[s] 0.057625 +Converged at iteration 24, L1 5.37255e-05, Linf 0.00299708, total time[s] 0.083715 +Converged at iteration 25, L1 5.27664e-05, Linf 0.00808653, total time[s] 0.074083 +Converged at iteration 21, L1 8.33668e-05, Linf 0.0059523, total time[s] 0.086728 +Converged at iteration 17, L1 7.54055e-05, Linf 0.00314235, total time[s] 0.079279 +Converged at iteration 31, L1 5.69371e-05, Linf 0.00564394, total time[s] 0.094173 +Converged at iteration 19, L1 8.06026e-05, Linf 0.00309601, total time[s] 0.054367 +Converged at iteration 21, L1 7.53305e-05, Linf 0.00347854, total time[s] 0.056584 +Converged at iteration 27, L1 7.72548e-05, Linf 0.00357572, total time[s] 0.070767 +Converged at iteration 24, L1 6.27968e-05, Linf 0.00420957, total time[s] 0.069098 +Converged at iteration 22, L1 9.2803e-05, Linf 0.00506897, total time[s] 0.059785 +Converged at iteration 23, L1 9.05168e-05, Linf 0.00347948, total time[s] 0.060993 +Converged at iteration 23, L1 9.16311e-05, Linf 0.0024444, total time[s] 0.062188 +Converged at iteration 29, L1 7.14913e-05, Linf 0.00522098, total time[s] 0.088515 +Converged at iteration 31, L1 6.22749e-05, Linf 0.00377761, total time[s] 0.090397 +Converged at iteration 28, L1 6.63294e-05, Linf 0.00279095, total time[s] 0.073054 +Converged at iteration 31, L1 5.37991e-05, Linf 0.00482963, total time[s] 0.077838 +Converged at iteration 30, L1 8.04052e-05, Linf 0.00273771, total time[s] 0.077391 +Converged at iteration 30, L1 5.98931e-05, Linf 0.00128763, total time[s] 0.076457 +Converged at iteration 30, L1 5.82192e-05, Linf 0.00718623, total time[s] 0.078417 +Converged at iteration 30, L1 4.17804e-05, Linf 0.0100008, total time[s] 0.076362 +Converged at iteration 28, L1 6.03234e-05, Linf 0.00885489, total time[s] 0.072007 +Converged at iteration 25, L1 5.54034e-05, Linf 0.00208815, total time[s] 0.064608 +Converged at iteration 37, L1 5.72649e-05, Linf 0.00558803, total time[s] 0.094174 +Converged at iteration 33, L1 8.43206e-05, Linf 0.0054805, total time[s] 0.090518 +Converged at iteration 25, L1 5.22794e-05, Linf 0.00217365, total time[s] 0.069897 +Converged at iteration 28, L1 7.83202e-05, Linf 0.00745804, total time[s] 0.071478 +Converged at iteration 27, L1 8.5529e-05, Linf 0.0131959, total time[s] 0.069471 +Converged at iteration 25, L1 8.74325e-05, Linf 0.0149313, total time[s] 0.065183 +Converged at iteration 20, L1 6.79609e-05, Linf 0.00578176, total time[s] 0.066359 +Converged at iteration 19, L1 7.06235e-05, Linf 0.00515798, total time[s] 0.070216 +Converged at iteration 24, L1 5.51505e-05, Linf 0.00296317, total time[s] 0.096868 +Converged at iteration 25, L1 4.65375e-05, Linf 0.00809753, total time[s] 0.091216 +Converged at iteration 21, L1 8.12653e-05, Linf 0.00598113, total time[s] 0.087895 +Converged at iteration 17, L1 8.11251e-05, Linf 0.00274821, total time[s] 0.050696 +Converged at iteration 31, L1 5.72766e-05, Linf 0.00590811, total time[s] 0.09104 +Converged at iteration 19, L1 9.44912e-05, Linf 0.00380224, total time[s] 0.068995 +Converged at iteration 21, L1 8.87853e-05, Linf 0.00432226, total time[s] 0.060499 +Converged at iteration 27, L1 7.70725e-05, Linf 0.0036245, total time[s] 0.070877 +Converged at iteration 24, L1 6.09508e-05, Linf 0.00434586, total time[s] 0.06358 +Converged at iteration 22, L1 9.64873e-05, Linf 0.00526488, total time[s] 0.056768 +Converged at iteration 23, L1 9.81973e-05, Linf 0.00399733, total time[s] 0.064242 +Converged at iteration 23, L1 8.37614e-05, Linf 0.00244299, total time[s] 0.060195 +Converged at iteration 29, L1 7.1065e-05, Linf 0.00524763, total time[s] 0.081566 +Converged at iteration 31, L1 6.04649e-05, Linf 0.00391085, total time[s] 0.084814 +Converged at iteration 28, L1 6.45561e-05, Linf 0.00274461, total time[s] 0.074989 +Converged at iteration 31, L1 5.60171e-05, Linf 0.00491839, total time[s] 0.080513 +Converged at iteration 30, L1 8.42039e-05, Linf 0.00286719, total time[s] 0.086112 +Converged at iteration 30, L1 6.18397e-05, Linf 0.00132715, total time[s] 0.077318 +Converged at iteration 30, L1 5.58358e-05, Linf 0.00704637, total time[s] 0.079041 +Converged at iteration 30, L1 4.56676e-05, Linf 0.0104463, total time[s] 0.078466 +Converged at iteration 28, L1 6.72797e-05, Linf 0.00947617, total time[s] 0.072841 +Converged at iteration 25, L1 5.71252e-05, Linf 0.00213395, total time[s] 0.067684 +Converged at iteration 36, L1 9.83937e-05, Linf 0.00675965, total time[s] 0.09795 +Converged at iteration 33, L1 8.16482e-05, Linf 0.00515776, total time[s] 0.093008 +Converged at iteration 25, L1 5.35175e-05, Linf 0.00225527, total time[s] 0.073166 +Converged at iteration 28, L1 7.00505e-05, Linf 0.00732196, total time[s] 0.072593 +Converged at iteration 27, L1 9.16001e-05, Linf 0.0137343, total time[s] 0.073068 +Converged at iteration 25, L1 9.60955e-05, Linf 0.0159017, total time[s] 0.067989 +Converged at iteration 20, L1 7.28788e-05, Linf 0.00665807, total time[s] 0.061336 +Converged at iteration 19, L1 6.91531e-05, Linf 0.00518416, total time[s] 0.076395 +Converged at iteration 24, L1 5.50144e-05, Linf 0.0029187, total time[s] 0.084073 +Converged at iteration 24, L1 8.9959e-05, Linf 0.0110255, total time[s] 0.068827 +Converged at iteration 21, L1 7.68964e-05, Linf 0.00602011, total time[s] 0.066416 +Converged at iteration 17, L1 9.06386e-05, Linf 0.00225505, total time[s] 0.051455 +Converged at iteration 31, L1 5.97298e-05, Linf 0.00626269, total time[s] 0.105246 +Converged at iteration 20, L1 6.72669e-05, Linf 0.00441622, total time[s] 0.059718 +Converged at iteration 22, L1 6.01776e-05, Linf 0.00409125, total time[s] 0.061055 +Converged at iteration 27, L1 8.03973e-05, Linf 0.00375621, total time[s] 0.078247 +Converged at iteration 24, L1 6.95912e-05, Linf 0.00449962, total time[s] 0.068603 +Converged at iteration 23, L1 5.52095e-05, Linf 0.00344958, total time[s] 0.060446 +Converged at iteration 24, L1 6.32553e-05, Linf 0.00328472, total time[s] 0.065794 +Converged at iteration 23, L1 7.70103e-05, Linf 0.00271105, total time[s] 0.060683 +Converged at iteration 29, L1 6.80404e-05, Linf 0.00523268, total time[s] 0.074609 +Converged at iteration 31, L1 6.31279e-05, Linf 0.00413213, total time[s] 0.080472 +Converged at iteration 28, L1 6.32472e-05, Linf 0.00273032, total time[s] 0.074298 +Converged at iteration 31, L1 5.67328e-05, Linf 0.00523563, total time[s] 0.08044 +Converged at iteration 30, L1 8.62739e-05, Linf 0.00291078, total time[s] 0.083726 +Converged at iteration 30, L1 6.50341e-05, Linf 0.00154822, total time[s] 0.091433 +Converged at iteration 30, L1 5.33388e-05, Linf 0.00669559, total time[s] 0.118514 +Converged at iteration 30, L1 5.04634e-05, Linf 0.0114647, total time[s] 0.100899 +Converged at iteration 28, L1 7.62028e-05, Linf 0.0103217, total time[s] 0.079329 +Converged at iteration 25, L1 5.73436e-05, Linf 0.00221408, total time[s] 0.080286 +Converged at iteration 36, L1 9.13368e-05, Linf 0.00671703, total time[s] 0.10152 +Converged at iteration 33, L1 8.07905e-05, Linf 0.00489132, total time[s] 0.095422 +Converged at iteration 25, L1 5.37444e-05, Linf 0.00234967, total time[s] 0.065387 +Converged at iteration 28, L1 5.63965e-05, Linf 0.00718534, total time[s] 0.078183 +Converged at iteration 27, L1 8.90291e-05, Linf 0.0134802, total time[s] 0.076888 +Converged at iteration 26, L1 3.11573e-05, Linf 0.00971806, total time[s] 0.072316 +Converged at iteration 20, L1 7.80613e-05, Linf 0.0071075, total time[s] 0.203933 +Converged at iteration 19, L1 7.05827e-05, Linf 0.00515908, total time[s] 0.075562 +Converged at iteration 24, L1 5.68449e-05, Linf 0.00288213, total time[s] 0.081588 +Converged at iteration 24, L1 7.74169e-05, Linf 0.0110448, total time[s] 0.084658 +Converged at iteration 21, L1 7.09083e-05, Linf 0.00604847, total time[s] 0.082424 +Converged at iteration 18, L1 5.12212e-05, Linf 0.00158151, total time[s] 0.056146 +Converged at iteration 31, L1 6.1859e-05, Linf 0.00658811, total time[s] 0.115061 +Converged at iteration 20, L1 8.30236e-05, Linf 0.00452378, total time[s] 0.127592 +Converged at iteration 22, L1 6.59233e-05, Linf 0.00473138, total time[s] 0.080547 +Converged at iteration 27, L1 8.3365e-05, Linf 0.00390606, total time[s] 0.074925 +Converged at iteration 24, L1 6.70257e-05, Linf 0.00465502, total time[s] 0.068189 +Converged at iteration 23, L1 5.78964e-05, Linf 0.00353525, total time[s] 0.073839 +Converged at iteration 24, L1 7.15376e-05, Linf 0.00466329, total time[s] 0.065348 +Converged at iteration 23, L1 7.5582e-05, Linf 0.00355451, total time[s] 0.060529 +Converged at iteration 29, L1 6.55938e-05, Linf 0.00523377, total time[s] 0.074233 +Converged at iteration 31, L1 6.75937e-05, Linf 0.00430174, total time[s] 0.077184 +Converged at iteration 28, L1 6.11033e-05, Linf 0.00272738, total time[s] 0.070893 +Converged at iteration 31, L1 5.82864e-05, Linf 0.00544542, total time[s] 0.079961 +Converged at iteration 30, L1 8.90924e-05, Linf 0.0029966, total time[s] 0.075279 +Converged at iteration 30, L1 6.74911e-05, Linf 0.00170624, total time[s] 0.07644 +Converged at iteration 29, L1 9.65623e-05, Linf 0.00941331, total time[s] 0.074822 +Converged at iteration 30, L1 5.51136e-05, Linf 0.0122235, total time[s] 0.07481 +Converged at iteration 28, L1 8.54832e-05, Linf 0.0111803, total time[s] 0.072451 +Converged at iteration 25, L1 5.76712e-05, Linf 0.00226148, total time[s] 0.063927 +Converged at iteration 36, L1 8.45287e-05, Linf 0.00667214, total time[s] 0.091143 +Converged at iteration 33, L1 8.14535e-05, Linf 0.00471815, total time[s] 0.087571 +Converged at iteration 25, L1 5.55979e-05, Linf 0.00243914, total time[s] 0.07666 +Converged at iteration 27, L1 8.17233e-05, Linf 0.00942008, total time[s] 0.069164 +Converged at iteration 27, L1 8.76197e-05, Linf 0.0127443, total time[s] 0.068117 +Converged at iteration 26, L1 3.25275e-05, Linf 0.0113124, total time[s] 0.066505 +Converged at iteration 20, L1 8.54145e-05, Linf 0.00742834, total time[s] 0.051323 +Converged at iteration 19, L1 7.22842e-05, Linf 0.00506559, total time[s] 0.073229 +Converged at iteration 24, L1 5.93069e-05, Linf 0.0028408, total time[s] 0.072968 +Converged at iteration 24, L1 6.48912e-05, Linf 0.0109912, total time[s] 0.086007 +Converged at iteration 21, L1 5.94722e-05, Linf 0.00590771, total time[s] 0.10732 +Converged at iteration 18, L1 6.05706e-05, Linf 0.00190926, total time[s] 0.073665 +Converged at iteration 31, L1 6.50751e-05, Linf 0.00700438, total time[s] 0.139065 +Converged at iteration 20, L1 9.86929e-05, Linf 0.00441371, total time[s] 0.095214 +Converged at iteration 22, L1 7.44529e-05, Linf 0.0054613, total time[s] 0.080226 +Converged at iteration 27, L1 9.24576e-05, Linf 0.00746144, total time[s] 0.114694 +Converged at iteration 24, L1 7.40622e-05, Linf 0.00482845, total time[s] 0.080759 +Converged at iteration 23, L1 6.19405e-05, Linf 0.0037392, total time[s] 0.069277 +Converged at iteration 24, L1 8.11482e-05, Linf 0.00445061, total time[s] 0.067144 +Converged at iteration 23, L1 7.79918e-05, Linf 0.00460886, total time[s] 0.059584 +Converged at iteration 28, L1 9.57512e-05, Linf 0.00614287, total time[s] 0.070897 +Converged at iteration 31, L1 7.65896e-05, Linf 0.00865444, total time[s] 0.077223 +Converged at iteration 28, L1 6.09843e-05, Linf 0.00269772, total time[s] 0.070654 +Converged at iteration 31, L1 5.89185e-05, Linf 0.00573831, total time[s] 0.077687 +Converged at iteration 30, L1 9.44455e-05, Linf 0.00320889, total time[s] 0.075842 +Converged at iteration 30, L1 7.82307e-05, Linf 0.00208062, total time[s] 0.076541 +Converged at iteration 29, L1 9.20578e-05, Linf 0.00889661, total time[s] 0.073017 +Converged at iteration 30, L1 6.21029e-05, Linf 0.0135272, total time[s] 0.07641 +Converged at iteration 28, L1 9.76518e-05, Linf 0.0124531, total time[s] 0.072759 +Converged at iteration 25, L1 5.82152e-05, Linf 0.00235065, total time[s] 0.065035 +Converged at iteration 36, L1 8.04856e-05, Linf 0.00657441, total time[s] 0.107919 +Converged at iteration 33, L1 8.31086e-05, Linf 0.00472789, total time[s] 0.096449 +Converged at iteration 25, L1 5.53731e-05, Linf 0.00251309, total time[s] 0.077617 +Converged at iteration 27, L1 5.89078e-05, Linf 0.00924854, total time[s] 0.083026 +Converged at iteration 27, L1 9.29097e-05, Linf 0.0132653, total time[s] 0.077827 +Converged at iteration 26, L1 3.54776e-05, Linf 0.0120079, total time[s] 0.113012 +Converged at iteration 20, L1 9.15835e-05, Linf 0.0077863, total time[s] 0.093097 +Converged at iteration 19, L1 7.58521e-05, Linf 0.0050116, total time[s] 0.089573 +Converged at iteration 24, L1 5.92143e-05, Linf 0.00279159, total time[s] 0.119487 +Converged at iteration 24, L1 5.41394e-05, Linf 0.0108353, total time[s] 0.078233 +Converged at iteration 21, L1 4.8874e-05, Linf 0.00554524, total time[s] 0.061027 +Converged at iteration 18, L1 7.06234e-05, Linf 0.00213489, total time[s] 0.050331 +Converged at iteration 31, L1 6.71899e-05, Linf 0.00734123, total time[s] 0.084702 +Converged at iteration 21, L1 6.48727e-05, Linf 0.00368189, total time[s] 0.054806 +Converged at iteration 22, L1 8.26632e-05, Linf 0.00597637, total time[s] 0.063502 +Converged at iteration 27, L1 8.30953e-05, Linf 0.00411905, total time[s] 0.069376 +Converged at iteration 24, L1 7.07581e-05, Linf 0.00503273, total time[s] 0.065812 +Converged at iteration 23, L1 6.34766e-05, Linf 0.00385982, total time[s] 0.059216 +Converged at iteration 24, L1 8.86824e-05, Linf 0.00523225, total time[s] 0.066041 +Converged at iteration 23, L1 8.43016e-05, Linf 0.00542036, total time[s] 0.060967 +Converged at iteration 28, L1 9.00794e-05, Linf 0.00589403, total time[s] 0.072563 +Converged at iteration 31, L1 7.93422e-05, Linf 0.00523276, total time[s] 0.079514 +Converged at iteration 27, L1 9.79706e-05, Linf 0.00359226, total time[s] 0.070518 +Converged at iteration 31, L1 5.99181e-05, Linf 0.00596831, total time[s] 0.077846 +Converged at iteration 30, L1 9.57954e-05, Linf 0.00343663, total time[s] 0.07534 +Converged at iteration 30, L1 8.49025e-05, Linf 0.00236895, total time[s] 0.077071 +Converged at iteration 29, L1 8.8484e-05, Linf 0.00838909, total time[s] 0.074622 +Converged at iteration 30, L1 6.95616e-05, Linf 0.014737, total time[s] 0.082569 +Converged at iteration 29, L1 4.4272e-05, Linf 0.00948803, total time[s] 0.079958 +Converged at iteration 25, L1 5.71992e-05, Linf 0.00240299, total time[s] 0.067298 +Converged at iteration 36, L1 7.65323e-05, Linf 0.00642789, total time[s] 0.100927 +Converged at iteration 33, L1 8.65292e-05, Linf 0.00491939, total time[s] 0.101626 +Converged at iteration 25, L1 5.5008e-05, Linf 0.00258036, total time[s] 0.08323 +Converged at iteration 26, L1 8.06388e-05, Linf 0.011462, total time[s] 0.067892 +Converged at iteration 27, L1 8.81611e-05, Linf 0.0130001, total time[s] 0.07016 +Converged at iteration 26, L1 3.63284e-05, Linf 0.0129425, total time[s] 0.069248 +Converged at iteration 20, L1 9.89464e-05, Linf 0.0082171, total time[s] 0.063055 +Converged at iteration 19, L1 8.06556e-05, Linf 0.00490235, total time[s] 0.068929 +Converged at iteration 24, L1 5.96752e-05, Linf 0.00275893, total time[s] 0.082018 +Converged at iteration 24, L1 4.52463e-05, Linf 0.0105385, total time[s] 0.088531 +Converged at iteration 21, L1 4.11428e-05, Linf 0.00469525, total time[s] 0.065704 +Converged at iteration 18, L1 7.91809e-05, Linf 0.0024799, total time[s] 0.060235 +Converged at iteration 31, L1 7.02058e-05, Linf 0.00783852, total time[s] 0.102383 +Converged at iteration 21, L1 6.36219e-05, Linf 0.00405122, total time[s] 0.057739 +Converged at iteration 22, L1 8.88266e-05, Linf 0.006612, total time[s] 0.065186 +Converged at iteration 27, L1 7.82871e-05, Linf 0.00403756, total time[s] 0.070771 +Converged at iteration 24, L1 7.38507e-05, Linf 0.00531747, total time[s] 0.065782 +Converged at iteration 23, L1 6.68912e-05, Linf 0.00395888, total time[s] 0.062097 +Converged at iteration 24, L1 9.86184e-05, Linf 0.00645654, total time[s] 0.064087 +Converged at iteration 23, L1 9.63021e-05, Linf 0.00649159, total time[s] 0.065 +Converged at iteration 28, L1 8.10929e-05, Linf 0.005515, total time[s] 0.073471 +Converged at iteration 31, L1 8.54426e-05, Linf 0.00575748, total time[s] 0.080206 +Converged at iteration 27, L1 9.48899e-05, Linf 0.00350449, total time[s] 0.071693 +Converged at iteration 31, L1 6.00894e-05, Linf 0.00628605, total time[s] 0.080494 +Converged at iteration 30, L1 9.77193e-05, Linf 0.00332821, total time[s] 0.077337 +Converged at iteration 31, L1 4.7348e-05, Linf 0.00168237, total time[s] 0.080306 +Converged at iteration 29, L1 8.5911e-05, Linf 0.00775745, total time[s] 0.075034 +Converged at iteration 30, L1 8.05199e-05, Linf 0.016143, total time[s] 0.078305 +Converged at iteration 29, L1 5.04611e-05, Linf 0.0103954, total time[s] 0.078547 +Converged at iteration 25, L1 5.62037e-05, Linf 0.00240437, total time[s] 0.066224 +Converged at iteration 36, L1 7.55061e-05, Linf 0.00641509, total time[s] 0.093786 +Converged at iteration 33, L1 9.0081e-05, Linf 0.00510758, total time[s] 0.090291 +Converged at iteration 25, L1 5.47623e-05, Linf 0.00267717, total time[s] 0.071674 +Converged at iteration 26, L1 5.66132e-05, Linf 0.0111898, total time[s] 0.079749 +Converged at iteration 27, L1 8.86835e-05, Linf 0.0130271, total time[s] 0.071405 +Converged at iteration 26, L1 3.69293e-05, Linf 0.0134077, total time[s] 0.069779 +Converged at iteration 21, L1 3.53581e-05, Linf 0.00590364, total time[s] 0.066107 +Converged at iteration 19, L1 8.47891e-05, Linf 0.0048033, total time[s] 0.074103 +Converged at iteration 24, L1 5.9976e-05, Linf 0.00272076, total time[s] 0.111661 +Converged at iteration 24, L1 4.01843e-05, Linf 0.0101963, total time[s] 0.090607 +Converged at iteration 20, L1 9.81993e-05, Linf 0.0069461, total time[s] 0.063987 +Converged at iteration 18, L1 8.51737e-05, Linf 0.00270416, total time[s] 0.056576 +Converged at iteration 31, L1 7.21603e-05, Linf 0.00810987, total time[s] 0.108741 +Converged at iteration 21, L1 7.12855e-05, Linf 0.00430604, total time[s] 0.065174 +Converged at iteration 22, L1 9.36547e-05, Linf 0.00710469, total time[s] 0.058162 +Converged at iteration 27, L1 7.41766e-05, Linf 0.00393142, total time[s] 0.068766 +Converged at iteration 24, L1 7.55385e-05, Linf 0.00554327, total time[s] 0.065539 +Converged at iteration 23, L1 6.96705e-05, Linf 0.00395244, total time[s] 0.05963 +Converged at iteration 25, L1 5.80067e-05, Linf 0.00374652, total time[s] 0.064182 +Converged at iteration 24, L1 6.20163e-05, Linf 0.00523714, total time[s] 0.062238 +Converged at iteration 28, L1 7.41086e-05, Linf 0.0052668, total time[s] 0.070767 +Converged at iteration 31, L1 8.88081e-05, Linf 0.00572351, total time[s] 0.08208 +Converged at iteration 27, L1 9.17377e-05, Linf 0.0034119, total time[s] 0.07034 +Converged at iteration 31, L1 6.08322e-05, Linf 0.00654419, total time[s] 0.080348 +Converged at iteration 30, L1 9.83864e-05, Linf 0.00348032, total time[s] 0.077905 +Converged at iteration 31, L1 5.1721e-05, Linf 0.00188287, total time[s] 0.080992 +Converged at iteration 29, L1 8.37507e-05, Linf 0.00724751, total time[s] 0.07667 +Converged at iteration 30, L1 9.05958e-05, Linf 0.01715, total time[s] 0.077696 +Converged at iteration 29, L1 5.51412e-05, Linf 0.0110172, total time[s] 0.075791 +Converged at iteration 25, L1 5.45522e-05, Linf 0.00240116, total time[s] 0.066845 +Converged at iteration 36, L1 7.54753e-05, Linf 0.00660057, total time[s] 0.103444 +Converged at iteration 33, L1 9.61567e-05, Linf 0.00541172, total time[s] 0.093753 +Converged at iteration 25, L1 5.81323e-05, Linf 0.00276576, total time[s] 0.068042 +Converged at iteration 25, L1 9.77671e-05, Linf 0.0138566, total time[s] 0.066654 +Converged at iteration 27, L1 9.51352e-05, Linf 0.0137079, total time[s] 0.07098 +Converged at iteration 26, L1 3.82125e-05, Linf 0.0139745, total time[s] 0.0723 +Converged at iteration 21, L1 3.76578e-05, Linf 0.00620877, total time[s] 0.081871 +Converged at iteration 19, L1 8.93204e-05, Linf 0.00463774, total time[s] 0.070055 +Converged at iteration 24, L1 6.03575e-05, Linf 0.00268239, total time[s] 0.13055 +Converged at iteration 24, L1 3.56644e-05, Linf 0.00955788, total time[s] 0.071621 +Converged at iteration 20, L1 9.24764e-05, Linf 0.006208, total time[s] 0.064028 +Converged at iteration 18, L1 9.46913e-05, Linf 0.00305229, total time[s] 0.057463 +Converged at iteration 31, L1 7.4706e-05, Linf 0.00857317, total time[s] 0.086152 +Converged at iteration 21, L1 9.12598e-05, Linf 0.0044804, total time[s] 0.058847 +Converged at iteration 23, L1 5.58023e-05, Linf 0.00512545, total time[s] 0.07283 +Converged at iteration 27, L1 7.25638e-05, Linf 0.00377668, total time[s] 0.076404 +Converged at iteration 24, L1 7.76269e-05, Linf 0.00568241, total time[s] 0.07523 +Converged at iteration 23, L1 7.20057e-05, Linf 0.00430398, total time[s] 0.063195 +Converged at iteration 25, L1 6.26079e-05, Linf 0.0040332, total time[s] 0.066915 +Converged at iteration 24, L1 7.32185e-05, Linf 0.00600954, total time[s] 0.064409 +Converged at iteration 28, L1 6.3935e-05, Linf 0.00512314, total time[s] 0.073458 +Converged at iteration 31, L1 9.36807e-05, Linf 0.00520816, total time[s] 0.080548 +Converged at iteration 27, L1 8.84585e-05, Linf 0.00324287, total time[s] 0.072414 +Converged at iteration 31, L1 6.1929e-05, Linf 0.00682389, total time[s] 0.081835 +Converged at iteration 31, L1 6.13663e-05, Linf 0.0022744, total time[s] 0.082043 +Converged at iteration 31, L1 6.06449e-05, Linf 0.00220908, total time[s] 0.081573 +Converged at iteration 29, L1 8.10507e-05, Linf 0.00658974, total time[s] 0.076983 +Converged at iteration 31, L1 3.23558e-05, Linf 0.00838796, total time[s] 0.082814 +Converged at iteration 29, L1 6.09927e-05, Linf 0.0118111, total time[s] 0.075656 +Converged at iteration 25, L1 5.30864e-05, Linf 0.00233484, total time[s] 0.068658 +Converged at iteration 36, L1 7.68447e-05, Linf 0.00682177, total time[s] 0.092416 +Converged at iteration 34, L1 4.4535e-05, Linf 0.00434285, total time[s] 0.088624 +Converged at iteration 25, L1 5.99791e-05, Linf 0.00292596, total time[s] 0.070187 +Converged at iteration 25, L1 7.92198e-05, Linf 0.0135799, total time[s] 0.064577 +Converged at iteration 28, L1 4.20999e-05, Linf 0.0093785, total time[s] 0.07108 +Converged at iteration 26, L1 3.97274e-05, Linf 0.0144184, total time[s] 0.067525 +Converged at iteration 21, L1 3.83262e-05, Linf 0.0064055, total time[s] 0.075414 +Converged at iteration 19, L1 9.20828e-05, Linf 0.00455775, total time[s] 0.087892 +Converged at iteration 24, L1 6.1716e-05, Linf 0.00261316, total time[s] 0.102846 +Converged at iteration 23, L1 9.84326e-05, Linf 0.0152183, total time[s] 0.08195 +Converged at iteration 20, L1 9.02293e-05, Linf 0.00557764, total time[s] 0.066702 +Converged at iteration 19, L1 4.81051e-05, Linf 0.00171656, total time[s] 0.060378 +Converged at iteration 31, L1 7.62028e-05, Linf 0.00889987, total time[s] 0.08799 +Converged at iteration 21, L1 9.76722e-05, Linf 0.0045026, total time[s] 0.056085 +Converged at iteration 23, L1 5.81527e-05, Linf 0.00536997, total time[s] 0.06151 +Converged at iteration 27, L1 7.00516e-05, Linf 0.00367559, total time[s] 0.07147 +Converged at iteration 24, L1 7.73605e-05, Linf 0.00570081, total time[s] 0.062777 +Converged at iteration 23, L1 7.31927e-05, Linf 0.00430017, total time[s] 0.060841 +Converged at iteration 25, L1 6.40839e-05, Linf 0.00417391, total time[s] 0.067109 +Converged at iteration 24, L1 8.36385e-05, Linf 0.0066191, total time[s] 0.064421 +Converged at iteration 27, L1 9.62305e-05, Linf 0.00660803, total time[s] 0.070015 +Converged at iteration 31, L1 9.65248e-05, Linf 0.00551273, total time[s] 0.080823 +Converged at iteration 27, L1 8.37034e-05, Linf 0.00315129, total time[s] 0.074588 +Converged at iteration 31, L1 6.26497e-05, Linf 0.00702565, total time[s] 0.087156 +Converged at iteration 31, L1 6.1583e-05, Linf 0.00231068, total time[s] 0.079197 +Converged at iteration 31, L1 6.45775e-05, Linf 0.00237877, total time[s] 0.079504 +Converged at iteration 29, L1 7.96396e-05, Linf 0.00609891, total time[s] 0.079909 +Converged at iteration 31, L1 3.42899e-05, Linf 0.00953311, total time[s] 0.086336 +Converged at iteration 29, L1 6.57822e-05, Linf 0.0124223, total time[s] 0.08057 +Converged at iteration 25, L1 5.31215e-05, Linf 0.00233784, total time[s] 0.064903 +Converged at iteration 36, L1 7.99127e-05, Linf 0.00722592, total time[s] 0.102421 +Converged at iteration 34, L1 4.83505e-05, Linf 0.00436781, total time[s] 0.095145 +Converged at iteration 25, L1 6.22407e-05, Linf 0.00301323, total time[s] 0.069713 +Converged at iteration 25, L1 5.79055e-05, Linf 0.0129831, total time[s] 0.066043 +Converged at iteration 27, L1 9.95729e-05, Linf 0.0153907, total time[s] 0.097097 +Converged at iteration 26, L1 4.24363e-05, Linf 0.0152025, total time[s] 0.078425 +Converged at iteration 21, L1 3.90527e-05, Linf 0.00666287, total time[s] 0.088139 +Converged at iteration 19, L1 9.38904e-05, Linf 0.00440532, total time[s] 0.06846 +Converged at iteration 24, L1 6.28089e-05, Linf 0.00267547, total time[s] 0.078586 +Converged at iteration 23, L1 9.52502e-05, Linf 0.0146122, total time[s] 0.084334 +Converged at iteration 20, L1 9.16329e-05, Linf 0.00555069, total time[s] 0.068538 +Converged at iteration 19, L1 5.33397e-05, Linf 0.00188443, total time[s] 0.070767 +Converged at iteration 31, L1 7.93865e-05, Linf 0.00944659, total time[s] 0.095444 +Converged at iteration 21, L1 9.92395e-05, Linf 0.00457475, total time[s] 0.070345 +Converged at iteration 23, L1 6.06856e-05, Linf 0.00599553, total time[s] 0.065216 +Converged at iteration 27, L1 6.6377e-05, Linf 0.00349278, total time[s] 0.06908 +Converged at iteration 24, L1 7.59405e-05, Linf 0.00562613, total time[s] 0.067222 +Converged at iteration 23, L1 7.77499e-05, Linf 0.00440437, total time[s] 0.062245 +Converged at iteration 25, L1 6.60918e-05, Linf 0.00437066, total time[s] 0.068045 +Converged at iteration 25, L1 5.68824e-05, Linf 0.00525248, total time[s] 0.067754 +Converged at iteration 27, L1 9.2569e-05, Linf 0.00659926, total time[s] 0.07881 +Converged at iteration 32, L1 5.33233e-05, Linf 0.00320048, total time[s] 0.081259 +Converged at iteration 27, L1 7.81515e-05, Linf 0.00295777, total time[s] 0.068303 +Converged at iteration 31, L1 6.42566e-05, Linf 0.00736878, total time[s] 0.077874 +Converged at iteration 31, L1 6.25957e-05, Linf 0.00229892, total time[s] 0.080651 +Converged at iteration 31, L1 7.56278e-05, Linf 0.00276354, total time[s] 0.082727 +Converged at iteration 29, L1 7.9793e-05, Linf 0.00544514, total time[s] 0.07797 +Converged at iteration 31, L1 3.97706e-05, Linf 0.0101685, total time[s] 0.083941 +Converged at iteration 29, L1 7.35601e-05, Linf 0.0132588, total time[s] 0.075427 +Converged at iteration 25, L1 5.29938e-05, Linf 0.00240061, total time[s] 0.065762 +Converged at iteration 36, L1 8.21163e-05, Linf 0.00753116, total time[s] 0.09394 +Converged at iteration 34, L1 5.20683e-05, Linf 0.00484345, total time[s] 0.091796 +Converged at iteration 25, L1 6.17056e-05, Linf 0.00311113, total time[s] 0.078628 +Converged at iteration 25, L1 4.92807e-05, Linf 0.0125011, total time[s] 0.066935 +Converged at iteration 27, L1 9.91745e-05, Linf 0.0156269, total time[s] 0.070101 +Converged at iteration 26, L1 4.46201e-05, Linf 0.0157028, total time[s] 0.06787 +Converged at iteration 21, L1 3.93597e-05, Linf 0.00691759, total time[s] 0.063315 +Converged at iteration 19, L1 9.29152e-05, Linf 0.00436306, total time[s] 0.079303 +Converged at iteration 24, L1 6.23417e-05, Linf 0.00256043, total time[s] 0.068381 +Converged at iteration 23, L1 9.33471e-05, Linf 0.0142756, total time[s] 0.07575 +Converged at iteration 20, L1 9.16208e-05, Linf 0.00555399, total time[s] 0.069211 +Converged at iteration 19, L1 5.65588e-05, Linf 0.00196146, total time[s] 0.062933 +Converged at iteration 31, L1 8.06781e-05, Linf 0.00979419, total time[s] 0.08668 +Converged at iteration 22, L1 6.80622e-05, Linf 0.00297922, total time[s] 0.058795 +Converged at iteration 23, L1 6.47961e-05, Linf 0.00604006, total time[s] 0.059778 +Converged at iteration 27, L1 6.41156e-05, Linf 0.00337154, total time[s] 0.068818 +Converged at iteration 24, L1 7.44574e-05, Linf 0.00554475, total time[s] 0.06387 +Converged at iteration 23, L1 7.97648e-05, Linf 0.00437051, total time[s] 0.059754 +Converged at iteration 25, L1 6.62476e-05, Linf 0.00443535, total time[s] 0.064145 +Converged at iteration 25, L1 6.392e-05, Linf 0.00563899, total time[s] 0.064965 +Converged at iteration 27, L1 9.14907e-05, Linf 0.00674586, total time[s] 0.069945 +Converged at iteration 32, L1 5.42163e-05, Linf 0.00320425, total time[s] 0.082408 +Converged at iteration 27, L1 7.47864e-05, Linf 0.00281785, total time[s] 0.069271 +Converged at iteration 31, L1 6.5019e-05, Linf 0.00755017, total time[s] 0.077803 +Converged at iteration 31, L1 6.21485e-05, Linf 0.00244797, total time[s] 0.077878 +Converged at iteration 31, L1 8.01058e-05, Linf 0.00302143, total time[s] 0.077669 +Converged at iteration 29, L1 7.93955e-05, Linf 0.00504425, total time[s] 0.073075 +Converged at iteration 31, L1 4.38893e-05, Linf 0.0104003, total time[s] 0.078584 +Converged at iteration 29, L1 7.71981e-05, Linf 0.0137984, total time[s] 0.072935 +Converged at iteration 25, L1 5.41361e-05, Linf 0.00247333, total time[s] 0.064935 +Converged at iteration 36, L1 8.55036e-05, Linf 0.00790884, total time[s] 0.094279 +Converged at iteration 34, L1 5.65819e-05, Linf 0.00471497, total time[s] 0.095798 +Converged at iteration 25, L1 6.15204e-05, Linf 0.00312879, total time[s] 0.066445 +Converged at iteration 25, L1 4.36207e-05, Linf 0.0118741, total time[s] 0.070078 +Converged at iteration 28, L1 4.94137e-05, Linf 0.0109396, total time[s] 0.074612 +Converged at iteration 26, L1 5.05196e-05, Linf 0.0165097, total time[s] 0.070922 +Converged at iteration 21, L1 3.96646e-05, Linf 0.00692044, total time[s] 0.059595 +Converged at iteration 19, L1 9.13935e-05, Linf 0.00430216, total time[s] 0.058141 +Converged at iteration 24, L1 6.20011e-05, Linf 0.00248619, total time[s] 0.078369 +Converged at iteration 23, L1 9.31761e-05, Linf 0.0139139, total time[s] 0.096252 +Converged at iteration 20, L1 9.27262e-05, Linf 0.005566, total time[s] 0.070508 +Converged at iteration 19, L1 6.06085e-05, Linf 0.00205896, total time[s] 0.079549 +Converged at iteration 31, L1 8.1731e-05, Linf 0.0102019, total time[s] 0.0906 +Converged at iteration 22, L1 6.93432e-05, Linf 0.00299277, total time[s] 0.058053 +Converged at iteration 23, L1 7.33151e-05, Linf 0.00618193, total time[s] 0.06232 +Converged at iteration 27, L1 6.51896e-05, Linf 0.00333374, total time[s] 0.069756 +Converged at iteration 24, L1 7.2577e-05, Linf 0.00538273, total time[s] 0.062659 +Converged at iteration 23, L1 8.27996e-05, Linf 0.00447209, total time[s] 0.07292 +Converged at iteration 25, L1 6.94936e-05, Linf 0.00452375, total time[s] 0.075073 +Converged at iteration 25, L1 7.14533e-05, Linf 0.005941, total time[s] 0.065609 +Converged at iteration 27, L1 9.05796e-05, Linf 0.00683223, total time[s] 0.073495 +Converged at iteration 32, L1 5.77768e-05, Linf 0.00319175, total time[s] 0.08075 +Converged at iteration 27, L1 7.09493e-05, Linf 0.00265987, total time[s] 0.068802 +Converged at iteration 31, L1 6.67298e-05, Linf 0.00775128, total time[s] 0.079906 +Converged at iteration 31, L1 6.223e-05, Linf 0.00232022, total time[s] 0.077763 +Converged at iteration 31, L1 8.89785e-05, Linf 0.00339618, total time[s] 0.077991 +Converged at iteration 29, L1 8.246e-05, Linf 0.00466388, total time[s] 0.073984 +Converged at iteration 31, L1 4.94586e-05, Linf 0.0113232, total time[s] 0.08581 +Converged at iteration 29, L1 8.13429e-05, Linf 0.0144169, total time[s] 0.074184 +Converged at iteration 25, L1 5.36976e-05, Linf 0.00257988, total time[s] 0.064276 +Converged at iteration 36, L1 8.81554e-05, Linf 0.00823859, total time[s] 0.09091 +Converged at iteration 34, L1 6.11498e-05, Linf 0.00490953, total time[s] 0.089644 +Converged at iteration 25, L1 5.91385e-05, Linf 0.00318509, total time[s] 0.067962 +Converged at iteration 25, L1 4.16424e-05, Linf 0.0111437, total time[s] 0.068502 +Converged at iteration 28, L1 4.96258e-05, Linf 0.0115349, total time[s] 0.074107 +Converged at iteration 26, L1 5.08294e-05, Linf 0.0167196, total time[s] 0.067498 +Converged at iteration 21, L1 3.8687e-05, Linf 0.00700977, total time[s] 0.061841 +Converged at iteration 19, L1 8.9743e-05, Linf 0.00425591, total time[s] 0.060647 +Converged at iteration 24, L1 6.1718e-05, Linf 0.0025229, total time[s] 0.081185 +Converged at iteration 23, L1 9.47441e-05, Linf 0.0134817, total time[s] 0.096864 +Converged at iteration 20, L1 9.39259e-05, Linf 0.00554018, total time[s] 0.062287 +Converged at iteration 19, L1 6.96483e-05, Linf 0.00364101, total time[s] 0.068055 +Converged at iteration 31, L1 8.34761e-05, Linf 0.0105025, total time[s] 0.097025 +Converged at iteration 22, L1 7.14052e-05, Linf 0.00307131, total time[s] 0.067247 +Converged at iteration 23, L1 7.23284e-05, Linf 0.00636697, total time[s] 0.064707 +Converged at iteration 27, L1 6.87328e-05, Linf 0.0033416, total time[s] 0.069071 +Converged at iteration 24, L1 7.10011e-05, Linf 0.0052179, total time[s] 0.063873 +Converged at iteration 23, L1 8.4583e-05, Linf 0.0045506, total time[s] 0.058384 +Converged at iteration 25, L1 7.06934e-05, Linf 0.00460733, total time[s] 0.063224 +Converged at iteration 25, L1 7.69086e-05, Linf 0.00637191, total time[s] 0.063094 +Converged at iteration 27, L1 8.8815e-05, Linf 0.00682278, total time[s] 0.068278 +Converged at iteration 32, L1 5.73239e-05, Linf 0.00317827, total time[s] 0.079602 +Converged at iteration 27, L1 6.7226e-05, Linf 0.00250441, total time[s] 0.068735 +Converged at iteration 31, L1 6.66862e-05, Linf 0.00785143, total time[s] 0.078093 +Converged at iteration 31, L1 6.21155e-05, Linf 0.00231098, total time[s] 0.078589 +Converged at iteration 31, L1 9.50673e-05, Linf 0.00364866, total time[s] 0.100949 +Converged at iteration 29, L1 8.22661e-05, Linf 0.00440154, total time[s] 0.105426 +Converged at iteration 31, L1 5.36084e-05, Linf 0.0115057, total time[s] 0.095716 +Converged at iteration 29, L1 8.29906e-05, Linf 0.0148867, total time[s] 0.078152 +Converged at iteration 25, L1 5.40125e-05, Linf 0.00261321, total time[s] 0.064828 +Converged at iteration 36, L1 9.24298e-05, Linf 0.00866198, total time[s] 0.090696 +Converged at iteration 34, L1 6.58557e-05, Linf 0.00564329, total time[s] 0.093484 +Converged at iteration 25, L1 5.78745e-05, Linf 0.00321388, total time[s] 0.080727 +Converged at iteration 24, L1 9.28701e-05, Linf 0.0153753, total time[s] 0.120242 +Converged at iteration 27, L1 9.08243e-05, Linf 0.016239, total time[s] 0.090225 +Converged at iteration 26, L1 5.30549e-05, Linf 0.0172799, total time[s] 0.08349 +Converged at iteration 21, L1 3.89232e-05, Linf 0.00710904, total time[s] 0.062184 +Converged at iteration 19, L1 8.85244e-05, Linf 0.00414684, total time[s] 0.060272 +Converged at iteration 24, L1 6.33263e-05, Linf 0.0026079, total time[s] 0.085535 +Converged at iteration 23, L1 9.199e-05, Linf 0.0129116, total time[s] 0.066931 +Converged at iteration 20, L1 9.67515e-05, Linf 0.00553709, total time[s] 0.06255 +Converged at iteration 19, L1 6.86929e-05, Linf 0.00226505, total time[s] 0.062458 +Converged at iteration 31, L1 8.44999e-05, Linf 0.0108887, total time[s] 0.085285 +Converged at iteration 22, L1 7.56733e-05, Linf 0.0031958, total time[s] 0.061221 +Converged at iteration 23, L1 7.32829e-05, Linf 0.00662442, total time[s] 0.060934 +Converged at iteration 27, L1 6.78758e-05, Linf 0.00338528, total time[s] 0.071476 +Converged at iteration 24, L1 6.78583e-05, Linf 0.00496157, total time[s] 0.063089 +Converged at iteration 23, L1 8.65766e-05, Linf 0.00465102, total time[s] 0.069361 +Converged at iteration 25, L1 7.16188e-05, Linf 0.00472556, total time[s] 0.06678 +Converged at iteration 25, L1 7.8562e-05, Linf 0.00785072, total time[s] 0.065443 +Converged at iteration 27, L1 8.55956e-05, Linf 0.0070115, total time[s] 0.069723 +Converged at iteration 32, L1 5.94559e-05, Linf 0.00321975, total time[s] 0.08484 +Converged at iteration 27, L1 6.31215e-05, Linf 0.00231267, total time[s] 0.069754 +Converged at iteration 31, L1 6.88026e-05, Linf 0.00800401, total time[s] 0.081075 +Converged at iteration 31, L1 6.1319e-05, Linf 0.00224608, total time[s] 0.078891 +Converged at iteration 32, L1 5.0046e-05, Linf 0.00232514, total time[s] 0.084409 +Converged at iteration 29, L1 8.58156e-05, Linf 0.00389417, total time[s] 0.074792 +Converged at iteration 31, L1 5.83737e-05, Linf 0.0132787, total time[s] 0.079093 +Converged at iteration 29, L1 8.57302e-05, Linf 0.0154753, total time[s] 0.075811 +Converged at iteration 25, L1 5.56132e-05, Linf 0.00261302, total time[s] 0.065583 +Converged at iteration 36, L1 9.63181e-05, Linf 0.00895242, total time[s] 0.092039 +Converged at iteration 34, L1 6.99274e-05, Linf 0.0056118, total time[s] 0.093405 +Converged at iteration 25, L1 5.63172e-05, Linf 0.00327757, total time[s] 0.073828 +Converged at iteration 24, L1 8.64782e-05, Linf 0.0150264, total time[s] 0.073183 +Converged at iteration 27, L1 7.40426e-05, Linf 0.0162752, total time[s] 0.071456 +Converged at iteration 26, L1 5.55269e-05, Linf 0.0176414, total time[s] 0.068506 +Converged at iteration 21, L1 3.83939e-05, Linf 0.00718247, total time[s] 0.065914 +Converged at iteration 19, L1 8.84814e-05, Linf 0.00411089, total time[s] 0.084167 +Converged at iteration 24, L1 6.45656e-05, Linf 0.0025884, total time[s] 0.077859 +Converged at iteration 23, L1 9.2872e-05, Linf 0.0123543, total time[s] 0.091062 +Converged at iteration 20, L1 9.85998e-05, Linf 0.00547494, total time[s] 0.062573 +Converged at iteration 19, L1 7.33529e-05, Linf 0.00235477, total time[s] 0.070556 +Converged at iteration 31, L1 8.44099e-05, Linf 0.0111536, total time[s] 0.088469 +Converged at iteration 22, L1 7.13947e-05, Linf 0.0032641, total time[s] 0.057778 +Converged at iteration 23, L1 7.39083e-05, Linf 0.0067611, total time[s] 0.073244 +Converged at iteration 27, L1 6.73593e-05, Linf 0.00337825, total time[s] 0.071175 +Converged at iteration 24, L1 6.57039e-05, Linf 0.00479466, total time[s] 0.064471 +Converged at iteration 23, L1 8.75281e-05, Linf 0.00471655, total time[s] 0.064863 +Converged at iteration 25, L1 7.4029e-05, Linf 0.00479924, total time[s] 0.064453 +Converged at iteration 25, L1 8.03312e-05, Linf 0.00622102, total time[s] 0.071804 +Converged at iteration 27, L1 8.48736e-05, Linf 0.00727795, total time[s] 0.073303 +Converged at iteration 32, L1 6.03857e-05, Linf 0.00321163, total time[s] 0.08384 +Converged at iteration 27, L1 6.0557e-05, Linf 0.00218642, total time[s] 0.070683 +Converged at iteration 31, L1 6.84178e-05, Linf 0.00805926, total time[s] 0.080193 +Converged at iteration 31, L1 6.20044e-05, Linf 0.00229645, total time[s] 0.081984 +Converged at iteration 32, L1 5.38124e-05, Linf 0.00328515, total time[s] 0.084002 +Converged at iteration 29, L1 8.8658e-05, Linf 0.00384894, total time[s] 0.093364 +Converged at iteration 31, L1 6.34327e-05, Linf 0.0138214, total time[s] 0.09029 +Converged at iteration 29, L1 8.49391e-05, Linf 0.0158148, total time[s] 0.081084 +Converged at iteration 25, L1 5.58589e-05, Linf 0.00262663, total time[s] 0.073751 +Converged at iteration 37, L1 4.67832e-05, Linf 0.0071825, total time[s] 0.098224 +Converged at iteration 34, L1 7.64641e-05, Linf 0.00569274, total time[s] 0.104156 +Converged at iteration 25, L1 5.75078e-05, Linf 0.00337167, total time[s] 0.068134 +Converged at iteration 24, L1 8.09075e-05, Linf 0.0144625, total time[s] 0.116127 +Converged at iteration 27, L1 6.20413e-05, Linf 0.0161495, total time[s] 0.074607 +Converged at iteration 26, L1 5.89599e-05, Linf 0.0181272, total time[s] 0.101814 +Converged at iteration 21, L1 3.91553e-05, Linf 0.00725586, total time[s] 0.093952 +Converged at iteration 19, L1 8.83999e-05, Linf 0.0040297, total time[s] 0.067491 +Converged at iteration 24, L1 6.2844e-05, Linf 0.00252677, total time[s] 0.086058 +Converged at iteration 23, L1 9.45194e-05, Linf 0.0115748, total time[s] 0.090933 +Converged at iteration 21, L1 4.44596e-05, Linf 0.00213783, total time[s] 0.086572 +Converged at iteration 19, L1 7.78691e-05, Linf 0.00247424, total time[s] 0.052508 +Converged at iteration 31, L1 8.5496e-05, Linf 0.0116637, total time[s] 0.085016 +Converged at iteration 22, L1 6.94744e-05, Linf 0.00337946, total time[s] 0.063975 +Converged at iteration 23, L1 7.79034e-05, Linf 0.00701851, total time[s] 0.064007 +Converged at iteration 27, L1 6.42863e-05, Linf 0.00339472, total time[s] 0.071187 +Converged at iteration 24, L1 6.27659e-05, Linf 0.00450335, total time[s] 0.065695 +Converged at iteration 23, L1 8.81218e-05, Linf 0.00480264, total time[s] 0.063104 +Converged at iteration 25, L1 7.89864e-05, Linf 0.00495447, total time[s] 0.066814 +Converged at iteration 25, L1 8.31894e-05, Linf 0.00572726, total time[s] 0.071348 +Converged at iteration 27, L1 8.45975e-05, Linf 0.00685586, total time[s] 0.072127 +Converged at iteration 32, L1 6.21042e-05, Linf 0.00327892, total time[s] 0.088862 +Converged at iteration 26, L1 9.65896e-05, Linf 0.0029657, total time[s] 0.074556 +Converged at iteration 31, L1 6.9776e-05, Linf 0.00833367, total time[s] 0.082214 +Converged at iteration 31, L1 5.9617e-05, Linf 0.00233692, total time[s] 0.093021 +Converged at iteration 32, L1 5.85006e-05, Linf 0.00270338, total time[s] 0.084612 +Converged at iteration 29, L1 9.39943e-05, Linf 0.00344079, total time[s] 0.077368 +Converged at iteration 31, L1 6.86319e-05, Linf 0.0147435, total time[s] 0.079894 +Converged at iteration 29, L1 8.55081e-05, Linf 0.0163782, total time[s] 0.079512 +Converged at iteration 25, L1 5.61351e-05, Linf 0.00254066, total time[s] 0.067797 +Converged at iteration 37, L1 4.84642e-05, Linf 0.00740681, total time[s] 0.096782 +Converged at iteration 34, L1 8.05938e-05, Linf 0.00628968, total time[s] 0.097829 +Converged at iteration 25, L1 5.73584e-05, Linf 0.00339267, total time[s] 0.066214 +Converged at iteration 24, L1 7.88382e-05, Linf 0.0141195, total time[s] 0.063063 +Converged at iteration 27, L1 6.21504e-05, Linf 0.0159481, total time[s] 0.070316 +Converged at iteration 26, L1 5.90369e-05, Linf 0.0183154, total time[s] 0.068332 +Converged at iteration 21, L1 3.89579e-05, Linf 0.00730726, total time[s] 0.065256 +Converged at iteration 19, L1 8.63534e-05, Linf 0.00404464, total time[s] 0.11277 +Converged at iteration 24, L1 6.24488e-05, Linf 0.00248003, total time[s] 0.098097 +Converged at iteration 23, L1 9.54733e-05, Linf 0.011137, total time[s] 0.109023 +Converged at iteration 21, L1 4.57715e-05, Linf 0.00221548, total time[s] 0.09681 +Converged at iteration 19, L1 8.11258e-05, Linf 0.00260577, total time[s] 0.06686 +Converged at iteration 31, L1 8.57762e-05, Linf 0.0118824, total time[s] 0.088102 +Converged at iteration 22, L1 6.88534e-05, Linf 0.00342683, total time[s] 0.066342 +Converged at iteration 23, L1 8.16374e-05, Linf 0.007135, total time[s] 0.079493 +Converged at iteration 27, L1 6.28016e-05, Linf 0.00338771, total time[s] 0.080864 +Converged at iteration 24, L1 6.14031e-05, Linf 0.004405, total time[s] 0.06518 +Converged at iteration 23, L1 8.86652e-05, Linf 0.00485051, total time[s] 0.061293 +Converged at iteration 25, L1 7.96603e-05, Linf 0.00503452, total time[s] 0.065571 +Converged at iteration 25, L1 8.55098e-05, Linf 0.00579507, total time[s] 0.070231 +Converged at iteration 27, L1 8.38848e-05, Linf 0.00616297, total time[s] 0.081895 +Converged at iteration 32, L1 6.63875e-05, Linf 0.00331861, total time[s] 0.088848 +Converged at iteration 26, L1 9.32223e-05, Linf 0.00282038, total time[s] 0.06979 +Converged at iteration 31, L1 6.95934e-05, Linf 0.00835703, total time[s] 0.084213 +Converged at iteration 31, L1 5.84502e-05, Linf 0.0023239, total time[s] 0.083165 +Converged at iteration 32, L1 5.99436e-05, Linf 0.0027781, total time[s] 0.090213 +Converged at iteration 29, L1 9.73948e-05, Linf 0.0034178, total time[s] 0.084021 +Converged at iteration 31, L1 7.30336e-05, Linf 0.015185, total time[s] 0.086013 +Converged at iteration 29, L1 8.56461e-05, Linf 0.0166276, total time[s] 0.080953 +Converged at iteration 25, L1 5.56529e-05, Linf 0.00254923, total time[s] 0.067077 +Converged at iteration 37, L1 5.03856e-05, Linf 0.00779973, total time[s] 0.112103 +Converged at iteration 34, L1 8.94169e-05, Linf 0.00700116, total time[s] 0.094705 +Converged at iteration 25, L1 5.58406e-05, Linf 0.00347207, total time[s] 0.066025 +Converged at iteration 24, L1 7.79043e-05, Linf 0.0135257, total time[s] 0.063142 +Converged at iteration 27, L1 5.07484e-05, Linf 0.0153597, total time[s] 0.069779 +Converged at iteration 26, L1 5.87473e-05, Linf 0.0185254, total time[s] 0.070568 +Converged at iteration 21, L1 3.9806e-05, Linf 0.00735616, total time[s] 0.057724 +Converged at iteration 19, L1 8.52337e-05, Linf 0.00395445, total time[s] 0.053587 +Converged at iteration 24, L1 6.11287e-05, Linf 0.00252352, total time[s] 0.065341 +Converged at iteration 23, L1 9.87397e-05, Linf 0.0103763, total time[s] 0.082318 +Converged at iteration 21, L1 4.94681e-05, Linf 0.0108598, total time[s] 0.07299 +Converged at iteration 19, L1 8.72801e-05, Linf 0.00285993, total time[s] 0.061588 +Converged at iteration 31, L1 8.67567e-05, Linf 0.0124055, total time[s] 0.09949 +Converged at iteration 22, L1 6.82606e-05, Linf 0.00354857, total time[s] 0.072019 +Converged at iteration 23, L1 8.88664e-05, Linf 0.0073868, total time[s] 0.111636 +Converged at iteration 27, L1 6.00312e-05, Linf 0.00328686, total time[s] 0.073774 +Converged at iteration 24, L1 5.94255e-05, Linf 0.00422117, total time[s] 0.062898 +Converged at iteration 23, L1 9.09977e-05, Linf 0.00494459, total time[s] 0.060039 +Converged at iteration 25, L1 8.37802e-05, Linf 0.00523972, total time[s] 0.065401 +Converged at iteration 25, L1 9.65486e-05, Linf 0.00609229, total time[s] 0.065455 +Converged at iteration 27, L1 8.28331e-05, Linf 0.00582428, total time[s] 0.071113 +Converged at iteration 32, L1 6.49169e-05, Linf 0.00336205, total time[s] 0.080981 +Converged at iteration 26, L1 8.83984e-05, Linf 0.00253082, total time[s] 0.066976 +Converged at iteration 31, L1 7.14325e-05, Linf 0.0085177, total time[s] 0.078292 +Converged at iteration 30, L1 9.96024e-05, Linf 0.00337164, total time[s] 0.076677 +Converged at iteration 32, L1 6.31872e-05, Linf 0.0029559, total time[s] 0.080222 +Converged at iteration 30, L1 7.10761e-05, Linf 0.00289853, total time[s] 0.076025 +Converged at iteration 31, L1 8.11357e-05, Linf 0.0167403, total time[s] 0.078298 +Converged at iteration 29, L1 8.72424e-05, Linf 0.0174931, total time[s] 0.073051 +Converged at iteration 25, L1 5.66742e-05, Linf 0.00246988, total time[s] 0.064744 +Converged at iteration 37, L1 5.17722e-05, Linf 0.00800796, total time[s] 0.104866 +Converged at iteration 34, L1 9.3443e-05, Linf 0.00718457, total time[s] 0.098704 +Converged at iteration 25, L1 5.61754e-05, Linf 0.00350193, total time[s] 0.069632 +Converged at iteration 24, L1 7.72513e-05, Linf 0.0130429, total time[s] 0.068646 +Converged at iteration 27, L1 4.35161e-05, Linf 0.0149884, total time[s] 0.083134 +Converged at iteration 26, L1 5.78765e-05, Linf 0.018537, total time[s] 0.098586 +Converged at iteration 21, L1 3.9907e-05, Linf 0.0073919, total time[s] 0.071632 +Converged at iteration 19, L1 8.44517e-05, Linf 0.00397783, total time[s] 0.085424 +Converged at iteration 24, L1 6.05705e-05, Linf 0.00253538, total time[s] 0.070542 +Converged at iteration 23, L1 9.8541e-05, Linf 0.0099299, total time[s] 0.078919 +Converged at iteration 21, L1 4.93137e-05, Linf 0.00243847, total time[s] 0.072612 +Converged at iteration 19, L1 9.16847e-05, Linf 0.00299046, total time[s] 0.064025 +Converged at iteration 31, L1 8.85466e-05, Linf 0.0125099, total time[s] 0.10062 +Converged at iteration 22, L1 6.66963e-05, Linf 0.0035105, total time[s] 0.062678 +Converged at iteration 23, L1 9.23236e-05, Linf 0.00748434, total time[s] 0.064418 +Converged at iteration 27, L1 5.95941e-05, Linf 0.00325392, total time[s] 0.070767 +Converged at iteration 24, L1 5.87434e-05, Linf 0.00422423, total time[s] 0.062994 +Converged at iteration 23, L1 9.20459e-05, Linf 0.00496533, total time[s] 0.061879 +Converged at iteration 25, L1 8.64803e-05, Linf 0.00532683, total time[s] 0.072918 +Converged at iteration 25, L1 9.87135e-05, Linf 0.00622545, total time[s] 0.070642 +Converged at iteration 27, L1 8.19854e-05, Linf 0.00607146, total time[s] 0.091408 +Converged at iteration 32, L1 6.62362e-05, Linf 0.00493824, total time[s] 0.089767 +Converged at iteration 26, L1 8.71584e-05, Linf 0.00239703, total time[s] 0.101517 +Converged at iteration 31, L1 7.07661e-05, Linf 0.00859808, total time[s] 0.083806 +Converged at iteration 30, L1 9.80889e-05, Linf 0.0033763, total time[s] 0.08014 +Converged at iteration 32, L1 6.49988e-05, Linf 0.00303069, total time[s] 0.083127 +Converged at iteration 30, L1 7.37934e-05, Linf 0.00299895, total time[s] 0.140122 +Converged at iteration 31, L1 8.54159e-05, Linf 0.0171994, total time[s] 0.08473 +Converged at iteration 29, L1 8.67648e-05, Linf 0.017386, total time[s] 0.076928 +Converged at iteration 25, L1 5.5631e-05, Linf 0.00238737, total time[s] 0.064091 +Converged at iteration 37, L1 5.41752e-05, Linf 0.00844809, total time[s] 0.097913 +Converged at iteration 35, L1 3.56197e-05, Linf 0.00420872, total time[s] 0.093311 +Converged at iteration 25, L1 5.85255e-05, Linf 0.00357331, total time[s] 0.072978 +Converged at iteration 24, L1 7.7235e-05, Linf 0.0123802, total time[s] 0.087185 +Converged at iteration 27, L1 3.58017e-05, Linf 0.0139349, total time[s] 0.070146 +Converged at iteration 26, L1 5.56327e-05, Linf 0.018441, total time[s] 0.067986 +Converged at iteration 21, L1 4.06688e-05, Linf 0.00741865, total time[s] 0.055896 +Converged at iteration 19, L1 8.21061e-05, Linf 0.00384682, total time[s] 0.050655 +Converged at iteration 24, L1 6.03272e-05, Linf 0.00245816, total time[s] 0.062522 +Converged at iteration 23, L1 9.8521e-05, Linf 0.00907414, total time[s] 0.062859 +Converged at iteration 21, L1 5.20114e-05, Linf 0.00258099, total time[s] 0.068117 +Converged at iteration 19, L1 9.76951e-05, Linf 0.00324485, total time[s] 0.054362 +Converged at iteration 31, L1 8.84186e-05, Linf 0.0129599, total time[s] 0.080536 +Converged at iteration 22, L1 6.65625e-05, Linf 0.00370235, total time[s] 0.059119 +Converged at iteration 24, L1 5.85181e-05, Linf 0.00447742, total time[s] 0.069422 +Converged at iteration 27, L1 5.8509e-05, Linf 0.00314479, total time[s] 0.069525 +Converged at iteration 24, L1 5.86914e-05, Linf 0.00426949, total time[s] 0.062171 +Converged at iteration 23, L1 9.59827e-05, Linf 0.00504085, total time[s] 0.060288 +Converged at iteration 25, L1 9.1157e-05, Linf 0.00557456, total time[s] 0.06435 +Converged at iteration 26, L1 5.9101e-05, Linf 0.00416968, total time[s] 0.066109 +Converged at iteration 27, L1 8.18929e-05, Linf 0.00618007, total time[s] 0.070877 +Converged at iteration 32, L1 6.54856e-05, Linf 0.00356117, total time[s] 0.081688 +Converged at iteration 26, L1 8.09958e-05, Linf 0.00229193, total time[s] 0.070437 +Converged at iteration 31, L1 7.24633e-05, Linf 0.00885047, total time[s] 0.105291 +Converged at iteration 31, L1 5.81908e-05, Linf 0.00232091, total time[s] 0.095131 +Converged at iteration 32, L1 6.76055e-05, Linf 0.00314609, total time[s] 0.104841 +Converged at iteration 30, L1 8.11294e-05, Linf 0.00328227, total time[s] 0.099431 +Converged at iteration 31, L1 9.66749e-05, Linf 0.0186195, total time[s] 0.100153 +Converged at iteration 29, L1 8.84472e-05, Linf 0.0179445, total time[s] 0.085461 +Converged at iteration 25, L1 5.67403e-05, Linf 0.002427, total time[s] 0.065461 +Converged at iteration 37, L1 5.55246e-05, Linf 0.00865329, total time[s] 0.100987 +Converged at iteration 35, L1 3.68365e-05, Linf 0.00436742, total time[s] 0.104479 +Converged at iteration 25, L1 5.91495e-05, Linf 0.00358255, total time[s] 0.071016 +Converged at iteration 24, L1 7.73434e-05, Linf 0.0120585, total time[s] 0.06298 +Converged at iteration 27, L1 3.45243e-05, Linf 0.0133915, total time[s] 0.068539 +Converged at iteration 26, L1 5.49601e-05, Linf 0.0183393, total time[s] 0.069225 +Converged at iteration 21, L1 4.1175e-05, Linf 0.00744937, total time[s] 0.061898 +Converged at iteration 19, L1 7.93728e-05, Linf 0.00387231, total time[s] 0.062948 +Converged at iteration 24, L1 6.04603e-05, Linf 0.00241551, total time[s] 0.077498 +Converged at iteration 23, L1 9.90932e-05, Linf 0.00870816, total time[s] 0.08707 +Converged at iteration 21, L1 5.36375e-05, Linf 0.0026525, total time[s] 0.059838 +Converged at iteration 20, L1 4.53809e-05, Linf 0.00204951, total time[s] 0.058473 +Converged at iteration 31, L1 8.908e-05, Linf 0.0131014, total time[s] 0.10373 +Converged at iteration 22, L1 6.572e-05, Linf 0.00374236, total time[s] 0.069076 +Converged at iteration 24, L1 5.65209e-05, Linf 0.00449956, total time[s] 0.065324 +Converged at iteration 27, L1 5.79967e-05, Linf 0.00312581, total time[s] 0.0805 +Converged at iteration 24, L1 6.23593e-05, Linf 0.00442256, total time[s] 0.081 +Converged at iteration 23, L1 9.71185e-05, Linf 0.00506005, total time[s] 0.073979 +Converged at iteration 25, L1 9.39347e-05, Linf 0.00568686, total time[s] 0.069688 +Converged at iteration 26, L1 6.15596e-05, Linf 0.00428015, total time[s] 0.067728 +Converged at iteration 27, L1 8.20029e-05, Linf 0.00622285, total time[s] 0.068809 +Converged at iteration 32, L1 6.54473e-05, Linf 0.00366189, total time[s] 0.084214 +Converged at iteration 26, L1 7.86791e-05, Linf 0.0023451, total time[s] 0.067061 +Converged at iteration 31, L1 7.11596e-05, Linf 0.00880813, total time[s] 0.087501 +Converged at iteration 30, L1 9.75569e-05, Linf 0.00344151, total time[s] 0.088959 +Converged at iteration 32, L1 6.90251e-05, Linf 0.00321762, total time[s] 0.081014 +Converged at iteration 30, L1 8.3677e-05, Linf 0.00340307, total time[s] 0.077904 +Converged at iteration 32, L1 3.43023e-05, Linf 0.00865658, total time[s] 0.079471 +Converged at iteration 29, L1 8.86825e-05, Linf 0.0181066, total time[s] 0.08041 +Converged at iteration 25, L1 5.69095e-05, Linf 0.00241325, total time[s] 0.077171 +Converged at iteration 37, L1 5.87678e-05, Linf 0.00913631, total time[s] 0.107164 +Converged at iteration 35, L1 4.83931e-05, Linf 0.00473562, total time[s] 0.088335 +Converged at iteration 25, L1 6.14108e-05, Linf 0.00361891, total time[s] 0.067249 +Converged at iteration 24, L1 7.91836e-05, Linf 0.011428, total time[s] 0.062222 +Converged at iteration 26, L1 9.8642e-05, Linf 0.0216633, total time[s] 0.092274 +Converged at iteration 26, L1 5.28958e-05, Linf 0.0180558, total time[s] 0.089104 +Converged at iteration 21, L1 4.2574e-05, Linf 0.00739395, total time[s] 0.067136 +Converged at iteration 19, L1 7.54422e-05, Linf 0.00372029, total time[s] 0.061141 +Converged at iteration 24, L1 6.0086e-05, Linf 0.00239295, total time[s] 0.073751 +Converged at iteration 24, L1 5.35611e-05, Linf 0.00260463, total time[s] 0.074928 +Converged at iteration 21, L1 5.69574e-05, Linf 0.00281113, total time[s] 0.062754 +Converged at iteration 20, L1 4.94364e-05, Linf 0.00223353, total time[s] 0.063489 +Converged at iteration 31, L1 9.38337e-05, Linf 0.0135246, total time[s] 0.094634 +Converged at iteration 22, L1 6.57561e-05, Linf 0.00386095, total time[s] 0.059441 +Converged at iteration 24, L1 5.88558e-05, Linf 0.00468193, total time[s] 0.063313 +Converged at iteration 27, L1 5.48753e-05, Linf 0.00300421, total time[s] 0.071253 +Converged at iteration 24, L1 6.03046e-05, Linf 0.00473767, total time[s] 0.068517 +Converged at iteration 23, L1 9.95251e-05, Linf 0.00512866, total time[s] 0.064215 +Converged at iteration 25, L1 9.96759e-05, Linf 0.00596832, total time[s] 0.065223 +Converged at iteration 26, L1 7.0001e-05, Linf 0.00460748, total time[s] 0.066472 +Converged at iteration 27, L1 8.24019e-05, Linf 0.006229, total time[s] 0.069478 +Converged at iteration 32, L1 6.53743e-05, Linf 0.00381728, total time[s] 0.080419 +Converged at iteration 26, L1 7.3869e-05, Linf 0.00247346, total time[s] 0.073489 +Converged at iteration 31, L1 7.2032e-05, Linf 0.00898184, total time[s] 0.0791 +Converged at iteration 30, L1 9.68883e-05, Linf 0.00347454, total time[s] 0.078658 +Converged at iteration 32, L1 7.24499e-05, Linf 0.00332637, total time[s] 0.08319 +Converged at iteration 30, L1 9.21219e-05, Linf 0.00374857, total time[s] 0.084822 +Converged at iteration 32, L1 3.79975e-05, Linf 0.00948169, total time[s] 0.086517 +Converged at iteration 29, L1 9.0821e-05, Linf 0.0186355, total time[s] 0.075738 +Converged at iteration 25, L1 5.72536e-05, Linf 0.00250021, total time[s] 0.067108 +Converged at iteration 37, L1 5.96929e-05, Linf 0.0093452, total time[s] 0.095411 +Converged at iteration 35, L1 4.20818e-05, Linf 0.0048994, total time[s] 0.102924 +Converged at iteration 25, L1 6.09589e-05, Linf 0.00360093, total time[s] 0.06692 +Converged at iteration 24, L1 7.88712e-05, Linf 0.0110947, total time[s] 0.064118 +Converged at iteration 26, L1 8.92998e-05, Linf 0.0211569, total time[s] 0.068797 +Converged at iteration 26, L1 5.21946e-05, Linf 0.0177039, total time[s] 0.075332 +Converged at iteration 21, L1 4.26893e-05, Linf 0.00747586, total time[s] 0.069265 +Converged at iteration 19, L1 7.23992e-05, Linf 0.00373683, total time[s] 0.058943 +Converged at iteration 24, L1 5.88919e-05, Linf 0.00235145, total time[s] 0.075817 +Converged at iteration 24, L1 5.39154e-05, Linf 0.00250161, total time[s] 0.069466 +Converged at iteration 21, L1 5.77982e-05, Linf 0.00287064, total time[s] 0.070957 +Converged at iteration 20, L1 5.06157e-05, Linf 0.00230933, total time[s] 0.055628 +Converged at iteration 31, L1 9.46242e-05, Linf 0.0136453, total time[s] 0.087378 +Converged at iteration 22, L1 6.55646e-05, Linf 0.0039009, total time[s] 0.05996 +Converged at iteration 24, L1 5.97468e-05, Linf 0.00465095, total time[s] 0.068153 +Converged at iteration 27, L1 5.48505e-05, Linf 0.0029844, total time[s] 0.075184 +Converged at iteration 24, L1 6.0984e-05, Linf 0.00489881, total time[s] 0.069343 +Converged at iteration 24, L1 5.37442e-05, Linf 0.00326232, total time[s] 0.066418 +Converged at iteration 26, L1 5.08009e-05, Linf 0.0034198, total time[s] 0.071665 +Converged at iteration 26, L1 7.26489e-05, Linf 0.00470544, total time[s] 0.071506 +Converged at iteration 27, L1 8.23495e-05, Linf 0.00630295, total time[s] 0.070985 +Converged at iteration 32, L1 6.56978e-05, Linf 0.00389577, total time[s] 0.083421 +Converged at iteration 26, L1 7.22809e-05, Linf 0.00251902, total time[s] 0.070045 +Converged at iteration 31, L1 7.12344e-05, Linf 0.00899134, total time[s] 0.082205 +Converged at iteration 30, L1 9.7823e-05, Linf 0.00346736, total time[s] 0.078897 +Converged at iteration 32, L1 7.41303e-05, Linf 0.00338871, total time[s] 0.084145 +Converged at iteration 30, L1 9.45169e-05, Linf 0.00388402, total time[s] 0.07783 +Converged at iteration 32, L1 3.96991e-05, Linf 0.0098368, total time[s] 0.082597 +Converged at iteration 29, L1 9.12392e-05, Linf 0.0187673, total time[s] 0.074864 +Converged at iteration 25, L1 5.76144e-05, Linf 0.00280751, total time[s] 0.064414 +Converged at iteration 37, L1 6.28448e-05, Linf 0.00986554, total time[s] 0.104494 +Converged at iteration 35, L1 4.61323e-05, Linf 0.00538453, total time[s] 0.097475 +Converged at iteration 25, L1 6.10405e-05, Linf 0.00360745, total time[s] 0.066733 +Converged at iteration 24, L1 8.15395e-05, Linf 0.0105659, total time[s] 0.062783 +Converged at iteration 26, L1 8.21633e-05, Linf 0.0201871, total time[s] 0.067261 +Converged at iteration 26, L1 5.20949e-05, Linf 0.01762, total time[s] 0.069314 +Converged at iteration 21, L1 4.37587e-05, Linf 0.00748667, total time[s] 0.072875 +Converged at iteration 19, L1 6.82475e-05, Linf 0.00356994, total time[s] 0.074647 +Converged at iteration 24, L1 5.81613e-05, Linf 0.00230276, total time[s] 0.080503 +Converged at iteration 24, L1 5.3928e-05, Linf 0.00230932, total time[s] 0.073756 +Converged at iteration 21, L1 6.12793e-05, Linf 0.0030348, total time[s] 0.065644 +Converged at iteration 20, L1 5.49231e-05, Linf 0.00249521, total time[s] 0.068455 +Converged at iteration 31, L1 9.85883e-05, Linf 0.0140229, total time[s] 0.096884 +Converged at iteration 22, L1 6.58537e-05, Linf 0.00402887, total time[s] 0.056679 +Converged at iteration 24, L1 5.79041e-05, Linf 0.00472998, total time[s] 0.061671 +Converged at iteration 27, L1 5.31745e-05, Linf 0.00285682, total time[s] 0.06818 +Converged at iteration 24, L1 6.20713e-05, Linf 0.00507143, total time[s] 0.114216 +Converged at iteration 24, L1 5.51794e-05, Linf 0.00328258, total time[s] 0.066919 +Converged at iteration 26, L1 5.14419e-05, Linf 0.00357884, total time[s] 0.066082 +Converged at iteration 26, L1 8.07554e-05, Linf 0.00504616, total time[s] 0.072311 +Converged at iteration 27, L1 8.4228e-05, Linf 0.0063381, total time[s] 0.073284 +Converged at iteration 32, L1 6.67683e-05, Linf 0.00397921, total time[s] 0.086303 +Converged at iteration 26, L1 7.04668e-05, Linf 0.0026273, total time[s] 0.216308 +Converged at iteration 31, L1 7.14136e-05, Linf 0.00914733, total time[s] 0.087481 +Converged at iteration 30, L1 9.57917e-05, Linf 0.003476, total time[s] 0.089286 +Converged at iteration 32, L1 7.85476e-05, Linf 0.00349547, total time[s] 0.085855 +Converged at iteration 31, L1 6.19926e-05, Linf 0.00332061, total time[s] 0.082573 +Converged at iteration 32, L1 4.4243e-05, Linf 0.0107773, total time[s] 0.083628 +Converged at iteration 29, L1 9.49917e-05, Linf 0.019256, total time[s] 0.077322 +Converged at iteration 25, L1 5.88548e-05, Linf 0.00274488, total time[s] 0.066948 +Converged at iteration 37, L1 6.46168e-05, Linf 0.00990913, total time[s] 0.111304 +Converged at iteration 35, L1 4.77591e-05, Linf 0.00556269, total time[s] 0.106912 +Converged at iteration 25, L1 6.11651e-05, Linf 0.00359343, total time[s] 0.067028 +Converged at iteration 24, L1 8.17005e-05, Linf 0.0103221, total time[s] 0.062905 +Converged at iteration 26, L1 7.79363e-05, Linf 0.0199095, total time[s] 0.067622 +Converged at iteration 26, L1 5.21296e-05, Linf 0.0176388, total time[s] 0.067864 +Converged at iteration 21, L1 4.40863e-05, Linf 0.00760404, total time[s] 0.067565 +Converged at iteration 19, L1 6.57707e-05, Linf 0.0035737, total time[s] 0.060155 +Converged at iteration 24, L1 5.79018e-05, Linf 0.00229338, total time[s] 0.070893 +Converged at iteration 24, L1 5.59556e-05, Linf 0.0022079, total time[s] 0.078382 +Converged at iteration 21, L1 6.24018e-05, Linf 0.00308774, total time[s] 0.064311 +Converged at iteration 20, L1 5.6007e-05, Linf 0.00257058, total time[s] 0.06523 +Converged at iteration 32, L1 3.88719e-05, Linf 0.0085366, total time[s] 0.088278 +Converged at iteration 22, L1 6.61236e-05, Linf 0.00407271, total time[s] 0.059123 +Converged at iteration 24, L1 5.69829e-05, Linf 0.00480468, total time[s] 0.066641 +Converged at iteration 27, L1 5.28402e-05, Linf 0.00282926, total time[s] 0.074353 +Converged at iteration 24, L1 6.17281e-05, Linf 0.00502649, total time[s] 0.093951 +Converged at iteration 24, L1 5.53622e-05, Linf 0.00327463, total time[s] 0.070347 +Converged at iteration 26, L1 5.28884e-05, Linf 0.00363453, total time[s] 0.072375 +Converged at iteration 26, L1 8.47047e-05, Linf 0.00516828, total time[s] 0.070315 +Converged at iteration 27, L1 8.42962e-05, Linf 0.00634255, total time[s] 0.073151 +Converged at iteration 32, L1 6.73678e-05, Linf 0.00401508, total time[s] 0.084742 +Converged at iteration 26, L1 7.00033e-05, Linf 0.0026492, total time[s] 0.068166 +Converged at iteration 31, L1 7.40773e-05, Linf 0.00912136, total time[s] 0.079935 +Converged at iteration 30, L1 9.79999e-05, Linf 0.00346825, total time[s] 0.077424 +Converged at iteration 32, L1 7.89897e-05, Linf 0.00354454, total time[s] 0.08218 +Converged at iteration 31, L1 6.04701e-05, Linf 0.00367276, total time[s] 0.081123 +Converged at iteration 32, L1 4.60978e-05, Linf 0.0111568, total time[s] 0.081096 +Converged at iteration 29, L1 9.57061e-05, Linf 0.0191579, total time[s] 0.073247 +Converged at iteration 25, L1 6.03268e-05, Linf 0.00272882, total time[s] 0.077347 +Converged at iteration 37, L1 6.76738e-05, Linf 0.0100406, total time[s] 0.177272 +Converged at iteration 35, L1 5.21449e-05, Linf 0.00611174, total time[s] 0.156267 +Converged at iteration 25, L1 6.2492e-05, Linf 0.00351861, total time[s] 0.080985 +Converged at iteration 24, L1 8.30056e-05, Linf 0.00976597, total time[s] 0.106311 +Converged at iteration 26, L1 7.15735e-05, Linf 0.018697, total time[s] 0.119467 +Converged at iteration 26, L1 5.24573e-05, Linf 0.0172558, total time[s] 0.131945 +Converged at iteration 21, L1 4.62135e-05, Linf 0.00750619, total time[s] 0.09657 +Converged at iteration 19, L1 6.15093e-05, Linf 0.00341082, total time[s] 0.082319 +Converged at iteration 24, L1 5.66233e-05, Linf 0.00288615, total time[s] 0.094154 +Converged at iteration 24, L1 5.73981e-05, Linf 0.00736556, total time[s] 0.111126 +Converged at iteration 21, L1 6.5796e-05, Linf 0.00324305, total time[s] 0.074981 +Converged at iteration 20, L1 5.99265e-05, Linf 0.00276204, total time[s] 0.058211 +Converged at iteration 32, L1 3.97337e-05, Linf 0.00863174, total time[s] 0.083237 +Converged at iteration 22, L1 6.78976e-05, Linf 0.00422372, total time[s] 0.059092 +Converged at iteration 24, L1 5.63398e-05, Linf 0.00498708, total time[s] 0.063574 +Converged at iteration 27, L1 5.3568e-05, Linf 0.00275601, total time[s] 0.074095 +Converged at iteration 24, L1 6.20979e-05, Linf 0.00484214, total time[s] 0.064561 +Converged at iteration 24, L1 5.54755e-05, Linf 0.0032949, total time[s] 0.0648 +Converged at iteration 26, L1 5.71295e-05, Linf 0.00381594, total time[s] 0.068644 +Converged at iteration 26, L1 9.32262e-05, Linf 0.00556587, total time[s] 0.068449 +Converged at iteration 27, L1 8.48853e-05, Linf 0.0063228, total time[s] 0.070445 +Converged at iteration 32, L1 6.86807e-05, Linf 0.00420563, total time[s] 0.084477 +Converged at iteration 26, L1 7.26585e-05, Linf 0.00278878, total time[s] 0.069513 +Converged at iteration 31, L1 7.13198e-05, Linf 0.00925153, total time[s] 0.079846 +Converged at iteration 30, L1 9.52374e-05, Linf 0.00347017, total time[s] 0.078004 +Converged at iteration 32, L1 8.17392e-05, Linf 0.00365705, total time[s] 0.085077 +Converged at iteration 31, L1 5.69691e-05, Linf 0.00360505, total time[s] 0.082584 +Converged at iteration 32, L1 5.014e-05, Linf 0.0122421, total time[s] 0.083267 +Converged at iteration 29, L1 9.55875e-05, Linf 0.0198299, total time[s] 0.075645 +Converged at iteration 25, L1 6.00732e-05, Linf 0.00289624, total time[s] 0.065353 +Converged at iteration 37, L1 6.89954e-05, Linf 0.0102426, total time[s] 0.10056 +Converged at iteration 35, L1 5.31039e-05, Linf 0.00629436, total time[s] 0.094809 +Converged at iteration 25, L1 6.18976e-05, Linf 0.0034251, total time[s] 0.066138 +Converged at iteration 24, L1 8.30549e-05, Linf 0.00949223, total time[s] 0.064619 +Converged at iteration 26, L1 6.38276e-05, Linf 0.0180333, total time[s] 0.070433 +Converged at iteration 26, L1 5.20182e-05, Linf 0.017339, total time[s] 0.070398 +Converged at iteration 21, L1 4.64152e-05, Linf 0.00751483, total time[s] 0.058825 +Converged at iteration 19, L1 5.81061e-05, Linf 0.0034277, total time[s] 0.068784 +Converged at iteration 24, L1 5.59826e-05, Linf 0.00261204, total time[s] 0.067068 +Converged at iteration 24, L1 5.76722e-05, Linf 0.00369935, total time[s] 0.068579 +Converged at iteration 21, L1 6.71666e-05, Linf 0.00329651, total time[s] 0.07493 +Converged at iteration 20, L1 6.15231e-05, Linf 0.00283313, total time[s] 0.069344 +Converged at iteration 32, L1 4.0031e-05, Linf 0.00863952, total time[s] 0.093071 +Converged at iteration 22, L1 6.85132e-05, Linf 0.00428559, total time[s] 0.057638 +Converged at iteration 24, L1 5.57751e-05, Linf 0.00497564, total time[s] 0.066212 +Converged at iteration 27, L1 5.36865e-05, Linf 0.00274463, total time[s] 0.070868 +Converged at iteration 24, L1 6.16407e-05, Linf 0.00471897, total time[s] 0.066424 +Converged at iteration 24, L1 5.51823e-05, Linf 0.00328191, total time[s] 0.068603 +Converged at iteration 26, L1 5.59081e-05, Linf 0.00389401, total time[s] 0.070498 +Converged at iteration 26, L1 9.70697e-05, Linf 0.00569638, total time[s] 0.072581 +Converged at iteration 27, L1 8.4662e-05, Linf 0.00632378, total time[s] 0.071849 +Converged at iteration 32, L1 6.87272e-05, Linf 0.00439753, total time[s] 0.084343 +Converged at iteration 26, L1 7.40161e-05, Linf 0.00276693, total time[s] 0.072907 +Converged at iteration 31, L1 7.12091e-05, Linf 0.00924219, total time[s] 0.083055 +Converged at iteration 30, L1 9.47478e-05, Linf 0.00345305, total time[s] 0.080039 +Converged at iteration 32, L1 8.29757e-05, Linf 0.00371367, total time[s] 0.086924 +Converged at iteration 31, L1 5.58696e-05, Linf 0.00381306, total time[s] 0.082299 +Converged at iteration 32, L1 5.22248e-05, Linf 0.012651, total time[s] 0.083753 +Converged at iteration 29, L1 9.57e-05, Linf 0.0199101, total time[s] 0.07801 +Converged at iteration 25, L1 6.059e-05, Linf 0.00290719, total time[s] 0.066131 +Converged at iteration 37, L1 7.29883e-05, Linf 0.0108543, total time[s] 0.09686 +Converged at iteration 35, L1 5.72708e-05, Linf 0.00686131, total time[s] 0.10054 +Converged at iteration 25, L1 6.32469e-05, Linf 0.00341927, total time[s] 0.073233 +Converged at iteration 24, L1 8.41515e-05, Linf 0.00902424, total time[s] 0.063895 +Converged at iteration 26, L1 6.3333e-05, Linf 0.0167476, total time[s] 0.068368 +Converged at iteration 26, L1 5.2664e-05, Linf 0.0170938, total time[s] 0.069902 +Converged at iteration 21, L1 4.77338e-05, Linf 0.0075391, total time[s] 0.059418 +Converged at iteration 19, L1 5.14924e-05, Linf 0.00325957, total time[s] 0.057893 +Converged at iteration 24, L1 5.48376e-05, Linf 0.00237926, total time[s] 0.089177 +Converged at iteration 24, L1 6.00377e-05, Linf 0.01283, total time[s] 0.097679 +Converged at iteration 21, L1 7.02452e-05, Linf 0.00341187, total time[s] 0.071689 +Converged at iteration 20, L1 6.53091e-05, Linf 0.00301509, total time[s] 0.073667 +Converged at iteration 32, L1 4.1517e-05, Linf 0.00874635, total time[s] 0.105586 +Converged at iteration 22, L1 7.84708e-05, Linf 0.00518502, total time[s] 0.063917 +Converged at iteration 24, L1 6.03085e-05, Linf 0.00619109, total time[s] 0.064187 +Converged at iteration 27, L1 5.10092e-05, Linf 0.00263909, total time[s] 0.071543 +Converged at iteration 24, L1 6.15549e-05, Linf 0.00451018, total time[s] 0.062086 +Converged at iteration 24, L1 5.6439e-05, Linf 0.00329448, total time[s] 0.062647 +Converged at iteration 26, L1 5.91137e-05, Linf 0.0040635, total time[s] 0.073306 +Converged at iteration 27, L1 5.70645e-05, Linf 0.00370041, total time[s] 0.092418 +Converged at iteration 27, L1 8.72371e-05, Linf 0.00632849, total time[s] 0.072358 +Converged at iteration 32, L1 7.01556e-05, Linf 0.0045471, total time[s] 0.080499 +Converged at iteration 26, L1 8.1995e-05, Linf 0.00287009, total time[s] 0.066489 +Converged at iteration 31, L1 7.65515e-05, Linf 0.00927883, total time[s] 0.077581 +Converged at iteration 30, L1 9.90963e-05, Linf 0.00345968, total time[s] 0.075465 +Converged at iteration 32, L1 8.66408e-05, Linf 0.00382459, total time[s] 0.083309 +Converged at iteration 31, L1 5.55057e-05, Linf 0.00390512, total time[s] 0.077498 +Converged at iteration 32, L1 5.85867e-05, Linf 0.0137969, total time[s] 0.081312 +Converged at iteration 30, L1 3.35279e-05, Linf 0.00592226, total time[s] 0.076754 +Converged at iteration 25, L1 6.41806e-05, Linf 0.00312871, total time[s] 0.064777 +Converged at iteration 37, L1 7.43874e-05, Linf 0.0110713, total time[s] 0.092235 +Converged at iteration 35, L1 5.92263e-05, Linf 0.00706105, total time[s] 0.092708 +Converged at iteration 25, L1 6.41336e-05, Linf 0.00339466, total time[s] 0.069761 +Converged at iteration 24, L1 8.39192e-05, Linf 0.00875874, total time[s] 0.06236 +Converged at iteration 26, L1 5.5674e-05, Linf 0.0162806, total time[s] 0.068252 +Converged at iteration 26, L1 5.29254e-05, Linf 0.017476, total time[s] 0.068447 +Converged at iteration 21, L1 4.76246e-05, Linf 0.0075558, total time[s] 0.065119 +Converged at iteration 19, L1 4.91733e-05, Linf 0.00325573, total time[s] 0.057385 +Converged at iteration 24, L1 5.42957e-05, Linf 0.00225554, total time[s] 0.07589 +Converged at iteration 24, L1 5.98676e-05, Linf 0.00359639, total time[s] 0.088458 +Converged at iteration 21, L1 7.1499e-05, Linf 0.0034712, total time[s] 0.05828 +Converged at iteration 20, L1 6.65813e-05, Linf 0.00308389, total time[s] 0.056067 +Converged at iteration 32, L1 4.18779e-05, Linf 0.00857951, total time[s] 0.099589 +Converged at iteration 22, L1 7.0495e-05, Linf 0.00449869, total time[s] 0.059455 +Converged at iteration 24, L1 5.57643e-05, Linf 0.00501131, total time[s] 0.067569 +Converged at iteration 27, L1 5.02107e-05, Linf 0.00261129, total time[s] 0.071864 +Converged at iteration 24, L1 6.11956e-05, Linf 0.00443655, total time[s] 0.061418 +Converged at iteration 24, L1 5.55725e-05, Linf 0.00327592, total time[s] 0.061647 +Converged at iteration 26, L1 6.08753e-05, Linf 0.00412489, total time[s] 0.066521 +Converged at iteration 27, L1 5.80693e-05, Linf 0.00379548, total time[s] 0.071931 +Converged at iteration 27, L1 8.73206e-05, Linf 0.00631191, total time[s] 0.071216 +Converged at iteration 32, L1 7.0567e-05, Linf 0.004552, total time[s] 0.081175 +Converged at iteration 26, L1 8.42306e-05, Linf 0.00289242, total time[s] 0.068311 +Converged at iteration 31, L1 7.17152e-05, Linf 0.0093424, total time[s] 0.08425 +Converged at iteration 30, L1 9.66039e-05, Linf 0.00344967, total time[s] 0.080766 +Converged at iteration 32, L1 8.63671e-05, Linf 0.00388094, total time[s] 0.082153 +Converged at iteration 31, L1 5.6246e-05, Linf 0.00404681, total time[s] 0.080483 +Converged at iteration 32, L1 6.09992e-05, Linf 0.0146616, total time[s] 0.081256 +Converged at iteration 29, L1 9.70299e-05, Linf 0.0201448, total time[s] 0.074868 +Converged at iteration 25, L1 6.43662e-05, Linf 0.00313062, total time[s] 0.066371 +Converged at iteration 37, L1 7.83899e-05, Linf 0.0108508, total time[s] 0.099754 +Converged at iteration 35, L1 6.29149e-05, Linf 0.00764532, total time[s] 0.128865 +Converged at iteration 25, L1 6.58882e-05, Linf 0.00340445, total time[s] 0.073205 +Converged at iteration 24, L1 8.33587e-05, Linf 0.00830948, total time[s] 0.066445 +Converged at iteration 26, L1 5.06227e-05, Linf 0.0150328, total time[s] 0.072113 +Converged at iteration 26, L1 5.4867e-05, Linf 0.0170986, total time[s] 0.068226 +Converged at iteration 21, L1 4.83516e-05, Linf 0.00757039, total time[s] 0.059519 +Converged at iteration 19, L1 4.3443e-05, Linf 0.00319947, total time[s] 0.081464 +Converged at iteration 24, L1 5.31906e-05, Linf 0.00224095, total time[s] 0.064431 +Converged at iteration 24, L1 6.00274e-05, Linf 0.00226748, total time[s] 0.069138 +Converged at iteration 21, L1 7.46518e-05, Linf 0.00354912, total time[s] 0.061865 +Converged at iteration 20, L1 7.0256e-05, Linf 0.00326105, total time[s] 0.062141 +Converged at iteration 32, L1 4.30734e-05, Linf 0.00864298, total time[s] 0.095696 +Converged at iteration 22, L1 7.17354e-05, Linf 0.00465368, total time[s] 0.06345 +Converged at iteration 24, L1 5.68089e-05, Linf 0.00543019, total time[s] 0.06268 +Converged at iteration 27, L1 4.81032e-05, Linf 0.00249333, total time[s] 0.0715 +Converged at iteration 24, L1 6.02816e-05, Linf 0.00422823, total time[s] 0.062688 +Converged at iteration 24, L1 5.38584e-05, Linf 0.00326205, total time[s] 0.064415 +Converged at iteration 26, L1 6.63609e-05, Linf 0.00432224, total time[s] 0.076804 +Converged at iteration 27, L1 6.67773e-05, Linf 0.00410573, total time[s] 0.07302 +Converged at iteration 27, L1 8.72063e-05, Linf 0.00630952, total time[s] 0.07451 +Converged at iteration 32, L1 7.24265e-05, Linf 0.00454829, total time[s] 0.083783 +Converged at iteration 26, L1 9.63905e-05, Linf 0.00300823, total time[s] 0.068537 +Converged at iteration 31, L1 7.25978e-05, Linf 0.00956854, total time[s] 0.081257 +Converged at iteration 30, L1 9.89744e-05, Linf 0.00346542, total time[s] 0.077526 +Converged at iteration 32, L1 9.01985e-05, Linf 0.00399476, total time[s] 0.082829 +Converged at iteration 31, L1 5.81487e-05, Linf 0.00444823, total time[s] 0.07994 +Converged at iteration 32, L1 6.84831e-05, Linf 0.0154974, total time[s] 0.084222 +Converged at iteration 29, L1 9.75638e-05, Linf 0.0191947, total time[s] 0.080848 +Converged at iteration 25, L1 6.46838e-05, Linf 0.00310348, total time[s] 0.091918 +Converged at iteration 37, L1 7.99778e-05, Linf 0.0110704, total time[s] 0.097713 +Converged at iteration 35, L1 6.44265e-05, Linf 0.007843, total time[s] 0.097742 +Converged at iteration 25, L1 6.6512e-05, Linf 0.00338625, total time[s] 0.07505 +Converged at iteration 24, L1 8.24495e-05, Linf 0.00802978, total time[s] 0.062977 +Converged at iteration 26, L1 5.19501e-05, Linf 0.0146019, total time[s] 0.068047 +Converged at iteration 26, L1 5.47248e-05, Linf 0.0170775, total time[s] 0.071337 +Converged at iteration 21, L1 4.84221e-05, Linf 0.00758648, total time[s] 0.062943 +Converged at iteration 19, L1 4.2778e-05, Linf 0.00324862, total time[s] 0.066094 +Converged at iteration 24, L1 5.31422e-05, Linf 0.00225405, total time[s] 0.085488 +Converged at iteration 24, L1 6.19116e-05, Linf 0.00457507, total time[s] 0.081831 +Converged at iteration 21, L1 7.62429e-05, Linf 0.00359755, total time[s] 0.063652 +Converged at iteration 20, L1 7.18121e-05, Linf 0.00332628, total time[s] 0.05971 +Converged at iteration 32, L1 4.94379e-05, Linf 0.00872198, total time[s] 0.094782 +Converged at iteration 22, L1 7.31237e-05, Linf 0.00469516, total time[s] 0.062001 +Converged at iteration 24, L1 5.73682e-05, Linf 0.00560841, total time[s] 0.063523 +Converged at iteration 27, L1 4.83302e-05, Linf 0.00246691, total time[s] 0.074605 +Converged at iteration 24, L1 5.97013e-05, Linf 0.00412158, total time[s] 0.064568 +Converged at iteration 24, L1 5.29638e-05, Linf 0.00323581, total time[s] 0.067914 +Converged at iteration 26, L1 6.70405e-05, Linf 0.00439025, total time[s] 0.0711 +Converged at iteration 27, L1 6.78146e-05, Linf 0.00421131, total time[s] 0.081805 +Converged at iteration 27, L1 8.7476e-05, Linf 0.00633889, total time[s] 0.072044 +Converged at iteration 32, L1 7.31155e-05, Linf 0.00456444, total time[s] 0.082761 +Converged at iteration 26, L1 9.9878e-05, Linf 0.00303882, total time[s] 0.067366 +Converged at iteration 31, L1 7.20299e-05, Linf 0.00944159, total time[s] 0.077838 +Converged at iteration 30, L1 9.95246e-05, Linf 0.00346435, total time[s] 0.078003 +Converged at iteration 32, L1 9.19802e-05, Linf 0.00404955, total time[s] 0.081255 +Converged at iteration 31, L1 5.93784e-05, Linf 0.0045912, total time[s] 0.078646 +Converged at iteration 32, L1 7.12686e-05, Linf 0.0159393, total time[s] 0.080228 +Converged at iteration 29, L1 9.72094e-05, Linf 0.0186113, total time[s] 0.074122 +Converged at iteration 25, L1 6.59206e-05, Linf 0.00308657, total time[s] 0.064231 +Converged at iteration 37, L1 8.43669e-05, Linf 0.0113706, total time[s] 0.090741 +Converged at iteration 35, L1 6.89818e-05, Linf 0.00844381, total time[s] 0.090384 +Converged at iteration 25, L1 7.04956e-05, Linf 0.0033714, total time[s] 0.071553 +Converged at iteration 24, L1 8.07337e-05, Linf 0.00757833, total time[s] 0.062877 +Converged at iteration 26, L1 4.75977e-05, Linf 0.0134533, total time[s] 0.066241 +Converged at iteration 26, L1 5.6929e-05, Linf 0.0173545, total time[s] 0.0681 +Converged at iteration 21, L1 4.97738e-05, Linf 0.0075276, total time[s] 0.063913 +Converged at iteration 19, L1 4.362e-05, Linf 0.00347313, total time[s] 0.068093 +Converged at iteration 24, L1 5.36275e-05, Linf 0.00219312, total time[s] 0.081854 +Converged at iteration 24, L1 6.37262e-05, Linf 0.0045084, total time[s] 0.088085 +Converged at iteration 21, L1 7.99692e-05, Linf 0.00372231, total time[s] 0.091625 +Converged at iteration 20, L1 7.90533e-05, Linf 0.00349461, total time[s] 0.103614 +Converged at iteration 32, L1 4.61659e-05, Linf 0.00875978, total time[s] 0.115661 +Converged at iteration 22, L1 7.46283e-05, Linf 0.00484934, total time[s] 0.059851 +Converged at iteration 24, L1 5.82528e-05, Linf 0.00403273, total time[s] 0.061557 +Converged at iteration 27, L1 4.63728e-05, Linf 0.00234644, total time[s] 0.068974 +Converged at iteration 24, L1 5.88423e-05, Linf 0.00420866, total time[s] 0.06141 +Converged at iteration 23, L1 9.91261e-05, Linf 0.00515477, total time[s] 0.059346 +Converged at iteration 26, L1 7.18063e-05, Linf 0.0045847, total time[s] 0.065927 +Converged at iteration 27, L1 7.49438e-05, Linf 0.0045387, total time[s] 0.075649 +Converged at iteration 27, L1 8.80307e-05, Linf 0.00633097, total time[s] 0.115622 +Converged at iteration 32, L1 7.4629e-05, Linf 0.00460854, total time[s] 0.083125 +Converged at iteration 27, L1 7.09235e-05, Linf 0.0020328, total time[s] 0.066767 +Converged at iteration 31, L1 7.50034e-05, Linf 0.00946127, total time[s] 0.07547 +Converged at iteration 31, L1 5.95653e-05, Linf 0.0023268, total time[s] 0.083365 +Converged at iteration 32, L1 9.9391e-05, Linf 0.00421024, total time[s] 0.076673 +Converged at iteration 31, L1 6.22374e-05, Linf 0.005014, total time[s] 0.07451 +Converged at iteration 32, L1 7.91141e-05, Linf 0.0172508, total time[s] 0.078157 +Converged at iteration 30, L1 3.14326e-05, Linf 0.00626027, total time[s] 0.073952 +Converged at iteration 25, L1 6.70186e-05, Linf 0.00317958, total time[s] 0.062599 +Converged at iteration 37, L1 8.62897e-05, Linf 0.0116314, total time[s] 0.090624 +Converged at iteration 35, L1 7.06648e-05, Linf 0.00864893, total time[s] 0.090716 +Converged at iteration 25, L1 7.04543e-05, Linf 0.0033388, total time[s] 0.074841 +Converged at iteration 24, L1 8.02172e-05, Linf 0.00734115, total time[s] 0.064927 +Converged at iteration 26, L1 4.57189e-05, Linf 0.0130507, total time[s] 0.067248 +Converged at iteration 26, L1 5.79503e-05, Linf 0.0174421, total time[s] 0.063819 +Converged at iteration 21, L1 4.99561e-05, Linf 0.00783975, total time[s] 0.052659 +Converged at iteration 19, L1 4.67792e-05, Linf 0.0035211, total time[s] 0.050518 +Converged at iteration 24, L1 5.37083e-05, Linf 0.00324784, total time[s] 0.086235 +Converged at iteration 24, L1 6.39364e-05, Linf 0.00234175, total time[s] 0.082862 +Converged at iteration 21, L1 8.06933e-05, Linf 0.00379392, total time[s] 0.100186 +Converged at iteration 20, L1 7.69336e-05, Linf 0.00355083, total time[s] 0.080937 +Converged at iteration 32, L1 4.68931e-05, Linf 0.00876139, total time[s] 0.094323 +Converged at iteration 22, L1 7.56104e-05, Linf 0.00489854, total time[s] 0.058321 +Converged at iteration 24, L1 5.98879e-05, Linf 0.00465802, total time[s] 0.069769 +Converged at iteration 26, L1 9.95475e-05, Linf 0.00492299, total time[s] 0.068377 +Converged at iteration 24, L1 5.80382e-05, Linf 0.00420157, total time[s] 0.064594 +Converged at iteration 23, L1 9.81381e-05, Linf 0.00510021, total time[s] 0.061783 +Converged at iteration 26, L1 7.29962e-05, Linf 0.00465849, total time[s] 0.075912 +Converged at iteration 27, L1 7.62294e-05, Linf 0.00467593, total time[s] 0.078294 +Converged at iteration 27, L1 8.82461e-05, Linf 0.00634046, total time[s] 0.072037 +Converged at iteration 32, L1 7.54748e-05, Linf 0.00464366, total time[s] 0.099308 +Converged at iteration 27, L1 7.22702e-05, Linf 0.00205902, total time[s] 0.074949 +Converged at iteration 31, L1 7.20505e-05, Linf 0.00954411, total time[s] 0.129039 +Converged at iteration 31, L1 5.45974e-05, Linf 0.00233079, total time[s] 0.092424 +Converged at iteration 32, L1 9.92035e-05, Linf 0.00427012, total time[s] 0.087098 +Converged at iteration 31, L1 6.31277e-05, Linf 0.00517752, total time[s] 0.081354 +Converged at iteration 32, L1 8.17483e-05, Linf 0.0177434, total time[s] 0.08287 +Converged at iteration 29, L1 9.75181e-05, Linf 0.0167683, total time[s] 0.084874 +Converged at iteration 25, L1 6.63251e-05, Linf 0.00317873, total time[s] 0.074508 +Converged at iteration 37, L1 9.08157e-05, Linf 0.0122429, total time[s] 0.121655 +Converged at iteration 35, L1 7.52386e-05, Linf 0.00921855, total time[s] 0.124329 +Converged at iteration 25, L1 7.15672e-05, Linf 0.00328583, total time[s] 0.062424 +Converged at iteration 24, L1 7.83314e-05, Linf 0.00694545, total time[s] 0.061513 +Converged at iteration 26, L1 4.6713e-05, Linf 0.0120831, total time[s] 0.089883 +Converged at iteration 26, L1 6.19781e-05, Linf 0.0178586, total time[s] 0.09422 +Converged at iteration 21, L1 4.94047e-05, Linf 0.00763705, total time[s] 0.057731 +Converged at iteration 19, L1 5.2533e-05, Linf 0.00371845, total time[s] 0.051231 +Converged at iteration 23, L1 9.98988e-05, Linf 0.00331164, total time[s] 0.064341 +Converged at iteration 24, L1 6.42773e-05, Linf 0.00233044, total time[s] 0.077532 +Converged at iteration 21, L1 8.36644e-05, Linf 0.00388253, total time[s] 0.062452 +Converged at iteration 20, L1 8.03484e-05, Linf 0.00369654, total time[s] 0.068076 +Converged at iteration 32, L1 4.90588e-05, Linf 0.00884155, total time[s] 0.096175 +Converged at iteration 22, L1 8.12536e-05, Linf 0.00506304, total time[s] 0.056417 +Converged at iteration 24, L1 6.13295e-05, Linf 0.00478872, total time[s] 0.060929 +Converged at iteration 26, L1 9.53891e-05, Linf 0.00491661, total time[s] 0.063395 +Converged at iteration 24, L1 5.60964e-05, Linf 0.00408897, total time[s] 0.068395 +Converged at iteration 23, L1 9.82273e-05, Linf 0.00499509, total time[s] 0.061116 +Converged at iteration 26, L1 7.60974e-05, Linf 0.00484185, total time[s] 0.070305 +Converged at iteration 27, L1 8.23663e-05, Linf 0.0049668, total time[s] 0.076264 +Converged at iteration 27, L1 8.8912e-05, Linf 0.00635012, total time[s] 0.06785 +Converged at iteration 32, L1 7.78587e-05, Linf 0.00473631, total time[s] 0.078178 +Converged at iteration 27, L1 8.04491e-05, Linf 0.00214, total time[s] 0.067423 +Converged at iteration 31, L1 7.58936e-05, Linf 0.0096966, total time[s] 0.077693 +Converged at iteration 31, L1 5.80487e-05, Linf 0.00238802, total time[s] 0.089528 +Converged at iteration 33, L1 4.40431e-05, Linf 0.00425643, total time[s] 0.088647 +Converged at iteration 31, L1 6.69363e-05, Linf 0.00559218, total time[s] 0.103535 +Converged at iteration 32, L1 9.03383e-05, Linf 0.0191384, total time[s] 0.105147 +Converged at iteration 29, L1 9.76917e-05, Linf 0.0166514, total time[s] 0.093512 +Converged at iteration 25, L1 6.71357e-05, Linf 0.00308418, total time[s] 0.069189 +Converged at iteration 37, L1 9.23453e-05, Linf 0.0124185, total time[s] 0.111239 +Converged at iteration 35, L1 7.64149e-05, Linf 0.00942528, total time[s] 0.198002 +Converged at iteration 25, L1 7.10967e-05, Linf 0.00325304, total time[s] 0.074537 +Converged at iteration 24, L1 7.638e-05, Linf 0.00671646, total time[s] 0.074435 +Converged at iteration 26, L1 4.04367e-05, Linf 0.0117332, total time[s] 0.087016 +Converged at iteration 26, L1 6.34207e-05, Linf 0.0177768, total time[s] 0.077888 +Converged at iteration 21, L1 4.80862e-05, Linf 0.00756536, total time[s] 0.057504 +Converged at iteration 19, L1 5.64958e-05, Linf 0.00376451, total time[s] 0.056406 +Converged at iteration 23, L1 9.8197e-05, Linf 0.00326463, total time[s] 0.066809 +Converged at iteration 24, L1 6.58325e-05, Linf 0.00230256, total time[s] 0.097775 +Converged at iteration 21, L1 8.5468e-05, Linf 0.0039464, total time[s] 0.069073 +Converged at iteration 20, L1 8.19402e-05, Linf 0.00375517, total time[s] 0.056384 +Converged at iteration 32, L1 4.90274e-05, Linf 0.00880026, total time[s] 0.08862 +Converged at iteration 22, L1 7.68855e-05, Linf 0.00513875, total time[s] 0.057337 +Converged at iteration 24, L1 5.99803e-05, Linf 0.00435144, total time[s] 0.061765 +Converged at iteration 26, L1 9.47267e-05, Linf 0.00492421, total time[s] 0.06679 +Converged at iteration 24, L1 5.51069e-05, Linf 0.00397102, total time[s] 0.062628 +Converged at iteration 23, L1 9.77995e-05, Linf 0.00492894, total time[s] 0.060051 +Converged at iteration 26, L1 7.6692e-05, Linf 0.00489542, total time[s] 0.066268 +Converged at iteration 27, L1 8.5404e-05, Linf 0.00508925, total time[s] 0.07135 +Converged at iteration 27, L1 8.88942e-05, Linf 0.00638296, total time[s] 0.070212 +Converged at iteration 32, L1 7.84161e-05, Linf 0.00478325, total time[s] 0.08341 +Converged at iteration 27, L1 8.21588e-05, Linf 0.0021288, total time[s] 0.0705 +Converged at iteration 31, L1 7.22276e-05, Linf 0.00964434, total time[s] 0.078772 +Converged at iteration 31, L1 5.48862e-05, Linf 0.00234975, total time[s] 0.080227 +Converged at iteration 33, L1 4.31885e-05, Linf 0.00218837, total time[s] 0.084223 +Converged at iteration 31, L1 6.79114e-05, Linf 0.00575778, total time[s] 0.08076 +Converged at iteration 32, L1 9.26817e-05, Linf 0.019632, total time[s] 0.084849 +Converged at iteration 29, L1 9.73206e-05, Linf 0.0164127, total time[s] 0.082913 +Converged at iteration 25, L1 6.70095e-05, Linf 0.00306518, total time[s] 0.068179 +Converged at iteration 37, L1 9.73481e-05, Linf 0.0128548, total time[s] 0.095877 +Converged at iteration 35, L1 8.09318e-05, Linf 0.0100333, total time[s] 0.096317 +Converged at iteration 25, L1 7.25991e-05, Linf 0.00318716, total time[s] 0.070338 +Converged at iteration 24, L1 7.40051e-05, Linf 0.00633231, total time[s] 0.065175 +Converged at iteration 26, L1 4.83302e-05, Linf 0.010843, total time[s] 0.068982 +Converged at iteration 26, L1 7.32494e-05, Linf 0.0181967, total time[s] 0.067636 +Converged at iteration 21, L1 4.72484e-05, Linf 0.00765259, total time[s] 0.063115 +Converged at iteration 19, L1 6.45405e-05, Linf 0.0039714, total time[s] 0.069445 +Converged at iteration 23, L1 9.689e-05, Linf 0.00331753, total time[s] 0.074793 +Converged at iteration 24, L1 6.58445e-05, Linf 0.00226499, total time[s] 0.084197 +Converged at iteration 21, L1 8.82514e-05, Linf 0.00404296, total time[s] 0.072663 +Converged at iteration 20, L1 8.57504e-05, Linf 0.00387835, total time[s] 0.069359 +Converged at iteration 32, L1 5.15703e-05, Linf 0.00882219, total time[s] 0.092027 +Converged at iteration 22, L1 7.82914e-05, Linf 0.00528168, total time[s] 0.060661 +Converged at iteration 24, L1 6.17492e-05, Linf 0.00444012, total time[s] 0.064588 +Converged at iteration 26, L1 9.22778e-05, Linf 0.00484358, total time[s] 0.068273 +Converged at iteration 24, L1 5.40336e-05, Linf 0.00369516, total time[s] 0.067469 +Converged at iteration 23, L1 9.92186e-05, Linf 0.00480857, total time[s] 0.064791 +Converged at iteration 26, L1 8.25011e-05, Linf 0.00511869, total time[s] 0.068539 +Converged at iteration 27, L1 9.53599e-05, Linf 0.00545412, total time[s] 0.070481 +Converged at iteration 27, L1 9.07982e-05, Linf 0.00638665, total time[s] 0.074651 +Converged at iteration 32, L1 8.17787e-05, Linf 0.00662443, total time[s] 0.088618 +Converged at iteration 27, L1 8.9646e-05, Linf 0.00224114, total time[s] 0.075628 +Converged at iteration 31, L1 7.31645e-05, Linf 0.00990055, total time[s] 0.09453 +Converged at iteration 31, L1 5.66413e-05, Linf 0.00233566, total time[s] 0.095328 +Converged at iteration 33, L1 4.69024e-05, Linf 0.00234538, total time[s] 0.093138 +Converged at iteration 31, L1 7.22356e-05, Linf 0.00618313, total time[s] 0.085457 +Converged at iteration 33, L1 3.7752e-05, Linf 0.00857223, total time[s] 0.089823 +Converged at iteration 29, L1 9.71688e-05, Linf 0.016383, total time[s] 0.086635 +Converged at iteration 25, L1 6.72533e-05, Linf 0.00298502, total time[s] 0.07808 +Converged at iteration 37, L1 9.85085e-05, Linf 0.0129942, total time[s] 0.10082 +Converged at iteration 35, L1 8.25167e-05, Linf 0.0102398, total time[s] 0.107779 +Converged at iteration 25, L1 7.17375e-05, Linf 0.00315382, total time[s] 0.073543 +Converged at iteration 24, L1 7.19319e-05, Linf 0.00613145, total time[s] 0.063357 +Converged at iteration 26, L1 3.99652e-05, Linf 0.0105679, total time[s] 0.068877 +Converged at iteration 26, L1 6.65991e-05, Linf 0.0193118, total time[s] 0.07064 +Converged at iteration 21, L1 4.69222e-05, Linf 0.00766694, total time[s] 0.054604 +Converged at iteration 19, L1 6.79817e-05, Linf 0.00400875, total time[s] 0.064975 +Converged at iteration 23, L1 9.53837e-05, Linf 0.00331138, total time[s] 0.087673 +Converged at iteration 24, L1 6.6313e-05, Linf 0.00222847, total time[s] 0.070553 +Converged at iteration 21, L1 9.01754e-05, Linf 0.00845634, total time[s] 0.078419 +Converged at iteration 20, L1 8.78543e-05, Linf 0.00400535, total time[s] 0.077448 +Converged at iteration 32, L1 5.24485e-05, Linf 0.00882407, total time[s] 0.089608 +Converged at iteration 22, L1 8.59686e-05, Linf 0.00534024, total time[s] 0.074141 +Converged at iteration 24, L1 6.18981e-05, Linf 0.00447127, total time[s] 0.071724 +Converged at iteration 26, L1 9.21326e-05, Linf 0.00480616, total time[s] 0.069456 +Converged at iteration 24, L1 5.35827e-05, Linf 0.00356382, total time[s] 0.062495 +Converged at iteration 23, L1 9.85751e-05, Linf 0.00473705, total time[s] 0.060188 +Converged at iteration 26, L1 8.32821e-05, Linf 0.0051837, total time[s] 0.069448 +Converged at iteration 27, L1 9.87228e-05, Linf 0.00559885, total time[s] 0.073926 +Converged at iteration 27, L1 9.15268e-05, Linf 0.00640106, total time[s] 0.071148 +Converged at iteration 32, L1 8.11422e-05, Linf 0.00496178, total time[s] 0.081727 +Converged at iteration 27, L1 9.12886e-05, Linf 0.00226041, total time[s] 0.069593 +Converged at iteration 31, L1 7.29044e-05, Linf 0.00975054, total time[s] 0.078911 +Converged at iteration 31, L1 5.66904e-05, Linf 0.00237512, total time[s] 0.079396 +Converged at iteration 33, L1 5.0845e-05, Linf 0.00238909, total time[s] 0.092816 +Converged at iteration 31, L1 7.35674e-05, Linf 0.00633396, total time[s] 0.084418 +Converged at iteration 33, L1 3.90628e-05, Linf 0.00875611, total time[s] 0.086631 +Converged at iteration 29, L1 9.86393e-05, Linf 0.0164164, total time[s] 0.080293 +Converged at iteration 25, L1 6.90137e-05, Linf 0.00299707, total time[s] 0.069623 +Converged at iteration 38, L1 2.98964e-05, Linf 0.0073382, total time[s] 0.09707 +Converged at iteration 35, L1 8.67877e-05, Linf 0.0108043, total time[s] 0.094869 +Converged at iteration 25, L1 7.02231e-05, Linf 0.00305266, total time[s] 0.066418 +Converged at iteration 24, L1 7.00994e-05, Linf 0.0058225, total time[s] 0.063319 +Converged at iteration 26, L1 3.76528e-05, Linf 0.00991436, total time[s] 0.066662 +Converged at iteration 26, L1 6.99531e-05, Linf 0.0191969, total time[s] 0.067417 +Converged at iteration 21, L1 4.65772e-05, Linf 0.00768661, total time[s] 0.062018 +Converged at iteration 19, L1 7.26815e-05, Linf 0.00419449, total time[s] 0.062174 +Converged at iteration 23, L1 9.27005e-05, Linf 0.00331416, total time[s] 0.073076 +Converged at iteration 24, L1 6.97796e-05, Linf 0.00211807, total time[s] 0.065286 +Converged at iteration 21, L1 9.16263e-05, Linf 0.00413591, total time[s] 0.073751 +Converged at iteration 20, L1 9.30385e-05, Linf 0.00441928, total time[s] 0.055689 +Converged at iteration 32, L1 6.38307e-05, Linf 0.00887125, total time[s] 0.118471 +Converged at iteration 22, L1 8.56076e-05, Linf 0.00543677, total time[s] 0.067068 +Converged at iteration 24, L1 6.27603e-05, Linf 0.00451669, total time[s] 0.061331 +Converged at iteration 26, L1 9.20843e-05, Linf 0.00462785, total time[s] 0.067585 +Converged at iteration 24, L1 5.3164e-05, Linf 0.00330826, total time[s] 0.063185 +Converged at iteration 23, L1 9.75387e-05, Linf 0.00461024, total time[s] 0.06415 +Converged at iteration 26, L1 8.90011e-05, Linf 0.00538687, total time[s] 0.069847 +Converged at iteration 28, L1 5.55766e-05, Linf 0.00343501, total time[s] 0.072276 +Converged at iteration 27, L1 9.32261e-05, Linf 0.00642917, total time[s] 0.068942 +Converged at iteration 32, L1 8.40251e-05, Linf 0.00506859, total time[s] 0.11761 +Converged at iteration 27, L1 9.77679e-05, Linf 0.00232746, total time[s] 0.111324 +Converged at iteration 31, L1 7.42783e-05, Linf 0.00984536, total time[s] 0.091535 +Converged at iteration 31, L1 5.63683e-05, Linf 0.00236749, total time[s] 0.078927 +Converged at iteration 33, L1 5.14814e-05, Linf 0.00255124, total time[s] 0.085223 +Converged at iteration 31, L1 7.94988e-05, Linf 0.00675636, total time[s] 0.079846 +Converged at iteration 33, L1 7.56886e-05, Linf 0.0096206, total time[s] 0.083543 +Converged at iteration 29, L1 9.65989e-05, Linf 0.0166251, total time[s] 0.073756 +Converged at iteration 25, L1 6.7304e-05, Linf 0.00295799, total time[s] 0.064314 +Converged at iteration 38, L1 3.05379e-05, Linf 0.00743318, total time[s] 0.103393 +Converged at iteration 35, L1 8.97715e-05, Linf 0.0110892, total time[s] 0.096393 +Converged at iteration 25, L1 7.0121e-05, Linf 0.00301308, total time[s] 0.067512 +Converged at iteration 24, L1 6.92311e-05, Linf 0.00567194, total time[s] 0.068981 +Converged at iteration 26, L1 4.0961e-05, Linf 0.00970987, total time[s] 0.067555 +Converged at iteration 27, L1 6.17125e-05, Linf 0.00716456, total time[s] 0.072339 +Converged at iteration 21, L1 4.63276e-05, Linf 0.00770771, total time[s] 0.066621 +Converged at iteration 19, L1 7.6022e-05, Linf 0.00420531, total time[s] 0.073319 +Converged at iteration 23, L1 9.14778e-05, Linf 0.00329608, total time[s] 0.079482 +Converged at iteration 24, L1 6.97377e-05, Linf 0.00212461, total time[s] 0.074817 +Converged at iteration 21, L1 9.24082e-05, Linf 0.00411157, total time[s] 0.066061 +Converged at iteration 20, L1 9.23862e-05, Linf 0.00417883, total time[s] 0.066795 +Converged at iteration 32, L1 5.61176e-05, Linf 0.0087394, total time[s] 0.108092 +Converged at iteration 22, L1 8.68843e-05, Linf 0.00555975, total time[s] 0.059927 +Converged at iteration 24, L1 6.31671e-05, Linf 0.00455061, total time[s] 0.066411 +Converged at iteration 26, L1 9.33122e-05, Linf 0.0124899, total time[s] 0.066957 +Converged at iteration 24, L1 5.22134e-05, Linf 0.00320546, total time[s] 0.06369 +Converged at iteration 23, L1 9.78106e-05, Linf 0.00453131, total time[s] 0.059968 +Converged at iteration 26, L1 8.7147e-05, Linf 0.00544976, total time[s] 0.066633 +Converged at iteration 28, L1 5.72784e-05, Linf 0.00349738, total time[s] 0.071329 +Converged at iteration 27, L1 9.29814e-05, Linf 0.00645965, total time[s] 0.068564 +Converged at iteration 32, L1 8.55153e-05, Linf 0.00511133, total time[s] 0.087732 +Converged at iteration 27, L1 9.90857e-05, Linf 0.0023393, total time[s] 0.073527 +Converged at iteration 31, L1 7.46601e-05, Linf 0.00984923, total time[s] 0.082243 +Converged at iteration 31, L1 5.5824e-05, Linf 0.00236418, total time[s] 0.077871 +Converged at iteration 33, L1 5.21261e-05, Linf 0.00259379, total time[s] 0.082533 +Converged at iteration 31, L1 8.0018e-05, Linf 0.00692805, total time[s] 0.077691 +Converged at iteration 33, L1 5.98455e-05, Linf 0.0128856, total time[s] 0.085679 +Converged at iteration 30, L1 3.08535e-05, Linf 0.00564885, total time[s] 0.075821 +Converged at iteration 25, L1 6.77165e-05, Linf 0.00295818, total time[s] 0.064445 +Converged at iteration 38, L1 3.15396e-05, Linf 0.0076294, total time[s] 0.101262 +Converged at iteration 36, L1 6.0687e-05, Linf 0.00583194, total time[s] 0.110458 +Converged at iteration 25, L1 6.94858e-05, Linf 0.00292135, total time[s] 0.064833 +Converged at iteration 24, L1 6.85673e-05, Linf 0.00550353, total time[s] 0.061878 +Converged at iteration 26, L1 3.99849e-05, Linf 0.00928767, total time[s] 0.066797 +Converged at iteration 26, L1 9.86769e-05, Linf 0.0200424, total time[s] 0.069345 +Converged at iteration 21, L1 4.58545e-05, Linf 0.00775351, total time[s] 0.069141 +Converged at iteration 19, L1 8.30696e-05, Linf 0.00438618, total time[s] 0.055855 +Converged at iteration 23, L1 9.0396e-05, Linf 0.00330395, total time[s] 0.072185 +Converged at iteration 24, L1 6.97708e-05, Linf 0.00213132, total time[s] 0.073561 +Converged at iteration 21, L1 9.36735e-05, Linf 0.0040771, total time[s] 0.063573 +Converged at iteration 20, L1 9.50974e-05, Linf 0.00433094, total time[s] 0.064697 +Converged at iteration 32, L1 5.91217e-05, Linf 0.00893304, total time[s] 0.111583 +Converged at iteration 22, L1 8.33366e-05, Linf 0.00570511, total time[s] 0.065672 +Converged at iteration 24, L1 6.32028e-05, Linf 0.00459797, total time[s] 0.062522 +Converged at iteration 26, L1 9.09989e-05, Linf 0.0045122, total time[s] 0.066396 +Converged at iteration 24, L1 5.04449e-05, Linf 0.00299709, total time[s] 0.062137 +Converged at iteration 23, L1 9.57051e-05, Linf 0.00438406, total time[s] 0.060017 +Converged at iteration 26, L1 8.95917e-05, Linf 0.00562548, total time[s] 0.068439 +Converged at iteration 28, L1 6.18561e-05, Linf 0.0037106, total time[s] 0.072416 +Converged at iteration 27, L1 9.27889e-05, Linf 0.00650528, total time[s] 0.070259 +Converged at iteration 32, L1 8.53106e-05, Linf 0.00521246, total time[s] 0.081487 +Converged at iteration 28, L1 6.19396e-05, Linf 0.00179595, total time[s] 0.072385 +Converged at iteration 31, L1 7.50324e-05, Linf 0.00993254, total time[s] 0.081441 +Converged at iteration 31, L1 5.73386e-05, Linf 0.00237966, total time[s] 0.079539 +Converged at iteration 33, L1 5.4256e-05, Linf 0.00272881, total time[s] 0.084273 +Converged at iteration 31, L1 8.3988e-05, Linf 0.00728891, total time[s] 0.079051 +Converged at iteration 33, L1 4.54256e-05, Linf 0.010639, total time[s] 0.084173 +Converged at iteration 29, L1 9.66061e-05, Linf 0.016797, total time[s] 0.075537 +Converged at iteration 25, L1 7.07542e-05, Linf 0.00303105, total time[s] 0.067971 +Converged at iteration 38, L1 3.1123e-05, Linf 0.00767113, total time[s] 0.102332 +Converged at iteration 35, L1 9.38512e-05, Linf 0.0117702, total time[s] 0.1003 +Converged at iteration 25, L1 6.91323e-05, Linf 0.00291485, total time[s] 0.066722 +Converged at iteration 24, L1 6.67336e-05, Linf 0.00539454, total time[s] 0.063895 +Converged at iteration 26, L1 3.69046e-05, Linf 0.00912466, total time[s] 0.068545 +Converged at iteration 26, L1 7.75364e-05, Linf 0.0207561, total time[s] 0.06985 +Converged at iteration 21, L1 4.57687e-05, Linf 0.00797359, total time[s] 0.075021 +Converged at iteration 19, L1 8.66154e-05, Linf 0.00442149, total time[s] 0.068331 +Converged at iteration 23, L1 9.00014e-05, Linf 0.00327547, total time[s] 0.079915 +Converged at iteration 24, L1 7.04373e-05, Linf 0.00213811, total time[s] 0.072721 +Converged at iteration 21, L1 9.47363e-05, Linf 0.00413231, total time[s] 0.068043 +Converged at iteration 20, L1 9.75348e-05, Linf 0.00440341, total time[s] 0.077247 +Converged at iteration 32, L1 6.89969e-05, Linf 0.00879626, total time[s] 0.109772 +Converged at iteration 22, L1 8.87017e-05, Linf 0.00575199, total time[s] 0.058714 +Converged at iteration 24, L1 6.38594e-05, Linf 0.00461423, total time[s] 0.060738 +Converged at iteration 26, L1 9.18658e-05, Linf 0.00448231, total time[s] 0.067252 +Converged at iteration 24, L1 5.0295e-05, Linf 0.00291616, total time[s] 0.066218 +Converged at iteration 23, L1 9.42769e-05, Linf 0.00428129, total time[s] 0.062126 +Converged at iteration 26, L1 8.95298e-05, Linf 0.0056888, total time[s] 0.064641 +Converged at iteration 28, L1 6.43333e-05, Linf 0.00380569, total time[s] 0.073787 +Converged at iteration 27, L1 9.44106e-05, Linf 0.00651823, total time[s] 0.069729 +Converged at iteration 32, L1 8.58118e-05, Linf 0.00524624, total time[s] 0.089989 +Converged at iteration 28, L1 6.33852e-05, Linf 0.00195473, total time[s] 0.081749 +Converged at iteration 31, L1 7.60503e-05, Linf 0.00983089, total time[s] 0.084491 +Converged at iteration 31, L1 5.85611e-05, Linf 0.00237008, total time[s] 0.085179 +Converged at iteration 33, L1 5.68399e-05, Linf 0.00276745, total time[s] 0.088336 +Converged at iteration 31, L1 8.60713e-05, Linf 0.00745166, total time[s] 0.080273 +Converged at iteration 33, L1 4.67248e-05, Linf 0.0109546, total time[s] 0.094011 +Converged at iteration 29, L1 9.72481e-05, Linf 0.0168012, total time[s] 0.072898 +Converged at iteration 25, L1 7.08145e-05, Linf 0.0050823, total time[s] 0.065469 +Converged at iteration 36, L1 6.68604e-05, Linf 0.00246561, total time[s] 0.144025 +Converged at iteration 36, L1 5.90671e-05, Linf 0.00627208, total time[s] 0.107084 +Converged at iteration 25, L1 6.94868e-05, Linf 0.00291569, total time[s] 0.069048 +Converged at iteration 24, L1 6.70786e-05, Linf 0.00528796, total time[s] 0.072086 +Converged at iteration 26, L1 3.91642e-05, Linf 0.00879785, total time[s] 0.074083 +Converged at iteration 26, L1 8.29392e-05, Linf 0.0213294, total time[s] 0.08587 +Converged at iteration 21, L1 4.61651e-05, Linf 0.00776143, total time[s] 0.066745 +Converged at iteration 19, L1 8.86219e-05, Linf 0.00458035, total time[s] 0.063865 +Converged at iteration 23, L1 8.85739e-05, Linf 0.00328799, total time[s] 0.106408 +Converged at iteration 24, L1 7.13334e-05, Linf 0.00217311, total time[s] 0.088721 +Converged at iteration 21, L1 9.63473e-05, Linf 0.00421498, total time[s] 0.108899 +Converged at iteration 21, L1 4.68827e-05, Linf 0.00240357, total time[s] 0.084567 +Converged at iteration 32, L1 6.31707e-05, Linf 0.00899218, total time[s] 0.091394 +Converged at iteration 22, L1 9.21576e-05, Linf 0.00591761, total time[s] 0.058843 +Converged at iteration 24, L1 6.48715e-05, Linf 0.00465756, total time[s] 0.074742 +Converged at iteration 26, L1 9.01663e-05, Linf 0.00437953, total time[s] 0.07079 +Converged at iteration 24, L1 4.86404e-05, Linf 0.00271123, total time[s] 0.063082 +Converged at iteration 23, L1 8.98622e-05, Linf 0.00409302, total time[s] 0.073386 +Converged at iteration 26, L1 9.37587e-05, Linf 0.005873, total time[s] 0.073458 +Converged at iteration 28, L1 6.76597e-05, Linf 0.0040568, total time[s] 0.076953 +Converged at iteration 27, L1 9.45855e-05, Linf 0.00657358, total time[s] 0.07078 +Converged at iteration 32, L1 8.68599e-05, Linf 0.00534288, total time[s] 0.087577 +Converged at iteration 28, L1 6.64172e-05, Linf 0.00183984, total time[s] 0.080311 +Converged at iteration 31, L1 7.62827e-05, Linf 0.0100249, total time[s] 0.082181 +Converged at iteration 31, L1 5.75202e-05, Linf 0.00239384, total time[s] 0.081946 +Converged at iteration 33, L1 5.70267e-05, Linf 0.00289234, total time[s] 0.09196 +Converged at iteration 31, L1 9.10646e-05, Linf 0.00787745, total time[s] 0.079956 +Converged at iteration 33, L1 4.97481e-05, Linf 0.011788, total time[s] 0.083973 +Converged at iteration 29, L1 9.43862e-05, Linf 0.016887, total time[s] 0.090467 +Converged at iteration 25, L1 6.71479e-05, Linf 0.00303587, total time[s] 0.065259 +Converged at iteration 38, L1 3.12851e-05, Linf 0.00784171, total time[s] 0.095498 +Converged at iteration 35, L1 9.58944e-05, Linf 0.012043, total time[s] 0.095698 +Converged at iteration 25, L1 6.91826e-05, Linf 0.00291436, total time[s] 0.082132 +Converged at iteration 24, L1 6.65842e-05, Linf 0.00533703, total time[s] 0.070579 +Converged at iteration 26, L1 3.71067e-05, Linf 0.00894983, total time[s] 0.066357 +Converged at iteration 26, L1 7.98598e-05, Linf 0.0211626, total time[s] 0.066713 +Converged at iteration 21, L1 4.57828e-05, Linf 0.00789238, total time[s] 0.063704 +Converged at iteration 19, L1 8.73572e-05, Linf 0.00448499, total time[s] 0.089865 +Converged at iteration 23, L1 8.89761e-05, Linf 0.00329459, total time[s] 0.078138 +Converged at iteration 24, L1 7.12869e-05, Linf 0.00215444, total time[s] 0.085086 +Converged at iteration 21, L1 9.55402e-05, Linf 0.00418329, total time[s] 0.062916 +Converged at iteration 21, L1 5.04294e-05, Linf 0.00234384, total time[s] 0.071881 +Converged at iteration 32, L1 6.14205e-05, Linf 0.00881775, total time[s] 0.129718 +Converged at iteration 22, L1 8.5143e-05, Linf 0.00584021, total time[s] 0.085093 +Converged at iteration 24, L1 6.40167e-05, Linf 0.0046344, total time[s] 0.077566 +Converged at iteration 26, L1 9.13698e-05, Linf 0.0044337, total time[s] 0.135205 +Converged at iteration 24, L1 4.94456e-05, Linf 0.00280564, total time[s] 0.116769 +Converged at iteration 23, L1 9.75667e-05, Linf 0.00853874, total time[s] 0.062126 +Converged at iteration 26, L1 9.28728e-05, Linf 0.00578217, total time[s] 0.071809 +Converged at iteration 28, L1 6.60312e-05, Linf 0.00391543, total time[s] 0.076563 +Converged at iteration 27, L1 9.41259e-05, Linf 0.00654851, total time[s] 0.082594 +Converged at iteration 32, L1 8.63748e-05, Linf 0.0052957, total time[s] 0.083788 +Converged at iteration 28, L1 6.47877e-05, Linf 0.001854, total time[s] 0.09121 +Converged at iteration 31, L1 7.56907e-05, Linf 0.00998091, total time[s] 0.087508 +Converged at iteration 31, L1 5.74448e-05, Linf 0.00239214, total time[s] 0.087958 +Converged at iteration 33, L1 5.56023e-05, Linf 0.00283129, total time[s] 0.092543 +Converged at iteration 31, L1 8.86812e-05, Linf 0.00766541, total time[s] 0.08472 +Converged at iteration 33, L1 4.81565e-05, Linf 0.0113626, total time[s] 0.083882 +Converged at iteration 29, L1 9.46947e-05, Linf 0.0168444, total time[s] 0.075167 +Converged at iteration 25, L1 6.72335e-05, Linf 0.00301769, total time[s] 0.067664 +Converged at iteration 38, L1 3.22067e-05, Linf 0.00790293, total time[s] 0.10436 +Converged at iteration 35, L1 9.69302e-05, Linf 0.0121534, total time[s] 0.095173 +Converged at iteration 25, L1 6.90628e-05, Linf 0.00290968, total time[s] 0.07075 +Converged at iteration 24, L1 6.65394e-05, Linf 0.00528906, total time[s] 0.066639 +Converged at iteration 26, L1 3.8686e-05, Linf 0.00888371, total time[s] 0.068353 +Converged at iteration 26, L1 8.15583e-05, Linf 0.0213364, total time[s] 0.085822 +Converged at iteration 21, L1 4.5943e-05, Linf 0.00777247, total time[s] 0.05989 +Converged at iteration 19, L1 8.84319e-05, Linf 0.00451799, total time[s] 0.071238 +Converged at iteration 23, L1 8.83071e-05, Linf 0.00328579, total time[s] 0.076662 +Converged at iteration 24, L1 7.23735e-05, Linf 0.00216363, total time[s] 0.08056 +Converged at iteration 21, L1 9.57757e-05, Linf 0.00420209, total time[s] 0.060323 +Converged at iteration 20, L1 9.91619e-05, Linf 0.00454029, total time[s] 0.061262 +Converged at iteration 32, L1 6.18853e-05, Linf 0.00897953, total time[s] 0.124945 +Converged at iteration 22, L1 8.97618e-05, Linf 0.00587008, total time[s] 0.068592 +Converged at iteration 24, L1 6.35099e-05, Linf 0.00464107, total time[s] 0.066632 +Converged at iteration 26, L1 9.05726e-05, Linf 0.00441882, total time[s] 0.071305 +Converged at iteration 24, L1 4.90914e-05, Linf 0.00276407, total time[s] 0.065881 +Converged at iteration 23, L1 9.09185e-05, Linf 0.00413744, total time[s] 0.060946 +Converged at iteration 26, L1 9.31205e-05, Linf 0.00581512, total time[s] 0.072322 +Converged at iteration 28, L1 6.74417e-05, Linf 0.00397463, total time[s] 0.072924 +Converged at iteration 27, L1 9.43459e-05, Linf 0.00658426, total time[s] 0.072323 +Converged at iteration 32, L1 8.65465e-05, Linf 0.00531317, total time[s] 0.083169 +Converged at iteration 28, L1 6.5249e-05, Linf 0.00186491, total time[s] 0.076832 +Converged at iteration 31, L1 7.55907e-05, Linf 0.00998305, total time[s] 0.081146 +Converged at iteration 31, L1 5.75669e-05, Linf 0.00239815, total time[s] 0.083356 +Converged at iteration 33, L1 5.5799e-05, Linf 0.00285031, total time[s] 0.084419 +Converged at iteration 31, L1 8.95611e-05, Linf 0.00775352, total time[s] 0.079603 +Converged at iteration 33, L1 4.879e-05, Linf 0.0119596, total time[s] 0.088291 +Converged at iteration 29, L1 9.4793e-05, Linf 0.0168323, total time[s] 0.074777 +Converged at iteration 25, L1 6.72238e-05, Linf 0.00302717, total time[s] 0.066251 +Converged at iteration 38, L1 3.18863e-05, Linf 0.00808264, total time[s] 0.108606 +Converged at iteration 35, L1 9.95038e-05, Linf 0.0124933, total time[s] 0.153516 +Converged at iteration 25, L1 6.93511e-05, Linf 0.00290947, total time[s] 0.074891 +Converged at iteration 24, L1 6.72626e-05, Linf 0.00524839, total time[s] 0.064185 +Converged at iteration 26, L1 3.68263e-05, Linf 0.00868432, total time[s] 0.067274 +Converged at iteration 26, L1 8.39436e-05, Linf 0.0219004, total time[s] 0.081073 +Converged at iteration 21, L1 4.61694e-05, Linf 0.00778033, total time[s] 0.061092 +Converged at iteration 19, L1 9.03918e-05, Linf 0.0046226, total time[s] 0.060781 +Converged at iteration 23, L1 8.77431e-05, Linf 0.00309988, total time[s] 0.073051 +Converged at iteration 24, L1 7.16547e-05, Linf 0.00218835, total time[s] 0.066601 +Converged at iteration 21, L1 9.65245e-05, Linf 0.00423257, total time[s] 0.06174 +Converged at iteration 21, L1 4.66167e-05, Linf 0.00241605, total time[s] 0.058417 +Converged at iteration 32, L1 6.41245e-05, Linf 0.00901234, total time[s] 0.085099 +Converged at iteration 22, L1 8.67692e-05, Linf 0.00596685, total time[s] 0.059027 +Converged at iteration 24, L1 6.39627e-05, Linf 0.00467238, total time[s] 0.063124 +Converged at iteration 26, L1 8.96124e-05, Linf 0.00435136, total time[s] 0.067229 +Converged at iteration 24, L1 4.81887e-05, Linf 0.00266508, total time[s] 0.062951 +Converged at iteration 23, L1 8.80261e-05, Linf 0.00401465, total time[s] 0.060478 +Converged at iteration 26, L1 9.45992e-05, Linf 0.00592813, total time[s] 0.070379 +Converged at iteration 28, L1 7.0017e-05, Linf 0.00412251, total time[s] 0.073534 +Converged at iteration 27, L1 9.53711e-05, Linf 0.00659849, total time[s] 0.071135 +Converged at iteration 32, L1 8.7138e-05, Linf 0.0053678, total time[s] 0.082117 +Converged at iteration 28, L1 6.73117e-05, Linf 0.00190382, total time[s] 0.072349 +Converged at iteration 31, L1 7.64667e-05, Linf 0.0100334, total time[s] 0.108553 +Converged at iteration 31, L1 5.96092e-05, Linf 0.00240195, total time[s] 0.11698 +Converged at iteration 33, L1 5.69179e-05, Linf 0.0029252, total time[s] 0.085673 +Converged at iteration 31, L1 9.27467e-05, Linf 0.00801888, total time[s] 0.077348 +Converged at iteration 33, L1 5.06946e-05, Linf 0.0120697, total time[s] 0.084177 +Converged at iteration 29, L1 9.37995e-05, Linf 0.0168441, total time[s] 0.073 +Converged at iteration 25, L1 6.70803e-05, Linf 0.00303699, total time[s] 0.064516 +Converged at iteration 38, L1 3.21267e-05, Linf 0.00815109, total time[s] 0.092904 +Converged at iteration 36, L1 3.44353e-05, Linf 0.00643398, total time[s] 0.097993 +Converged at iteration 25, L1 6.95123e-05, Linf 0.00290721, total time[s] 0.066101 +Converged at iteration 24, L1 6.74008e-05, Linf 0.00519284, total time[s] 0.062261 +Converged at iteration 26, L1 3.67109e-05, Linf 0.00862142, total time[s] 0.066514 +Converged at iteration 26, L1 8.48811e-05, Linf 0.0221167, total time[s] 0.069099 +Converged at iteration 21, L1 4.62783e-05, Linf 0.00777322, total time[s] 0.064948 +Converged at iteration 19, L1 9.143e-05, Linf 0.00462383, total time[s] 0.085563 +Converged at iteration 23, L1 8.75847e-05, Linf 0.00305451, total time[s] 0.072564 +Converged at iteration 24, L1 7.26232e-05, Linf 0.00219406, total time[s] 0.074494 +Converged at iteration 21, L1 9.69073e-05, Linf 0.00426438, total time[s] 0.081692 +Converged at iteration 21, L1 4.727e-05, Linf 0.00243375, total time[s] 0.119467 +Converged at iteration 32, L1 6.47055e-05, Linf 0.00902115, total time[s] 0.100825 +Converged at iteration 22, L1 9.06295e-05, Linf 0.00600179, total time[s] 0.059787 +Converged at iteration 24, L1 6.4566e-05, Linf 0.00468123, total time[s] 0.069912 +Converged at iteration 26, L1 8.90605e-05, Linf 0.0043289, total time[s] 0.067903 +Converged at iteration 24, L1 4.77919e-05, Linf 0.00261106, total time[s] 0.063586 +Converged at iteration 23, L1 8.70949e-05, Linf 0.00394386, total time[s] 0.06032 +Converged at iteration 26, L1 9.52156e-05, Linf 0.00596409, total time[s] 0.069152 +Converged at iteration 28, L1 7.14834e-05, Linf 0.00417992, total time[s] 0.077368 +Converged at iteration 27, L1 9.58813e-05, Linf 0.0066124, total time[s] 0.069611 +Converged at iteration 32, L1 8.70693e-05, Linf 0.00538807, total time[s] 0.084945 +Converged at iteration 28, L1 6.7842e-05, Linf 0.0019129, total time[s] 0.072538 +Converged at iteration 31, L1 7.64299e-05, Linf 0.0100335, total time[s] 0.082205 +Converged at iteration 31, L1 5.73319e-05, Linf 0.00240343, total time[s] 0.081502 +Converged at iteration 33, L1 5.71813e-05, Linf 0.00294345, total time[s] 0.085556 +Converged at iteration 31, L1 9.42805e-05, Linf 0.00811665, total time[s] 0.079235 +Converged at iteration 33, L1 5.141e-05, Linf 0.0122657, total time[s] 0.083741 +Converged at iteration 29, L1 9.33738e-05, Linf 0.0168148, total time[s] 0.074384 +Converged at iteration 25, L1 6.73425e-05, Linf 0.00303494, total time[s] 0.065066 +Converged at iteration 38, L1 3.26453e-05, Linf 0.00830424, total time[s] 0.095619 +Converged at iteration 36, L1 6.25313e-05, Linf 0.00658481, total time[s] 0.098534 +Converged at iteration 25, L1 6.95684e-05, Linf 0.00290042, total time[s] 0.065671 +Converged at iteration 24, L1 6.78753e-05, Linf 0.00520654, total time[s] 0.064282 +Converged at iteration 26, L1 3.82767e-05, Linf 0.00849031, total time[s] 0.06797 +Converged at iteration 26, L1 8.77501e-05, Linf 0.0226368, total time[s] 0.069074 +Converged at iteration 21, L1 4.69578e-05, Linf 0.00778632, total time[s] 0.084466 +Converged at iteration 19, L1 9.19839e-05, Linf 0.00472304, total time[s] 0.063071 +Converged at iteration 23, L1 8.66018e-05, Linf 0.00288179, total time[s] 0.08147 +Converged at iteration 24, L1 7.27201e-05, Linf 0.00221299, total time[s] 0.079034 +Converged at iteration 21, L1 9.73065e-05, Linf 0.00426896, total time[s] 0.067521 +Converged at iteration 21, L1 4.77692e-05, Linf 0.00246252, total time[s] 0.066734 +Converged at iteration 32, L1 6.6362e-05, Linf 0.00904719, total time[s] 0.134921 +Converged at iteration 22, L1 9.13214e-05, Linf 0.00608293, total time[s] 0.062739 +Converged at iteration 24, L1 6.47857e-05, Linf 0.00470841, total time[s] 0.065094 +Converged at iteration 26, L1 8.78198e-05, Linf 0.00427697, total time[s] 0.07493 +Converged at iteration 24, L1 4.65881e-05, Linf 0.00253178, total time[s] 0.066455 +Converged at iteration 23, L1 8.56276e-05, Linf 0.0038321, total time[s] 0.063409 +Converged at iteration 26, L1 9.59282e-05, Linf 0.00605357, total time[s] 0.074729 +Converged at iteration 28, L1 7.38249e-05, Linf 0.00431394, total time[s] 0.07891 +Converged at iteration 27, L1 9.68192e-05, Linf 0.00665053, total time[s] 0.07364 +Converged at iteration 32, L1 9.00841e-05, Linf 0.00710936, total time[s] 0.124881 +Converged at iteration 28, L1 7.15938e-05, Linf 0.001935, total time[s] 0.105877 +Converged at iteration 31, L1 7.80304e-05, Linf 0.010251, total time[s] 0.117197 +Converged at iteration 31, L1 5.79233e-05, Linf 0.00240247, total time[s] 0.125613 +Converged at iteration 33, L1 6.20087e-05, Linf 0.00491161, total time[s] 0.097658 +Converged at iteration 31, L1 9.91022e-05, Linf 0.00832671, total time[s] 0.090246 +Converged at iteration 33, L1 5.34432e-05, Linf 0.0127107, total time[s] 0.083922 +Converged at iteration 29, L1 9.3715e-05, Linf 0.0168181, total time[s] 0.0808 +Converged at iteration 25, L1 6.80747e-05, Linf 0.00301667, total time[s] 0.074958 +Converged at iteration 38, L1 3.29406e-05, Linf 0.00837708, total time[s] 0.105424 +Converged at iteration 36, L1 3.52737e-05, Linf 0.00666314, total time[s] 0.099787 +Converged at iteration 25, L1 6.94865e-05, Linf 0.00289984, total time[s] 0.06638 +Converged at iteration 24, L1 6.8342e-05, Linf 0.00518947, total time[s] 0.066837 +Converged at iteration 26, L1 3.6987e-05, Linf 0.00842869, total time[s] 0.072422 +Converged at iteration 26, L1 8.87917e-05, Linf 0.0228783, total time[s] 0.074051 +Converged at iteration 21, L1 4.73193e-05, Linf 0.00780369, total time[s] 0.058374 +Converged at iteration 19, L1 9.319e-05, Linf 0.00472911, total time[s] 0.052136 +Converged at iteration 23, L1 8.60507e-05, Linf 0.00286111, total time[s] 0.066584 +Converged at iteration 24, L1 7.29791e-05, Linf 0.00221627, total time[s] 0.074073 +Converged at iteration 21, L1 9.74672e-05, Linf 0.00426623, total time[s] 0.066132 +Converged at iteration 21, L1 4.8124e-05, Linf 0.00247697, total time[s] 0.058877 +Converged at iteration 32, L1 6.70501e-05, Linf 0.00905962, total time[s] 0.084685 +Converged at iteration 22, L1 8.881e-05, Linf 0.00611641, total time[s] 0.064291 +Converged at iteration 24, L1 6.46691e-05, Linf 0.004721, total time[s] 0.09146 +Converged at iteration 26, L1 8.77308e-05, Linf 0.0042577, total time[s] 0.072538 +Converged at iteration 23, L1 9.93566e-05, Linf 0.00418179, total time[s] 0.063309 +Converged at iteration 23, L1 8.49296e-05, Linf 0.00376719, total time[s] 0.066732 +Converged at iteration 26, L1 9.71615e-05, Linf 0.00609293, total time[s] 0.072283 +Converged at iteration 28, L1 7.44776e-05, Linf 0.00437871, total time[s] 0.07471 +Converged at iteration 27, L1 9.72649e-05, Linf 0.00666769, total time[s] 0.087229 +Converged at iteration 32, L1 8.72258e-05, Linf 0.00544185, total time[s] 0.098396 +Converged at iteration 28, L1 7.01535e-05, Linf 0.00194175, total time[s] 0.083471 +Converged at iteration 31, L1 7.67385e-05, Linf 0.010249, total time[s] 0.101189 +Converged at iteration 31, L1 5.86184e-05, Linf 0.00242716, total time[s] 0.153653 +Converged at iteration 33, L1 6.27183e-05, Linf 0.00302545, total time[s] 0.127296 +Converged at iteration 31, L1 9.79368e-05, Linf 0.00844164, total time[s] 0.098384 +Converged at iteration 33, L1 5.43696e-05, Linf 0.0129889, total time[s] 0.101751 +Converged at iteration 29, L1 9.23999e-05, Linf 0.0167887, total time[s] 0.077141 +Converged at iteration 25, L1 6.82335e-05, Linf 0.00300755, total time[s] 0.066247 +Converged at iteration 38, L1 3.35148e-05, Linf 0.00849814, total time[s] 0.100761 +Converged at iteration 36, L1 3.58231e-05, Linf 0.00674213, total time[s] 0.101293 +Converged at iteration 25, L1 6.93903e-05, Linf 0.00289568, total time[s] 0.068815 +Converged at iteration 24, L1 6.91345e-05, Linf 0.00519426, total time[s] 0.061576 +Converged at iteration 26, L1 3.64087e-05, Linf 0.00831117, total time[s] 0.065246 +Converged at iteration 26, L1 9.21516e-05, Linf 0.0234785, total time[s] 0.067539 +Converged at iteration 21, L1 4.82334e-05, Linf 0.00781849, total time[s] 0.058169 +Converged at iteration 19, L1 9.64723e-05, Linf 0.00483125, total time[s] 0.053509 +Converged at iteration 23, L1 8.53671e-05, Linf 0.00284324, total time[s] 0.064727 +Converged at iteration 24, L1 7.7083e-05, Linf 0.0122661, total time[s] 0.078519 +Converged at iteration 21, L1 9.82416e-05, Linf 0.00430954, total time[s] 0.05799 +Converged at iteration 21, L1 4.8888e-05, Linf 0.00250289, total time[s] 0.0577 +Converged at iteration 40, L1 6.71664e-05, Linf 0.00367324, total time[s] 0.104199 +Converged at iteration 35, L1 7.63465e-05, Linf 0.00343595, total time[s] 0.097322 +Converged at iteration 30, L1 9.62609e-05, Linf 0.00432587, total time[s] 0.079225 +Converged at iteration 31, L1 6.25397e-05, Linf 0.00502563, total time[s] 0.079314 +Converged at iteration 27, L1 6.29746e-05, Linf 0.00499542, total time[s] 0.077025 +Converged at iteration 22, L1 8.59049e-05, Linf 0.00444693, total time[s] 0.062147 +Converged at iteration 20, L1 9.6032e-05, Linf 0.0039785, total time[s] 0.066792 +Converged at iteration 24, L1 8.84398e-05, Linf 0.00482993, total time[s] 0.09083 +Converged at iteration 28, L1 7.40379e-05, Linf 0.00445905, total time[s] 0.116795 +Converged at iteration 26, L1 8.28893e-05, Linf 0.00975387, total time[s] 0.113618 +Converged at iteration 22, L1 7.39257e-05, Linf 0.00508739, total time[s] 0.089742 +Converged at iteration 19, L1 6.63292e-05, Linf 0.00393105, total time[s] 0.059596 +Converged at iteration 30, L1 7.99677e-05, Linf 0.00330539, total time[s] 0.090715 +Converged at iteration 20, L1 8.45548e-05, Linf 0.00455026, total time[s] 0.059564 +Converged at iteration 24, L1 7.10952e-05, Linf 0.00466447, total time[s] 0.078357 +Converged at iteration 31, L1 8.94803e-05, Linf 0.0057009, total time[s] 0.097842 +Converged at iteration 27, L1 9.95581e-05, Linf 0.00569719, total time[s] 0.078981 +Converged at iteration 24, L1 8.79736e-05, Linf 0.00465052, total time[s] 0.061028 +Converged at iteration 23, L1 9.22785e-05, Linf 0.00410199, total time[s] 0.060784 +Converged at iteration 26, L1 7.22667e-05, Linf 0.00446044, total time[s] 0.07436 +Converged at iteration 29, L1 7.81441e-05, Linf 0.00479638, total time[s] 0.074252 +Converged at iteration 34, L1 7.09201e-05, Linf 0.00422692, total time[s] 0.089231 +Converged at iteration 30, L1 9.38055e-05, Linf 0.00442333, total time[s] 0.085668 +Converged at iteration 28, L1 9.5144e-05, Linf 0.00311249, total time[s] 0.075587 +Converged at iteration 32, L1 9.44452e-05, Linf 0.00374173, total time[s] 0.084991 +Converged at iteration 37, L1 7.36415e-05, Linf 0.00327727, total time[s] 0.093106 +Converged at iteration 33, L1 8.47236e-05, Linf 0.00457529, total time[s] 0.084006 +Converged at iteration 28, L1 9.72238e-05, Linf 0.00426106, total time[s] 0.072854 +Converged at iteration 24, L1 8.83166e-05, Linf 0.00325703, total time[s] 0.06271 +Converged at iteration 26, L1 9.01173e-05, Linf 0.00383963, total time[s] 0.068042 +Converged at iteration 40, L1 6.6737e-05, Linf 0.0039341, total time[s] 0.102043 +Converged at iteration 35, L1 8.76461e-05, Linf 0.00356963, total time[s] 0.089247 +Converged at iteration 30, L1 9.23078e-05, Linf 0.00419947, total time[s] 0.076052 +Converged at iteration 31, L1 6.33096e-05, Linf 0.00504686, total time[s] 0.07931 +Converged at iteration 26, L1 9.84761e-05, Linf 0.00583553, total time[s] 0.067542 +Converged at iteration 22, L1 7.17892e-05, Linf 0.00414151, total time[s] 0.058313 +Converged at iteration 21, L1 6.41582e-05, Linf 0.00350061, total time[s] 0.056696 +Converged at iteration 24, L1 8.94261e-05, Linf 0.00493329, total time[s] 0.063507 +Converged at iteration 28, L1 7.33001e-05, Linf 0.00443355, total time[s] 0.072557 +Converged at iteration 26, L1 8.06163e-05, Linf 0.00534692, total time[s] 0.067933 +Converged at iteration 22, L1 7.04856e-05, Linf 0.00442004, total time[s] 0.058363 +Converged at iteration 19, L1 5.49055e-05, Linf 0.00332125, total time[s] 0.054196 +Converged at iteration 30, L1 9.53484e-05, Linf 0.00328274, total time[s] 0.077735 +Converged at iteration 20, L1 8.43351e-05, Linf 0.00472686, total time[s] 0.054782 +Converged at iteration 24, L1 7.14476e-05, Linf 0.00475228, total time[s] 0.063422 +Converged at iteration 31, L1 9.43108e-05, Linf 0.0048222, total time[s] 0.07999 +Converged at iteration 27, L1 9.41137e-05, Linf 0.00468385, total time[s] 0.070374 +Converged at iteration 24, L1 8.5195e-05, Linf 0.00428811, total time[s] 0.06329 +Converged at iteration 23, L1 9.24033e-05, Linf 0.00432075, total time[s] 0.061645 +Converged at iteration 26, L1 7.17162e-05, Linf 0.00465386, total time[s] 0.072098 +Converged at iteration 29, L1 7.53667e-05, Linf 0.00488654, total time[s] 0.078451 +Converged at iteration 34, L1 8.13831e-05, Linf 0.00402304, total time[s] 0.087628 +Converged at iteration 31, L1 7.17539e-05, Linf 0.00355192, total time[s] 0.078636 +Converged at iteration 29, L1 7.03296e-05, Linf 0.00272397, total time[s] 0.075788 +Converged at iteration 32, L1 8.28956e-05, Linf 0.00354932, total time[s] 0.084469 +Converged at iteration 36, L1 8.72368e-05, Linf 0.00355888, total time[s] 0.090523 +Converged at iteration 33, L1 8.34495e-05, Linf 0.00484898, total time[s] 0.08816 +Converged at iteration 28, L1 9.19056e-05, Linf 0.00409181, total time[s] 0.073265 +Converged at iteration 24, L1 8.02801e-05, Linf 0.00294022, total time[s] 0.064488 +Converged at iteration 26, L1 8.41559e-05, Linf 0.00389362, total time[s] 0.070065 +Converged at iteration 40, L1 6.52904e-05, Linf 0.0041992, total time[s] 0.100141 +Converged at iteration 35, L1 9.70814e-05, Linf 0.00381048, total time[s] 0.090506 +Converged at iteration 30, L1 7.66259e-05, Linf 0.00420647, total time[s] 0.077119 +Converged at iteration 31, L1 6.1446e-05, Linf 0.00506926, total time[s] 0.079008 +Converged at iteration 26, L1 9.11141e-05, Linf 0.00549579, total time[s] 0.068604 +Converged at iteration 21, L1 9.63202e-05, Linf 0.0046648, total time[s] 0.056817 +Converged at iteration 21, L1 6.94192e-05, Linf 0.00393107, total time[s] 0.056433 +Converged at iteration 24, L1 8.29897e-05, Linf 0.00519514, total time[s] 0.063098 +Converged at iteration 28, L1 6.80228e-05, Linf 0.00440905, total time[s] 0.072715 +Converged at iteration 26, L1 8.13588e-05, Linf 0.00430173, total time[s] 0.06934 +Converged at iteration 21, L1 8.51092e-05, Linf 0.00431601, total time[s] 0.057048 +Converged at iteration 18, L1 7.35752e-05, Linf 0.00299007, total time[s] 0.061475 +Converged at iteration 31, L1 7.50756e-05, Linf 0.00268163, total time[s] 0.080699 +Converged at iteration 20, L1 8.1956e-05, Linf 0.0049455, total time[s] 0.052475 +Converged at iteration 24, L1 6.8632e-05, Linf 0.00499744, total time[s] 0.069178 +Converged at iteration 30, L1 9.424e-05, Linf 0.00345506, total time[s] 0.076841 +Converged at iteration 25, L1 9.01969e-05, Linf 0.00466688, total time[s] 0.066047 +Converged at iteration 23, L1 8.37533e-05, Linf 0.00393097, total time[s] 0.061413 +Converged at iteration 23, L1 9.32581e-05, Linf 0.00455945, total time[s] 0.062186 +Converged at iteration 26, L1 6.90846e-05, Linf 0.00500875, total time[s] 0.069858 +Converged at iteration 29, L1 7.20805e-05, Linf 0.00490213, total time[s] 0.075846 +Converged at iteration 32, L1 8.58059e-05, Linf 0.00350138, total time[s] 0.082885 +Converged at iteration 31, L1 7.2533e-05, Linf 0.003048, total time[s] 0.096845 +Converged at iteration 29, L1 7.76208e-05, Linf 0.00291297, total time[s] 0.085332 +Converged at iteration 32, L1 7.63171e-05, Linf 0.00337579, total time[s] 0.101035 +Converged at iteration 35, L1 9.75139e-05, Linf 0.00406617, total time[s] 0.118456 +Converged at iteration 33, L1 8.07992e-05, Linf 0.00500156, total time[s] 0.136337 +Converged at iteration 28, L1 8.43696e-05, Linf 0.00398757, total time[s] 0.173684 +Converged at iteration 24, L1 7.80467e-05, Linf 0.00256154, total time[s] 0.131013 +Converged at iteration 26, L1 8.3619e-05, Linf 0.00405324, total time[s] 0.082024 +Converged at iteration 39, L1 9.33899e-05, Linf 0.00548848, total time[s] 0.098394 +Converged at iteration 36, L1 7.26009e-05, Linf 0.00384701, total time[s] 0.101335 +Converged at iteration 27, L1 5.17283e-05, Linf 0.00565851, total time[s] 0.071797 +Converged at iteration 31, L1 6.04571e-05, Linf 0.00508913, total time[s] 0.078877 +Converged at iteration 26, L1 7.63234e-05, Linf 0.00544348, total time[s] 0.067777 +Converged at iteration 21, L1 7.16887e-05, Linf 0.00380755, total time[s] 0.059078 +Converged at iteration 20, L1 6.89461e-05, Linf 0.00502957, total time[s] 0.05598 +Converged at iteration 22, L1 7.53383e-05, Linf 0.00751918, total time[s] 0.064935 +Converged at iteration 26, L1 9.72736e-05, Linf 0.0065182, total time[s] 0.082907 +Converged at iteration 25, L1 7.49564e-05, Linf 0.00412523, total time[s] 0.072897 +Converged at iteration 20, L1 8.85752e-05, Linf 0.00555811, total time[s] 0.059831 +Converged at iteration 17, L1 8.52499e-05, Linf 0.00400212, total time[s] 0.05123 +Converged at iteration 31, L1 9.13833e-05, Linf 0.00277116, total time[s] 0.088778 +Converged at iteration 20, L1 6.64156e-05, Linf 0.00539279, total time[s] 0.053204 +Converged at iteration 24, L1 6.25472e-05, Linf 0.00579952, total time[s] 0.067704 +Converged at iteration 28, L1 7.07393e-05, Linf 0.00373891, total time[s] 0.081674 +Converged at iteration 23, L1 9.57141e-05, Linf 0.00711829, total time[s] 0.061595 +Converged at iteration 21, L1 9.3015e-05, Linf 0.0048513, total time[s] 0.061607 +Converged at iteration 23, L1 7.8687e-05, Linf 0.00414955, total time[s] 0.074844 +Converged at iteration 25, L1 9.94185e-05, Linf 0.0062553, total time[s] 0.077425 +Converged at iteration 28, L1 9.83406e-05, Linf 0.00597981, total time[s] 0.077789 +Converged at iteration 30, L1 6.86135e-05, Linf 0.00488089, total time[s] 0.078195 +Converged at iteration 28, L1 8.30509e-05, Linf 0.00350645, total time[s] 0.074622 +Converged at iteration 29, L1 8.85223e-05, Linf 0.0032948, total time[s] 0.080484 +Converged at iteration 31, L1 7.03405e-05, Linf 0.00289972, total time[s] 0.080759 +Converged at iteration 31, L1 9.20078e-05, Linf 0.00457442, total time[s] 0.080159 +Converged at iteration 33, L1 7.42144e-05, Linf 0.0053068, total time[s] 0.083788 +Converged at iteration 28, L1 7.03306e-05, Linf 0.00365175, total time[s] 0.073256 +Converged at iteration 24, L1 8.79772e-05, Linf 0.00186798, total time[s] 0.063583 +Converged at iteration 25, L1 7.01246e-05, Linf 0.00425357, total time[s] 0.066093 +Converged at iteration 39, L1 7.68343e-05, Linf 0.00658937, total time[s] 0.098818 +Converged at iteration 36, L1 7.34284e-05, Linf 0.00526861, total time[s] 0.100918 +Converged at iteration 24, L1 7.50157e-05, Linf 0.00411402, total time[s] 0.069619 +Converged at iteration 31, L1 5.84486e-05, Linf 0.00509164, total time[s] 0.08635 +Converged at iteration 25, L1 8.68472e-05, Linf 0.00571583, total time[s] 0.068164 +Converged at iteration 20, L1 9.23989e-05, Linf 0.00380205, total time[s] 0.055821 +Converged at iteration 19, L1 6.59577e-05, Linf 0.00441369, total time[s] 0.058776 +Converged at iteration 20, L1 9.17508e-05, Linf 0.00663477, total time[s] 0.06558 +Converged at iteration 24, L1 7.94435e-05, Linf 0.00490453, total time[s] 0.067438 +Converged at iteration 24, L1 7.67408e-05, Linf 0.00492113, total time[s] 0.07046 +Converged at iteration 20, L1 6.16792e-05, Linf 0.00519212, total time[s] 0.054748 +Converged at iteration 17, L1 5.2354e-05, Linf 0.00263104, total time[s] 0.047536 +Converged at iteration 32, L1 6.8993e-05, Linf 0.00253737, total time[s] 0.081922 +Converged at iteration 19, L1 9.36219e-05, Linf 0.00706808, total time[s] 0.051467 +Converged at iteration 23, L1 7.85059e-05, Linf 0.00710378, total time[s] 0.063315 +Converged at iteration 26, L1 8.14185e-05, Linf 0.0060313, total time[s] 0.080482 +Converged at iteration 23, L1 5.79552e-05, Linf 0.00603788, total time[s] 0.065407 +Converged at iteration 20, L1 8.31231e-05, Linf 0.00552391, total time[s] 0.05457 +Converged at iteration 22, L1 9.95695e-05, Linf 0.00479366, total time[s] 0.059912 +Converged at iteration 25, L1 8.48786e-05, Linf 0.0043999, total time[s] 0.065527 +Converged at iteration 28, L1 7.81433e-05, Linf 0.00380535, total time[s] 0.071849 +Converged at iteration 29, L1 7.50405e-05, Linf 0.00611968, total time[s] 0.075204 +Converged at iteration 27, L1 7.35058e-05, Linf 0.00401981, total time[s] 0.070512 +Converged at iteration 29, L1 7.66175e-05, Linf 0.00380589, total time[s] 0.074825 +Converged at iteration 29, L1 9.19912e-05, Linf 0.00277232, total time[s] 0.075632 +Converged at iteration 28, L1 8.48896e-05, Linf 0.00273813, total time[s] 0.073476 +Converged at iteration 33, L1 6.20116e-05, Linf 0.00584911, total time[s] 0.087378 +Converged at iteration 27, L1 6.9546e-05, Linf 0.00334625, total time[s] 0.072987 +Converged at iteration 24, L1 9.68004e-05, Linf 0.00239042, total time[s] 0.066156 +Converged at iteration 23, L1 7.56752e-05, Linf 0.00336635, total time[s] 0.061878 +Converged at iteration 39, L1 7.44768e-05, Linf 0.00661608, total time[s] 0.100756 +Converged at iteration 36, L1 7.22495e-05, Linf 0.00533586, total time[s] 0.099226 +Converged at iteration 24, L1 7.47017e-05, Linf 0.00388772, total time[s] 0.06281 +Converged at iteration 31, L1 5.69756e-05, Linf 0.00507401, total time[s] 0.079618 +Converged at iteration 25, L1 8.74099e-05, Linf 0.00583968, total time[s] 0.065251 +Converged at iteration 20, L1 9.51525e-05, Linf 0.00386566, total time[s] 0.053193 +Converged at iteration 19, L1 6.38795e-05, Linf 0.00442362, total time[s] 0.050373 +Converged at iteration 20, L1 9.02405e-05, Linf 0.00655506, total time[s] 0.053908 +Converged at iteration 24, L1 7.70359e-05, Linf 0.0045698, total time[s] 0.067027 +Converged at iteration 24, L1 7.81218e-05, Linf 0.00501669, total time[s] 0.073488 +Converged at iteration 20, L1 6.12549e-05, Linf 0.00515376, total time[s] 0.059498 +Converged at iteration 16, L1 9.93201e-05, Linf 0.00457241, total time[s] 0.095413 +Converged at iteration 32, L1 6.90282e-05, Linf 0.00257278, total time[s] 0.104347 +Converged at iteration 19, L1 9.33474e-05, Linf 0.00697155, total time[s] 0.050876 +Converged at iteration 23, L1 7.74294e-05, Linf 0.00703233, total time[s] 0.060443 +Converged at iteration 26, L1 7.99028e-05, Linf 0.00596621, total time[s] 0.067756 +Converged at iteration 23, L1 5.70571e-05, Linf 0.00599071, total time[s] 0.059714 +Converged at iteration 20, L1 8.25443e-05, Linf 0.00551217, total time[s] 0.053751 +Converged at iteration 23, L1 6.34814e-05, Linf 0.00299035, total time[s] 0.063622 +Converged at iteration 25, L1 8.38177e-05, Linf 0.00419966, total time[s] 0.067727 +Converged at iteration 28, L1 7.75072e-05, Linf 0.00351883, total time[s] 0.081087 +Converged at iteration 29, L1 7.46265e-05, Linf 0.00612468, total time[s] 0.090515 +Converged at iteration 27, L1 7.37208e-05, Linf 0.00399168, total time[s] 0.072792 +Converged at iteration 29, L1 7.75945e-05, Linf 0.00382362, total time[s] 0.075092 +Converged at iteration 29, L1 9.17845e-05, Linf 0.00277466, total time[s] 0.075496 +Converged at iteration 28, L1 8.18793e-05, Linf 0.0026651, total time[s] 0.079579 +Converged at iteration 33, L1 6.00627e-05, Linf 0.00585273, total time[s] 0.084891 +Converged at iteration 27, L1 6.9185e-05, Linf 0.00343039, total time[s] 0.071135 +Converged at iteration 24, L1 9.90797e-05, Linf 0.00243498, total time[s] 0.063726 +Converged at iteration 23, L1 7.49348e-05, Linf 0.00329646, total time[s] 0.062355 +Converged at iteration 39, L1 7.33806e-05, Linf 0.00662307, total time[s] 0.100111 +Converged at iteration 36, L1 7.0026e-05, Linf 0.00534051, total time[s] 0.093834 +Converged at iteration 24, L1 7.33512e-05, Linf 0.00368522, total time[s] 0.063611 +Converged at iteration 31, L1 5.64872e-05, Linf 0.00504471, total time[s] 0.082575 +Converged at iteration 25, L1 8.86455e-05, Linf 0.00599464, total time[s] 0.072227 +Converged at iteration 20, L1 9.86251e-05, Linf 0.00391836, total time[s] 0.055908 +Converged at iteration 19, L1 6.21351e-05, Linf 0.0042677, total time[s] 0.054493 +Converged at iteration 20, L1 8.83337e-05, Linf 0.00609333, total time[s] 0.056764 +Converged at iteration 24, L1 7.44799e-05, Linf 0.00422773, total time[s] 0.066387 +Converged at iteration 24, L1 7.88406e-05, Linf 0.00504048, total time[s] 0.064846 +Converged at iteration 20, L1 6.25912e-05, Linf 0.00517327, total time[s] 0.057254 +Converged at iteration 16, L1 9.79185e-05, Linf 0.00481568, total time[s] 0.046709 +Converged at iteration 32, L1 6.85945e-05, Linf 0.00259765, total time[s] 0.086545 +Converged at iteration 19, L1 9.38493e-05, Linf 0.00688007, total time[s] 0.051123 +Converged at iteration 23, L1 7.72456e-05, Linf 0.00694739, total time[s] 0.066392 +Converged at iteration 26, L1 7.97459e-05, Linf 0.00592998, total time[s] 0.066948 +Converged at iteration 23, L1 5.68541e-05, Linf 0.00598694, total time[s] 0.0642 +Converged at iteration 20, L1 8.4204e-05, Linf 0.00551252, total time[s] 0.064162 +Converged at iteration 23, L1 6.52743e-05, Linf 0.00283524, total time[s] 0.062439 +Converged at iteration 25, L1 8.33841e-05, Linf 0.00404002, total time[s] 0.066385 +Converged at iteration 28, L1 7.76095e-05, Linf 0.00361934, total time[s] 0.077085 +Converged at iteration 29, L1 7.59439e-05, Linf 0.00618279, total time[s] 0.08092 +Converged at iteration 27, L1 7.5242e-05, Linf 0.00397593, total time[s] 0.070314 +Converged at iteration 29, L1 7.90773e-05, Linf 0.00386969, total time[s] 0.075269 +Converged at iteration 29, L1 9.26336e-05, Linf 0.00278042, total time[s] 0.075081 +Converged at iteration 28, L1 8.26757e-05, Linf 0.00260623, total time[s] 0.07792 +Converged at iteration 33, L1 5.84844e-05, Linf 0.00585117, total time[s] 0.09126 +Converged at iteration 27, L1 6.94129e-05, Linf 0.00353549, total time[s] 0.078421 +Converged at iteration 25, L1 7.12243e-05, Linf 0.00193434, total time[s] 0.067579 +Converged at iteration 23, L1 7.43124e-05, Linf 0.00313672, total time[s] 0.062279 +Converged at iteration 39, L1 7.19687e-05, Linf 0.00661174, total time[s] 0.119138 +Converged at iteration 36, L1 6.83158e-05, Linf 0.00545423, total time[s] 0.102185 +Converged at iteration 24, L1 7.33092e-05, Linf 0.0033703, total time[s] 0.063149 +Converged at iteration 30, L1 9.94493e-05, Linf 0.00615582, total time[s] 0.076273 +Converged at iteration 25, L1 9.26922e-05, Linf 0.00625715, total time[s] 0.065636 +Converged at iteration 21, L1 5.8871e-05, Linf 0.00343269, total time[s] 0.055752 +Converged at iteration 19, L1 6.05159e-05, Linf 0.00406339, total time[s] 0.051612 +Converged at iteration 20, L1 8.59477e-05, Linf 0.00644322, total time[s] 0.054493 +Converged at iteration 24, L1 7.18031e-05, Linf 0.00444895, total time[s] 0.075257 +Converged at iteration 24, L1 8.07923e-05, Linf 0.00520181, total time[s] 0.071242 +Converged at iteration 20, L1 6.49423e-05, Linf 0.00542765, total time[s] 0.053386 +Converged at iteration 16, L1 9.72562e-05, Linf 0.00508109, total time[s] 0.05157 +Converged at iteration 32, L1 6.7625e-05, Linf 0.00262169, total time[s] 0.09171 +Converged at iteration 19, L1 9.46136e-05, Linf 0.00674903, total time[s] 0.060175 +Converged at iteration 23, L1 7.68009e-05, Linf 0.00644449, total time[s] 0.083113 +Converged at iteration 26, L1 8.04349e-05, Linf 0.00589306, total time[s] 0.074779 +Converged at iteration 23, L1 5.65397e-05, Linf 0.00596663, total time[s] 0.065025 +Converged at iteration 20, L1 8.56425e-05, Linf 0.00551487, total time[s] 0.055204 +Converged at iteration 23, L1 6.74181e-05, Linf 0.00285585, total time[s] 0.061046 +Converged at iteration 25, L1 8.38903e-05, Linf 0.00411386, total time[s] 0.066657 +Converged at iteration 28, L1 7.76708e-05, Linf 0.00370932, total time[s] 0.07233 +Converged at iteration 29, L1 7.75658e-05, Linf 0.00624005, total time[s] 0.073776 +Converged at iteration 27, L1 7.70817e-05, Linf 0.00395078, total time[s] 0.074935 +Converged at iteration 29, L1 8.10777e-05, Linf 0.00392135, total time[s] 0.081844 +Converged at iteration 29, L1 9.33419e-05, Linf 0.00278233, total time[s] 0.074156 +Converged at iteration 28, L1 8.0705e-05, Linf 0.00253832, total time[s] 0.072288 +Converged at iteration 32, L1 9.89526e-05, Linf 0.00688694, total time[s] 0.095304 +Converged at iteration 27, L1 7.14034e-05, Linf 0.00365916, total time[s] 0.071039 +Converged at iteration 25, L1 7.22526e-05, Linf 0.00199003, total time[s] 0.06959 +Converged at iteration 23, L1 7.48964e-05, Linf 0.00312892, total time[s] 0.059988 +Converged at iteration 39, L1 7.01349e-05, Linf 0.00651484, total time[s] 0.100232 +Converged at iteration 36, L1 6.58958e-05, Linf 0.00550541, total time[s] 0.092685 +Converged at iteration 24, L1 7.25562e-05, Linf 0.00311234, total time[s] 0.062054 +Converged at iteration 30, L1 9.66342e-05, Linf 0.00612759, total time[s] 0.077794 +Converged at iteration 25, L1 9.82543e-05, Linf 0.00664099, total time[s] 0.074626 +Converged at iteration 21, L1 6.50618e-05, Linf 0.00333416, total time[s] 0.05699 +Converged at iteration 19, L1 5.88769e-05, Linf 0.00392043, total time[s] 0.064377 +Converged at iteration 20, L1 8.26918e-05, Linf 0.00613906, total time[s] 0.0543 +Converged at iteration 24, L1 6.86066e-05, Linf 0.00348769, total time[s] 0.063685 +Converged at iteration 24, L1 8.61261e-05, Linf 0.00540216, total time[s] 0.063207 +Converged at iteration 20, L1 7.00543e-05, Linf 0.00568457, total time[s] 0.054291 +Converged at iteration 16, L1 9.69774e-05, Linf 0.00540001, total time[s] 0.044661 +Converged at iteration 32, L1 6.60265e-05, Linf 0.00264307, total time[s] 0.095119 +Converged at iteration 19, L1 9.47399e-05, Linf 0.00658656, total time[s] 0.05239 +Converged at iteration 23, L1 7.64554e-05, Linf 0.00666413, total time[s] 0.068134 +Converged at iteration 26, L1 8.07687e-05, Linf 0.00585854, total time[s] 0.074752 +Converged at iteration 23, L1 5.60084e-05, Linf 0.00595394, total time[s] 0.060592 +Converged at iteration 20, L1 8.88442e-05, Linf 0.00552929, total time[s] 0.055472 +Converged at iteration 23, L1 6.93425e-05, Linf 0.00271905, total time[s] 0.059663 +Converged at iteration 25, L1 8.46418e-05, Linf 0.00378522, total time[s] 0.06568 +Converged at iteration 28, L1 7.89525e-05, Linf 0.0040048, total time[s] 0.071624 +Converged at iteration 29, L1 7.99369e-05, Linf 0.0063148, total time[s] 0.074681 +Converged at iteration 27, L1 7.97844e-05, Linf 0.00396623, total time[s] 0.070264 +Converged at iteration 29, L1 8.28926e-05, Linf 0.00399548, total time[s] 0.07372 +Converged at iteration 29, L1 9.43748e-05, Linf 0.00277521, total time[s] 0.075115 +Converged at iteration 28, L1 8.09492e-05, Linf 0.00247136, total time[s] 0.071295 +Converged at iteration 32, L1 9.60518e-05, Linf 0.00693138, total time[s] 0.087056 +Converged at iteration 27, L1 7.64477e-05, Linf 0.00407363, total time[s] 0.073435 +Converged at iteration 25, L1 6.96138e-05, Linf 0.00201642, total time[s] 0.066654 +Converged at iteration 23, L1 7.61167e-05, Linf 0.00297248, total time[s] 0.059808 +Converged at iteration 39, L1 6.71968e-05, Linf 0.00653191, total time[s] 0.100446 +Converged at iteration 36, L1 6.28834e-05, Linf 0.00554605, total time[s] 0.092227 +Converged at iteration 24, L1 7.26336e-05, Linf 0.00307217, total time[s] 0.061689 +Converged at iteration 30, L1 9.33294e-05, Linf 0.00605311, total time[s] 0.075855 +Converged at iteration 26, L1 5.93621e-05, Linf 0.00590353, total time[s] 0.066233 +Converged at iteration 21, L1 7.72334e-05, Linf 0.00342646, total time[s] 0.055623 +Converged at iteration 19, L1 5.80545e-05, Linf 0.00393807, total time[s] 0.05296 +Converged at iteration 20, L1 7.90138e-05, Linf 0.00637705, total time[s] 0.053314 +Converged at iteration 24, L1 6.48871e-05, Linf 0.00397835, total time[s] 0.062022 +Converged at iteration 24, L1 8.95329e-05, Linf 0.00566474, total time[s] 0.062288 +Converged at iteration 20, L1 7.51141e-05, Linf 0.00575421, total time[s] 0.054075 +Converged at iteration 16, L1 9.63978e-05, Linf 0.00593733, total time[s] 0.042093 +Converged at iteration 32, L1 6.32327e-05, Linf 0.00266603, total time[s] 0.082685 +Converged at iteration 19, L1 9.41475e-05, Linf 0.00641677, total time[s] 0.052028 +Converged at iteration 23, L1 7.5459e-05, Linf 0.00680072, total time[s] 0.080254 +Converged at iteration 26, L1 8.21505e-05, Linf 0.00583022, total time[s] 0.066549 +Converged at iteration 23, L1 5.55062e-05, Linf 0.0060198, total time[s] 0.05885 +Converged at iteration 20, L1 9.44589e-05, Linf 0.00552071, total time[s] 0.054884 +Converged at iteration 23, L1 7.15674e-05, Linf 0.00261853, total time[s] 0.060624 +Converged at iteration 25, L1 8.56785e-05, Linf 0.00366397, total time[s] 0.064695 +Converged at iteration 28, L1 8.01037e-05, Linf 0.00425233, total time[s] 0.071983 +Converged at iteration 29, L1 8.30969e-05, Linf 0.00636496, total time[s] 0.073348 +Converged at iteration 27, L1 8.35567e-05, Linf 0.00389547, total time[s] 0.076011 +Converged at iteration 29, L1 8.55691e-05, Linf 0.00409311, total time[s] 0.080051 +Converged at iteration 29, L1 9.43383e-05, Linf 0.0027679, total time[s] 0.074145 +Converged at iteration 28, L1 8.11851e-05, Linf 0.00240311, total time[s] 0.070088 +Converged at iteration 32, L1 9.2268e-05, Linf 0.00687315, total time[s] 0.077589 +Converged at iteration 27, L1 8.20517e-05, Linf 0.00450225, total time[s] 0.071907 +Converged at iteration 24, L1 9.85298e-05, Linf 0.00261732, total time[s] 0.060379 +Converged at iteration 23, L1 7.79268e-05, Linf 0.0028837, total time[s] 0.057843 +Converged at iteration 39, L1 6.35624e-05, Linf 0.00640125, total time[s] 0.096568 +Converged at iteration 36, L1 5.56728e-05, Linf 0.00552125, total time[s] 0.091636 +Converged at iteration 24, L1 7.57796e-05, Linf 0.0028936, total time[s] 0.059589 +Converged at iteration 30, L1 8.48525e-05, Linf 0.0059435, total time[s] 0.074495 +Converged at iteration 26, L1 6.4692e-05, Linf 0.00647122, total time[s] 0.06443 +Converged at iteration 21, L1 9.38725e-05, Linf 0.00454324, total time[s] 0.052459 +Converged at iteration 19, L1 5.76025e-05, Linf 0.00390968, total time[s] 0.048585 +Converged at iteration 20, L1 7.44559e-05, Linf 0.00607898, total time[s] 0.060868 +Converged at iteration 24, L1 5.9117e-05, Linf 0.00330255, total time[s] 0.073007 +Converged at iteration 24, L1 9.47415e-05, Linf 0.00604524, total time[s] 0.060552 +Converged at iteration 20, L1 8.33043e-05, Linf 0.00597019, total time[s] 0.051347 +Converged at iteration 16, L1 9.57955e-05, Linf 0.00635683, total time[s] 0.04304 +Converged at iteration 32, L1 5.84239e-05, Linf 0.00269234, total time[s] 0.078774 +Converged at iteration 19, L1 9.26959e-05, Linf 0.00618172, total time[s] 0.049023 +Converged at iteration 23, L1 7.09032e-05, Linf 0.00615066, total time[s] 0.058142 +Converged at iteration 26, L1 8.5104e-05, Linf 0.00822177, total time[s] 0.064698 +Converged at iteration 23, L1 5.56883e-05, Linf 0.00601611, total time[s] 0.058932 +Converged at iteration 21, L1 5.53003e-05, Linf 0.00470532, total time[s] 0.053852 +Converged at iteration 23, L1 7.29401e-05, Linf 0.00247696, total time[s] 0.061523 +Converged at iteration 25, L1 8.5929e-05, Linf 0.00345976, total time[s] 0.062744 +Converged at iteration 28, L1 8.19154e-05, Linf 0.00602314, total time[s] 0.071158 +Converged at iteration 29, L1 8.69516e-05, Linf 0.00646719, total time[s] 0.072991 +Converged at iteration 27, L1 8.71759e-05, Linf 0.0038515, total time[s] 0.070348 +Converged at iteration 29, L1 8.69054e-05, Linf 0.00417591, total time[s] 0.073754 +Converged at iteration 29, L1 9.3625e-05, Linf 0.00279743, total time[s] 0.074424 +Converged at iteration 28, L1 7.95129e-05, Linf 0.00233042, total time[s] 0.070538 +Converged at iteration 32, L1 8.39816e-05, Linf 0.00672598, total time[s] 0.087563 +Converged at iteration 27, L1 8.85973e-05, Linf 0.00514521, total time[s] 0.069407 +Converged at iteration 25, L1 6.32351e-05, Linf 0.00197844, total time[s] 0.064527 +Converged at iteration 23, L1 7.99869e-05, Linf 0.00267073, total time[s] 0.066888 +Converged at iteration 38, L1 6.51817e-05, Linf 0.00617689, total time[s] 0.109289 +Converged at iteration 34, L1 8.76453e-05, Linf 0.00672954, total time[s] 0.085283 +Converged at iteration 25, L1 5.08377e-05, Linf 0.00196859, total time[s] 0.064314 +Converged at iteration 29, L1 7.72397e-05, Linf 0.00674322, total time[s] 0.073537 +Converged at iteration 26, L1 8.10526e-05, Linf 0.00961, total time[s] 0.065913 +Converged at iteration 23, L1 8.43883e-05, Linf 0.00767888, total time[s] 0.060089 +Converged at iteration 19, L1 6.67846e-05, Linf 0.00336191, total time[s] 0.052713 +Converged at iteration 20, L1 5.96148e-05, Linf 0.0034, total time[s] 0.05274 +Converged at iteration 23, L1 7.64592e-05, Linf 0.0038005, total time[s] 0.060079 +Converged at iteration 25, L1 6.78638e-05, Linf 0.00657853, total time[s] 0.064379 +Converged at iteration 21, L1 5.48156e-05, Linf 0.00549036, total time[s] 0.054809 +Converged at iteration 17, L1 7.93535e-05, Linf 0.00614385, total time[s] 0.046785 +Converged at iteration 31, L1 8.22609e-05, Linf 0.00341583, total time[s] 0.082859 +Converged at iteration 18, L1 9.0053e-05, Linf 0.00594271, total time[s] 0.048767 +Converged at iteration 21, L1 9.27895e-05, Linf 0.00491676, total time[s] 0.064613 +Converged at iteration 26, L1 9.60323e-05, Linf 0.00449686, total time[s] 0.078072 +Converged at iteration 23, L1 6.08667e-05, Linf 0.00558529, total time[s] 0.061083 +Converged at iteration 21, L1 8.39086e-05, Linf 0.00395889, total time[s] 0.055749 +Converged at iteration 22, L1 9.18837e-05, Linf 0.00243727, total time[s] 0.057974 +Converged at iteration 25, L1 7.07409e-05, Linf 0.00220805, total time[s] 0.066513 +Converged at iteration 28, L1 7.87688e-05, Linf 0.00496833, total time[s] 0.074798 +Converged at iteration 30, L1 5.38367e-05, Linf 0.00377845, total time[s] 0.079326 +Converged at iteration 27, L1 9.87244e-05, Linf 0.00550473, total time[s] 0.072183 +Converged at iteration 30, L1 6.65726e-05, Linf 0.00403636, total time[s] 0.08741 +Converged at iteration 29, L1 9.28827e-05, Linf 0.00285837, total time[s] 0.081254 +Converged at iteration 28, L1 9.38865e-05, Linf 0.00206902, total time[s] 0.079685 +Converged at iteration 31, L1 6.63721e-05, Linf 0.00680682, total time[s] 0.089432 +Converged at iteration 28, L1 6.17274e-05, Linf 0.00728603, total time[s] 0.07707 +Converged at iteration 26, L1 6.61048e-05, Linf 0.00446247, total time[s] 0.072883 +Converged at iteration 24, L1 6.73591e-05, Linf 0.00224077, total time[s] 0.064913 +Converged at iteration 36, L1 9.92886e-05, Linf 0.00698433, total time[s] 0.104286 +Converged at iteration 33, L1 8.84847e-05, Linf 0.00639445, total time[s] 0.087502 +Converged at iteration 25, L1 6.61213e-05, Linf 0.00206729, total time[s] 0.067045 +Converged at iteration 28, L1 7.63425e-05, Linf 0.00767963, total time[s] 0.074645 +Converged at iteration 27, L1 4.43915e-05, Linf 0.0100654, total time[s] 0.072022 +Converged at iteration 24, L1 8.93957e-05, Linf 0.0112718, total time[s] 0.065689 +Converged at iteration 19, L1 8.52649e-05, Linf 0.00368495, total time[s] 0.055693 +Converged at iteration 19, L1 8.45295e-05, Linf 0.00452207, total time[s] 0.051897 +Converged at iteration 23, L1 7.36468e-05, Linf 0.00312398, total time[s] 0.066128 +Converged at iteration 25, L1 8.94068e-05, Linf 0.00833871, total time[s] 0.066468 +Converged at iteration 21, L1 7.14203e-05, Linf 0.00575171, total time[s] 0.057661 +Converged at iteration 18, L1 6.4474e-05, Linf 0.00496046, total time[s] 0.050642 +Converged at iteration 31, L1 7.28403e-05, Linf 0.00424451, total time[s] 0.082732 +Converged at iteration 17, L1 6.28333e-05, Linf 0.00491964, total time[s] 0.049675 +Converged at iteration 20, L1 9.14775e-05, Linf 0.00279217, total time[s] 0.058412 +Converged at iteration 27, L1 7.56042e-05, Linf 0.00270086, total time[s] 0.072219 +Converged at iteration 23, L1 8.77426e-05, Linf 0.00614975, total time[s] 0.062329 +Converged at iteration 22, L1 6.41831e-05, Linf 0.00373039, total time[s] 0.060249 +Converged at iteration 23, L1 7.00016e-05, Linf 0.00266996, total time[s] 0.06232 +Converged at iteration 23, L1 8.82527e-05, Linf 0.00237089, total time[s] 0.063912 +Converged at iteration 28, L1 7.51447e-05, Linf 0.00472484, total time[s] 0.078936 +Converged at iteration 30, L1 7.73662e-05, Linf 0.00407987, total time[s] 0.079592 +Converged at iteration 28, L1 5.93686e-05, Linf 0.0023176, total time[s] 0.073391 +Converged at iteration 30, L1 9.84467e-05, Linf 0.00524345, total time[s] 0.079059 +Converged at iteration 29, L1 9.85664e-05, Linf 0.00291239, total time[s] 0.076171 +Converged at iteration 29, L1 8.01997e-05, Linf 0.00131938, total time[s] 0.076922 +Converged at iteration 29, L1 8.58929e-05, Linf 0.0101134, total time[s] 0.075905 +Converged at iteration 28, L1 8.28891e-05, Linf 0.0114162, total time[s] 0.073051 +Converged at iteration 27, L1 7.21402e-05, Linf 0.0070515, total time[s] 0.0713 +Converged at iteration 24, L1 9.76729e-05, Linf 0.00279099, total time[s] 0.06465 +Converged at iteration 36, L1 7.59113e-05, Linf 0.00593709, total time[s] 0.094379 +Converged at iteration 33, L1 7.56411e-05, Linf 0.00576075, total time[s] 0.090572 +Converged at iteration 25, L1 6.97162e-05, Linf 0.00220774, total time[s] 0.066956 +Converged at iteration 27, L1 9.6059e-05, Linf 0.0100392, total time[s] 0.095976 +Converged at iteration 27, L1 4.78927e-05, Linf 0.0118964, total time[s] 0.074883 +Converged at iteration 25, L1 4.7008e-05, Linf 0.0109882, total time[s] 0.089035 +Converged at iteration 19, L1 9.21416e-05, Linf 0.00406893, total time[s] 0.069473 +Converged at iteration 19, L1 7.90902e-05, Linf 0.00424469, total time[s] 0.073974 +Converged at iteration 23, L1 7.16088e-05, Linf 0.00284367, total time[s] 0.066991 +Converged at iteration 25, L1 8.37562e-05, Linf 0.00947252, total time[s] 0.104314 +Converged at iteration 21, L1 8.1188e-05, Linf 0.00583829, total time[s] 0.070101 +Converged at iteration 18, L1 7.64762e-05, Linf 0.00541802, total time[s] 0.055373 +Converged at iteration 31, L1 6.49577e-05, Linf 0.00472005, total time[s] 0.100399 +Converged at iteration 18, L1 9.78848e-05, Linf 0.00224943, total time[s] 0.069836 +Converged at iteration 22, L1 9.42157e-05, Linf 0.00542124, total time[s] 0.063701 +Converged at iteration 27, L1 8.44001e-05, Linf 0.00308389, total time[s] 0.083534 +Converged at iteration 24, L1 5.28459e-05, Linf 0.00324824, total time[s] 0.076204 +Converged at iteration 22, L1 7.80324e-05, Linf 0.0042706, total time[s] 0.062905 +Converged at iteration 24, L1 5.87868e-05, Linf 0.00325018, total time[s] 0.066492 +Converged at iteration 23, L1 9.55677e-05, Linf 0.00524252, total time[s] 0.06579 +Converged at iteration 28, L1 7.21811e-05, Linf 0.00440463, total time[s] 0.090275 +Converged at iteration 30, L1 9.52185e-05, Linf 0.00479955, total time[s] 0.077884 +Converged at iteration 28, L1 5.9718e-05, Linf 0.00232, total time[s] 0.074385 +Converged at iteration 31, L1 7.14942e-05, Linf 0.00467252, total time[s] 0.084765 +Converged at iteration 30, L1 7.07727e-05, Linf 0.00241872, total time[s] 0.077985 +Converged at iteration 30, L1 5.99735e-05, Linf 0.00123908, total time[s] 0.077212 +Converged at iteration 29, L1 4.81292e-05, Linf 0.00882552, total time[s] 0.075387 +Converged at iteration 28, L1 9.36256e-05, Linf 0.014037, total time[s] 0.072857 +Converged at iteration 27, L1 9.66161e-05, Linf 0.00931613, total time[s] 0.070192 +Converged at iteration 25, L1 6.38153e-05, Linf 0.00195074, total time[s] 0.065697 +Converged at iteration 34, L1 7.82785e-05, Linf 0.00497749, total time[s] 0.093299 +Converged at iteration 32, L1 6.60196e-05, Linf 0.00512936, total time[s] 0.101577 +Converged at iteration 26, L1 9.81421e-05, Linf 0.00463578, total time[s] 0.070854 +Converged at iteration 27, L1 6.79396e-05, Linf 0.00259757, total time[s] 0.070225 +Converged at iteration 27, L1 5.90243e-05, Linf 0.0236599, total time[s] 0.070629 +Converged at iteration 26, L1 3.36638e-05, Linf 0.0198755, total time[s] 0.070362 +Converged at iteration 21, L1 6.33244e-05, Linf 0.00652642, total time[s] 0.063303 +Converged at iteration 22, L1 6.07606e-05, Linf 0.00443633, total time[s] 0.073759 +Converged at iteration 24, L1 5.36665e-05, Linf 0.00683862, total time[s] 0.084174 +Converged at iteration 26, L1 5.8395e-05, Linf 0.0107846, total time[s] 0.080025 +Converged at iteration 21, L1 9.28977e-05, Linf 0.00790641, total time[s] 0.059788 +Converged at iteration 19, L1 7.73605e-05, Linf 0.00715038, total time[s] 0.05332 +Converged at iteration 31, L1 4.89313e-05, Linf 0.0100966, total time[s] 0.078922 +Converged at iteration 22, L1 7.9961e-05, Linf 0.00961038, total time[s] 0.060301 +Converged at iteration 25, L1 8.55151e-05, Linf 0.0163997, total time[s] 0.065349 +Converged at iteration 26, L1 9.79685e-05, Linf 0.00473735, total time[s] 0.075944 +Converged at iteration 25, L1 9.70423e-05, Linf 0.00356729, total time[s] 0.071608 +Converged at iteration 25, L1 5.69825e-05, Linf 0.00415492, total time[s] 0.075328 +Converged at iteration 26, L1 6.95797e-05, Linf 0.00854871, total time[s] 0.076468 +Converged at iteration 27, L1 5.48687e-05, Linf 0.0101433, total time[s] 0.074683 +Converged at iteration 27, L1 8.96559e-05, Linf 0.00460403, total time[s] 0.091084 +Converged at iteration 32, L1 9.42352e-05, Linf 0.0066802, total time[s] 0.138121 +Converged at iteration 28, L1 7.96227e-05, Linf 0.00299838, total time[s] 0.107126 +Converged at iteration 32, L1 7.96506e-05, Linf 0.00958587, total time[s] 0.134554 +Converged at iteration 32, L1 9.35817e-05, Linf 0.00544671, total time[s] 0.116676 +Converged at iteration 33, L1 8.55787e-05, Linf 0.00383539, total time[s] 0.119093 +Converged at iteration 29, L1 7.66808e-05, Linf 0.00446936, total time[s] 0.085613 +Converged at iteration 29, L1 4.48086e-05, Linf 0.0199345, total time[s] 0.075779 +Converged at iteration 29, L1 2.88421e-05, Linf 0.0115831, total time[s] 0.075341 +Converged at iteration 26, L1 8.20213e-05, Linf 0.00375942, total time[s] 0.069272 +Converged at iteration 35, L1 6.03069e-05, Linf 0.00480688, total time[s] 0.092273 +Converged at iteration 32, L1 8.1915e-05, Linf 0.00541768, total time[s] 0.088083 +Converged at iteration 26, L1 5.38755e-05, Linf 0.00258661, total time[s] 0.078736 +Converged at iteration 26, L1 9.41428e-05, Linf 0.00700283, total time[s] 0.070469 +Converged at iteration 27, L1 5.98092e-05, Linf 0.0211835, total time[s] 0.075505 +Converged at iteration 26, L1 3.02415e-05, Linf 0.0152118, total time[s] 0.06948 +Converged at iteration 21, L1 3.69097e-05, Linf 0.00449006, total time[s] 0.072756 +Converged at iteration 21, L1 7.41114e-05, Linf 0.00445733, total time[s] 0.079528 +Converged at iteration 23, L1 7.95216e-05, Linf 0.00398642, total time[s] 0.088237 +Converged at iteration 26, L1 4.89149e-05, Linf 0.00546882, total time[s] 0.091666 +Converged at iteration 21, L1 8.58229e-05, Linf 0.00815331, total time[s] 0.07427 +Converged at iteration 19, L1 6.33453e-05, Linf 0.00710331, total time[s] 0.075937 +Converged at iteration 31, L1 5.98705e-05, Linf 0.00847494, total time[s] 0.115499 +Converged at iteration 22, L1 6.42129e-05, Linf 0.00783081, total time[s] 0.063749 +Converged at iteration 25, L1 5.26577e-05, Linf 0.0112906, total time[s] 0.06509 +Converged at iteration 27, L1 5.68001e-05, Linf 0.00300114, total time[s] 0.070551 +Converged at iteration 24, L1 8.54067e-05, Linf 0.00360238, total time[s] 0.067387 +Converged at iteration 24, L1 6.0012e-05, Linf 0.00432341, total time[s] 0.06512 +Converged at iteration 25, L1 9.91962e-05, Linf 0.00928016, total time[s] 0.064875 +Converged at iteration 26, L1 7.43018e-05, Linf 0.0117774, total time[s] 0.067217 +Converged at iteration 27, L1 9.80177e-05, Linf 0.00415772, total time[s] 0.071321 +Converged at iteration 32, L1 6.1015e-05, Linf 0.00342856, total time[s] 0.080366 +Converged at iteration 28, L1 7.76193e-05, Linf 0.00302095, total time[s] 0.070432 +Converged at iteration 32, L1 7.38023e-05, Linf 0.00680872, total time[s] 0.088372 +Converged at iteration 31, L1 9.56978e-05, Linf 0.00364438, total time[s] 0.081734 +Converged at iteration 32, L1 8.10168e-05, Linf 0.00213793, total time[s] 0.084359 +Converged at iteration 28, L1 8.55357e-05, Linf 0.00257072, total time[s] 0.087364 +Converged at iteration 29, L1 4.76951e-05, Linf 0.0182661, total time[s] 0.084371 +Converged at iteration 28, L1 9.19359e-05, Linf 0.0185064, total time[s] 0.087155 +Converged at iteration 26, L1 6.03021e-05, Linf 0.00324026, total time[s] 0.077612 +Converged at iteration 35, L1 7.68994e-05, Linf 0.0056166, total time[s] 0.100648 +Converged at iteration 32, L1 9.93538e-05, Linf 0.00539408, total time[s] 0.107651 +Converged at iteration 25, L1 8.05565e-05, Linf 0.00330283, total time[s] 0.068754 +Converged at iteration 26, L1 8.81232e-05, Linf 0.0123587, total time[s] 0.066289 +Converged at iteration 27, L1 5.69748e-05, Linf 0.0178313, total time[s] 0.068578 +Converged at iteration 25, L1 7.84347e-05, Linf 0.0196222, total time[s] 0.067222 +Converged at iteration 20, L1 7.60086e-05, Linf 0.00535189, total time[s] 0.069101 +Converged at iteration 20, L1 9.42082e-05, Linf 0.00405375, total time[s] 0.074644 +Converged at iteration 23, L1 8.04276e-05, Linf 0.00255393, total time[s] 0.086897 +Converged at iteration 25, L1 6.53554e-05, Linf 0.011071, total time[s] 0.0831 +Converged at iteration 21, L1 9.05239e-05, Linf 0.00713572, total time[s] 0.062992 +Converged at iteration 19, L1 5.35504e-05, Linf 0.00603177, total time[s] 0.062475 +Converged at iteration 31, L1 5.82699e-05, Linf 0.00682661, total time[s] 0.106376 +Converged at iteration 21, L1 7.73074e-05, Linf 0.00733959, total time[s] 0.061184 +Converged at iteration 24, L1 7.22849e-05, Linf 0.00833762, total time[s] 0.070567 +Converged at iteration 27, L1 8.04167e-05, Linf 0.00305355, total time[s] 0.069729 +Converged at iteration 24, L1 7.44599e-05, Linf 0.00485922, total time[s] 0.063844 +Converged at iteration 23, L1 7.47913e-05, Linf 0.00441657, total time[s] 0.060516 +Converged at iteration 25, L1 6.69662e-05, Linf 0.00619081, total time[s] 0.066781 +Converged at iteration 25, L1 9.19531e-05, Linf 0.0105138, total time[s] 0.065984 +Converged at iteration 28, L1 6.71626e-05, Linf 0.00390698, total time[s] 0.072307 +Converged at iteration 31, L1 8.3838e-05, Linf 0.00349075, total time[s] 0.080757 +Converged at iteration 28, L1 7.00106e-05, Linf 0.00277574, total time[s] 0.073871 +Converged at iteration 32, L1 6.42843e-05, Linf 0.00490683, total time[s] 0.082225 +Converged at iteration 31, L1 6.55913e-05, Linf 0.00240829, total time[s] 0.079602 +Converged at iteration 31, L1 8.58446e-05, Linf 0.00209604, total time[s] 0.082382 +Converged at iteration 27, L1 9.01227e-05, Linf 0.0194699, total time[s] 0.070472 +Converged at iteration 29, L1 4.45748e-05, Linf 0.0142165, total time[s] 0.074598 +Converged at iteration 28, L1 7.71933e-05, Linf 0.0130621, total time[s] 0.074681 +Converged at iteration 25, L1 9.37744e-05, Linf 0.00365936, total time[s] 0.065184 +Converged at iteration 35, L1 9.49794e-05, Linf 0.00628548, total time[s] 0.089994 +Converged at iteration 33, L1 5.7819e-05, Linf 0.00486289, total time[s] 0.100558 +Converged at iteration 25, L1 7.3274e-05, Linf 0.0027043, total time[s] 0.109117 +Converged at iteration 27, L1 5.19285e-05, Linf 0.00903119, total time[s] 0.073515 +Converged at iteration 27, L1 5.69123e-05, Linf 0.0151669, total time[s] 0.070934 +Converged at iteration 25, L1 6.57301e-05, Linf 0.0158329, total time[s] 0.065996 +Converged at iteration 20, L1 5.65357e-05, Linf 0.00424705, total time[s] 0.05649 +Converged at iteration 20, L1 6.28767e-05, Linf 0.00234601, total time[s] 0.079365 +Converged at iteration 23, L1 7.96079e-05, Linf 0.00239749, total time[s] 0.068677 +Converged at iteration 25, L1 5.53934e-05, Linf 0.0109523, total time[s] 0.06956 +Converged at iteration 21, L1 9.02293e-05, Linf 0.00637143, total time[s] 0.072959 +Converged at iteration 19, L1 4.99702e-05, Linf 0.00594212, total time[s] 0.056568 +Converged at iteration 31, L1 5.92788e-05, Linf 0.00580422, total time[s] 0.107244 +Converged at iteration 20, L1 9.25639e-05, Linf 0.00557356, total time[s] 0.056358 +Converged at iteration 23, L1 9.56365e-05, Linf 0.0087547, total time[s] 0.061628 +Converged at iteration 27, L1 8.6162e-05, Linf 0.00330707, total time[s] 0.071011 +Converged at iteration 24, L1 6.70814e-05, Linf 0.00394658, total time[s] 0.064629 +Converged at iteration 23, L1 5.72195e-05, Linf 0.00329439, total time[s] 0.06286 +Converged at iteration 24, L1 9.98791e-05, Linf 0.00647467, total time[s] 0.063898 +Converged at iteration 25, L1 5.95888e-05, Linf 0.00671217, total time[s] 0.066797 +Converged at iteration 28, L1 6.84997e-05, Linf 0.00405483, total time[s] 0.07937 +Converged at iteration 31, L1 7.07909e-05, Linf 0.00346042, total time[s] 0.099669 +Converged at iteration 28, L1 6.4614e-05, Linf 0.00251526, total time[s] 0.088729 +Converged at iteration 32, L1 5.72811e-05, Linf 0.00402445, total time[s] 0.103632 +Converged at iteration 30, L1 8.90699e-05, Linf 0.00271569, total time[s] 0.117339 +Converged at iteration 31, L1 5.71374e-05, Linf 0.00127316, total time[s] 0.101549 +Converged at iteration 28, L1 4.16399e-05, Linf 0.0113974, total time[s] 0.096541 +Converged at iteration 29, L1 4.12578e-05, Linf 0.0119365, total time[s] 0.09086 +Converged at iteration 28, L1 6.43789e-05, Linf 0.0102157, total time[s] 0.081194 +Converged at iteration 25, L1 8.04596e-05, Linf 0.00236459, total time[s] 0.076619 +Converged at iteration 35, L1 9.68415e-05, Linf 0.00635117, total time[s] 0.103334 +Converged at iteration 33, L1 5.91649e-05, Linf 0.00490782, total time[s] 0.100222 +Converged at iteration 25, L1 7.19942e-05, Linf 0.00253747, total time[s] 0.073444 +Converged at iteration 27, L1 5.13363e-05, Linf 0.00913008, total time[s] 0.071975 +Converged at iteration 27, L1 5.48727e-05, Linf 0.0150946, total time[s] 0.071788 +Converged at iteration 25, L1 6.37749e-05, Linf 0.0155625, total time[s] 0.066042 +Converged at iteration 20, L1 5.44772e-05, Linf 0.00417894, total time[s] 0.065463 +Converged at iteration 20, L1 6.05161e-05, Linf 0.00221435, total time[s] 0.073204 +Converged at iteration 23, L1 7.99554e-05, Linf 0.00241898, total time[s] 0.067992 +Converged at iteration 25, L1 5.68584e-05, Linf 0.0108529, total time[s] 0.08235 +Converged at iteration 21, L1 9.05092e-05, Linf 0.00644855, total time[s] 0.088962 +Converged at iteration 18, L1 9.95551e-05, Linf 0.00849237, total time[s] 0.084005 +Converged at iteration 31, L1 5.9604e-05, Linf 0.00570431, total time[s] 0.11449 +Converged at iteration 20, L1 8.98998e-05, Linf 0.0053071, total time[s] 0.058817 +Converged at iteration 23, L1 9.49645e-05, Linf 0.00855457, total time[s] 0.063155 +Converged at iteration 27, L1 8.74464e-05, Linf 0.00330157, total time[s] 0.079336 +Converged at iteration 24, L1 6.78261e-05, Linf 0.00393171, total time[s] 0.092037 +Converged at iteration 23, L1 5.64222e-05, Linf 0.00321898, total time[s] 0.070025 +Converged at iteration 24, L1 9.5134e-05, Linf 0.00627913, total time[s] 0.069044 +Converged at iteration 25, L1 5.80319e-05, Linf 0.00639532, total time[s] 0.070281 +Converged at iteration 28, L1 6.89469e-05, Linf 0.00406787, total time[s] 0.070853 +Converged at iteration 31, L1 6.99673e-05, Linf 0.00335507, total time[s] 0.078352 +Converged at iteration 28, L1 6.47742e-05, Linf 0.0025326, total time[s] 0.073229 +Converged at iteration 31, L1 9.9021e-05, Linf 0.00594459, total time[s] 0.079951 +Converged at iteration 30, L1 8.71413e-05, Linf 0.00267126, total time[s] 0.076152 +Converged at iteration 30, L1 9.75415e-05, Linf 0.00198105, total time[s] 0.078275 +Converged at iteration 28, L1 4.27874e-05, Linf 0.0117154, total time[s] 0.070966 +Converged at iteration 29, L1 4.09029e-05, Linf 0.0117624, total time[s] 0.080031 +Converged at iteration 28, L1 6.28553e-05, Linf 0.00997699, total time[s] 0.076861 +Converged at iteration 25, L1 7.86709e-05, Linf 0.00239895, total time[s] 0.074312 +Converged at iteration 35, L1 9.92819e-05, Linf 0.00642328, total time[s] 0.09915 +Converged at iteration 33, L1 6.06675e-05, Linf 0.00497288, total time[s] 0.099821 +Converged at iteration 25, L1 7.27899e-05, Linf 0.00261474, total time[s] 0.068065 +Converged at iteration 27, L1 5.57845e-05, Linf 0.009223, total time[s] 0.068483 +Converged at iteration 27, L1 5.32763e-05, Linf 0.0148665, total time[s] 0.070575 +Converged at iteration 25, L1 6.28849e-05, Linf 0.0152237, total time[s] 0.07406 +Converged at iteration 20, L1 5.39021e-05, Linf 0.00409238, total time[s] 0.068355 +Converged at iteration 20, L1 5.83141e-05, Linf 0.00208059, total time[s] 0.055041 +Converged at iteration 23, L1 7.95608e-05, Linf 0.00244851, total time[s] 0.059354 +Converged at iteration 25, L1 5.9994e-05, Linf 0.0107892, total time[s] 0.064661 +Converged at iteration 21, L1 9.05827e-05, Linf 0.0062618, total time[s] 0.058865 +Converged at iteration 18, L1 9.69633e-05, Linf 0.00774572, total time[s] 0.05211 +Converged at iteration 31, L1 5.95937e-05, Linf 0.00563199, total time[s] 0.096343 +Converged at iteration 20, L1 8.61354e-05, Linf 0.00504032, total time[s] 0.057982 +Converged at iteration 23, L1 9.19252e-05, Linf 0.00832412, total time[s] 0.068047 +Converged at iteration 27, L1 8.6712e-05, Linf 0.00330224, total time[s] 0.078857 +Converged at iteration 24, L1 6.61922e-05, Linf 0.00388149, total time[s] 0.062963 +Converged at iteration 23, L1 5.46761e-05, Linf 0.00317478, total time[s] 0.062895 +Converged at iteration 24, L1 9.11115e-05, Linf 0.00617775, total time[s] 0.062067 +Converged at iteration 25, L1 5.45543e-05, Linf 0.00609889, total time[s] 0.064541 +Converged at iteration 28, L1 6.98968e-05, Linf 0.00408719, total time[s] 0.073277 +Converged at iteration 31, L1 6.76428e-05, Linf 0.00312457, total time[s] 0.077232 +Converged at iteration 28, L1 6.4107e-05, Linf 0.00255634, total time[s] 0.076365 +Converged at iteration 31, L1 9.6465e-05, Linf 0.00583086, total time[s] 0.091664 +Converged at iteration 30, L1 8.58219e-05, Linf 0.00265466, total time[s] 0.087754 +Converged at iteration 30, L1 9.40042e-05, Linf 0.00187301, total time[s] 0.079449 +Converged at iteration 28, L1 4.43564e-05, Linf 0.0120123, total time[s] 0.077479 +Converged at iteration 29, L1 4.0157e-05, Linf 0.0115923, total time[s] 0.084374 +Converged at iteration 28, L1 6.32282e-05, Linf 0.00964155, total time[s] 0.079884 +Converged at iteration 25, L1 7.70184e-05, Linf 0.00242248, total time[s] 0.071161 +Converged at iteration 36, L1 5.9175e-05, Linf 0.00510439, total time[s] 0.10182 +Converged at iteration 33, L1 6.27336e-05, Linf 0.00507608, total time[s] 0.086831 +Converged at iteration 25, L1 7.08545e-05, Linf 0.00251792, total time[s] 0.071806 +Converged at iteration 27, L1 5.90462e-05, Linf 0.00940693, total time[s] 0.072746 +Converged at iteration 27, L1 5.32479e-05, Linf 0.0143252, total time[s] 0.072113 +Converged at iteration 25, L1 5.97446e-05, Linf 0.014443, total time[s] 0.065165 +Converged at iteration 20, L1 4.99686e-05, Linf 0.00394096, total time[s] 0.052666 +Converged at iteration 20, L1 5.26851e-05, Linf 0.00201763, total time[s] 0.052635 +Converged at iteration 23, L1 7.73063e-05, Linf 0.0025081, total time[s] 0.059964 +Converged at iteration 25, L1 6.43497e-05, Linf 0.0106219, total time[s] 0.065241 +Converged at iteration 21, L1 8.93442e-05, Linf 0.00616248, total time[s] 0.055871 +Converged at iteration 18, L1 9.25302e-05, Linf 0.00674698, total time[s] 0.054191 +Converged at iteration 31, L1 5.98472e-05, Linf 0.00544887, total time[s] 0.090406 +Converged at iteration 20, L1 7.8886e-05, Linf 0.004484, total time[s] 0.054639 +Converged at iteration 23, L1 8.71555e-05, Linf 0.00784212, total time[s] 0.060732 +Converged at iteration 27, L1 8.77032e-05, Linf 0.00328336, total time[s] 0.073183 +Converged at iteration 24, L1 6.43546e-05, Linf 0.00384753, total time[s] 0.061756 +Converged at iteration 22, L1 9.93226e-05, Linf 0.00533931, total time[s] 0.057846 +Converged at iteration 24, L1 8.37867e-05, Linf 0.00609602, total time[s] 0.063397 +Converged at iteration 24, L1 9.17687e-05, Linf 0.00773126, total time[s] 0.06503 +Converged at iteration 28, L1 6.99498e-05, Linf 0.00414226, total time[s] 0.082118 +Converged at iteration 31, L1 6.53777e-05, Linf 0.00333535, total time[s] 0.085071 +Converged at iteration 28, L1 6.2309e-05, Linf 0.00261069, total time[s] 0.08437 +Converged at iteration 31, L1 9.19155e-05, Linf 0.00560924, total time[s] 0.089241 +Converged at iteration 30, L1 8.33024e-05, Linf 0.00275764, total time[s] 0.092357 +Converged at iteration 30, L1 8.64021e-05, Linf 0.00167584, total time[s] 0.080361 +Converged at iteration 28, L1 4.95593e-05, Linf 0.012524, total time[s] 0.074281 +Converged at iteration 29, L1 3.8805e-05, Linf 0.0112534, total time[s] 0.077898 +Converged at iteration 28, L1 5.92776e-05, Linf 0.00925894, total time[s] 0.079022 +Converged at iteration 25, L1 7.63716e-05, Linf 0.00246668, total time[s] 0.074873 +Converged at iteration 36, L1 6.4965e-05, Linf 0.00535505, total time[s] 0.096031 +Converged at iteration 33, L1 6.80217e-05, Linf 0.00534628, total time[s] 0.091149 +Converged at iteration 25, L1 6.92587e-05, Linf 0.0023527, total time[s] 0.073366 +Converged at iteration 27, L1 6.96752e-05, Linf 0.00972341, total time[s] 0.071337 +Converged at iteration 27, L1 5.20137e-05, Linf 0.0133283, total time[s] 0.071858 +Converged at iteration 25, L1 5.40115e-05, Linf 0.0131552, total time[s] 0.070115 +Converged at iteration 20, L1 4.49494e-05, Linf 0.00366615, total time[s] 0.054774 +Converged at iteration 19, L1 9.61697e-05, Linf 0.00392154, total time[s] 0.051356 +Converged at iteration 23, L1 7.399e-05, Linf 0.00264341, total time[s] 0.063451 +Converged at iteration 25, L1 7.16013e-05, Linf 0.010202, total time[s] 0.102428 +Converged at iteration 21, L1 8.68987e-05, Linf 0.00598415, total time[s] 0.059922 +Converged at iteration 18, L1 8.59747e-05, Linf 0.00563297, total time[s] 0.051875 +Converged at iteration 31, L1 6.1576e-05, Linf 0.00514118, total time[s] 0.090807 +Converged at iteration 20, L1 6.45749e-05, Linf 0.00332369, total time[s] 0.05887 +Converged at iteration 23, L1 7.76946e-05, Linf 0.00652708, total time[s] 0.066268 +Converged at iteration 27, L1 8.67759e-05, Linf 0.00325535, total time[s] 0.079159 +Converged at iteration 24, L1 5.9791e-05, Linf 0.00372061, total time[s] 0.064264 +Converged at iteration 22, L1 8.98277e-05, Linf 0.00508538, total time[s] 0.058599 +Converged at iteration 24, L1 7.36478e-05, Linf 0.00581229, total time[s] 0.066976 +Converged at iteration 24, L1 7.40076e-05, Linf 0.00609273, total time[s] 0.068343 +Converged at iteration 28, L1 7.02591e-05, Linf 0.00424517, total time[s] 0.076819 +Converged at iteration 31, L1 6.15705e-05, Linf 0.0032776, total time[s] 0.082574 +Converged at iteration 28, L1 6.0998e-05, Linf 0.0024836, total time[s] 0.076345 +Converged at iteration 31, L1 8.48581e-05, Linf 0.00522709, total time[s] 0.088705 +Converged at iteration 30, L1 7.66081e-05, Linf 0.00251368, total time[s] 0.077418 +Converged at iteration 30, L1 7.35099e-05, Linf 0.00148696, total time[s] 0.077198 +Converged at iteration 28, L1 6.66631e-05, Linf 0.0131984, total time[s] 0.075573 +Converged at iteration 29, L1 3.69849e-05, Linf 0.0107212, total time[s] 0.074842 +Converged at iteration 28, L1 5.43686e-05, Linf 0.00825309, total time[s] 0.07283 +Converged at iteration 25, L1 6.9534e-05, Linf 0.00231362, total time[s] 0.065813 +Converged at iteration 36, L1 6.19911e-05, Linf 0.00518289, total time[s] 0.092392 +Converged at iteration 33, L1 6.52927e-05, Linf 0.00520514, total time[s] 0.086952 +Converged at iteration 25, L1 6.98433e-05, Linf 0.00245545, total time[s] 0.065819 +Converged at iteration 27, L1 6.5793e-05, Linf 0.00957245, total time[s] 0.070408 +Converged at iteration 27, L1 5.17515e-05, Linf 0.0138367, total time[s] 0.071974 +Converged at iteration 25, L1 5.71489e-05, Linf 0.0138883, total time[s] 0.067563 +Converged at iteration 20, L1 4.73151e-05, Linf 0.0038441, total time[s] 0.066779 +Converged at iteration 20, L1 4.842e-05, Linf 0.00209466, total time[s] 0.064828 +Converged at iteration 23, L1 7.55032e-05, Linf 0.00257275, total time[s] 0.066989 +Converged at iteration 25, L1 6.78098e-05, Linf 0.0104256, total time[s] 0.074753 +Converged at iteration 21, L1 8.83524e-05, Linf 0.00609339, total time[s] 0.062524 +Converged at iteration 18, L1 8.90858e-05, Linf 0.00609323, total time[s] 0.055993 +Converged at iteration 31, L1 6.06485e-05, Linf 0.00530407, total time[s] 0.088766 +Converged at iteration 20, L1 7.14072e-05, Linf 0.00391342, total time[s] 0.056031 +Converged at iteration 23, L1 8.34018e-05, Linf 0.0072471, total time[s] 0.070924 +Converged at iteration 27, L1 8.67509e-05, Linf 0.00327724, total time[s] 0.084022 +Converged at iteration 24, L1 6.1776e-05, Linf 0.00383861, total time[s] 0.097848 +Converged at iteration 22, L1 9.44184e-05, Linf 0.00521342, total time[s] 0.096182 +Converged at iteration 24, L1 8.02984e-05, Linf 0.00609807, total time[s] 0.067951 +Converged at iteration 24, L1 8.26497e-05, Linf 0.00703261, total time[s] 0.086859 +Converged at iteration 28, L1 7.02723e-05, Linf 0.00418219, total time[s] 0.098078 +Converged at iteration 31, L1 6.44711e-05, Linf 0.00357818, total time[s] 0.093879 +Converged at iteration 28, L1 6.10195e-05, Linf 0.00255673, total time[s] 0.080377 +Converged at iteration 31, L1 8.93464e-05, Linf 0.00539712, total time[s] 0.081406 +Converged at iteration 30, L1 8.02437e-05, Linf 0.00265161, total time[s] 0.076023 +Converged at iteration 30, L1 7.9765e-05, Linf 0.00158519, total time[s] 0.081393 +Converged at iteration 28, L1 5.76581e-05, Linf 0.0129146, total time[s] 0.073627 +Converged at iteration 29, L1 3.7893e-05, Linf 0.0109146, total time[s] 0.080066 +Converged at iteration 28, L1 5.71983e-05, Linf 0.00876355, total time[s] 0.086419 +Converged at iteration 25, L1 7.22187e-05, Linf 0.00247371, total time[s] 0.071105 +Converged at iteration 36, L1 6.046e-05, Linf 0.00517876, total time[s] 0.107489 +Converged at iteration 33, L1 6.38979e-05, Linf 0.00513826, total time[s] 0.105814 +Converged at iteration 25, L1 7.03467e-05, Linf 0.00249751, total time[s] 0.07709 +Converged at iteration 27, L1 5.94574e-05, Linf 0.0094913, total time[s] 0.098697 +Converged at iteration 27, L1 5.19917e-05, Linf 0.0140835, total time[s] 0.104643 +Converged at iteration 25, L1 5.8269e-05, Linf 0.0142353, total time[s] 0.100867 +Converged at iteration 20, L1 4.88102e-05, Linf 0.00386588, total time[s] 0.069784 +Converged at iteration 20, L1 5.05442e-05, Linf 0.00206009, total time[s] 0.063216 +Converged at iteration 23, L1 7.59086e-05, Linf 0.00254144, total time[s] 0.099052 +Converged at iteration 25, L1 6.50915e-05, Linf 0.0105278, total time[s] 0.125312 +Converged at iteration 21, L1 8.87409e-05, Linf 0.00611404, total time[s] 0.117217 +Converged at iteration 18, L1 9.12702e-05, Linf 0.00651636, total time[s] 0.066902 +Converged at iteration 31, L1 6.03721e-05, Linf 0.00538563, total time[s] 0.092712 +Converged at iteration 20, L1 7.54203e-05, Linf 0.00419985, total time[s] 0.056905 +Converged at iteration 23, L1 9.24559e-05, Linf 0.00756253, total time[s] 0.075595 +Converged at iteration 27, L1 8.7843e-05, Linf 0.00608022, total time[s] 0.119498 +Converged at iteration 24, L1 6.38192e-05, Linf 0.00384176, total time[s] 0.109188 +Converged at iteration 22, L1 9.64272e-05, Linf 0.00526913, total time[s] 0.110376 +Converged at iteration 24, L1 8.17792e-05, Linf 0.00609418, total time[s] 0.094408 +Converged at iteration 24, L1 8.71935e-05, Linf 0.00741311, total time[s] 0.069044 +Converged at iteration 28, L1 6.99447e-05, Linf 0.00412632, total time[s] 0.079756 +Converged at iteration 31, L1 6.44221e-05, Linf 0.00352442, total time[s] 0.08895 +Converged at iteration 28, L1 6.24674e-05, Linf 0.00255617, total time[s] 0.0975 +Converged at iteration 31, L1 9.15645e-05, Linf 0.0055001, total time[s] 0.082994 +Converged at iteration 30, L1 8.22172e-05, Linf 0.00271157, total time[s] 0.118286 +Converged at iteration 30, L1 8.59668e-05, Linf 0.00162743, total time[s] 0.133011 +Converged at iteration 28, L1 5.29709e-05, Linf 0.0127376, total time[s] 0.075446 +Converged at iteration 29, L1 3.85455e-05, Linf 0.0111052, total time[s] 0.078493 +Converged at iteration 28, L1 5.82706e-05, Linf 0.00901302, total time[s] 0.074515 +Converged at iteration 25, L1 7.34084e-05, Linf 0.00246144, total time[s] 0.065536 +Converged at iteration 36, L1 6.14556e-05, Linf 0.00510276, total time[s] 0.150109 +Converged at iteration 33, L1 6.47977e-05, Linf 0.00519349, total time[s] 0.090659 +Converged at iteration 25, L1 7.02569e-05, Linf 0.00247643, total time[s] 0.063787 +Converged at iteration 27, L1 6.11919e-05, Linf 0.00952591, total time[s] 0.069746 +Converged at iteration 27, L1 5.10975e-05, Linf 0.0139579, total time[s] 0.068922 +Converged at iteration 25, L1 5.76153e-05, Linf 0.0142224, total time[s] 0.067354 +Converged at iteration 20, L1 4.81438e-05, Linf 0.00384591, total time[s] 0.055387 +Converged at iteration 20, L1 5.03314e-05, Linf 0.00207262, total time[s] 0.069111 +Converged at iteration 23, L1 7.62549e-05, Linf 0.00255979, total time[s] 0.071336 +Converged at iteration 25, L1 6.61227e-05, Linf 0.0104608, total time[s] 0.066258 +Converged at iteration 21, L1 8.83147e-05, Linf 0.00609925, total time[s] 0.060451 +Converged at iteration 18, L1 9.09423e-05, Linf 0.00623102, total time[s] 0.051429 +Converged at iteration 31, L1 6.07828e-05, Linf 0.00534478, total time[s] 0.081155 +Converged at iteration 20, L1 7.42408e-05, Linf 0.00405993, total time[s] 0.054078 +Converged at iteration 23, L1 8.49207e-05, Linf 0.00740318, total time[s] 0.061145 +Converged at iteration 27, L1 8.68072e-05, Linf 0.00327889, total time[s] 0.068869 +Converged at iteration 24, L1 6.18117e-05, Linf 0.00384531, total time[s] 0.062483 +Converged at iteration 22, L1 9.54791e-05, Linf 0.00521817, total time[s] 0.057762 +Converged at iteration 24, L1 8.23632e-05, Linf 0.00609395, total time[s] 0.064455 +Converged at iteration 24, L1 8.49213e-05, Linf 0.00719451, total time[s] 0.062851 +Converged at iteration 28, L1 7.02707e-05, Linf 0.00415367, total time[s] 0.071567 +Converged at iteration 31, L1 6.40309e-05, Linf 0.00359884, total time[s] 0.07761 +Converged at iteration 28, L1 6.13797e-05, Linf 0.00256245, total time[s] 0.071103 +Converged at iteration 31, L1 9.18038e-05, Linf 0.00537509, total time[s] 0.096074 +Converged at iteration 30, L1 8.19664e-05, Linf 0.00267748, total time[s] 0.075625 +Converged at iteration 30, L1 8.37114e-05, Linf 0.00159959, total time[s] 0.075825 +Converged at iteration 28, L1 5.51529e-05, Linf 0.0128719, total time[s] 0.071176 +Converged at iteration 29, L1 3.81686e-05, Linf 0.0110071, total time[s] 0.080566 +Converged at iteration 28, L1 5.86427e-05, Linf 0.00903657, total time[s] 0.072394 +Converged at iteration 25, L1 7.29539e-05, Linf 0.00248092, total time[s] 0.06852 +Converged at iteration 36, L1 6.11921e-05, Linf 0.00507499, total time[s] 0.094221 +Converged at iteration 33, L1 6.4777e-05, Linf 0.00516218, total time[s] 0.084212 +Converged at iteration 25, L1 7.05381e-05, Linf 0.00248825, total time[s] 0.06934 +Converged at iteration 27, L1 6.06211e-05, Linf 0.00950199, total time[s] 0.075783 +Converged at iteration 27, L1 5.20085e-05, Linf 0.0140237, total time[s] 0.077533 +Converged at iteration 25, L1 5.81292e-05, Linf 0.0140275, total time[s] 0.06507 +Converged at iteration 20, L1 4.86433e-05, Linf 0.00386792, total time[s] 0.054807 +Converged at iteration 20, L1 5.11844e-05, Linf 0.00297249, total time[s] 0.06495 +Converged at iteration 23, L1 7.62459e-05, Linf 0.00255054, total time[s] 0.076058 +Converged at iteration 25, L1 6.65981e-05, Linf 0.0105055, total time[s] 0.067337 +Converged at iteration 21, L1 9.10316e-05, Linf 0.00626998, total time[s] 0.066221 +Converged at iteration 18, L1 9.03702e-05, Linf 0.00648383, total time[s] 0.050236 +Converged at iteration 31, L1 6.06399e-05, Linf 0.00537746, total time[s] 0.078331 +Converged at iteration 20, L1 7.72821e-05, Linf 0.00412928, total time[s] 0.053237 +Converged at iteration 23, L1 8.98406e-05, Linf 0.00734389, total time[s] 0.06116 +Converged at iteration 27, L1 8.69245e-05, Linf 0.00328248, total time[s] 0.068559 +Converged at iteration 24, L1 6.23125e-05, Linf 0.00384176, total time[s] 0.060139 +Converged at iteration 22, L1 9.60972e-05, Linf 0.00528927, total time[s] 0.057507 +Converged at iteration 24, L1 8.17608e-05, Linf 0.00610021, total time[s] 0.059678 +Converged at iteration 24, L1 8.61119e-05, Linf 0.00730505, total time[s] 0.059372 +Converged at iteration 28, L1 7.00486e-05, Linf 0.00415456, total time[s] 0.068435 +Converged at iteration 31, L1 6.42689e-05, Linf 0.00356988, total time[s] 0.079411 +Converged at iteration 28, L1 6.16389e-05, Linf 0.00256299, total time[s] 0.080801 +Converged at iteration 31, L1 9.10015e-05, Linf 0.00551416, total time[s] 0.076488 +Converged at iteration 30, L1 8.62328e-05, Linf 0.00268758, total time[s] 0.075066 +Converged at iteration 30, L1 8.33421e-05, Linf 0.00161578, total time[s] 0.073802 +Converged at iteration 28, L1 5.40079e-05, Linf 0.0127859, total time[s] 0.070282 +Converged at iteration 29, L1 3.82571e-05, Linf 0.0110474, total time[s] 0.074925 +Converged at iteration 28, L1 5.91568e-05, Linf 0.0089511, total time[s] 0.07318 +Converged at iteration 25, L1 7.34274e-05, Linf 0.00246537, total time[s] 0.063841 +Converged at iteration 36, L1 6.06896e-05, Linf 0.00511498, total time[s] 0.090115 +Converged at iteration 33, L1 6.43156e-05, Linf 0.00513651, total time[s] 0.082604 +Converged at iteration 25, L1 7.10342e-05, Linf 0.00249288, total time[s] 0.073174 +Converged at iteration 27, L1 6.09714e-05, Linf 0.00950172, total time[s] 0.069448 +Converged at iteration 27, L1 5.12209e-05, Linf 0.0140523, total time[s] 0.072411 +Converged at iteration 25, L1 5.87459e-05, Linf 0.0141974, total time[s] 0.063946 +Converged at iteration 20, L1 4.86886e-05, Linf 0.00385789, total time[s] 0.059072 +Converged at iteration 20, L1 5.05379e-05, Linf 0.0020648, total time[s] 0.05695 +Converged at iteration 23, L1 7.56547e-05, Linf 0.00254619, total time[s] 0.063418 +Converged at iteration 25, L1 6.50831e-05, Linf 0.0105165, total time[s] 0.070132 +Converged at iteration 21, L1 8.8687e-05, Linf 0.00611492, total time[s] 0.056262 +Converged at iteration 18, L1 9.05437e-05, Linf 0.00647349, total time[s] 0.048962 +Converged at iteration 31, L1 6.03836e-05, Linf 0.00538775, total time[s] 0.081427 +Converged at iteration 20, L1 7.65291e-05, Linf 0.00416477, total time[s] 0.056473 +Converged at iteration 23, L1 9.07636e-05, Linf 0.00753744, total time[s] 0.075047 +Converged at iteration 27, L1 8.69496e-05, Linf 0.00328109, total time[s] 0.068976 +Converged at iteration 24, L1 6.23816e-05, Linf 0.00384087, total time[s] 0.064182 +Converged at iteration 22, L1 9.62424e-05, Linf 0.00525965, total time[s] 0.057441 +Converged at iteration 24, L1 8.18216e-05, Linf 0.00622577, total time[s] 0.084138 +Converged at iteration 24, L1 8.65484e-05, Linf 0.00736085, total time[s] 0.067175 +Converged at iteration 28, L1 6.99523e-05, Linf 0.00414862, total time[s] 0.071397 +Converged at iteration 31, L1 6.47058e-05, Linf 0.00354791, total time[s] 0.084305 +Converged at iteration 28, L1 6.16023e-05, Linf 0.00255852, total time[s] 0.072502 +Converged at iteration 31, L1 9.07064e-05, Linf 0.00548931, total time[s] 0.081872 +Converged at iteration 30, L1 8.19249e-05, Linf 0.00269329, total time[s] 0.089978 +Converged at iteration 30, L1 8.26093e-05, Linf 0.00162233, total time[s] 0.081828 +Converged at iteration 28, L1 5.34303e-05, Linf 0.0127629, total time[s] 0.070861 +Converged at iteration 29, L1 3.82221e-05, Linf 0.0110665, total time[s] 0.074909 +Converged at iteration 28, L1 5.82699e-05, Linf 0.0091253, total time[s] 0.07411 +Converged at iteration 25, L1 7.3457e-05, Linf 0.00244831, total time[s] 0.066177 +Converged at iteration 36, L1 6.09169e-05, Linf 0.00519398, total time[s] 0.089607 +Converged at iteration 33, L1 6.48456e-05, Linf 0.0051426, total time[s] 0.101872 +Converged at iteration 25, L1 7.03439e-05, Linf 0.00248857, total time[s] 0.064429 +Converged at iteration 27, L1 6.19422e-05, Linf 0.00951047, total time[s] 0.068596 +Converged at iteration 27, L1 5.22492e-05, Linf 0.0141208, total time[s] 0.068756 +Converged at iteration 25, L1 5.81891e-05, Linf 0.0141648, total time[s] 0.061715 +Converged at iteration 20, L1 4.88939e-05, Linf 0.00390385, total time[s] 0.059076 +Converged at iteration 20, L1 5.05959e-05, Linf 0.00206616, total time[s] 0.05683 +Converged at iteration 23, L1 7.63561e-05, Linf 0.00254877, total time[s] 0.058878 +Converged at iteration 25, L1 6.60858e-05, Linf 0.0104911, total time[s] 0.065395 +Converged at iteration 21, L1 8.93119e-05, Linf 0.00610604, total time[s] 0.057265 +Converged at iteration 18, L1 9.13487e-05, Linf 0.00649505, total time[s] 0.051692 +Converged at iteration 31, L1 6.05512e-05, Linf 0.00536406, total time[s] 0.079834 +Converged at iteration 20, L1 7.49424e-05, Linf 0.00414543, total time[s] 0.053757 +Converged at iteration 23, L1 9.06189e-05, Linf 0.00750263, total time[s] 0.060868 +Converged at iteration 27, L1 8.69043e-05, Linf 0.00328215, total time[s] 0.069386 +Converged at iteration 24, L1 6.2343e-05, Linf 0.00384136, total time[s] 0.06192 +Converged at iteration 22, L1 9.63064e-05, Linf 0.00523518, total time[s] 0.057817 +Converged at iteration 24, L1 8.17517e-05, Linf 0.00608809, total time[s] 0.061772 +Converged at iteration 24, L1 8.6568e-05, Linf 0.00733291, total time[s] 0.068111 +Converged at iteration 28, L1 6.99553e-05, Linf 0.00415364, total time[s] 0.070948 +Converged at iteration 31, L1 6.42958e-05, Linf 0.00355894, total time[s] 0.080438 +Converged at iteration 28, L1 6.15997e-05, Linf 0.00256309, total time[s] 0.071391 +Converged at iteration 31, L1 9.15344e-05, Linf 0.00540763, total time[s] 0.077895 +Converged at iteration 30, L1 8.19775e-05, Linf 0.00275282, total time[s] 0.075838 +Converged at iteration 30, L1 8.36596e-05, Linf 0.00161867, total time[s] 0.075947 +Converged at iteration 28, L1 5.37465e-05, Linf 0.0129167, total time[s] 0.072172 +Converged at iteration 29, L1 3.81808e-05, Linf 0.0110572, total time[s] 0.073702 +Converged at iteration 28, L1 5.88035e-05, Linf 0.00902602, total time[s] 0.072002 +Converged at iteration 25, L1 7.32737e-05, Linf 0.00246215, total time[s] 0.078624 +Converged at iteration 36, L1 6.09508e-05, Linf 0.00512185, total time[s] 0.090223 +Converged at iteration 33, L1 6.43746e-05, Linf 0.00517149, total time[s] 0.085556 +Converged at iteration 25, L1 7.04482e-05, Linf 0.00249005, total time[s] 0.069551 +Converged at iteration 27, L1 6.18852e-05, Linf 0.0095128, total time[s] 0.070224 +Converged at iteration 27, L1 5.17468e-05, Linf 0.0139493, total time[s] 0.077476 +Converged at iteration 25, L1 5.83047e-05, Linf 0.0143494, total time[s] 0.076276 +Converged at iteration 20, L1 4.87139e-05, Linf 0.00381547, total time[s] 0.054408 +Converged at iteration 20, L1 5.05888e-05, Linf 0.00206425, total time[s] 0.064899 +Converged at iteration 23, L1 7.59507e-05, Linf 0.00254673, total time[s] 0.076065 +Converged at iteration 25, L1 6.70311e-05, Linf 0.0104444, total time[s] 0.078781 +Converged at iteration 21, L1 8.91579e-05, Linf 0.00610506, total time[s] 0.05667 +Converged at iteration 18, L1 9.089e-05, Linf 0.00649516, total time[s] 0.053417 +Converged at iteration 31, L1 6.05616e-05, Linf 0.00536776, total time[s] 0.105776 +Converged at iteration 20, L1 7.46334e-05, Linf 0.00413813, total time[s] 0.058187 +Converged at iteration 23, L1 8.82005e-05, Linf 0.00749771, total time[s] 0.064514 +Converged at iteration 27, L1 8.69024e-05, Linf 0.00328066, total time[s] 0.080842 +Converged at iteration 24, L1 6.23353e-05, Linf 0.0038446, total time[s] 0.060689 +Converged at iteration 22, L1 9.60562e-05, Linf 0.0052547, total time[s] 0.056312 +Converged at iteration 24, L1 8.19731e-05, Linf 0.00624661, total time[s] 0.062366 +Converged at iteration 24, L1 8.63161e-05, Linf 0.0072779, total time[s] 0.063973 +Converged at iteration 28, L1 6.98525e-05, Linf 0.00415435, total time[s] 0.070433 +Converged at iteration 31, L1 7.03402e-05, Linf 0.00356461, total time[s] 0.109929 +Converged at iteration 28, L1 6.19396e-05, Linf 0.00255918, total time[s] 0.072359 +Converged at iteration 31, L1 9.21219e-05, Linf 0.00540492, total time[s] 0.082541 +Converged at iteration 30, L1 8.43561e-05, Linf 0.00270354, total time[s] 0.079604 +Converged at iteration 30, L1 8.38142e-05, Linf 0.00161606, total time[s] 0.094074 +Converged at iteration 28, L1 5.38756e-05, Linf 0.0127741, total time[s] 0.086815 +Converged at iteration 29, L1 3.84562e-05, Linf 0.0115287, total time[s] 0.099683 +Converged at iteration 28, L1 5.85446e-05, Linf 0.00901231, total time[s] 0.07594 +Converged at iteration 25, L1 7.48986e-05, Linf 0.00247962, total time[s] 0.070144 +Converged at iteration 36, L1 6.11863e-05, Linf 0.00514666, total time[s] 0.094922 +Converged at iteration 33, L1 6.4768e-05, Linf 0.00516836, total time[s] 0.114382 +Converged at iteration 25, L1 7.15957e-05, Linf 0.00248736, total time[s] 0.087611 +Converged at iteration 27, L1 6.42727e-05, Linf 0.00950805, total time[s] 0.099328 +Converged at iteration 27, L1 5.22007e-05, Linf 0.0140348, total time[s] 0.079663 +Converged at iteration 25, L1 5.80754e-05, Linf 0.0141656, total time[s] 0.066969 +Converged at iteration 20, L1 4.8649e-05, Linf 0.00385221, total time[s] 0.061799 +Converged at iteration 20, L1 5.10909e-05, Linf 0.00206697, total time[s] 0.065305 +Converged at iteration 23, L1 7.59549e-05, Linf 0.00254856, total time[s] 0.078399 +Converged at iteration 25, L1 6.82826e-05, Linf 0.0105096, total time[s] 0.074835 +Converged at iteration 21, L1 9.18945e-05, Linf 0.00611149, total time[s] 0.073563 +Converged at iteration 18, L1 9.31973e-05, Linf 0.00659885, total time[s] 0.051935 +Converged at iteration 31, L1 6.05333e-05, Linf 0.00536918, total time[s] 0.096154 +Converged at iteration 20, L1 7.51799e-05, Linf 0.00419696, total time[s] 0.068874 +Converged at iteration 23, L1 8.51414e-05, Linf 0.00750256, total time[s] 0.073312 +Converged at iteration 27, L1 8.78808e-05, Linf 0.00328809, total time[s] 0.072382 +Converged at iteration 24, L1 6.30583e-05, Linf 0.00382498, total time[s] 0.063446 +Converged at iteration 22, L1 9.73508e-05, Linf 0.00525373, total time[s] 0.060939 +Converged at iteration 24, L1 8.36345e-05, Linf 0.00613397, total time[s] 0.079967 +Converged at iteration 24, L1 8.6581e-05, Linf 0.00720203, total time[s] 0.068729 +Converged at iteration 28, L1 7.00071e-05, Linf 0.00415359, total time[s] 0.085714 +Converged at iteration 31, L1 7.3079e-05, Linf 0.0054214, total time[s] 0.084383 +Converged at iteration 28, L1 6.14628e-05, Linf 0.00255836, total time[s] 0.0743 +Converged at iteration 31, L1 9.14091e-05, Linf 0.00547879, total time[s] 0.090217 +Converged at iteration 30, L1 8.38777e-05, Linf 0.00268896, total time[s] 0.089675 +Converged at iteration 30, L1 8.25279e-05, Linf 0.00161788, total time[s] 0.113912 +Converged at iteration 28, L1 5.38632e-05, Linf 0.0127736, total time[s] 0.133522 +Converged at iteration 29, L1 3.82417e-05, Linf 0.0110518, total time[s] 0.093869 +Converged at iteration 28, L1 5.89366e-05, Linf 0.00910596, total time[s] 0.078637 +Converged at iteration 25, L1 7.42497e-05, Linf 0.00246266, total time[s] 0.068486 +Converged at iteration 40, L1 6.71384e-05, Linf 0.00367454, total time[s] 0.11289 +Converged at iteration 35, L1 7.60853e-05, Linf 0.0033971, total time[s] 0.12548 +Converged at iteration 30, L1 9.65965e-05, Linf 0.00430073, total time[s] 0.095846 +Converged at iteration 31, L1 6.22178e-05, Linf 0.00502562, total time[s] 0.087678 +Converged at iteration 27, L1 6.26621e-05, Linf 0.00499543, total time[s] 0.082539 +Converged at iteration 22, L1 8.59006e-05, Linf 0.00448845, total time[s] 0.071152 +Converged at iteration 20, L1 9.6017e-05, Linf 0.00395687, total time[s] 0.07571 +Converged at iteration 24, L1 8.84338e-05, Linf 0.00482798, total time[s] 0.103603 +Converged at iteration 28, L1 7.38346e-05, Linf 0.00445903, total time[s] 0.107261 +Converged at iteration 26, L1 8.11711e-05, Linf 0.00546527, total time[s] 0.087181 +Converged at iteration 22, L1 7.38604e-05, Linf 0.00508706, total time[s] 0.086762 +Converged at iteration 19, L1 6.63295e-05, Linf 0.00393099, total time[s] 0.05427 +Converged at iteration 30, L1 7.98554e-05, Linf 0.00329634, total time[s] 0.078403 +Converged at iteration 20, L1 8.44284e-05, Linf 0.00455022, total time[s] 0.054324 +Converged at iteration 24, L1 7.11319e-05, Linf 0.00463288, total time[s] 0.064176 +Converged at iteration 31, L1 8.93588e-05, Linf 0.00569161, total time[s] 0.079596 +Converged at iteration 27, L1 9.91594e-05, Linf 0.00569722, total time[s] 0.071551 +Converged at iteration 24, L1 8.79022e-05, Linf 0.00465003, total time[s] 0.070936 +Converged at iteration 23, L1 9.21767e-05, Linf 0.00410191, total time[s] 0.060106 +Converged at iteration 26, L1 7.22189e-05, Linf 0.00449096, total time[s] 0.068584 +Converged at iteration 29, L1 7.8168e-05, Linf 0.00489927, total time[s] 0.075617 +Converged at iteration 34, L1 7.09421e-05, Linf 0.00422666, total time[s] 0.087242 +Converged at iteration 30, L1 9.39508e-05, Linf 0.00442601, total time[s] 0.077399 +Converged at iteration 28, L1 9.49893e-05, Linf 0.00310979, total time[s] 0.074044 +Converged at iteration 32, L1 9.42579e-05, Linf 0.00374089, total time[s] 0.082395 +Converged at iteration 37, L1 7.33836e-05, Linf 0.00327821, total time[s] 0.094079 +Converged at iteration 33, L1 8.44791e-05, Linf 0.00469107, total time[s] 0.084248 +Converged at iteration 28, L1 9.6518e-05, Linf 0.0043018, total time[s] 0.072608 +Converged at iteration 24, L1 8.82895e-05, Linf 0.00325072, total time[s] 0.063713 +Converged at iteration 26, L1 8.98083e-05, Linf 0.00383973, total time[s] 0.068784 +Converged at iteration 40, L1 6.64686e-05, Linf 0.0039335, total time[s] 0.102546 +Converged at iteration 35, L1 8.66289e-05, Linf 0.00360688, total time[s] 0.089313 +Converged at iteration 30, L1 9.16683e-05, Linf 0.00418051, total time[s] 0.080063 +Converged at iteration 31, L1 6.17363e-05, Linf 0.00504684, total time[s] 0.078752 +Converged at iteration 26, L1 9.85685e-05, Linf 0.0057759, total time[s] 0.067113 +Converged at iteration 22, L1 7.16352e-05, Linf 0.00418196, total time[s] 0.057705 +Converged at iteration 21, L1 6.40594e-05, Linf 0.00348499, total time[s] 0.055378 +Converged at iteration 24, L1 8.94354e-05, Linf 0.00495016, total time[s] 0.062611 +Converged at iteration 28, L1 7.32125e-05, Linf 0.00443344, total time[s] 0.071787 +Converged at iteration 26, L1 8.05695e-05, Linf 0.00540076, total time[s] 0.071172 +Converged at iteration 22, L1 7.01377e-05, Linf 0.00442004, total time[s] 0.059746 +Converged at iteration 19, L1 5.49546e-05, Linf 0.00332061, total time[s] 0.053042 +Converged at iteration 30, L1 9.518e-05, Linf 0.00330735, total time[s] 0.079889 +Converged at iteration 20, L1 8.43849e-05, Linf 0.00475982, total time[s] 0.053145 +Converged at iteration 24, L1 7.11622e-05, Linf 0.00453596, total time[s] 0.062526 +Converged at iteration 31, L1 9.4348e-05, Linf 0.00482202, total time[s] 0.078251 +Converged at iteration 27, L1 9.42322e-05, Linf 0.00468429, total time[s] 0.069836 +Converged at iteration 24, L1 8.51721e-05, Linf 0.00428122, total time[s] 0.063029 +Converged at iteration 23, L1 9.24175e-05, Linf 0.00440758, total time[s] 0.059638 +Converged at iteration 26, L1 7.13167e-05, Linf 0.00474448, total time[s] 0.066895 +Converged at iteration 29, L1 7.53116e-05, Linf 0.00488981, total time[s] 0.078484 +Converged at iteration 34, L1 8.13727e-05, Linf 0.00406036, total time[s] 0.085645 +Converged at iteration 31, L1 7.15948e-05, Linf 0.00355233, total time[s] 0.078145 +Converged at iteration 29, L1 7.02738e-05, Linf 0.00272399, total time[s] 0.076383 +Converged at iteration 32, L1 8.2241e-05, Linf 0.00354588, total time[s] 0.080627 +Converged at iteration 36, L1 8.71608e-05, Linf 0.00357613, total time[s] 0.089792 +Converged at iteration 33, L1 8.32617e-05, Linf 0.00484919, total time[s] 0.08274 +Converged at iteration 28, L1 9.10457e-05, Linf 0.00413124, total time[s] 0.071409 +Converged at iteration 24, L1 8.0246e-05, Linf 0.00290886, total time[s] 0.062565 +Converged at iteration 26, L1 8.3985e-05, Linf 0.00392365, total time[s] 0.066892 +Converged at iteration 40, L1 6.7015e-05, Linf 0.00380474, total time[s] 0.1031 +Converged at iteration 35, L1 8.12831e-05, Linf 0.00349798, total time[s] 0.105011 +Converged at iteration 30, L1 9.67309e-05, Linf 0.00423634, total time[s] 0.100439 +Converged at iteration 31, L1 6.18962e-05, Linf 0.00503605, total time[s] 0.116828 +Converged at iteration 27, L1 6.05088e-05, Linf 0.0049509, total time[s] 0.086089 +Converged at iteration 22, L1 7.85704e-05, Linf 0.00433709, total time[s] 0.087335 +Converged at iteration 21, L1 6.27857e-05, Linf 0.00331396, total time[s] 0.121011 +Converged at iteration 24, L1 9.08781e-05, Linf 0.00489772, total time[s] 0.117667 +Converged at iteration 28, L1 7.47848e-05, Linf 0.00444653, total time[s] 0.099205 +Converged at iteration 26, L1 8.0571e-05, Linf 0.00551006, total time[s] 0.104337 +Converged at iteration 22, L1 7.24396e-05, Linf 0.00489335, total time[s] 0.071 +Converged at iteration 19, L1 6.01845e-05, Linf 0.00367629, total time[s] 0.053835 +Converged at iteration 30, L1 8.69267e-05, Linf 0.00330224, total time[s] 0.079979 +Converged at iteration 20, L1 8.54344e-05, Linf 0.00463491, total time[s] 0.055885 +Converged at iteration 24, L1 7.16464e-05, Linf 0.00467503, total time[s] 0.0664 +Converged at iteration 31, L1 9.30592e-05, Linf 0.00537471, total time[s] 0.080816 +Converged at iteration 27, L1 9.92362e-05, Linf 0.00551973, total time[s] 0.073676 +Converged at iteration 24, L1 8.70821e-05, Linf 0.00449437, total time[s] 0.065144 +Converged at iteration 23, L1 9.25885e-05, Linf 0.00419845, total time[s] 0.059958 +Converged at iteration 26, L1 7.19956e-05, Linf 0.00464414, total time[s] 0.067296 +Converged at iteration 29, L1 7.67355e-05, Linf 0.00487431, total time[s] 0.079293 +Converged at iteration 34, L1 7.76074e-05, Linf 0.00428846, total time[s] 0.086079 +Converged at iteration 30, L1 9.92146e-05, Linf 0.00443983, total time[s] 0.076137 +Converged at iteration 28, L1 9.77248e-05, Linf 0.00319406, total time[s] 0.071573 +Converged at iteration 32, L1 8.69348e-05, Linf 0.00364201, total time[s] 0.086272 +Converged at iteration 36, L1 9.73483e-05, Linf 0.00372475, total time[s] 0.096724 +Converged at iteration 33, L1 8.40394e-05, Linf 0.0048224, total time[s] 0.083125 +Converged at iteration 28, L1 9.39556e-05, Linf 0.00421393, total time[s] 0.074717 +Converged at iteration 24, L1 8.28597e-05, Linf 0.00308024, total time[s] 0.074541 +Converged at iteration 26, L1 8.75575e-05, Linf 0.0039071, total time[s] 0.096173 +Converged at iteration 40, L1 6.74138e-05, Linf 0.00373954, total time[s] 0.122079 +Converged at iteration 35, L1 7.86321e-05, Linf 0.00344673, total time[s] 0.11757 +Converged at iteration 30, L1 9.70522e-05, Linf 0.00427761, total time[s] 0.085581 +Converged at iteration 31, L1 6.19142e-05, Linf 0.00503075, total time[s] 0.11686 +Converged at iteration 27, L1 6.15626e-05, Linf 0.00497391, total time[s] 0.085125 +Converged at iteration 22, L1 8.2108e-05, Linf 0.00441324, total time[s] 0.064816 +Converged at iteration 20, L1 9.86374e-05, Linf 0.00408165, total time[s] 0.080096 +Converged at iteration 24, L1 9.01558e-05, Linf 0.0048256, total time[s] 0.064267 +Converged at iteration 28, L1 7.40778e-05, Linf 0.00445305, total time[s] 0.073078 +Converged at iteration 26, L1 8.11429e-05, Linf 0.00551183, total time[s] 0.068797 +Converged at iteration 22, L1 7.28607e-05, Linf 0.00500948, total time[s] 0.059243 +Converged at iteration 19, L1 6.37722e-05, Linf 0.0038089, total time[s] 0.052611 +Converged at iteration 30, L1 8.33596e-05, Linf 0.00329942, total time[s] 0.077151 +Converged at iteration 20, L1 8.47085e-05, Linf 0.00452145, total time[s] 0.061622 +Converged at iteration 24, L1 7.15735e-05, Linf 0.0046854, total time[s] 0.070915 +Converged at iteration 31, L1 9.08185e-05, Linf 0.00555362, total time[s] 0.090378 +Converged at iteration 27, L1 9.95769e-05, Linf 0.00564252, total time[s] 0.073578 +Converged at iteration 24, L1 8.77603e-05, Linf 0.00454143, total time[s] 0.067095 +Converged at iteration 23, L1 9.25363e-05, Linf 0.00414781, total time[s] 0.068144 +Converged at iteration 26, L1 7.21642e-05, Linf 0.00450308, total time[s] 0.075637 +Converged at iteration 29, L1 7.75501e-05, Linf 0.00482015, total time[s] 0.083888 +Converged at iteration 34, L1 7.46839e-05, Linf 0.00427235, total time[s] 0.131601 +Converged at iteration 30, L1 9.67428e-05, Linf 0.00446599, total time[s] 0.080794 +Converged at iteration 28, L1 9.61254e-05, Linf 0.00315426, total time[s] 0.073162 +Converged at iteration 32, L1 9.00821e-05, Linf 0.00369652, total time[s] 0.083956 +Converged at iteration 37, L1 7.25656e-05, Linf 0.00319595, total time[s] 0.094375 +Converged at iteration 33, L1 8.43655e-05, Linf 0.00478414, total time[s] 0.085417 +Converged at iteration 28, L1 9.53179e-05, Linf 0.00425508, total time[s] 0.073575 +Converged at iteration 24, L1 8.51033e-05, Linf 0.00316552, total time[s] 0.064549 +Converged at iteration 26, L1 8.88922e-05, Linf 0.00388441, total time[s] 0.068785 +Converged at iteration 40, L1 6.75389e-05, Linf 0.00371251, total time[s] 0.102777 +Converged at iteration 35, L1 7.75198e-05, Linf 0.00342164, total time[s] 0.094629 +Converged at iteration 30, L1 9.68588e-05, Linf 0.00432908, total time[s] 0.080929 +Converged at iteration 31, L1 6.20015e-05, Linf 0.00502817, total time[s] 0.084035 +Converged at iteration 27, L1 6.25857e-05, Linf 0.00498487, total time[s] 0.07603 +Converged at iteration 22, L1 8.40399e-05, Linf 0.0044509, total time[s] 0.063241 +Converged at iteration 20, L1 9.73206e-05, Linf 0.00406442, total time[s] 0.175492 +Converged at iteration 24, L1 8.93388e-05, Linf 0.00494103, total time[s] 0.080637 +Converged at iteration 28, L1 7.40478e-05, Linf 0.00445617, total time[s] 0.07366 +Converged at iteration 26, L1 8.10122e-05, Linf 0.00538556, total time[s] 0.068686 +Converged at iteration 22, L1 7.30379e-05, Linf 0.0049678, total time[s] 0.06068 +Converged at iteration 19, L1 6.52485e-05, Linf 0.00379445, total time[s] 0.051306 +Converged at iteration 30, L1 8.16481e-05, Linf 0.0032705, total time[s] 0.077793 +Converged at iteration 20, L1 8.46196e-05, Linf 0.0045711, total time[s] 0.053854 +Converged at iteration 24, L1 7.14023e-05, Linf 0.00464467, total time[s] 0.064837 +Converged at iteration 31, L1 8.98198e-05, Linf 0.00559335, total time[s] 0.083445 +Converged at iteration 27, L1 9.92921e-05, Linf 0.0056795, total time[s] 0.072796 +Converged at iteration 24, L1 8.79538e-05, Linf 0.00466378, total time[s] 0.074986 +Converged at iteration 23, L1 9.24331e-05, Linf 0.0042193, total time[s] 0.062079 +Converged at iteration 26, L1 7.21926e-05, Linf 0.00448184, total time[s] 0.068396 +Converged at iteration 29, L1 7.78699e-05, Linf 0.0048076, total time[s] 0.075194 +Converged at iteration 34, L1 7.29092e-05, Linf 0.00422573, total time[s] 0.086255 +Converged at iteration 30, L1 9.5373e-05, Linf 0.00438793, total time[s] 0.07797 +Converged at iteration 28, L1 9.55476e-05, Linf 0.00315005, total time[s] 0.073073 +Converged at iteration 32, L1 9.30026e-05, Linf 0.00372228, total time[s] 0.08309 +Converged at iteration 37, L1 7.39436e-05, Linf 0.00322648, total time[s] 0.093672 +Converged at iteration 33, L1 8.4485e-05, Linf 0.00471299, total time[s] 0.084545 +Converged at iteration 28, L1 9.6342e-05, Linf 0.00428134, total time[s] 0.073608 +Converged at iteration 24, L1 8.65091e-05, Linf 0.00320804, total time[s] 0.06348 +Converged at iteration 26, L1 9.00471e-05, Linf 0.00383042, total time[s] 0.067754 +Converged at iteration 40, L1 6.83591e-05, Linf 0.00369301, total time[s] 0.106042 +Converged at iteration 35, L1 7.73134e-05, Linf 0.00340956, total time[s] 0.09189 +Converged at iteration 30, L1 9.72483e-05, Linf 0.00431729, total time[s] 0.080596 +Converged at iteration 31, L1 6.20295e-05, Linf 0.0050269, total time[s] 0.080287 +Converged at iteration 27, L1 6.23568e-05, Linf 0.00499022, total time[s] 0.071512 +Converged at iteration 22, L1 8.49425e-05, Linf 0.00446906, total time[s] 0.061004 +Converged at iteration 20, L1 9.67488e-05, Linf 0.00403929, total time[s] 0.056853 +Converged at iteration 24, L1 8.89081e-05, Linf 0.00483395, total time[s] 0.064215 +Converged at iteration 28, L1 7.40579e-05, Linf 0.00445758, total time[s] 0.072221 +Converged at iteration 26, L1 8.14533e-05, Linf 0.00548287, total time[s] 0.06774 +Converged at iteration 22, L1 7.38511e-05, Linf 0.00507221, total time[s] 0.057418 +Converged at iteration 19, L1 6.58568e-05, Linf 0.00390126, total time[s] 0.070035 +Converged at iteration 30, L1 8.09633e-05, Linf 0.00329722, total time[s] 0.075943 +Converged at iteration 20, L1 8.45364e-05, Linf 0.00456065, total time[s] 0.052923 +Converged at iteration 24, L1 7.14033e-05, Linf 0.00463563, total time[s] 0.062368 +Converged at iteration 31, L1 8.97509e-05, Linf 0.0057003, total time[s] 0.077994 +Converged at iteration 27, L1 9.92288e-05, Linf 0.0056901, total time[s] 0.07996 +Converged at iteration 24, L1 8.79661e-05, Linf 0.00464054, total time[s] 0.068351 +Converged at iteration 23, L1 9.32462e-05, Linf 0.00573014, total time[s] 0.081794 +Converged at iteration 26, L1 7.22195e-05, Linf 0.00447104, total time[s] 0.069803 +Converged at iteration 29, L1 7.81478e-05, Linf 0.00480163, total time[s] 0.077724 +Converged at iteration 34, L1 7.19777e-05, Linf 0.00423623, total time[s] 0.088013 +Converged at iteration 30, L1 9.46737e-05, Linf 0.00442217, total time[s] 0.077631 +Converged at iteration 28, L1 9.52605e-05, Linf 0.00312359, total time[s] 0.077235 +Converged at iteration 32, L1 9.32993e-05, Linf 0.00371255, total time[s] 0.083818 +Converged at iteration 37, L1 7.37736e-05, Linf 0.00325609, total time[s] 0.095106 +Converged at iteration 33, L1 8.45029e-05, Linf 0.00453208, total time[s] 0.084004 +Converged at iteration 28, L1 9.66876e-05, Linf 0.00429007, total time[s] 0.072839 +Converged at iteration 24, L1 8.73533e-05, Linf 0.00322939, total time[s] 0.064529 +Converged at iteration 26, L1 9.04637e-05, Linf 0.00384712, total time[s] 0.068277 +Converged at iteration 40, L1 6.83752e-05, Linf 0.00367753, total time[s] 0.100496 +Converged at iteration 35, L1 7.65024e-05, Linf 0.00340328, total time[s] 0.091743 +Converged at iteration 30, L1 9.66848e-05, Linf 0.00429821, total time[s] 0.07866 +Converged at iteration 31, L1 6.20379e-05, Linf 0.00502627, total time[s] 0.079309 +Converged at iteration 27, L1 6.27132e-05, Linf 0.00499266, total time[s] 0.072928 +Converged at iteration 22, L1 8.56566e-05, Linf 0.0044782, total time[s] 0.059098 +Converged at iteration 20, L1 9.64917e-05, Linf 0.003971, total time[s] 0.058361 +Converged at iteration 24, L1 8.86343e-05, Linf 0.00483113, total time[s] 0.071988 +Converged at iteration 28, L1 7.3938e-05, Linf 0.00445819, total time[s] 0.08119 +Converged at iteration 26, L1 8.11514e-05, Linf 0.00547475, total time[s] 0.095726 +Converged at iteration 22, L1 7.37212e-05, Linf 0.00507927, total time[s] 0.074614 +Converged at iteration 19, L1 6.61163e-05, Linf 0.00391619, total time[s] 0.062749 +Converged at iteration 30, L1 8.03605e-05, Linf 0.0032693, total time[s] 0.099655 +Converged at iteration 20, L1 8.46307e-05, Linf 0.00455552, total time[s] 0.083156 +Converged at iteration 24, L1 7.11391e-05, Linf 0.00463012, total time[s] 0.100651 +Converged at iteration 31, L1 8.9518e-05, Linf 0.00569753, total time[s] 0.113427 +Converged at iteration 27, L1 9.92481e-05, Linf 0.0056949, total time[s] 0.070794 +Converged at iteration 24, L1 8.7931e-05, Linf 0.00464538, total time[s] 0.062787 +Converged at iteration 23, L1 9.22571e-05, Linf 0.00410762, total time[s] 0.062322 +Converged at iteration 26, L1 7.22154e-05, Linf 0.00446585, total time[s] 0.067961 +Converged at iteration 29, L1 7.81e-05, Linf 0.00479895, total time[s] 0.075085 +Converged at iteration 34, L1 7.14504e-05, Linf 0.00423138, total time[s] 0.086623 +Converged at iteration 30, L1 9.43286e-05, Linf 0.00442435, total time[s] 0.07936 +Converged at iteration 28, L1 9.51182e-05, Linf 0.00311857, total time[s] 0.072919 +Converged at iteration 32, L1 9.38547e-05, Linf 0.00375992, total time[s] 0.07944 +Converged at iteration 37, L1 7.37201e-05, Linf 0.00326515, total time[s] 0.092553 +Converged at iteration 33, L1 8.44889e-05, Linf 0.00470295, total time[s] 0.086396 +Converged at iteration 28, L1 9.63192e-05, Linf 0.00425569, total time[s] 0.07308 +Converged at iteration 24, L1 8.78092e-05, Linf 0.00321524, total time[s] 0.062494 +Converged at iteration 26, L1 9.00883e-05, Linf 0.00384693, total time[s] 0.067956 +Converged at iteration 40, L1 6.94442e-05, Linf 0.00367644, total time[s] 0.111176 +Converged at iteration 35, L1 7.67653e-05, Linf 0.00340179, total time[s] 0.100243 +Converged at iteration 30, L1 9.65805e-05, Linf 0.0043251, total time[s] 0.075811 +Converged at iteration 40, L1 6.861e-05, Linf 0.00367974, total time[s] 0.114625 +Converged at iteration 35, L1 7.6454e-05, Linf 0.00340015, total time[s] 0.097586 +Converged at iteration 30, L1 9.64469e-05, Linf 0.0043258, total time[s] 0.076922 +Converged at iteration 31, L1 6.24676e-05, Linf 0.00502564, total time[s] 0.080647 +Converged at iteration 27, L1 6.27988e-05, Linf 0.00499528, total time[s] 0.069226 +Converged at iteration 22, L1 8.5985e-05, Linf 0.0044883, total time[s] 0.059251 +Converged at iteration 20, L1 9.60885e-05, Linf 0.00400023, total time[s] 0.054844 +Converged at iteration 24, L1 8.87851e-05, Linf 0.00482822, total time[s] 0.063391 +Converged at iteration 28, L1 7.40514e-05, Linf 0.00445894, total time[s] 0.072225 +Converged at iteration 26, L1 8.17068e-05, Linf 0.00545126, total time[s] 0.071352 +Converged at iteration 22, L1 7.39274e-05, Linf 0.00508903, total time[s] 0.060784 +Converged at iteration 19, L1 6.63261e-05, Linf 0.00393099, total time[s] 0.069089 +Converged at iteration 30, L1 7.98733e-05, Linf 0.00329636, total time[s] 0.080296 +Converged at iteration 20, L1 8.44535e-05, Linf 0.00455019, total time[s] 0.05956 +Converged at iteration 24, L1 7.10751e-05, Linf 0.00463262, total time[s] 0.065223 +Converged at iteration 31, L1 8.93596e-05, Linf 0.00569247, total time[s] 0.081909 +Converged at iteration 27, L1 9.91442e-05, Linf 0.00569854, total time[s] 0.073226 +Converged at iteration 24, L1 8.7903e-05, Linf 0.0046502, total time[s] 0.063066 +Converged at iteration 23, L1 9.21648e-05, Linf 0.00403476, total time[s] 0.060636 +Converged at iteration 26, L1 7.22147e-05, Linf 0.00446164, total time[s] 0.068018 +Converged at iteration 29, L1 7.81337e-05, Linf 0.00472211, total time[s] 0.075415 +Converged at iteration 34, L1 7.09108e-05, Linf 0.00422705, total time[s] 0.091455 +Converged at iteration 30, L1 9.39296e-05, Linf 0.00442619, total time[s] 0.077072 +Converged at iteration 28, L1 9.49896e-05, Linf 0.00310996, total time[s] 0.073208 +Converged at iteration 32, L1 9.40524e-05, Linf 0.00374068, total time[s] 0.084156 +Converged at iteration 37, L1 7.33871e-05, Linf 0.00327808, total time[s] 0.09892 +Converged at iteration 33, L1 8.44888e-05, Linf 0.00464528, total time[s] 0.084444 +Converged at iteration 28, L1 9.65526e-05, Linf 0.00430395, total time[s] 0.073908 +Converged at iteration 24, L1 8.83107e-05, Linf 0.00325316, total time[s] 0.064942 +Converged at iteration 26, L1 8.99291e-05, Linf 0.00384291, total time[s] 0.069614 +Converged at iteration 40, L1 6.69405e-05, Linf 0.00393137, total time[s] 0.103519 +Converged at iteration 35, L1 8.67998e-05, Linf 0.00357543, total time[s] 0.089772 +Converged at iteration 30, L1 9.18397e-05, Linf 0.0041994, total time[s] 0.079408 +Converged at iteration 31, L1 6.17474e-05, Linf 0.00504685, total time[s] 0.081131 +Converged at iteration 26, L1 9.83879e-05, Linf 0.0057215, total time[s] 0.070602 +Converged at iteration 22, L1 7.18608e-05, Linf 0.0041396, total time[s] 0.059927 +Converged at iteration 21, L1 6.42341e-05, Linf 0.00348503, total time[s] 0.060322 +Converged at iteration 24, L1 8.94057e-05, Linf 0.00494738, total time[s] 0.064735 +Converged at iteration 28, L1 7.32131e-05, Linf 0.00443342, total time[s] 0.075043 +Converged at iteration 26, L1 8.07402e-05, Linf 0.00544893, total time[s] 0.104712 +Converged at iteration 22, L1 7.0154e-05, Linf 0.0044157, total time[s] 0.064862 +Converged at iteration 19, L1 5.49425e-05, Linf 0.00332053, total time[s] 0.079104 +Converged at iteration 30, L1 9.51357e-05, Linf 0.00330734, total time[s] 0.080372 +Converged at iteration 20, L1 8.42618e-05, Linf 0.00472689, total time[s] 0.054743 +Converged at iteration 24, L1 7.12296e-05, Linf 0.00474853, total time[s] 0.063753 +Converged at iteration 31, L1 9.43947e-05, Linf 0.00482238, total time[s] 0.079802 +Converged at iteration 27, L1 9.41326e-05, Linf 0.00468424, total time[s] 0.071418 +Converged at iteration 24, L1 8.51979e-05, Linf 0.004281, total time[s] 0.064642 +Converged at iteration 23, L1 9.24e-05, Linf 0.00432073, total time[s] 0.062346 +Converged at iteration 26, L1 7.13138e-05, Linf 0.00465367, total time[s] 0.071092 +Converged at iteration 29, L1 7.53414e-05, Linf 0.00488622, total time[s] 0.076388 +Converged at iteration 34, L1 8.13238e-05, Linf 0.00406105, total time[s] 0.087458 +Converged at iteration 31, L1 7.17219e-05, Linf 0.0034794, total time[s] 0.080595 +Converged at iteration 29, L1 7.02873e-05, Linf 0.00274131, total time[s] 0.075927 +Converged at iteration 32, L1 8.21655e-05, Linf 0.00356552, total time[s] 0.083001 +Converged at iteration 36, L1 8.75435e-05, Linf 0.00357036, total time[s] 0.091479 +Converged at iteration 33, L1 8.32125e-05, Linf 0.00484766, total time[s] 0.084705 +Converged at iteration 28, L1 9.11709e-05, Linf 0.00413133, total time[s] 0.073418 +Converged at iteration 24, L1 8.02584e-05, Linf 0.00290891, total time[s] 0.071931 +Converged at iteration 26, L1 8.39853e-05, Linf 0.00392378, total time[s] 0.076667 +Converged at iteration 40, L1 6.49749e-05, Linf 0.00423903, total time[s] 0.101683 +Converged at iteration 35, L1 9.66095e-05, Linf 0.00385876, total time[s] 0.093293 +Converged at iteration 30, L1 7.65771e-05, Linf 0.00420176, total time[s] 0.078432 +Converged at iteration 31, L1 6.18365e-05, Linf 0.00506464, total time[s] 0.081161 +Converged at iteration 26, L1 9.10576e-05, Linf 0.00568998, total time[s] 0.070131 +Converged at iteration 21, L1 9.61381e-05, Linf 0.00461199, total time[s] 0.057823 +Converged at iteration 21, L1 6.93374e-05, Linf 0.00393366, total time[s] 0.059123 +Converged at iteration 24, L1 8.29721e-05, Linf 0.0051997, total time[s] 0.06453 +Converged at iteration 28, L1 6.8044e-05, Linf 0.00441193, total time[s] 0.075978 +Converged at iteration 26, L1 8.20384e-05, Linf 0.00430114, total time[s] 0.07246 +Converged at iteration 21, L1 8.53516e-05, Linf 0.00433737, total time[s] 0.05664 +Converged at iteration 18, L1 7.36718e-05, Linf 0.00298997, total time[s] 0.052005 +Converged at iteration 31, L1 7.4841e-05, Linf 0.00268266, total time[s] 0.087065 +Converged at iteration 20, L1 8.22533e-05, Linf 0.00494641, total time[s] 0.062187 +Converged at iteration 24, L1 6.91283e-05, Linf 0.00499596, total time[s] 0.073564 +Converged at iteration 30, L1 9.44546e-05, Linf 0.00345088, total time[s] 0.082543 +Converged at iteration 25, L1 9.01658e-05, Linf 0.00466771, total time[s] 0.067766 +Converged at iteration 23, L1 8.3583e-05, Linf 0.00393125, total time[s] 0.063401 +Converged at iteration 23, L1 9.32425e-05, Linf 0.00455935, total time[s] 0.067031 +Converged at iteration 26, L1 6.98293e-05, Linf 0.00492259, total time[s] 0.068897 +Converged at iteration 29, L1 7.14363e-05, Linf 0.00490096, total time[s] 0.076558 +Converged at iteration 32, L1 8.5754e-05, Linf 0.00350166, total time[s] 0.085262 +Converged at iteration 31, L1 7.25482e-05, Linf 0.00304799, total time[s] 0.082093 +Converged at iteration 29, L1 7.73558e-05, Linf 0.00289707, total time[s] 0.081045 +Converged at iteration 32, L1 7.60296e-05, Linf 0.00337659, total time[s] 0.084158 +Converged at iteration 35, L1 9.74642e-05, Linf 0.00405256, total time[s] 0.091223 +Converged at iteration 33, L1 8.06574e-05, Linf 0.00500377, total time[s] 0.088653 +Converged at iteration 28, L1 8.44249e-05, Linf 0.00398738, total time[s] 0.115463 +Converged at iteration 24, L1 7.80389e-05, Linf 0.0025615, total time[s] 0.083457 +Converged at iteration 26, L1 8.36453e-05, Linf 0.00405328, total time[s] 0.07353 +Converged at iteration 39, L1 9.9302e-05, Linf 0.00493821, total time[s] 0.168798 +Converged at iteration 35, L1 9.87543e-05, Linf 0.00389915, total time[s] 0.10263 +Converged at iteration 30, L1 6.55218e-05, Linf 0.00414085, total time[s] 0.075866 +Converged at iteration 31, L1 6.07211e-05, Linf 0.00505852, total time[s] 0.07771 +Converged at iteration 26, L1 9.1476e-05, Linf 0.00577182, total time[s] 0.068223 +Converged at iteration 21, L1 9.78374e-05, Linf 0.00465006, total time[s] 0.071494 +Converged at iteration 21, L1 6.6275e-05, Linf 0.00394856, total time[s] 0.067199 +Converged at iteration 24, L1 7.57046e-05, Linf 0.00512774, total time[s] 0.077876 +Converged at iteration 28, L1 6.66984e-05, Linf 0.00438939, total time[s] 0.104762 +Converged at iteration 26, L1 8.00001e-05, Linf 0.00402652, total time[s] 0.078313 +Converged at iteration 21, L1 7.94742e-05, Linf 0.00439007, total time[s] 0.0682 +Converged at iteration 18, L1 6.92727e-05, Linf 0.00293229, total time[s] 0.054105 +Converged at iteration 31, L1 7.6766e-05, Linf 0.00271024, total time[s] 0.091694 +Converged at iteration 20, L1 8.10843e-05, Linf 0.00496658, total time[s] 0.055697 +Converged at iteration 24, L1 6.81789e-05, Linf 0.00503563, total time[s] 0.095295 +Converged at iteration 30, L1 8.38642e-05, Linf 0.00323217, total time[s] 0.077472 +Converged at iteration 25, L1 8.01997e-05, Linf 0.00458449, total time[s] 0.067204 +Converged at iteration 23, L1 7.58525e-05, Linf 0.00383299, total time[s] 0.062171 +Converged at iteration 23, L1 9.31031e-05, Linf 0.00454408, total time[s] 0.061202 +Converged at iteration 26, L1 6.76157e-05, Linf 0.00493434, total time[s] 0.069048 +Converged at iteration 29, L1 7.09033e-05, Linf 0.0048635, total time[s] 0.075425 +Converged at iteration 32, L1 7.2861e-05, Linf 0.0033591, total time[s] 0.082761 +Converged at iteration 30, L1 9.43783e-05, Linf 0.00339268, total time[s] 0.080417 +Converged at iteration 29, L1 7.87388e-05, Linf 0.00293695, total time[s] 0.076735 +Converged at iteration 32, L1 7.50353e-05, Linf 0.00335634, total time[s] 0.083559 +Converged at iteration 35, L1 8.59179e-05, Linf 0.00398667, total time[s] 0.089961 +Converged at iteration 33, L1 7.95237e-05, Linf 0.00502159, total time[s] 0.085378 +Converged at iteration 28, L1 8.47283e-05, Linf 0.00404594, total time[s] 0.073765 +Converged at iteration 24, L1 7.91383e-05, Linf 0.00261278, total time[s] 0.063973 +Converged at iteration 26, L1 8.1991e-05, Linf 0.0040482, total time[s] 0.068835 +Converged at iteration 39, L1 9.83205e-05, Linf 0.00498543, total time[s] 0.100372 +Converged at iteration 35, L1 9.95555e-05, Linf 0.0039041, total time[s] 0.099059 +Converged at iteration 29, L1 8.62412e-05, Linf 0.00497598, total time[s] 0.078665 +Converged at iteration 31, L1 5.99257e-05, Linf 0.00508045, total time[s] 0.080961 +Converged at iteration 26, L1 9.17357e-05, Linf 0.00585301, total time[s] 0.06865 +Converged at iteration 21, L1 9.92354e-05, Linf 0.00469464, total time[s] 0.058451 +Converged at iteration 21, L1 6.28445e-05, Linf 0.00397495, total time[s] 0.061696 +Converged at iteration 24, L1 6.66763e-05, Linf 0.00518839, total time[s] 0.088574 +Converged at iteration 28, L1 6.33647e-05, Linf 0.00438811, total time[s] 0.083272 +Converged at iteration 26, L1 7.60109e-05, Linf 0.00388351, total time[s] 0.086361 +Converged at iteration 21, L1 7.43444e-05, Linf 0.00439145, total time[s] 0.068395 +Converged at iteration 18, L1 6.55924e-05, Linf 0.00301094, total time[s] 0.054166 +Converged at iteration 31, L1 7.82705e-05, Linf 0.00273862, total time[s] 0.089882 +Converged at iteration 20, L1 8.0042e-05, Linf 0.00498463, total time[s] 0.0628 +Converged at iteration 24, L1 6.82796e-05, Linf 0.00566882, total time[s] 0.066103 +Converged at iteration 30, L1 7.52516e-05, Linf 0.00306442, total time[s] 0.080457 +Converged at iteration 25, L1 7.26329e-05, Linf 0.00452871, total time[s] 0.072651 +Converged at iteration 23, L1 6.94155e-05, Linf 0.00374747, total time[s] 0.09783 +Converged at iteration 23, L1 9.3195e-05, Linf 0.00579293, total time[s] 0.094627 +Converged at iteration 26, L1 6.63428e-05, Linf 0.00491683, total time[s] 0.085937 +Converged at iteration 29, L1 7.0016e-05, Linf 0.00481327, total time[s] 0.084821 +Converged at iteration 31, L1 9.6719e-05, Linf 0.00403948, total time[s] 0.099171 +Converged at iteration 30, L1 8.62248e-05, Linf 0.0032378, total time[s] 0.088175 +Converged at iteration 29, L1 8.02205e-05, Linf 0.0029466, total time[s] 0.08158 +Converged at iteration 32, L1 7.35715e-05, Linf 0.00332201, total time[s] 0.090274 +Converged at iteration 35, L1 7.34875e-05, Linf 0.00383194, total time[s] 0.103263 +Converged at iteration 33, L1 7.83945e-05, Linf 0.00504024, total time[s] 0.095442 +Converged at iteration 28, L1 8.55876e-05, Linf 0.00406649, total time[s] 0.080178 +Converged at iteration 24, L1 8.03175e-05, Linf 0.00267337, total time[s] 0.071129 +Converged at iteration 26, L1 7.79704e-05, Linf 0.00400675, total time[s] 0.07716 +Converged at iteration 39, L1 9.71708e-05, Linf 0.00507095, total time[s] 0.10174 +Converged at iteration 36, L1 6.74987e-05, Linf 0.00338704, total time[s] 0.093367 +Converged at iteration 28, L1 9.94665e-05, Linf 0.00579278, total time[s] 0.08074 +Converged at iteration 31, L1 5.8318e-05, Linf 0.00503463, total time[s] 0.080346 +Converged at iteration 26, L1 9.20508e-05, Linf 0.00595554, total time[s] 0.068653 +Converged at iteration 22, L1 6.08308e-05, Linf 0.00405456, total time[s] 0.059578 +Converged at iteration 20, L1 9.48252e-05, Linf 0.00516085, total time[s] 0.055191 +Converged at iteration 23, L1 8.66997e-05, Linf 0.00620029, total time[s] 0.06444 +Converged at iteration 27, L1 9.39261e-05, Linf 0.00544947, total time[s] 0.075893 +Converged at iteration 26, L1 6.73207e-05, Linf 0.00360489, total time[s] 0.076725 +Converged at iteration 21, L1 6.82106e-05, Linf 0.00444805, total time[s] 0.058639 +Converged at iteration 18, L1 6.05531e-05, Linf 0.00431203, total time[s] 0.051743 +Converged at iteration 31, L1 8.15865e-05, Linf 0.00280633, total time[s] 0.089686 +Converged at iteration 20, L1 7.7016e-05, Linf 0.00503381, total time[s] 0.068259 +Converged at iteration 24, L1 6.5923e-05, Linf 0.00515487, total time[s] 0.066061 +Converged at iteration 29, L1 9.04322e-05, Linf 0.00344075, total time[s] 0.075634 +Converged at iteration 25, L1 6.23809e-05, Linf 0.00448311, total time[s] 0.065779 +Converged at iteration 22, L1 9.72598e-05, Linf 0.00445006, total time[s] 0.058737 +Converged at iteration 23, L1 9.06973e-05, Linf 0.0043457, total time[s] 0.060868 +Converged at iteration 25, L1 9.89031e-05, Linf 0.00585082, total time[s] 0.070208 +Converged at iteration 29, L1 6.83075e-05, Linf 0.00465166, total time[s] 0.090075 +Converged at iteration 31, L1 8.02892e-05, Linf 0.00389426, total time[s] 0.080671 +Converged at iteration 30, L1 7.20561e-05, Linf 0.00299533, total time[s] 0.078309 +Converged at iteration 29, L1 8.28018e-05, Linf 0.00301066, total time[s] 0.07802 +Converged at iteration 31, L1 9.75305e-05, Linf 0.00390091, total time[s] 0.080784 +Converged at iteration 34, L1 7.88949e-05, Linf 0.00425156, total time[s] 0.08703 +Converged at iteration 33, L1 7.59941e-05, Linf 0.005136, total time[s] 0.08457 +Converged at iteration 28, L1 8.49482e-05, Linf 0.00422735, total time[s] 0.073137 +Converged at iteration 24, L1 8.28916e-05, Linf 0.00279543, total time[s] 0.06412 +Converged at iteration 26, L1 6.75694e-05, Linf 0.00385617, total time[s] 0.068238 +Converged at iteration 39, L1 9.29922e-05, Linf 0.00516592, total time[s] 0.100186 +Converged at iteration 36, L1 6.85748e-05, Linf 0.00359767, total time[s] 0.133195 +Converged at iteration 27, L1 8.79103e-05, Linf 0.00617487, total time[s] 0.083743 +Converged at iteration 30, L1 9.99661e-05, Linf 0.00607045, total time[s] 0.082579 +Converged at iteration 26, L1 9.20722e-05, Linf 0.00633528, total time[s] 0.072363 +Converged at iteration 22, L1 6.29908e-05, Linf 0.0041223, total time[s] 0.057881 +Converged at iteration 20, L1 7.53139e-05, Linf 0.00505357, total time[s] 0.053091 +Converged at iteration 22, L1 9.33528e-05, Linf 0.00721856, total time[s] 0.058913 +Converged at iteration 27, L1 7.10012e-05, Linf 0.00527029, total time[s] 0.070053 +Converged at iteration 25, L1 9.90472e-05, Linf 0.00472256, total time[s] 0.065159 +Converged at iteration 21, L1 6.03335e-05, Linf 0.00462221, total time[s] 0.05631 +Converged at iteration 17, L1 9.74638e-05, Linf 0.00503469, total time[s] 0.046849 +Converged at iteration 31, L1 8.77689e-05, Linf 0.0029248, total time[s] 0.095594 +Converged at iteration 20, L1 7.08529e-05, Linf 0.00507728, total time[s] 0.059943 +Converged at iteration 24, L1 6.23651e-05, Linf 0.00527641, total time[s] 0.067337 +Converged at iteration 28, L1 9.87267e-05, Linf 0.00416361, total time[s] 0.075476 +Converged at iteration 24, L1 8.64086e-05, Linf 0.0059829, total time[s] 0.064995 +Converged at iteration 22, L1 8.87599e-05, Linf 0.00438925, total time[s] 0.059558 +Converged at iteration 23, L1 8.52211e-05, Linf 0.003729, total time[s] 0.062691 +Converged at iteration 25, L1 9.1453e-05, Linf 0.00583751, total time[s] 0.065067 +Converged at iteration 28, L1 9.97595e-05, Linf 0.00599889, total time[s] 0.073127 +Converged at iteration 30, L1 9.93431e-05, Linf 0.00495551, total time[s] 0.077826 +Converged at iteration 29, L1 8.14108e-05, Linf 0.00317915, total time[s] 0.075177 +Converged at iteration 29, L1 8.86762e-05, Linf 0.00310771, total time[s] 0.079497 +Converged at iteration 31, L1 8.42446e-05, Linf 0.00340201, total time[s] 0.0856 +Converged at iteration 33, L1 6.42758e-05, Linf 0.00380152, total time[s] 0.087377 +Converged at iteration 33, L1 7.06957e-05, Linf 0.00512243, total time[s] 0.092204 +Converged at iteration 28, L1 8.41338e-05, Linf 0.00448406, total time[s] 0.085545 +Converged at iteration 24, L1 8.80504e-05, Linf 0.00294075, total time[s] 0.069129 +Converged at iteration 25, L1 8.00045e-05, Linf 0.00429879, total time[s] 0.066562 +Converged at iteration 39, L1 8.34337e-05, Linf 0.00543288, total time[s] 0.11107 +Converged at iteration 36, L1 6.52104e-05, Linf 0.00410045, total time[s] 0.117611 +Converged at iteration 26, L1 5.47611e-05, Linf 0.00518122, total time[s] 0.074568 +Converged at iteration 30, L1 9.02605e-05, Linf 0.00608833, total time[s] 0.082255 +Converged at iteration 26, L1 9.09828e-05, Linf 0.006941, total time[s] 0.080065 +Converged at iteration 22, L1 6.79332e-05, Linf 0.00439423, total time[s] 0.06356 +Converged at iteration 19, L1 8.98654e-05, Linf 0.00629572, total time[s] 0.052982 +Converged at iteration 21, L1 8.25029e-05, Linf 0.00779287, total time[s] 0.05794 +Converged at iteration 26, L1 6.35734e-05, Linf 0.0053798, total time[s] 0.070399 +Converged at iteration 25, L1 8.08804e-05, Linf 0.00507284, total time[s] 0.065685 +Converged at iteration 21, L1 5.5974e-05, Linf 0.00483746, total time[s] 0.056885 +Converged at iteration 17, L1 7.81276e-05, Linf 0.00580282, total time[s] 0.047199 +Converged at iteration 31, L1 9.68169e-05, Linf 0.00316421, total time[s] 0.082331 +Converged at iteration 19, L1 9.81482e-05, Linf 0.00630964, total time[s] 0.052104 +Converged at iteration 23, L1 8.7231e-05, Linf 0.00593284, total time[s] 0.066184 +Converged at iteration 28, L1 6.43937e-05, Linf 0.00399102, total time[s] 0.073141 +Converged at iteration 24, L1 6.94593e-05, Linf 0.00612136, total time[s] 0.065846 +Converged at iteration 22, L1 8.24314e-05, Linf 0.00449412, total time[s] 0.070138 +Converged at iteration 23, L1 7.06533e-05, Linf 0.00256138, total time[s] 0.061974 +Converged at iteration 25, L1 7.89194e-05, Linf 0.00465032, total time[s] 0.06713 +Converged at iteration 28, L1 8.92866e-05, Linf 0.00552718, total time[s] 0.080581 +Converged at iteration 30, L1 7.81344e-05, Linf 0.00514039, total time[s] 0.088789 +Converged at iteration 28, L1 9.21728e-05, Linf 0.00365338, total time[s] 0.077023 +Converged at iteration 29, L1 9.96814e-05, Linf 0.00330727, total time[s] 0.077243 +Converged at iteration 30, L1 9.33873e-05, Linf 0.00320101, total time[s] 0.076161 +Converged at iteration 31, L1 6.86182e-05, Linf 0.00245944, total time[s] 0.080756 +Converged at iteration 33, L1 6.00468e-05, Linf 0.00517106, total time[s] 0.083002 +Converged at iteration 28, L1 8.3198e-05, Linf 0.00504945, total time[s] 0.071724 +Converged at iteration 25, L1 6.24149e-05, Linf 0.00265002, total time[s] 0.065465 +Converged at iteration 24, L1 8.41675e-05, Linf 0.00400172, total time[s] 0.063327 +Converged at iteration 39, L1 8.82558e-05, Linf 0.00540099, total time[s] 0.099546 +Converged at iteration 36, L1 6.69139e-05, Linf 0.0038641, total time[s] 0.095393 +Converged at iteration 26, L1 8.94389e-05, Linf 0.0066202, total time[s] 0.074097 +Converged at iteration 30, L1 9.47107e-05, Linf 0.0061306, total time[s] 0.076738 +Converged at iteration 26, L1 9.15086e-05, Linf 0.0066401, total time[s] 0.067416 +Converged at iteration 22, L1 6.4993e-05, Linf 0.00434315, total time[s] 0.05901 +Converged at iteration 20, L1 5.95332e-05, Linf 0.00475676, total time[s] 0.051717 +Converged at iteration 22, L1 5.77259e-05, Linf 0.00635049, total time[s] 0.062412 +Converged at iteration 26, L1 8.87186e-05, Linf 0.0061049, total time[s] 0.068011 +Converged at iteration 25, L1 8.85011e-05, Linf 0.00491178, total time[s] 0.068012 +Converged at iteration 21, L1 5.77621e-05, Linf 0.00468047, total time[s] 0.059798 +Converged at iteration 17, L1 8.43684e-05, Linf 0.00553334, total time[s] 0.059038 +Converged at iteration 31, L1 9.27628e-05, Linf 0.00300606, total time[s] 0.11088 +Converged at iteration 20, L1 6.26873e-05, Linf 0.00486036, total time[s] 0.089489 +Converged at iteration 23, L1 9.55038e-05, Linf 0.00589922, total time[s] 0.092637 +Converged at iteration 28, L1 7.77937e-05, Linf 0.004098, total time[s] 0.113329 +Converged at iteration 24, L1 7.71282e-05, Linf 0.00608362, total time[s] 0.079107 +Converged at iteration 22, L1 8.48507e-05, Linf 0.00442458, total time[s] 0.067865 +Converged at iteration 23, L1 7.63456e-05, Linf 0.00305325, total time[s] 0.061885 +Converged at iteration 25, L1 8.46086e-05, Linf 0.00561366, total time[s] 0.066988 +Converged at iteration 28, L1 9.47818e-05, Linf 0.00577737, total time[s] 0.090462 +Converged at iteration 30, L1 8.65389e-05, Linf 0.00506914, total time[s] 0.090605 +Converged at iteration 29, L1 6.76613e-05, Linf 0.00300265, total time[s] 0.075347 +Converged at iteration 29, L1 9.41522e-05, Linf 0.00320566, total time[s] 0.075407 +Converged at iteration 31, L1 7.33457e-05, Linf 0.00291546, total time[s] 0.08814 +Converged at iteration 31, L1 9.78265e-05, Linf 0.00454431, total time[s] 0.090201 +Converged at iteration 33, L1 6.51608e-05, Linf 0.00515432, total time[s] 0.100567 +Converged at iteration 28, L1 8.3771e-05, Linf 0.00473461, total time[s] 0.076806 +Converged at iteration 24, L1 9.43443e-05, Linf 0.00316325, total time[s] 0.067076 +Converged at iteration 25, L1 6.28286e-05, Linf 0.00362296, total time[s] 0.06521 +Converged at iteration 39, L1 9.01197e-05, Linf 0.00527875, total time[s] 0.100352 +Converged at iteration 36, L1 6.75849e-05, Linf 0.00374522, total time[s] 0.095745 +Converged at iteration 27, L1 6.23677e-05, Linf 0.00560831, total time[s] 0.073345 +Converged at iteration 30, L1 9.82642e-05, Linf 0.00609915, total time[s] 0.106018 +Converged at iteration 26, L1 9.19396e-05, Linf 0.00648235, total time[s] 0.066889 +Converged at iteration 22, L1 6.41428e-05, Linf 0.00424815, total time[s] 0.058499 +Converged at iteration 20, L1 6.68875e-05, Linf 0.00492034, total time[s] 0.054929 +Converged at iteration 22, L1 7.33526e-05, Linf 0.00687332, total time[s] 0.059916 +Converged at iteration 27, L1 5.96862e-05, Linf 0.00505733, total time[s] 0.079292 +Converged at iteration 25, L1 9.31351e-05, Linf 0.00479031, total time[s] 0.072388 +Converged at iteration 21, L1 5.89883e-05, Linf 0.00464474, total time[s] 0.066876 +Converged at iteration 17, L1 9.012e-05, Linf 0.00523015, total time[s] 0.048256 +Converged at iteration 31, L1 9.01744e-05, Linf 0.00297419, total time[s] 0.100099 +Converged at iteration 20, L1 6.59071e-05, Linf 0.00500555, total time[s] 0.068666 +Converged at iteration 23, L1 9.95181e-05, Linf 0.00591846, total time[s] 0.103306 +Converged at iteration 28, L1 8.74682e-05, Linf 0.00413346, total time[s] 0.14038 +Converged at iteration 24, L1 8.10717e-05, Linf 0.0060459, total time[s] 0.070672 +Converged at iteration 22, L1 8.67077e-05, Linf 0.00439846, total time[s] 0.069819 +Converged at iteration 23, L1 8.1346e-05, Linf 0.00584636, total time[s] 0.086721 +Converged at iteration 25, L1 8.78657e-05, Linf 0.00577713, total time[s] 0.096859 +Converged at iteration 28, L1 9.73883e-05, Linf 0.00589499, total time[s] 0.075992 +Converged at iteration 30, L1 9.17979e-05, Linf 0.00501505, total time[s] 0.08779 +Converged at iteration 29, L1 7.36081e-05, Linf 0.00308149, total time[s] 0.08086 +Converged at iteration 29, L1 9.15634e-05, Linf 0.00315736, total time[s] 0.085376 +Converged at iteration 31, L1 7.91152e-05, Linf 0.00313393, total time[s] 0.079254 +Converged at iteration 32, L1 7.85648e-05, Linf 0.00411479, total time[s] 0.081594 +Converged at iteration 33, L1 6.79176e-05, Linf 0.00514069, total time[s] 0.083757 +Converged at iteration 28, L1 8.37891e-05, Linf 0.00461445, total time[s] 0.071107 +Converged at iteration 24, L1 9.13025e-05, Linf 0.00306418, total time[s] 0.06483 +Converged at iteration 25, L1 7.07563e-05, Linf 0.00396983, total time[s] 0.06785 +Converged at iteration 39, L1 9.23545e-05, Linf 0.00524873, total time[s] 0.096679 +Converged at iteration 36, L1 6.78981e-05, Linf 0.00368887, total time[s] 0.092769 +Converged at iteration 27, L1 7.37023e-05, Linf 0.00584431, total time[s] 0.069434 +Converged at iteration 30, L1 9.8527e-05, Linf 0.00610028, total time[s] 0.076179 +Converged at iteration 26, L1 9.19225e-05, Linf 0.00640559, total time[s] 0.067319 +Converged at iteration 22, L1 6.38256e-05, Linf 0.00420512, total time[s] 0.062296 +Converged at iteration 20, L1 7.08929e-05, Linf 0.00498027, total time[s] 0.056022 +Converged at iteration 22, L1 8.2763e-05, Linf 0.00708825, total time[s] 0.077254 +Converged at iteration 27, L1 6.51596e-05, Linf 0.00517789, total time[s] 0.077988 +Converged at iteration 25, L1 9.61841e-05, Linf 0.00474331, total time[s] 0.076346 +Converged at iteration 21, L1 5.94327e-05, Linf 0.00462559, total time[s] 0.058291 +Converged at iteration 17, L1 9.35657e-05, Linf 0.00513241, total time[s] 0.048492 +Converged at iteration 31, L1 8.89315e-05, Linf 0.00294447, total time[s] 0.082438 +Converged at iteration 20, L1 6.77546e-05, Linf 0.00505482, total time[s] 0.054716 +Converged at iteration 24, L1 6.10006e-05, Linf 0.00526269, total time[s] 0.065006 +Converged at iteration 28, L1 9.31127e-05, Linf 0.00414824, total time[s] 0.0742 +Converged at iteration 24, L1 8.36866e-05, Linf 0.00601707, total time[s] 0.064589 +Converged at iteration 22, L1 8.76972e-05, Linf 0.00439069, total time[s] 0.060331 +Converged at iteration 23, L1 8.30017e-05, Linf 0.00354837, total time[s] 0.063034 +Converged at iteration 25, L1 8.96951e-05, Linf 0.00581673, total time[s] 0.067541 +Converged at iteration 28, L1 9.8586e-05, Linf 0.00595622, total time[s] 0.079244 +Converged at iteration 30, L1 9.53287e-05, Linf 0.00498644, total time[s] 0.083458 +Converged at iteration 29, L1 7.72215e-05, Linf 0.00312301, total time[s] 0.077462 +Converged at iteration 29, L1 8.99691e-05, Linf 0.00313188, total time[s] 0.077487 +Converged at iteration 31, L1 8.10549e-05, Linf 0.00326684, total time[s] 0.080704 +Converged at iteration 32, L1 8.90985e-05, Linf 0.00458986, total time[s] 0.082897 +Converged at iteration 33, L1 6.93071e-05, Linf 0.00513167, total time[s] 0.084823 +Converged at iteration 28, L1 8.41868e-05, Linf 0.00454696, total time[s] 0.073536 +Converged at iteration 24, L1 8.95084e-05, Linf 0.00301484, total time[s] 0.063712 +Converged at iteration 25, L1 7.52476e-05, Linf 0.00413122, total time[s] 0.066426 +Converged at iteration 39, L1 9.06472e-05, Linf 0.00526395, total time[s] 0.101714 +Converged at iteration 36, L1 6.76709e-05, Linf 0.00371625, total time[s] 0.094296 +Converged at iteration 27, L1 6.76802e-05, Linf 0.00575733, total time[s] 0.070259 +Converged at iteration 30, L1 9.77324e-05, Linf 0.00609984, total time[s] 0.078656 +Converged at iteration 26, L1 9.17848e-05, Linf 0.00644399, total time[s] 0.068168 +Converged at iteration 22, L1 6.36991e-05, Linf 0.00422793, total time[s] 0.058515 +Converged at iteration 20, L1 6.88871e-05, Linf 0.00495695, total time[s] 0.053833 +Converged at iteration 22, L1 7.78349e-05, Linf 0.00695012, total time[s] 0.05978 +Converged at iteration 27, L1 6.231e-05, Linf 0.00511846, total time[s] 0.075791 +Converged at iteration 25, L1 9.46396e-05, Linf 0.00476684, total time[s] 0.069948 +Converged at iteration 21, L1 5.91194e-05, Linf 0.00463687, total time[s] 0.062439 +Converged at iteration 17, L1 9.17724e-05, Linf 0.00519008, total time[s] 0.045826 +Converged at iteration 31, L1 8.96169e-05, Linf 0.00296033, total time[s] 0.09787 +Converged at iteration 20, L1 6.67889e-05, Linf 0.00503501, total time[s] 0.081919 +Converged at iteration 24, L1 6.02761e-05, Linf 0.00525881, total time[s] 0.080685 +Converged at iteration 28, L1 9.0297e-05, Linf 0.00414035, total time[s] 0.151557 +Converged at iteration 24, L1 8.23155e-05, Linf 0.00603247, total time[s] 0.096279 +Converged at iteration 22, L1 8.81155e-05, Linf 0.00453471, total time[s] 0.098776 +Converged at iteration 23, L1 8.18514e-05, Linf 0.00346023, total time[s] 0.112832 +Converged at iteration 25, L1 8.91258e-05, Linf 0.00579962, total time[s] 0.08702 +Converged at iteration 28, L1 9.79348e-05, Linf 0.00593883, total time[s] 0.092739 +Converged at iteration 30, L1 9.3506e-05, Linf 0.00500133, total time[s] 0.103122 +Converged at iteration 29, L1 7.52619e-05, Linf 0.0030968, total time[s] 0.09542 +Converged at iteration 29, L1 9.10749e-05, Linf 0.00314432, total time[s] 0.09251 +Converged at iteration 31, L1 8.08677e-05, Linf 0.00312877, total time[s] 0.095646 +Converged at iteration 32, L1 8.44588e-05, Linf 0.00436089, total time[s] 0.115933 +Converged at iteration 33, L1 6.85889e-05, Linf 0.00513527, total time[s] 0.138619 +Converged at iteration 28, L1 8.38341e-05, Linf 0.0045786, total time[s] 0.090604 +Converged at iteration 24, L1 9.0289e-05, Linf 0.0030395, total time[s] 0.078028 +Converged at iteration 25, L1 7.30116e-05, Linf 0.00406122, total time[s] 0.09739 +Converged at iteration 39, L1 9.2209e-05, Linf 0.00525386, total time[s] 0.120426 +Converged at iteration 36, L1 6.81687e-05, Linf 0.00370135, total time[s] 0.151546 +Converged at iteration 27, L1 7.08009e-05, Linf 0.00582932, total time[s] 0.093983 +Converged at iteration 30, L1 9.96812e-05, Linf 0.00610013, total time[s] 0.083805 +Converged at iteration 26, L1 9.25787e-05, Linf 0.00642484, total time[s] 0.071486 +Converged at iteration 22, L1 6.36176e-05, Linf 0.00421937, total time[s] 0.070752 +Converged at iteration 20, L1 6.9939e-05, Linf 0.00497481, total time[s] 0.068431 +Converged at iteration 22, L1 8.03018e-05, Linf 0.00709287, total time[s] 0.07405 +Converged at iteration 27, L1 6.42093e-05, Linf 0.00512248, total time[s] 0.09377 +Converged at iteration 25, L1 9.78546e-05, Linf 0.00978073, total time[s] 0.087929 +Converged at iteration 21, L1 5.93674e-05, Linf 0.0046315, total time[s] 0.069868 +Converged at iteration 17, L1 9.26535e-05, Linf 0.00515716, total time[s] 0.063984 +Converged at iteration 31, L1 8.93445e-05, Linf 0.00295158, total time[s] 0.082969 +Converged at iteration 20, L1 6.74226e-05, Linf 0.00513421, total time[s] 0.054047 +Converged at iteration 24, L1 6.06626e-05, Linf 0.00551894, total time[s] 0.06307 +Converged at iteration 28, L1 9.17417e-05, Linf 0.00414438, total time[s] 0.072292 +Converged at iteration 24, L1 8.29838e-05, Linf 0.00602601, total time[s] 0.062649 +Converged at iteration 22, L1 8.74421e-05, Linf 0.004384, total time[s] 0.058429 +Converged at iteration 23, L1 8.23018e-05, Linf 0.00356134, total time[s] 0.060632 +Converged at iteration 25, L1 8.92316e-05, Linf 0.00580917, total time[s] 0.0668 +Converged at iteration 28, L1 9.8282e-05, Linf 0.00588185, total time[s] 0.072809 +Converged at iteration 30, L1 9.44018e-05, Linf 0.00495794, total time[s] 0.083288 +Converged at iteration 29, L1 7.62201e-05, Linf 0.00309395, total time[s] 0.079279 +Converged at iteration 29, L1 9.06916e-05, Linf 0.00312416, total time[s] 0.199762 +Converged at iteration 31, L1 8.03561e-05, Linf 0.00323295, total time[s] 0.091032 +Converged at iteration 32, L1 8.61274e-05, Linf 0.00446954, total time[s] 0.088567 +Converged at iteration 33, L1 6.89368e-05, Linf 0.00508028, total time[s] 0.08478 +Converged at iteration 28, L1 8.39038e-05, Linf 0.00456305, total time[s] 0.072213 +Converged at iteration 24, L1 8.98979e-05, Linf 0.00305916, total time[s] 0.062572 +Converged at iteration 25, L1 7.40939e-05, Linf 0.0041019, total time[s] 0.066835 +Converged at iteration 39, L1 9.10545e-05, Linf 0.00525216, total time[s] 0.100943 +Converged at iteration 36, L1 6.77373e-05, Linf 0.00369481, total time[s] 0.10028 +Converged at iteration 27, L1 7.20849e-05, Linf 0.0058661, total time[s] 0.078123 +Converged at iteration 30, L1 9.81722e-05, Linf 0.0061002, total time[s] 0.078083 +Converged at iteration 26, L1 9.18203e-05, Linf 0.00641511, total time[s] 0.068033 +Converged at iteration 22, L1 6.34648e-05, Linf 0.00421411, total time[s] 0.060569 +Converged at iteration 20, L1 7.03993e-05, Linf 0.00495646, total time[s] 0.05609 +Converged at iteration 22, L1 8.15254e-05, Linf 0.00702521, total time[s] 0.065201 +Converged at iteration 27, L1 6.44952e-05, Linf 0.00516357, total time[s] 0.079423 +Converged at iteration 25, L1 9.60304e-05, Linf 0.0047492, total time[s] 0.080687 +Converged at iteration 21, L1 5.97782e-05, Linf 0.00462859, total time[s] 0.072096 +Converged at iteration 17, L1 9.31408e-05, Linf 0.00515132, total time[s] 0.065773 +Converged at iteration 31, L1 8.91149e-05, Linf 0.00294801, total time[s] 0.105529 +Converged at iteration 20, L1 6.75451e-05, Linf 0.00505023, total time[s] 0.070261 +Converged at iteration 24, L1 6.17728e-05, Linf 0.00554856, total time[s] 0.066726 +Converged at iteration 28, L1 9.24296e-05, Linf 0.00414566, total time[s] 0.084456 +Converged at iteration 24, L1 8.33251e-05, Linf 0.00602114, total time[s] 0.076116 +Converged at iteration 22, L1 8.75649e-05, Linf 0.00439148, total time[s] 0.066113 +Converged at iteration 23, L1 8.26576e-05, Linf 0.00352607, total time[s] 0.063052 +Converged at iteration 25, L1 8.96117e-05, Linf 0.00581188, total time[s] 0.071997 +Converged at iteration 28, L1 9.84335e-05, Linf 0.00594973, total time[s] 0.082478 +Converged at iteration 30, L1 9.48729e-05, Linf 0.00499049, total time[s] 0.088199 +Converged at iteration 29, L1 7.67197e-05, Linf 0.00312737, total time[s] 0.0757 +Converged at iteration 29, L1 9.01773e-05, Linf 0.00313493, total time[s] 0.077347 +Converged at iteration 31, L1 8.08134e-05, Linf 0.00325013, total time[s] 0.08193 +Converged at iteration 32, L1 8.77852e-05, Linf 0.00453154, total time[s] 0.087537 +Converged at iteration 33, L1 6.9128e-05, Linf 0.00514415, total time[s] 0.085165 +Converged at iteration 28, L1 8.43126e-05, Linf 0.00460738, total time[s] 0.0733 +Converged at iteration 24, L1 8.98097e-05, Linf 0.00302101, total time[s] 0.066666 +Converged at iteration 25, L1 7.47132e-05, Linf 0.00412208, total time[s] 0.067999 +Converged at iteration 39, L1 9.13488e-05, Linf 0.00525143, total time[s] 0.103447 +Converged at iteration 36, L1 6.8032e-05, Linf 0.00369816, total time[s] 0.097241 +Converged at iteration 27, L1 7.15639e-05, Linf 0.00584739, total time[s] 0.082076 +Converged at iteration 30, L1 9.88363e-05, Linf 0.00610015, total time[s] 0.077943 +Converged at iteration 26, L1 9.1953e-05, Linf 0.00649037, total time[s] 0.068754 +Converged at iteration 22, L1 6.36359e-05, Linf 0.00426944, total time[s] 0.059949 +Converged at iteration 20, L1 7.04283e-05, Linf 0.00497916, total time[s] 0.054799 +Converged at iteration 22, L1 8.09217e-05, Linf 0.00705814, total time[s] 0.058853 +Converged at iteration 27, L1 6.41593e-05, Linf 0.00515605, total time[s] 0.070756 +Converged at iteration 25, L1 9.62253e-05, Linf 0.00475214, total time[s] 0.06643 +Converged at iteration 21, L1 5.96117e-05, Linf 0.00463007, total time[s] 0.059167 +Converged at iteration 17, L1 9.28896e-05, Linf 0.00515741, total time[s] 0.055721 +Converged at iteration 31, L1 8.91729e-05, Linf 0.00294979, total time[s] 0.084703 +Converged at iteration 20, L1 6.73846e-05, Linf 0.00504755, total time[s] 0.056858 +Converged at iteration 24, L1 6.06627e-05, Linf 0.00493772, total time[s] 0.087204 +Converged at iteration 28, L1 9.20962e-05, Linf 0.00418289, total time[s] 0.075044 +Converged at iteration 24, L1 8.31718e-05, Linf 0.00603224, total time[s] 0.066593 +Converged at iteration 22, L1 8.74913e-05, Linf 0.00439171, total time[s] 0.062893 +Converged at iteration 23, L1 8.24514e-05, Linf 0.00351465, total time[s] 0.06345 +Converged at iteration 25, L1 8.93516e-05, Linf 0.00581103, total time[s] 0.068566 +Converged at iteration 28, L1 9.83598e-05, Linf 0.0059464, total time[s] 0.081256 +Converged at iteration 30, L1 9.4643e-05, Linf 0.00500009, total time[s] 0.080585 +Converged at iteration 29, L1 7.64691e-05, Linf 0.00313852, total time[s] 0.080241 +Converged at iteration 29, L1 9.02362e-05, Linf 0.00313645, total time[s] 0.077623 +Converged at iteration 31, L1 8.05018e-05, Linf 0.00324165, total time[s] 0.085035 +Converged at iteration 32, L1 8.68698e-05, Linf 0.00449799, total time[s] 0.086772 +Converged at iteration 33, L1 6.90204e-05, Linf 0.00508178, total time[s] 0.091792 +Converged at iteration 28, L1 8.39175e-05, Linf 0.00456157, total time[s] 0.07473 +Converged at iteration 24, L1 8.98122e-05, Linf 0.00302658, total time[s] 0.065532 +Converged at iteration 25, L1 7.43831e-05, Linf 0.00411196, total time[s] 0.068056 +Converged at iteration 40, L1 6.7149e-05, Linf 0.00367456, total time[s] 0.115786 +Converged at iteration 35, L1 7.62617e-05, Linf 0.00339555, total time[s] 0.109052 +Converged at iteration 30, L1 9.65693e-05, Linf 0.00430061, total time[s] 0.082909 +Converged at iteration 31, L1 6.19736e-05, Linf 0.00502563, total time[s] 0.087183 +Converged at iteration 27, L1 6.31423e-05, Linf 0.00499516, total time[s] 0.078134 +Converged at iteration 22, L1 8.59139e-05, Linf 0.00448849, total time[s] 0.079643 +Converged at iteration 20, L1 9.60782e-05, Linf 0.00397932, total time[s] 0.081244 +Converged at iteration 24, L1 8.84727e-05, Linf 0.00482861, total time[s] 0.094899 +Converged at iteration 28, L1 7.41257e-05, Linf 0.00445907, total time[s] 0.10814 +Converged at iteration 26, L1 8.15246e-05, Linf 0.00546965, total time[s] 0.120033 +Converged at iteration 22, L1 7.38683e-05, Linf 0.00508743, total time[s] 0.106948 +Converged at iteration 19, L1 6.6187e-05, Linf 0.00393203, total time[s] 0.080476 +Converged at iteration 30, L1 7.98779e-05, Linf 0.00329632, total time[s] 0.1141 +Converged at iteration 20, L1 8.44479e-05, Linf 0.00454691, total time[s] 0.063966 +Converged at iteration 24, L1 7.10844e-05, Linf 0.00463337, total time[s] 0.07225 +Converged at iteration 31, L1 8.97181e-05, Linf 0.00569027, total time[s] 0.084636 +Converged at iteration 27, L1 9.9242e-05, Linf 0.00569818, total time[s] 0.080029 +Converged at iteration 24, L1 8.7959e-05, Linf 0.00468865, total time[s] 0.068445 +Converged at iteration 23, L1 9.2459e-05, Linf 0.0041019, total time[s] 0.068217 +Converged at iteration 26, L1 7.27017e-05, Linf 0.00446111, total time[s] 0.076002 +Converged at iteration 29, L1 7.84532e-05, Linf 0.00478218, total time[s] 0.077943 +Converged at iteration 34, L1 7.09348e-05, Linf 0.00422705, total time[s] 0.08841 +Converged at iteration 30, L1 9.39707e-05, Linf 0.0044975, total time[s] 0.080963 +Converged at iteration 28, L1 9.49884e-05, Linf 0.0031098, total time[s] 0.076813 +Converged at iteration 32, L1 9.39326e-05, Linf 0.00374078, total time[s] 0.089959 +Converged at iteration 37, L1 7.34138e-05, Linf 0.003277, total time[s] 0.10511 +Converged at iteration 33, L1 8.45738e-05, Linf 0.0046451, total time[s] 0.094474 +Converged at iteration 28, L1 9.6548e-05, Linf 0.00430154, total time[s] 0.072187 +Converged at iteration 24, L1 8.82894e-05, Linf 0.00325072, total time[s] 0.067497 +Converged at iteration 26, L1 9.03678e-05, Linf 0.00382016, total time[s] 0.070556 +Converged at iteration 36, L1 6.58624e-05, Linf 0.0138195, total time[s] 0.092253 +Converged at iteration 35, L1 7.20796e-05, Linf 0.00604335, total time[s] 0.09024 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.18697 +Converged at iteration 30, L1 6.63306e-05, Linf 0.0269319, total time[s] 0.08437 +Converged at iteration 24, L1 5.93582e-05, Linf 0.00623864, total time[s] 0.06458 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.17599 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.1838 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.17843 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.18655 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.18134 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.17502 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.18566 +Converged at iteration 45, L1 5.17582e-05, Linf 0.00771279, total time[s] 0.116768 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.17734 +Converged at iteration 24, L1 4.78544e-05, Linf 0.0043988, total time[s] 0.066351 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.26643 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.46066 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.37817 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.21855 +Converged at iteration 25, L1 7.21645e-05, Linf 0.0236706, total time[s] 0.091554 +Converged at iteration 28, L1 6.74469e-05, Linf 0.0107483, total time[s] 0.100746 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.18652 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.36576 +Converged at iteration 34, L1 5.33085e-05, Linf 0.00170591, total time[s] 0.107225 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.45776 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.32466 +Converged at iteration 32, L1 5.95714e-05, Linf 0.0157259, total time[s] 0.091097 +Converged at iteration 30, L1 9.69133e-05, Linf 0.00391054, total time[s] 0.077225 +Converged at iteration 27, L1 8.12468e-05, Linf 0.0124204, total time[s] 0.070465 +Converged at iteration 500, L1 nan, Linf 0, total time[s] 1.18651 +Converged at iteration 37, L1 3.75846e-05, Linf 0.0111401, total time[s] 0.111345 +Converged at iteration 36, L1 3.30709e-05, Linf 0.00934154, total time[s] 0.108101 +Converged at iteration 32, L1 4.5884e-05, Linf 0.0063843, total time[s] 0.089801 +Converged at iteration 30, L1 2.14845e-05, Linf 0.0117435, total time[s] 0.082095 +Converged at iteration 24, L1 5.25719e-05, Linf 0.00868257, total time[s] 0.063244 +Converged at iteration 23, L1 5.89518e-05, Linf 0.00444135, total time[s] 0.068664 +Converged at iteration 27, L1 3.59439e-05, Linf 0.0109175, total time[s] 0.095814 +Converged at iteration 27, L1 7.4443e-05, Linf 0.0169448, total time[s] 0.09606 +Converged at iteration 26, L1 4.61949e-05, Linf 0.00695382, total time[s] 0.116723 +Converged at iteration 26, L1 8.7198e-05, Linf 0.0136448, total time[s] 0.073885 +Converged at iteration 25, L1 9.55741e-05, Linf 0.012782, total time[s] 0.087627 +Converged at iteration 28, L1 9.00403e-05, Linf 0.00575797, total time[s] 0.089156 +Converged at iteration 34, L1 8.36017e-05, Linf 0.0363004, total time[s] 0.087327 +Converged at iteration 24, L1 8.32782e-05, Linf 0.00119595, total time[s] 0.065504 +Converged at iteration 22, L1 6.4208e-05, Linf 0.00452791, total time[s] 0.066168 +Converged at iteration 29, L1 9.64625e-05, Linf 0.0147692, total time[s] 0.07782 +Converged at iteration 31, L1 7.86352e-05, Linf 0.012414, total time[s] 0.102792 +Converged at iteration 30, L1 4.39081e-05, Linf 0.00729339, total time[s] 0.095529 +Converged at iteration 23, L1 6.44021e-05, Linf 0.00251281, total time[s] 0.081714 +Converged at iteration 22, L1 6.88206e-05, Linf 0.00309361, total time[s] 0.0855 +Converged at iteration 28, L1 5.66472e-05, Linf 0.00916378, total time[s] 0.101652 +Converged at iteration 30, L1 9.89778e-05, Linf 0.00442986, total time[s] 0.100551 +Converged at iteration 31, L1 9.94262e-05, Linf 0.0124759, total time[s] 0.084327 +Converged at iteration 32, L1 4.57584e-05, Linf 0.00285666, total time[s] 0.082422 +Converged at iteration 33, L1 6.01437e-05, Linf 0.0155608, total time[s] 0.084871 +Converged at iteration 33, L1 4.77366e-05, Linf 0.00601583, total time[s] 0.084215 +Converged at iteration 33, L1 3.18455e-05, Linf 0.013955, total time[s] 0.088035 +Converged at iteration 29, L1 5.88914e-05, Linf 0.0193376, total time[s] 0.080887 +Converged at iteration 26, L1 6.55048e-05, Linf 0.0112017, total time[s] 0.067463 +Converged at iteration 31, L1 4.5712e-05, Linf 0.0144892, total time[s] 0.078902 +Converged at iteration 38, L1 2.64428e-05, Linf 0.0101619, total time[s] 0.099811 +Converged at iteration 36, L1 9.11438e-05, Linf 0.037467, total time[s] 0.103556 +Converged at iteration 29, L1 3.99864e-05, Linf 0.00405595, total time[s] 0.076536 +Converged at iteration 30, L1 2.68006e-05, Linf 0.0154579, total time[s] 0.085659 +Converged at iteration 23, L1 8.18013e-05, Linf 0.00428839, total time[s] 0.067197 +Converged at iteration 40, L1 6.82066e-05, Linf 0.0036743, total time[s] 0.160075 +Converged at iteration 35, L1 7.62238e-05, Linf 0.00339739, total time[s] 0.139431 +Converged at iteration 30, L1 9.68132e-05, Linf 0.00432343, total time[s] 0.112206 +Converged at iteration 31, L1 6.202e-05, Linf 0.00502564, total time[s] 0.101167 +Converged at iteration 27, L1 6.26376e-05, Linf 0.00499524, total time[s] 0.095598 +Converged at iteration 22, L1 8.62706e-05, Linf 0.0045698, total time[s] 0.126054 +Converged at iteration 20, L1 9.61523e-05, Linf 0.00397894, total time[s] 0.109045 +Converged at iteration 24, L1 8.83829e-05, Linf 0.00482777, total time[s] 0.069831 +Converged at iteration 28, L1 7.38891e-05, Linf 0.00446942, total time[s] 0.085254 +Converged at iteration 26, L1 8.15582e-05, Linf 0.00547565, total time[s] 0.071496 +Converged at iteration 22, L1 7.39241e-05, Linf 0.00508726, total time[s] 0.066355 +Converged at iteration 19, L1 6.63475e-05, Linf 0.00393113, total time[s] 0.059021 +Converged at iteration 30, L1 7.98734e-05, Linf 0.00329634, total time[s] 0.085686 +Converged at iteration 20, L1 8.4432e-05, Linf 0.00455018, total time[s] 0.055419 +Converged at iteration 24, L1 7.20847e-05, Linf 0.00462919, total time[s] 0.063821 +Converged at iteration 31, L1 8.96474e-05, Linf 0.00569491, total time[s] 0.079085 +Converged at iteration 27, L1 9.91418e-05, Linf 0.00571927, total time[s] 0.069569 +Converged at iteration 24, L1 8.79691e-05, Linf 0.00465016, total time[s] 0.064184 +Converged at iteration 23, L1 9.2176e-05, Linf 0.0041019, total time[s] 0.061926 +Converged at iteration 26, L1 7.22107e-05, Linf 0.00446091, total time[s] 0.070014 +Converged at iteration 29, L1 7.81432e-05, Linf 0.00479567, total time[s] 0.075086 +Converged at iteration 34, L1 7.09283e-05, Linf 0.00422676, total time[s] 0.085758 +Converged at iteration 30, L1 9.39589e-05, Linf 0.0044262, total time[s] 0.07815 +Converged at iteration 28, L1 9.50373e-05, Linf 0.0031134, total time[s] 0.072693 +Converged at iteration 32, L1 9.4222e-05, Linf 0.00374124, total time[s] 0.08229 +Converged at iteration 37, L1 7.45091e-05, Linf 0.00327645, total time[s] 0.092578 +Converged at iteration 33, L1 8.45274e-05, Linf 0.00469124, total time[s] 0.084347 +Converged at iteration 28, L1 9.65501e-05, Linf 0.00430196, total time[s] 0.079801 +Converged at iteration 24, L1 8.82897e-05, Linf 0.00325071, total time[s] 0.066401 +Converged at iteration 26, L1 8.99835e-05, Linf 0.0038417, total time[s] 0.07088 +Converged at iteration 37, L1 8.56503e-05, Linf 0.0352341, total time[s] 0.094293 +Converged at iteration 36, L1 6.93687e-05, Linf 0.0285, total time[s] 0.090209 +Converged at iteration 29, L1 8.77978e-05, Linf 0.00985591, total time[s] 0.076306 +Converged at iteration 30, L1 3.51133e-05, Linf 0.0196343, total time[s] 0.078144 +Converged at iteration 23, L1 9.88876e-05, Linf 0.00529717, total time[s] 0.061696 +Converged at iteration 31, L1 9.49065e-05, Linf 0.00152169, total time[s] 0.0811 +Converged at iteration 24, L1 7.16374e-05, Linf 0.0353908, total time[s] 0.063317 +Converged at iteration 25, L1 7.78851e-05, Linf 0.0185296, total time[s] 0.065702 +Converged at iteration 24, L1 6.79386e-05, Linf 0.00631267, total time[s] 0.064559 +Converged at iteration 25, L1 8.45612e-05, Linf 0.0111289, total time[s] 0.067442 +Converged at iteration 24, L1 4.83467e-05, Linf 0.00536463, total time[s] 0.070794 +Converged at iteration 24, L1 8.36544e-05, Linf 0.0108398, total time[s] 0.065571 +Converged at iteration 34, L1 8.41353e-05, Linf 0.026445, total time[s] 0.088189 +Converged at iteration 21, L1 6.09412e-05, Linf 0.00552615, total time[s] 0.057135 +Converged at iteration 22, L1 7.67833e-05, Linf 0.00719876, total time[s] 0.059393 +Converged at iteration 28, L1 8.24428e-05, Linf 0.0097504, total time[s] 0.073096 +Converged at iteration 29, L1 8.90502e-05, Linf 0.00698751, total time[s] 0.075041 +Converged at iteration 27, L1 6.6325e-05, Linf 0.00924277, total time[s] 0.071231 +Converged at iteration 23, L1 6.17051e-05, Linf 0.00441748, total time[s] 0.061803 +Converged at iteration 23, L1 6.58476e-05, Linf 0.00433717, total time[s] 0.061273 +Converged at iteration 28, L1 6.87745e-05, Linf 0.0112921, total time[s] 0.073279 +Converged at iteration 30, L1 5.98983e-05, Linf 0.00696743, total time[s] 0.077015 +Converged at iteration 28, L1 7.52002e-05, Linf 0.0076019, total time[s] 0.072123 +Converged at iteration 31, L1 5.32821e-05, Linf 0.0148306, total time[s] 0.080351 +Converged at iteration 32, L1 7.09956e-05, Linf 0.0181465, total time[s] 0.082718 +Converged at iteration 32, L1 6.07716e-05, Linf 0.0085812, total time[s] 0.08298 +Converged at iteration 33, L1 4.27754e-05, Linf 0.017932, total time[s] 0.086133 +Converged at iteration 30, L1 6.13973e-05, Linf 0.00368453, total time[s] 0.078975 +Converged at iteration 25, L1 9.0164e-05, Linf 0.0116184, total time[s] 0.06589 +Converged at iteration 29, L1 5.36253e-05, Linf 0.00992759, total time[s] 0.075341 +Converged at iteration 38, L1 9.3321e-05, Linf 0.0318768, total time[s] 0.0968 +Converged at iteration 37, L1 5.20732e-05, Linf 0.0244862, total time[s] 0.161322 +Converged at iteration 27, L1 3.77858e-05, Linf 0.00549384, total time[s] 0.081209 +Converged at iteration 29, L1 4.43774e-05, Linf 0.0160517, total time[s] 0.075541 +Converged at iteration 22, L1 7.73263e-05, Linf 0.00425205, total time[s] 0.062119 +Converged at iteration 22, L1 6.30246e-05, Linf 0.00377465, total time[s] 0.061297 +Converged at iteration 22, L1 2.95445e-05, Linf 0.00779494, total time[s] 0.05942 +Converged at iteration 23, L1 5.47592e-05, Linf 0.0094256, total time[s] 0.064017 +Converged at iteration 23, L1 8.38395e-05, Linf 0.00423528, total time[s] 0.077011 +Converged at iteration 24, L1 8.82508e-05, Linf 0.00772531, total time[s] 0.09197 +Converged at iteration 22, L1 7.17738e-05, Linf 0.00601122, total time[s] 0.057829 +Converged at iteration 22, L1 5.74095e-05, Linf 0.00294919, total time[s] 0.062272 +Converged at iteration 34, L1 4.93823e-05, Linf 0.0125152, total time[s] 0.083529 +Converged at iteration 21, L1 5.88371e-05, Linf 0.00486957, total time[s] 0.054228 +Converged at iteration 23, L1 6.39018e-05, Linf 0.00466624, total time[s] 0.05947 +Converged at iteration 28, L1 8.98343e-05, Linf 0.00244129, total time[s] 0.071186 +Converged at iteration 28, L1 5.11405e-05, Linf 0.00486615, total time[s] 0.070627 +Converged at iteration 24, L1 9.55614e-05, Linf 0.00559775, total time[s] 0.061742 +Converged at iteration 24, L1 6.38928e-05, Linf 0.0045461, total time[s] 0.061386 +Converged at iteration 24, L1 8.45271e-05, Linf 0.00807809, total time[s] 0.062154 +Converged at iteration 28, L1 9.96619e-05, Linf 0.0108126, total time[s] 0.0703 +Converged at iteration 30, L1 7.3833e-05, Linf 0.00716168, total time[s] 0.075421 +Converged at iteration 28, L1 6.89899e-05, Linf 0.00235805, total time[s] 0.074428 +Converged at iteration 31, L1 5.26361e-05, Linf 0.0118331, total time[s] 0.104843 +Converged at iteration 31, L1 8.57667e-05, Linf 0.0101157, total time[s] 0.08979 +Converged at iteration 31, L1 4.97227e-05, Linf 0.00718627, total time[s] 0.079918 +Converged at iteration 34, L1 2.71196e-05, Linf 0.0166623, total time[s] 0.084907 +Converged at iteration 28, L1 5.74665e-05, Linf 0.00612209, total time[s] 0.071819 +Converged at iteration 25, L1 9.00425e-05, Linf 0.00589169, total time[s] 0.06511 +Converged at iteration 26, L1 9.88479e-05, Linf 0.00849063, total time[s] 0.067519 +Converged at iteration 38, L1 7.13802e-05, Linf 0.0105812, total time[s] 0.102472 +Converged at iteration 38, L1 5.10489e-05, Linf 0.00745563, total time[s] 0.111979 +Converged at iteration 33, L1 9.03074e-05, Linf 0.00122388, total time[s] 0.093202 +Converged at iteration 28, L1 8.38989e-05, Linf 0.00455761, total time[s] 0.075979 +Converged at iteration 32, L1 3.04913e-05, Linf 0.0130479, total time[s] 0.087359 +Converged at iteration 32, L1 2.24376e-05, Linf 0.0131115, total time[s] 0.086197 +Converged at iteration 28, L1 9.3675e-05, Linf 0.0062886, total time[s] 0.073366 +Converged at iteration 28, L1 7.14383e-05, Linf 0.00442333, total time[s] 0.073427 +Converged at iteration 29, L1 7.67752e-05, Linf 0.0179275, total time[s] 0.079994 +Converged at iteration 28, L1 7.76341e-05, Linf 0.00115993, total time[s] 0.074966 +Converged at iteration 31, L1 8.60154e-05, Linf 0.00303023, total time[s] 0.082899 +Converged at iteration 36, L1 9.63696e-05, Linf 0.00208228, total time[s] 0.091495 +Converged at iteration 34, L1 8.81738e-05, Linf 0.00609157, total time[s] 0.117718 +Converged at iteration 30, L1 8.96429e-05, Linf 0.00159767, total time[s] 0.079471 +Converged at iteration 24, L1 7.38745e-05, Linf 0.00365232, total time[s] 0.06517 +Converged at iteration 33, L1 8.28924e-05, Linf 0.0936521, total time[s] 0.11359 +Converged at iteration 32, L1 7.97141e-05, Linf 0.00146353, total time[s] 0.081683 +Converged at iteration 31, L1 8.47719e-05, Linf 0.00139944, total time[s] 0.078561 +Converged at iteration 32, L1 9.61163e-05, Linf 0.00168568, total time[s] 0.080919 +Converged at iteration 27, L1 7.58699e-05, Linf 0.00130321, total time[s] 0.070044 +Converged at iteration 33, L1 7.21689e-05, Linf 0.00268076, total time[s] 0.083933 +Converged at iteration 35, L1 8.91683e-05, Linf 0.00266805, total time[s] 0.088771 +Converged at iteration 35, L1 9.36501e-05, Linf 0.00163982, total time[s] 0.088493 +Converged at iteration 31, L1 7.89559e-05, Linf 0.00344271, total time[s] 0.079065 +Converged at iteration 34, L1 9.58974e-05, Linf 0.00140783, total time[s] 0.085834 +Converged at iteration 36, L1 8.69005e-05, Linf 0.00184294, total time[s] 0.09061 +Converged at iteration 39, L1 8.52561e-05, Linf 0.0245898, total time[s] 0.09756 +Converged at iteration 37, L1 3.73919e-05, Linf 0.0129522, total time[s] 0.095179 +Converged at iteration 30, L1 2.86968e-05, Linf 0.00340593, total time[s] 0.076812 +Converged at iteration 31, L1 6.75344e-05, Linf 0.00173803, total time[s] 0.078802 +Converged at iteration 35, L1 8.95007e-05, Linf 0.00471318, total time[s] 0.088422 +Converged at iteration 35, L1 5.71553e-05, Linf 0.0154306, total time[s] 0.090452 +Converged at iteration 31, L1 5.37843e-05, Linf 0.0160751, total time[s] 0.079082 +Converged at iteration 25, L1 7.44706e-05, Linf 0.00472778, total time[s] 0.065137 +Converged at iteration 27, L1 5.81009e-05, Linf 0.014184, total time[s] 0.070957 +Converged at iteration 28, L1 4.02541e-05, Linf 0.022391, total time[s] 0.072149 +Converged at iteration 26, L1 6.59986e-05, Linf 0.00304988, total time[s] 0.069535 +Converged at iteration 27, L1 5.11276e-05, Linf 0.0191244, total time[s] 0.069885 +Converged at iteration 27, L1 5.55536e-05, Linf 0.0281219, total time[s] 0.069184 +Converged at iteration 26, L1 8.90777e-05, Linf 0.00355754, total time[s] 0.072179 +Converged at iteration 30, L1 8.08021e-05, Linf 0.0053751, total time[s] 0.087003 +Converged at iteration 30, L1 7.93556e-05, Linf 0.00112568, total time[s] 0.07937 +Converged at iteration 32, L1 4.63122e-05, Linf 0.00523687, total time[s] 0.08213 +Converged at iteration 25, L1 8.23053e-05, Linf 0.00249614, total time[s] 0.06672 +Converged at iteration 22, L1 7.44798e-05, Linf 0.0131016, total time[s] 0.05984 +Converged at iteration 27, L1 6.86452e-05, Linf 0.0187335, total time[s] 0.072459 +Converged at iteration 30, L1 6.13456e-05, Linf 0.0151017, total time[s] 0.076143 +Converged at iteration 29, L1 8.15936e-05, Linf 0.0116925, total time[s] 0.074915 +Converged at iteration 26, L1 7.56575e-05, Linf 0.00393252, total time[s] 0.066847 +Converged at iteration 26, L1 5.69509e-05, Linf 0.00460568, total time[s] 0.069237 +Converged at iteration 27, L1 7.30554e-05, Linf 0.00610575, total time[s] 0.069223 +Converged at iteration 31, L1 5.64065e-05, Linf 0.00769639, total time[s] 0.084693 +Converged at iteration 32, L1 5.63279e-05, Linf 0.00313744, total time[s] 0.09044 +Converged at iteration 29, L1 5.75587e-05, Linf 0.00521907, total time[s] 0.086011 +Converged at iteration 31, L1 5.7138e-05, Linf 0.00999591, total time[s] 0.105341 +Converged at iteration 32, L1 9.1182e-05, Linf 0.0226981, total time[s] 0.088828 +Converged at iteration 36, L1 3.37463e-05, Linf 0.0157778, total time[s] 0.095018 +Converged at iteration 33, L1 4.74114e-05, Linf 0.0170556, total time[s] 0.096124 +Converged at iteration 26, L1 4.10855e-05, Linf 0.00518301, total time[s] 0.070018 +Converged at iteration 29, L1 7.71942e-05, Linf 0.0147054, total time[s] 0.07583 +Converged at iteration 35, L1 7.06959e-05, Linf 0.0199076, total time[s] 0.090741 +Converged at iteration 35, L1 7.44929e-05, Linf 0.0171469, total time[s] 0.131631 +Converged at iteration 30, L1 3.76883e-05, Linf 0.0146212, total time[s] 0.103785 +Converged at iteration 26, L1 7.63934e-05, Linf 0.0068561, total time[s] 0.068568 +Converged at iteration 22, L1 7.85889e-05, Linf 0.00380487, total time[s] 0.057988 +Converged at iteration 19, L1 7.19256e-05, Linf 0.00386301, total time[s] 0.052581 +Converged at iteration 28, L1 8.581e-05, Linf 0.00147545, total time[s] 0.076056 +Converged at iteration 26, L1 4.53452e-05, Linf 0.0191979, total time[s] 0.068397 +Converged at iteration 25, L1 9.79155e-05, Linf 0.033086, total time[s] 0.067266 +Converged at iteration 23, L1 7.89139e-05, Linf 0.00499918, total time[s] 0.0637 +Converged at iteration 24, L1 8.66112e-05, Linf 0.00202005, total time[s] 0.066119 +Converged at iteration 26, L1 8.74069e-05, Linf 0.00113831, total time[s] 0.072489 +Converged at iteration 31, L1 9.56129e-05, Linf 0.00781127, total time[s] 0.088962 +Converged at iteration 19, L1 8.747e-05, Linf 0.00600373, total time[s] 0.06754 +Converged at iteration 22, L1 7.82401e-05, Linf 0.00759563, total time[s] 0.09038 +Converged at iteration 26, L1 6.09779e-05, Linf 0.00121113, total time[s] 0.095089 +Converged at iteration 30, L1 7.69803e-05, Linf 0.00466531, total time[s] 0.096702 +Converged at iteration 28, L1 6.97361e-05, Linf 0.0173487, total time[s] 0.104768 +Converged at iteration 22, L1 9.25218e-05, Linf 0.00451573, total time[s] 0.085152 +Converged at iteration 25, L1 8.78802e-05, Linf 0.00556925, total time[s] 0.087318 +Converged at iteration 26, L1 9.77085e-05, Linf 0.00728617, total time[s] 0.090185 +Converged at iteration 28, L1 5.43523e-05, Linf 0.00521141, total time[s] 0.097269 +Converged at iteration 30, L1 4.69799e-05, Linf 0.00482448, total time[s] 0.113944 +Converged at iteration 29, L1 5.27669e-05, Linf 0.0132415, total time[s] 0.10338 +Converged at iteration 29, L1 5.87766e-05, Linf 0.0046225, total time[s] 0.09567 +Converged at iteration 29, L1 6.08861e-05, Linf 0.00869946, total time[s] 0.095955 +Converged at iteration 34, L1 3.54644e-05, Linf 0.0142281, total time[s] 0.092699 +Converged at iteration 23, L1 9.00303e-05, Linf 0.00224553, total time[s] 0.063786 +Converged at iteration 24, L1 7.26522e-05, Linf 0.00419534, total time[s] 0.065239 +Converged at iteration 28, L1 6.29181e-05, Linf 0.00792519, total time[s] 0.072976 +Converged at iteration 38, L1 2.49745e-05, Linf 0.0138927, total time[s] 0.117119 +Converged at iteration 36, L1 3.28081e-05, Linf 0.0170286, total time[s] 0.117397 +Converged at iteration 28, L1 7.58696e-05, Linf 0.0193298, total time[s] 0.080877 +Converged at iteration 28, L1 5.71163e-05, Linf 0.00893903, total time[s] 0.07848 +Converged at iteration 22, L1 9.56839e-05, Linf 0.00508775, total time[s] 0.067826 +Converged at iteration 21, L1 4.13262e-05, Linf 0.00533455, total time[s] 0.092232 +Converged at iteration 23, L1 8.22917e-05, Linf 0.0106782, total time[s] 0.090477 +Converged at iteration 25, L1 2.36844e-05, Linf 0.00739431, total time[s] 0.091242 +Converged at iteration 24, L1 6.3495e-05, Linf 0.00790639, total time[s] 0.094233 +Converged at iteration 23, L1 9.5252e-05, Linf 0.00722689, total time[s] 0.070827 +Converged at iteration 21, L1 9.15192e-05, Linf 0.00611735, total time[s] 0.069267 +Converged at iteration 24, L1 8.72662e-05, Linf 0.0201986, total time[s] 0.079493 +Converged at iteration 32, L1 2.68716e-05, Linf 0.00658174, total time[s] 0.084339 +Converged at iteration 20, L1 8.21146e-05, Linf 0.00817047, total time[s] 0.056145 +Converged at iteration 23, L1 5.9512e-05, Linf 0.00641187, total time[s] 0.061873 +Converged at iteration 25, L1 9.58855e-05, Linf 0.00416515, total time[s] 0.081699 +Converged at iteration 27, L1 7.94355e-05, Linf 0.0109341, total time[s] 0.088959 +Converged at iteration 26, L1 8.86365e-05, Linf 0.0130543, total time[s] 0.072792 +Converged at iteration 23, L1 7.58405e-05, Linf 0.00604032, total time[s] 0.06149 +Converged at iteration 25, L1 7.12663e-05, Linf 0.00659572, total time[s] 0.066517 +Converged at iteration 27, L1 9.92965e-05, Linf 0.00587536, total time[s] 0.071652 +Converged at iteration 28, L1 9.54691e-05, Linf 0.00526406, total time[s] 0.074063 +Converged at iteration 27, L1 6.59826e-05, Linf 0.00453492, total time[s] 0.071483 +Converged at iteration 30, L1 4.85573e-05, Linf 0.0145014, total time[s] 0.080036 +Converged at iteration 29, L1 8.7338e-05, Linf 0.00555254, total time[s] 0.076735 +Converged at iteration 29, L1 4.29163e-05, Linf 0.0044174, total time[s] 0.076291 +Converged at iteration 34, L1 2.5907e-05, Linf 0.0151788, total time[s] 0.087516 +Converged at iteration 24, L1 6.52494e-05, Linf 0.00257823, total time[s] 0.066425 +Converged at iteration 24, L1 6.00447e-05, Linf 0.00424132, total time[s] 0.065756 +Converged at iteration 26, L1 5.5969e-05, Linf 0.0069364, total time[s] 0.069311 +Converged at iteration 36, L1 8.12533e-05, Linf 0.0235204, total time[s] 0.095597 +Converged at iteration 35, L1 7.62923e-05, Linf 0.0217144, total time[s] 0.098213 +Converged at iteration 29, L1 5.70013e-05, Linf 0.0208807, total time[s] 0.077247 +Converged at iteration 27, L1 6.70112e-05, Linf 0.00738285, total time[s] 0.072384 +Converged at iteration 22, L1 7.85566e-05, Linf 0.00416806, total time[s] 0.060726 +Converged at iteration 20, L1 5.27569e-05, Linf 0.0050332, total time[s] 0.056158 +Converged at iteration 25, L1 9.19637e-05, Linf 0.00132118, total time[s] 0.069144 +Converged at iteration 25, L1 9.37359e-05, Linf 0.0454114, total time[s] 0.067428 +Converged at iteration 25, L1 3.25398e-05, Linf 0.00949534, total time[s] 0.069869 +Converged at iteration 23, L1 7.57391e-05, Linf 0.00585057, total time[s] 0.06205 +Converged at iteration 22, L1 9.2318e-05, Linf 0.0137151, total time[s] 0.059974 +Converged at iteration 25, L1 7.82642e-05, Linf 0.0172081, total time[s] 0.066517 +Converged at iteration 32, L1 2.36978e-05, Linf 0.00371453, total time[s] 0.083236 +Converged at iteration 20, L1 5.58186e-05, Linf 0.00426456, total time[s] 0.05444 +Converged at iteration 23, L1 6.3774e-05, Linf 0.00435783, total time[s] 0.061909 +Converged at iteration 25, L1 8.18323e-05, Linf 0.00416141, total time[s] 0.066695 +Converged at iteration 29, L1 6.73496e-05, Linf 0.00418127, total time[s] 0.075366 +Converged at iteration 27, L1 9.85428e-05, Linf 0.0182026, total time[s] 0.071008 +Converged at iteration 23, L1 6.25351e-05, Linf 0.00377566, total time[s] 0.061221 +Converged at iteration 25, L1 7.88425e-05, Linf 0.00492904, total time[s] 0.066312 +Converged at iteration 27, L1 7.68608e-05, Linf 0.0041596, total time[s] 0.071409 +Converged at iteration 28, L1 7.3817e-05, Linf 0.00299878, total time[s] 0.076549 +Converged at iteration 28, L1 9.90125e-05, Linf 0.0123333, total time[s] 0.073437 +Converged at iteration 29, L1 7.61076e-05, Linf 0.0141665, total time[s] 0.078254 +Converged at iteration 29, L1 6.2084e-05, Linf 0.00338679, total time[s] 0.075598 +Converged at iteration 27, L1 4.67399e-05, Linf 0.00399412, total time[s] 0.073515 +Converged at iteration 33, L1 7.8291e-05, Linf 0.0219972, total time[s] 0.105037 +Converged at iteration 23, L1 9.44694e-05, Linf 0.00310665, total time[s] 0.070188 +Converged at iteration 24, L1 5.35427e-05, Linf 0.00388568, total time[s] 0.067443 +Converged at iteration 27, L1 9.41429e-05, Linf 0.0139931, total time[s] 0.074001 +Converged at iteration 37, L1 4.33333e-05, Linf 0.0184134, total time[s] 0.092545 +Converged at iteration 35, L1 9.73517e-05, Linf 0.0231434, total time[s] 0.089216 +Converged at iteration 29, L1 3.39713e-05, Linf 0.00725084, total time[s] 0.075415 +Converged at iteration 27, L1 8.67129e-05, Linf 0.00909122, total time[s] 0.069063 +Converged at iteration 22, L1 8.36446e-05, Linf 0.00457585, total time[s] 0.057436 +Converged at iteration 20, L1 7.00542e-05, Linf 0.00752066, total time[s] 0.052975 +Converged at iteration 24, L1 9.13517e-05, Linf 0.0155252, total time[s] 0.067123 +Converged at iteration 25, L1 4.51346e-05, Linf 0.0181182, total time[s] 0.064028 +Converged at iteration 24, L1 7.90383e-05, Linf 0.0132385, total time[s] 0.06572 +Converged at iteration 23, L1 8.04262e-05, Linf 0.00645759, total time[s] 0.060687 +Converged at iteration 22, L1 5.26094e-05, Linf 0.00416335, total time[s] 0.061118 +Converged at iteration 24, L1 7.8316e-05, Linf 0.00111454, total time[s] 0.062815 +Converged at iteration 32, L1 2.3003e-05, Linf 0.00447286, total time[s] 0.08245 +Converged at iteration 20, L1 7.10451e-05, Linf 0.00944303, total time[s] 0.052689 +Converged at iteration 23, L1 6.09238e-05, Linf 0.00974395, total time[s] 0.059921 +Converged at iteration 25, L1 8.80778e-05, Linf 0.00318921, total time[s] 0.064353 +Converged at iteration 28, L1 6.64508e-05, Linf 0.00833588, total time[s] 0.076489 +Converged at iteration 27, L1 6.16366e-05, Linf 0.00888128, total time[s] 0.084736 +Converged at iteration 23, L1 6.61751e-05, Linf 0.00686476, total time[s] 0.067181 +Converged at iteration 25, L1 6.77335e-05, Linf 0.0102766, total time[s] 0.065167 +Converged at iteration 27, L1 8.22896e-05, Linf 0.00563342, total time[s] 0.069372 +Converged at iteration 28, L1 8.10222e-05, Linf 0.00401884, total time[s] 0.076841 +Converged at iteration 28, L1 5.26955e-05, Linf 0.0042304, total time[s] 0.077002 +Converged at iteration 29, L1 9.48803e-05, Linf 0.0184886, total time[s] 0.074321 +Converged at iteration 29, L1 6.02083e-05, Linf 0.00374814, total time[s] 0.073116 +Converged at iteration 27, L1 9.96538e-05, Linf 0.00283406, total time[s] 0.068676 +Converged at iteration 33, L1 7.97009e-05, Linf 0.0238083, total time[s] 0.086821 +Converged at iteration 23, L1 9.84908e-05, Linf 0.00329636, total time[s] 0.074197 +Converged at iteration 24, L1 5.36619e-05, Linf 0.00397888, total time[s] 0.070952 +Converged at iteration 27, L1 4.50064e-05, Linf 0.00383114, total time[s] 0.093103 +Converged at iteration 37, L1 2.71882e-05, Linf 0.0139717, total time[s] 0.109665 +Converged at iteration 35, L1 8.64774e-05, Linf 0.0230375, total time[s] 0.13209 +Converged at iteration 29, L1 5.20116e-05, Linf 0.0128501, total time[s] 0.080264 +Converged at iteration 27, L1 6.95237e-05, Linf 0.00837346, total time[s] 0.073438 +Converged at iteration 22, L1 7.97893e-05, Linf 0.00435133, total time[s] 0.062169 +Converged at iteration 20, L1 6.8544e-05, Linf 0.00610965, total time[s] 0.069843 +Converged at iteration 25, L1 9.15501e-05, Linf 0.00208178, total time[s] 0.072878 +Converged at iteration 25, L1 6.47861e-05, Linf 0.0382092, total time[s] 0.075019 +Converged at iteration 24, L1 9.4109e-05, Linf 0.0170059, total time[s] 0.074073 +Converged at iteration 23, L1 7.6704e-05, Linf 0.00612787, total time[s] 0.086539 +Converged at iteration 22, L1 6.85476e-05, Linf 0.0083007, total time[s] 0.065725 +Converged at iteration 24, L1 8.78627e-05, Linf 0.0010724, total time[s] 0.073224 +Converged at iteration 32, L1 2.31632e-05, Linf 0.0040079, total time[s] 0.086559 +Converged at iteration 20, L1 6.19721e-05, Linf 0.00660779, total time[s] 0.058933 +Converged at iteration 23, L1 6.1535e-05, Linf 0.00443137, total time[s] 0.060803 +Converged at iteration 25, L1 8.28063e-05, Linf 0.00383788, total time[s] 0.065283 +Converged at iteration 28, L1 8.63335e-05, Linf 0.0125435, total time[s] 0.07241 +Converged at iteration 27, L1 7.70751e-05, Linf 0.011159, total time[s] 0.070457 +Converged at iteration 23, L1 6.52167e-05, Linf 0.0082585, total time[s] 0.060277 +Converged at iteration 25, L1 7.54369e-05, Linf 0.00907328, total time[s] 0.065271 +Converged at iteration 27, L1 7.68428e-05, Linf 0.00564876, total time[s] 0.069782 +Converged at iteration 28, L1 7.7717e-05, Linf 0.00333599, total time[s] 0.072346 +Converged at iteration 28, L1 7.63569e-05, Linf 0.0103222, total time[s] 0.072477 +Converged at iteration 40, L1 6.71416e-05, Linf 0.00367458, total time[s] 0.122132 +Converged at iteration 35, L1 7.60923e-05, Linf 0.00339718, total time[s] 0.112117 +Converged at iteration 30, L1 9.63136e-05, Linf 0.00432574, total time[s] 0.1169 +Converged at iteration 31, L1 6.2015e-05, Linf 0.00502563, total time[s] 0.108827 +Converged at iteration 27, L1 6.25893e-05, Linf 0.00499545, total time[s] 0.083315 +Converged at iteration 22, L1 8.59612e-05, Linf 0.00448813, total time[s] 0.075242 +Converged at iteration 20, L1 9.61104e-05, Linf 0.00397859, total time[s] 0.066009 +Converged at iteration 24, L1 8.84117e-05, Linf 0.00482929, total time[s] 0.068109 +Converged at iteration 28, L1 7.40968e-05, Linf 0.00445915, total time[s] 0.085425 +Converged at iteration 26, L1 8.15123e-05, Linf 0.00545361, total time[s] 0.070625 +Converged at iteration 22, L1 7.41305e-05, Linf 0.0050865, total time[s] 0.067688 +Converged at iteration 19, L1 6.63375e-05, Linf 0.00393102, total time[s] 0.061156 +Converged at iteration 30, L1 7.99771e-05, Linf 0.00329632, total time[s] 0.085482 +Converged at iteration 20, L1 8.44276e-05, Linf 0.00455085, total time[s] 0.060483 +Converged at iteration 24, L1 7.16136e-05, Linf 0.00463401, total time[s] 0.09971 +Converged at iteration 31, L1 9.08101e-05, Linf 0.00570013, total time[s] 0.087747 +Converged at iteration 27, L1 9.91999e-05, Linf 0.00570171, total time[s] 0.083733 +Converged at iteration 24, L1 8.77345e-05, Linf 0.00457035, total time[s] 0.080683 +Converged at iteration 23, L1 9.21809e-05, Linf 0.00410191, total time[s] 0.075092 +Converged at iteration 26, L1 7.22006e-05, Linf 0.00446041, total time[s] 0.071292 +Converged at iteration 29, L1 7.81332e-05, Linf 0.00480657, total time[s] 0.098399 +Converged at iteration 34, L1 7.09368e-05, Linf 0.00422624, total time[s] 0.105649 +Converged at iteration 30, L1 9.39303e-05, Linf 0.00432963, total time[s] 0.100537 +Converged at iteration 28, L1 9.49897e-05, Linf 0.00312885, total time[s] 0.08693 +Converged at iteration 32, L1 9.44123e-05, Linf 0.00374082, total time[s] 0.135188 +Converged at iteration 37, L1 7.40362e-05, Linf 0.00327892, total time[s] 0.160433 +Converged at iteration 33, L1 8.4539e-05, Linf 0.00469143, total time[s] 0.111715 +Converged at iteration 28, L1 9.74335e-05, Linf 0.00430357, total time[s] 0.114798 +Converged at iteration 24, L1 8.82969e-05, Linf 0.00322288, total time[s] 0.103143 +Converged at iteration 26, L1 8.98101e-05, Linf 0.00386257, total time[s] 0.121034 +Converged at iteration 40, L1 6.64029e-05, Linf 0.00393595, total time[s] 0.175369 +Converged at iteration 35, L1 8.66354e-05, Linf 0.00360678, total time[s] 0.182102 +Converged at iteration 30, L1 9.189e-05, Linf 0.00410966, total time[s] 0.188217 +Converged at iteration 31, L1 6.17368e-05, Linf 0.00504684, total time[s] 0.094321 +Converged at iteration 26, L1 9.84323e-05, Linf 0.00583435, total time[s] 0.088918 +Converged at iteration 22, L1 7.16982e-05, Linf 0.00418085, total time[s] 0.074764 +Converged at iteration 21, L1 6.40563e-05, Linf 0.00348501, total time[s] 0.060867 +Converged at iteration 24, L1 8.95173e-05, Linf 0.0049503, total time[s] 0.087842 +Converged at iteration 28, L1 7.33206e-05, Linf 0.00442601, total time[s] 0.08657 +Converged at iteration 26, L1 8.01682e-05, Linf 0.00534731, total time[s] 0.121269 +Converged at iteration 22, L1 7.01833e-05, Linf 0.00441516, total time[s] 0.099494 +Converged at iteration 19, L1 5.49598e-05, Linf 0.00332054, total time[s] 0.066531 +Converged at iteration 30, L1 9.51789e-05, Linf 0.00330744, total time[s] 0.116381 +Converged at iteration 20, L1 8.42492e-05, Linf 0.00472692, total time[s] 0.066812 +Converged at iteration 24, L1 7.12272e-05, Linf 0.00475227, total time[s] 0.07294 +Converged at iteration 31, L1 9.43432e-05, Linf 0.00482234, total time[s] 0.152086 +Converged at iteration 27, L1 9.41095e-05, Linf 0.00468394, total time[s] 0.095704 +Converged at iteration 24, L1 8.62421e-05, Linf 0.00428072, total time[s] 0.092593 +Converged at iteration 23, L1 9.3546e-05, Linf 0.00594145, total time[s] 0.084875 +Converged at iteration 26, L1 7.13032e-05, Linf 0.00465354, total time[s] 0.086184 +Converged at iteration 29, L1 7.524e-05, Linf 0.00488616, total time[s] 0.175711 +Converged at iteration 34, L1 8.31213e-05, Linf 0.00407106, total time[s] 0.205918 +Converged at iteration 31, L1 7.17527e-05, Linf 0.00355133, total time[s] 0.130503 +Converged at iteration 29, L1 7.02872e-05, Linf 0.00270995, total time[s] 0.105515 +Converged at iteration 32, L1 8.21645e-05, Linf 0.00354569, total time[s] 0.156942 +Converged at iteration 36, L1 8.74169e-05, Linf 0.00357556, total time[s] 0.2108 +Converged at iteration 33, L1 8.35511e-05, Linf 0.00490232, total time[s] 0.142952 +Converged at iteration 28, L1 9.17877e-05, Linf 0.00413123, total time[s] 0.11651 +Converged at iteration 24, L1 8.02648e-05, Linf 0.00290884, total time[s] 0.081533 +Converged at iteration 26, L1 8.4069e-05, Linf 0.00392477, total time[s] 0.102253 +Converged at iteration 40, L1 6.70626e-05, Linf 0.0038046, total time[s] 0.110141 +Converged at iteration 35, L1 8.15181e-05, Linf 0.00349837, total time[s] 0.093164 +Converged at iteration 30, L1 9.67079e-05, Linf 0.00421274, total time[s] 0.149079 +Converged at iteration 31, L1 6.28037e-05, Linf 0.00503605, total time[s] 0.104789 +Converged at iteration 27, L1 6.05015e-05, Linf 0.0049048, total time[s] 0.079113 +Converged at iteration 22, L1 7.85894e-05, Linf 0.00433678, total time[s] 0.060339 +Converged at iteration 20, L1 9.9835e-05, Linf 0.00419253, total time[s] 0.059255 +Converged at iteration 24, L1 9.06838e-05, Linf 0.00487638, total time[s] 0.083416 +Converged at iteration 28, L1 7.42416e-05, Linf 0.00443735, total time[s] 0.085867 +Converged at iteration 26, L1 8.05111e-05, Linf 0.00551, total time[s] 0.093566 +Converged at iteration 22, L1 7.24491e-05, Linf 0.00489343, total time[s] 0.082186 +Converged at iteration 19, L1 6.01658e-05, Linf 0.00361127, total time[s] 0.053062 +Converged at iteration 30, L1 8.68297e-05, Linf 0.00330214, total time[s] 0.092753 +Converged at iteration 20, L1 8.51109e-05, Linf 0.00463484, total time[s] 0.081795 +Converged at iteration 24, L1 7.17614e-05, Linf 0.00466753, total time[s] 0.087082 +Converged at iteration 31, L1 9.29212e-05, Linf 0.00535735, total time[s] 0.085927 +Converged at iteration 27, L1 9.92379e-05, Linf 0.00548532, total time[s] 0.096827 +Converged at iteration 24, L1 8.7094e-05, Linf 0.0045473, total time[s] 0.071456 +Converged at iteration 23, L1 9.25837e-05, Linf 0.00419767, total time[s] 0.085474 +Converged at iteration 26, L1 7.19731e-05, Linf 0.004548, total time[s] 0.0764 +Converged at iteration 29, L1 7.68316e-05, Linf 0.00476967, total time[s] 0.117431 +Converged at iteration 34, L1 7.75555e-05, Linf 0.00432664, total time[s] 0.101718 +Converged at iteration 30, L1 9.92069e-05, Linf 0.00439923, total time[s] 0.092573 +Converged at iteration 28, L1 9.77335e-05, Linf 0.00321314, total time[s] 0.079663 +Converged at iteration 32, L1 8.68645e-05, Linf 0.00364207, total time[s] 0.091355 +Converged at iteration 36, L1 9.73075e-05, Linf 0.00372454, total time[s] 0.114841 +Converged at iteration 33, L1 8.4025e-05, Linf 0.00476966, total time[s] 0.107276 +Converged at iteration 28, L1 9.39586e-05, Linf 0.00421174, total time[s] 0.125248 +Converged at iteration 24, L1 8.28528e-05, Linf 0.00308024, total time[s] 0.076389 +Converged at iteration 26, L1 8.75507e-05, Linf 0.00388609, total time[s] 0.086368 +Converged at iteration 40, L1 6.62816e-05, Linf 0.00394688, total time[s] 0.11108 +Converged at iteration 35, L1 8.71444e-05, Linf 0.00361815, total time[s] 0.100293 +Converged at iteration 30, L1 9.10475e-05, Linf 0.0041953, total time[s] 0.099986 +Converged at iteration 31, L1 6.19661e-05, Linf 0.00504743, total time[s] 0.115801 +Converged at iteration 26, L1 9.80029e-05, Linf 0.00577238, total time[s] 0.069899 +Converged at iteration 22, L1 7.09509e-05, Linf 0.00416643, total time[s] 0.064413 +Converged at iteration 21, L1 6.44194e-05, Linf 0.00350894, total time[s] 0.072265 +Converged at iteration 24, L1 8.97068e-05, Linf 0.0049746, total time[s] 0.0714 +Converged at iteration 28, L1 7.31431e-05, Linf 0.00442805, total time[s] 0.095927 +Converged at iteration 26, L1 8.06271e-05, Linf 0.00533308, total time[s] 0.097426 +Converged at iteration 22, L1 6.98341e-05, Linf 0.00434048, total time[s] 0.059644 +Converged at iteration 19, L1 5.4317e-05, Linf 0.00326998, total time[s] 0.065455 +Converged at iteration 30, L1 9.61644e-05, Linf 0.00330729, total time[s] 0.122986 +Converged at iteration 20, L1 8.45154e-05, Linf 0.00466718, total time[s] 0.05996 +Converged at iteration 24, L1 7.11733e-05, Linf 0.00475909, total time[s] 0.092427 +Converged at iteration 31, L1 9.58535e-05, Linf 0.00473539, total time[s] 0.107007 +Converged at iteration 27, L1 9.32172e-05, Linf 0.00457588, total time[s] 0.088859 +Converged at iteration 24, L1 8.51429e-05, Linf 0.00424088, total time[s] 0.075873 +Converged at iteration 23, L1 9.2554e-05, Linf 0.00433524, total time[s] 0.066561 +Converged at iteration 26, L1 7.12787e-05, Linf 0.00466734, total time[s] 0.080428 +Converged at iteration 29, L1 7.51112e-05, Linf 0.00480851, total time[s] 0.090966 +Converged at iteration 34, L1 8.20888e-05, Linf 0.00399449, total time[s] 0.099335 +Converged at iteration 31, L1 7.24642e-05, Linf 0.00354547, total time[s] 0.114215 +Converged at iteration 29, L1 7.06499e-05, Linf 0.00273244, total time[s] 0.106661 +Converged at iteration 32, L1 8.16259e-05, Linf 0.00353298, total time[s] 0.092651 +Converged at iteration 36, L1 8.57113e-05, Linf 0.0035563, total time[s] 0.132608 +Converged at iteration 33, L1 8.30865e-05, Linf 0.00485527, total time[s] 0.090892 +Converged at iteration 28, L1 9.0705e-05, Linf 0.00412339, total time[s] 0.077375 +Converged at iteration 24, L1 8.00274e-05, Linf 0.00289007, total time[s] 0.066828 +Converged at iteration 26, L1 8.37416e-05, Linf 0.00392512, total time[s] 0.078668 +Converged at iteration 40, L1 6.67441e-05, Linf 0.00387595, total time[s] 0.12587 +Converged at iteration 35, L1 8.43307e-05, Linf 0.00355614, total time[s] 0.12379 +Converged at iteration 30, L1 9.44437e-05, Linf 0.00419833, total time[s] 0.08252 +Converged at iteration 31, L1 6.17902e-05, Linf 0.00504176, total time[s] 0.116338 +Converged at iteration 26, L1 9.98752e-05, Linf 0.00579165, total time[s] 0.110678 +Converged at iteration 22, L1 7.47401e-05, Linf 0.00425428, total time[s] 0.082488 +Converged at iteration 21, L1 6.34087e-05, Linf 0.00340632, total time[s] 0.177344 +Converged at iteration 24, L1 8.98857e-05, Linf 0.00491303, total time[s] 0.070367 +Converged at iteration 28, L1 7.39702e-05, Linf 0.00443808, total time[s] 0.091503 +Converged at iteration 26, L1 8.03205e-05, Linf 0.00545225, total time[s] 0.077435 +Converged at iteration 22, L1 7.16669e-05, Linf 0.00471547, total time[s] 0.09973 +Converged at iteration 19, L1 5.76125e-05, Linf 0.00349739, total time[s] 0.064815 +Converged at iteration 30, L1 9.1438e-05, Linf 0.00330547, total time[s] 0.101039 +Converged at iteration 20, L1 8.49195e-05, Linf 0.00468506, total time[s] 0.058368 +Converged at iteration 24, L1 7.13739e-05, Linf 0.00491249, total time[s] 0.065762 +Converged at iteration 31, L1 9.36741e-05, Linf 0.0051511, total time[s] 0.103536 +Converged at iteration 27, L1 9.79028e-05, Linf 0.0051198, total time[s] 0.107246 +Converged at iteration 24, L1 8.6536e-05, Linf 0.00443007, total time[s] 0.09623 +Converged at iteration 23, L1 9.26134e-05, Linf 0.00426222, total time[s] 0.077091 +Converged at iteration 26, L1 7.16708e-05, Linf 0.00460229, total time[s] 0.101899 +Converged at iteration 29, L1 7.59987e-05, Linf 0.00496329, total time[s] 0.089718 +Converged at iteration 34, L1 8.01604e-05, Linf 0.00428122, total time[s] 0.151627 +Converged at iteration 31, L1 7.04645e-05, Linf 0.0035906, total time[s] 0.102568 +Converged at iteration 28, L1 9.99689e-05, Linf 0.00324103, total time[s] 0.102915 +Converged at iteration 32, L1 8.40536e-05, Linf 0.00358629, total time[s] 0.099265 +Converged at iteration 36, L1 9.20616e-05, Linf 0.00363883, total time[s] 0.116341 +Converged at iteration 33, L1 8.36154e-05, Linf 0.00481304, total time[s] 0.131 +Converged at iteration 28, L1 9.23088e-05, Linf 0.00421312, total time[s] 0.102465 +Converged at iteration 24, L1 8.11922e-05, Linf 0.00298536, total time[s] 0.089093 +Converged at iteration 26, L1 8.57109e-05, Linf 0.00390768, total time[s] 0.081532 +Converged at iteration 40, L1 6.62298e-05, Linf 0.0039537, total time[s] 0.114609 +Converged at iteration 35, L1 8.74415e-05, Linf 0.00359188, total time[s] 0.120944 +Converged at iteration 30, L1 9.12894e-05, Linf 0.00417202, total time[s] 0.091763 +Converged at iteration 31, L1 6.30154e-05, Linf 0.00504786, total time[s] 0.08083 +Converged at iteration 26, L1 9.79958e-05, Linf 0.00577033, total time[s] 0.115587 +Converged at iteration 22, L1 7.05271e-05, Linf 0.00415766, total time[s] 0.064512 +Converged at iteration 21, L1 6.4702e-05, Linf 0.00353621, total time[s] 0.074295 +Converged at iteration 24, L1 8.93853e-05, Linf 0.00487492, total time[s] 0.066163 +Converged at iteration 28, L1 7.27827e-05, Linf 0.00442803, total time[s] 0.096254 +Converged at iteration 26, L1 8.07767e-05, Linf 0.00530136, total time[s] 0.092114 +Converged at iteration 22, L1 6.97096e-05, Linf 0.0042988, total time[s] 0.066777 +Converged at iteration 19, L1 5.39551e-05, Linf 0.0032425, total time[s] 0.057889 +Converged at iteration 30, L1 9.64807e-05, Linf 0.00330741, total time[s] 0.097432 +Converged at iteration 20, L1 8.40781e-05, Linf 0.00474808, total time[s] 0.075316 +Converged at iteration 24, L1 7.11736e-05, Linf 0.00476859, total time[s] 0.09454 +Converged at iteration 31, L1 9.56707e-05, Linf 0.0046873, total time[s] 0.114217 +Converged at iteration 27, L1 9.25938e-05, Linf 0.00451718, total time[s] 0.089141 +Converged at iteration 24, L1 8.50263e-05, Linf 0.00421808, total time[s] 0.089555 +Converged at iteration 23, L1 9.26035e-05, Linf 0.00434309, total time[s] 0.087448 +Converged at iteration 26, L1 7.12372e-05, Linf 0.00467498, total time[s] 0.086033 +Converged at iteration 29, L1 7.49935e-05, Linf 0.00489231, total time[s] 0.091619 +Converged at iteration 34, L1 8.2366e-05, Linf 0.00395302, total time[s] 0.118571 +Converged at iteration 31, L1 7.28086e-05, Linf 0.00354096, total time[s] 0.081359 +Converged at iteration 29, L1 7.10192e-05, Linf 0.00273807, total time[s] 0.085722 +Converged at iteration 32, L1 8.17638e-05, Linf 0.00354658, total time[s] 0.094608 +Converged at iteration 36, L1 8.495e-05, Linf 0.00354619, total time[s] 0.119135 +Converged at iteration 33, L1 8.30246e-05, Linf 0.00485979, total time[s] 0.11403 +Converged at iteration 28, L1 9.05184e-05, Linf 0.00411939, total time[s] 0.090821 +Converged at iteration 24, L1 7.98889e-05, Linf 0.00288001, total time[s] 0.071213 +Converged at iteration 26, L1 8.3315e-05, Linf 0.00392712, total time[s] 0.069594 +Converged at iteration 40, L1 6.84932e-05, Linf 0.00367961, total time[s] 0.143865 +Converged at iteration 35, L1 7.62945e-05, Linf 0.00340128, total time[s] 0.114129 +Converged at iteration 30, L1 9.71568e-05, Linf 0.00432851, total time[s] 0.076736 +Converged at iteration 31, L1 6.20257e-05, Linf 0.00500252, total time[s] 0.108363 +Converged at iteration 27, L1 6.29203e-05, Linf 0.00494996, total time[s] 0.081243 +Converged at iteration 22, L1 8.60015e-05, Linf 0.00449254, total time[s] 0.073641 +Converged at iteration 20, L1 9.60616e-05, Linf 0.00395683, total time[s] 0.075569 +Converged at iteration 24, L1 8.8431e-05, Linf 0.00482786, total time[s] 0.087069 +Converged at iteration 28, L1 7.38334e-05, Linf 0.00444861, total time[s] 0.079041 +Converged at iteration 26, L1 8.1215e-05, Linf 0.00546787, total time[s] 0.095728 +Converged at iteration 22, L1 7.41551e-05, Linf 0.00509109, total time[s] 0.065613 +Converged at iteration 19, L1 6.6335e-05, Linf 0.00395973, total time[s] 0.066544 +Converged at iteration 30, L1 7.98728e-05, Linf 0.00329635, total time[s] 0.101154 +Converged at iteration 20, L1 8.44278e-05, Linf 0.00455019, total time[s] 0.072005 +Converged at iteration 24, L1 7.13396e-05, Linf 0.00463252, total time[s] 0.074032 +Converged at iteration 31, L1 8.93595e-05, Linf 0.00569156, total time[s] 0.09133 +Converged at iteration 27, L1 9.91063e-05, Linf 0.00569904, total time[s] 0.084222 +Converged at iteration 24, L1 8.83872e-05, Linf 0.00460757, total time[s] 0.078814 +Converged at iteration 23, L1 9.22156e-05, Linf 0.00410189, total time[s] 0.096386 +Converged at iteration 26, L1 7.22772e-05, Linf 0.004498, total time[s] 0.077474 +Converged at iteration 29, L1 7.96718e-05, Linf 0.00698964, total time[s] 0.086182 +Converged at iteration 34, L1 7.09398e-05, Linf 0.0043117, total time[s] 0.095501 +Converged at iteration 30, L1 9.39556e-05, Linf 0.00442607, total time[s] 0.087756 +Converged at iteration 28, L1 9.50312e-05, Linf 0.00311361, total time[s] 0.107497 +Converged at iteration 32, L1 9.45597e-05, Linf 0.00377305, total time[s] 0.111313 +Converged at iteration 37, L1 7.41024e-05, Linf 0.00327919, total time[s] 0.10574 +Converged at iteration 33, L1 8.48243e-05, Linf 0.00474676, total time[s] 0.083555 +Converged at iteration 28, L1 9.7015e-05, Linf 0.00436552, total time[s] 0.07713 +Converged at iteration 24, L1 8.83383e-05, Linf 0.00328519, total time[s] 0.108944 +Converged at iteration 26, L1 9.02632e-05, Linf 0.00384259, total time[s] 0.081813 +Converged at iteration 40, L1 6.98802e-05, Linf 0.00393981, total time[s] 0.140432 +Converged at iteration 35, L1 8.7624e-05, Linf 0.00361573, total time[s] 0.118167 +Converged at iteration 30, L1 9.20649e-05, Linf 0.00416233, total time[s] 0.074463 +Converged at iteration 31, L1 6.25353e-05, Linf 0.00504683, total time[s] 0.087271 +Converged at iteration 26, L1 9.85591e-05, Linf 0.00594243, total time[s] 0.071927 +Converged at iteration 22, L1 7.17405e-05, Linf 0.0041777, total time[s] 0.060963 +Converged at iteration 21, L1 6.40957e-05, Linf 0.00348496, total time[s] 0.067839 +Converged at iteration 24, L1 8.93707e-05, Linf 0.0049499, total time[s] 0.078278 +Converged at iteration 28, L1 7.33674e-05, Linf 0.00443349, total time[s] 0.135547 +Converged at iteration 26, L1 8.01735e-05, Linf 0.00534725, total time[s] 0.081189 +Converged at iteration 22, L1 7.03883e-05, Linf 0.00442056, total time[s] 0.084361 +Converged at iteration 19, L1 5.49389e-05, Linf 0.00332055, total time[s] 0.068906 +Converged at iteration 30, L1 9.51955e-05, Linf 0.00330738, total time[s] 0.088066 +Converged at iteration 20, L1 8.42573e-05, Linf 0.00472687, total time[s] 0.071061 +Converged at iteration 24, L1 7.12086e-05, Linf 0.00475228, total time[s] 0.07721 +Converged at iteration 31, L1 9.42327e-05, Linf 0.00481958, total time[s] 0.106294 +Converged at iteration 27, L1 9.41867e-05, Linf 0.00471646, total time[s] 0.083525 +Converged at iteration 24, L1 8.51765e-05, Linf 0.00428125, total time[s] 0.084248 +Converged at iteration 23, L1 9.23995e-05, Linf 0.00432073, total time[s] 0.064941 +Converged at iteration 26, L1 7.13052e-05, Linf 0.00466097, total time[s] 0.077308 +Converged at iteration 29, L1 7.52203e-05, Linf 0.00488647, total time[s] 0.08288 +Converged at iteration 34, L1 8.30674e-05, Linf 0.00406315, total time[s] 0.156717 +Converged at iteration 31, L1 7.17613e-05, Linf 0.00355199, total time[s] 0.100173 +Converged at iteration 29, L1 7.03181e-05, Linf 0.00274049, total time[s] 0.103115 +Converged at iteration 32, L1 8.21668e-05, Linf 0.00354567, total time[s] 0.088827 +Converged at iteration 36, L1 8.71621e-05, Linf 0.00357628, total time[s] 0.097783 +Converged at iteration 33, L1 8.32138e-05, Linf 0.00484765, total time[s] 0.136351 +Converged at iteration 28, L1 9.10955e-05, Linf 0.00413263, total time[s] 0.094203 +Converged at iteration 24, L1 8.02802e-05, Linf 0.00290884, total time[s] 0.07377 +Converged at iteration 26, L1 8.40127e-05, Linf 0.00392249, total time[s] 0.103757 +Converged at iteration 40, L1 6.81257e-05, Linf 0.0038048, total time[s] 0.137546 +Converged at iteration 35, L1 8.16525e-05, Linf 0.00349986, total time[s] 0.13548 +Converged at iteration 30, L1 9.68029e-05, Linf 0.00423594, total time[s] 0.100394 +Converged at iteration 31, L1 6.18536e-05, Linf 0.00503605, total time[s] 0.101093 +Converged at iteration 27, L1 6.06268e-05, Linf 0.00495082, total time[s] 0.087209 +Converged at iteration 22, L1 7.85042e-05, Linf 0.00433716, total time[s] 0.073174 +Converged at iteration 20, L1 9.97839e-05, Linf 0.00419211, total time[s] 0.062334 +Converged at iteration 24, L1 9.0592e-05, Linf 0.00487566, total time[s] 0.078864 +Converged at iteration 28, L1 7.44768e-05, Linf 0.00444642, total time[s] 0.083497 +Converged at iteration 26, L1 8.05451e-05, Linf 0.00552553, total time[s] 0.070585 +Converged at iteration 22, L1 7.24418e-05, Linf 0.0048928, total time[s] 0.092618 +Converged at iteration 19, L1 6.01762e-05, Linf 0.00367545, total time[s] 0.06709 +Converged at iteration 30, L1 8.69905e-05, Linf 0.00330212, total time[s] 0.088446 +Converged at iteration 20, L1 8.5174e-05, Linf 0.00463491, total time[s] 0.074207 +Converged at iteration 24, L1 7.16481e-05, Linf 0.00466911, total time[s] 0.081875 +Converged at iteration 31, L1 9.29074e-05, Linf 0.00535534, total time[s] 0.091071 +Converged at iteration 27, L1 9.92012e-05, Linf 0.0054856, total time[s] 0.08327 +Converged at iteration 24, L1 8.70778e-05, Linf 0.00454753, total time[s] 0.065146 +Converged at iteration 23, L1 9.27027e-05, Linf 0.00419767, total time[s] 0.069194 +Converged at iteration 26, L1 7.19205e-05, Linf 0.00455491, total time[s] 0.083759 +Converged at iteration 29, L1 7.66714e-05, Linf 0.00484585, total time[s] 0.08108 +Converged at iteration 34, L1 7.76363e-05, Linf 0.00432628, total time[s] 0.092066 +Converged at iteration 30, L1 9.92066e-05, Linf 0.00439906, total time[s] 0.098094 +Converged at iteration 28, L1 9.77206e-05, Linf 0.00317724, total time[s] 0.093865 +Converged at iteration 32, L1 8.6856e-05, Linf 0.00364981, total time[s] 0.090989 +Converged at iteration 36, L1 9.73086e-05, Linf 0.00372456, total time[s] 0.110047 +Converged at iteration 33, L1 8.40542e-05, Linf 0.00476995, total time[s] 0.093808 +Converged at iteration 28, L1 9.39564e-05, Linf 0.00421183, total time[s] 0.108134 +Converged at iteration 24, L1 8.28855e-05, Linf 0.00311581, total time[s] 0.089359 +Converged at iteration 26, L1 8.77282e-05, Linf 0.00388506, total time[s] 0.096039 +Converged at iteration 40, L1 6.62971e-05, Linf 0.00394688, total time[s] 0.143033 +Converged at iteration 35, L1 8.71403e-05, Linf 0.00361838, total time[s] 0.126695 +Converged at iteration 30, L1 9.10342e-05, Linf 0.00417626, total time[s] 0.106523 +Converged at iteration 31, L1 6.26358e-05, Linf 0.00504744, total time[s] 0.106928 +Converged at iteration 26, L1 9.83198e-05, Linf 0.0057721, total time[s] 0.078032 +Converged at iteration 22, L1 7.08894e-05, Linf 0.00416559, total time[s] 0.069219 +Converged at iteration 21, L1 6.44217e-05, Linf 0.00350931, total time[s] 0.076405 +Converged at iteration 24, L1 8.93495e-05, Linf 0.00496065, total time[s] 0.095374 +Converged at iteration 28, L1 7.30298e-05, Linf 0.00442969, total time[s] 0.085835 +Converged at iteration 26, L1 8.04082e-05, Linf 0.00531864, total time[s] 0.096573 +Converged at iteration 22, L1 6.9965e-05, Linf 0.00434055, total time[s] 0.083638 +Converged at iteration 19, L1 5.43204e-05, Linf 0.00326998, total time[s] 0.083698 +Converged at iteration 30, L1 9.60718e-05, Linf 0.00330728, total time[s] 0.109987 +Converged at iteration 20, L1 8.48238e-05, Linf 0.00473715, total time[s] 0.106251 +Converged at iteration 24, L1 7.11745e-05, Linf 0.00476279, total time[s] 0.074148 +Converged at iteration 31, L1 9.50528e-05, Linf 0.00473568, total time[s] 0.098509 +Converged at iteration 27, L1 9.32249e-05, Linf 0.00460824, total time[s] 0.076165 +Converged at iteration 24, L1 8.51226e-05, Linf 0.00424074, total time[s] 0.065768 +Converged at iteration 23, L1 9.25679e-05, Linf 0.00433613, total time[s] 0.070131 +Converged at iteration 26, L1 7.13059e-05, Linf 0.00467428, total time[s] 0.073629 +Converged at iteration 29, L1 7.51332e-05, Linf 0.00488986, total time[s] 0.117706 +Converged at iteration 34, L1 8.21007e-05, Linf 0.00396063, total time[s] 0.106794 +Converged at iteration 31, L1 7.2477e-05, Linf 0.00354543, total time[s] 0.099135 +Converged at iteration 29, L1 7.06432e-05, Linf 0.00273247, total time[s] 0.083138 +Converged at iteration 32, L1 8.17656e-05, Linf 0.00353193, total time[s] 0.094336 +Converged at iteration 36, L1 8.58493e-05, Linf 0.00355644, total time[s] 0.133669 +Converged at iteration 33, L1 8.30878e-05, Linf 0.00485544, total time[s] 0.089192 +Converged at iteration 28, L1 9.10028e-05, Linf 0.0041232, total time[s] 0.107305 +Converged at iteration 24, L1 8.00016e-05, Linf 0.00289006, total time[s] 0.068629 +Converged at iteration 26, L1 8.35131e-05, Linf 0.00392562, total time[s] 0.069961 +Converged at iteration 40, L1 6.67565e-05, Linf 0.00392013, total time[s] 0.108481 +Converged at iteration 35, L1 8.43976e-05, Linf 0.00355448, total time[s] 0.10928 +Converged at iteration 30, L1 9.44688e-05, Linf 0.00419798, total time[s] 0.107427 +Converged at iteration 31, L1 6.17927e-05, Linf 0.00504175, total time[s] 0.109214 +Converged at iteration 27, L1 5.92992e-05, Linf 0.00487906, total time[s] 0.278388 +Converged at iteration 22, L1 7.46456e-05, Linf 0.00425269, total time[s] 0.102208 +Converged at iteration 21, L1 6.33596e-05, Linf 0.0034057, total time[s] 0.084605 +Converged at iteration 24, L1 9.0215e-05, Linf 0.00491117, total time[s] 0.097716 +Converged at iteration 28, L1 7.41991e-05, Linf 0.00443707, total time[s] 0.151402 +Converged at iteration 26, L1 8.03229e-05, Linf 0.00545289, total time[s] 0.109421 +Converged at iteration 22, L1 7.16476e-05, Linf 0.00469576, total time[s] 0.06742 +Converged at iteration 19, L1 5.75787e-05, Linf 0.00349749, total time[s] 0.065613 +Converged at iteration 30, L1 9.13543e-05, Linf 0.00330499, total time[s] 0.104769 +Converged at iteration 20, L1 8.49417e-05, Linf 0.00461384, total time[s] 0.071707 +Converged at iteration 24, L1 7.15207e-05, Linf 0.00470928, total time[s] 0.064078 +Converged at iteration 31, L1 9.3648e-05, Linf 0.00515297, total time[s] 0.096926 +Converged at iteration 27, L1 9.79073e-05, Linf 0.00511922, total time[s] 0.09551 +Converged at iteration 24, L1 8.65447e-05, Linf 0.00442993, total time[s] 0.070543 +Converged at iteration 23, L1 9.26611e-05, Linf 0.00426221, total time[s] 0.098807 +Converged at iteration 26, L1 7.16881e-05, Linf 0.00460257, total time[s] 0.088848 +Converged at iteration 29, L1 7.59068e-05, Linf 0.00487023, total time[s] 0.096186 +Converged at iteration 34, L1 8.02278e-05, Linf 0.00428086, total time[s] 0.173553 +Converged at iteration 31, L1 7.04667e-05, Linf 0.00359049, total time[s] 0.147523 +Converged at iteration 29, L1 6.87716e-05, Linf 0.00268042, total time[s] 0.132283 +Converged at iteration 32, L1 8.54107e-05, Linf 0.00358869, total time[s] 0.11698 +Converged at iteration 36, L1 9.31627e-05, Linf 0.00366729, total time[s] 0.129985 +Converged at iteration 33, L1 8.38341e-05, Linf 0.00481371, total time[s] 0.099488 +Converged at iteration 28, L1 9.26709e-05, Linf 0.00416993, total time[s] 0.11115 +Converged at iteration 24, L1 8.12295e-05, Linf 0.00298535, total time[s] 0.070642 +Converged at iteration 26, L1 8.5972e-05, Linf 0.00390763, total time[s] 0.089997 +Converged at iteration 40, L1 6.71386e-05, Linf 0.00395311, total time[s] 0.108767 +Converged at iteration 35, L1 8.87066e-05, Linf 0.00358861, total time[s] 0.098603 +Converged at iteration 30, L1 9.20437e-05, Linf 0.00415151, total time[s] 0.098846 +Converged at iteration 31, L1 6.19151e-05, Linf 0.00503493, total time[s] 0.086613 +Converged at iteration 26, L1 9.78123e-05, Linf 0.00593544, total time[s] 0.071582 +Converged at iteration 22, L1 7.04521e-05, Linf 0.00416369, total time[s] 0.103148 +Converged at iteration 21, L1 6.4824e-05, Linf 0.00351983, total time[s] 0.068024 +Converged at iteration 24, L1 8.93989e-05, Linf 0.00496596, total time[s] 0.099174 +Converged at iteration 28, L1 7.27205e-05, Linf 0.00442803, total time[s] 0.087258 +Converged at iteration 26, L1 8.05192e-05, Linf 0.00528798, total time[s] 0.090198 +Converged at iteration 22, L1 6.96216e-05, Linf 0.00429874, total time[s] 0.064653 +Converged at iteration 19, L1 5.39453e-05, Linf 0.00324249, total time[s] 0.058038 +Converged at iteration 30, L1 9.68336e-05, Linf 0.0033074, total time[s] 0.118365 +Converged at iteration 20, L1 8.4035e-05, Linf 0.00474293, total time[s] 0.082032 +Converged at iteration 24, L1 7.11173e-05, Linf 0.00476835, total time[s] 0.098307 +Converged at iteration 31, L1 9.58399e-05, Linf 0.00468732, total time[s] 0.115403 +Converged at iteration 27, L1 9.26046e-05, Linf 0.00451922, total time[s] 0.092876 +Converged at iteration 24, L1 8.50152e-05, Linf 0.00421111, total time[s] 0.072359 +Converged at iteration 23, L1 9.26504e-05, Linf 0.00435114, total time[s] 0.108062 +Converged at iteration 26, L1 7.12601e-05, Linf 0.00467501, total time[s] 0.106946 +Converged at iteration 29, L1 7.57349e-05, Linf 0.00489316, total time[s] 0.095883 +Converged at iteration 34, L1 8.30396e-05, Linf 0.0039531, total time[s] 0.106644 +Converged at iteration 31, L1 7.5454e-05, Linf 0.00351128, total time[s] 0.103102 +Converged at iteration 29, L1 7.09251e-05, Linf 0.00273729, total time[s] 0.092853 +Converged at iteration 32, L1 8.13543e-05, Linf 0.00351144, total time[s] 0.103471 +Converged at iteration 36, L1 8.49475e-05, Linf 0.00354614, total time[s] 0.108146 +Converged at iteration 33, L1 8.30092e-05, Linf 0.00485972, total time[s] 0.105465 +Converged at iteration 28, L1 9.05335e-05, Linf 0.00411914, total time[s] 0.095399 +Converged at iteration 24, L1 7.98946e-05, Linf 0.00287999, total time[s] 0.069897 +Converged at iteration 26, L1 8.33134e-05, Linf 0.00392713, total time[s] 0.07241 diff --git a/test/plot_time.ipynb b/test/plot_time.ipynb new file mode 100644 index 0000000..24e9f6c --- /dev/null +++ b/test/plot_time.ipynb @@ -0,0 +1,356 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEGCAYAAABiq/5QAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAA6dElEQVR4nO3dd3gU5drH8e+dTkJCKk1K6IRASCAISFEBEQUBlSJFQc4BBQUBuwcVbK+KHhULHsUOAmKhCCoCIioihI4UAQldCC1ASEh73j9mEwKkAdnMJrk/17VXNrMzs7+NeM/sMzP3iDEGpZRSZYeb3QGUUkoVLy38SilVxmjhV0qpMkYLv1JKlTFa+JVSqozxsDtAYYSGhprw8HC7YyilVImyevXqI8aYsAunl4jCHx4eTlxcnN0xlFKqRBGR3blN16EepZQqY7TwK6VUGaOFXymlypgSMcavVGmSlpbGvn37SElJsTuKKiV8fHyoVq0anp6ehZpfC79SxWzfvn34+/sTHh6OiNgdR5VwxhiOHj3Kvn37qFWrVqGW0aEepYpZSkoKISEhWvRVkRARQkJCLukbpBZ+pWygRV8VpUv991SqC//aRdNZ+eV/7Y6hlFIupVQXflnzKVEbX+Dg33/aHUUplzV+/HheeeUVp77HzTffzIkTJy57+fLlyxddmGI2d+5cXnzxRQBmz57N5s2bs1976qmnWLRoUbFnKtWFv3L/d0jFk8SZ92IyM+yOo1SZtWDBAgIDA+2OYYvu3bvz2GOPARcX/meeeYZOnToVe6bSXfir1WJ9xIM0PLuBTfPetDuOUi7j+eefp379+rRt25Zt27ZlT1+3bh2tWrUiKiqKW2+9lePHjwNw3XXXMWbMGGJjY4mIiGDVqlXcdttt1KtXj3HjxmUv37NnT5o3b05kZCTvvfde9vTw8HCOHDlCfHw8ERERDB06lMjISDp37kxycvJF+Xbt2kXr1q1p0qTJeesHmDhxIi1atCAqKoqnn346e/qnn35KVFQUTZs25c477wQgPj6eDh06EBUVRceOHdmzZw8AgwcPZvjw4bRq1YratWuzdOlShgwZQkREBIMHD85eZ/ny5RkzZgyRkZF07NiRhISEfP9OkyZNolGjRkRFRXHHHXcA8PHHH3P//fezfPly5s6dy8MPP0x0dDQ7d+5k8ODBfPnllwAsXryYmJgYmjRpwpAhQzh79mz23+7pp5+mWbNmNGnShK1bt17Kf+pclfrTOVv3GsP6F+dQZ+1LnG59K+Ur1rQ7klLZJsz7k80HThbpOhtVDeDpWyLzfH316tXMmDGDdevWkZ6eTrNmzWjevDkAd911F2+++SbXXnstTz31FBMmTOD1118HwMvLi7i4ON544w169OjB6tWrCQ4Opk6dOowZM4aQkBA+/PBDgoODSU5OpkWLFtx+++2EhISc9/7bt29n+vTpvP/++/Tp04evvvqKgQMHnjfPAw88wPDhw7nrrrt4++23s6cvXLiQ7du3s3LlSowxdO/enWXLlhESEsJzzz3H8uXLCQ0N5dixYwCMHDmSQYMGMWjQID788ENGjRrF7NmzATh+/Di///47c+fOpXv37vz2229MmTKFFi1asG7dOqKjo0lKSiI2NpbXXnuNZ555hgkTJvDWW2/l+Xd68cUX2bVrF97e3hcNbV1zzTV0796dbt260atXr/NeS0lJYfDgwSxevJj69etz1113MXnyZEaPHg1AaGgoa9as4Z133uGVV15hypQphfq3kJdSvccP4OHhjuetb+Fu0tk/dTjoPYZVGffLL79w66234uvrS0BAAN27dwcgMTGREydOcO211wIwaNAgli1blr1c1nxNmjQhMjKSKlWq4O3tTe3atdm7dy9g7fE2bdqUVq1asXfvXrZv337R+9eqVYvo6GgAmjdvTnx8/EXz/Pbbb/Tr1w8ge+8drMK/cOFCYmJiaNasGVu3bmX79u0sWbKE3r17ExoaCkBwcDAAv//+O/37989ez6+//pq9rltuuQURoUmTJlSqVIkmTZrg5uZGZGRkdiY3Nzf69u0LwMCBA/n111/z/TtFRUUxYMAApk6diodH4fert23bRq1atahfv/5F6wS47bbb8v17XapSv8cP0CiyKd9Xu4cu+99k97LPqHntXXZHUgog3z1zV+Pt7Q1YxTDredbv6enpLF26lEWLFvH777/j6+vLddddl+u55TmXdXd3z3WoB3I/RdEYw+OPP84999xz3vQ337z0odyCPk9hM+U0f/58li1bxrx583j++efZuHHjJefKL6u7u3ue2S5Fqd/jz3LNgHFsknoELv0P6acS7I6jlG3at2/P7NmzSU5O5tSpU8ybNw+AChUqEBQUxC+//ALAZ599lr1XWxiJiYkEBQXh6+vL1q1bWbFixWVnbNOmDTNmzABg2rRp2dNvvPFGPvzwQ06fPg3A/v37OXz4MB06dGDWrFkcPXoUIHuo55prrjlvPe3atbukHJmZmdlj8J9//jlt27bN8++UmZnJ3r17uf7663nppZdITEzMzpnF39+fU6dOXfQ+DRo0ID4+nh07dpy3TmcpE3v8AAG+Phzt8Ar1F91G/LRR1L13ut2RlLJFs2bN6Nu3L02bNqVixYq0aNEi+7VPPvmEe++9lzNnzlC7dm0++uijQq+3S5cuvPvuu0RERNCgQQNatWp12RnfeOMN+vfvz0svvUSPHj2yp3fu3JktW7bQunVrwDr4OnXqVCIjI/nPf/7Dtddei7u7OzExMXz88ce8+eab3H333UycOJGwsLBL+jwAfn5+rFy5kueee46KFSsyc+ZMIPe/U0ZGBgMHDiQxMRFjDKNGjbroTKY77riDoUOHMmnSpOwNCli9dj766CN69+5Neno6LVq04N57773Mv17BxJSAMe/Y2FhTFDdiMcYw+7WR3HryM471+IzgmO5FkE6pS7NlyxYiIiLsjqEKoXz58hfttbuq3P5dichqY0zshfOWmaEesMbnmg98lr9MNfh2LKQU7dkUSilVEpSpwg9Qo2IQG5o9R2D6EfbNetTuOEopF1ZS9vYvVZkr/ADdu/bga+/uVNv5OSk7lhW8gFJKlSJlsvB7ebgR3usF9mSGcebLEZCW++lkSilVGpXJwg8QW78a39d+guCUvRyd/4zdcZRSqtiU2cIP0Lv3QL6RjgSue5fMfWvtjqOUUsXCqYVfRMaIyJ8isklEpouIj4jUEpE/RGSHiMwUES9nZshPkJ8Xbjc+xxETQOLMYZCRZlcUpVQRy2qOBoVrPZ1znsttl+wqbZcL4rTCLyJXAaOAWGNMY8AduAN4CXjNGFMXOA78y1kZCqN7ywg+Cx5F0Km/SFryqp1RlFKXqCjaF+Tmctslu0rb5YI4e6jHAygnIh6AL3AQ6ABkXbL2CdDTyRnyJSL07HcPCzJb4r38FUjYVvBCSpVgSUlJdO3alaZNm9K4cWNmzpyZ3WYZYM6cOZQrV47U1FRSUlKoXbs2ADt37qRLly40b96cdu3aZbcHTkhI4Pbbb6dFixa0aNGC3377DbD2oO+8805at25NvXr1eP/99y/KEh8fT8OGDRkwYAARERH06tWLM2fOAFbRbNGiBY0bN2bYsGFkXWx63XXXMXr0aGJjY3njjTeYN28eLVu2JCYmhk6dOnHo0KF8P39enyOnrHbJcXFxREdHEx0dTZMmTbJ79bz//vu0aNGCpk2bcvvtt3PmzBmXartcEKe1bDDG7BeRV4A9QDKwEFgNnDDGZG2m9wFXOStDYdWtWJ5FV4/n9KpeuM28h4ARi8HN3e5Yqiz47jH4p2gaeWWr3ARuejHPl7///nuqVq3K/PnzAavHjp+fH+vWrQOs7p2NGzdm1apVpKen07JlSwCGDRvGu+++S7169fjjjz8YMWIES5Ys4YEHHmDMmDG0bduWPXv2cOONN7JlyxYANmzYwIoVK0hKSiImJoauXbtStWrV8/Js27aNDz74gDZt2jBkyBDeeecdHnroIe6//36eeuopwOqs+e2333LLLbcAkJqaStbV/MePH2fFihWICFOmTOHll1/m1Vfz/vae1+fITWxsbPbf5eGHH6ZLly6A1S1z6NChAIwbN44PPviAkSNHukzb5YI4rfCLSBDQA6gFnABmAV0uYflhwDCAGjVqOCHh+Qbf2JL/bvg3Txx5g7QV7+F5zXCnv6dSdmjSpAkPPvggjz76KN26dctuXFanTh22bNnCypUrGTt2LMuWLSMjI4N27dpx+vRpli9fTu/evbPXk7XHumjRovOGN06ePJl94VOPHj0oV64c5cqV4/rrr2flypX07NnzvDzVq1enTZs2gNX6eNKkSTz00EP89NNPvPzyy5w5c4Zjx44RGRmZXfizWiUD7Nu3j759+3Lw4EFSU1OpVatWnp89v8+Rn5kzZ7JmzRoWLlwIwKZNmxg3bhwnTpzg9OnT3Hjjjfkun1vb5bfffju78Odsu/z1118XmOdKObNJWydglzEmAUBEvgbaAIEi4uHY668G7M9tYWPMe8B7YPXqcWJOAHw83WnfayQ/f/YTrRdNgIibIUhv2qKcLJ89c2epX78+a9asYcGCBYwbN46OHTvy1FNP0b59e7777js8PT3p1KkTgwcPJiMjg4kTJ5KZmUlgYGD23m9OmZmZrFixAh8fn4teu7CNcW5tjXObJyUlhREjRhAXF0f16tUZP378eS2e/fz8sp+PHDmSsWPH0r17d5YuXcr48ePz/Oz5fY68bNq0ifHjx7Ns2TLc3a2RgMGDBzN79myaNm3Kxx9/zNKlSwu9vtwUddvlgjhzjH8P0EpEfMX6L9sR2Az8BGR9DxoEzHFihkvStn4YP9V/grSMTM58PVJv2qJKpQMHDuDr68vAgQN5+OGHWbNmDQDt2rXj9ddfp3Xr1oSFhXH06FG2bdtG48aNCQgIoFatWsyaNQuwGh6uX78esDpm5uyHn7Oozpkzh5SUFI4ePcrSpUvP6wSaZc+ePfz+++/AudbHWUU+NDSU06dPn9fJ8kKJiYlcdZU1YvzJJ5/k+9nz+xy5OXHiBP369ePTTz8lLCwse/qpU6eoUqUKaWlp57WNdpW2ywVxWuE3xvyBdRB3DbDR8V7vAY8CY0VkBxACfOCsDJfjvp4deEMG4Lv3Z8y6z+2Oo1SR27hxI1dffTXR0dFMmDAh+562LVu25NChQ7Rv3x6w7iaV84DmtGnT+OCDD2jatCmRkZHMmWPts02aNIm4uDiioqJo1KgR7777bvZ7RUVFcf3119OqVSuefPLJi8b3wSqKb7/9NhERERw/fpzhw4cTGBjI0KFDady4MTfeeGOuG4ws48ePp3fv3jRv3jz7Dlz5yetz5GbOnDns3r2boUOHZh/kBXj22Wdp2bIlbdq0oWHDhtnz33HHHUycOJGYmBh27tyZPT1n2+WsO305s+1yQcpUW+bCmrZiF/UX9KGp9z94jYoD/0rF9t6q9CsrbZnHjx9P+fLleeihh/KcJz4+nm7durFp06ZiTFY6aVvmK9Tv6nA+DX0Qk5ZM6rwH7Y6jlFJFqszcgetSuLkJI3rfzKS3b+Phv2bC5rnQSG/aotSlyO8ga5bw8HDd27eB7vHnIaJKAJmtRvJnZk1S542F5ON2R1KlSEkYYlUlx6X+e9LCn4+RnSN4xWck7slHyfh+nN1xVCnh4+PD0aNHtfirImGM4ejRo7meTpsXHerJh6+XBwNv7c7/pi1jxPqpENUL6lxvdyxVwlWrVo19+/aRkJBgdxRVSvj4+FCtWrVCz6+FvwAdIyoxu95wdv29iupzRuJx/x/g5VfwgkrlwdPTM9+rS5VyNh3qKYQnesbwlLkHj5N7MYuftTuOUkpdES38hVClQjmu79yTT9NvgD/ehb2r7I6klFKXTQt/IQ26Jpx5YUM5RAgZc+6D9IIbOymllCvSwl9I7m7Ck7e35Im0u3E/sg1+0Zu2KKVKJi38lyCqWiA1Wt7KNxltMctehX/0whOlVMmjhf8SPdi5PpN9/kUifpg590OG81uoKqVUUdLCf4n8fTwZ3b01487ehRxcC39MtjuSUkpdEi38l+GmxpVJqnsLS0wsmUueh6M7C15IKaVchBb+yyAiPNOzCeMzh3A2ww3mPaA3bVFKlRha+C9T9WBf+nVsxYTUfhD/C6zJ/84/SinlKrTwX4F/t6vF2pDurJbGmIXj4OQBuyMppVSBtPBfAU93N56/rQljU4aQnpYK347VIR+llMvTwn+FYsODaR3bgompveCv7+DPr+2OpJRS+dLCXwQeu6khs726s92jPmbBI5B01O5ISimVJy38RSDQ14vHujXm/qQhmOQT8MPjdkdSSqk8aeEvIrfGXEVI7Rj+Z3rChpnw10K7IymlVK608BcREeHZno15K60HB73C4dsxkHLS7lhKKXURLfxFqE5Yef59XUNGnLobc3I/LJ5gdySllLqIFv4iNvy6OpwIiWaWRzdYNQV2L7c7klJKnUcLfxHz8XTn+Z6Nefr0rSR6V4E590Nast2xlFIqm9MKv4g0EJF1OR4nRWS0iASLyI8ist3xM8hZGexyTd1QusTUYVTS3XBsJ/z8kt2RlFIqm9MKvzFmmzEm2hgTDTQHzgDfAI8Bi40x9YDFjt9Lnf90jWCdZwxLynXG/DYJDqyzO5JSSgHFN9TTEdhpjNkN9ACyOpp9AvQspgzFKrS8N4/d1JDRx3uT4hUMc++HjDS7YymlVLEV/juA6Y7nlYwxBx3P/wEq5baAiAwTkTgRiUtISCiOjEWub2x16tesxhOpg+GfjbB8kt2RlFLK+YVfRLyA7sCsC18zxhgg165mxpj3jDGxxpjYsLAwJ6d0Djc34flbmzDvbDPWB1wPS1+ChL/sjqWUKuOKY4//JmCNMeaQ4/dDIlIFwPHzcDFksE2Dyv78u11t/nW4D+nuPjB3JGRm2h1LKVWGFUfh78e5YR6AucAgx/NBwJxiyGCrBzrWwyeoMq+63Q17V1jn9yullE2cWvhFxA+4AcjZq/hF4AYR2Q50cvxeqpXzcufZHo2ZfKIFu4Naw6LxcGKP3bGUUmWUUwu/MSbJGBNijEnMMe2oMaajMaaeMaaTMeaYMzO4iusbVuTmJlUYnNCfTAzMG603bVFK2UKv3C1GT98SSYJ7JT7zuxt2Lob1M+yOpJQqg7TwF6NKAT481Lk+4/9pzdHgZvD9Y3C6VB/bVkq5IC38xezO1uE0qRbEsMRBmLQzsOBhuyMppcoYLfzFzN1NeOHWJqw9E8aiioNh82zYMs/uWEqpMkQLvw0aX1WBQdeEMyK+LWeCI2D+g5B83O5YSqkyQgu/TR7s3IAQ//I8knYPJukILHzS7khKqTJCC79Nynt7ML57I75NqMj66nfC2s/g76V2x1JKlQFa+G10Y2RlOjasyOBdHUkPrA1zR8HZ03bHUkqVclr4bSQiTOgRyVm8eLXcSEjcC18PhcwMu6MppUoxLfw2qxbky+hO9Zi8qxJbov8D2xbAD/+xO5ZSqhTTwu8ChrStRcPK/gzZHENqi+Hwx2RY8a7dsZRSpZQWfhfg6e7GC7c14dDJFB5K7IVp2M26qnfrArujKaVKIS38LqJZjSAe7NyAuRsOMb3aOKgaA1/9C/avsTuaUqqU0cLvQoZfW4cODSvy9He72HTde+AXCp/31RbOSqkipYXfhbi5Cf/t05SK/j7c8/VeTt72OaSfhWl9IPmE3fGUUqWEFn4XE+jrxTsDmnH4VAqjl6SQ2edTOLoDvrgL0lPtjqeUKgW08LugptUDeapbI5ZsPczkPdWg+yTY9TN8O0Zv3qKUumJa+F3UwFY16d60Kq8u3MZy/85w7aOwbir88ord0ZRSJZwWfhclIvzfbU2oHVaeUdPXcqjZGIi6A5Y8Bxtm2R1PKVWCaeF3YX7eHkwe0IyksxmMnL6O9K6vQ822MGcE7F5udzylVAmlhd/F1avkz4u3N2Fl/DEmLomHO6ZCYE2Y0R+ObLc7nlKqBNLCXwL0iL6Kga1q8L+f/2bh32dhwCwQd5jWC5KO2B1PKVXCaOEvIZ7s1oioahV4cNZ69phK0H8mnPoHpveDtGS74ymlSpACC7+IVBORh0RkjoisEpFlIvKOiHQVEd1wFBNvD3fe7t8MNxGGT1tNSqUYuO092LcKvrkHMjPtjqiUKiHyLdwi8hHwIZAKvAT0A0YAi4AuwK8i0t7ZIZWlerAv/+3TlD8PnGTCvM3QqAd0fhY2z4HF4+2Op5QqITwKeP1VY8ymXKZvAr4WES+gRl4Li0ggMAVoDBhgCLANmAmEA/FAH2OM3mm8kDpGVGLEdXV4Z+lOYmsGcXvr++HYLvjtDQgKh9ghdkdUSrm4fPf4cyv6IhIkIlGO11ONMTvyWcUbwPfGmIZAU2AL8Biw2BhTD1js+F1dgrE31KdV7WD+M3sjWw+dgptehnqdYf5DsH2R3fGUUi6uUGP0IrJURAJEJBhYA7wvIq8VsEwFoD3wAWRvJE4APYBPHLN9AvS8vOhll4e7G5P6xeDv48mIqWs4nQ70+ggqNYJZg+CfjXZHVEq5sMIenK1gjDkJ3AZ8aoxpCXQsYJlaQALwkYisFZEpIuIHVDLGHHTM8w9QKbeFRWSYiMSJSFxCQkIhY5YdFf19eKtfDLuPneHRrzZgvPyg/xfgU8Hq5pm43+6ISikXVdjC7yEiVYA+wLeFXQZoBkw2xsQASVwwrGOMMVhj/xcxxrxnjIk1xsSGhYUV8i3Llpa1Q3j4xgbM33CQT5bHQ0BVq/ifPWX18T97yu6ISikXVNjC/wzwA7DDGLNKRGoDBV02ug/YZ4z5w/H7l1gbgkOOjQiOn4cvPbbKMqxdbTpFVOL5BVtYs+c4VG4MfT6Gw5th1t2QkW53RKWUiylU4TfGzDLGRBljRjh+/9sYc3sBy/wD7BWRBo5JHYHNwFxgkGPaIGDOZSVXgHXzlld7N6VyBR/un7aGY0mpULcTdH0VdvwI3z2srZyVUucp6Dz+cY4Dunm93kFEuuWzipHANBHZAEQDLwAvAjeIyHagk+N3dQUq+HoyeUBzjiSlMnrmOjIzDcTeDW1GQ9yHsPxNuyMqpVxIQefxbwTmiUgK1tk8CYAPUA+rkC/CKua5MsasA2JzeamgA8PqEjW+qgLjb4nkiW828tZPOxjVsR50fBpO7IYfn4TAGhDZ0+6YSikXkG/hN8bMAeaISD2gDVAFOAlMBYYZY7RJjAvpd3V14uKP8dqiv2hWI4i29UKh57tw8oDV1iHgKqjewu6YSimbiSkB47+xsbEmLi7O7hglwpnUdHq+/RtHTqcyf1RbqlQoB0lHYUpH6yyff/8IwbXtjqmUKgYistoYc9GoizZZK2V8vTyYPLA5Z9MyuP/ztaRlZIJfCAz4EkyGdY7/mWN2x1RK2UgLfylUJ6w8L94exerdx3npu63WxNC6cMd0a8x/5kBIP2tvSKWUbbTwl1K3NK3K4GvCmfLrLr7f5LhQumZr6DkZdv8Gc+7X0zyVKqMK26unvogsFpFNjt+jRGScc6OpK/XEzRE0rR7Iw7M2EH8kyZrYpBd0eBI2fgE/5XlCllKqFCvsHv/7wONAGoAxZgNwh7NCqaLh5eHG2/1jcHcXhk9bQ0pahvVCuwch5k5Y9jKsnWZvSKVUsSts4fc1xqy8YJr2AigBqgX58lrfaLYcPMnTc/60JopAt9eg9nUwbxT8vdTOiEqpYlbYwn9EROrgaKgmIr2Ag/kvolzF9Q0qMrJDXWbG7eWLuL3WRHdP6PMphNaHmXfB4a32hlRKFZvCFv77gP8BDUVkPzAaGO6sUKroje5Un2vqhPDk7E1sPnDSmuhTwerm6ekD03rDqUP2hlRKFYvCNmn72xjTCQgDGhpj2hpj4p2aTBUpdzdhUr8YAn09GTFtNSdT0qwXAqtD/5lw5ghM7wupSfYGVUo5XWHP6gkUkVHAs8DzIjJJRCY5N5oqaqHlvXmrfzP2Hk/m0S83kH3VdtUY6PUhHFwPXw2FzAx7gyqlnKqwQz0LsG6OvhFYneOhSpgW4cE81qUh3236hw9/iz/3QoOboMtLsG0+/PAf2/IppZyvoO6cWXyMMWOdmkQVm3+3q8Wq+GP834ItRFevQPOajs7bLYfB8V2w4h0IrgUt77E3qFLKKQq7x/+ZiAwVkSoiEpz1cGoy5TQiwsTeTbkqqBz3TVvL0dM52jd0fg4adIXvH4OtC+wLqZRymsIW/lRgIvA754Z5tF1mCVahnCfvDGjGsTPWzVsyMh3j/W7ucPv7UCUavvoXHFhra06lVNErbOF/EKhrjAk3xtRyPLS3bwkXWbUCz/aI5JftR5i0OMctlL38rDN9fEOtm7af2GNfSKVUkSts4d8BnHFmEGWPPrHV6dW8GpOWbOfnvxLOvVC+IgyYBWkpVivnlET7QiqlilRhC38SsE5E/pd1Kqeezlk6iAjP9mhMg0r+jJ6xlgMnctxUrWJD6PsZHN0OX9wFGWn2BVVKFZnCFv7ZwPPAcvR0zlKnnJc77wxoRlqG4b7P15CannnuxdrXQvc3rX4+347WVs5KlQKFOp3TGPOJs4Moe9UOK8/LvaIYMW0N//fdFp6+JfLci9H94Xg8/PwSBIVD+4ftiqmUKgL5Fn4R+cIY00dENuJo0JaTMSbKaclUsbu5SRWGtKnFh7/tIrZmMF2jqpx78brHreK/5DkIqmX19VdKlUgF7fE/4PjZzdlBlGt47KaGrNt7nEe+XE/DKv7UCStvvSBiDfkk7ofZwyGgKtS8xt6wSqnLku8YvzEmq/XyCGPM7pwPYITz46ni5uXhxlv9m+Ht6c6IqWtITs3Rt8fDG+6YCoE1YUZ/OLLDvqBKqctW2IO7N+Qy7aaiDKJcR9XAcrzeN5q/Dp/iP7M3nmvmBlAuyDrNU9xhWi9IOmJfUKXUZcm38IvIcMf4fgMR2ZDjsQvYUNDKRSReRDaKyDoRiXNMCxaRH0Vku+NnUNF8FFWU2tcP44GO9fh6zX5mrtp7/ovBtaDfDDh1EKb3g7Tk3FeilHJJBe3xfw7cAsx1/Mx6NDfGDCzke1xvjIk2xsQ6fn8MWGyMqQcsdvyuXNDIDvVoVy+Up+b+yab9F1zAVb0F3PYe7FsF39wLmZm5r0Qp5XIKGuNPNMbEG2P6XTDGf+wK3rMHkHV66CdAzytYl3Iidzfh9b7RhPh5MWLaGhKTL7iAq1EP6PwsbJ4NiyfYklEpdekKO8Z/uQywUERWi8gwx7RKOQ4a/wNUcnIGdQVCHDdvOXAimYdnrT9/vB+g9f0Q+y/47XWI+8iWjEqpS+Pswt/WGNMM60DwfSLSPueLxqoiuV4KKiLDRCROROISEhJym0UVk+Y1g3j85ggWbj7ElF92nf+iCNz0MtTrDPMfhO2L7AmplCo0pxZ+Y8x+x8/DwDfA1cAhEakC4Ph5OI9l3zPGxBpjYsPCwpwZUxXCkDbh3NS4Mi9+v5VV8ReM9Ll7WLdurNQIZg2CfzbaE1IpVShOK/wi4ici/lnPgc7AJqwDxYMcsw0C5jgrgyo6IsLLvaKoEezLfdPWkHDq7PkzePtD/y/AO8Dq5nnygD1BlVIFcuYefyXgVxFZD6wE5htjvgdeBG4Qke1AJ8fvqgTw97Fu3pKYnMYDM9aeu3lLloCq1jn+Z0/B532sn0opl+O0wm+M+dsY09TxiDTGPO+YftQY09EYU88Y0+kKzxBSxSyiSgDP9WzM8p1HeX3RXxfPULkx9PkYDm2GWXdDRnqxZ1RK5c/ZB3dVKdQ7tjp9Y6vz5pId/LQtl0M0dTtB11dhx4/w3SPaylkpF6OFX12WCT0iiagSwJiZ69h3PJebs8XeDW1GQ9wH8PtbxZ5PKZU3Lfzqsvh4ujN5QDMyMgz3fb6Ws+kZF8/U8WmIvBUWjoPNegxfKVehhV9dtvBQPyb2bsr6vSd4Yf6Wi2dwc4Oek6Ha1fD1MNi7qvhDKqUuooVfXZEujSsztF0tPvl9N3PX53IKp2c56Dcd/KvA9Dvg2K6L51FKFSst/OqKPdKlIbE1g3jsqw3sOJzLKZx+oTDgSzAZMK03nNETuZSykxZ+dcU83a2bt5TzdGf41DWcSc3lFM7QunDH53BiN8y8E9LPXjyPUqpYaOFXRaJyBR8m9YthR8Jpnvh648XN3MC6VWPPybD7V5g7Uk/zVMomWvhVkWlTN5Sxneoze90BPl+5J/eZmvSCDuNgw0xY+n/FG1ApBWjhV0Xsvuvrcl2DMCbM3czGfYm5z9TuIYgZCD+/BGunFW9ApZQWflW03NyE1/pEE1rei+HTVpN4Ju3imUSg2+tQ+zqYNwr+/rm4YypVpmnhV0UuyM+Ltwc049DJFMZ+sY7MC5u5Abh7Qp9PIaSedbD38NbiD6pUGaWFXzlFTI0gxnVtxOKth/nfsr9zn8mngtXN09PHOs3z1KHiDalUGaWFXznNXa1r0i2qChN/2MrvO4/mPlNgdeg/E84cgel9ITWpeEMqVQZp4VdOIyK8eHsU4aF+jJy+lsMnU3KfsWqMdQevg+vhq6GQmUvfH6VUkdHCr5yqvLcH7w5sTtLZdEZOX0t6RmbuMza4Cbq8CNvmW03dlFJOo4VfOV39Sv48f2tj/th1jFd/zOXmLVla3gOtRsCKd+CP/xVfQKXKGC38qljc1qwa/VvWYPLSnSzanM9B3M7PQYOu8P1jsO274guoVBmihV8Vm6e6NaLxVQGM/WIde4/lcvMWADd3uP19qNIUvhwCB9YWb0ilygAt/KrY+Hi6807/5hhgxLQ1ud+8BcDLD/rNBN9Q+LwvnNhbrDmVKu208KtiVSPEl//2iWbj/kSe/XZz3jP6V7LO8U9Lsc7xT8mj/YNS6pJp4VfF7oZGlbjn2tpMXbGH2Wv35z1jxYbQ9zM4uh2+uAsycmn/oJS6ZFr4lS0e7tyAq2sF8/jXG9l+KJebt2SpfS10fxP+XgrfjtZWzkoVAS38yhYe7m681S8GP28P7p26mqSzudy8JUt0f2j/CKydCr+8WnwhlSqltPAr21QM8GFSv2h2HUnisbxu3pLl+icgqi8seRY2fll8IZUqhbTwK1tdUyeUBzs3YN76A0xdsTvvGUWsIZ+abWD2cNi9vPhCKlXKOL3wi4i7iKwVkW8dv9cSkT9EZIeIzBQRL2dnUK5t+LV16NCwIs98u5l1e0/kPaOHN/SdCoE1YUZ/OLKj2DIqVZoUxx7/A8CWHL+/BLxmjKkLHAf+VQwZlAtzcxP+26cpFf19uG/aGo4npeY9s2+wdZqnuMO0XpB0pPiCKlVKOLXwi0g1oCswxfG7AB2ArEHaT4CezsygSoZAXy8mD2xGwqmzed+8JUtwLeg3A04dtPb80/Lo+qmUypWz9/hfBx4BsloyhgAnjDFZp3DsA67KbUERGSYicSISl5CQ4OSYyhVEVQvkyVsa8dO2BCb/vDP/mau3gNveg70rYfa9kJlH10+l1EWcVvhFpBtw2Biz+nKWN8a8Z4yJNcbEhoWFFXE65aoGtqxBj+iqvLpwG8t3FDCM06gH3PAM/PkNLJ5QPAGVKgWcucffBuguIvHADKwhnjeAQBHxcMxTDcjn0k1V1ogIL9zahNph5Rk1Yy2H8rp5S5ZrRkLsEPjtdYj7qFgyKlXSOa3wG2MeN8ZUM8aEA3cAS4wxA4CfgF6O2QYBc5yVQZVMft4evDuwGWdSM7j/8zWk5XXzFrBO87xpItS9AeY/CNsXFV9QpUooO87jfxQYKyI7sMb8P7Ahg3JxdSv683+3NWFV/HFe+WFb/jO7e0Dvj6BSI5g1GP7ZVCwZlSqpiqXwG2OWGmO6OZ7/bYy52hhT1xjT2xhztjgyqJKnR/RV3NmqJv9b9jc//PlP/jN7+0P/L6yfn/eBkweKJ6RSJZBeuatc2rhuEURVq8BDs9az+2hS/jMHVIUBX1gtnD/vA2fzaf6mVBmmhV+5NG8Pd97u3ww3EYZPXUNKWh43b8lSuQn0/gQObbbu4JWRT/M3pcooLfzK5VUP9uW1vk3ZfPAkE+b9WfAC9TpB11dh+0L47hFt5azUBbTwqxKhQ8NK3Hd9Haav3MuXq/cVvEDs3dDmAYj7AH5/y/kBlSpBtPCrEmNMp/q0rh3CuNkb2frPyYIX6DgeGvWEhU/CZj1rWKkskm8PdBcRGxtr4uLi7I6hXMDhUyl0m/Qrft4ezL2/Df4+nvkvkJYMn3SHg+ugekuoGAEVGzkeDcGnQrHkVsoOIrLaGBN70XQt/Kqk+ePvo/Sf8gddIivzVv8YrN5/+Ug6CktfgIPr4fAWSD197rWAatb5/9kbhAgIbQCePs79EEoVg7wKv0duMyvlylrWDuGRGxvwf99tJXZ5EHe3qZX/An4h1sFesJq5Je61NgCHNzseW2DnT5DpuJm7uEFwHWsjUCny3EYhqJZ1sZhSJZz+K1Yl0rD2tYnbfZwXFmyhafVAmtUIKtyCbm4QVNN6NOhybnpGGhz7Gw79eW6jcOhP2DIPcHwrdveGsAbnvhlUbGR9Wwi4ymodoVQJoUM9qsRKTE6j25u/kJFh+HZUO4L9nHAzt9QzcGSbtTHI3ihsgVM5rgz2DnBsCCKgYo5vCH4hRZ9HqUugY/yqVNq0P5HbJi+nVe0QPh7cAje3YtrzTj6eY7hoy7kNQ8qJc/OUr3T+sYOKkdY3Bu/yxZNRlXla+FWp9fkfe3jim42MvaE+ozrWsy+IMXDqnxwbg6xjCFshPfncfIE1zw0TZW0UQuqBh95+WhUtPbirSq1+V1cnLv4Yry36i2Y1gmhbL9SeICIQUMV61O14bnpmBpzYbbWRyLlB2L4QjKMFhZuHVfxzHjuoGAGB4dZxCaWKkO7xq1LhTGo6Pd/+jSOnU5k/qi1VKpSzO1LB0s/C0R0XHD/YbG0ksnj6Og4oR+Y4jtAI/CvrAWVVIB3qUaXezoTTdH/zVxpWCWDGsFZ4upfQPeWzpyFh6/lDRoc2Q9Lhc/OUC8px7CDroHJDa7pSDlr4VZkwb/0BRk5fy7/b1mJct0Z2xylaSUcuvv7g8BY4m6N9hX/Viy9IC2sIniXgG5AqcjrGr8qEW5pWZfXu40z5dRex4UF0aVzF7khFxy8UarWzHlmMgcR9F5xh9Cfs+gUysu5xJBBc+4LjB42si9T0grQySf+rq1LniZsjWLf3BA/P2kCDygHUCvWzO5LziEBgdetRv/O56RnpcHzXuWGirI3CtgVgHPcwdveC0PoXX5BWoboePyjldKhHlUr7TyTTddIvVA7wYfZ9bfDxdLc7kmtISzl3QVrWxuDQZjiZo9W1l791vODCC9LKh9mXW10WHeNXZc7SbYe5++NV9G5ejZd7NbU7jmtLSbSuN8h5/ODQn5B87Nw8vqHnX3uQ9dPb377cKl86xq/KnOsaVGTk9XWZtGQHsTWD6dOiut2RXJdPBajR0npkMQZOH774grQ1n0FajvsfV6jhaGiXY6MQWh88vIv/c6hC0T1+VaplZBru+vAPVu46Rp2w8gT4eOLv40FAOU8Csn96ElDOw/Hz/N/9fTzwKKmnhTpLZiYk7rm4f9GRv3J0OHWHkLrnfzOoFAlB4eCmw27FRYd6VJl19PRZ3li8nUMnUziZnM7JlDTr4Xhe0P8Cfl7ueWwgdMNxnow0xwVpF/QvOh5PdodTD58cHU5zfEMIqKoHlJ1AC79SucjMNCSlpnMyJZ2TyWnWI+t5jo3DRb87ecOR9a3E38ej5F6IliU1CRK2XTBktAVOHTw3j0+FC44dOJ77BtuXuxTQwq+UE1zphuNUShqZBfwv6OvlflnfNlx+w3Hm2AXXHziOIaQknpunfOULbojjuCDNqxSfoluEir3wi4gPsAzwxjqI/KUx5mkRqQXMAEKA1cCdxpjU/NalhV+VVsYYklIzzt8wZD/PYyNywQalVG04jLG+CWRff+DYICRshfQUx0xiHSvIPnbg+IYQUhfcC7gHcxljR+EXwM8Yc1pEPIFfgQeAscDXxpgZIvIusN4YMzm/dWnhVyp3dm44/AvYaGRtXIpkw5GZYR0ryHmq6eEt1jGF7A6nnhBa7+LTTQNrltkOp7YO9YiIL1bhHw7MByobY9JFpDUw3hhzY37La+FXyjny2nCcOnvhRiT3jcbJlHQyCthylPN0v6xvG1kbFy+PfIp2+lk4sv2C/kWb4cSec/N4+uW4IC3HQeXyFUv9AWVbzuMXEXes4Zy6wNvATuCEMSbdMcs+4Ko8lh0GDAOoUaOGM2MqVWaJCOW9PSjv7UFVLr2RmzGGM6kZeR/PyGXDceR0Kn8fSSrCDUc5Asq1IqBiOwJqWvNVcE8h6PRO/BK343Fkq9W/6K8fYO3UHCsOPv/YQdY3BJ8Kl/x3KGmcWviNMRlAtIgEAt8ADS9h2feA98Da43dKQKXUFRER/Lw98PP2oMpl1MvCbjhOpaRnTzualMquI0mcTEknMTmtgA1HGD6elQjw6URAOU+qh56mgft+6po91MyIp+qReML2TsMr49wFaal+VUkPaQiVIvCq0hiPKpHWBWmlqMNpsVy5a4w5ISI/Aa2BQBHxcOz1VwP2F0cGpZTrKYoNR3JaRt5nT110nMOH5SkV+D65Xvb09MxMruII9d320UD2Uv/kPhqe2kmd3cvwEGtwIgM3DrhVYZ9nOId8anPMrw4nA+qTVqEm/r7l8jy+4e/jgbeH612w5rTCLyJhQJqj6JcDbgBeAn4CemGd2TMImOOsDEqp0k1E8PXywNfLg8oVfC55+bw2HH8lp7P6TDJyfBe+J7YRcHI7IUk7CT+7i6sTf8c9MRMOwFnjyQ5TlW2mOhszq7PNVOOvzOocIASwjh/4eLrlOUzl71Pw9R3O2HA4c4+/CvCJY5zfDfjCGPOtiGwGZojIc8Ba4AMnZlBKqTwVvOGoi7XPmkNasuOCtC14Hd5Mw3/+pOHhLbif/vXcLB7lOV6+LgnlarPfM5x4j3B2UIODaR4cT0pl99EznExOIzE5jfQCjnH8MLo9DSoXbSM8pxV+Y8wGICaX6X8DVzvrfZVSyqk8y0HVaKgajQDZ++PJJ6zrDQ79iefhLVQ8vIWKh38iMvn4uWX9KloHkOtaB5VNWAQpQfU5memd5zBV5YBL/yZTEO3OqZRSRaFcINRoZT2yGAOnD51/74PDm2H1x5B2BgHKAeUCa1Ip5/UHVRpBSD3w8HJKVC38SinlLCLgX9l61OlwbnpmJpzYffH9k3f8CJmOs93dPKyrkft8BmH1izSWFn6llCpubm4QXMt6NOx6bnp66gUdTjdb91ouYlr4lVLKVXh4Wb2HKjVy6tuUzQYWSilVhmnhV0qpMkYLv1JKlTFa+JVSqozRwq+UUmWMFn6llCpjtPArpVQZo4VfKaXKmGK59eKVEpEEYPdlLh4KHCnCOM5WkvJqVucpSXlLUlYoWXmvNGtNY0zYhRNLROG/EiISl9s9J11VScqrWZ2nJOUtSVmhZOV1VlYd6lFKqTJGC79SSpUxZaHwv2d3gEtUkvJqVucpSXlLUlYoWXmdkrXUj/ErpZQ6X1nY41dKKZWDFn6llCpjSm3hF5EPReSwiGyyO0tBRKS6iPwkIptF5E8RecDuTPkRER8RWSki6x15J9idqSAi4i4ia0XkW7uzFERE4kVko4isE5E4u/PkR0QCReRLEdkqIltEpLXdmfIiIg0cf9Osx0kRGW13rryIyBjH/1+bRGS6iBTZXddL7Ri/iLQHTgOfGmMa250nPyJSBahijFkjIv7AaqCnMWazzdFyJSIC+BljTouIJ/Ar8IAxZoXN0fIkImOBWCDAGNPN7jz5EZF4INYY4/IXGYnIJ8AvxpgpIuIF+BpjTtgcq0Ai4g7sB1oaYy734lCnEZGrsP6/amSMSRaRL4AFxpiPi2L9pXaP3xizDDhmd47CMMYcNMascTw/BWwBrrI3Vd6M5bTjV0/Hw2X3IESkGtAVmGJ3ltJERCoA7YEPAIwxqSWh6Dt0BHa6YtHPwQMoJyIegC9woKhWXGoLf0klIuFADPCHzVHy5Rg6WQccBn40xrhy3teBR4BMm3MUlgEWishqERlmd5h81AISgI8cw2hTRMTP7lCFdAcw3e4QeTHG7AdeAfYAB4FEY8zColq/Fn4XIiLlga+A0caYk3bnyY8xJsMYEw1UA64WEZccThORbsBhY8xqu7NcgrbGmGbATcB9jmFLV+QBNAMmG2NigCTgMXsjFcwxJNUdmGV3lryISBDQA2vjWhXwE5GBRbV+LfwuwjFW/hUwzRjztd15Csvx1f4noIvNUfLSBujuGDefAXQQkan2RsqfY28PY8xh4BvgansT5WkfsC/Ht70vsTYEru4mYI0x5pDdQfLRCdhljEkwxqQBXwPXFNXKtfC7AMfB0g+ALcaY/9qdpyAiEiYigY7n5YAbgK22hsqDMeZxY0w1Y0w41tf7JcaYIttzKmoi4uc4wI9j2KQz4JJnphlj/gH2ikgDx6SOgEuekHCBfrjwMI/DHqCViPg66kNHrGN/RaLUFn4RmQ78DjQQkX0i8i+7M+WjDXAn1t5o1qlmN9sdKh9VgJ9EZAOwCmuM3+VPkywhKgG/ish6YCUw3xjzvc2Z8jMSmOb4txANvGBvnPw5NqY3YO1BuyzHt6gvgTXARqxaXWTtG0rt6ZxKKaVyV2r3+JVSSuVOC79SSpUxWviVUqqM0cKvlFJljBZ+pZQqY7TwqxJPRJaKiNNvni0ioxwdKKc5+72UciYPuwMoZScR8TDGpBdy9hFAJ2PMvst4H8E6fdql+gW5ai7lXLrHr4qFiIQ79pbfd/QYX+i46ve8PXYRCXW0V0BEBovIbBH50dGj/n4RGetoCLZCRIJzvMWdjgvfNonI1Y7l/Rz3ZVjpWKZHjvXOFZElwOJcso51rGdTVr92EXkXqA18JyJjLph/sIjMcXyO7SLydI7PvE1EPsW6+ra6iEx0rHejiPTNsY5HHdPWi8iLjml1ROR7R7O2X0SkoWN6b8c61ovIMse0SMfnXCciG0SkXj6fJbdcH+fIdd7nU6WQMUYf+nD6AwgH0oFox+9fAAMdz5di9Z8HCAXiHc8HAzsAfyAMSATudbz2GlYzu6zl33c8bw9scjx/Icd7BAJ/AX6O9e4DgnPJ2RzrSkk/oDzwJxDjeC0eCM1lmcFYHRRDgHJYxTTW8ZkzgVaO+W4HfgTcsa7Q3YN1FfRNwHKsXvZk5cLaKNVzPG+J1W4CR76rsj6X4+ebwADHcy9Hjlw/Sy65mmNdfU3Odeqj9D50j18Vp13GmHWO56uxClBBfjLGnDLGJGAV/nmO6RsvWH46ZN+HIcDRS6gz8JhY7aOXAj5ADcf8PxpjcrtfQ1vgG2NMkrHuOfA10K4QOX80xhw1xiQ7lmnrmL7bnLtBTVtgurE6mx4CfgZaYDXk+sgYc8bxGY45OrVeA8xy5P8f1kYC4DfgYxEZirURAas9yRMi8ihQ05Ejv8+SM9ffQG0ReVNEugAu3RlWXTkd41fF6WyO5xlYe6VgfRPI2gm58PZyOZfJzPF7Juf/+72w94gBBLjdGLMt5wsi0hKrhXBRyu39uYL3cQNOGKv19fkrNuZex2foCqwWkebGmM9F5A/HtAUick8B68/OZYw5LiJNgRuBe4E+wJDLzK1KAN3jV64gHmu4AaDXZa6jL4CItMW6aUUi8AMw0nEAExGJKcR6fgF6Oroi+gG3OqYV5AYRCXYct+iJtVee27r7inUTmzCsYamVWMM/d4uIryNnsLHux7BLRHo7pomjOCMidYwxfxhjnsK6EUp1EakN/G2MmQTMAaIK+1lEJBRwM8Z8BYyjZLRWVldA9/iVK3gF+EKsu03Nv8x1pIjIWqzbQGbtrT6LdfetDSLiBuwC8r3frrHue/wxVkEGmGKMWVuI91+JdT+FasBUY0ycWHdTy+kboDWwHusbwSPGam38vYhEA3EikgosAJ4ABgCTRWSc43PNcCw70XHwVrCOA6wHHsU6wJ0G/AO84Bgyuuiz5JLrKqy7aGXtCD5eiM+rSjDtzqnUFRKRwVgHp++3O4tShaFDPUopVcboHr9SSpUxusevlFJljBZ+pZQqY7TwK6VUGaOFXymlyhgt/EopVcb8P8L5mqGXWyj6AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import numpy\n", + "import matplotlib.pyplot as plt\n", + "\n", + "n_grid_each_dir = 100\n", + "\n", + "stencil_order = 1\n", + "#stencil_order = 3\n", + "\n", + "sweep_type = 2 \n", + "\n", + "# only domain decomposition with\n", + "nsubdom = [1,2,4,8]\n", + "time_only_domain_decomp = [85.3463,64.9523,31.8637,28.703]\n", + "L1_error_only_domain_decomp = [0.390742,0.382573,0.382575,0.382537]\n", + "Linf_error_only_domain_decomp = [1.33398,1.73339,1.73339,1.73339]\n", + "\n", + "# only sweep parallelization\n", + "nsubproc = [1,2,4,8]\n", + "time_only_sweep_parallelization = [85.3463,65.819,36.532,27.7725]\n", + "L1_error_only_sweep_parallelization = [0.390742,0.382708,0.382708,0.382708]\n", + "Linf_error_only_sweep_parallelization = [1.33398,1.73339,1.73339,1.73339]\n", + "\n", + "# both\n", + "\n", + "\n", + "plt.plot(nsubdom,time_only_domain_decomp,label='domain decomposition')\n", + "plt.plot(nsubproc,time_only_sweep_parallelization,label='sweep parallelization')\n", + "plt.xlabel('number of processors')\n", + "plt.ylabel('time (s)')\n", + "plt.legend()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtMAAAFzCAYAAAD8AIVCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAACRd0lEQVR4nOzdd3hUxdfA8e+k90A6PUBCCyVAQu9dpSqIBQVUEJQu2H+KiK8iKoKCiCJiBSug0pv0XoTQEiDUEJIAKaTvzvvHhgjSAmxyU87neXzC7t69czbmbk5mZ85RWmuEEEIIIYQQd87G6ACEEEIIIYQoqiSZFkIIIYQQ4i5JMi2EEEIIIcRdkmRaCCGEEEKIuyTJtBBCCCGEEHdJkmkhhBBCCCHukp3RAdwLHx8fHRgYaHQYQghxV3bu3BmvtfY1Oo6CIu/ZQoii7Gbv2UU6mQ4MDGTHjh1GhyGEEHdFKXXC6BgKkrxnCyGKspu9Z8syDyGEEEIIIe6SJNNCCCGEEELcJUmmhRBCCCGEuEtFes20EPkhKyuL06dPk56ebnQoophwcnKifPny2NvbGx1KoSPXm7A2ud5EQZNkWoj/OH36NO7u7gQGBqKUMjocUcRprUlISOD06dNUrlzZ6HAKHbnehDXJ9SaMIMs8hPiP9PR0vL295Re7sAqlFN7e3jLzehNyvQlrkutNGEGSaSFuQH6xC2uSn6dbk++PsCb5eRIFTZJpIQq58ePH88EHH+TrGPfffz+XLl266+e7ublZL5gCtmjRIt577z0AFixYwIEDB3Ife+ONN1i5cqVRoQkDyPWWv+R6E8VRvq2ZVkp9BXQFzmuta+fcNxnoBmQCR4GBWutLOY+9AjwNmIARWutl+RWbEOJaixcvNjoEw3Tv3p3u3bsDll/uXbt2pVatWgBMmDDByNBEMSXXm1xvonjJz5npr4Eu/7lvBVBba10XOAK8AqCUqgU8AoTkPGeGUso2H2MTolB75513qFatGi1atODw4cO59+/Zs4cmTZpQt25devXqxcWLFwFo06YNo0ePJiwsjJo1a7J9+3YefPBBgoODef3113Of37NnTxo2bEhISAizZs3KvT8wMJD4+Hiio6OpWbMmgwYNIiQkhE6dOpGWlnZdfMePH6dp06bUqVPnmvMDTJ48mfDwcOrWrcubb76Ze/8333xD3bp1qVevHk888QQA0dHRtGvXjrp169K+fXtOnjwJwIABAxg6dChNmjShSpUqrF27lqeeeoqaNWsyYMCA3HO6ubkxevRoQkJCaN++PXFxcbf8Pk2bNo1atWpRt25dHnnkEQC+/vprhg0bxqZNm1i0aBHjxo0jNDSUo0ePMmDAAH755RcAVq1aRf369alTpw5PPfUUGRkZud+7N998kwYNGlCnTh0OHTp0J/+rizylVCml1C9KqUNKqYNKqaZGx3Sn5HqT602Ie5FvM9Na63VKqcD/3Lf8qptbgN45/+4BzNNaZwDHlVJRQCNgc37FJ0RevPVHBAfOJln1nLXKevBmt5CbPr5z507mzZvHnj17yM7OpkGDBjRs2BCAJ598kk8++YTWrVvzxhtv8NZbb/Hxxx8D4ODgwI4dO5g6dSo9evRg586deHl5UbVqVUaPHo23tzdfffUVXl5epKWlER4ezkMPPYS3t/c140dGRvLjjz/yxRdf8PDDD/Prr7/Sr1+/a44ZOXIkQ4cO5cknn2T69Om59y9fvpzIyEi2bduG1pru3buzbt06vL29mThxIps2bcLHx4cLFy4AMHz4cPr370///v356quvGDFiBAsWLADg4sWLbN68mUWLFtG9e3c2btzIl19+SXh4OHv27CE0NJTLly8TFhbGlClTmDBhAm+99RaffvrpTb9P7733HsePH8fR0fG6j9mbNWtG9+7d6dq1K717977msfT0dAYMGMCqVauoVq0aTz75JJ999hmjRo0CwMfHh127djFjxgw++OADvvzyyzz9LBQTU4GlWuveSikHwOVuTyTXm1xvINebKHqMXDP9FLAk59/lgFNXPXY65z6rO3l4Nwc2L7n9gUIYZP369fTq1QsXFxc8PDxyPxJNTEzk0qVLtG7dGoD+/fuzbt263OddOa5OnTqEhIRQpkwZHB0dqVKlCqdOWS6vadOmUa9ePZo0acKpU6eIjIy8bvzKlSsTGhoKQMOGDYmOjr7umI0bN/Loo48C5M56geWX+/Lly6lfvz4NGjTg0KFDREZGsnr1avr06YOPjw8AXl5eAGzevJnHHnss9zwbNmzIPVe3bt1QSlGnTh38/f2pU6cONjY2hISE5MZkY2ND3759AejXrx8bNmy45fepbt26PP7443z33XfY2eV9LuHw4cNUrlyZatWqXXdOgAcffPCW36/iSinlCbQC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79304aVLl1K2bFn++suynj8xMRFXV1f27NkDwPr166lduzbbt28nOzubxo0ttTMHDx7MzJkzCQ4OZuvWrTz33HOsXr2akSNHMnr0aFq0aMHJkyfp3LkzBw8eBOCff/5hy5YtXL58mfr16/PAAw9QtmzZa+I5fPgws2fPpnnz5jz11FPMmDGDsWPHMmzYMN544w0AnnjiCf7880+6desGQGZmJlc63V28eJEtW7aglOLLL7/k/fff58MPP7zp67/Z67iRsLCw3O/LuHHj6NKlCwAPPvgggwYNAuD1119n9uzZDB8+nO7du9O1a1d69752h3d6ejoDBgxg1apVVKtWjSeffJLPPvuMUaNGAeDj48OuXbuYMWMGH3zwAV9++eVN4xf3QK43ud6Q603k3c7YnZRzK0eAawCP13zcsDhKdDKNc2kuedWjcfwudpy4SJMq3kZHJAR16tThhRde4KWXXqJr1660bNkSgKpVq3Lw4EG2bdvGmDFjWLduHSaTiZYtW5KSksKmTZvo06dP7nmuzPSsXLnymnWLSUlJuc0XevTogbOzM87OzrRt25Zt27bRs2fPa+KpUKECzZs3B6Bfv35MmzaNsWPHsmbNGt5//31SU1O5cOECISEhub/c+/btm/v806dP07dvX2JiYsjMzKRy5co3fe23eh23Mn/+fHbt2sXy5csB2L9/P6+//jqXLl0iJSWFzp073/L5hw8fpnLlylSrVg2A/v37M3369Nxf7ldmKRs2bMhvv/1223hE0SHXm1xvomjaF7ePoSuHEh4QzvT20w2NpWQn04Bb7S7UW/cuH+w5SJMqLYwORxQ2t5jRyi/VqlVj165dLF68mNdff5327dvzxhtv0KpVK5YsWYK9vT0dOnRgwIABmEwmJk+ejNlsplSpUrmzRlczm81s2bIFJyen6x777waNG23YuNEx6enpPPfcc+zYsYMKFSowfvx40tPTc49xdXXN/ffw4cMZM2YM3bt3Z+3atYwfP/6mr/1Wr+Nm9u/fz/jx41m3bh22traA5WPpBQsWUK9ePb7++mvWrl2b5/PdiKOjIwC2trZkZ2ff07nELcj1Jtcbcr2J24u8GMnQVUPxdvJmfNPxRodTstdMAzhU7wTA5YPLc9egCWGks2fP4uLiQr9+/Rg3bhy7du0CoGXLlnz88cc0bdoUX19fEhISOHz4MLVr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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# test 2\n", + "# first order stencil\n", + "\n", + "n_grid_each_dir = 100\n", + "\n", + "stencil_order = 1\n", + "#stencil_order = 3\n", + "\n", + "sweep_type = 2 \n", + "\n", + "# only domain decomposition with\n", + "nsubdom = [1,2,4,6]\n", + "time_only_domain_decomp = [119.745,66.6102,42.9897,36.4134] \n", + "L1_error_only_domain_decomp = [] \n", + "Linf_error_only_domain_decomp = [] \n", + "\n", + "# only sweep parallelization\n", + "nsubproc = [1,2,4,6]\n", + "time_only_sweep_parallelization = [119.745,60.6498,37.7447,29.9794]\n", + "L1_error_only_sweep_parallelization = []\n", + "Linf_error_only_sweep_parallelization = []\n", + "\n", + "# speed up\n", + "dom_decomp_speedup = []\n", + "swp_para_speedup = []\n", + "\n", + "# calculate speedup rate\n", + "for i in range(len(time_only_domain_decomp)):\n", + " dom_decomp_speedup.append(time_only_domain_decomp[0]/time_only_domain_decomp[i])\n", + " swp_para_speedup.append(time_only_sweep_parallelization[0]/time_only_sweep_parallelization[i])\n", + "\n", + "fig, axs = plt.subplots(1,2, figsize=(12,6))\n", + "\n", + "# plot raw time\n", + "axs[0].plot(nsubdom,time_only_domain_decomp,label='domain decomposition')\n", + "axs[0].plot(nsubproc,time_only_sweep_parallelization,label='sweep parallelization')\n", + "axs[0].set_xlabel('number of processors')\n", + "axs[0].set_ylabel('time (s)')\n", + "axs[0].legend()\n", + "\n", + "# plot speedup\n", + "axs[1].plot(nsubdom,dom_decomp_speedup,label='domain decomposition')\n", + "axs[1].plot(nsubproc,swp_para_speedup,label='sweep parallelization')\n", + "axs[1].set_xlabel('number of processors')\n", + "axs[1].set_ylabel('speedup')\n", + "# plot perfect speedup\n", + "axs[1].plot(nsubdom,nsubdom,'--',label='perfect')\n", + "# plot 70 % speedup\n", + "nsubdom_70 = [1,1*0.7+1,1+3*0.7,1+5*0.7]\n", + "axs[1].plot(nsubdom,nsubdom_70,'--',label='70 %')\n", + "axs[1].legend()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'number of iterations')" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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IYqTvCB5QYjiJC9IXjCKjIgQVfL8888TGBjIwIEDCQ8PL7x9z5499O3bl5CQEK6++mrOnTsHwNChQ3nggQfo2bMnQUFB/PPPP1xzzTW0a9eOuXPnFu5/1VVX0aNHDzp16sSSJUsKb2/VqhUJCQlEREQQFBTEbbfdRqdOnRg1ahQZGRkXxXfixAn69etHcHDwBccHePXVV+nVqxchISE8/fTThbd/8sknhISE0KVLF2666SYAIiIiuOyyywgJCWH48OGcOnUKgOnTp3PXXXfRt29fAgIC2LBhAzNnziQoKIjp06cXHtPNzY0HHniATp06MXz4cOLj48t8nd5++206duxISEgI119/PQAff/wx9957L1u3bmX16tU8/PDDdO3alWPHjjF9+nS+/fZbANavX0+3bt0IDg5m5syZZGVlFb52Tz/9NN27dyc4OJiwsLCK/FcbSinlqZT6VikVppQKVUr1MzqmipJzRc4VUb0kL0hekLxQfymlbJVS/yqlfjL//JdSao/53xml1EqDQ6w0yQuSF+oLGRFhJZ758SCHziRX6zE7NmnA01d0KvX+Xbt2sWLFCvbs2UNubi7du3enR48eANx888288847DBkyhKeeeopnnnmGt956CwAHBwd27tzJggULuPLKK9m1axeNGjWiTZs2PPDAA3h5ebF06VIaNWpERkYGvXr14tprr8XLy+uCxz9y5AhffvklH3zwAddddx3fffcdU6dOvWCb2bNnc9ddd3HzzTezcOHCwtvXrl3LkSNH2LFjB1prJkyYwKZNm/Dy8uK5555j69ateHt7c/bsWQBmzZrFtGnTmDZtGkuXLuW+++5j5cqVAJw7d45t27axevVqJkyYwJYtW/jwww/p1asXe/bsoWvXrqSlpdGzZ0/efPNN5s+fzzPPPMO7775b6uv00ksvceLECRwdHS8aLte/f38mTJjA+PHjmThx4gX3ZWZmMn36dNavX09gYCA333wzixYt4v777wfA29ub3bt389577/Haa6/x4Ycflut3oQ5YAPyqtZ6olHIAXCp7IDlX5FwBqz5X6hPJC5IXJC/UX7OBUKABgNZ6UMEdSqnvgFVVfQDJC5IXQPJCTbL6ERFRR/awf9NKo8OwSn/99RdXX301Li4uNGjQoHBoU1JSEufPn2fIkCEATJs2jU2bNhXuV7BdcHAwnTp1wt/f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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# test 3 time par iteration\n", + "# first order stencil\n", + "\n", + "n_grid_each_dir = 100\n", + "\n", + "stencil_order = 1\n", + "#stencil_order = 3\n", + "\n", + "sweep_type = 2 \n", + "\n", + "# only domain decomposition with\n", + "nsubdom = [1,2,4,6]\n", + "time_only_domain_decomp = [122.169,77.0518,40.005,35.3397] \n", + "n_iter_dom_decomp = [39,45,46,47]\n", + "\n", + "# only sweep parallelization\n", + "nsubproc = [1,2,4,6]\n", + "time_only_sweep_parallelization = [102.32,55.6871,35.7869,27.649]\n", + "n_iter_swp_para = [39,39,39,39]\n", + "\n", + "# time par iteration\n", + "dom_decomp_time_par_iteration = []\n", + "swp_para_time_par_iteration = []\n", + "\n", + "# calculate time par iteration\n", + "for i in range(len(time_only_domain_decomp)):\n", + " dom_decomp_time_par_iteration.append(time_only_domain_decomp[i]/n_iter_dom_decomp[i])\n", + " swp_para_time_par_iteration.append(time_only_sweep_parallelization[i]/n_iter_swp_para[i])\n", + "\n", + "# speed up\n", + "dom_decomp_speedup = []\n", + "swp_para_speedup = []\n", + "# speed up par iteration\n", + "dom_decomp_speedup_par_iter = []\n", + "swp_para_speedup_par_iter = []\n", + "\n", + "\n", + "# calculate speedup rate\n", + "for i in range(len(time_only_domain_decomp)):\n", + " dom_decomp_speedup.append(time_only_domain_decomp[0]/time_only_domain_decomp[i])\n", + " swp_para_speedup.append(time_only_sweep_parallelization[0]/time_only_sweep_parallelization[i])\n", + "\n", + "# calculate time par iteration\n", + "for i in range(len(time_only_domain_decomp)):\n", + " dom_decomp_speedup_par_iter.append(dom_decomp_time_par_iteration[0]/dom_decomp_time_par_iteration[i])\n", + " swp_para_speedup_par_iter.append(swp_para_time_par_iteration[0]/swp_para_time_par_iteration[i])\n", + "\n", + "fig, axs = plt.subplots(1,4, figsize=(18,6))\n", + "\n", + "# plot raw time\n", + "axs[0].plot(nsubdom,time_only_domain_decomp,label='domain decomposition')\n", + "axs[0].plot(nsubproc,time_only_sweep_parallelization,label='sweep parallelization')\n", + "axs[0].set_xlabel('number of processors')\n", + "axs[0].set_ylabel('time (s)')\n", + "axs[0].legend()\n", + "# title\n", + "axs[0].set_title('time')\n", + "\n", + "# plot speedup\n", + "axs[1].plot(nsubdom,dom_decomp_speedup,label='domain decomposition')\n", + "axs[1].plot(nsubproc,swp_para_speedup,label='sweep parallelization')\n", + "axs[1].set_xlabel('number of processors')\n", + "axs[1].set_ylabel('speedup')\n", + "# plot perfect speedup\n", + "axs[1].plot(nsubdom,nsubdom,'--',label='perfect')\n", + "# plot 70 % speedup\n", + "nsubdom_70 = [1,1*0.7+1,1+3*0.7,1+5*0.7]\n", + "axs[1].plot(nsubdom,nsubdom_70,'--',label='70 %')\n", + "axs[1].legend()\n", + "# title\n", + "axs[1].set_title('speedup')\n", + "\n", + "# plot speed up par iteration\n", + "axs[2].plot(nsubdom,dom_decomp_speedup_par_iter,label='domain decomposition')\n", + "axs[2].plot(nsubproc,swp_para_speedup_par_iter,label='sweep parallelization')\n", + "axs[2].set_xlabel('number of processors')\n", + "axs[2].set_ylabel('speedup')\n", + "# plot perfect speedup\n", + "axs[2].plot(nsubdom,nsubdom,'--',label='perfect')\n", + "# plot 70 % speedup\n", + "nsubdom_70 = [1,1*0.7+1,1+3*0.7,1+5*0.7]\n", + "axs[2].plot(nsubdom,nsubdom_70,'--',label='70 %')\n", + "axs[2].legend()\n", + "# title\n", + "axs[2].set_title('speedup par iteration')\n", + "\n", + "# plot the number of iterations\n", + "axs[3].plot(nsubdom,n_iter_dom_decomp,label='domain decomposition')\n", + "axs[3].plot(nsubproc,n_iter_swp_para,label='sweep parallelization')\n", + "axs[3].set_xlabel('number of processors')\n", + "axs[3].set_ylabel('number of iterations')\n", + "axs[3].legend()\n", + "# title\n", + "axs[3].set_title('number of iterations')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# test 3\n", + "# third order stencil\n", + "\n", + "n_grid_each_dir = 100\n", + "\n", + "#stencil_order = 1\n", + "stencil_order = 3\n", + "\n", + "sweep_type = 2 \n", + "\n", + "# only domain decomposition with\n", + "nsubdom = [1,2,4,6]\n", + "time_only_domain_decomp = [] \n", + "L1_error_only_domain_decomp = [] \n", + "Linf_error_only_domain_decomp = [] \n", + "\n", + "# only sweep parallelization\n", + "nsubproc = [1,2,4,6]\n", + "time_only_sweep_parallelization = []\n", + "L1_error_only_sweep_parallelization = []\n", + "Linf_error_only_sweep_parallelization = []\n", + "\n", + "# speed up\n", + "dom_decomp_speedup = []\n", + "swp_para_speedup = []\n", + "\n", + "# calculate speedup rate\n", + "for i in range(len(time_only_domain_decomp)):\n", + " dom_decomp_speedup.append(time_only_domain_decomp[0]/time_only_domain_decomp[i])\n", + " swp_para_speedup.append(time_only_sweep_parallelization[0]/time_only_sweep_parallelization[i])\n", + "\n", + "fig, axs = plt.subplots(1,2, figsize=(12,6))\n", + "\n", + "# plot raw time\n", + "axs[0].plot(nsubdom,time_only_domain_decomp,label='domain decomposition')\n", + "axs[0].plot(nsubproc,time_only_sweep_parallelization,label='sweep parallelization')\n", + "axs[0].set_xlabel('number of processors')\n", + "axs[0].set_ylabel('time (s)')\n", + "axs[0].legend()\n", + "\n", + "# plot speedup\n", + "axs[1].plot(nsubdom,dom_decomp_speedup,label='domain decomposition')\n", + "axs[1].plot(nsubproc,swp_para_speedup,label='sweep parallelization')\n", + "axs[1].set_xlabel('number of processors')\n", + "axs[1].set_ylabel('speedup')\n", + "# plot perfect speedup\n", + "axs[1].plot(nsubdom,nsubdom,'--',label='perfect')\n", + "# plot 70 % speedup\n", + "nsubdom_70 = [1,1*0.7+1,1+3*0.7,1+5*0.7]\n", + "axs[1].plot(nsubdom,nsubdom_70,'--',label='70 %')\n", + "axs[1].legend()\n" + ] + } + ], + "metadata": { + "interpreter": { + "hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a" + }, + "kernelspec": { + "display_name": "Python 3.9.1 64-bit ('3.9.1': pyenv)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test/run_test.sh b/test/run_test.sh new file mode 100755 index 0000000..782ebe4 --- /dev/null +++ b/test/run_test.sh @@ -0,0 +1,42 @@ +# target directory to be run +TARGET_DIR=$1 + +# option to run only cpp code +CPP_ONLY=$2 + +if [ -z $TARGET_DIR ]; then + echo "Usage: $0 " + exit 1 +fi + +if [ ! -d $TARGET_DIR ]; then + echo "Target directory $TARGET_DIR does not exist" + exit 1 +fi + +# cd to fortran_code directory +cd $TARGET_DIR/fortran_code + +# skip here if not cpp only +if [ -z $CPP_ONLY ]; then + # compile ega5_sphe_3d_kernel.f90 + mpif90 -O3 ega5_sphe_3d_kernel.f90 + # mkdir ega5/output directory + mkdir ega5/output + # mkdir ega5/output/tele_traveltime_field directory + mkdir ega5/output/tele_traveltime_field + # run ega5_sphe_3d_kernel.f90 + ./a.out +fi + +# cd to one directory above +cd ../ + +# run make_test_model.py +python make_test_model.py +# run synthetic test with nproc 8 +mpirun --oversubscribe -np 8 ../../build/TOMOATT -i ./input_params_pre.yml +# run inverse +mpirun --oversubscribe -np 8 ../../build/TOMOATT -i ./input_params.yml + + diff --git a/tests/read_write_srcrec.cxx b/tests/read_write_srcrec.cxx new file mode 100644 index 0000000..8d3056f --- /dev/null +++ b/tests/read_write_srcrec.cxx @@ -0,0 +1,9 @@ +#include +#include "grid.h" + + +int main() { + std::cout << "Tests started!" << std::endl; + std::cout << "Tests (0) succeeded!" << std::endl; + return 0; // You can put a 1 here to see later that it would generate an error +} \ No newline at end of file diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/utils/compare_models.py b/utils/compare_models.py new file mode 100644 index 0000000..a8e5b9d --- /dev/null +++ b/utils/compare_models.py @@ -0,0 +1,67 @@ +#!/bin/python3 + +import os +import h5py +import numpy as np +import argparse + +def read_model_h5(model_path): + + with h5py.File(model_path, 'r') as f: + # read xi eta vel + xi = f['xi'][:] + eta = f['eta'][:] + vel = f['vel'][:] + + return xi, eta, vel + +# main function +if __name__ == '__main__': + """ + Compare two models + parth args + -t : true model file path + -r : result model file path + """ + + parser = argparse.ArgumentParser(description='Compare two models') + parser.add_argument('-t', '--true', type=str, help='true model file path') + parser.add_argument('-r', '--result', type=str, help='result model file path') + args = parser.parse_args() + + # read true model + xi_true, eta_true, vel_true = read_model_h5(args.true) + # read result model + xi_result, eta_result, vel_result = read_model_h5(args.result) + + # check shapes + if xi_true.shape != xi_result.shape: + print('xi shape not match') + exit(1) + + if eta_true.shape != eta_result.shape: + print('eta shape not match') + exit(1) + + if vel_true.shape != vel_result.shape: + print('vel shape not match') + exit(1) + + # print model info + print('model info: ') + print('vel shape: ', vel_true.shape) + + # compare + print('vel max error: ', np.max(np.abs(vel_true - vel_result))) + print('xi max error: ', np.max(np.abs(xi_true - xi_result))) + print('eta max error: ', np.max(np.abs(eta_true - eta_result))) + + # L2 norm + print('vel L2 norm: ', np.linalg.norm(vel_true - vel_result)) + print('xi L2 norm: ', np.linalg.norm(xi_true - xi_result)) + print('eta L2 norm: ', np.linalg.norm(eta_true - eta_result)) + + # exit + exit(0) + + diff --git a/utils/convert_param_file_2to3.py b/utils/convert_param_file_2to3.py new file mode 100644 index 0000000..340a245 --- /dev/null +++ b/utils/convert_param_file_2to3.py @@ -0,0 +1,184 @@ +import os +import argparse +from ruamel.yaml import YAML +from contextlib import suppress + +def map_value_to_bool(params_in, target_key, orig_key=None): + """ + Map an integer value to a boolean and update the target key in params_in. + + Parameters: + params_in (dict): The input dictionary. + target_key (str): The key whose value needs to be mapped to a boolean. + + Returns: + None + """ + if orig_key is None: + orig_key = target_key + print('key name {} is changed to {}'.format(orig_key, target_key)) + + value = params_in.get(orig_key, None) + if value is not None: + params_in[target_key] = bool(value) + print('value {} type is changed from int to bool'.format(target_key)) + + # remove the old key + if orig_key != target_key: + params_in.pop(orig_key, None) + +if __name__ == '__main__': + # parse the argument for the input file + parser = argparse.ArgumentParser(description='Convert a parameter file from version 2 to version 3') + parser.add_argument('-i', '--input', help='Input file name', required=True) + + args = parser.parse_args() + infile = args.input + + + # get path to this file + path_this = os.path.dirname(os.path.realpath(__file__)) + + # path to the v3 model file + v3_model_file = path_this + '/params_model_v3.yaml' + + yaml = YAML() + + # read the input file + try: + with open(infile, 'r') as f: + str_in = f.read() + params_in = yaml.load(str_in) + + except IOError: + raise ValueError('Cannot read the input file') + + # read the v3 model file + try: + with open(v3_model_file, 'r') as f: + str_v3 = f.read() + params_v3 = yaml.load(str_v3) + except IOError: + raise ValueError('Cannot read the v3 model file') + + # check the version of the input file + if params_in['version'] != 2: + raise ValueError('The input file is not version 2') + + # change version to 3 + params_v3['version'] = 3 + + # copy the values in the input file to the output file + # + # domain section + # + params_v3['domain'] = params_in['domain'] + + # + # source section + # + params_v3['source'] = params_in['source'] + map_value_to_bool(params_v3['source'], 'swap_src_rec') + + # + # model section + # + params_v3['model'] = params_in['model'] + + # + # parallel section + # + params_v3['parallel'] = params_in['parallel'] + + # change parallel->use_gpu from 0,1 to false,true + map_value_to_bool(params_v3['parallel'], 'use_gpu') + + # + # output_setting section + # + with suppress(KeyError): params_v3['output_setting']['output_dir'] = params_in['inversion']['output_dir'] + with suppress(KeyError): params_v3['output_setting']['output_source_field'] = params_in['output_setting']['is_output_source_field'] + with suppress(KeyError): params_v3['output_setting']['output_model_dat'] = params_in['output_setting']['is_output_model_dat'] + with suppress(KeyError): params_v3['output_setting']['output_final_model'] = params_in['output_setting']['is_output_final_model'] + with suppress(KeyError): params_v3['output_setting']['output_in_process'] = params_in['output_setting']['is_output_in_process'] + with suppress(KeyError): params_v3['output_setting']['single_precision_output'] = params_in['output_setting']['is_single_precision_output'] + + map_value_to_bool(params_v3['output_setting'], 'output_source_field') + map_value_to_bool(params_v3['output_setting'], 'output_model_dat') + map_value_to_bool(params_v3['output_setting'], 'output_final_model') + map_value_to_bool(params_v3['output_setting'], 'output_in_process') + map_value_to_bool(params_v3['output_setting'], 'single_precision_output') + + # remove the old key 'output_setting'->'is_verbose_output' + params_v3['output_setting'].pop('is_verbose_output', None) + + with suppress(KeyError): params_v3['output_setting']['output_file_format'] = params_in['calculation']['output_file_format'] + + # + # run_mode section + # + params_v3['run_mode'] = params_in['inversion']['run_mode'] + + # + # model_update section + # + with suppress(KeyError): params_v3['model_update']['max_iterations'] = params_in['inversion']['max_iterations_inv'] + with suppress(KeyError): params_v3['model_update']['optim_method'] = params_in['inversion']['optim_method'] + with suppress(KeyError): params_v3['model_update']['step_length'] = params_in['inversion']['step_size'] + with suppress(KeyError): params_v3['model_update']['optim_method_0']['step_length_decay'] = params_in['inversion']['step_size_decay'] + with suppress(KeyError): params_v3['model_update']['optim_method_0']['step_length_sc'] = params_in['inversion']['step_size_sc'] + with suppress(KeyError): params_v3['model_update']['optim_method_1_2']['max_sub_iterations'] = params_in['inversion']['max_sub_iterations'] + with suppress(KeyError): params_v3['model_update']['optim_method_1_2']['regularization_weight'] = params_in['inversion']['regularization_weight'] + with suppress(KeyError): params_v3['model_update']['smoothing']['smooth_method'] = params_in['inversion']['smooth_method'] + with suppress(KeyError): params_v3['model_update']['smoothing']['l_smooth_rtp'] = params_in['inversion']['l_smooth_rtp'] + with suppress(KeyError): params_v3['model_update']['n_inversion_grid'] = params_in['inversion']['n_inversion_grid'] + with suppress(KeyError): params_v3['model_update']['type_invgrid_dep'] = params_in['inversion']['type_dep_inv'] + with suppress(KeyError): params_v3['model_update']['type_invgrid_lat'] = params_in['inversion']['type_lat_inv'] + with suppress(KeyError): params_v3['model_update']['type_invgrid_lon'] = params_in['inversion']['type_lon_inv'] + with suppress(KeyError): params_v3['model_update']['n_inv_dep_lat_lon'] = params_in['inversion']['n_inv_dep_lat_lon'] + with suppress(KeyError): params_v3['model_update']['min_max_dep_inv'] = params_in['inversion']['min_max_dep_inv'] + with suppress(KeyError): params_v3['model_update']['min_max_lat_inv'] = params_in['inversion']['min_max_lat_inv'] + with suppress(KeyError): params_v3['model_update']['min_max_lon_inv'] = params_in['inversion']['min_max_lon_inv'] + with suppress(KeyError): params_v3['model_update']['dep_inv'] = params_in['inversion']['dep_inv'] + with suppress(KeyError): params_v3['model_update']['lat_inv'] = params_in['inversion']['lat_inv'] + with suppress(KeyError): params_v3['model_update']['lon_inv'] = params_in['inversion']['lon_inv'] + with suppress(KeyError): params_v3['model_update']['sta_correction_file'] = params_in['inversion']['sta_correction_file'] + with suppress(KeyError): params_v3['model_update']['update_slowness'] = params_in['inv_strategy']['is_inv_slowness'] + with suppress(KeyError): params_v3['model_update']['update_azi_ani'] = params_in['inv_strategy']['is_inv_azi_ani'] + with suppress(KeyError): params_v3['model_update']['update_rad_ani'] = params_in['inv_strategy']['is_inv_rad_ani'] + map_value_to_bool(params_v3['model_update'], 'update_slowness') + map_value_to_bool(params_v3['model_update'], 'update_azi_ani') + map_value_to_bool(params_v3['model_update'], 'update_rad_ani') + + with suppress(KeyError): params_v3['model_update']['depth_taper'] = params_in['inv_strategy']['kernel_taper'] + with suppress(KeyError): params_v3['model_update']['use_sta_correction'] = params_in['inv_strategy']['is_sta_correction'] + map_value_to_bool(params_v3['model_update'], 'use_sta_correction') + + + # + # relocation section + # + # replocation section is completely new in v3, so we don't need to move any value + + # + # inversion_strategy section + # + # inversion_strategy section is completely new in v3, so we don't need to move any value + + # + # calculation section + # + params_v3['calculation'] = params_in['calculation'] + # erase the old key 'calculation'->'output_file_format' if it exists + params_v3['calculation'].pop('output_file_format', None) + + # write the output file with adding .v3 to the file name + outfile = infile + '.v3.yaml' + with open(outfile, 'w') as f: + yaml.dump(params_v3, f) + + + + + + diff --git a/utils/find_2_bytes_chars.py b/utils/find_2_bytes_chars.py new file mode 100644 index 0000000..d108be9 --- /dev/null +++ b/utils/find_2_bytes_chars.py @@ -0,0 +1,28 @@ +import os +import re + +def find_kanji_chars_in_file(file_path): + kanji_pattern = re.compile(r'[\u4E00-\u9FFF]') + with open(file_path, 'r', encoding='utf-8', errors='ignore') as file: + content = file.read() + matches = kanji_pattern.findall(content) + if matches: + print(f"Found Kanji characters in {file_path}: {''.join(matches)}") + +def scan_directory(directory): + for root, _, files in os.walk(directory): + for file in files: + file_path = os.path.join(root, file) + # skip non-text files + target_files = ['.cpp', '.h', '.hpp', '.c', '.cc', '.hh', '.cxx', '.hxx', '.py', '.txt', '.md', '.rst', '.ipynb', '.sh'] + if not file_path.endswith(tuple(target_files)): + continue + + find_kanji_chars_in_file(file_path) + +if __name__ == "__main__": + #directory_to_scan = '.' # Change this to the directory you want to scan + list_target_dir = ['./src', './test', './include', './examples'] + + for directory_to_scan in list_target_dir: + scan_directory(directory_to_scan) \ No newline at end of file diff --git a/utils/params_model_v3.yaml b/utils/params_model_v3.yaml new file mode 100644 index 0000000..f2c544a --- /dev/null +++ b/utils/params_model_v3.yaml @@ -0,0 +1,230 @@ +version: 3 + +################################################# +# computational domian # +################################################# +domain: + min_max_dep: [-10, 10] # depth in km + min_max_lat: [37.7, 42.3] # latitude in degree + min_max_lon: [22.7, 27.3] # longitude in degree + n_rtp: [10, 50, 50] # number of nodes in depth,latitude,longitude direction + + +################################################# +# traveltime data file path # +################################################# +source: + src_rec_file: OUTPUT_FILES/src_rec_file_forward.dat ### source receiver file path + swap_src_rec: true # swap source and receiver + + +################################################# +# initial model file path # +################################################# +model: + init_model_path: ./test_model_init.h5 # path to initial model file + + +################################################# +# parallel computation settings # +################################################# +parallel: # parameters for parallel computation + n_sims: 1 # number of simultanoues runs + ndiv_rtp: [1, 2, 2] # number of subdivision on each direction + nproc_sub: 2 # number of processors for sweep parallelization + use_gpu: false # true if use gpu (EXPERIMENTAL) + + +############################################ +# output file setting # +############################################ +output_setting: + output_dir: ./OUTPUT_FILES/ # path to output director (default is ./OUTPUT_FILES/) + output_source_field: false # output the calculated field of all sources + output_model_dat: false # output model_parameters_inv_0000.dat or not. + output_final_model: true # output merged final model or not. + output_in_process: true # output model at each inv iteration or not. + output_in_process_data: false # output src_rec_file at each inv iteration or not. + single_precision_output: false # output results in single precision or not. + verbose_output_level: 0 # output internal parameters, if 0, only model parameters are out. Higher level, more internal parameters are output. default: 0 + output_file_format: 0 # in/output file format, if 0: HDF5, if 1: ASCII + + +################################################# +# inversion or forward modeling # +################################################# +# run mode +# 0 for forward simulation only, +# 1 for inversion +# 2 for earthquake relocation +# 3 for inversion+earthquake relocation +run_mode: 1 + + +################################################### +# model update parameters setting # +################################################### +model_update: # update model parameters (when run_mode : 1 and 3) + max_iterations: 3 # maximum number of inversion iterations + optim_method: 1 # optimization method. 0 : grad_descent, 1 : halve-stepping, 2 : lbfgs (EXPERIMENTAL) + + # common parameters for all optim methods + step_length: 0.01 # step length of model perturbation at each iteration. 0.01 means maximum 1% perturbation for each iteration. + + # parameters for optim_method 0 (grad_descent) + optim_method_0: + step_length_decay: 0.9 # if objective function increase, step size -> step length * step_length_decay. default: 0.9 + + # parameters for optim_method 1 (halve-stepping) or 2 (lbfgs) + optim_method_1_2: + max_sub_iterations: 10 # maximum number of each sub-iteration + regularization_weight: 0.01 # weight value for regularization (lbfgs mode only) + coefs_regulalization_rtp: [1.0, 1.0, 1.0] # coefficients for regularization on each direction(lbfgs mode only) + + # smoothing + smoothing: + smooth_method: 0 # 0: multiparametrization, 1: laplacian smoothing (EXPERIMENTAL) + l_smooth_rtp: [100, 100, 100] # smoothing coefficients for laplacian smoothing + + # parameters for smooth method 0 (multigrid model parametrization) + n_inversion_grid: 5 # number of inversion grid sets + + # inversion grid type + type_invgrid_dep: 0 # 0: uniform inversion grid, 1: flexible grid + type_invgrid_lat: 0 # 0: uniform inversion grid, 1: flexible grid + type_invgrid_lon: 0 # 0: uniform inversion grid, 1: flexible grid + + # settings for uniform inversion grid (if type_*_inv : 0) + n_inv_dep_lat_lon: [5, 10, 10] # number of the base inversion grid points (ignored if type_*_inv : 1) + min_max_dep_inv: [-10, 10] # depth in km (Radius of the earth is defined in config.h/R_earth) (ignored if type_dep_inv : 1) + min_max_lat_inv: [37.7, 42.3] # latitude in degree + min_max_lon_inv: [22.7, 27.3] # longitude in degree + + # settings for flexible inversion grid (if type_*_inv : 1) + dep_inv: [-10.0, -7.5, -5.0, -2.5, 0.0, 2.5, 5.0, 7.5, 10.0] # depth in km (Radius of the earth is defined in config.h/R_earth) + lat_inv: [0.0, 1.0] # latitude in degree (ignored if type_lat_inv : 0) + lon_inv: [0.0, 1.0] # longitude in degree (ignored if type_lon_inv : 0) + # if we want to use another inversion grid for inverting anisotropy, set invgrid_ani: true (default: false) + invgrid_ani: false + # settings for flexible inversion grid for anisotropy (only flexible grid input is provided) +# dep_inv_ani: [1, 1, 1] +# lat_inv_ani: [1, 1, 1] +# lon_inv_ani: [1, 1, 1] + # inversion grid volume rescale (kernel -> kernel / volume of inversion grid mesh), + # this precondition may be carefully applied if the sizes of inversion grids are unbalanced + invgrid_volume_rescale: false + + # path to station correction file (under development) + use_sta_correction: false +# sta_correction_file: dummy_sta_correction_file # station correction file path + #step_length_sc: 0.001 step length relate to the update of station correction terms + + # path to station correction file + #use_sta_correction: false + #sta_correction_file: dummy_sta_correction_file # station correction file path + + + # In the following data subsection, XXX_weight means a weight is assigned to the data, influencing the objective function and gradient + # XXX_weight : [d1,d2,w1,w2] means: + # if XXX < d1, weight = w1 + # if d1 <= XXX < d2, weight = w1 + (XXX-d1)/(d2-d1)*(w2-w1), (linear interpolation) + # if d2 <= XXX , weight = w2 + # You can easily set w1 = w2 = 1.0 to normalize the weight related to XXX. + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time: true # 'true' for using absolute traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [0, 9999, 1.0, 1.0] # XXX is the absolute traveltime residual (second) = abs(t^{obs}_{n,i} - t^{syn}_{n,j}) + distance_weight: [0, 9999, 1.0, 1.0] # XXX is epicenter distance (km) between the source and receiver related to the data + + # -------------- using common source differential traveltime data -------------- + cs_dif_time: + use_cs_time: false # 'true' for using common source differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [0, 0, 0, 0] # XXX is the common source differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{n,j} - t^{syn}_{n,i} + t^{syn}_{n,j}). + azimuthal_weight: [0, 0, 0, 0] # XXX is the azimuth difference between two separate stations related to the common source. + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time: false # 'true' for using common receiver differential traveltime data to update model parameters; 'false' for not using (no need to set parameters in this section) + residual_weight: [0, 0, 0, 0] # XXX is the common receiver differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{m,i} - t^{syn}_{n,i} + t^{syn}_{m,i}) + azimuthal_weight: [0, 0, 0, 0] # XXX is the azimuth difference between two separate sources related to the common receiver. + + # -------------- global weight of different types of data (to balance the weight of different data) -------------- + global_weight: + balance_data_weight: false # yes: over the total weight of the each type of the data. no: use original weight (below weight for each type of data needs to be set) + abs_time_weight: 1 # weight of absolute traveltime data after balance, default: 1.0 + cs_dif_time_local_weight: 1 # weight of common source differential traveltime data after balance, default: 1.0 + cr_dif_time_local_weight: 1 # weight of common receiver differential traveltime data after balance, default: 1.0 + teleseismic_weight: 1 # weight of teleseismic data after balance, default: 1.0 (exclude in this version) + + # -------------- inversion parameters -------------- + update_slowness : true # update slowness (velocity) or not. default: true + update_azi_ani : false # update azimuthal anisotropy (xi, eta) or not. default: false + #update_rad_ani : false # update radial anisotropy (in future) or not. default: false + + # -------------- for teleseismic inversion (under development) -------------- + # depth_taper : [d1,d2] means: + # if XXX < d1, kernel <- kernel * 0.0 + # if d1 <= XXX < d2, kernel <- kernel * (XXX-d1)/(d2-d1), (linear interpolation) + # if d2 <= XXX , kernel <- kernel * 1.0 + # You can easily set d1 = -200, d1 = -100 to remove this taper. + depth_taper : [-1e+07, -1e+07] + +################################################# +# relocation parameters setting # +################################################# +relocation: # update earthquake hypocenter and origin time (when run_mode : 2 and 3) + min_Ndata: 4 # if the number of data of the earthquake is less than , the earthquake will not be relocated. defaut value: 4 + + # relocation_strategy + step_length : 0.01 # step length of relocation perturbation at each iteration. 0.01 means maximum 1% perturbation for each iteration. + step_length_decay : 0.9 # if objective function increase, step size -> step length * step_length_decay. default: 0.9 + rescaling_dep_lat_lon_ortime : [10, 1, 1, 0.5] # The perturbation is related to . Unit: km,km,km,second + max_change_dep_lat_lon_ortime : [10, 1, 1, 0.5] # the change of dep,lat,lon,ortime do not exceed max_change. Unit: km,km,km,second + max_iterations : 501 # maximum number of iterations for relocation + tol_gradient : 0.001 # if the norm of gradient is smaller than the tolerance, the iteration of relocation terminates + + # -------------- using absolute traveltime data -------------- + abs_time: + use_abs_time : false # 'yes' for using absolute traveltime data to update model parameters; 'no' for not using (no need to set parameters in this section) + residual_weight : [0, 0, 0, 0] # XXX is the absolute traveltime residual (second) = abs(t^{obs}_{n,i} - t^{syn}_{n,j}) + distance_weight : [0, 0, 0, 0] # XXX is epicenter distance (km) between the source and receiver related to the data + + # -------------- using common receiver differential traveltime data -------------- + cr_dif_time: + use_cr_time : false # 'yes' for using common receiver differential traveltime data to update model parameters; 'no' for not using (no need to set parameters in this section) + residual_weight : [0, 0, 0, 0] # XXX is the common receiver differential traveltime residual (second) = abs(t^{obs}_{n,i} - t^{obs}_{m,i} - t^{syn}_{n,i} + t^{syn}_{m,i}) + azimuthal_weight : [0, 0, 0, 0] # XXX is the azimuth difference between two separate sources related to the common receiver. + + + # -------------- global weight of different types of data (to balance the weight of different data) -------------- + global_weight: + balance_data_weight: false # yes: over the total weight of the each type of the data. no: use original weight (below weight for each type of data needs to be set) + abs_time_local_weight: 1 # weight of absolute traveltime data for relocation after balance, default: 1.0 + cr_dif_time_local_weight: 1 # weight of common receiver differential traveltime data for relocation after balance, default: 1.0 + +#################################################################### +# inversion strategy for tomography and relocation # +#################################################################### +inversion_strategy: # update model parameters and earthquake hypocenter iteratively (when run_mode : 3) + + inv_mode : 0 # 0 for update model parameters and relocation iteratively. (other options for future work) + + # for inv_mode : 0, parameters below are required + inv_mode_0: # update model for steps, then update location for steps, and repeat the process for loops. + model_update_N_iter : 1 + relocation_N_iter : 1 + max_loop : 10 + + +# --- parameters for core solver --------------------------------------------------------- +# --- please do not change the following parameters unless you know what you are doing --- + +######################################################################## +# Scheme of Eikonal solver (fast sweeping method) # +######################################################################## +calculation: + convergence_tolerance: 0.0001 # threshold value for checking the convergence for each forward/adjoint run + max_iterations: 500 # number of maximum iteration for each forward/adjoint run + stencil_order: 3 # order of stencil, 1 or 3 + stencil_type: 0 # 0: , 1: first-order upwind scheme (only sweep_type 0 is supported) + sweep_type: 1 # 0: legacy, 1: cuthill-mckee with shm parallelization diff --git a/utils/src_rec_file_helper.py b/utils/src_rec_file_helper.py new file mode 100644 index 0000000..b7942dd --- /dev/null +++ b/utils/src_rec_file_helper.py @@ -0,0 +1,357 @@ +# class for storing one event data + + +class AttSrcRec: + _id_src = None + _id_rec = None + _year = None + _month = None + _day = None + _hour = None + _min = None + _sec = None + _lat = None + _lon = None + _dep = None + _mag = None + _nrec = None + _id_event = None + _data_source = None + _phase = None + _epi_dist = None + _arr_time = None + _name_rec = None + + def __init__(self, + id_src = None, + id_rec = None, + year = None, + month = None, + day = None, + hour = None, + _min = None, + sec = None, + lat = None, + lon = None, + dep = None, + mag = None, + nrec = None, + id_event = None, + data_source= None, + phase = None, + epi_dist = None, + arr_time = None, + name_rec = None): + + + self._id_src = id_src + self._id_rec = id_rec + self._year = year + self._month = month + self._day = day + self._hour = hour + self._min = _min + self._sec = sec + self._lat = lat + self._lon = lon + self._dep = dep + self._mag = mag + self._nrec = nrec + self._id_event = id_event + self._data_source = data_source + self._phase = phase + self._epi_dist = epi_dist + self._arr_time = arr_time + self._name_rec = name_rec + + +def convert_to_pandas_df(event_list): + # conveert event_list to pandas dataframe + import pandas as pd + import datetime + + df_ev = pd.DataFrame() + + list_id_src = [] + list_id_rec = [] + list_year = [] + list_month = [] + list_day = [] + list_hour = [] + list__min = [] + list_sec = [] + list_lat = [] + list_lon = [] + list_dep = [] + list_mag = [] + list_nrec = [] + list_id_event = [] + list_data_source= [] + list_phase = [] + list_epi_dist = [] + list_arr_time = [] + list_name_rec = [] + list_datetime = [] + + for ev in event_list: + list_id_src.append(ev._id_src) + list_id_rec.append(ev._id_rec) + list_year.append(ev._year) + list_month.append(ev._month) + list_day.append(ev._day) + list_hour.append(ev._hour) + list__min.append(ev._min) + list_sec.append(ev._sec) + list_lat.append(ev._lat) + list_lon.append(ev._lon) + list_dep.append(ev._dep) + list_mag.append(ev._mag) + list_nrec.append(ev._nrec) + list_id_event.append(ev._id_event) + list_data_source.append(ev._data_source) + list_phase.append(ev._phase) + list_epi_dist.append(ev._epi_dist) + list_arr_time.append(ev._arr_time) + list_name_rec.append(ev._name_rec) + try: + date_this = datetime.datetime(ev._year, ev._month, ev._day, ev._hour, ev._min, int(ev._sec)) + except: + date_this = None + + list_datetime.append(date_this) + + # convert all the lists to pandas series + df_ev['id_src'] = pd.Series(list_id_src) + df_ev['id_rec'] = pd.Series(list_id_rec) + df_ev['year'] = pd.Series(list_year) + df_ev['month'] = pd.Series(list_month) + df_ev['day'] = pd.Series(list_day) + df_ev['hour'] = pd.Series(list_hour) + df_ev['min'] = pd.Series(list__min) + df_ev['sec'] = pd.Series(list_sec) + df_ev['lat'] = pd.Series(list_lat) + df_ev['lon'] = pd.Series(list_lon) + df_ev['dep'] = pd.Series(list_dep) + df_ev['mag'] = pd.Series(list_mag) + df_ev['nrec'] = pd.Series(list_nrec) + df_ev['id_event'] = pd.Series(list_id_event) + df_ev['data_source']= pd.Series(list_data_source) + df_ev['phase'] = pd.Series(list_phase) + df_ev['epi_dist'] = pd.Series(list_epi_dist) + df_ev['arr_time'] = pd.Series(list_arr_time) + df_ev['name_rec'] = pd.Series(list_name_rec) + df_ev['datetime'] = pd.Series(list_datetime) + + return df_ev + +# read file + +def read_src_rec_file(fpath, two_station_names=False, data_source_flag=0, id_src_offset=0, no_epi_dist=False): + #fpath = "./src_rec_test_out.dat" + + print ("read file: ", fpath) + event_list = [] + rec_list = [] + + with open(fpath, "r") as f: + lines = f.readlines() + + cc = 0 + nc = 0 + i_src = 0 + + # parse + for iline, line in enumerate(lines): + #print(line) + + if line.startswith("#"): + continue + else: + if cc == 0: + try: + # firstly source line is read + ll = line.split() + + #src_id = int(ll[0]) + src_id = i_src + id_src_offset + src_year = int(ll[1]) + src_month = int(ll[2]) + src_day = int(ll[3]) + src_hour = int(ll[4]) + src_min = int(ll[5]) + src_sec = float(ll[6]) + src_lat = float(ll[7]) + src_lon = float(ll[8]) + src_dep = float(ll[9]) + src_mag = float(ll[10]) + src_nrec = int(ll[11]) + src_id_event = ll[12] + + + nrec_tmp = src_nrec + + # store source + if (nrec_tmp != 0): + + #src = AttEvent(src_id, src_year, src_month, src_day, src_hour, src_min, src_sec, src_lat, src_lon, src_dep, src_mag, src_nrec, src_id_event, data_source_flag) + + src = AttSrcRec(src_id, None, src_year, src_month, src_day, src_hour, src_min, src_sec, src_lat, src_lon, src_dep, src_mag, src_nrec, src_id_event, data_source_flag, None, None, None, None) + event_list.append(src) + + cc+=1 + else: + pass + except: + pass + else: + try: + # read rec line + ll = line.split() + + if(not two_station_names): + #src_id = int(ll[0]) + src_id = i_src + id_src_offset + rec_id = int(ll[1]) + rec_name = ll[2] + rec_lat = float(ll[3]) + rec_lon = float(ll[4]) + rec_elev = float(ll[5]) + rec_phase = ll[6] + if no_epi_dist: + rec_epi_dist = None + rec_arr_time = float(ll[7]) + else: + rec_epi_dist = float(ll[7]) + rec_arr_time = float(ll[8]) + else: + #src_id = int(ll[0]) + src_id = i_src + id_src_offset + rec_id = int(ll[1]) + rec_name = ll[2] + "_" + ll[3] + rec_lat = float(ll[4]) + rec_lon = float(ll[5]) + rec_elev = float(ll[6]) + rec_phase = ll[7] + if no_epi_dist: + rec_epi_dist = None + rec_arr_time = float(ll[8]) + else: + rec_epi_dist = float(ll[8]) + rec_arr_time = float(ll[9]) + + # store rec + #rec = AttArrival(src_id, rec_id, rec_name, rec_lat, rec_lon, rec_elev, rec_phase, rec_epi_dist, rec_arr_time) + #event_list[i_src].add_rec(rec) + rec = AttSrcRec(src_id, rec_id, None, None, None, None, None, None, rec_lat, rec_lon, rec_elev, None, None, None, data_source_flag, rec_phase, rec_epi_dist, rec_arr_time, rec_name) + rec_list.append(rec) + + nc+=1 + except: + print("error in line: ", iline) + print("error in line: " + line) + #return None + + cc+=1 + + if cc > nrec_tmp: + cc = 0 + i_src += 1 + + if nc == 0: + print("error: no rec found") + # erase last event + event_list.pop() + i_src -= 1 + + nc = 0 + + + # return length of event_list + print("number of events: ", len(event_list)) + print("number of recs: ", len(rec_list)) + + df_ev = convert_to_pandas_df(event_list) + df_rec = convert_to_pandas_df(rec_list) + + + return df_ev, df_rec + + +def write_src_rec_file(df_events, df_recs, fpath, no_epi_dist=True): + + print ("write file: ", fpath) + + f = open(fpath, 'w') + + import tqdm + + for i in tqdm.tqdm(range(len(df_events))): + # receivers of this event + recs_this_ev = df_recs[df_recs['id_src'] == df_events['id_src'].iloc[i]] + nrecs = len(recs_this_ev) + + f.write("{} {} {} {} {} {} {} {} {} {} {} {} {}\n".format(i, + df_events['year'].iloc[i], + df_events['month'].iloc[i], + df_events['day'].iloc[i], + df_events['hour'].iloc[i], + df_events['min'].iloc[i], + df_events['sec'].iloc[i], + df_events['lat'].iloc[i], + df_events['lon'].iloc[i], + df_events['dep'].iloc[i], + df_events['mag'].iloc[i], + nrecs, + df_events['id_event'].iloc[i])) + + # write receivers + for j in range(len(recs_this_ev)): + if no_epi_dist: + f.write(" {} {} {} {} {} {} {} {}\n".format( i, + recs_this_ev['id_rec'].iloc[j], + recs_this_ev['name_rec'].iloc[j], + recs_this_ev['lat'].iloc[j], + recs_this_ev['lon'].iloc[j], + recs_this_ev['dep'].iloc[j], + recs_this_ev['phase'].iloc[j], + recs_this_ev['arr_time'].iloc[j])) + else: + f.write(" {} {} {} {} {} {} {} {} {}\n".format( i, + recs_this_ev['id_rec'].iloc[j], + recs_this_ev['name_rec'].iloc[j], + recs_this_ev['lat'].iloc[j], + recs_this_ev['lon'].iloc[j], + recs_this_ev['dep'].iloc[j], + recs_this_ev['phase'].iloc[j], + recs_this_ev['epi_dist'].iloc[j], + recs_this_ev['arr_time'].iloc[j])) + + #break + + f.close() + + + +if __name__ == "__main__": + event_list = read_src_rec_file("./src_rec_test_out.dat") + print(event_list[0].rec_list[0].name_rec) + print(event_list[0].rec_list[0].epi_dist) + print(event_list[0].rec_list[0].arr_time) + print(event_list[0].rec_list[0].id_rec) + print(event_list[0].rec_list[0].id_src) + print(event_list[0].rec_list[0].lat) + print(event_list[0].rec_list[0].lon) + print(event_list[0].rec_list[0].dep) + print(event_list[0].rec_list[0].phase) + print(event_list[0].rec_list[0].arr_time) + print(event_list[0].rec_list[1].name_rec) + print(event_list[0].rec_list[1].arr_time) + print(event_list[0].rec_list[1].id_rec) + print(event_list[0].rec_list[1].id_src) + print(event_list[0].rec_list[1].lat) + print(event_list[0].rec_list[1].lon) + print(event_list[0].rec_list[1].dep) + print(event_list[0].rec_list[1].phase) + print(event_list[0].rec_list[1].arr_time) + print(event_list[0].rec_list[2].name_rec) + print(event_list[0].rec_list[2].epi_dist) \ No newline at end of file diff --git a/utils/tomoatt_data_retrieval.py b/utils/tomoatt_data_retrieval.py new file mode 100644 index 0000000..ebed072 --- /dev/null +++ b/utils/tomoatt_data_retrieval.py @@ -0,0 +1,228 @@ +# functinos for post-processing output data in h5 file + +import numpy +import h5py + + +def get_data_from_h5(fpath, fpath_grid, dataset_name, nr_glob, nt_glob, np_glob, ndiv_r, ndiv_t, ndiv_p, verbose=False): + """ + Output arrays has one overlapping layer between adjusted subdomains. + This function will skip those layers and reconstruct the entire grid dataset. + + fpath: path to field data file + fpaht_grid: path to grid data file + dataset_name: name of dataset in h5 file + nr_glob: number of grid points in r direction + nt_glob: number of grid points in t direction + np_glob: number of grid points in p direction + ndiv_r: number of subdomains in r direction + ndiv_t: number of subdomains in t direction + ndiv_p: number of subdomains in p direction + verbose: print out information + + """ + # total number of subdomains + n_sub = ndiv_r*ndiv_t*ndiv_p + + # total points on each direction with overlap + nr_total_glob = nr_glob + ndiv_r - 1 + nt_total_glob = nt_glob + ndiv_t - 1 + np_total_glob = np_glob + ndiv_p - 1 + + # prepare a 3D array to store the data + data_glob = numpy.zeros((nr_glob,nt_glob,np_glob), dtype=numpy.float64) + grid_glob_r = numpy.zeros((nr_glob,nt_glob,np_glob), dtype=numpy.float64) + grid_glob_t = numpy.zeros((nr_glob,nt_glob,np_glob), dtype=numpy.float64) + grid_glob_p = numpy.zeros((nr_glob,nt_glob,np_glob), dtype=numpy.float64) + + # open grid data file + fgrid = h5py.File(fpath_grid, 'r') + + # open field data file + fdata = h5py.File(fpath, 'r') + + #try: + # load data data by each subdomain + + # offset + offset = 0 + + for ir_sub in range(ndiv_r): + for it_sub in range(ndiv_t): + for ip_sub in range(ndiv_p): + + # number of data point for this sub domain + nr_sub = nr_glob//ndiv_r + nt_sub = nt_glob//ndiv_t + np_sub = np_glob//ndiv_p + + # offset for each direction + offset_r = ir_sub*nr_sub + offset_t = it_sub*nt_sub + offset_p = ip_sub*np_sub + + # add modulus to the last subdomains + if ir_sub == ndiv_r-1: + nr_sub += nr_glob%ndiv_r + if it_sub == ndiv_t-1: + nt_sub += nt_glob%ndiv_t + if ip_sub == ndiv_p-1: + np_sub += np_glob%ndiv_p + + # add overlap layer if this subdomain is not the last one for each direction + if ir_sub != ndiv_r-1: + nr_sub += 1 + if it_sub != ndiv_t-1: + nt_sub += 1 + if ip_sub != ndiv_p-1: + np_sub += 1 + + # number of data point for this sub domain + n_points_total_sub = nr_sub*nt_sub*np_sub + + # load data + data_sub = fdata[dataset_name][offset:offset+n_points_total_sub] + data_sub_p = fgrid["/Mesh/node_coords_p"][offset:offset+n_points_total_sub] + data_sub_t = fgrid["/Mesh/node_coords_t"][offset:offset+n_points_total_sub] + data_sub_r = fgrid["/Mesh/node_coords_r"][offset:offset+n_points_total_sub] + + # reshape data + data_sub = data_sub.reshape(nr_sub, nt_sub, np_sub) + data_sub_p = data_sub_p.reshape(nr_sub, nt_sub, np_sub) + data_sub_t = data_sub_t.reshape(nr_sub, nt_sub, np_sub) + data_sub_r = data_sub_r.reshape(nr_sub, nt_sub, np_sub) + + + # put those data in global 3d array + data_glob[offset_r:offset_r+nr_sub, offset_t:offset_t+nt_sub, offset_p:offset_p+np_sub] = data_sub + grid_glob_p[offset_r:offset_r+nr_sub, offset_t:offset_t+nt_sub, offset_p:offset_p+np_sub] = data_sub_p + grid_glob_t[offset_r:offset_r+nr_sub, offset_t:offset_t+nt_sub, offset_p:offset_p+np_sub] = data_sub_t + grid_glob_r[offset_r:offset_r+nr_sub, offset_t:offset_t+nt_sub, offset_p:offset_p+np_sub] = data_sub_r + + # update offset + offset += n_points_total_sub + + + return data_glob, grid_glob_r, grid_glob_t, grid_glob_p + + #except: + # fdata.close() + # fgrid.close() + # print("error occured while reading file.") + + # return -1 + + +# output arrays has one overlapping layer between adjusted subdomains +# this function will skip those layers and reconstruct the entire grid dataset +def get_data_from_ascii(fpath, fpath_grid, nr_glob, nt_glob, np_glob, ndiv_r, ndiv_t, ndiv_p, verbose=False): + """ + + fpath: path to ascii data file + fpath_grid: path to ascii grid data file + nr_glob: number of grid points in r direction + nt_glob: number of grid points in t direction + np_glob: number of grid points in p direction + ndiv_r: number of subdomains in r direction + ndiv_t: number of subdomains in t direction + ndiv_p: number of subdomains in p direction + verbose: print out information + + """ + # total number of subdomains + n_sub = ndiv_r*ndiv_t*ndiv_p + + # total points on each direction with overlap + nr_total_glob = nr_glob + ndiv_r - 1 + nt_total_glob = nt_glob + ndiv_t - 1 + np_total_glob = np_glob + ndiv_p - 1 + + # prepare a 3D array to store the data + data_glob = numpy.zeros((nr_glob,nt_glob,np_glob), dtype=numpy.float64) + grid_glob_r = numpy.zeros((nr_glob,nt_glob,np_glob), dtype=numpy.float64) + grid_glob_t = numpy.zeros((nr_glob,nt_glob,np_glob), dtype=numpy.float64) + grid_glob_p = numpy.zeros((nr_glob,nt_glob,np_glob), dtype=numpy.float64) + + # read data + data_tmp = numpy.loadtxt(fpath) + grid_tmp = numpy.loadtxt(fpath_grid) + + # load data data by each subdomain + + # offset + offset = 0 + + for ir_sub in range(ndiv_r): + for it_sub in range(ndiv_t): + for ip_sub in range(ndiv_p): + + # number of data point for this sub domain + nr_sub = nr_glob//ndiv_r + nt_sub = nt_glob//ndiv_t + np_sub = np_glob//ndiv_p + + # offset for each direction + offset_r = ir_sub*nr_sub + offset_t = it_sub*nt_sub + offset_p = ip_sub*np_sub + + # add modulus to the last subdomains + if ir_sub == ndiv_r-1: + nr_sub += nr_glob%ndiv_r + if it_sub == ndiv_t-1: + nt_sub += nt_glob%ndiv_t + if ip_sub == ndiv_p-1: + np_sub += np_glob%ndiv_p + + # add overlap layer if this subdomain is not the last one for each direction + if ir_sub != ndiv_r-1: + nr_sub += 1 + if it_sub != ndiv_t-1: + nt_sub += 1 + if ip_sub != ndiv_p-1: + np_sub += 1 + + # number of data point for this sub domain + n_points_total_sub = nr_sub*nt_sub*np_sub + + # load data + data_sub = data_tmp[offset:offset+n_points_total_sub] + grid_sub_p = grid_tmp[offset:offset+n_points_total_sub,0] + grid_sub_t = grid_tmp[offset:offset+n_points_total_sub,1] + grid_sub_r = grid_tmp[offset:offset+n_points_total_sub,2] + + # reshape data + data_sub = data_sub.reshape(nr_sub, nt_sub, np_sub) + grid_sub_p = grid_sub_p.reshape(nr_sub, nt_sub, np_sub) + grid_sub_t = grid_sub_t.reshape(nr_sub, nt_sub, np_sub) + grid_sub_r = grid_sub_r.reshape(nr_sub, nt_sub, np_sub) + + # put those data in global 3d array + data_glob[offset_r:offset_r+nr_sub, offset_t:offset_t+nt_sub, offset_p:offset_p+np_sub] = data_sub + grid_glob_p[offset_r:offset_r+nr_sub, offset_t:offset_t+nt_sub, offset_p:offset_p+np_sub] = grid_sub_p + grid_glob_t[offset_r:offset_r+nr_sub, offset_t:offset_t+nt_sub, offset_p:offset_p+np_sub] = grid_sub_t + grid_glob_r[offset_r:offset_r+nr_sub, offset_t:offset_t+nt_sub, offset_p:offset_p+np_sub] = grid_sub_r + + # update offset + offset += n_points_total_sub + + + return data_glob, grid_glob_r, grid_glob_t, grid_glob_p + + + + + + +if __name__ == '__main__': + + # examples + fpath = './OUTPUT_FILES/out_data_sim_0.h5' + fpath_grid = './OUPUT_FILES/out_data_grid.h5' + nr = 10 + nt = 10 + np = 10 + ndiv_r = 2 + ndiv_t = 2 + ndiv_p = 2 + Ks_tomoatt = get_data_from_h5(fpath, fpath_grid, "Data/Ks_inv_0000", nr, nt, np, ndiv_r, ndiv_t, ndiv_p, verbose=True) \ No newline at end of file